1*67e74705SXin Li // RUN: %clang_cc1 -triple arm64-none-linux-gnu -target-feature +neon \ 2*67e74705SXin Li // RUN: -emit-llvm -o - %s | opt -S -mem2reg | FileCheck %s 3*67e74705SXin Li 4*67e74705SXin Li // Test new aarch64 intrinsics and types 5*67e74705SXin Li 6*67e74705SXin Li #include <arm_neon.h> 7*67e74705SXin Li 8*67e74705SXin Li // CHECK-LABEL: define i16 @test_vaddlv_s8(<8 x i8> %a) #0 { 9*67e74705SXin Li // CHECK: [[VADDLV_I:%.*]] = call i32 @llvm.aarch64.neon.saddlv.i32.v8i8(<8 x i8> %a) #2 10*67e74705SXin Li // CHECK: [[TMP0:%.*]] = trunc i32 [[VADDLV_I]] to i16 11*67e74705SXin Li // CHECK: ret i16 [[TMP0]] test_vaddlv_s8(int8x8_t a)12*67e74705SXin Liint16_t test_vaddlv_s8(int8x8_t a) { 13*67e74705SXin Li return vaddlv_s8(a); 14*67e74705SXin Li } 15*67e74705SXin Li 16*67e74705SXin Li // CHECK-LABEL: define i32 @test_vaddlv_s16(<4 x i16> %a) #0 { 17*67e74705SXin Li // CHECK: [[TMP0:%.*]] = bitcast <4 x i16> %a to <8 x i8> 18*67e74705SXin Li // CHECK: [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x i16> 19*67e74705SXin Li // CHECK: [[VADDLV_I:%.*]] = call i32 @llvm.aarch64.neon.saddlv.i32.v4i16(<4 x i16> [[TMP1]]) #2 20*67e74705SXin Li // CHECK: ret i32 [[VADDLV_I]] test_vaddlv_s16(int16x4_t a)21*67e74705SXin Liint32_t test_vaddlv_s16(int16x4_t a) { 22*67e74705SXin Li return vaddlv_s16(a); 23*67e74705SXin Li } 24*67e74705SXin Li 25*67e74705SXin Li // CHECK-LABEL: define i16 @test_vaddlv_u8(<8 x i8> %a) #0 { 26*67e74705SXin Li // CHECK: [[VADDLV_I:%.*]] = call i32 @llvm.aarch64.neon.uaddlv.i32.v8i8(<8 x i8> %a) #2 27*67e74705SXin Li // CHECK: [[TMP0:%.*]] = trunc i32 [[VADDLV_I]] to i16 28*67e74705SXin Li // CHECK: ret i16 [[TMP0]] test_vaddlv_u8(uint8x8_t a)29*67e74705SXin Liuint16_t test_vaddlv_u8(uint8x8_t a) { 30*67e74705SXin Li return vaddlv_u8(a); 31*67e74705SXin Li } 32*67e74705SXin Li 33*67e74705SXin Li // CHECK-LABEL: define i32 @test_vaddlv_u16(<4 x i16> %a) #0 { 34*67e74705SXin Li // CHECK: [[TMP0:%.*]] = bitcast <4 x i16> %a to <8 x i8> 35*67e74705SXin Li // CHECK: [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x i16> 36*67e74705SXin Li // CHECK: [[VADDLV_I:%.*]] = call i32 @llvm.aarch64.neon.uaddlv.i32.v4i16(<4 x i16> [[TMP1]]) #2 37*67e74705SXin Li // CHECK: ret i32 [[VADDLV_I]] test_vaddlv_u16(uint16x4_t a)38*67e74705SXin Liuint32_t test_vaddlv_u16(uint16x4_t a) { 39*67e74705SXin Li return vaddlv_u16(a); 40*67e74705SXin Li } 41*67e74705SXin Li 42*67e74705SXin Li // CHECK-LABEL: define i16 @test_vaddlvq_s8(<16 x i8> %a) #0 { 43*67e74705SXin Li // CHECK: [[VADDLV_I:%.*]] = call i32 @llvm.aarch64.neon.saddlv.i32.v16i8(<16 x i8> %a) #2 44*67e74705SXin Li // CHECK: [[TMP0:%.*]] = trunc i32 [[VADDLV_I]] to i16 45*67e74705SXin Li // CHECK: ret i16 [[TMP0]] test_vaddlvq_s8(int8x16_t a)46*67e74705SXin Liint16_t test_vaddlvq_s8(int8x16_t a) { 47*67e74705SXin Li return vaddlvq_s8(a); 48*67e74705SXin Li } 49*67e74705SXin Li 50*67e74705SXin Li // CHECK-LABEL: define i32 @test_vaddlvq_s16(<8 x i16> %a) #0 { 51*67e74705SXin Li // CHECK: [[TMP0:%.*]] = bitcast <8 x i16> %a to <16 x i8> 52*67e74705SXin Li // CHECK: [[TMP1:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x i16> 53*67e74705SXin Li // CHECK: [[VADDLV_I:%.*]] = call i32 @llvm.aarch64.neon.saddlv.i32.v8i16(<8 x i16> [[TMP1]]) #2 54*67e74705SXin Li // CHECK: ret i32 [[VADDLV_I]] test_vaddlvq_s16(int16x8_t a)55*67e74705SXin Liint32_t test_vaddlvq_s16(int16x8_t a) { 56*67e74705SXin Li return vaddlvq_s16(a); 57*67e74705SXin Li } 58*67e74705SXin Li 59*67e74705SXin Li // CHECK-LABEL: define i64 @test_vaddlvq_s32(<4 x i32> %a) #0 { 60*67e74705SXin Li // CHECK: [[TMP0:%.*]] = bitcast <4 x i32> %a to <16 x i8> 61*67e74705SXin Li // CHECK: [[TMP1:%.*]] = bitcast <16 x i8> [[TMP0]] to <4 x i32> 62*67e74705SXin Li // CHECK: [[VADDLVQ_S32_I:%.*]] = call i64 @llvm.aarch64.neon.saddlv.i64.v4i32(<4 x i32> [[TMP1]]) #2 63*67e74705SXin Li // CHECK: ret i64 [[VADDLVQ_S32_I]] test_vaddlvq_s32(int32x4_t a)64*67e74705SXin Liint64_t test_vaddlvq_s32(int32x4_t a) { 65*67e74705SXin Li return vaddlvq_s32(a); 66*67e74705SXin Li } 67*67e74705SXin Li 68*67e74705SXin Li // CHECK-LABEL: define i16 @test_vaddlvq_u8(<16 x i8> %a) #0 { 69*67e74705SXin Li // CHECK: [[VADDLV_I:%.*]] = call i32 @llvm.aarch64.neon.uaddlv.i32.v16i8(<16 x i8> %a) #2 70*67e74705SXin Li // CHECK: [[TMP0:%.*]] = trunc i32 [[VADDLV_I]] to i16 71*67e74705SXin Li // CHECK: ret i16 [[TMP0]] test_vaddlvq_u8(uint8x16_t a)72*67e74705SXin Liuint16_t test_vaddlvq_u8(uint8x16_t a) { 73*67e74705SXin Li return vaddlvq_u8(a); 74*67e74705SXin Li } 75*67e74705SXin Li 76*67e74705SXin Li // CHECK-LABEL: define i32 @test_vaddlvq_u16(<8 x i16> %a) #0 { 77*67e74705SXin Li // CHECK: [[TMP0:%.*]] = bitcast <8 x i16> %a to <16 x i8> 78*67e74705SXin Li // CHECK: [[TMP1:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x i16> 79*67e74705SXin Li // CHECK: [[VADDLV_I:%.*]] = call i32 @llvm.aarch64.neon.uaddlv.i32.v8i16(<8 x i16> [[TMP1]]) #2 80*67e74705SXin Li // CHECK: ret i32 [[VADDLV_I]] test_vaddlvq_u16(uint16x8_t a)81*67e74705SXin Liuint32_t test_vaddlvq_u16(uint16x8_t a) { 82*67e74705SXin Li return vaddlvq_u16(a); 83*67e74705SXin Li } 84*67e74705SXin Li 85*67e74705SXin Li // CHECK-LABEL: define i64 @test_vaddlvq_u32(<4 x i32> %a) #0 { 86*67e74705SXin Li // CHECK: [[TMP0:%.*]] = bitcast <4 x i32> %a to <16 x i8> 87*67e74705SXin Li // CHECK: [[TMP1:%.*]] = bitcast <16 x i8> [[TMP0]] to <4 x i32> 88*67e74705SXin Li // CHECK: [[VADDLVQ_U32_I:%.*]] = call i64 @llvm.aarch64.neon.uaddlv.i64.v4i32(<4 x i32> [[TMP1]]) #2 89*67e74705SXin Li // CHECK: ret i64 [[VADDLVQ_U32_I]] test_vaddlvq_u32(uint32x4_t a)90*67e74705SXin Liuint64_t test_vaddlvq_u32(uint32x4_t a) { 91*67e74705SXin Li return vaddlvq_u32(a); 92*67e74705SXin Li } 93*67e74705SXin Li 94*67e74705SXin Li // CHECK-LABEL: define i8 @test_vmaxv_s8(<8 x i8> %a) #0 { 95*67e74705SXin Li // CHECK: [[VMAXV_I:%.*]] = call i32 @llvm.aarch64.neon.smaxv.i32.v8i8(<8 x i8> %a) #2 96*67e74705SXin Li // CHECK: [[TMP0:%.*]] = trunc i32 [[VMAXV_I]] to i8 97*67e74705SXin Li // CHECK: ret i8 [[TMP0]] test_vmaxv_s8(int8x8_t a)98*67e74705SXin Liint8_t test_vmaxv_s8(int8x8_t a) { 99*67e74705SXin Li return vmaxv_s8(a); 100*67e74705SXin Li } 101*67e74705SXin Li 102*67e74705SXin Li // CHECK-LABEL: define i16 @test_vmaxv_s16(<4 x i16> %a) #0 { 103*67e74705SXin Li // CHECK: [[TMP0:%.*]] = bitcast <4 x i16> %a to <8 x i8> 104*67e74705SXin Li // CHECK: [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x i16> 105*67e74705SXin Li // CHECK: [[VMAXV_I:%.*]] = call i32 @llvm.aarch64.neon.smaxv.i32.v4i16(<4 x i16> [[TMP1]]) #2 106*67e74705SXin Li // CHECK: [[TMP2:%.*]] = trunc i32 [[VMAXV_I]] to i16 107*67e74705SXin Li // CHECK: ret i16 [[TMP2]] test_vmaxv_s16(int16x4_t a)108*67e74705SXin Liint16_t test_vmaxv_s16(int16x4_t a) { 109*67e74705SXin Li return vmaxv_s16(a); 110*67e74705SXin Li } 111*67e74705SXin Li 112*67e74705SXin Li // CHECK-LABEL: define i8 @test_vmaxv_u8(<8 x i8> %a) #0 { 113*67e74705SXin Li // CHECK: [[VMAXV_I:%.*]] = call i32 @llvm.aarch64.neon.umaxv.i32.v8i8(<8 x i8> %a) #2 114*67e74705SXin Li // CHECK: [[TMP0:%.*]] = trunc i32 [[VMAXV_I]] to i8 115*67e74705SXin Li // CHECK: ret i8 [[TMP0]] test_vmaxv_u8(uint8x8_t a)116*67e74705SXin Liuint8_t test_vmaxv_u8(uint8x8_t a) { 117*67e74705SXin Li return vmaxv_u8(a); 118*67e74705SXin Li } 119*67e74705SXin Li 120*67e74705SXin Li // CHECK-LABEL: define i16 @test_vmaxv_u16(<4 x i16> %a) #0 { 121*67e74705SXin Li // CHECK: [[TMP0:%.*]] = bitcast <4 x i16> %a to <8 x i8> 122*67e74705SXin Li // CHECK: [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x i16> 123*67e74705SXin Li // CHECK: [[VMAXV_I:%.*]] = call i32 @llvm.aarch64.neon.umaxv.i32.v4i16(<4 x i16> [[TMP1]]) #2 124*67e74705SXin Li // CHECK: [[TMP2:%.*]] = trunc i32 [[VMAXV_I]] to i16 125*67e74705SXin Li // CHECK: ret i16 [[TMP2]] test_vmaxv_u16(uint16x4_t a)126*67e74705SXin Liuint16_t test_vmaxv_u16(uint16x4_t a) { 127*67e74705SXin Li return vmaxv_u16(a); 128*67e74705SXin Li } 129*67e74705SXin Li 130*67e74705SXin Li // CHECK-LABEL: define i8 @test_vmaxvq_s8(<16 x i8> %a) #0 { 131*67e74705SXin Li // CHECK: [[VMAXV_I:%.*]] = call i32 @llvm.aarch64.neon.smaxv.i32.v16i8(<16 x i8> %a) #2 132*67e74705SXin Li // CHECK: [[TMP0:%.*]] = trunc i32 [[VMAXV_I]] to i8 133*67e74705SXin Li // CHECK: ret i8 [[TMP0]] test_vmaxvq_s8(int8x16_t a)134*67e74705SXin Liint8_t test_vmaxvq_s8(int8x16_t a) { 135*67e74705SXin Li return vmaxvq_s8(a); 136*67e74705SXin Li } 137*67e74705SXin Li 138*67e74705SXin Li // CHECK-LABEL: define i16 @test_vmaxvq_s16(<8 x i16> %a) #0 { 139*67e74705SXin Li // CHECK: [[TMP0:%.*]] = bitcast <8 x i16> %a to <16 x i8> 140*67e74705SXin Li // CHECK: [[TMP1:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x i16> 141*67e74705SXin Li // CHECK: [[VMAXV_I:%.*]] = call i32 @llvm.aarch64.neon.smaxv.i32.v8i16(<8 x i16> [[TMP1]]) #2 142*67e74705SXin Li // CHECK: [[TMP2:%.*]] = trunc i32 [[VMAXV_I]] to i16 143*67e74705SXin Li // CHECK: ret i16 [[TMP2]] test_vmaxvq_s16(int16x8_t a)144*67e74705SXin Liint16_t test_vmaxvq_s16(int16x8_t a) { 145*67e74705SXin Li return vmaxvq_s16(a); 146*67e74705SXin Li } 147*67e74705SXin Li 148*67e74705SXin Li // CHECK-LABEL: define i32 @test_vmaxvq_s32(<4 x i32> %a) #0 { 149*67e74705SXin Li // CHECK: [[TMP0:%.*]] = bitcast <4 x i32> %a to <16 x i8> 150*67e74705SXin Li // CHECK: [[TMP1:%.*]] = bitcast <16 x i8> [[TMP0]] to <4 x i32> 151*67e74705SXin Li // CHECK: [[VMAXVQ_S32_I:%.*]] = call i32 @llvm.aarch64.neon.smaxv.i32.v4i32(<4 x i32> [[TMP1]]) #2 152*67e74705SXin Li // CHECK: ret i32 [[VMAXVQ_S32_I]] test_vmaxvq_s32(int32x4_t a)153*67e74705SXin Liint32_t test_vmaxvq_s32(int32x4_t a) { 154*67e74705SXin Li return vmaxvq_s32(a); 155*67e74705SXin Li } 156*67e74705SXin Li 157*67e74705SXin Li // CHECK-LABEL: define i8 @test_vmaxvq_u8(<16 x i8> %a) #0 { 158*67e74705SXin Li // CHECK: [[VMAXV_I:%.*]] = call i32 @llvm.aarch64.neon.umaxv.i32.v16i8(<16 x i8> %a) #2 159*67e74705SXin Li // CHECK: [[TMP0:%.*]] = trunc i32 [[VMAXV_I]] to i8 160*67e74705SXin Li // CHECK: ret i8 [[TMP0]] test_vmaxvq_u8(uint8x16_t a)161*67e74705SXin Liuint8_t test_vmaxvq_u8(uint8x16_t a) { 162*67e74705SXin Li return vmaxvq_u8(a); 163*67e74705SXin Li } 164*67e74705SXin Li 165*67e74705SXin Li // CHECK-LABEL: define i16 @test_vmaxvq_u16(<8 x i16> %a) #0 { 166*67e74705SXin Li // CHECK: [[TMP0:%.*]] = bitcast <8 x i16> %a to <16 x i8> 167*67e74705SXin Li // CHECK: [[TMP1:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x i16> 168*67e74705SXin Li // CHECK: [[VMAXV_I:%.*]] = call i32 @llvm.aarch64.neon.umaxv.i32.v8i16(<8 x i16> [[TMP1]]) #2 169*67e74705SXin Li // CHECK: [[TMP2:%.*]] = trunc i32 [[VMAXV_I]] to i16 170*67e74705SXin Li // CHECK: ret i16 [[TMP2]] test_vmaxvq_u16(uint16x8_t a)171*67e74705SXin Liuint16_t test_vmaxvq_u16(uint16x8_t a) { 172*67e74705SXin Li return vmaxvq_u16(a); 173*67e74705SXin Li } 174*67e74705SXin Li 175*67e74705SXin Li // CHECK-LABEL: define i32 @test_vmaxvq_u32(<4 x i32> %a) #0 { 176*67e74705SXin Li // CHECK: [[TMP0:%.*]] = bitcast <4 x i32> %a to <16 x i8> 177*67e74705SXin Li // CHECK: [[TMP1:%.*]] = bitcast <16 x i8> [[TMP0]] to <4 x i32> 178*67e74705SXin Li // CHECK: [[VMAXVQ_U32_I:%.*]] = call i32 @llvm.aarch64.neon.umaxv.i32.v4i32(<4 x i32> [[TMP1]]) #2 179*67e74705SXin Li // CHECK: ret i32 [[VMAXVQ_U32_I]] test_vmaxvq_u32(uint32x4_t a)180*67e74705SXin Liuint32_t test_vmaxvq_u32(uint32x4_t a) { 181*67e74705SXin Li return vmaxvq_u32(a); 182*67e74705SXin Li } 183*67e74705SXin Li 184*67e74705SXin Li // CHECK-LABEL: define i8 @test_vminv_s8(<8 x i8> %a) #0 { 185*67e74705SXin Li // CHECK: [[VMINV_I:%.*]] = call i32 @llvm.aarch64.neon.sminv.i32.v8i8(<8 x i8> %a) #2 186*67e74705SXin Li // CHECK: [[TMP0:%.*]] = trunc i32 [[VMINV_I]] to i8 187*67e74705SXin Li // CHECK: ret i8 [[TMP0]] test_vminv_s8(int8x8_t a)188*67e74705SXin Liint8_t test_vminv_s8(int8x8_t a) { 189*67e74705SXin Li return vminv_s8(a); 190*67e74705SXin Li } 191*67e74705SXin Li 192*67e74705SXin Li // CHECK-LABEL: define i16 @test_vminv_s16(<4 x i16> %a) #0 { 193*67e74705SXin Li // CHECK: [[TMP0:%.*]] = bitcast <4 x i16> %a to <8 x i8> 194*67e74705SXin Li // CHECK: [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x i16> 195*67e74705SXin Li // CHECK: [[VMINV_I:%.*]] = call i32 @llvm.aarch64.neon.sminv.i32.v4i16(<4 x i16> [[TMP1]]) #2 196*67e74705SXin Li // CHECK: [[TMP2:%.*]] = trunc i32 [[VMINV_I]] to i16 197*67e74705SXin Li // CHECK: ret i16 [[TMP2]] test_vminv_s16(int16x4_t a)198*67e74705SXin Liint16_t test_vminv_s16(int16x4_t a) { 199*67e74705SXin Li return vminv_s16(a); 200*67e74705SXin Li } 201*67e74705SXin Li 202*67e74705SXin Li // CHECK-LABEL: define i8 @test_vminv_u8(<8 x i8> %a) #0 { 203*67e74705SXin Li // CHECK: [[VMINV_I:%.*]] = call i32 @llvm.aarch64.neon.uminv.i32.v8i8(<8 x i8> %a) #2 204*67e74705SXin Li // CHECK: [[TMP0:%.*]] = trunc i32 [[VMINV_I]] to i8 205*67e74705SXin Li // CHECK: ret i8 [[TMP0]] test_vminv_u8(uint8x8_t a)206*67e74705SXin Liuint8_t test_vminv_u8(uint8x8_t a) { 207*67e74705SXin Li return vminv_u8(a); 208*67e74705SXin Li } 209*67e74705SXin Li 210*67e74705SXin Li // CHECK-LABEL: define i16 @test_vminv_u16(<4 x i16> %a) #0 { 211*67e74705SXin Li // CHECK: [[TMP0:%.*]] = bitcast <4 x i16> %a to <8 x i8> 212*67e74705SXin Li // CHECK: [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x i16> 213*67e74705SXin Li // CHECK: [[VMINV_I:%.*]] = call i32 @llvm.aarch64.neon.uminv.i32.v4i16(<4 x i16> [[TMP1]]) #2 214*67e74705SXin Li // CHECK: [[TMP2:%.*]] = trunc i32 [[VMINV_I]] to i16 215*67e74705SXin Li // CHECK: ret i16 [[TMP2]] test_vminv_u16(uint16x4_t a)216*67e74705SXin Liuint16_t test_vminv_u16(uint16x4_t a) { 217*67e74705SXin Li return vminv_u16(a); 218*67e74705SXin Li } 219*67e74705SXin Li 220*67e74705SXin Li // CHECK-LABEL: define i8 @test_vminvq_s8(<16 x i8> %a) #0 { 221*67e74705SXin Li // CHECK: [[VMINV_I:%.*]] = call i32 @llvm.aarch64.neon.sminv.i32.v16i8(<16 x i8> %a) #2 222*67e74705SXin Li // CHECK: [[TMP0:%.*]] = trunc i32 [[VMINV_I]] to i8 223*67e74705SXin Li // CHECK: ret i8 [[TMP0]] test_vminvq_s8(int8x16_t a)224*67e74705SXin Liint8_t test_vminvq_s8(int8x16_t a) { 225*67e74705SXin Li return vminvq_s8(a); 226*67e74705SXin Li } 227*67e74705SXin Li 228*67e74705SXin Li // CHECK-LABEL: define i16 @test_vminvq_s16(<8 x i16> %a) #0 { 229*67e74705SXin Li // CHECK: [[TMP0:%.*]] = bitcast <8 x i16> %a to <16 x i8> 230*67e74705SXin Li // CHECK: [[TMP1:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x i16> 231*67e74705SXin Li // CHECK: [[VMINV_I:%.*]] = call i32 @llvm.aarch64.neon.sminv.i32.v8i16(<8 x i16> [[TMP1]]) #2 232*67e74705SXin Li // CHECK: [[TMP2:%.*]] = trunc i32 [[VMINV_I]] to i16 233*67e74705SXin Li // CHECK: ret i16 [[TMP2]] test_vminvq_s16(int16x8_t a)234*67e74705SXin Liint16_t test_vminvq_s16(int16x8_t a) { 235*67e74705SXin Li return vminvq_s16(a); 236*67e74705SXin Li } 237*67e74705SXin Li 238*67e74705SXin Li // CHECK-LABEL: define i32 @test_vminvq_s32(<4 x i32> %a) #0 { 239*67e74705SXin Li // CHECK: [[TMP0:%.*]] = bitcast <4 x i32> %a to <16 x i8> 240*67e74705SXin Li // CHECK: [[TMP1:%.*]] = bitcast <16 x i8> [[TMP0]] to <4 x i32> 241*67e74705SXin Li // CHECK: [[VMINVQ_S32_I:%.*]] = call i32 @llvm.aarch64.neon.sminv.i32.v4i32(<4 x i32> [[TMP1]]) #2 242*67e74705SXin Li // CHECK: ret i32 [[VMINVQ_S32_I]] test_vminvq_s32(int32x4_t a)243*67e74705SXin Liint32_t test_vminvq_s32(int32x4_t a) { 244*67e74705SXin Li return vminvq_s32(a); 245*67e74705SXin Li } 246*67e74705SXin Li 247*67e74705SXin Li // CHECK-LABEL: define i8 @test_vminvq_u8(<16 x i8> %a) #0 { 248*67e74705SXin Li // CHECK: [[VMINV_I:%.*]] = call i32 @llvm.aarch64.neon.uminv.i32.v16i8(<16 x i8> %a) #2 249*67e74705SXin Li // CHECK: [[TMP0:%.*]] = trunc i32 [[VMINV_I]] to i8 250*67e74705SXin Li // CHECK: ret i8 [[TMP0]] test_vminvq_u8(uint8x16_t a)251*67e74705SXin Liuint8_t test_vminvq_u8(uint8x16_t a) { 252*67e74705SXin Li return vminvq_u8(a); 253*67e74705SXin Li } 254*67e74705SXin Li 255*67e74705SXin Li // CHECK-LABEL: define i16 @test_vminvq_u16(<8 x i16> %a) #0 { 256*67e74705SXin Li // CHECK: [[TMP0:%.*]] = bitcast <8 x i16> %a to <16 x i8> 257*67e74705SXin Li // CHECK: [[TMP1:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x i16> 258*67e74705SXin Li // CHECK: [[VMINV_I:%.*]] = call i32 @llvm.aarch64.neon.uminv.i32.v8i16(<8 x i16> [[TMP1]]) #2 259*67e74705SXin Li // CHECK: [[TMP2:%.*]] = trunc i32 [[VMINV_I]] to i16 260*67e74705SXin Li // CHECK: ret i16 [[TMP2]] test_vminvq_u16(uint16x8_t a)261*67e74705SXin Liuint16_t test_vminvq_u16(uint16x8_t a) { 262*67e74705SXin Li return vminvq_u16(a); 263*67e74705SXin Li } 264*67e74705SXin Li 265*67e74705SXin Li // CHECK-LABEL: define i32 @test_vminvq_u32(<4 x i32> %a) #0 { 266*67e74705SXin Li // CHECK: [[TMP0:%.*]] = bitcast <4 x i32> %a to <16 x i8> 267*67e74705SXin Li // CHECK: [[TMP1:%.*]] = bitcast <16 x i8> [[TMP0]] to <4 x i32> 268*67e74705SXin Li // CHECK: [[VMINVQ_U32_I:%.*]] = call i32 @llvm.aarch64.neon.uminv.i32.v4i32(<4 x i32> [[TMP1]]) #2 269*67e74705SXin Li // CHECK: ret i32 [[VMINVQ_U32_I]] test_vminvq_u32(uint32x4_t a)270*67e74705SXin Liuint32_t test_vminvq_u32(uint32x4_t a) { 271*67e74705SXin Li return vminvq_u32(a); 272*67e74705SXin Li } 273*67e74705SXin Li 274*67e74705SXin Li // CHECK-LABEL: define i8 @test_vaddv_s8(<8 x i8> %a) #0 { 275*67e74705SXin Li // CHECK: [[VADDV_I:%.*]] = call i32 @llvm.aarch64.neon.saddv.i32.v8i8(<8 x i8> %a) #2 276*67e74705SXin Li // CHECK: [[TMP0:%.*]] = trunc i32 [[VADDV_I]] to i8 277*67e74705SXin Li // CHECK: ret i8 [[TMP0]] test_vaddv_s8(int8x8_t a)278*67e74705SXin Liint8_t test_vaddv_s8(int8x8_t a) { 279*67e74705SXin Li return vaddv_s8(a); 280*67e74705SXin Li } 281*67e74705SXin Li 282*67e74705SXin Li // CHECK-LABEL: define i16 @test_vaddv_s16(<4 x i16> %a) #0 { 283*67e74705SXin Li // CHECK: [[TMP0:%.*]] = bitcast <4 x i16> %a to <8 x i8> 284*67e74705SXin Li // CHECK: [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x i16> 285*67e74705SXin Li // CHECK: [[VADDV_I:%.*]] = call i32 @llvm.aarch64.neon.saddv.i32.v4i16(<4 x i16> [[TMP1]]) #2 286*67e74705SXin Li // CHECK: [[TMP2:%.*]] = trunc i32 [[VADDV_I]] to i16 287*67e74705SXin Li // CHECK: ret i16 [[TMP2]] test_vaddv_s16(int16x4_t a)288*67e74705SXin Liint16_t test_vaddv_s16(int16x4_t a) { 289*67e74705SXin Li return vaddv_s16(a); 290*67e74705SXin Li } 291*67e74705SXin Li 292*67e74705SXin Li // CHECK-LABEL: define i8 @test_vaddv_u8(<8 x i8> %a) #0 { 293*67e74705SXin Li // CHECK: [[VADDV_I:%.*]] = call i32 @llvm.aarch64.neon.uaddv.i32.v8i8(<8 x i8> %a) #2 294*67e74705SXin Li // CHECK: [[TMP0:%.*]] = trunc i32 [[VADDV_I]] to i8 295*67e74705SXin Li // CHECK: ret i8 [[TMP0]] test_vaddv_u8(uint8x8_t a)296*67e74705SXin Liuint8_t test_vaddv_u8(uint8x8_t a) { 297*67e74705SXin Li return vaddv_u8(a); 298*67e74705SXin Li } 299*67e74705SXin Li 300*67e74705SXin Li // CHECK-LABEL: define i16 @test_vaddv_u16(<4 x i16> %a) #0 { 301*67e74705SXin Li // CHECK: [[TMP0:%.*]] = bitcast <4 x i16> %a to <8 x i8> 302*67e74705SXin Li // CHECK: [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x i16> 303*67e74705SXin Li // CHECK: [[VADDV_I:%.*]] = call i32 @llvm.aarch64.neon.uaddv.i32.v4i16(<4 x i16> [[TMP1]]) #2 304*67e74705SXin Li // CHECK: [[TMP2:%.*]] = trunc i32 [[VADDV_I]] to i16 305*67e74705SXin Li // CHECK: ret i16 [[TMP2]] test_vaddv_u16(uint16x4_t a)306*67e74705SXin Liuint16_t test_vaddv_u16(uint16x4_t a) { 307*67e74705SXin Li return vaddv_u16(a); 308*67e74705SXin Li } 309*67e74705SXin Li 310*67e74705SXin Li // CHECK-LABEL: define i8 @test_vaddvq_s8(<16 x i8> %a) #0 { 311*67e74705SXin Li // CHECK: [[VADDV_I:%.*]] = call i32 @llvm.aarch64.neon.saddv.i32.v16i8(<16 x i8> %a) #2 312*67e74705SXin Li // CHECK: [[TMP0:%.*]] = trunc i32 [[VADDV_I]] to i8 313*67e74705SXin Li // CHECK: ret i8 [[TMP0]] test_vaddvq_s8(int8x16_t a)314*67e74705SXin Liint8_t test_vaddvq_s8(int8x16_t a) { 315*67e74705SXin Li return vaddvq_s8(a); 316*67e74705SXin Li } 317*67e74705SXin Li 318*67e74705SXin Li // CHECK-LABEL: define i16 @test_vaddvq_s16(<8 x i16> %a) #0 { 319*67e74705SXin Li // CHECK: [[TMP0:%.*]] = bitcast <8 x i16> %a to <16 x i8> 320*67e74705SXin Li // CHECK: [[TMP1:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x i16> 321*67e74705SXin Li // CHECK: [[VADDV_I:%.*]] = call i32 @llvm.aarch64.neon.saddv.i32.v8i16(<8 x i16> [[TMP1]]) #2 322*67e74705SXin Li // CHECK: [[TMP2:%.*]] = trunc i32 [[VADDV_I]] to i16 323*67e74705SXin Li // CHECK: ret i16 [[TMP2]] test_vaddvq_s16(int16x8_t a)324*67e74705SXin Liint16_t test_vaddvq_s16(int16x8_t a) { 325*67e74705SXin Li return vaddvq_s16(a); 326*67e74705SXin Li } 327*67e74705SXin Li 328*67e74705SXin Li // CHECK-LABEL: define i32 @test_vaddvq_s32(<4 x i32> %a) #0 { 329*67e74705SXin Li // CHECK: [[TMP0:%.*]] = bitcast <4 x i32> %a to <16 x i8> 330*67e74705SXin Li // CHECK: [[TMP1:%.*]] = bitcast <16 x i8> [[TMP0]] to <4 x i32> 331*67e74705SXin Li // CHECK: [[VADDVQ_S32_I:%.*]] = call i32 @llvm.aarch64.neon.saddv.i32.v4i32(<4 x i32> [[TMP1]]) #2 332*67e74705SXin Li // CHECK: ret i32 [[VADDVQ_S32_I]] test_vaddvq_s32(int32x4_t a)333*67e74705SXin Liint32_t test_vaddvq_s32(int32x4_t a) { 334*67e74705SXin Li return vaddvq_s32(a); 335*67e74705SXin Li } 336*67e74705SXin Li 337*67e74705SXin Li // CHECK-LABEL: define i8 @test_vaddvq_u8(<16 x i8> %a) #0 { 338*67e74705SXin Li // CHECK: [[VADDV_I:%.*]] = call i32 @llvm.aarch64.neon.uaddv.i32.v16i8(<16 x i8> %a) #2 339*67e74705SXin Li // CHECK: [[TMP0:%.*]] = trunc i32 [[VADDV_I]] to i8 340*67e74705SXin Li // CHECK: ret i8 [[TMP0]] test_vaddvq_u8(uint8x16_t a)341*67e74705SXin Liuint8_t test_vaddvq_u8(uint8x16_t a) { 342*67e74705SXin Li return vaddvq_u8(a); 343*67e74705SXin Li } 344*67e74705SXin Li 345*67e74705SXin Li // CHECK-LABEL: define i16 @test_vaddvq_u16(<8 x i16> %a) #0 { 346*67e74705SXin Li // CHECK: [[TMP0:%.*]] = bitcast <8 x i16> %a to <16 x i8> 347*67e74705SXin Li // CHECK: [[TMP1:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x i16> 348*67e74705SXin Li // CHECK: [[VADDV_I:%.*]] = call i32 @llvm.aarch64.neon.uaddv.i32.v8i16(<8 x i16> [[TMP1]]) #2 349*67e74705SXin Li // CHECK: [[TMP2:%.*]] = trunc i32 [[VADDV_I]] to i16 350*67e74705SXin Li // CHECK: ret i16 [[TMP2]] test_vaddvq_u16(uint16x8_t a)351*67e74705SXin Liuint16_t test_vaddvq_u16(uint16x8_t a) { 352*67e74705SXin Li return vaddvq_u16(a); 353*67e74705SXin Li } 354*67e74705SXin Li 355*67e74705SXin Li // CHECK-LABEL: define i32 @test_vaddvq_u32(<4 x i32> %a) #0 { 356*67e74705SXin Li // CHECK: [[TMP0:%.*]] = bitcast <4 x i32> %a to <16 x i8> 357*67e74705SXin Li // CHECK: [[TMP1:%.*]] = bitcast <16 x i8> [[TMP0]] to <4 x i32> 358*67e74705SXin Li // CHECK: [[VADDVQ_U32_I:%.*]] = call i32 @llvm.aarch64.neon.uaddv.i32.v4i32(<4 x i32> [[TMP1]]) #2 359*67e74705SXin Li // CHECK: ret i32 [[VADDVQ_U32_I]] test_vaddvq_u32(uint32x4_t a)360*67e74705SXin Liuint32_t test_vaddvq_u32(uint32x4_t a) { 361*67e74705SXin Li return vaddvq_u32(a); 362*67e74705SXin Li } 363*67e74705SXin Li 364*67e74705SXin Li // CHECK-LABEL: define float @test_vmaxvq_f32(<4 x float> %a) #0 { 365*67e74705SXin Li // CHECK: [[TMP0:%.*]] = bitcast <4 x float> %a to <16 x i8> 366*67e74705SXin Li // CHECK: [[TMP1:%.*]] = bitcast <16 x i8> [[TMP0]] to <4 x float> 367*67e74705SXin Li // CHECK: [[VMAXVQ_F32_I:%.*]] = call float @llvm.aarch64.neon.fmaxv.f32.v4f32(<4 x float> [[TMP1]]) #2 368*67e74705SXin Li // CHECK: ret float [[VMAXVQ_F32_I]] test_vmaxvq_f32(float32x4_t a)369*67e74705SXin Lifloat32_t test_vmaxvq_f32(float32x4_t a) { 370*67e74705SXin Li return vmaxvq_f32(a); 371*67e74705SXin Li } 372*67e74705SXin Li 373*67e74705SXin Li // CHECK-LABEL: define float @test_vminvq_f32(<4 x float> %a) #0 { 374*67e74705SXin Li // CHECK: [[TMP0:%.*]] = bitcast <4 x float> %a to <16 x i8> 375*67e74705SXin Li // CHECK: [[TMP1:%.*]] = bitcast <16 x i8> [[TMP0]] to <4 x float> 376*67e74705SXin Li // CHECK: [[VMINVQ_F32_I:%.*]] = call float @llvm.aarch64.neon.fminv.f32.v4f32(<4 x float> [[TMP1]]) #2 377*67e74705SXin Li // CHECK: ret float [[VMINVQ_F32_I]] test_vminvq_f32(float32x4_t a)378*67e74705SXin Lifloat32_t test_vminvq_f32(float32x4_t a) { 379*67e74705SXin Li return vminvq_f32(a); 380*67e74705SXin Li } 381*67e74705SXin Li 382*67e74705SXin Li // CHECK-LABEL: define float @test_vmaxnmvq_f32(<4 x float> %a) #0 { 383*67e74705SXin Li // CHECK: [[TMP0:%.*]] = bitcast <4 x float> %a to <16 x i8> 384*67e74705SXin Li // CHECK: [[TMP1:%.*]] = bitcast <16 x i8> [[TMP0]] to <4 x float> 385*67e74705SXin Li // CHECK: [[VMAXNMVQ_F32_I:%.*]] = call float @llvm.aarch64.neon.fmaxnmv.f32.v4f32(<4 x float> [[TMP1]]) #2 386*67e74705SXin Li // CHECK: ret float [[VMAXNMVQ_F32_I]] test_vmaxnmvq_f32(float32x4_t a)387*67e74705SXin Lifloat32_t test_vmaxnmvq_f32(float32x4_t a) { 388*67e74705SXin Li return vmaxnmvq_f32(a); 389*67e74705SXin Li } 390*67e74705SXin Li 391*67e74705SXin Li // CHECK-LABEL: define float @test_vminnmvq_f32(<4 x float> %a) #0 { 392*67e74705SXin Li // CHECK: [[TMP0:%.*]] = bitcast <4 x float> %a to <16 x i8> 393*67e74705SXin Li // CHECK: [[TMP1:%.*]] = bitcast <16 x i8> [[TMP0]] to <4 x float> 394*67e74705SXin Li // CHECK: [[VMINNMVQ_F32_I:%.*]] = call float @llvm.aarch64.neon.fminnmv.f32.v4f32(<4 x float> [[TMP1]]) #2 395*67e74705SXin Li // CHECK: ret float [[VMINNMVQ_F32_I]] test_vminnmvq_f32(float32x4_t a)396*67e74705SXin Lifloat32_t test_vminnmvq_f32(float32x4_t a) { 397*67e74705SXin Li return vminnmvq_f32(a); 398*67e74705SXin Li } 399