xref: /llvm-project/clang/test/CodeGen/AArch64/neon-across.c (revision 207e5ccceec8d3cc3f32723e78f2a142bc61b07d)
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