10f38b4d1SSimon Pilgrim; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2ac021689SDavid Green; RUN: llc -mtriple=armv7a-eabihf -mattr=+neon %s -o - | FileCheck %s 30f38b4d1SSimon Pilgrim 40f38b4d1SSimon Pilgrim; 50f38b4d1SSimon Pilgrim; SABD 60f38b4d1SSimon Pilgrim; 70f38b4d1SSimon Pilgrim 80f38b4d1SSimon Pilgrimdefine <8 x i8> @sabd_8b(<8 x i8> %a, <8 x i8> %b) { 90f38b4d1SSimon Pilgrim; CHECK-LABEL: sabd_8b: 100f38b4d1SSimon Pilgrim; CHECK: @ %bb.0: 11ac021689SDavid Green; CHECK-NEXT: vabd.s8 d0, d0, d1 12ac021689SDavid Green; CHECK-NEXT: bx lr 130f38b4d1SSimon Pilgrim %a.sext = sext <8 x i8> %a to <8 x i16> 140f38b4d1SSimon Pilgrim %b.sext = sext <8 x i8> %b to <8 x i16> 150f38b4d1SSimon Pilgrim %sub = sub <8 x i16> %a.sext, %b.sext 160f38b4d1SSimon Pilgrim %abs = call <8 x i16> @llvm.abs.v8i16(<8 x i16> %sub, i1 true) 170f38b4d1SSimon Pilgrim %trunc = trunc <8 x i16> %abs to <8 x i8> 180f38b4d1SSimon Pilgrim ret <8 x i8> %trunc 190f38b4d1SSimon Pilgrim} 200f38b4d1SSimon Pilgrim 210f38b4d1SSimon Pilgrimdefine <16 x i8> @sabd_16b(<16 x i8> %a, <16 x i8> %b) { 220f38b4d1SSimon Pilgrim; CHECK-LABEL: sabd_16b: 230f38b4d1SSimon Pilgrim; CHECK: @ %bb.0: 24ac021689SDavid Green; CHECK-NEXT: vabd.s8 q0, q0, q1 25ac021689SDavid Green; CHECK-NEXT: bx lr 260f38b4d1SSimon Pilgrim %a.sext = sext <16 x i8> %a to <16 x i16> 270f38b4d1SSimon Pilgrim %b.sext = sext <16 x i8> %b to <16 x i16> 280f38b4d1SSimon Pilgrim %sub = sub <16 x i16> %a.sext, %b.sext 290f38b4d1SSimon Pilgrim %abs = call <16 x i16> @llvm.abs.v16i16(<16 x i16> %sub, i1 true) 300f38b4d1SSimon Pilgrim %trunc = trunc <16 x i16> %abs to <16 x i8> 310f38b4d1SSimon Pilgrim ret <16 x i8> %trunc 320f38b4d1SSimon Pilgrim} 330f38b4d1SSimon Pilgrim 340f38b4d1SSimon Pilgrimdefine <4 x i16> @sabd_4h(<4 x i16> %a, <4 x i16> %b) { 350f38b4d1SSimon Pilgrim; CHECK-LABEL: sabd_4h: 360f38b4d1SSimon Pilgrim; CHECK: @ %bb.0: 37ac021689SDavid Green; CHECK-NEXT: vabd.s16 d0, d0, d1 38ac021689SDavid Green; CHECK-NEXT: bx lr 390f38b4d1SSimon Pilgrim %a.sext = sext <4 x i16> %a to <4 x i32> 400f38b4d1SSimon Pilgrim %b.sext = sext <4 x i16> %b to <4 x i32> 410f38b4d1SSimon Pilgrim %sub = sub <4 x i32> %a.sext, %b.sext 420f38b4d1SSimon Pilgrim %abs = call <4 x i32> @llvm.abs.v4i32(<4 x i32> %sub, i1 true) 430f38b4d1SSimon Pilgrim %trunc = trunc <4 x i32> %abs to <4 x i16> 440f38b4d1SSimon Pilgrim ret <4 x i16> %trunc 450f38b4d1SSimon Pilgrim} 460f38b4d1SSimon Pilgrim 470f38b4d1SSimon Pilgrimdefine <4 x i16> @sabd_4h_promoted_ops(<4 x i8> %a, <4 x i8> %b) { 480f38b4d1SSimon Pilgrim; CHECK-LABEL: sabd_4h_promoted_ops: 490f38b4d1SSimon Pilgrim; CHECK: @ %bb.0: 50ac021689SDavid Green; CHECK-NEXT: vshl.i16 d16, d1, #8 51ac021689SDavid Green; CHECK-NEXT: vshl.i16 d17, d0, #8 520f38b4d1SSimon Pilgrim; CHECK-NEXT: vshr.s16 d16, d16, #8 530f38b4d1SSimon Pilgrim; CHECK-NEXT: vshr.s16 d17, d17, #8 54ac021689SDavid Green; CHECK-NEXT: vabd.s16 d0, d17, d16 55ac021689SDavid Green; CHECK-NEXT: bx lr 560f38b4d1SSimon Pilgrim %a.sext = sext <4 x i8> %a to <4 x i16> 570f38b4d1SSimon Pilgrim %b.sext = sext <4 x i8> %b to <4 x i16> 580f38b4d1SSimon Pilgrim %sub = sub <4 x i16> %a.sext, %b.sext 590f38b4d1SSimon Pilgrim %abs = call <4 x i16> @llvm.abs.v4i16(<4 x i16> %sub, i1 true) 600f38b4d1SSimon Pilgrim ret <4 x i16> %abs 610f38b4d1SSimon Pilgrim} 620f38b4d1SSimon Pilgrim 630f38b4d1SSimon Pilgrimdefine <8 x i16> @sabd_8h(<8 x i16> %a, <8 x i16> %b) { 640f38b4d1SSimon Pilgrim; CHECK-LABEL: sabd_8h: 650f38b4d1SSimon Pilgrim; CHECK: @ %bb.0: 66ac021689SDavid Green; CHECK-NEXT: vabd.s16 q0, q0, q1 67ac021689SDavid Green; CHECK-NEXT: bx lr 680f38b4d1SSimon Pilgrim %a.sext = sext <8 x i16> %a to <8 x i32> 690f38b4d1SSimon Pilgrim %b.sext = sext <8 x i16> %b to <8 x i32> 700f38b4d1SSimon Pilgrim %sub = sub <8 x i32> %a.sext, %b.sext 710f38b4d1SSimon Pilgrim %abs = call <8 x i32> @llvm.abs.v8i32(<8 x i32> %sub, i1 true) 720f38b4d1SSimon Pilgrim %trunc = trunc <8 x i32> %abs to <8 x i16> 730f38b4d1SSimon Pilgrim ret <8 x i16> %trunc 740f38b4d1SSimon Pilgrim} 750f38b4d1SSimon Pilgrim 760f38b4d1SSimon Pilgrimdefine <8 x i16> @sabd_8h_promoted_ops(<8 x i8> %a, <8 x i8> %b) { 770f38b4d1SSimon Pilgrim; CHECK-LABEL: sabd_8h_promoted_ops: 780f38b4d1SSimon Pilgrim; CHECK: @ %bb.0: 79ac021689SDavid Green; CHECK-NEXT: vabdl.s8 q0, d0, d1 80ac021689SDavid Green; CHECK-NEXT: bx lr 810f38b4d1SSimon Pilgrim %a.sext = sext <8 x i8> %a to <8 x i16> 820f38b4d1SSimon Pilgrim %b.sext = sext <8 x i8> %b to <8 x i16> 830f38b4d1SSimon Pilgrim %sub = sub <8 x i16> %a.sext, %b.sext 840f38b4d1SSimon Pilgrim %abs = call <8 x i16> @llvm.abs.v8i16(<8 x i16> %sub, i1 true) 850f38b4d1SSimon Pilgrim ret <8 x i16> %abs 860f38b4d1SSimon Pilgrim} 870f38b4d1SSimon Pilgrim 880f38b4d1SSimon Pilgrimdefine <2 x i32> @sabd_2s(<2 x i32> %a, <2 x i32> %b) { 890f38b4d1SSimon Pilgrim; CHECK-LABEL: sabd_2s: 900f38b4d1SSimon Pilgrim; CHECK: @ %bb.0: 91ac021689SDavid Green; CHECK-NEXT: vabd.s32 d0, d0, d1 92ac021689SDavid Green; CHECK-NEXT: bx lr 930f38b4d1SSimon Pilgrim %a.sext = sext <2 x i32> %a to <2 x i64> 940f38b4d1SSimon Pilgrim %b.sext = sext <2 x i32> %b to <2 x i64> 950f38b4d1SSimon Pilgrim %sub = sub <2 x i64> %a.sext, %b.sext 960f38b4d1SSimon Pilgrim %abs = call <2 x i64> @llvm.abs.v2i64(<2 x i64> %sub, i1 true) 970f38b4d1SSimon Pilgrim %trunc = trunc <2 x i64> %abs to <2 x i32> 980f38b4d1SSimon Pilgrim ret <2 x i32> %trunc 990f38b4d1SSimon Pilgrim} 1000f38b4d1SSimon Pilgrim 1010f38b4d1SSimon Pilgrimdefine <2 x i32> @sabd_2s_promoted_ops(<2 x i16> %a, <2 x i16> %b) { 1020f38b4d1SSimon Pilgrim; CHECK-LABEL: sabd_2s_promoted_ops: 1030f38b4d1SSimon Pilgrim; CHECK: @ %bb.0: 104ac021689SDavid Green; CHECK-NEXT: vshl.i32 d16, d1, #16 105ac021689SDavid Green; CHECK-NEXT: vshl.i32 d17, d0, #16 1060f38b4d1SSimon Pilgrim; CHECK-NEXT: vshr.s32 d16, d16, #16 1070f38b4d1SSimon Pilgrim; CHECK-NEXT: vshr.s32 d17, d17, #16 108ac021689SDavid Green; CHECK-NEXT: vabd.s32 d0, d17, d16 109ac021689SDavid Green; CHECK-NEXT: bx lr 1100f38b4d1SSimon Pilgrim %a.sext = sext <2 x i16> %a to <2 x i32> 1110f38b4d1SSimon Pilgrim %b.sext = sext <2 x i16> %b to <2 x i32> 1120f38b4d1SSimon Pilgrim %sub = sub <2 x i32> %a.sext, %b.sext 1130f38b4d1SSimon Pilgrim %abs = call <2 x i32> @llvm.abs.v2i32(<2 x i32> %sub, i1 true) 1140f38b4d1SSimon Pilgrim ret <2 x i32> %abs 1150f38b4d1SSimon Pilgrim} 1160f38b4d1SSimon Pilgrim 1170f38b4d1SSimon Pilgrimdefine <4 x i32> @sabd_4s(<4 x i32> %a, <4 x i32> %b) { 1180f38b4d1SSimon Pilgrim; CHECK-LABEL: sabd_4s: 1190f38b4d1SSimon Pilgrim; CHECK: @ %bb.0: 120ac021689SDavid Green; CHECK-NEXT: vabd.s32 q0, q0, q1 121ac021689SDavid Green; CHECK-NEXT: bx lr 1220f38b4d1SSimon Pilgrim %a.sext = sext <4 x i32> %a to <4 x i64> 1230f38b4d1SSimon Pilgrim %b.sext = sext <4 x i32> %b to <4 x i64> 1240f38b4d1SSimon Pilgrim %sub = sub <4 x i64> %a.sext, %b.sext 1250f38b4d1SSimon Pilgrim %abs = call <4 x i64> @llvm.abs.v4i64(<4 x i64> %sub, i1 true) 1260f38b4d1SSimon Pilgrim %trunc = trunc <4 x i64> %abs to <4 x i32> 1270f38b4d1SSimon Pilgrim ret <4 x i32> %trunc 1280f38b4d1SSimon Pilgrim} 1290f38b4d1SSimon Pilgrim 1300f38b4d1SSimon Pilgrimdefine <4 x i32> @sabd_4s_promoted_ops(<4 x i16> %a, <4 x i16> %b) { 1310f38b4d1SSimon Pilgrim; CHECK-LABEL: sabd_4s_promoted_ops: 1320f38b4d1SSimon Pilgrim; CHECK: @ %bb.0: 133ac021689SDavid Green; CHECK-NEXT: vabdl.s16 q0, d0, d1 134ac021689SDavid Green; CHECK-NEXT: bx lr 1350f38b4d1SSimon Pilgrim %a.sext = sext <4 x i16> %a to <4 x i32> 1360f38b4d1SSimon Pilgrim %b.sext = sext <4 x i16> %b to <4 x i32> 1370f38b4d1SSimon Pilgrim %sub = sub <4 x i32> %a.sext, %b.sext 1380f38b4d1SSimon Pilgrim %abs = call <4 x i32> @llvm.abs.v4i32(<4 x i32> %sub, i1 true) 1390f38b4d1SSimon Pilgrim ret <4 x i32> %abs 1400f38b4d1SSimon Pilgrim} 1410f38b4d1SSimon Pilgrim 1420f38b4d1SSimon Pilgrimdefine <2 x i64> @sabd_2d(<2 x i64> %a, <2 x i64> %b) { 1430f38b4d1SSimon Pilgrim; CHECK-LABEL: sabd_2d: 1440f38b4d1SSimon Pilgrim; CHECK: @ %bb.0: 14513d04fa5SSimon Pilgrim; CHECK-NEXT: .save {r4, r5, r6, lr} 14613d04fa5SSimon Pilgrim; CHECK-NEXT: push {r4, r5, r6, lr} 147*e0ed0333SSergei Barannikov; CHECK-NEXT: vmov r0, r1, d1 14813d04fa5SSimon Pilgrim; CHECK-NEXT: mov r6, #0 149*e0ed0333SSergei Barannikov; CHECK-NEXT: vmov r2, r3, d3 150*e0ed0333SSergei Barannikov; CHECK-NEXT: vmov r12, lr, d0 151*e0ed0333SSergei Barannikov; CHECK-NEXT: vmov r4, r5, d2 15213d04fa5SSimon Pilgrim; CHECK-NEXT: vsub.i64 q8, q0, q1 15313d04fa5SSimon Pilgrim; CHECK-NEXT: subs r0, r2, r0 154*e0ed0333SSergei Barannikov; CHECK-NEXT: sbcs r0, r3, r1 15513d04fa5SSimon Pilgrim; CHECK-NEXT: mov r0, #0 15613d04fa5SSimon Pilgrim; CHECK-NEXT: movwlt r0, #1 157*e0ed0333SSergei Barannikov; CHECK-NEXT: cmp r0, #0 158*e0ed0333SSergei Barannikov; CHECK-NEXT: mvnne r0, #0 159*e0ed0333SSergei Barannikov; CHECK-NEXT: subs r1, r4, r12 16013d04fa5SSimon Pilgrim; CHECK-NEXT: sbcs r1, r5, lr 161*e0ed0333SSergei Barannikov; CHECK-NEXT: vdup.32 d19, r0 16213d04fa5SSimon Pilgrim; CHECK-NEXT: movwlt r6, #1 16313d04fa5SSimon Pilgrim; CHECK-NEXT: cmp r6, #0 16413d04fa5SSimon Pilgrim; CHECK-NEXT: mvnne r6, #0 165*e0ed0333SSergei Barannikov; CHECK-NEXT: vdup.32 d18, r6 16613d04fa5SSimon Pilgrim; CHECK-NEXT: veor q8, q8, q9 16713d04fa5SSimon Pilgrim; CHECK-NEXT: vsub.i64 q0, q9, q8 16813d04fa5SSimon Pilgrim; CHECK-NEXT: pop {r4, r5, r6, pc} 1690f38b4d1SSimon Pilgrim %a.sext = sext <2 x i64> %a to <2 x i128> 1700f38b4d1SSimon Pilgrim %b.sext = sext <2 x i64> %b to <2 x i128> 1710f38b4d1SSimon Pilgrim %sub = sub <2 x i128> %a.sext, %b.sext 1720f38b4d1SSimon Pilgrim %abs = call <2 x i128> @llvm.abs.v2i128(<2 x i128> %sub, i1 true) 1730f38b4d1SSimon Pilgrim %trunc = trunc <2 x i128> %abs to <2 x i64> 1740f38b4d1SSimon Pilgrim ret <2 x i64> %trunc 1750f38b4d1SSimon Pilgrim} 1760f38b4d1SSimon Pilgrim 1770f38b4d1SSimon Pilgrimdefine <2 x i64> @sabd_2d_promoted_ops(<2 x i32> %a, <2 x i32> %b) { 1780f38b4d1SSimon Pilgrim; CHECK-LABEL: sabd_2d_promoted_ops: 1790f38b4d1SSimon Pilgrim; CHECK: @ %bb.0: 180ac021689SDavid Green; CHECK-NEXT: vabdl.s32 q0, d0, d1 181ac021689SDavid Green; CHECK-NEXT: bx lr 1820f38b4d1SSimon Pilgrim %a.sext = sext <2 x i32> %a to <2 x i64> 1830f38b4d1SSimon Pilgrim %b.sext = sext <2 x i32> %b to <2 x i64> 1840f38b4d1SSimon Pilgrim %sub = sub <2 x i64> %a.sext, %b.sext 1850f38b4d1SSimon Pilgrim %abs = call <2 x i64> @llvm.abs.v2i64(<2 x i64> %sub, i1 true) 1860f38b4d1SSimon Pilgrim ret <2 x i64> %abs 1870f38b4d1SSimon Pilgrim} 1880f38b4d1SSimon Pilgrim 1890f38b4d1SSimon Pilgrim; 1900f38b4d1SSimon Pilgrim; UABD 1910f38b4d1SSimon Pilgrim; 1920f38b4d1SSimon Pilgrim 1930f38b4d1SSimon Pilgrimdefine <8 x i8> @uabd_8b(<8 x i8> %a, <8 x i8> %b) { 1940f38b4d1SSimon Pilgrim; CHECK-LABEL: uabd_8b: 1950f38b4d1SSimon Pilgrim; CHECK: @ %bb.0: 196ac021689SDavid Green; CHECK-NEXT: vabd.u8 d0, d0, d1 197ac021689SDavid Green; CHECK-NEXT: bx lr 1980f38b4d1SSimon Pilgrim %a.zext = zext <8 x i8> %a to <8 x i16> 1990f38b4d1SSimon Pilgrim %b.zext = zext <8 x i8> %b to <8 x i16> 2000f38b4d1SSimon Pilgrim %sub = sub <8 x i16> %a.zext, %b.zext 2010f38b4d1SSimon Pilgrim %abs = call <8 x i16> @llvm.abs.v8i16(<8 x i16> %sub, i1 true) 2020f38b4d1SSimon Pilgrim %trunc = trunc <8 x i16> %abs to <8 x i8> 2030f38b4d1SSimon Pilgrim ret <8 x i8> %trunc 2040f38b4d1SSimon Pilgrim} 2050f38b4d1SSimon Pilgrim 2060f38b4d1SSimon Pilgrimdefine <16 x i8> @uabd_16b(<16 x i8> %a, <16 x i8> %b) { 2070f38b4d1SSimon Pilgrim; CHECK-LABEL: uabd_16b: 2080f38b4d1SSimon Pilgrim; CHECK: @ %bb.0: 209ac021689SDavid Green; CHECK-NEXT: vabd.u8 q0, q0, q1 210ac021689SDavid Green; CHECK-NEXT: bx lr 2110f38b4d1SSimon Pilgrim %a.zext = zext <16 x i8> %a to <16 x i16> 2120f38b4d1SSimon Pilgrim %b.zext = zext <16 x i8> %b to <16 x i16> 2130f38b4d1SSimon Pilgrim %sub = sub <16 x i16> %a.zext, %b.zext 2140f38b4d1SSimon Pilgrim %abs = call <16 x i16> @llvm.abs.v16i16(<16 x i16> %sub, i1 true) 2150f38b4d1SSimon Pilgrim %trunc = trunc <16 x i16> %abs to <16 x i8> 2160f38b4d1SSimon Pilgrim ret <16 x i8> %trunc 2170f38b4d1SSimon Pilgrim} 2180f38b4d1SSimon Pilgrim 2190f38b4d1SSimon Pilgrimdefine <4 x i16> @uabd_4h(<4 x i16> %a, <4 x i16> %b) { 2200f38b4d1SSimon Pilgrim; CHECK-LABEL: uabd_4h: 2210f38b4d1SSimon Pilgrim; CHECK: @ %bb.0: 222ac021689SDavid Green; CHECK-NEXT: vabd.u16 d0, d0, d1 223ac021689SDavid Green; CHECK-NEXT: bx lr 2240f38b4d1SSimon Pilgrim %a.zext = zext <4 x i16> %a to <4 x i32> 2250f38b4d1SSimon Pilgrim %b.zext = zext <4 x i16> %b to <4 x i32> 2260f38b4d1SSimon Pilgrim %sub = sub <4 x i32> %a.zext, %b.zext 2270f38b4d1SSimon Pilgrim %abs = call <4 x i32> @llvm.abs.v4i32(<4 x i32> %sub, i1 true) 2280f38b4d1SSimon Pilgrim %trunc = trunc <4 x i32> %abs to <4 x i16> 2290f38b4d1SSimon Pilgrim ret <4 x i16> %trunc 2300f38b4d1SSimon Pilgrim} 2310f38b4d1SSimon Pilgrim 2320f38b4d1SSimon Pilgrimdefine <4 x i16> @uabd_4h_promoted_ops(<4 x i8> %a, <4 x i8> %b) { 2330f38b4d1SSimon Pilgrim; CHECK-LABEL: uabd_4h_promoted_ops: 2340f38b4d1SSimon Pilgrim; CHECK: @ %bb.0: 235ac021689SDavid Green; CHECK-NEXT: vbic.i16 d1, #0xff00 236ac021689SDavid Green; CHECK-NEXT: vbic.i16 d0, #0xff00 237ac021689SDavid Green; CHECK-NEXT: vabd.u16 d0, d0, d1 238ac021689SDavid Green; CHECK-NEXT: bx lr 2390f38b4d1SSimon Pilgrim %a.zext = zext <4 x i8> %a to <4 x i16> 2400f38b4d1SSimon Pilgrim %b.zext = zext <4 x i8> %b to <4 x i16> 2410f38b4d1SSimon Pilgrim %sub = sub <4 x i16> %a.zext, %b.zext 2420f38b4d1SSimon Pilgrim %abs = call <4 x i16> @llvm.abs.v4i16(<4 x i16> %sub, i1 true) 2430f38b4d1SSimon Pilgrim ret <4 x i16> %abs 2440f38b4d1SSimon Pilgrim} 2450f38b4d1SSimon Pilgrim 2460f38b4d1SSimon Pilgrimdefine <8 x i16> @uabd_8h(<8 x i16> %a, <8 x i16> %b) { 2470f38b4d1SSimon Pilgrim; CHECK-LABEL: uabd_8h: 2480f38b4d1SSimon Pilgrim; CHECK: @ %bb.0: 249ac021689SDavid Green; CHECK-NEXT: vabd.u16 q0, q0, q1 250ac021689SDavid Green; CHECK-NEXT: bx lr 2510f38b4d1SSimon Pilgrim %a.zext = zext <8 x i16> %a to <8 x i32> 2520f38b4d1SSimon Pilgrim %b.zext = zext <8 x i16> %b to <8 x i32> 2530f38b4d1SSimon Pilgrim %sub = sub <8 x i32> %a.zext, %b.zext 2540f38b4d1SSimon Pilgrim %abs = call <8 x i32> @llvm.abs.v8i32(<8 x i32> %sub, i1 true) 2550f38b4d1SSimon Pilgrim %trunc = trunc <8 x i32> %abs to <8 x i16> 2560f38b4d1SSimon Pilgrim ret <8 x i16> %trunc 2570f38b4d1SSimon Pilgrim} 2580f38b4d1SSimon Pilgrim 2590f38b4d1SSimon Pilgrimdefine <8 x i16> @uabd_8h_promoted_ops(<8 x i8> %a, <8 x i8> %b) { 2600f38b4d1SSimon Pilgrim; CHECK-LABEL: uabd_8h_promoted_ops: 2610f38b4d1SSimon Pilgrim; CHECK: @ %bb.0: 262ac021689SDavid Green; CHECK-NEXT: vabdl.u8 q0, d0, d1 263ac021689SDavid Green; CHECK-NEXT: bx lr 2640f38b4d1SSimon Pilgrim %a.zext = zext <8 x i8> %a to <8 x i16> 2650f38b4d1SSimon Pilgrim %b.zext = zext <8 x i8> %b to <8 x i16> 2660f38b4d1SSimon Pilgrim %sub = sub <8 x i16> %a.zext, %b.zext 2670f38b4d1SSimon Pilgrim %abs = call <8 x i16> @llvm.abs.v8i16(<8 x i16> %sub, i1 true) 2680f38b4d1SSimon Pilgrim ret <8 x i16> %abs 2690f38b4d1SSimon Pilgrim} 2700f38b4d1SSimon Pilgrim 2710f38b4d1SSimon Pilgrimdefine <2 x i32> @uabd_2s(<2 x i32> %a, <2 x i32> %b) { 2720f38b4d1SSimon Pilgrim; CHECK-LABEL: uabd_2s: 2730f38b4d1SSimon Pilgrim; CHECK: @ %bb.0: 274ac021689SDavid Green; CHECK-NEXT: vabd.u32 d0, d0, d1 275ac021689SDavid Green; CHECK-NEXT: bx lr 2760f38b4d1SSimon Pilgrim %a.zext = zext <2 x i32> %a to <2 x i64> 2770f38b4d1SSimon Pilgrim %b.zext = zext <2 x i32> %b to <2 x i64> 2780f38b4d1SSimon Pilgrim %sub = sub <2 x i64> %a.zext, %b.zext 2790f38b4d1SSimon Pilgrim %abs = call <2 x i64> @llvm.abs.v2i64(<2 x i64> %sub, i1 true) 2800f38b4d1SSimon Pilgrim %trunc = trunc <2 x i64> %abs to <2 x i32> 2810f38b4d1SSimon Pilgrim ret <2 x i32> %trunc 2820f38b4d1SSimon Pilgrim} 2830f38b4d1SSimon Pilgrim 2840f38b4d1SSimon Pilgrimdefine <2 x i32> @uabd_2s_promoted_ops(<2 x i16> %a, <2 x i16> %b) { 2850f38b4d1SSimon Pilgrim; CHECK-LABEL: uabd_2s_promoted_ops: 2860f38b4d1SSimon Pilgrim; CHECK: @ %bb.0: 2870f38b4d1SSimon Pilgrim; CHECK-NEXT: vmov.i32 d16, #0xffff 288ac021689SDavid Green; CHECK-NEXT: vand d17, d1, d16 289ac021689SDavid Green; CHECK-NEXT: vand d16, d0, d16 290ac021689SDavid Green; CHECK-NEXT: vabd.u32 d0, d16, d17 291ac021689SDavid Green; CHECK-NEXT: bx lr 2920f38b4d1SSimon Pilgrim %a.zext = zext <2 x i16> %a to <2 x i32> 2930f38b4d1SSimon Pilgrim %b.zext = zext <2 x i16> %b to <2 x i32> 2940f38b4d1SSimon Pilgrim %sub = sub <2 x i32> %a.zext, %b.zext 2950f38b4d1SSimon Pilgrim %abs = call <2 x i32> @llvm.abs.v2i32(<2 x i32> %sub, i1 true) 2960f38b4d1SSimon Pilgrim ret <2 x i32> %abs 2970f38b4d1SSimon Pilgrim} 2980f38b4d1SSimon Pilgrim 2990f38b4d1SSimon Pilgrimdefine <4 x i32> @uabd_4s(<4 x i32> %a, <4 x i32> %b) { 3000f38b4d1SSimon Pilgrim; CHECK-LABEL: uabd_4s: 3010f38b4d1SSimon Pilgrim; CHECK: @ %bb.0: 302ac021689SDavid Green; CHECK-NEXT: vabd.u32 q0, q0, q1 303ac021689SDavid Green; CHECK-NEXT: bx lr 3040f38b4d1SSimon Pilgrim %a.zext = zext <4 x i32> %a to <4 x i64> 3050f38b4d1SSimon Pilgrim %b.zext = zext <4 x i32> %b to <4 x i64> 3060f38b4d1SSimon Pilgrim %sub = sub <4 x i64> %a.zext, %b.zext 3070f38b4d1SSimon Pilgrim %abs = call <4 x i64> @llvm.abs.v4i64(<4 x i64> %sub, i1 true) 3080f38b4d1SSimon Pilgrim %trunc = trunc <4 x i64> %abs to <4 x i32> 3090f38b4d1SSimon Pilgrim ret <4 x i32> %trunc 3100f38b4d1SSimon Pilgrim} 3110f38b4d1SSimon Pilgrim 3120f38b4d1SSimon Pilgrimdefine <4 x i32> @uabd_4s_promoted_ops(<4 x i16> %a, <4 x i16> %b) { 3130f38b4d1SSimon Pilgrim; CHECK-LABEL: uabd_4s_promoted_ops: 3140f38b4d1SSimon Pilgrim; CHECK: @ %bb.0: 315ac021689SDavid Green; CHECK-NEXT: vabdl.u16 q0, d0, d1 316ac021689SDavid Green; CHECK-NEXT: bx lr 3170f38b4d1SSimon Pilgrim %a.zext = zext <4 x i16> %a to <4 x i32> 3180f38b4d1SSimon Pilgrim %b.zext = zext <4 x i16> %b to <4 x i32> 3190f38b4d1SSimon Pilgrim %sub = sub <4 x i32> %a.zext, %b.zext 3200f38b4d1SSimon Pilgrim %abs = call <4 x i32> @llvm.abs.v4i32(<4 x i32> %sub, i1 true) 3210f38b4d1SSimon Pilgrim ret <4 x i32> %abs 3220f38b4d1SSimon Pilgrim} 3230f38b4d1SSimon Pilgrim 3240f38b4d1SSimon Pilgrimdefine <2 x i64> @uabd_2d(<2 x i64> %a, <2 x i64> %b) { 3250f38b4d1SSimon Pilgrim; CHECK-LABEL: uabd_2d: 3260f38b4d1SSimon Pilgrim; CHECK: @ %bb.0: 32713d04fa5SSimon Pilgrim; CHECK-NEXT: vqsub.u64 q8, q1, q0 32813d04fa5SSimon Pilgrim; CHECK-NEXT: vqsub.u64 q9, q0, q1 32913d04fa5SSimon Pilgrim; CHECK-NEXT: vorr q0, q9, q8 33013d04fa5SSimon Pilgrim; CHECK-NEXT: bx lr 3310f38b4d1SSimon Pilgrim %a.zext = zext <2 x i64> %a to <2 x i128> 3320f38b4d1SSimon Pilgrim %b.zext = zext <2 x i64> %b to <2 x i128> 3330f38b4d1SSimon Pilgrim %sub = sub <2 x i128> %a.zext, %b.zext 3340f38b4d1SSimon Pilgrim %abs = call <2 x i128> @llvm.abs.v2i128(<2 x i128> %sub, i1 true) 3350f38b4d1SSimon Pilgrim %trunc = trunc <2 x i128> %abs to <2 x i64> 3360f38b4d1SSimon Pilgrim ret <2 x i64> %trunc 3370f38b4d1SSimon Pilgrim} 3380f38b4d1SSimon Pilgrim 3390f38b4d1SSimon Pilgrimdefine <2 x i64> @uabd_2d_promoted_ops(<2 x i32> %a, <2 x i32> %b) { 3400f38b4d1SSimon Pilgrim; CHECK-LABEL: uabd_2d_promoted_ops: 3410f38b4d1SSimon Pilgrim; CHECK: @ %bb.0: 342ac021689SDavid Green; CHECK-NEXT: vabdl.u32 q0, d0, d1 343ac021689SDavid Green; CHECK-NEXT: bx lr 3440f38b4d1SSimon Pilgrim %a.zext = zext <2 x i32> %a to <2 x i64> 3450f38b4d1SSimon Pilgrim %b.zext = zext <2 x i32> %b to <2 x i64> 3460f38b4d1SSimon Pilgrim %sub = sub <2 x i64> %a.zext, %b.zext 3470f38b4d1SSimon Pilgrim %abs = call <2 x i64> @llvm.abs.v2i64(<2 x i64> %sub, i1 true) 3480f38b4d1SSimon Pilgrim ret <2 x i64> %abs 3490f38b4d1SSimon Pilgrim} 3500f38b4d1SSimon Pilgrim 3510f38b4d1SSimon Pilgrimdefine <16 x i8> @uabd_v16i8_nuw(<16 x i8> %a, <16 x i8> %b) { 3520f38b4d1SSimon Pilgrim; CHECK-LABEL: uabd_v16i8_nuw: 3530f38b4d1SSimon Pilgrim; CHECK: @ %bb.0: 354ac021689SDavid Green; CHECK-NEXT: vsub.i8 q8, q0, q1 355ac021689SDavid Green; CHECK-NEXT: vabs.s8 q0, q8 356ac021689SDavid Green; CHECK-NEXT: bx lr 3570f38b4d1SSimon Pilgrim %sub = sub nuw <16 x i8> %a, %b 3580f38b4d1SSimon Pilgrim %abs = call <16 x i8> @llvm.abs.v16i8(<16 x i8> %sub, i1 true) 3590f38b4d1SSimon Pilgrim ret <16 x i8> %abs 3600f38b4d1SSimon Pilgrim} 3610f38b4d1SSimon Pilgrim 3620f38b4d1SSimon Pilgrimdefine <8 x i16> @uabd_v8i16_nuw(<8 x i16> %a, <8 x i16> %b) { 3630f38b4d1SSimon Pilgrim; CHECK-LABEL: uabd_v8i16_nuw: 3640f38b4d1SSimon Pilgrim; CHECK: @ %bb.0: 365ac021689SDavid Green; CHECK-NEXT: vsub.i16 q8, q0, q1 366ac021689SDavid Green; CHECK-NEXT: vabs.s16 q0, q8 367ac021689SDavid Green; CHECK-NEXT: bx lr 3680f38b4d1SSimon Pilgrim %sub = sub nuw <8 x i16> %a, %b 3690f38b4d1SSimon Pilgrim %abs = call <8 x i16> @llvm.abs.v8i16(<8 x i16> %sub, i1 true) 3700f38b4d1SSimon Pilgrim ret <8 x i16> %abs 3710f38b4d1SSimon Pilgrim} 3720f38b4d1SSimon Pilgrim 3730f38b4d1SSimon Pilgrimdefine <4 x i32> @uabd_v4i32_nuw(<4 x i32> %a, <4 x i32> %b) { 3740f38b4d1SSimon Pilgrim; CHECK-LABEL: uabd_v4i32_nuw: 3750f38b4d1SSimon Pilgrim; CHECK: @ %bb.0: 376ac021689SDavid Green; CHECK-NEXT: vsub.i32 q8, q0, q1 377ac021689SDavid Green; CHECK-NEXT: vabs.s32 q0, q8 378ac021689SDavid Green; CHECK-NEXT: bx lr 3790f38b4d1SSimon Pilgrim %sub = sub nuw <4 x i32> %a, %b 3800f38b4d1SSimon Pilgrim %abs = call <4 x i32> @llvm.abs.v4i32(<4 x i32> %sub, i1 true) 3810f38b4d1SSimon Pilgrim ret <4 x i32> %abs 3820f38b4d1SSimon Pilgrim} 3830f38b4d1SSimon Pilgrim 3840f38b4d1SSimon Pilgrimdefine <2 x i64> @uabd_v2i64_nuw(<2 x i64> %a, <2 x i64> %b) { 3850f38b4d1SSimon Pilgrim; CHECK-LABEL: uabd_v2i64_nuw: 3860f38b4d1SSimon Pilgrim; CHECK: @ %bb.0: 387ac021689SDavid Green; CHECK-NEXT: vsub.i64 q8, q0, q1 3880f38b4d1SSimon Pilgrim; CHECK-NEXT: vshr.s64 q9, q8, #63 3890f38b4d1SSimon Pilgrim; CHECK-NEXT: veor q8, q8, q9 390ac021689SDavid Green; CHECK-NEXT: vsub.i64 q0, q8, q9 391ac021689SDavid Green; CHECK-NEXT: bx lr 3920f38b4d1SSimon Pilgrim %sub = sub nuw <2 x i64> %a, %b 3930f38b4d1SSimon Pilgrim %abs = call <2 x i64> @llvm.abs.v2i64(<2 x i64> %sub, i1 true) 3940f38b4d1SSimon Pilgrim ret <2 x i64> %abs 3950f38b4d1SSimon Pilgrim} 3960f38b4d1SSimon Pilgrim 3970f38b4d1SSimon Pilgrimdefine <16 x i8> @sabd_v16i8_nsw(<16 x i8> %a, <16 x i8> %b) { 3980f38b4d1SSimon Pilgrim; CHECK-LABEL: sabd_v16i8_nsw: 3990f38b4d1SSimon Pilgrim; CHECK: @ %bb.0: 400ac021689SDavid Green; CHECK-NEXT: vabd.s8 q0, q0, q1 401ac021689SDavid Green; CHECK-NEXT: bx lr 4020f38b4d1SSimon Pilgrim %sub = sub nsw <16 x i8> %a, %b 4030f38b4d1SSimon Pilgrim %abs = call <16 x i8> @llvm.abs.v16i8(<16 x i8> %sub, i1 true) 4040f38b4d1SSimon Pilgrim ret <16 x i8> %abs 4050f38b4d1SSimon Pilgrim} 4060f38b4d1SSimon Pilgrim 4070f38b4d1SSimon Pilgrimdefine <8 x i16> @sabd_v8i16_nsw(<8 x i16> %a, <8 x i16> %b) { 4080f38b4d1SSimon Pilgrim; CHECK-LABEL: sabd_v8i16_nsw: 4090f38b4d1SSimon Pilgrim; CHECK: @ %bb.0: 410ac021689SDavid Green; CHECK-NEXT: vabd.s16 q0, q0, q1 411ac021689SDavid Green; CHECK-NEXT: bx lr 4120f38b4d1SSimon Pilgrim %sub = sub nsw <8 x i16> %a, %b 4130f38b4d1SSimon Pilgrim %abs = call <8 x i16> @llvm.abs.v8i16(<8 x i16> %sub, i1 true) 4140f38b4d1SSimon Pilgrim ret <8 x i16> %abs 4150f38b4d1SSimon Pilgrim} 4160f38b4d1SSimon Pilgrim 4170f38b4d1SSimon Pilgrimdefine <4 x i32> @sabd_v4i32_nsw(<4 x i32> %a, <4 x i32> %b) { 4180f38b4d1SSimon Pilgrim; CHECK-LABEL: sabd_v4i32_nsw: 4190f38b4d1SSimon Pilgrim; CHECK: @ %bb.0: 420ac021689SDavid Green; CHECK-NEXT: vabd.s32 q0, q0, q1 421ac021689SDavid Green; CHECK-NEXT: bx lr 4220f38b4d1SSimon Pilgrim %sub = sub nsw <4 x i32> %a, %b 4230f38b4d1SSimon Pilgrim %abs = call <4 x i32> @llvm.abs.v4i32(<4 x i32> %sub, i1 true) 4240f38b4d1SSimon Pilgrim ret <4 x i32> %abs 4250f38b4d1SSimon Pilgrim} 4260f38b4d1SSimon Pilgrim 4270f38b4d1SSimon Pilgrimdefine <2 x i64> @sabd_v2i64_nsw(<2 x i64> %a, <2 x i64> %b) { 4280f38b4d1SSimon Pilgrim; CHECK-LABEL: sabd_v2i64_nsw: 4290f38b4d1SSimon Pilgrim; CHECK: @ %bb.0: 430ac021689SDavid Green; CHECK-NEXT: vsub.i64 q8, q0, q1 4310f38b4d1SSimon Pilgrim; CHECK-NEXT: vshr.s64 q9, q8, #63 4320f38b4d1SSimon Pilgrim; CHECK-NEXT: veor q8, q8, q9 433ac021689SDavid Green; CHECK-NEXT: vsub.i64 q0, q8, q9 434ac021689SDavid Green; CHECK-NEXT: bx lr 4350f38b4d1SSimon Pilgrim %sub = sub nsw <2 x i64> %a, %b 4360f38b4d1SSimon Pilgrim %abs = call <2 x i64> @llvm.abs.v2i64(<2 x i64> %sub, i1 true) 4370f38b4d1SSimon Pilgrim ret <2 x i64> %abs 4380f38b4d1SSimon Pilgrim} 4390f38b4d1SSimon Pilgrim 4400f38b4d1SSimon Pilgrimdefine <16 x i8> @smaxmin_v16i8(<16 x i8> %0, <16 x i8> %1) { 4410f38b4d1SSimon Pilgrim; CHECK-LABEL: smaxmin_v16i8: 4420f38b4d1SSimon Pilgrim; CHECK: @ %bb.0: 443ac021689SDavid Green; CHECK-NEXT: vabd.s8 q0, q0, q1 444ac021689SDavid Green; CHECK-NEXT: bx lr 4450f38b4d1SSimon Pilgrim %a = tail call <16 x i8> @llvm.smax.v16i8(<16 x i8> %0, <16 x i8> %1) 4460f38b4d1SSimon Pilgrim %b = tail call <16 x i8> @llvm.smin.v16i8(<16 x i8> %0, <16 x i8> %1) 4470f38b4d1SSimon Pilgrim %sub = sub <16 x i8> %a, %b 4480f38b4d1SSimon Pilgrim ret <16 x i8> %sub 4490f38b4d1SSimon Pilgrim} 4500f38b4d1SSimon Pilgrim 4510f38b4d1SSimon Pilgrimdefine <8 x i16> @smaxmin_v8i16(<8 x i16> %0, <8 x i16> %1) { 4520f38b4d1SSimon Pilgrim; CHECK-LABEL: smaxmin_v8i16: 4530f38b4d1SSimon Pilgrim; CHECK: @ %bb.0: 454ac021689SDavid Green; CHECK-NEXT: vabd.s16 q0, q0, q1 455ac021689SDavid Green; CHECK-NEXT: bx lr 4560f38b4d1SSimon Pilgrim %a = tail call <8 x i16> @llvm.smax.v8i16(<8 x i16> %0, <8 x i16> %1) 4570f38b4d1SSimon Pilgrim %b = tail call <8 x i16> @llvm.smin.v8i16(<8 x i16> %0, <8 x i16> %1) 4580f38b4d1SSimon Pilgrim %sub = sub <8 x i16> %a, %b 4590f38b4d1SSimon Pilgrim ret <8 x i16> %sub 4600f38b4d1SSimon Pilgrim} 4610f38b4d1SSimon Pilgrim 4620f38b4d1SSimon Pilgrimdefine <4 x i32> @smaxmin_v4i32(<4 x i32> %0, <4 x i32> %1) { 4630f38b4d1SSimon Pilgrim; CHECK-LABEL: smaxmin_v4i32: 4640f38b4d1SSimon Pilgrim; CHECK: @ %bb.0: 465ac021689SDavid Green; CHECK-NEXT: vabd.s32 q0, q0, q1 466ac021689SDavid Green; CHECK-NEXT: bx lr 4670f38b4d1SSimon Pilgrim %a = tail call <4 x i32> @llvm.smax.v4i32(<4 x i32> %0, <4 x i32> %1) 4680f38b4d1SSimon Pilgrim %b = tail call <4 x i32> @llvm.smin.v4i32(<4 x i32> %0, <4 x i32> %1) 4690f38b4d1SSimon Pilgrim %sub = sub <4 x i32> %a, %b 4700f38b4d1SSimon Pilgrim ret <4 x i32> %sub 4710f38b4d1SSimon Pilgrim} 4720f38b4d1SSimon Pilgrim 4730f38b4d1SSimon Pilgrimdefine <2 x i64> @smaxmin_v2i64(<2 x i64> %0, <2 x i64> %1) { 4740f38b4d1SSimon Pilgrim; CHECK-LABEL: smaxmin_v2i64: 4750f38b4d1SSimon Pilgrim; CHECK: @ %bb.0: 47613d04fa5SSimon Pilgrim; CHECK-NEXT: .save {r4, r5, r6, lr} 47713d04fa5SSimon Pilgrim; CHECK-NEXT: push {r4, r5, r6, lr} 478*e0ed0333SSergei Barannikov; CHECK-NEXT: vmov r0, r1, d1 47913d04fa5SSimon Pilgrim; CHECK-NEXT: mov r6, #0 480*e0ed0333SSergei Barannikov; CHECK-NEXT: vmov r2, r3, d3 481*e0ed0333SSergei Barannikov; CHECK-NEXT: vmov r12, lr, d0 482*e0ed0333SSergei Barannikov; CHECK-NEXT: vmov r4, r5, d2 48313d04fa5SSimon Pilgrim; CHECK-NEXT: vsub.i64 q8, q0, q1 48413d04fa5SSimon Pilgrim; CHECK-NEXT: subs r0, r2, r0 485*e0ed0333SSergei Barannikov; CHECK-NEXT: sbcs r0, r3, r1 48613d04fa5SSimon Pilgrim; CHECK-NEXT: mov r0, #0 48713d04fa5SSimon Pilgrim; CHECK-NEXT: movwlt r0, #1 488*e0ed0333SSergei Barannikov; CHECK-NEXT: cmp r0, #0 489*e0ed0333SSergei Barannikov; CHECK-NEXT: mvnne r0, #0 490*e0ed0333SSergei Barannikov; CHECK-NEXT: subs r1, r4, r12 49113d04fa5SSimon Pilgrim; CHECK-NEXT: sbcs r1, r5, lr 492*e0ed0333SSergei Barannikov; CHECK-NEXT: vdup.32 d19, r0 49313d04fa5SSimon Pilgrim; CHECK-NEXT: movwlt r6, #1 49413d04fa5SSimon Pilgrim; CHECK-NEXT: cmp r6, #0 49513d04fa5SSimon Pilgrim; CHECK-NEXT: mvnne r6, #0 496*e0ed0333SSergei Barannikov; CHECK-NEXT: vdup.32 d18, r6 49713d04fa5SSimon Pilgrim; CHECK-NEXT: veor q8, q8, q9 498ac021689SDavid Green; CHECK-NEXT: vsub.i64 q0, q9, q8 49913d04fa5SSimon Pilgrim; CHECK-NEXT: pop {r4, r5, r6, pc} 5000f38b4d1SSimon Pilgrim %a = tail call <2 x i64> @llvm.smax.v2i64(<2 x i64> %0, <2 x i64> %1) 5010f38b4d1SSimon Pilgrim %b = tail call <2 x i64> @llvm.smin.v2i64(<2 x i64> %0, <2 x i64> %1) 5020f38b4d1SSimon Pilgrim %sub = sub <2 x i64> %a, %b 5030f38b4d1SSimon Pilgrim ret <2 x i64> %sub 5040f38b4d1SSimon Pilgrim} 5050f38b4d1SSimon Pilgrim 5060f38b4d1SSimon Pilgrimdefine <16 x i8> @umaxmin_v16i8(<16 x i8> %0, <16 x i8> %1) { 5070f38b4d1SSimon Pilgrim; CHECK-LABEL: umaxmin_v16i8: 5080f38b4d1SSimon Pilgrim; CHECK: @ %bb.0: 509ac021689SDavid Green; CHECK-NEXT: vabd.u8 q0, q0, q1 510ac021689SDavid Green; CHECK-NEXT: bx lr 5110f38b4d1SSimon Pilgrim %a = tail call <16 x i8> @llvm.umax.v16i8(<16 x i8> %0, <16 x i8> %1) 5120f38b4d1SSimon Pilgrim %b = tail call <16 x i8> @llvm.umin.v16i8(<16 x i8> %0, <16 x i8> %1) 5130f38b4d1SSimon Pilgrim %sub = sub <16 x i8> %a, %b 5140f38b4d1SSimon Pilgrim ret <16 x i8> %sub 5150f38b4d1SSimon Pilgrim} 5160f38b4d1SSimon Pilgrim 5170f38b4d1SSimon Pilgrimdefine <8 x i16> @umaxmin_v8i16(<8 x i16> %0, <8 x i16> %1) { 5180f38b4d1SSimon Pilgrim; CHECK-LABEL: umaxmin_v8i16: 5190f38b4d1SSimon Pilgrim; CHECK: @ %bb.0: 520ac021689SDavid Green; CHECK-NEXT: vabd.u16 q0, q0, q1 521ac021689SDavid Green; CHECK-NEXT: bx lr 5220f38b4d1SSimon Pilgrim %a = tail call <8 x i16> @llvm.umax.v8i16(<8 x i16> %0, <8 x i16> %1) 5230f38b4d1SSimon Pilgrim %b = tail call <8 x i16> @llvm.umin.v8i16(<8 x i16> %0, <8 x i16> %1) 5240f38b4d1SSimon Pilgrim %sub = sub <8 x i16> %a, %b 5250f38b4d1SSimon Pilgrim ret <8 x i16> %sub 5260f38b4d1SSimon Pilgrim} 5270f38b4d1SSimon Pilgrim 5280f38b4d1SSimon Pilgrimdefine <4 x i32> @umaxmin_v4i32(<4 x i32> %0, <4 x i32> %1) { 5290f38b4d1SSimon Pilgrim; CHECK-LABEL: umaxmin_v4i32: 5300f38b4d1SSimon Pilgrim; CHECK: @ %bb.0: 531ac021689SDavid Green; CHECK-NEXT: vabd.u32 q0, q0, q1 532ac021689SDavid Green; CHECK-NEXT: bx lr 5330f38b4d1SSimon Pilgrim %a = tail call <4 x i32> @llvm.umax.v4i32(<4 x i32> %0, <4 x i32> %1) 5340f38b4d1SSimon Pilgrim %b = tail call <4 x i32> @llvm.umin.v4i32(<4 x i32> %0, <4 x i32> %1) 5350f38b4d1SSimon Pilgrim %sub = sub <4 x i32> %a, %b 5360f38b4d1SSimon Pilgrim ret <4 x i32> %sub 5370f38b4d1SSimon Pilgrim} 5380f38b4d1SSimon Pilgrim 5390f38b4d1SSimon Pilgrimdefine <2 x i64> @umaxmin_v2i64(<2 x i64> %0, <2 x i64> %1) { 5400f38b4d1SSimon Pilgrim; CHECK-LABEL: umaxmin_v2i64: 5410f38b4d1SSimon Pilgrim; CHECK: @ %bb.0: 54213d04fa5SSimon Pilgrim; CHECK-NEXT: vqsub.u64 q8, q1, q0 54313d04fa5SSimon Pilgrim; CHECK-NEXT: vqsub.u64 q9, q0, q1 54413d04fa5SSimon Pilgrim; CHECK-NEXT: vorr q0, q9, q8 545ac021689SDavid Green; CHECK-NEXT: bx lr 5460f38b4d1SSimon Pilgrim %a = tail call <2 x i64> @llvm.umax.v2i64(<2 x i64> %0, <2 x i64> %1) 5470f38b4d1SSimon Pilgrim %b = tail call <2 x i64> @llvm.umin.v2i64(<2 x i64> %0, <2 x i64> %1) 5480f38b4d1SSimon Pilgrim %sub = sub <2 x i64> %a, %b 5490f38b4d1SSimon Pilgrim ret <2 x i64> %sub 5500f38b4d1SSimon Pilgrim} 5510f38b4d1SSimon Pilgrim 5520f38b4d1SSimon Pilgrimdefine <16 x i8> @umaxmin_v16i8_com1(<16 x i8> %0, <16 x i8> %1) { 5530f38b4d1SSimon Pilgrim; CHECK-LABEL: umaxmin_v16i8_com1: 5540f38b4d1SSimon Pilgrim; CHECK: @ %bb.0: 555ac021689SDavid Green; CHECK-NEXT: vabd.u8 q0, q0, q1 556ac021689SDavid Green; CHECK-NEXT: bx lr 5570f38b4d1SSimon Pilgrim %a = tail call <16 x i8> @llvm.umax.v16i8(<16 x i8> %0, <16 x i8> %1) 5580f38b4d1SSimon Pilgrim %b = tail call <16 x i8> @llvm.umin.v16i8(<16 x i8> %1, <16 x i8> %0) 5590f38b4d1SSimon Pilgrim %sub = sub <16 x i8> %a, %b 5600f38b4d1SSimon Pilgrim ret <16 x i8> %sub 5610f38b4d1SSimon Pilgrim} 562