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