xref: /aosp_15_r20/external/clang/test/CodeGen/aarch64-neon-across.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
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 Li int16_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 Li int32_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 Li uint16_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 Li uint32_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 Li int16_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 Li int32_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 Li int64_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 Li uint16_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 Li uint32_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 Li uint64_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 Li int8_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 Li int16_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 Li uint8_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 Li uint16_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 Li int8_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 Li int16_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 Li int32_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 Li uint8_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 Li uint16_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 Li uint32_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 Li int8_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 Li int16_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 Li uint8_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 Li uint16_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 Li int8_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 Li int16_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 Li int32_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 Li uint8_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 Li uint16_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 Li uint32_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 Li int8_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 Li int16_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 Li uint8_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 Li uint16_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 Li int8_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 Li int16_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 Li int32_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 Li uint8_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 Li uint16_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 Li uint32_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 Li float32_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 Li float32_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 Li float32_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 Li float32_t test_vminnmvq_f32(float32x4_t a) {
397*67e74705SXin Li   return vminnmvq_f32(a);
398*67e74705SXin Li }
399