1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=arm64 -aarch64-neon-syntax=apple < %s -asm-verbose=false -mcpu=cyclone | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdefine signext i8 @test_vaddv_s8(<8 x i8> %a1) { 4*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddv_s8: 5*9880d681SAndroid Build Coastguard Worker; CHECK: addv.8b b[[REGNUM:[0-9]+]], v0 6*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: smov.b w0, v[[REGNUM]][0] 7*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 8*9880d681SAndroid Build Coastguard Workerentry: 9*9880d681SAndroid Build Coastguard Worker %vaddv.i = tail call i32 @llvm.aarch64.neon.saddv.i32.v8i8(<8 x i8> %a1) 10*9880d681SAndroid Build Coastguard Worker %0 = trunc i32 %vaddv.i to i8 11*9880d681SAndroid Build Coastguard Worker ret i8 %0 12*9880d681SAndroid Build Coastguard Worker} 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @test_vaddv_s8_used_by_laneop(<8 x i8> %a1, <8 x i8> %a2) { 15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddv_s8_used_by_laneop: 16*9880d681SAndroid Build Coastguard Worker; CHECK: addv.8b b[[REGNUM:[0-9]+]], v1 17*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.b v0[3], v[[REGNUM]][0] 18*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 19*9880d681SAndroid Build Coastguard Workerentry: 20*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 @llvm.aarch64.neon.saddv.i32.v8i8(<8 x i8> %a2) 21*9880d681SAndroid Build Coastguard Worker %1 = trunc i32 %0 to i8 22*9880d681SAndroid Build Coastguard Worker %2 = insertelement <8 x i8> %a1, i8 %1, i32 3 23*9880d681SAndroid Build Coastguard Worker ret <8 x i8> %2 24*9880d681SAndroid Build Coastguard Worker} 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Workerdefine signext i16 @test_vaddv_s16(<4 x i16> %a1) { 27*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddv_s16: 28*9880d681SAndroid Build Coastguard Worker; CHECK: addv.4h h[[REGNUM:[0-9]+]], v0 29*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: smov.h w0, v[[REGNUM]][0] 30*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 31*9880d681SAndroid Build Coastguard Workerentry: 32*9880d681SAndroid Build Coastguard Worker %vaddv.i = tail call i32 @llvm.aarch64.neon.saddv.i32.v4i16(<4 x i16> %a1) 33*9880d681SAndroid Build Coastguard Worker %0 = trunc i32 %vaddv.i to i16 34*9880d681SAndroid Build Coastguard Worker ret i16 %0 35*9880d681SAndroid Build Coastguard Worker} 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @test_vaddv_s16_used_by_laneop(<4 x i16> %a1, <4 x i16> %a2) { 38*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddv_s16_used_by_laneop: 39*9880d681SAndroid Build Coastguard Worker; CHECK: addv.4h h[[REGNUM:[0-9]+]], v1 40*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.h v0[3], v[[REGNUM]][0] 41*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 42*9880d681SAndroid Build Coastguard Workerentry: 43*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 @llvm.aarch64.neon.saddv.i32.v4i16(<4 x i16> %a2) 44*9880d681SAndroid Build Coastguard Worker %1 = trunc i32 %0 to i16 45*9880d681SAndroid Build Coastguard Worker %2 = insertelement <4 x i16> %a1, i16 %1, i32 3 46*9880d681SAndroid Build Coastguard Worker ret <4 x i16> %2 47*9880d681SAndroid Build Coastguard Worker} 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Workerdefine i32 @test_vaddv_s32(<2 x i32> %a1) { 50*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddv_s32: 51*9880d681SAndroid Build Coastguard Worker; 2 x i32 is not supported by the ISA, thus, this is a special case 52*9880d681SAndroid Build Coastguard Worker; CHECK: addp.2s v[[REGNUM:[0-9]+]], v0, v0 53*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov w0, s[[REGNUM]] 54*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 55*9880d681SAndroid Build Coastguard Workerentry: 56*9880d681SAndroid Build Coastguard Worker %vaddv.i = tail call i32 @llvm.aarch64.neon.saddv.i32.v2i32(<2 x i32> %a1) 57*9880d681SAndroid Build Coastguard Worker ret i32 %vaddv.i 58*9880d681SAndroid Build Coastguard Worker} 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @test_vaddv_s32_used_by_laneop(<2 x i32> %a1, <2 x i32> %a2) { 61*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddv_s32_used_by_laneop: 62*9880d681SAndroid Build Coastguard Worker; CHECK: addp.2s v[[REGNUM:[0-9]+]], v1, v1 63*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.s v0[1], v[[REGNUM]][0] 64*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 65*9880d681SAndroid Build Coastguard Workerentry: 66*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 @llvm.aarch64.neon.saddv.i32.v2i32(<2 x i32> %a2) 67*9880d681SAndroid Build Coastguard Worker %1 = insertelement <2 x i32> %a1, i32 %0, i32 1 68*9880d681SAndroid Build Coastguard Worker ret <2 x i32> %1 69*9880d681SAndroid Build Coastguard Worker} 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Workerdefine i64 @test_vaddv_s64(<2 x i64> %a1) { 72*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddv_s64: 73*9880d681SAndroid Build Coastguard Worker; CHECK: addp.2d [[REGNUM:d[0-9]+]], v0 74*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov x0, [[REGNUM]] 75*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 76*9880d681SAndroid Build Coastguard Workerentry: 77*9880d681SAndroid Build Coastguard Worker %vaddv.i = tail call i64 @llvm.aarch64.neon.saddv.i64.v2i64(<2 x i64> %a1) 78*9880d681SAndroid Build Coastguard Worker ret i64 %vaddv.i 79*9880d681SAndroid Build Coastguard Worker} 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vaddv_s64_used_by_laneop(<2 x i64> %a1, <2 x i64> %a2) { 82*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddv_s64_used_by_laneop: 83*9880d681SAndroid Build Coastguard Worker; CHECK: addp.2d d[[REGNUM:[0-9]+]], v1 84*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.d v0[1], v[[REGNUM]][0] 85*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 86*9880d681SAndroid Build Coastguard Workerentry: 87*9880d681SAndroid Build Coastguard Worker %0 = tail call i64 @llvm.aarch64.neon.saddv.i64.v2i64(<2 x i64> %a2) 88*9880d681SAndroid Build Coastguard Worker %1 = insertelement <2 x i64> %a1, i64 %0, i64 1 89*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %1 90*9880d681SAndroid Build Coastguard Worker} 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Workerdefine zeroext i8 @test_vaddv_u8(<8 x i8> %a1) { 93*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddv_u8: 94*9880d681SAndroid Build Coastguard Worker; CHECK: addv.8b b[[REGNUM:[0-9]+]], v0 95*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov w0, s[[REGNUM]] 96*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 97*9880d681SAndroid Build Coastguard Workerentry: 98*9880d681SAndroid Build Coastguard Worker %vaddv.i = tail call i32 @llvm.aarch64.neon.uaddv.i32.v8i8(<8 x i8> %a1) 99*9880d681SAndroid Build Coastguard Worker %0 = trunc i32 %vaddv.i to i8 100*9880d681SAndroid Build Coastguard Worker ret i8 %0 101*9880d681SAndroid Build Coastguard Worker} 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @test_vaddv_u8_used_by_laneop(<8 x i8> %a1, <8 x i8> %a2) { 104*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddv_u8_used_by_laneop: 105*9880d681SAndroid Build Coastguard Worker; CHECK: addv.8b b[[REGNUM:[0-9]+]], v1 106*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.b v0[3], v[[REGNUM]][0] 107*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 108*9880d681SAndroid Build Coastguard Workerentry: 109*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 @llvm.aarch64.neon.uaddv.i32.v8i8(<8 x i8> %a2) 110*9880d681SAndroid Build Coastguard Worker %1 = trunc i32 %0 to i8 111*9880d681SAndroid Build Coastguard Worker %2 = insertelement <8 x i8> %a1, i8 %1, i32 3 112*9880d681SAndroid Build Coastguard Worker ret <8 x i8> %2 113*9880d681SAndroid Build Coastguard Worker} 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Workerdefine i32 @test_vaddv_u8_masked(<8 x i8> %a1) { 116*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddv_u8_masked: 117*9880d681SAndroid Build Coastguard Worker; CHECK: addv.8b b[[REGNUM:[0-9]+]], v0 118*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov w0, s[[REGNUM]] 119*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 120*9880d681SAndroid Build Coastguard Workerentry: 121*9880d681SAndroid Build Coastguard Worker %vaddv.i = tail call i32 @llvm.aarch64.neon.uaddv.i32.v8i8(<8 x i8> %a1) 122*9880d681SAndroid Build Coastguard Worker %0 = and i32 %vaddv.i, 511 ; 0x1ff 123*9880d681SAndroid Build Coastguard Worker ret i32 %0 124*9880d681SAndroid Build Coastguard Worker} 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Workerdefine zeroext i16 @test_vaddv_u16(<4 x i16> %a1) { 127*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddv_u16: 128*9880d681SAndroid Build Coastguard Worker; CHECK: addv.4h h[[REGNUM:[0-9]+]], v0 129*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov w0, s[[REGNUM]] 130*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 131*9880d681SAndroid Build Coastguard Workerentry: 132*9880d681SAndroid Build Coastguard Worker %vaddv.i = tail call i32 @llvm.aarch64.neon.uaddv.i32.v4i16(<4 x i16> %a1) 133*9880d681SAndroid Build Coastguard Worker %0 = trunc i32 %vaddv.i to i16 134*9880d681SAndroid Build Coastguard Worker ret i16 %0 135*9880d681SAndroid Build Coastguard Worker} 136*9880d681SAndroid Build Coastguard Worker 137*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @test_vaddv_u16_used_by_laneop(<4 x i16> %a1, <4 x i16> %a2) { 138*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddv_u16_used_by_laneop: 139*9880d681SAndroid Build Coastguard Worker; CHECK: addv.4h h[[REGNUM:[0-9]+]], v1 140*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.h v0[3], v[[REGNUM]][0] 141*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 142*9880d681SAndroid Build Coastguard Workerentry: 143*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 @llvm.aarch64.neon.uaddv.i32.v4i16(<4 x i16> %a2) 144*9880d681SAndroid Build Coastguard Worker %1 = trunc i32 %0 to i16 145*9880d681SAndroid Build Coastguard Worker %2 = insertelement <4 x i16> %a1, i16 %1, i32 3 146*9880d681SAndroid Build Coastguard Worker ret <4 x i16> %2 147*9880d681SAndroid Build Coastguard Worker} 148*9880d681SAndroid Build Coastguard Worker 149*9880d681SAndroid Build Coastguard Workerdefine i32 @test_vaddv_u16_masked(<4 x i16> %a1) { 150*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddv_u16_masked: 151*9880d681SAndroid Build Coastguard Worker; CHECK: addv.4h h[[REGNUM:[0-9]+]], v0 152*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov w0, s[[REGNUM]] 153*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 154*9880d681SAndroid Build Coastguard Workerentry: 155*9880d681SAndroid Build Coastguard Worker %vaddv.i = tail call i32 @llvm.aarch64.neon.uaddv.i32.v4i16(<4 x i16> %a1) 156*9880d681SAndroid Build Coastguard Worker %0 = and i32 %vaddv.i, 3276799 ; 0x31ffff 157*9880d681SAndroid Build Coastguard Worker ret i32 %0 158*9880d681SAndroid Build Coastguard Worker} 159*9880d681SAndroid Build Coastguard Worker 160*9880d681SAndroid Build Coastguard Workerdefine i32 @test_vaddv_u32(<2 x i32> %a1) { 161*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddv_u32: 162*9880d681SAndroid Build Coastguard Worker; 2 x i32 is not supported by the ISA, thus, this is a special case 163*9880d681SAndroid Build Coastguard Worker; CHECK: addp.2s v[[REGNUM:[0-9]+]], v0, v0 164*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov w0, s[[REGNUM]] 165*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 166*9880d681SAndroid Build Coastguard Workerentry: 167*9880d681SAndroid Build Coastguard Worker %vaddv.i = tail call i32 @llvm.aarch64.neon.uaddv.i32.v2i32(<2 x i32> %a1) 168*9880d681SAndroid Build Coastguard Worker ret i32 %vaddv.i 169*9880d681SAndroid Build Coastguard Worker} 170*9880d681SAndroid Build Coastguard Worker 171*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @test_vaddv_u32_used_by_laneop(<2 x i32> %a1, <2 x i32> %a2) { 172*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddv_u32_used_by_laneop: 173*9880d681SAndroid Build Coastguard Worker; CHECK: addp.2s v[[REGNUM:[0-9]+]], v1, v1 174*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.s v0[1], v[[REGNUM]][0] 175*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 176*9880d681SAndroid Build Coastguard Workerentry: 177*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 @llvm.aarch64.neon.uaddv.i32.v2i32(<2 x i32> %a2) 178*9880d681SAndroid Build Coastguard Worker %1 = insertelement <2 x i32> %a1, i32 %0, i32 1 179*9880d681SAndroid Build Coastguard Worker ret <2 x i32> %1 180*9880d681SAndroid Build Coastguard Worker} 181*9880d681SAndroid Build Coastguard Worker 182*9880d681SAndroid Build Coastguard Workerdefine float @test_vaddv_f32(<2 x float> %a1) { 183*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddv_f32: 184*9880d681SAndroid Build Coastguard Worker; CHECK: faddp.2s s0, v0 185*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 186*9880d681SAndroid Build Coastguard Workerentry: 187*9880d681SAndroid Build Coastguard Worker %vaddv.i = tail call float @llvm.aarch64.neon.faddv.f32.v2f32(<2 x float> %a1) 188*9880d681SAndroid Build Coastguard Worker ret float %vaddv.i 189*9880d681SAndroid Build Coastguard Worker} 190*9880d681SAndroid Build Coastguard Worker 191*9880d681SAndroid Build Coastguard Workerdefine float @test_vaddv_v4f32(<4 x float> %a1) { 192*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddv_v4f32: 193*9880d681SAndroid Build Coastguard Worker; CHECK: faddp.4s [[REGNUM:v[0-9]+]], v0, v0 194*9880d681SAndroid Build Coastguard Worker; CHECK: faddp.2s s0, [[REGNUM]] 195*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 196*9880d681SAndroid Build Coastguard Workerentry: 197*9880d681SAndroid Build Coastguard Worker %vaddv.i = tail call float @llvm.aarch64.neon.faddv.f32.v4f32(<4 x float> %a1) 198*9880d681SAndroid Build Coastguard Worker ret float %vaddv.i 199*9880d681SAndroid Build Coastguard Worker} 200*9880d681SAndroid Build Coastguard Worker 201*9880d681SAndroid Build Coastguard Workerdefine double @test_vaddv_f64(<2 x double> %a1) { 202*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddv_f64: 203*9880d681SAndroid Build Coastguard Worker; CHECK: faddp.2d d0, v0 204*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 205*9880d681SAndroid Build Coastguard Workerentry: 206*9880d681SAndroid Build Coastguard Worker %vaddv.i = tail call double @llvm.aarch64.neon.faddv.f64.v2f64(<2 x double> %a1) 207*9880d681SAndroid Build Coastguard Worker ret double %vaddv.i 208*9880d681SAndroid Build Coastguard Worker} 209*9880d681SAndroid Build Coastguard Worker 210*9880d681SAndroid Build Coastguard Workerdefine i64 @test_vaddv_u64(<2 x i64> %a1) { 211*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddv_u64: 212*9880d681SAndroid Build Coastguard Worker; CHECK: addp.2d [[REGNUM:d[0-9]+]], v0 213*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov x0, [[REGNUM]] 214*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 215*9880d681SAndroid Build Coastguard Workerentry: 216*9880d681SAndroid Build Coastguard Worker %vaddv.i = tail call i64 @llvm.aarch64.neon.uaddv.i64.v2i64(<2 x i64> %a1) 217*9880d681SAndroid Build Coastguard Worker ret i64 %vaddv.i 218*9880d681SAndroid Build Coastguard Worker} 219*9880d681SAndroid Build Coastguard Worker 220*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vaddv_u64_used_by_laneop(<2 x i64> %a1, <2 x i64> %a2) { 221*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddv_u64_used_by_laneop: 222*9880d681SAndroid Build Coastguard Worker; CHECK: addp.2d d[[REGNUM:[0-9]+]], v1 223*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.d v0[1], v[[REGNUM]][0] 224*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 225*9880d681SAndroid Build Coastguard Workerentry: 226*9880d681SAndroid Build Coastguard Worker %0 = tail call i64 @llvm.aarch64.neon.uaddv.i64.v2i64(<2 x i64> %a2) 227*9880d681SAndroid Build Coastguard Worker %1 = insertelement <2 x i64> %a1, i64 %0, i64 1 228*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %1 229*9880d681SAndroid Build Coastguard Worker} 230*9880d681SAndroid Build Coastguard Worker 231*9880d681SAndroid Build Coastguard Workerdefine <1 x i64> @test_vaddv_u64_to_vec(<2 x i64> %a1) { 232*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddv_u64_to_vec: 233*9880d681SAndroid Build Coastguard Worker; CHECK: addp.2d d0, v0 234*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: fmov 235*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: ins 236*9880d681SAndroid Build Coastguard Worker; CHECK: ret 237*9880d681SAndroid Build Coastguard Workerentry: 238*9880d681SAndroid Build Coastguard Worker %vaddv.i = tail call i64 @llvm.aarch64.neon.uaddv.i64.v2i64(<2 x i64> %a1) 239*9880d681SAndroid Build Coastguard Worker %vec = insertelement <1 x i64> undef, i64 %vaddv.i, i32 0 240*9880d681SAndroid Build Coastguard Worker ret <1 x i64> %vec 241*9880d681SAndroid Build Coastguard Worker} 242*9880d681SAndroid Build Coastguard Worker 243*9880d681SAndroid Build Coastguard Workerdefine signext i8 @test_vaddvq_s8(<16 x i8> %a1) { 244*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddvq_s8: 245*9880d681SAndroid Build Coastguard Worker; CHECK: addv.16b b[[REGNUM:[0-9]+]], v0 246*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: smov.b w0, v[[REGNUM]][0] 247*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 248*9880d681SAndroid Build Coastguard Workerentry: 249*9880d681SAndroid Build Coastguard Worker %vaddv.i = tail call i32 @llvm.aarch64.neon.saddv.i32.v16i8(<16 x i8> %a1) 250*9880d681SAndroid Build Coastguard Worker %0 = trunc i32 %vaddv.i to i8 251*9880d681SAndroid Build Coastguard Worker ret i8 %0 252*9880d681SAndroid Build Coastguard Worker} 253*9880d681SAndroid Build Coastguard Worker 254*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @test_vaddvq_s8_used_by_laneop(<16 x i8> %a1, <16 x i8> %a2) { 255*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddvq_s8_used_by_laneop: 256*9880d681SAndroid Build Coastguard Worker; CHECK: addv.16b b[[REGNUM:[0-9]+]], v1 257*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.b v0[3], v[[REGNUM]][0] 258*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 259*9880d681SAndroid Build Coastguard Workerentry: 260*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 @llvm.aarch64.neon.saddv.i32.v16i8(<16 x i8> %a2) 261*9880d681SAndroid Build Coastguard Worker %1 = trunc i32 %0 to i8 262*9880d681SAndroid Build Coastguard Worker %2 = insertelement <16 x i8> %a1, i8 %1, i32 3 263*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %2 264*9880d681SAndroid Build Coastguard Worker} 265*9880d681SAndroid Build Coastguard Worker 266*9880d681SAndroid Build Coastguard Workerdefine signext i16 @test_vaddvq_s16(<8 x i16> %a1) { 267*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddvq_s16: 268*9880d681SAndroid Build Coastguard Worker; CHECK: addv.8h h[[REGNUM:[0-9]+]], v0 269*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: smov.h w0, v[[REGNUM]][0] 270*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 271*9880d681SAndroid Build Coastguard Workerentry: 272*9880d681SAndroid Build Coastguard Worker %vaddv.i = tail call i32 @llvm.aarch64.neon.saddv.i32.v8i16(<8 x i16> %a1) 273*9880d681SAndroid Build Coastguard Worker %0 = trunc i32 %vaddv.i to i16 274*9880d681SAndroid Build Coastguard Worker ret i16 %0 275*9880d681SAndroid Build Coastguard Worker} 276*9880d681SAndroid Build Coastguard Worker 277*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vaddvq_s16_used_by_laneop(<8 x i16> %a1, <8 x i16> %a2) { 278*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddvq_s16_used_by_laneop: 279*9880d681SAndroid Build Coastguard Worker; CHECK: addv.8h h[[REGNUM:[0-9]+]], v1 280*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.h v0[3], v[[REGNUM]][0] 281*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 282*9880d681SAndroid Build Coastguard Workerentry: 283*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 @llvm.aarch64.neon.saddv.i32.v8i16(<8 x i16> %a2) 284*9880d681SAndroid Build Coastguard Worker %1 = trunc i32 %0 to i16 285*9880d681SAndroid Build Coastguard Worker %2 = insertelement <8 x i16> %a1, i16 %1, i32 3 286*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %2 287*9880d681SAndroid Build Coastguard Worker} 288*9880d681SAndroid Build Coastguard Worker 289*9880d681SAndroid Build Coastguard Workerdefine i32 @test_vaddvq_s32(<4 x i32> %a1) { 290*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddvq_s32: 291*9880d681SAndroid Build Coastguard Worker; CHECK: addv.4s [[REGNUM:s[0-9]+]], v0 292*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov w0, [[REGNUM]] 293*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 294*9880d681SAndroid Build Coastguard Workerentry: 295*9880d681SAndroid Build Coastguard Worker %vaddv.i = tail call i32 @llvm.aarch64.neon.saddv.i32.v4i32(<4 x i32> %a1) 296*9880d681SAndroid Build Coastguard Worker ret i32 %vaddv.i 297*9880d681SAndroid Build Coastguard Worker} 298*9880d681SAndroid Build Coastguard Worker 299*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vaddvq_s32_used_by_laneop(<4 x i32> %a1, <4 x i32> %a2) { 300*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddvq_s32_used_by_laneop: 301*9880d681SAndroid Build Coastguard Worker; CHECK: addv.4s s[[REGNUM:[0-9]+]], v1 302*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.s v0[3], v[[REGNUM]][0] 303*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 304*9880d681SAndroid Build Coastguard Workerentry: 305*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 @llvm.aarch64.neon.saddv.i32.v4i32(<4 x i32> %a2) 306*9880d681SAndroid Build Coastguard Worker %1 = insertelement <4 x i32> %a1, i32 %0, i32 3 307*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %1 308*9880d681SAndroid Build Coastguard Worker} 309*9880d681SAndroid Build Coastguard Worker 310*9880d681SAndroid Build Coastguard Workerdefine zeroext i8 @test_vaddvq_u8(<16 x i8> %a1) { 311*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddvq_u8: 312*9880d681SAndroid Build Coastguard Worker; CHECK: addv.16b b[[REGNUM:[0-9]+]], v0 313*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov w0, s[[REGNUM]] 314*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 315*9880d681SAndroid Build Coastguard Workerentry: 316*9880d681SAndroid Build Coastguard Worker %vaddv.i = tail call i32 @llvm.aarch64.neon.uaddv.i32.v16i8(<16 x i8> %a1) 317*9880d681SAndroid Build Coastguard Worker %0 = trunc i32 %vaddv.i to i8 318*9880d681SAndroid Build Coastguard Worker ret i8 %0 319*9880d681SAndroid Build Coastguard Worker} 320*9880d681SAndroid Build Coastguard Worker 321*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @test_vaddvq_u8_used_by_laneop(<16 x i8> %a1, <16 x i8> %a2) { 322*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddvq_u8_used_by_laneop: 323*9880d681SAndroid Build Coastguard Worker; CHECK: addv.16b b[[REGNUM:[0-9]+]], v1 324*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.b v0[3], v[[REGNUM]][0] 325*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 326*9880d681SAndroid Build Coastguard Workerentry: 327*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 @llvm.aarch64.neon.uaddv.i32.v16i8(<16 x i8> %a2) 328*9880d681SAndroid Build Coastguard Worker %1 = trunc i32 %0 to i8 329*9880d681SAndroid Build Coastguard Worker %2 = insertelement <16 x i8> %a1, i8 %1, i32 3 330*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %2 331*9880d681SAndroid Build Coastguard Worker} 332*9880d681SAndroid Build Coastguard Worker 333*9880d681SAndroid Build Coastguard Workerdefine zeroext i16 @test_vaddvq_u16(<8 x i16> %a1) { 334*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddvq_u16: 335*9880d681SAndroid Build Coastguard Worker; CHECK: addv.8h h[[REGNUM:[0-9]+]], v0 336*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov w0, s[[REGNUM]] 337*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 338*9880d681SAndroid Build Coastguard Workerentry: 339*9880d681SAndroid Build Coastguard Worker %vaddv.i = tail call i32 @llvm.aarch64.neon.uaddv.i32.v8i16(<8 x i16> %a1) 340*9880d681SAndroid Build Coastguard Worker %0 = trunc i32 %vaddv.i to i16 341*9880d681SAndroid Build Coastguard Worker ret i16 %0 342*9880d681SAndroid Build Coastguard Worker} 343*9880d681SAndroid Build Coastguard Worker 344*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vaddvq_u16_used_by_laneop(<8 x i16> %a1, <8 x i16> %a2) { 345*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddvq_u16_used_by_laneop: 346*9880d681SAndroid Build Coastguard Worker; CHECK: addv.8h h[[REGNUM:[0-9]+]], v1 347*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.h v0[3], v[[REGNUM]][0] 348*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 349*9880d681SAndroid Build Coastguard Workerentry: 350*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 @llvm.aarch64.neon.uaddv.i32.v8i16(<8 x i16> %a2) 351*9880d681SAndroid Build Coastguard Worker %1 = trunc i32 %0 to i16 352*9880d681SAndroid Build Coastguard Worker %2 = insertelement <8 x i16> %a1, i16 %1, i32 3 353*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %2 354*9880d681SAndroid Build Coastguard Worker} 355*9880d681SAndroid Build Coastguard Worker 356*9880d681SAndroid Build Coastguard Workerdefine i32 @test_vaddvq_u32(<4 x i32> %a1) { 357*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddvq_u32: 358*9880d681SAndroid Build Coastguard Worker; CHECK: addv.4s [[REGNUM:s[0-9]+]], v0 359*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov [[FMOVRES:w[0-9]+]], [[REGNUM]] 360*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 361*9880d681SAndroid Build Coastguard Workerentry: 362*9880d681SAndroid Build Coastguard Worker %vaddv.i = tail call i32 @llvm.aarch64.neon.uaddv.i32.v4i32(<4 x i32> %a1) 363*9880d681SAndroid Build Coastguard Worker ret i32 %vaddv.i 364*9880d681SAndroid Build Coastguard Worker} 365*9880d681SAndroid Build Coastguard Worker 366*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vaddvq_u32_used_by_laneop(<4 x i32> %a1, <4 x i32> %a2) { 367*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddvq_u32_used_by_laneop: 368*9880d681SAndroid Build Coastguard Worker; CHECK: addv.4s s[[REGNUM:[0-9]+]], v1 369*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.s v0[3], v[[REGNUM]][0] 370*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 371*9880d681SAndroid Build Coastguard Workerentry: 372*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 @llvm.aarch64.neon.uaddv.i32.v4i32(<4 x i32> %a2) 373*9880d681SAndroid Build Coastguard Worker %1 = insertelement <4 x i32> %a1, i32 %0, i32 3 374*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %1 375*9880d681SAndroid Build Coastguard Worker} 376*9880d681SAndroid Build Coastguard Worker 377*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.uaddv.i32.v4i32(<4 x i32>) 378*9880d681SAndroid Build Coastguard Worker 379*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.uaddv.i32.v8i16(<8 x i16>) 380*9880d681SAndroid Build Coastguard Worker 381*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.uaddv.i32.v16i8(<16 x i8>) 382*9880d681SAndroid Build Coastguard Worker 383*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.saddv.i32.v4i32(<4 x i32>) 384*9880d681SAndroid Build Coastguard Worker 385*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.saddv.i32.v8i16(<8 x i16>) 386*9880d681SAndroid Build Coastguard Worker 387*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.saddv.i32.v16i8(<16 x i8>) 388*9880d681SAndroid Build Coastguard Worker 389*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.aarch64.neon.uaddv.i64.v2i64(<2 x i64>) 390*9880d681SAndroid Build Coastguard Worker 391*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.uaddv.i32.v2i32(<2 x i32>) 392*9880d681SAndroid Build Coastguard Worker 393*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.uaddv.i32.v4i16(<4 x i16>) 394*9880d681SAndroid Build Coastguard Worker 395*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.uaddv.i32.v8i8(<8 x i8>) 396*9880d681SAndroid Build Coastguard Worker 397*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.saddv.i32.v2i32(<2 x i32>) 398*9880d681SAndroid Build Coastguard Worker 399*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.aarch64.neon.saddv.i64.v2i64(<2 x i64>) 400*9880d681SAndroid Build Coastguard Worker 401*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.saddv.i32.v4i16(<4 x i16>) 402*9880d681SAndroid Build Coastguard Worker 403*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.saddv.i32.v8i8(<8 x i8>) 404*9880d681SAndroid Build Coastguard Worker 405*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.aarch64.neon.faddv.f32.v2f32(<2 x float> %a1) 406*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.aarch64.neon.faddv.f32.v4f32(<4 x float> %a1) 407*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.aarch64.neon.faddv.f64.v2f64(<2 x double> %a1) 408