1 // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
2 // RUN: %clang_cc1 -triple thumbv8.1m.main-none-none-eabi -target-feature +mve.fp -mfloat-abi hard -O0 -disable-O0-optnone -emit-llvm -o - %s | opt -S -passes=mem2reg | FileCheck %s
3 // RUN: %clang_cc1 -triple thumbv8.1m.main-none-none-eabi -target-feature +mve.fp -mfloat-abi hard -O0 -disable-O0-optnone -DPOLYMORPHIC -emit-llvm -o - %s | opt -S -passes=mem2reg | FileCheck %s
4
5 // REQUIRES: aarch64-registered-target || arm-registered-target
6
7 #include <arm_mve.h>
8
9 // CHECK-LABEL: @test_vshrnbq_n_s16(
10 // CHECK-NEXT: entry:
11 // CHECK-NEXT: [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vshrn.v16i8.v8i16(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 3, i32 0, i32 0, i32 0, i32 0, i32 0)
12 // CHECK-NEXT: ret <16 x i8> [[TMP0]]
13 //
test_vshrnbq_n_s16(int8x16_t a,int16x8_t b)14 int8x16_t test_vshrnbq_n_s16(int8x16_t a, int16x8_t b)
15 {
16 #ifdef POLYMORPHIC
17 return vshrnbq(a, b, 3);
18 #else /* POLYMORPHIC */
19 return vshrnbq_n_s16(a, b, 3);
20 #endif /* POLYMORPHIC */
21 }
22
23 // CHECK-LABEL: @test_vshrnbq_n_s32(
24 // CHECK-NEXT: entry:
25 // CHECK-NEXT: [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vshrn.v8i16.v4i32(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 9, i32 0, i32 0, i32 0, i32 0, i32 0)
26 // CHECK-NEXT: ret <8 x i16> [[TMP0]]
27 //
test_vshrnbq_n_s32(int16x8_t a,int32x4_t b)28 int16x8_t test_vshrnbq_n_s32(int16x8_t a, int32x4_t b)
29 {
30 #ifdef POLYMORPHIC
31 return vshrnbq(a, b, 9);
32 #else /* POLYMORPHIC */
33 return vshrnbq_n_s32(a, b, 9);
34 #endif /* POLYMORPHIC */
35 }
36
37 // CHECK-LABEL: @test_vshrnbq_n_u16(
38 // CHECK-NEXT: entry:
39 // CHECK-NEXT: [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vshrn.v16i8.v8i16(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 1, i32 0, i32 0, i32 1, i32 1, i32 0)
40 // CHECK-NEXT: ret <16 x i8> [[TMP0]]
41 //
test_vshrnbq_n_u16(uint8x16_t a,uint16x8_t b)42 uint8x16_t test_vshrnbq_n_u16(uint8x16_t a, uint16x8_t b)
43 {
44 #ifdef POLYMORPHIC
45 return vshrnbq(a, b, 1);
46 #else /* POLYMORPHIC */
47 return vshrnbq_n_u16(a, b, 1);
48 #endif /* POLYMORPHIC */
49 }
50
51 // CHECK-LABEL: @test_vshrnbq_n_u32(
52 // CHECK-NEXT: entry:
53 // CHECK-NEXT: [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vshrn.v8i16.v4i32(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 3, i32 0, i32 0, i32 1, i32 1, i32 0)
54 // CHECK-NEXT: ret <8 x i16> [[TMP0]]
55 //
test_vshrnbq_n_u32(uint16x8_t a,uint32x4_t b)56 uint16x8_t test_vshrnbq_n_u32(uint16x8_t a, uint32x4_t b)
57 {
58 #ifdef POLYMORPHIC
59 return vshrnbq(a, b, 3);
60 #else /* POLYMORPHIC */
61 return vshrnbq_n_u32(a, b, 3);
62 #endif /* POLYMORPHIC */
63 }
64
65 // CHECK-LABEL: @test_vshrntq_n_s16(
66 // CHECK-NEXT: entry:
67 // CHECK-NEXT: [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vshrn.v16i8.v8i16(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 1, i32 0, i32 0, i32 0, i32 0, i32 1)
68 // CHECK-NEXT: ret <16 x i8> [[TMP0]]
69 //
test_vshrntq_n_s16(int8x16_t a,int16x8_t b)70 int8x16_t test_vshrntq_n_s16(int8x16_t a, int16x8_t b)
71 {
72 #ifdef POLYMORPHIC
73 return vshrntq(a, b, 1);
74 #else /* POLYMORPHIC */
75 return vshrntq_n_s16(a, b, 1);
76 #endif /* POLYMORPHIC */
77 }
78
79 // CHECK-LABEL: @test_vshrntq_n_s32(
80 // CHECK-NEXT: entry:
81 // CHECK-NEXT: [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vshrn.v8i16.v4i32(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 10, i32 0, i32 0, i32 0, i32 0, i32 1)
82 // CHECK-NEXT: ret <8 x i16> [[TMP0]]
83 //
test_vshrntq_n_s32(int16x8_t a,int32x4_t b)84 int16x8_t test_vshrntq_n_s32(int16x8_t a, int32x4_t b)
85 {
86 #ifdef POLYMORPHIC
87 return vshrntq(a, b, 10);
88 #else /* POLYMORPHIC */
89 return vshrntq_n_s32(a, b, 10);
90 #endif /* POLYMORPHIC */
91 }
92
93 // CHECK-LABEL: @test_vshrntq_n_u16(
94 // CHECK-NEXT: entry:
95 // CHECK-NEXT: [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vshrn.v16i8.v8i16(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 6, i32 0, i32 0, i32 1, i32 1, i32 1)
96 // CHECK-NEXT: ret <16 x i8> [[TMP0]]
97 //
test_vshrntq_n_u16(uint8x16_t a,uint16x8_t b)98 uint8x16_t test_vshrntq_n_u16(uint8x16_t a, uint16x8_t b)
99 {
100 #ifdef POLYMORPHIC
101 return vshrntq(a, b, 6);
102 #else /* POLYMORPHIC */
103 return vshrntq_n_u16(a, b, 6);
104 #endif /* POLYMORPHIC */
105 }
106
107 // CHECK-LABEL: @test_vshrntq_n_u32(
108 // CHECK-NEXT: entry:
109 // CHECK-NEXT: [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vshrn.v8i16.v4i32(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 10, i32 0, i32 0, i32 1, i32 1, i32 1)
110 // CHECK-NEXT: ret <8 x i16> [[TMP0]]
111 //
test_vshrntq_n_u32(uint16x8_t a,uint32x4_t b)112 uint16x8_t test_vshrntq_n_u32(uint16x8_t a, uint32x4_t b)
113 {
114 #ifdef POLYMORPHIC
115 return vshrntq(a, b, 10);
116 #else /* POLYMORPHIC */
117 return vshrntq_n_u32(a, b, 10);
118 #endif /* POLYMORPHIC */
119 }
120
121 // CHECK-LABEL: @test_vshrnbq_m_n_s16(
122 // CHECK-NEXT: entry:
123 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
124 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
125 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vshrn.predicated.v16i8.v8i16.v8i1(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 4, i32 0, i32 0, i32 0, i32 0, i32 0, <8 x i1> [[TMP1]])
126 // CHECK-NEXT: ret <16 x i8> [[TMP2]]
127 //
test_vshrnbq_m_n_s16(int8x16_t a,int16x8_t b,mve_pred16_t p)128 int8x16_t test_vshrnbq_m_n_s16(int8x16_t a, int16x8_t b, mve_pred16_t p)
129 {
130 #ifdef POLYMORPHIC
131 return vshrnbq_m(a, b, 4, p);
132 #else /* POLYMORPHIC */
133 return vshrnbq_m_n_s16(a, b, 4, p);
134 #endif /* POLYMORPHIC */
135 }
136
137 // CHECK-LABEL: @test_vshrnbq_m_n_s32(
138 // CHECK-NEXT: entry:
139 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
140 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
141 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vshrn.predicated.v8i16.v4i32.v4i1(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 13, i32 0, i32 0, i32 0, i32 0, i32 0, <4 x i1> [[TMP1]])
142 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
143 //
test_vshrnbq_m_n_s32(int16x8_t a,int32x4_t b,mve_pred16_t p)144 int16x8_t test_vshrnbq_m_n_s32(int16x8_t a, int32x4_t b, mve_pred16_t p)
145 {
146 #ifdef POLYMORPHIC
147 return vshrnbq_m(a, b, 13, p);
148 #else /* POLYMORPHIC */
149 return vshrnbq_m_n_s32(a, b, 13, p);
150 #endif /* POLYMORPHIC */
151 }
152
153 // CHECK-LABEL: @test_vshrnbq_m_n_u16(
154 // CHECK-NEXT: entry:
155 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
156 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
157 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vshrn.predicated.v16i8.v8i16.v8i1(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 7, i32 0, i32 0, i32 1, i32 1, i32 0, <8 x i1> [[TMP1]])
158 // CHECK-NEXT: ret <16 x i8> [[TMP2]]
159 //
test_vshrnbq_m_n_u16(uint8x16_t a,uint16x8_t b,mve_pred16_t p)160 uint8x16_t test_vshrnbq_m_n_u16(uint8x16_t a, uint16x8_t b, mve_pred16_t p)
161 {
162 #ifdef POLYMORPHIC
163 return vshrnbq_m(a, b, 7, p);
164 #else /* POLYMORPHIC */
165 return vshrnbq_m_n_u16(a, b, 7, p);
166 #endif /* POLYMORPHIC */
167 }
168
169 // CHECK-LABEL: @test_vshrnbq_m_n_u32(
170 // CHECK-NEXT: entry:
171 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
172 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
173 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vshrn.predicated.v8i16.v4i32.v4i1(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 15, i32 0, i32 0, i32 1, i32 1, i32 0, <4 x i1> [[TMP1]])
174 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
175 //
test_vshrnbq_m_n_u32(uint16x8_t a,uint32x4_t b,mve_pred16_t p)176 uint16x8_t test_vshrnbq_m_n_u32(uint16x8_t a, uint32x4_t b, mve_pred16_t p)
177 {
178 #ifdef POLYMORPHIC
179 return vshrnbq_m(a, b, 15, p);
180 #else /* POLYMORPHIC */
181 return vshrnbq_m_n_u32(a, b, 15, p);
182 #endif /* POLYMORPHIC */
183 }
184
185 // CHECK-LABEL: @test_vshrntq_m_n_s16(
186 // CHECK-NEXT: entry:
187 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
188 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
189 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vshrn.predicated.v16i8.v8i16.v8i1(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 6, i32 0, i32 0, i32 0, i32 0, i32 1, <8 x i1> [[TMP1]])
190 // CHECK-NEXT: ret <16 x i8> [[TMP2]]
191 //
test_vshrntq_m_n_s16(int8x16_t a,int16x8_t b,mve_pred16_t p)192 int8x16_t test_vshrntq_m_n_s16(int8x16_t a, int16x8_t b, mve_pred16_t p)
193 {
194 #ifdef POLYMORPHIC
195 return vshrntq_m(a, b, 6, p);
196 #else /* POLYMORPHIC */
197 return vshrntq_m_n_s16(a, b, 6, p);
198 #endif /* POLYMORPHIC */
199 }
200
201 // CHECK-LABEL: @test_vshrntq_m_n_s32(
202 // CHECK-NEXT: entry:
203 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
204 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
205 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vshrn.predicated.v8i16.v4i32.v4i1(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 13, i32 0, i32 0, i32 0, i32 0, i32 1, <4 x i1> [[TMP1]])
206 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
207 //
test_vshrntq_m_n_s32(int16x8_t a,int32x4_t b,mve_pred16_t p)208 int16x8_t test_vshrntq_m_n_s32(int16x8_t a, int32x4_t b, mve_pred16_t p)
209 {
210 #ifdef POLYMORPHIC
211 return vshrntq_m(a, b, 13, p);
212 #else /* POLYMORPHIC */
213 return vshrntq_m_n_s32(a, b, 13, p);
214 #endif /* POLYMORPHIC */
215 }
216
217 // CHECK-LABEL: @test_vshrntq_m_n_u16(
218 // CHECK-NEXT: entry:
219 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
220 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
221 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vshrn.predicated.v16i8.v8i16.v8i1(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 1, i32 0, i32 0, i32 1, i32 1, i32 1, <8 x i1> [[TMP1]])
222 // CHECK-NEXT: ret <16 x i8> [[TMP2]]
223 //
test_vshrntq_m_n_u16(uint8x16_t a,uint16x8_t b,mve_pred16_t p)224 uint8x16_t test_vshrntq_m_n_u16(uint8x16_t a, uint16x8_t b, mve_pred16_t p)
225 {
226 #ifdef POLYMORPHIC
227 return vshrntq_m(a, b, 1, p);
228 #else /* POLYMORPHIC */
229 return vshrntq_m_n_u16(a, b, 1, p);
230 #endif /* POLYMORPHIC */
231 }
232
233 // CHECK-LABEL: @test_vshrntq_m_n_u32(
234 // CHECK-NEXT: entry:
235 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
236 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
237 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vshrn.predicated.v8i16.v4i32.v4i1(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 10, i32 0, i32 0, i32 1, i32 1, i32 1, <4 x i1> [[TMP1]])
238 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
239 //
test_vshrntq_m_n_u32(uint16x8_t a,uint32x4_t b,mve_pred16_t p)240 uint16x8_t test_vshrntq_m_n_u32(uint16x8_t a, uint32x4_t b, mve_pred16_t p)
241 {
242 #ifdef POLYMORPHIC
243 return vshrntq_m(a, b, 10, p);
244 #else /* POLYMORPHIC */
245 return vshrntq_m_n_u32(a, b, 10, p);
246 #endif /* POLYMORPHIC */
247 }
248
249 // CHECK-LABEL: @test_vrshrnbq_n_s16(
250 // CHECK-NEXT: entry:
251 // CHECK-NEXT: [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vshrn.v16i8.v8i16(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 5, i32 0, i32 1, i32 0, i32 0, i32 0)
252 // CHECK-NEXT: ret <16 x i8> [[TMP0]]
253 //
test_vrshrnbq_n_s16(int8x16_t a,int16x8_t b)254 int8x16_t test_vrshrnbq_n_s16(int8x16_t a, int16x8_t b)
255 {
256 #ifdef POLYMORPHIC
257 return vrshrnbq(a, b, 5);
258 #else /* POLYMORPHIC */
259 return vrshrnbq_n_s16(a, b, 5);
260 #endif /* POLYMORPHIC */
261 }
262
263 // CHECK-LABEL: @test_vrshrnbq_n_s32(
264 // CHECK-NEXT: entry:
265 // CHECK-NEXT: [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vshrn.v8i16.v4i32(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 10, i32 0, i32 1, i32 0, i32 0, i32 0)
266 // CHECK-NEXT: ret <8 x i16> [[TMP0]]
267 //
test_vrshrnbq_n_s32(int16x8_t a,int32x4_t b)268 int16x8_t test_vrshrnbq_n_s32(int16x8_t a, int32x4_t b)
269 {
270 #ifdef POLYMORPHIC
271 return vrshrnbq(a, b, 10);
272 #else /* POLYMORPHIC */
273 return vrshrnbq_n_s32(a, b, 10);
274 #endif /* POLYMORPHIC */
275 }
276
277 // CHECK-LABEL: @test_vrshrnbq_n_u16(
278 // CHECK-NEXT: entry:
279 // CHECK-NEXT: [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vshrn.v16i8.v8i16(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 2, i32 0, i32 1, i32 1, i32 1, i32 0)
280 // CHECK-NEXT: ret <16 x i8> [[TMP0]]
281 //
test_vrshrnbq_n_u16(uint8x16_t a,uint16x8_t b)282 uint8x16_t test_vrshrnbq_n_u16(uint8x16_t a, uint16x8_t b)
283 {
284 #ifdef POLYMORPHIC
285 return vrshrnbq(a, b, 2);
286 #else /* POLYMORPHIC */
287 return vrshrnbq_n_u16(a, b, 2);
288 #endif /* POLYMORPHIC */
289 }
290
291 // CHECK-LABEL: @test_vrshrnbq_n_u32(
292 // CHECK-NEXT: entry:
293 // CHECK-NEXT: [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vshrn.v8i16.v4i32(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 12, i32 0, i32 1, i32 1, i32 1, i32 0)
294 // CHECK-NEXT: ret <8 x i16> [[TMP0]]
295 //
test_vrshrnbq_n_u32(uint16x8_t a,uint32x4_t b)296 uint16x8_t test_vrshrnbq_n_u32(uint16x8_t a, uint32x4_t b)
297 {
298 #ifdef POLYMORPHIC
299 return vrshrnbq(a, b, 12);
300 #else /* POLYMORPHIC */
301 return vrshrnbq_n_u32(a, b, 12);
302 #endif /* POLYMORPHIC */
303 }
304
305 // CHECK-LABEL: @test_vrshrntq_n_s16(
306 // CHECK-NEXT: entry:
307 // CHECK-NEXT: [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vshrn.v16i8.v8i16(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 4, i32 0, i32 1, i32 0, i32 0, i32 1)
308 // CHECK-NEXT: ret <16 x i8> [[TMP0]]
309 //
test_vrshrntq_n_s16(int8x16_t a,int16x8_t b)310 int8x16_t test_vrshrntq_n_s16(int8x16_t a, int16x8_t b)
311 {
312 #ifdef POLYMORPHIC
313 return vrshrntq(a, b, 4);
314 #else /* POLYMORPHIC */
315 return vrshrntq_n_s16(a, b, 4);
316 #endif /* POLYMORPHIC */
317 }
318
319 // CHECK-LABEL: @test_vrshrntq_n_s32(
320 // CHECK-NEXT: entry:
321 // CHECK-NEXT: [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vshrn.v8i16.v4i32(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 11, i32 0, i32 1, i32 0, i32 0, i32 1)
322 // CHECK-NEXT: ret <8 x i16> [[TMP0]]
323 //
test_vrshrntq_n_s32(int16x8_t a,int32x4_t b)324 int16x8_t test_vrshrntq_n_s32(int16x8_t a, int32x4_t b)
325 {
326 #ifdef POLYMORPHIC
327 return vrshrntq(a, b, 11);
328 #else /* POLYMORPHIC */
329 return vrshrntq_n_s32(a, b, 11);
330 #endif /* POLYMORPHIC */
331 }
332
333 // CHECK-LABEL: @test_vrshrntq_n_u16(
334 // CHECK-NEXT: entry:
335 // CHECK-NEXT: [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vshrn.v16i8.v8i16(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 1, i32 0, i32 1, i32 1, i32 1, i32 1)
336 // CHECK-NEXT: ret <16 x i8> [[TMP0]]
337 //
test_vrshrntq_n_u16(uint8x16_t a,uint16x8_t b)338 uint8x16_t test_vrshrntq_n_u16(uint8x16_t a, uint16x8_t b)
339 {
340 #ifdef POLYMORPHIC
341 return vrshrntq(a, b, 1);
342 #else /* POLYMORPHIC */
343 return vrshrntq_n_u16(a, b, 1);
344 #endif /* POLYMORPHIC */
345 }
346
347 // CHECK-LABEL: @test_vrshrntq_n_u32(
348 // CHECK-NEXT: entry:
349 // CHECK-NEXT: [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vshrn.v8i16.v4i32(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 6, i32 0, i32 1, i32 1, i32 1, i32 1)
350 // CHECK-NEXT: ret <8 x i16> [[TMP0]]
351 //
test_vrshrntq_n_u32(uint16x8_t a,uint32x4_t b)352 uint16x8_t test_vrshrntq_n_u32(uint16x8_t a, uint32x4_t b)
353 {
354 #ifdef POLYMORPHIC
355 return vrshrntq(a, b, 6);
356 #else /* POLYMORPHIC */
357 return vrshrntq_n_u32(a, b, 6);
358 #endif /* POLYMORPHIC */
359 }
360
361 // CHECK-LABEL: @test_vrshrnbq_m_n_s16(
362 // CHECK-NEXT: entry:
363 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
364 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
365 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vshrn.predicated.v16i8.v8i16.v8i1(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 1, i32 0, i32 1, i32 0, i32 0, i32 0, <8 x i1> [[TMP1]])
366 // CHECK-NEXT: ret <16 x i8> [[TMP2]]
367 //
test_vrshrnbq_m_n_s16(int8x16_t a,int16x8_t b,mve_pred16_t p)368 int8x16_t test_vrshrnbq_m_n_s16(int8x16_t a, int16x8_t b, mve_pred16_t p)
369 {
370 #ifdef POLYMORPHIC
371 return vrshrnbq_m(a, b, 1, p);
372 #else /* POLYMORPHIC */
373 return vrshrnbq_m_n_s16(a, b, 1, p);
374 #endif /* POLYMORPHIC */
375 }
376
377 // CHECK-LABEL: @test_vrshrnbq_m_n_s32(
378 // CHECK-NEXT: entry:
379 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
380 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
381 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vshrn.predicated.v8i16.v4i32.v4i1(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 14, i32 0, i32 1, i32 0, i32 0, i32 0, <4 x i1> [[TMP1]])
382 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
383 //
test_vrshrnbq_m_n_s32(int16x8_t a,int32x4_t b,mve_pred16_t p)384 int16x8_t test_vrshrnbq_m_n_s32(int16x8_t a, int32x4_t b, mve_pred16_t p)
385 {
386 #ifdef POLYMORPHIC
387 return vrshrnbq_m(a, b, 14, p);
388 #else /* POLYMORPHIC */
389 return vrshrnbq_m_n_s32(a, b, 14, p);
390 #endif /* POLYMORPHIC */
391 }
392
393 // CHECK-LABEL: @test_vrshrnbq_m_n_u16(
394 // CHECK-NEXT: entry:
395 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
396 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
397 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vshrn.predicated.v16i8.v8i16.v8i1(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 2, i32 0, i32 1, i32 1, i32 1, i32 0, <8 x i1> [[TMP1]])
398 // CHECK-NEXT: ret <16 x i8> [[TMP2]]
399 //
test_vrshrnbq_m_n_u16(uint8x16_t a,uint16x8_t b,mve_pred16_t p)400 uint8x16_t test_vrshrnbq_m_n_u16(uint8x16_t a, uint16x8_t b, mve_pred16_t p)
401 {
402 #ifdef POLYMORPHIC
403 return vrshrnbq_m(a, b, 2, p);
404 #else /* POLYMORPHIC */
405 return vrshrnbq_m_n_u16(a, b, 2, p);
406 #endif /* POLYMORPHIC */
407 }
408
409 // CHECK-LABEL: @test_vrshrnbq_m_n_u32(
410 // CHECK-NEXT: entry:
411 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
412 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
413 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vshrn.predicated.v8i16.v4i32.v4i1(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 12, i32 0, i32 1, i32 1, i32 1, i32 0, <4 x i1> [[TMP1]])
414 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
415 //
test_vrshrnbq_m_n_u32(uint16x8_t a,uint32x4_t b,mve_pred16_t p)416 uint16x8_t test_vrshrnbq_m_n_u32(uint16x8_t a, uint32x4_t b, mve_pred16_t p)
417 {
418 #ifdef POLYMORPHIC
419 return vrshrnbq_m(a, b, 12, p);
420 #else /* POLYMORPHIC */
421 return vrshrnbq_m_n_u32(a, b, 12, p);
422 #endif /* POLYMORPHIC */
423 }
424
425 // CHECK-LABEL: @test_vrshrntq_m_n_s16(
426 // CHECK-NEXT: entry:
427 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
428 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
429 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vshrn.predicated.v16i8.v8i16.v8i1(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 4, i32 0, i32 1, i32 0, i32 0, i32 1, <8 x i1> [[TMP1]])
430 // CHECK-NEXT: ret <16 x i8> [[TMP2]]
431 //
test_vrshrntq_m_n_s16(int8x16_t a,int16x8_t b,mve_pred16_t p)432 int8x16_t test_vrshrntq_m_n_s16(int8x16_t a, int16x8_t b, mve_pred16_t p)
433 {
434 #ifdef POLYMORPHIC
435 return vrshrntq_m(a, b, 4, p);
436 #else /* POLYMORPHIC */
437 return vrshrntq_m_n_s16(a, b, 4, p);
438 #endif /* POLYMORPHIC */
439 }
440
441 // CHECK-LABEL: @test_vrshrntq_m_n_s32(
442 // CHECK-NEXT: entry:
443 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
444 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
445 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vshrn.predicated.v8i16.v4i32.v4i1(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 6, i32 0, i32 1, i32 0, i32 0, i32 1, <4 x i1> [[TMP1]])
446 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
447 //
test_vrshrntq_m_n_s32(int16x8_t a,int32x4_t b,mve_pred16_t p)448 int16x8_t test_vrshrntq_m_n_s32(int16x8_t a, int32x4_t b, mve_pred16_t p)
449 {
450 #ifdef POLYMORPHIC
451 return vrshrntq_m(a, b, 6, p);
452 #else /* POLYMORPHIC */
453 return vrshrntq_m_n_s32(a, b, 6, p);
454 #endif /* POLYMORPHIC */
455 }
456
457 // CHECK-LABEL: @test_vrshrntq_m_n_u16(
458 // CHECK-NEXT: entry:
459 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
460 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
461 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vshrn.predicated.v16i8.v8i16.v8i1(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 6, i32 0, i32 1, i32 1, i32 1, i32 1, <8 x i1> [[TMP1]])
462 // CHECK-NEXT: ret <16 x i8> [[TMP2]]
463 //
test_vrshrntq_m_n_u16(uint8x16_t a,uint16x8_t b,mve_pred16_t p)464 uint8x16_t test_vrshrntq_m_n_u16(uint8x16_t a, uint16x8_t b, mve_pred16_t p)
465 {
466 #ifdef POLYMORPHIC
467 return vrshrntq_m(a, b, 6, p);
468 #else /* POLYMORPHIC */
469 return vrshrntq_m_n_u16(a, b, 6, p);
470 #endif /* POLYMORPHIC */
471 }
472
473 // CHECK-LABEL: @test_vrshrntq_m_n_u32(
474 // CHECK-NEXT: entry:
475 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
476 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
477 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vshrn.predicated.v8i16.v4i32.v4i1(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 10, i32 0, i32 1, i32 1, i32 1, i32 1, <4 x i1> [[TMP1]])
478 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
479 //
test_vrshrntq_m_n_u32(uint16x8_t a,uint32x4_t b,mve_pred16_t p)480 uint16x8_t test_vrshrntq_m_n_u32(uint16x8_t a, uint32x4_t b, mve_pred16_t p)
481 {
482 #ifdef POLYMORPHIC
483 return vrshrntq_m(a, b, 10, p);
484 #else /* POLYMORPHIC */
485 return vrshrntq_m_n_u32(a, b, 10, p);
486 #endif /* POLYMORPHIC */
487 }
488
489 // CHECK-LABEL: @test_vqshrnbq_n_s16(
490 // CHECK-NEXT: entry:
491 // CHECK-NEXT: [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vshrn.v16i8.v8i16(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 7, i32 1, i32 0, i32 0, i32 0, i32 0)
492 // CHECK-NEXT: ret <16 x i8> [[TMP0]]
493 //
test_vqshrnbq_n_s16(int8x16_t a,int16x8_t b)494 int8x16_t test_vqshrnbq_n_s16(int8x16_t a, int16x8_t b)
495 {
496 #ifdef POLYMORPHIC
497 return vqshrnbq(a, b, 7);
498 #else /* POLYMORPHIC */
499 return vqshrnbq_n_s16(a, b, 7);
500 #endif /* POLYMORPHIC */
501 }
502
503 // CHECK-LABEL: @test_vqshrnbq_n_s32(
504 // CHECK-NEXT: entry:
505 // CHECK-NEXT: [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vshrn.v8i16.v4i32(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 15, i32 1, i32 0, i32 0, i32 0, i32 0)
506 // CHECK-NEXT: ret <8 x i16> [[TMP0]]
507 //
test_vqshrnbq_n_s32(int16x8_t a,int32x4_t b)508 int16x8_t test_vqshrnbq_n_s32(int16x8_t a, int32x4_t b)
509 {
510 #ifdef POLYMORPHIC
511 return vqshrnbq(a, b, 15);
512 #else /* POLYMORPHIC */
513 return vqshrnbq_n_s32(a, b, 15);
514 #endif /* POLYMORPHIC */
515 }
516
517 // CHECK-LABEL: @test_vqshrnbq_n_u16(
518 // CHECK-NEXT: entry:
519 // CHECK-NEXT: [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vshrn.v16i8.v8i16(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 3, i32 1, i32 0, i32 1, i32 1, i32 0)
520 // CHECK-NEXT: ret <16 x i8> [[TMP0]]
521 //
test_vqshrnbq_n_u16(uint8x16_t a,uint16x8_t b)522 uint8x16_t test_vqshrnbq_n_u16(uint8x16_t a, uint16x8_t b)
523 {
524 #ifdef POLYMORPHIC
525 return vqshrnbq(a, b, 3);
526 #else /* POLYMORPHIC */
527 return vqshrnbq_n_u16(a, b, 3);
528 #endif /* POLYMORPHIC */
529 }
530
531 // CHECK-LABEL: @test_vqshrnbq_n_u32(
532 // CHECK-NEXT: entry:
533 // CHECK-NEXT: [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vshrn.v8i16.v4i32(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 3, i32 1, i32 0, i32 1, i32 1, i32 0)
534 // CHECK-NEXT: ret <8 x i16> [[TMP0]]
535 //
test_vqshrnbq_n_u32(uint16x8_t a,uint32x4_t b)536 uint16x8_t test_vqshrnbq_n_u32(uint16x8_t a, uint32x4_t b)
537 {
538 #ifdef POLYMORPHIC
539 return vqshrnbq(a, b, 3);
540 #else /* POLYMORPHIC */
541 return vqshrnbq_n_u32(a, b, 3);
542 #endif /* POLYMORPHIC */
543 }
544
545 // CHECK-LABEL: @test_vqshrntq_n_s16(
546 // CHECK-NEXT: entry:
547 // CHECK-NEXT: [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vshrn.v16i8.v8i16(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 5, i32 1, i32 0, i32 0, i32 0, i32 1)
548 // CHECK-NEXT: ret <16 x i8> [[TMP0]]
549 //
test_vqshrntq_n_s16(int8x16_t a,int16x8_t b)550 int8x16_t test_vqshrntq_n_s16(int8x16_t a, int16x8_t b)
551 {
552 #ifdef POLYMORPHIC
553 return vqshrntq(a, b, 5);
554 #else /* POLYMORPHIC */
555 return vqshrntq_n_s16(a, b, 5);
556 #endif /* POLYMORPHIC */
557 }
558
559 // CHECK-LABEL: @test_vqshrntq_n_s32(
560 // CHECK-NEXT: entry:
561 // CHECK-NEXT: [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vshrn.v8i16.v4i32(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 6, i32 1, i32 0, i32 0, i32 0, i32 1)
562 // CHECK-NEXT: ret <8 x i16> [[TMP0]]
563 //
test_vqshrntq_n_s32(int16x8_t a,int32x4_t b)564 int16x8_t test_vqshrntq_n_s32(int16x8_t a, int32x4_t b)
565 {
566 #ifdef POLYMORPHIC
567 return vqshrntq(a, b, 6);
568 #else /* POLYMORPHIC */
569 return vqshrntq_n_s32(a, b, 6);
570 #endif /* POLYMORPHIC */
571 }
572
573 // CHECK-LABEL: @test_vqshrntq_n_u16(
574 // CHECK-NEXT: entry:
575 // CHECK-NEXT: [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vshrn.v16i8.v8i16(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 1, i32 1, i32 0, i32 1, i32 1, i32 1)
576 // CHECK-NEXT: ret <16 x i8> [[TMP0]]
577 //
test_vqshrntq_n_u16(uint8x16_t a,uint16x8_t b)578 uint8x16_t test_vqshrntq_n_u16(uint8x16_t a, uint16x8_t b)
579 {
580 #ifdef POLYMORPHIC
581 return vqshrntq(a, b, 1);
582 #else /* POLYMORPHIC */
583 return vqshrntq_n_u16(a, b, 1);
584 #endif /* POLYMORPHIC */
585 }
586
587 // CHECK-LABEL: @test_vqshrntq_n_u32(
588 // CHECK-NEXT: entry:
589 // CHECK-NEXT: [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vshrn.v8i16.v4i32(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 15, i32 1, i32 0, i32 1, i32 1, i32 1)
590 // CHECK-NEXT: ret <8 x i16> [[TMP0]]
591 //
test_vqshrntq_n_u32(uint16x8_t a,uint32x4_t b)592 uint16x8_t test_vqshrntq_n_u32(uint16x8_t a, uint32x4_t b)
593 {
594 #ifdef POLYMORPHIC
595 return vqshrntq(a, b, 15);
596 #else /* POLYMORPHIC */
597 return vqshrntq_n_u32(a, b, 15);
598 #endif /* POLYMORPHIC */
599 }
600
601 // CHECK-LABEL: @test_vqshrnbq_m_n_s16(
602 // CHECK-NEXT: entry:
603 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
604 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
605 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vshrn.predicated.v16i8.v8i16.v8i1(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 7, i32 1, i32 0, i32 0, i32 0, i32 0, <8 x i1> [[TMP1]])
606 // CHECK-NEXT: ret <16 x i8> [[TMP2]]
607 //
test_vqshrnbq_m_n_s16(int8x16_t a,int16x8_t b,mve_pred16_t p)608 int8x16_t test_vqshrnbq_m_n_s16(int8x16_t a, int16x8_t b, mve_pred16_t p)
609 {
610 #ifdef POLYMORPHIC
611 return vqshrnbq_m(a, b, 7, p);
612 #else /* POLYMORPHIC */
613 return vqshrnbq_m_n_s16(a, b, 7, p);
614 #endif /* POLYMORPHIC */
615 }
616
617 // CHECK-LABEL: @test_vqshrnbq_m_n_s32(
618 // CHECK-NEXT: entry:
619 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
620 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
621 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vshrn.predicated.v8i16.v4i32.v4i1(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 1, i32 1, i32 0, i32 0, i32 0, i32 0, <4 x i1> [[TMP1]])
622 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
623 //
test_vqshrnbq_m_n_s32(int16x8_t a,int32x4_t b,mve_pred16_t p)624 int16x8_t test_vqshrnbq_m_n_s32(int16x8_t a, int32x4_t b, mve_pred16_t p)
625 {
626 #ifdef POLYMORPHIC
627 return vqshrnbq_m(a, b, 1, p);
628 #else /* POLYMORPHIC */
629 return vqshrnbq_m_n_s32(a, b, 1, p);
630 #endif /* POLYMORPHIC */
631 }
632
633 // CHECK-LABEL: @test_vqshrnbq_m_n_u16(
634 // CHECK-NEXT: entry:
635 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
636 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
637 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vshrn.predicated.v16i8.v8i16.v8i1(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 1, i32 1, i32 0, i32 1, i32 1, i32 0, <8 x i1> [[TMP1]])
638 // CHECK-NEXT: ret <16 x i8> [[TMP2]]
639 //
test_vqshrnbq_m_n_u16(uint8x16_t a,uint16x8_t b,mve_pred16_t p)640 uint8x16_t test_vqshrnbq_m_n_u16(uint8x16_t a, uint16x8_t b, mve_pred16_t p)
641 {
642 #ifdef POLYMORPHIC
643 return vqshrnbq_m(a, b, 1, p);
644 #else /* POLYMORPHIC */
645 return vqshrnbq_m_n_u16(a, b, 1, p);
646 #endif /* POLYMORPHIC */
647 }
648
649 // CHECK-LABEL: @test_vqshrnbq_m_n_u32(
650 // CHECK-NEXT: entry:
651 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
652 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
653 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vshrn.predicated.v8i16.v4i32.v4i1(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 8, i32 1, i32 0, i32 1, i32 1, i32 0, <4 x i1> [[TMP1]])
654 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
655 //
test_vqshrnbq_m_n_u32(uint16x8_t a,uint32x4_t b,mve_pred16_t p)656 uint16x8_t test_vqshrnbq_m_n_u32(uint16x8_t a, uint32x4_t b, mve_pred16_t p)
657 {
658 #ifdef POLYMORPHIC
659 return vqshrnbq_m(a, b, 8, p);
660 #else /* POLYMORPHIC */
661 return vqshrnbq_m_n_u32(a, b, 8, p);
662 #endif /* POLYMORPHIC */
663 }
664
665 // CHECK-LABEL: @test_vqshrntq_m_n_s16(
666 // CHECK-NEXT: entry:
667 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
668 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
669 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vshrn.predicated.v16i8.v8i16.v8i1(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 1, i32 1, i32 0, i32 0, i32 0, i32 1, <8 x i1> [[TMP1]])
670 // CHECK-NEXT: ret <16 x i8> [[TMP2]]
671 //
test_vqshrntq_m_n_s16(int8x16_t a,int16x8_t b,mve_pred16_t p)672 int8x16_t test_vqshrntq_m_n_s16(int8x16_t a, int16x8_t b, mve_pred16_t p)
673 {
674 #ifdef POLYMORPHIC
675 return vqshrntq_m(a, b, 1, p);
676 #else /* POLYMORPHIC */
677 return vqshrntq_m_n_s16(a, b, 1, p);
678 #endif /* POLYMORPHIC */
679 }
680
681 // CHECK-LABEL: @test_vqshrntq_m_n_s32(
682 // CHECK-NEXT: entry:
683 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
684 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
685 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vshrn.predicated.v8i16.v4i32.v4i1(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 11, i32 1, i32 0, i32 0, i32 0, i32 1, <4 x i1> [[TMP1]])
686 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
687 //
test_vqshrntq_m_n_s32(int16x8_t a,int32x4_t b,mve_pred16_t p)688 int16x8_t test_vqshrntq_m_n_s32(int16x8_t a, int32x4_t b, mve_pred16_t p)
689 {
690 #ifdef POLYMORPHIC
691 return vqshrntq_m(a, b, 11, p);
692 #else /* POLYMORPHIC */
693 return vqshrntq_m_n_s32(a, b, 11, p);
694 #endif /* POLYMORPHIC */
695 }
696
697 // CHECK-LABEL: @test_vqshrntq_m_n_u16(
698 // CHECK-NEXT: entry:
699 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
700 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
701 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vshrn.predicated.v16i8.v8i16.v8i1(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 3, i32 1, i32 0, i32 1, i32 1, i32 1, <8 x i1> [[TMP1]])
702 // CHECK-NEXT: ret <16 x i8> [[TMP2]]
703 //
test_vqshrntq_m_n_u16(uint8x16_t a,uint16x8_t b,mve_pred16_t p)704 uint8x16_t test_vqshrntq_m_n_u16(uint8x16_t a, uint16x8_t b, mve_pred16_t p)
705 {
706 #ifdef POLYMORPHIC
707 return vqshrntq_m(a, b, 3, p);
708 #else /* POLYMORPHIC */
709 return vqshrntq_m_n_u16(a, b, 3, p);
710 #endif /* POLYMORPHIC */
711 }
712
713 // CHECK-LABEL: @test_vqshrntq_m_n_u32(
714 // CHECK-NEXT: entry:
715 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
716 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
717 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vshrn.predicated.v8i16.v4i32.v4i1(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 1, i32 1, i32 0, i32 1, i32 1, i32 1, <4 x i1> [[TMP1]])
718 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
719 //
test_vqshrntq_m_n_u32(uint16x8_t a,uint32x4_t b,mve_pred16_t p)720 uint16x8_t test_vqshrntq_m_n_u32(uint16x8_t a, uint32x4_t b, mve_pred16_t p)
721 {
722 #ifdef POLYMORPHIC
723 return vqshrntq_m(a, b, 1, p);
724 #else /* POLYMORPHIC */
725 return vqshrntq_m_n_u32(a, b, 1, p);
726 #endif /* POLYMORPHIC */
727 }
728
729 // CHECK-LABEL: @test_vqshrunbq_n_s16(
730 // CHECK-NEXT: entry:
731 // CHECK-NEXT: [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vshrn.v16i8.v8i16(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 5, i32 1, i32 0, i32 1, i32 0, i32 0)
732 // CHECK-NEXT: ret <16 x i8> [[TMP0]]
733 //
test_vqshrunbq_n_s16(uint8x16_t a,int16x8_t b)734 uint8x16_t test_vqshrunbq_n_s16(uint8x16_t a, int16x8_t b)
735 {
736 #ifdef POLYMORPHIC
737 return vqshrunbq(a, b, 5);
738 #else /* POLYMORPHIC */
739 return vqshrunbq_n_s16(a, b, 5);
740 #endif /* POLYMORPHIC */
741 }
742
743 // CHECK-LABEL: @test_vqshrunbq_n_s32(
744 // CHECK-NEXT: entry:
745 // CHECK-NEXT: [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vshrn.v8i16.v4i32(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 13, i32 1, i32 0, i32 1, i32 0, i32 0)
746 // CHECK-NEXT: ret <8 x i16> [[TMP0]]
747 //
test_vqshrunbq_n_s32(uint16x8_t a,int32x4_t b)748 uint16x8_t test_vqshrunbq_n_s32(uint16x8_t a, int32x4_t b)
749 {
750 #ifdef POLYMORPHIC
751 return vqshrunbq(a, b, 13);
752 #else /* POLYMORPHIC */
753 return vqshrunbq_n_s32(a, b, 13);
754 #endif /* POLYMORPHIC */
755 }
756
757 // CHECK-LABEL: @test_vqshruntq_n_s16(
758 // CHECK-NEXT: entry:
759 // CHECK-NEXT: [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vshrn.v16i8.v8i16(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 2, i32 1, i32 0, i32 1, i32 0, i32 1)
760 // CHECK-NEXT: ret <16 x i8> [[TMP0]]
761 //
test_vqshruntq_n_s16(uint8x16_t a,int16x8_t b)762 uint8x16_t test_vqshruntq_n_s16(uint8x16_t a, int16x8_t b)
763 {
764 #ifdef POLYMORPHIC
765 return vqshruntq(a, b, 2);
766 #else /* POLYMORPHIC */
767 return vqshruntq_n_s16(a, b, 2);
768 #endif /* POLYMORPHIC */
769 }
770
771 // CHECK-LABEL: @test_vqshruntq_n_s32(
772 // CHECK-NEXT: entry:
773 // CHECK-NEXT: [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vshrn.v8i16.v4i32(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 7, i32 1, i32 0, i32 1, i32 0, i32 1)
774 // CHECK-NEXT: ret <8 x i16> [[TMP0]]
775 //
test_vqshruntq_n_s32(uint16x8_t a,int32x4_t b)776 uint16x8_t test_vqshruntq_n_s32(uint16x8_t a, int32x4_t b)
777 {
778 #ifdef POLYMORPHIC
779 return vqshruntq(a, b, 7);
780 #else /* POLYMORPHIC */
781 return vqshruntq_n_s32(a, b, 7);
782 #endif /* POLYMORPHIC */
783 }
784
785 // CHECK-LABEL: @test_vqshrunbq_m_n_s16(
786 // CHECK-NEXT: entry:
787 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
788 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
789 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vshrn.predicated.v16i8.v8i16.v8i1(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 7, i32 1, i32 0, i32 1, i32 0, i32 0, <8 x i1> [[TMP1]])
790 // CHECK-NEXT: ret <16 x i8> [[TMP2]]
791 //
test_vqshrunbq_m_n_s16(uint8x16_t a,int16x8_t b,mve_pred16_t p)792 uint8x16_t test_vqshrunbq_m_n_s16(uint8x16_t a, int16x8_t b, mve_pred16_t p)
793 {
794 #ifdef POLYMORPHIC
795 return vqshrunbq_m(a, b, 7, p);
796 #else /* POLYMORPHIC */
797 return vqshrunbq_m_n_s16(a, b, 7, p);
798 #endif /* POLYMORPHIC */
799 }
800
801 // CHECK-LABEL: @test_vqshrunbq_m_n_s32(
802 // CHECK-NEXT: entry:
803 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
804 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
805 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vshrn.predicated.v8i16.v4i32.v4i1(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 7, i32 1, i32 0, i32 1, i32 0, i32 0, <4 x i1> [[TMP1]])
806 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
807 //
test_vqshrunbq_m_n_s32(uint16x8_t a,int32x4_t b,mve_pred16_t p)808 uint16x8_t test_vqshrunbq_m_n_s32(uint16x8_t a, int32x4_t b, mve_pred16_t p)
809 {
810 #ifdef POLYMORPHIC
811 return vqshrunbq_m(a, b, 7, p);
812 #else /* POLYMORPHIC */
813 return vqshrunbq_m_n_s32(a, b, 7, p);
814 #endif /* POLYMORPHIC */
815 }
816
817 // CHECK-LABEL: @test_vqshruntq_m_n_s16(
818 // CHECK-NEXT: entry:
819 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
820 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
821 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vshrn.predicated.v16i8.v8i16.v8i1(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 7, i32 1, i32 0, i32 1, i32 0, i32 1, <8 x i1> [[TMP1]])
822 // CHECK-NEXT: ret <16 x i8> [[TMP2]]
823 //
test_vqshruntq_m_n_s16(uint8x16_t a,int16x8_t b,mve_pred16_t p)824 uint8x16_t test_vqshruntq_m_n_s16(uint8x16_t a, int16x8_t b, mve_pred16_t p)
825 {
826 #ifdef POLYMORPHIC
827 return vqshruntq_m(a, b, 7, p);
828 #else /* POLYMORPHIC */
829 return vqshruntq_m_n_s16(a, b, 7, p);
830 #endif /* POLYMORPHIC */
831 }
832
833 // CHECK-LABEL: @test_vqshruntq_m_n_s32(
834 // CHECK-NEXT: entry:
835 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
836 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
837 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vshrn.predicated.v8i16.v4i32.v4i1(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 7, i32 1, i32 0, i32 1, i32 0, i32 1, <4 x i1> [[TMP1]])
838 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
839 //
test_vqshruntq_m_n_s32(uint16x8_t a,int32x4_t b,mve_pred16_t p)840 uint16x8_t test_vqshruntq_m_n_s32(uint16x8_t a, int32x4_t b, mve_pred16_t p)
841 {
842 #ifdef POLYMORPHIC
843 return vqshruntq_m(a, b, 7, p);
844 #else /* POLYMORPHIC */
845 return vqshruntq_m_n_s32(a, b, 7, p);
846 #endif /* POLYMORPHIC */
847 }
848
849 // CHECK-LABEL: @test_vqrshrnbq_n_s16(
850 // CHECK-NEXT: entry:
851 // CHECK-NEXT: [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vshrn.v16i8.v8i16(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 5, i32 1, i32 1, i32 0, i32 0, i32 0)
852 // CHECK-NEXT: ret <16 x i8> [[TMP0]]
853 //
test_vqrshrnbq_n_s16(int8x16_t a,int16x8_t b)854 int8x16_t test_vqrshrnbq_n_s16(int8x16_t a, int16x8_t b)
855 {
856 #ifdef POLYMORPHIC
857 return vqrshrnbq(a, b, 5);
858 #else /* POLYMORPHIC */
859 return vqrshrnbq_n_s16(a, b, 5);
860 #endif /* POLYMORPHIC */
861 }
862
863 // CHECK-LABEL: @test_vqrshrnbq_n_s32(
864 // CHECK-NEXT: entry:
865 // CHECK-NEXT: [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vshrn.v8i16.v4i32(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 13, i32 1, i32 1, i32 0, i32 0, i32 0)
866 // CHECK-NEXT: ret <8 x i16> [[TMP0]]
867 //
test_vqrshrnbq_n_s32(int16x8_t a,int32x4_t b)868 int16x8_t test_vqrshrnbq_n_s32(int16x8_t a, int32x4_t b)
869 {
870 #ifdef POLYMORPHIC
871 return vqrshrnbq(a, b, 13);
872 #else /* POLYMORPHIC */
873 return vqrshrnbq_n_s32(a, b, 13);
874 #endif /* POLYMORPHIC */
875 }
876
877 // CHECK-LABEL: @test_vqrshrnbq_n_u16(
878 // CHECK-NEXT: entry:
879 // CHECK-NEXT: [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vshrn.v16i8.v8i16(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 7, i32 1, i32 1, i32 1, i32 1, i32 0)
880 // CHECK-NEXT: ret <16 x i8> [[TMP0]]
881 //
test_vqrshrnbq_n_u16(uint8x16_t a,uint16x8_t b)882 uint8x16_t test_vqrshrnbq_n_u16(uint8x16_t a, uint16x8_t b)
883 {
884 #ifdef POLYMORPHIC
885 return vqrshrnbq(a, b, 7);
886 #else /* POLYMORPHIC */
887 return vqrshrnbq_n_u16(a, b, 7);
888 #endif /* POLYMORPHIC */
889 }
890
891 // CHECK-LABEL: @test_vqrshrnbq_n_u32(
892 // CHECK-NEXT: entry:
893 // CHECK-NEXT: [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vshrn.v8i16.v4i32(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 8, i32 1, i32 1, i32 1, i32 1, i32 0)
894 // CHECK-NEXT: ret <8 x i16> [[TMP0]]
895 //
test_vqrshrnbq_n_u32(uint16x8_t a,uint32x4_t b)896 uint16x8_t test_vqrshrnbq_n_u32(uint16x8_t a, uint32x4_t b)
897 {
898 #ifdef POLYMORPHIC
899 return vqrshrnbq(a, b, 8);
900 #else /* POLYMORPHIC */
901 return vqrshrnbq_n_u32(a, b, 8);
902 #endif /* POLYMORPHIC */
903 }
904
905 // CHECK-LABEL: @test_vqrshrntq_n_s16(
906 // CHECK-NEXT: entry:
907 // CHECK-NEXT: [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vshrn.v16i8.v8i16(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 7, i32 1, i32 1, i32 0, i32 0, i32 1)
908 // CHECK-NEXT: ret <16 x i8> [[TMP0]]
909 //
test_vqrshrntq_n_s16(int8x16_t a,int16x8_t b)910 int8x16_t test_vqrshrntq_n_s16(int8x16_t a, int16x8_t b)
911 {
912 #ifdef POLYMORPHIC
913 return vqrshrntq(a, b, 7);
914 #else /* POLYMORPHIC */
915 return vqrshrntq_n_s16(a, b, 7);
916 #endif /* POLYMORPHIC */
917 }
918
919 // CHECK-LABEL: @test_vqrshrntq_n_s32(
920 // CHECK-NEXT: entry:
921 // CHECK-NEXT: [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vshrn.v8i16.v4i32(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 2, i32 1, i32 1, i32 0, i32 0, i32 1)
922 // CHECK-NEXT: ret <8 x i16> [[TMP0]]
923 //
test_vqrshrntq_n_s32(int16x8_t a,int32x4_t b)924 int16x8_t test_vqrshrntq_n_s32(int16x8_t a, int32x4_t b)
925 {
926 #ifdef POLYMORPHIC
927 return vqrshrntq(a, b, 2);
928 #else /* POLYMORPHIC */
929 return vqrshrntq_n_s32(a, b, 2);
930 #endif /* POLYMORPHIC */
931 }
932
933 // CHECK-LABEL: @test_vqrshrntq_n_u16(
934 // CHECK-NEXT: entry:
935 // CHECK-NEXT: [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vshrn.v16i8.v8i16(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 1, i32 1, i32 1, i32 1, i32 1, i32 1)
936 // CHECK-NEXT: ret <16 x i8> [[TMP0]]
937 //
test_vqrshrntq_n_u16(uint8x16_t a,uint16x8_t b)938 uint8x16_t test_vqrshrntq_n_u16(uint8x16_t a, uint16x8_t b)
939 {
940 #ifdef POLYMORPHIC
941 return vqrshrntq(a, b, 1);
942 #else /* POLYMORPHIC */
943 return vqrshrntq_n_u16(a, b, 1);
944 #endif /* POLYMORPHIC */
945 }
946
947 // CHECK-LABEL: @test_vqrshrntq_n_u32(
948 // CHECK-NEXT: entry:
949 // CHECK-NEXT: [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vshrn.v8i16.v4i32(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 11, i32 1, i32 1, i32 1, i32 1, i32 1)
950 // CHECK-NEXT: ret <8 x i16> [[TMP0]]
951 //
test_vqrshrntq_n_u32(uint16x8_t a,uint32x4_t b)952 uint16x8_t test_vqrshrntq_n_u32(uint16x8_t a, uint32x4_t b)
953 {
954 #ifdef POLYMORPHIC
955 return vqrshrntq(a, b, 11);
956 #else /* POLYMORPHIC */
957 return vqrshrntq_n_u32(a, b, 11);
958 #endif /* POLYMORPHIC */
959 }
960
961 // CHECK-LABEL: @test_vqrshrnbq_m_n_s16(
962 // CHECK-NEXT: entry:
963 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
964 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
965 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vshrn.predicated.v16i8.v8i16.v8i1(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 2, i32 1, i32 1, i32 0, i32 0, i32 0, <8 x i1> [[TMP1]])
966 // CHECK-NEXT: ret <16 x i8> [[TMP2]]
967 //
test_vqrshrnbq_m_n_s16(int8x16_t a,int16x8_t b,mve_pred16_t p)968 int8x16_t test_vqrshrnbq_m_n_s16(int8x16_t a, int16x8_t b, mve_pred16_t p)
969 {
970 #ifdef POLYMORPHIC
971 return vqrshrnbq_m(a, b, 2, p);
972 #else /* POLYMORPHIC */
973 return vqrshrnbq_m_n_s16(a, b, 2, p);
974 #endif /* POLYMORPHIC */
975 }
976
977 // CHECK-LABEL: @test_vqrshrnbq_m_n_s32(
978 // CHECK-NEXT: entry:
979 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
980 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
981 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vshrn.predicated.v8i16.v4i32.v4i1(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 12, i32 1, i32 1, i32 0, i32 0, i32 0, <4 x i1> [[TMP1]])
982 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
983 //
test_vqrshrnbq_m_n_s32(int16x8_t a,int32x4_t b,mve_pred16_t p)984 int16x8_t test_vqrshrnbq_m_n_s32(int16x8_t a, int32x4_t b, mve_pred16_t p)
985 {
986 #ifdef POLYMORPHIC
987 return vqrshrnbq_m(a, b, 12, p);
988 #else /* POLYMORPHIC */
989 return vqrshrnbq_m_n_s32(a, b, 12, p);
990 #endif /* POLYMORPHIC */
991 }
992
993 // CHECK-LABEL: @test_vqrshrnbq_m_n_u16(
994 // CHECK-NEXT: entry:
995 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
996 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
997 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vshrn.predicated.v16i8.v8i16.v8i1(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 5, i32 1, i32 1, i32 1, i32 1, i32 0, <8 x i1> [[TMP1]])
998 // CHECK-NEXT: ret <16 x i8> [[TMP2]]
999 //
test_vqrshrnbq_m_n_u16(uint8x16_t a,uint16x8_t b,mve_pred16_t p)1000 uint8x16_t test_vqrshrnbq_m_n_u16(uint8x16_t a, uint16x8_t b, mve_pred16_t p)
1001 {
1002 #ifdef POLYMORPHIC
1003 return vqrshrnbq_m(a, b, 5, p);
1004 #else /* POLYMORPHIC */
1005 return vqrshrnbq_m_n_u16(a, b, 5, p);
1006 #endif /* POLYMORPHIC */
1007 }
1008
1009 // CHECK-LABEL: @test_vqrshrnbq_m_n_u32(
1010 // CHECK-NEXT: entry:
1011 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1012 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
1013 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vshrn.predicated.v8i16.v4i32.v4i1(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 11, i32 1, i32 1, i32 1, i32 1, i32 0, <4 x i1> [[TMP1]])
1014 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
1015 //
test_vqrshrnbq_m_n_u32(uint16x8_t a,uint32x4_t b,mve_pred16_t p)1016 uint16x8_t test_vqrshrnbq_m_n_u32(uint16x8_t a, uint32x4_t b, mve_pred16_t p)
1017 {
1018 #ifdef POLYMORPHIC
1019 return vqrshrnbq_m(a, b, 11, p);
1020 #else /* POLYMORPHIC */
1021 return vqrshrnbq_m_n_u32(a, b, 11, p);
1022 #endif /* POLYMORPHIC */
1023 }
1024
1025 // CHECK-LABEL: @test_vqrshrntq_m_n_s16(
1026 // CHECK-NEXT: entry:
1027 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1028 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
1029 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vshrn.predicated.v16i8.v8i16.v8i1(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 4, i32 1, i32 1, i32 0, i32 0, i32 1, <8 x i1> [[TMP1]])
1030 // CHECK-NEXT: ret <16 x i8> [[TMP2]]
1031 //
test_vqrshrntq_m_n_s16(int8x16_t a,int16x8_t b,mve_pred16_t p)1032 int8x16_t test_vqrshrntq_m_n_s16(int8x16_t a, int16x8_t b, mve_pred16_t p)
1033 {
1034 #ifdef POLYMORPHIC
1035 return vqrshrntq_m(a, b, 4, p);
1036 #else /* POLYMORPHIC */
1037 return vqrshrntq_m_n_s16(a, b, 4, p);
1038 #endif /* POLYMORPHIC */
1039 }
1040
1041 // CHECK-LABEL: @test_vqrshrntq_m_n_s32(
1042 // CHECK-NEXT: entry:
1043 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1044 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
1045 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vshrn.predicated.v8i16.v4i32.v4i1(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 6, i32 1, i32 1, i32 0, i32 0, i32 1, <4 x i1> [[TMP1]])
1046 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
1047 //
test_vqrshrntq_m_n_s32(int16x8_t a,int32x4_t b,mve_pred16_t p)1048 int16x8_t test_vqrshrntq_m_n_s32(int16x8_t a, int32x4_t b, mve_pred16_t p)
1049 {
1050 #ifdef POLYMORPHIC
1051 return vqrshrntq_m(a, b, 6, p);
1052 #else /* POLYMORPHIC */
1053 return vqrshrntq_m_n_s32(a, b, 6, p);
1054 #endif /* POLYMORPHIC */
1055 }
1056
1057 // CHECK-LABEL: @test_vqrshrntq_m_n_u16(
1058 // CHECK-NEXT: entry:
1059 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1060 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
1061 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vshrn.predicated.v16i8.v8i16.v8i1(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 7, i32 1, i32 1, i32 1, i32 1, i32 1, <8 x i1> [[TMP1]])
1062 // CHECK-NEXT: ret <16 x i8> [[TMP2]]
1063 //
test_vqrshrntq_m_n_u16(uint8x16_t a,uint16x8_t b,mve_pred16_t p)1064 uint8x16_t test_vqrshrntq_m_n_u16(uint8x16_t a, uint16x8_t b, mve_pred16_t p)
1065 {
1066 #ifdef POLYMORPHIC
1067 return vqrshrntq_m(a, b, 7, p);
1068 #else /* POLYMORPHIC */
1069 return vqrshrntq_m_n_u16(a, b, 7, p);
1070 #endif /* POLYMORPHIC */
1071 }
1072
1073 // CHECK-LABEL: @test_vqrshrntq_m_n_u32(
1074 // CHECK-NEXT: entry:
1075 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1076 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
1077 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vshrn.predicated.v8i16.v4i32.v4i1(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 15, i32 1, i32 1, i32 1, i32 1, i32 1, <4 x i1> [[TMP1]])
1078 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
1079 //
test_vqrshrntq_m_n_u32(uint16x8_t a,uint32x4_t b,mve_pred16_t p)1080 uint16x8_t test_vqrshrntq_m_n_u32(uint16x8_t a, uint32x4_t b, mve_pred16_t p)
1081 {
1082 #ifdef POLYMORPHIC
1083 return vqrshrntq_m(a, b, 15, p);
1084 #else /* POLYMORPHIC */
1085 return vqrshrntq_m_n_u32(a, b, 15, p);
1086 #endif /* POLYMORPHIC */
1087 }
1088
1089 // CHECK-LABEL: @test_vqrshrunbq_n_s16(
1090 // CHECK-NEXT: entry:
1091 // CHECK-NEXT: [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vshrn.v16i8.v8i16(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 7, i32 1, i32 1, i32 1, i32 0, i32 0)
1092 // CHECK-NEXT: ret <16 x i8> [[TMP0]]
1093 //
test_vqrshrunbq_n_s16(uint8x16_t a,int16x8_t b)1094 uint8x16_t test_vqrshrunbq_n_s16(uint8x16_t a, int16x8_t b)
1095 {
1096 #ifdef POLYMORPHIC
1097 return vqrshrunbq(a, b, 7);
1098 #else /* POLYMORPHIC */
1099 return vqrshrunbq_n_s16(a, b, 7);
1100 #endif /* POLYMORPHIC */
1101 }
1102
1103 // CHECK-LABEL: @test_vqrshrunbq_n_s32(
1104 // CHECK-NEXT: entry:
1105 // CHECK-NEXT: [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vshrn.v8i16.v4i32(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 1, i32 1, i32 1, i32 1, i32 0, i32 0)
1106 // CHECK-NEXT: ret <8 x i16> [[TMP0]]
1107 //
test_vqrshrunbq_n_s32(uint16x8_t a,int32x4_t b)1108 uint16x8_t test_vqrshrunbq_n_s32(uint16x8_t a, int32x4_t b)
1109 {
1110 #ifdef POLYMORPHIC
1111 return vqrshrunbq(a, b, 1);
1112 #else /* POLYMORPHIC */
1113 return vqrshrunbq_n_s32(a, b, 1);
1114 #endif /* POLYMORPHIC */
1115 }
1116
1117 // CHECK-LABEL: @test_vqrshruntq_n_s16(
1118 // CHECK-NEXT: entry:
1119 // CHECK-NEXT: [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vshrn.v16i8.v8i16(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 1, i32 1, i32 1, i32 1, i32 0, i32 1)
1120 // CHECK-NEXT: ret <16 x i8> [[TMP0]]
1121 //
test_vqrshruntq_n_s16(uint8x16_t a,int16x8_t b)1122 uint8x16_t test_vqrshruntq_n_s16(uint8x16_t a, int16x8_t b)
1123 {
1124 #ifdef POLYMORPHIC
1125 return vqrshruntq(a, b, 1);
1126 #else /* POLYMORPHIC */
1127 return vqrshruntq_n_s16(a, b, 1);
1128 #endif /* POLYMORPHIC */
1129 }
1130
1131 // CHECK-LABEL: @test_vqrshruntq_n_s32(
1132 // CHECK-NEXT: entry:
1133 // CHECK-NEXT: [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vshrn.v8i16.v4i32(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 3, i32 1, i32 1, i32 1, i32 0, i32 1)
1134 // CHECK-NEXT: ret <8 x i16> [[TMP0]]
1135 //
test_vqrshruntq_n_s32(uint16x8_t a,int32x4_t b)1136 uint16x8_t test_vqrshruntq_n_s32(uint16x8_t a, int32x4_t b)
1137 {
1138 #ifdef POLYMORPHIC
1139 return vqrshruntq(a, b, 3);
1140 #else /* POLYMORPHIC */
1141 return vqrshruntq_n_s32(a, b, 3);
1142 #endif /* POLYMORPHIC */
1143 }
1144
1145 // CHECK-LABEL: @test_vqrshrunbq_m_n_s16(
1146 // CHECK-NEXT: entry:
1147 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1148 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
1149 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vshrn.predicated.v16i8.v8i16.v8i1(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 4, i32 1, i32 1, i32 1, i32 0, i32 0, <8 x i1> [[TMP1]])
1150 // CHECK-NEXT: ret <16 x i8> [[TMP2]]
1151 //
test_vqrshrunbq_m_n_s16(uint8x16_t a,int16x8_t b,mve_pred16_t p)1152 uint8x16_t test_vqrshrunbq_m_n_s16(uint8x16_t a, int16x8_t b, mve_pred16_t p)
1153 {
1154 #ifdef POLYMORPHIC
1155 return vqrshrunbq_m(a, b, 4, p);
1156 #else /* POLYMORPHIC */
1157 return vqrshrunbq_m_n_s16(a, b, 4, p);
1158 #endif /* POLYMORPHIC */
1159 }
1160
1161 // CHECK-LABEL: @test_vqrshrunbq_m_n_s32(
1162 // CHECK-NEXT: entry:
1163 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1164 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
1165 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vshrn.predicated.v8i16.v4i32.v4i1(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 10, i32 1, i32 1, i32 1, i32 0, i32 0, <4 x i1> [[TMP1]])
1166 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
1167 //
test_vqrshrunbq_m_n_s32(uint16x8_t a,int32x4_t b,mve_pred16_t p)1168 uint16x8_t test_vqrshrunbq_m_n_s32(uint16x8_t a, int32x4_t b, mve_pred16_t p)
1169 {
1170 #ifdef POLYMORPHIC
1171 return vqrshrunbq_m(a, b, 10, p);
1172 #else /* POLYMORPHIC */
1173 return vqrshrunbq_m_n_s32(a, b, 10, p);
1174 #endif /* POLYMORPHIC */
1175 }
1176
1177 // CHECK-LABEL: @test_vqrshruntq_m_n_s16(
1178 // CHECK-NEXT: entry:
1179 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1180 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
1181 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vshrn.predicated.v16i8.v8i16.v8i1(<16 x i8> [[A:%.*]], <8 x i16> [[B:%.*]], i32 3, i32 1, i32 1, i32 1, i32 0, i32 1, <8 x i1> [[TMP1]])
1182 // CHECK-NEXT: ret <16 x i8> [[TMP2]]
1183 //
test_vqrshruntq_m_n_s16(uint8x16_t a,int16x8_t b,mve_pred16_t p)1184 uint8x16_t test_vqrshruntq_m_n_s16(uint8x16_t a, int16x8_t b, mve_pred16_t p)
1185 {
1186 #ifdef POLYMORPHIC
1187 return vqrshruntq_m(a, b, 3, p);
1188 #else /* POLYMORPHIC */
1189 return vqrshruntq_m_n_s16(a, b, 3, p);
1190 #endif /* POLYMORPHIC */
1191 }
1192
1193 // CHECK-LABEL: @test_vqrshruntq_m_n_s32(
1194 // CHECK-NEXT: entry:
1195 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1196 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
1197 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vshrn.predicated.v8i16.v4i32.v4i1(<8 x i16> [[A:%.*]], <4 x i32> [[B:%.*]], i32 13, i32 1, i32 1, i32 1, i32 0, i32 1, <4 x i1> [[TMP1]])
1198 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
1199 //
test_vqrshruntq_m_n_s32(uint16x8_t a,int32x4_t b,mve_pred16_t p)1200 uint16x8_t test_vqrshruntq_m_n_s32(uint16x8_t a, int32x4_t b, mve_pred16_t p)
1201 {
1202 #ifdef POLYMORPHIC
1203 return vqrshruntq_m(a, b, 13, p);
1204 #else /* POLYMORPHIC */
1205 return vqrshruntq_m_n_s32(a, b, 13, p);
1206 #endif /* POLYMORPHIC */
1207 }
1208
1209 // CHECK-LABEL: @test_vsliq_n_s8(
1210 // CHECK-NEXT: entry:
1211 // CHECK-NEXT: [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vsli.v16i8(<16 x i8> [[A:%.*]], <16 x i8> [[B:%.*]], i32 2)
1212 // CHECK-NEXT: ret <16 x i8> [[TMP0]]
1213 //
test_vsliq_n_s8(int8x16_t a,int8x16_t b)1214 int8x16_t test_vsliq_n_s8(int8x16_t a, int8x16_t b)
1215 {
1216 #ifdef POLYMORPHIC
1217 return vsliq(a, b, 2);
1218 #else /* POLYMORPHIC */
1219 return vsliq_n_s8(a, b, 2);
1220 #endif /* POLYMORPHIC */
1221 }
1222
1223 // CHECK-LABEL: @test_vsliq_n_s16(
1224 // CHECK-NEXT: entry:
1225 // CHECK-NEXT: [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vsli.v8i16(<8 x i16> [[A:%.*]], <8 x i16> [[B:%.*]], i32 10)
1226 // CHECK-NEXT: ret <8 x i16> [[TMP0]]
1227 //
test_vsliq_n_s16(int16x8_t a,int16x8_t b)1228 int16x8_t test_vsliq_n_s16(int16x8_t a, int16x8_t b)
1229 {
1230 #ifdef POLYMORPHIC
1231 return vsliq(a, b, 10);
1232 #else /* POLYMORPHIC */
1233 return vsliq_n_s16(a, b, 10);
1234 #endif /* POLYMORPHIC */
1235 }
1236
1237 // CHECK-LABEL: @test_vsliq_n_s32(
1238 // CHECK-NEXT: entry:
1239 // CHECK-NEXT: [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vsli.v4i32(<4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], i32 1)
1240 // CHECK-NEXT: ret <4 x i32> [[TMP0]]
1241 //
test_vsliq_n_s32(int32x4_t a,int32x4_t b)1242 int32x4_t test_vsliq_n_s32(int32x4_t a, int32x4_t b)
1243 {
1244 #ifdef POLYMORPHIC
1245 return vsliq(a, b, 1);
1246 #else /* POLYMORPHIC */
1247 return vsliq_n_s32(a, b, 1);
1248 #endif /* POLYMORPHIC */
1249 }
1250
1251 // CHECK-LABEL: @test_vsliq_n_u8(
1252 // CHECK-NEXT: entry:
1253 // CHECK-NEXT: [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vsli.v16i8(<16 x i8> [[A:%.*]], <16 x i8> [[B:%.*]], i32 1)
1254 // CHECK-NEXT: ret <16 x i8> [[TMP0]]
1255 //
test_vsliq_n_u8(uint8x16_t a,uint8x16_t b)1256 uint8x16_t test_vsliq_n_u8(uint8x16_t a, uint8x16_t b)
1257 {
1258 #ifdef POLYMORPHIC
1259 return vsliq(a, b, 1);
1260 #else /* POLYMORPHIC */
1261 return vsliq_n_u8(a, b, 1);
1262 #endif /* POLYMORPHIC */
1263 }
1264
1265 // CHECK-LABEL: @test_vsliq_n_u16(
1266 // CHECK-NEXT: entry:
1267 // CHECK-NEXT: [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vsli.v8i16(<8 x i16> [[A:%.*]], <8 x i16> [[B:%.*]], i32 1)
1268 // CHECK-NEXT: ret <8 x i16> [[TMP0]]
1269 //
test_vsliq_n_u16(uint16x8_t a,uint16x8_t b)1270 uint16x8_t test_vsliq_n_u16(uint16x8_t a, uint16x8_t b)
1271 {
1272 #ifdef POLYMORPHIC
1273 return vsliq(a, b, 1);
1274 #else /* POLYMORPHIC */
1275 return vsliq_n_u16(a, b, 1);
1276 #endif /* POLYMORPHIC */
1277 }
1278
1279 // CHECK-LABEL: @test_vsliq_n_u32(
1280 // CHECK-NEXT: entry:
1281 // CHECK-NEXT: [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vsli.v4i32(<4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], i32 28)
1282 // CHECK-NEXT: ret <4 x i32> [[TMP0]]
1283 //
test_vsliq_n_u32(uint32x4_t a,uint32x4_t b)1284 uint32x4_t test_vsliq_n_u32(uint32x4_t a, uint32x4_t b)
1285 {
1286 #ifdef POLYMORPHIC
1287 return vsliq(a, b, 28);
1288 #else /* POLYMORPHIC */
1289 return vsliq_n_u32(a, b, 28);
1290 #endif /* POLYMORPHIC */
1291 }
1292
1293 // CHECK-LABEL: @test_vsliq_m_n_s8(
1294 // CHECK-NEXT: entry:
1295 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1296 // CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]])
1297 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vsli.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], <16 x i8> [[B:%.*]], i32 4, <16 x i1> [[TMP1]])
1298 // CHECK-NEXT: ret <16 x i8> [[TMP2]]
1299 //
test_vsliq_m_n_s8(int8x16_t a,int8x16_t b,mve_pred16_t p)1300 int8x16_t test_vsliq_m_n_s8(int8x16_t a, int8x16_t b, mve_pred16_t p)
1301 {
1302 #ifdef POLYMORPHIC
1303 return vsliq_m(a, b, 4, p);
1304 #else /* POLYMORPHIC */
1305 return vsliq_m_n_s8(a, b, 4, p);
1306 #endif /* POLYMORPHIC */
1307 }
1308
1309 // CHECK-LABEL: @test_vsliq_m_n_s16(
1310 // CHECK-NEXT: entry:
1311 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1312 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
1313 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vsli.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], <8 x i16> [[B:%.*]], i32 1, <8 x i1> [[TMP1]])
1314 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
1315 //
test_vsliq_m_n_s16(int16x8_t a,int16x8_t b,mve_pred16_t p)1316 int16x8_t test_vsliq_m_n_s16(int16x8_t a, int16x8_t b, mve_pred16_t p)
1317 {
1318 #ifdef POLYMORPHIC
1319 return vsliq_m(a, b, 1, p);
1320 #else /* POLYMORPHIC */
1321 return vsliq_m_n_s16(a, b, 1, p);
1322 #endif /* POLYMORPHIC */
1323 }
1324
1325 // CHECK-LABEL: @test_vsliq_m_n_s32(
1326 // CHECK-NEXT: entry:
1327 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1328 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
1329 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vsli.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], i32 1, <4 x i1> [[TMP1]])
1330 // CHECK-NEXT: ret <4 x i32> [[TMP2]]
1331 //
test_vsliq_m_n_s32(int32x4_t a,int32x4_t b,mve_pred16_t p)1332 int32x4_t test_vsliq_m_n_s32(int32x4_t a, int32x4_t b, mve_pred16_t p)
1333 {
1334 #ifdef POLYMORPHIC
1335 return vsliq_m(a, b, 1, p);
1336 #else /* POLYMORPHIC */
1337 return vsliq_m_n_s32(a, b, 1, p);
1338 #endif /* POLYMORPHIC */
1339 }
1340
1341 // CHECK-LABEL: @test_vsliq_m_n_u8(
1342 // CHECK-NEXT: entry:
1343 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1344 // CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]])
1345 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vsli.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], <16 x i8> [[B:%.*]], i32 5, <16 x i1> [[TMP1]])
1346 // CHECK-NEXT: ret <16 x i8> [[TMP2]]
1347 //
test_vsliq_m_n_u8(uint8x16_t a,uint8x16_t b,mve_pred16_t p)1348 uint8x16_t test_vsliq_m_n_u8(uint8x16_t a, uint8x16_t b, mve_pred16_t p)
1349 {
1350 #ifdef POLYMORPHIC
1351 return vsliq_m(a, b, 5, p);
1352 #else /* POLYMORPHIC */
1353 return vsliq_m_n_u8(a, b, 5, p);
1354 #endif /* POLYMORPHIC */
1355 }
1356
1357 // CHECK-LABEL: @test_vsliq_m_n_u16(
1358 // CHECK-NEXT: entry:
1359 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1360 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
1361 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vsli.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], <8 x i16> [[B:%.*]], i32 3, <8 x i1> [[TMP1]])
1362 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
1363 //
test_vsliq_m_n_u16(uint16x8_t a,uint16x8_t b,mve_pred16_t p)1364 uint16x8_t test_vsliq_m_n_u16(uint16x8_t a, uint16x8_t b, mve_pred16_t p)
1365 {
1366 #ifdef POLYMORPHIC
1367 return vsliq_m(a, b, 3, p);
1368 #else /* POLYMORPHIC */
1369 return vsliq_m_n_u16(a, b, 3, p);
1370 #endif /* POLYMORPHIC */
1371 }
1372
1373 // CHECK-LABEL: @test_vsliq_m_n_u32(
1374 // CHECK-NEXT: entry:
1375 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1376 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
1377 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vsli.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], i32 9, <4 x i1> [[TMP1]])
1378 // CHECK-NEXT: ret <4 x i32> [[TMP2]]
1379 //
test_vsliq_m_n_u32(uint32x4_t a,uint32x4_t b,mve_pred16_t p)1380 uint32x4_t test_vsliq_m_n_u32(uint32x4_t a, uint32x4_t b, mve_pred16_t p)
1381 {
1382 #ifdef POLYMORPHIC
1383 return vsliq_m(a, b, 9, p);
1384 #else /* POLYMORPHIC */
1385 return vsliq_m_n_u32(a, b, 9, p);
1386 #endif /* POLYMORPHIC */
1387 }
1388
1389 // CHECK-LABEL: @test_vsriq_n_s8(
1390 // CHECK-NEXT: entry:
1391 // CHECK-NEXT: [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vsri.v16i8(<16 x i8> [[A:%.*]], <16 x i8> [[B:%.*]], i32 3)
1392 // CHECK-NEXT: ret <16 x i8> [[TMP0]]
1393 //
test_vsriq_n_s8(int8x16_t a,int8x16_t b)1394 int8x16_t test_vsriq_n_s8(int8x16_t a, int8x16_t b)
1395 {
1396 #ifdef POLYMORPHIC
1397 return vsriq(a, b, 3);
1398 #else /* POLYMORPHIC */
1399 return vsriq_n_s8(a, b, 3);
1400 #endif /* POLYMORPHIC */
1401 }
1402
1403 // CHECK-LABEL: @test_vsriq_n_s16(
1404 // CHECK-NEXT: entry:
1405 // CHECK-NEXT: [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vsri.v8i16(<8 x i16> [[A:%.*]], <8 x i16> [[B:%.*]], i32 2)
1406 // CHECK-NEXT: ret <8 x i16> [[TMP0]]
1407 //
test_vsriq_n_s16(int16x8_t a,int16x8_t b)1408 int16x8_t test_vsriq_n_s16(int16x8_t a, int16x8_t b)
1409 {
1410 #ifdef POLYMORPHIC
1411 return vsriq(a, b, 2);
1412 #else /* POLYMORPHIC */
1413 return vsriq_n_s16(a, b, 2);
1414 #endif /* POLYMORPHIC */
1415 }
1416
1417 // CHECK-LABEL: @test_vsriq_n_s32(
1418 // CHECK-NEXT: entry:
1419 // CHECK-NEXT: [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vsri.v4i32(<4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], i32 28)
1420 // CHECK-NEXT: ret <4 x i32> [[TMP0]]
1421 //
test_vsriq_n_s32(int32x4_t a,int32x4_t b)1422 int32x4_t test_vsriq_n_s32(int32x4_t a, int32x4_t b)
1423 {
1424 #ifdef POLYMORPHIC
1425 return vsriq(a, b, 28);
1426 #else /* POLYMORPHIC */
1427 return vsriq_n_s32(a, b, 28);
1428 #endif /* POLYMORPHIC */
1429 }
1430
1431 // CHECK-LABEL: @test_vsriq_n_u8(
1432 // CHECK-NEXT: entry:
1433 // CHECK-NEXT: [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vsri.v16i8(<16 x i8> [[A:%.*]], <16 x i8> [[B:%.*]], i32 3)
1434 // CHECK-NEXT: ret <16 x i8> [[TMP0]]
1435 //
test_vsriq_n_u8(uint8x16_t a,uint8x16_t b)1436 uint8x16_t test_vsriq_n_u8(uint8x16_t a, uint8x16_t b)
1437 {
1438 #ifdef POLYMORPHIC
1439 return vsriq(a, b, 3);
1440 #else /* POLYMORPHIC */
1441 return vsriq_n_u8(a, b, 3);
1442 #endif /* POLYMORPHIC */
1443 }
1444
1445 // CHECK-LABEL: @test_vsriq_n_u16(
1446 // CHECK-NEXT: entry:
1447 // CHECK-NEXT: [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vsri.v8i16(<8 x i16> [[A:%.*]], <8 x i16> [[B:%.*]], i32 3)
1448 // CHECK-NEXT: ret <8 x i16> [[TMP0]]
1449 //
test_vsriq_n_u16(uint16x8_t a,uint16x8_t b)1450 uint16x8_t test_vsriq_n_u16(uint16x8_t a, uint16x8_t b)
1451 {
1452 #ifdef POLYMORPHIC
1453 return vsriq(a, b, 3);
1454 #else /* POLYMORPHIC */
1455 return vsriq_n_u16(a, b, 3);
1456 #endif /* POLYMORPHIC */
1457 }
1458
1459 // CHECK-LABEL: @test_vsriq_n_u32(
1460 // CHECK-NEXT: entry:
1461 // CHECK-NEXT: [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vsri.v4i32(<4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], i32 26)
1462 // CHECK-NEXT: ret <4 x i32> [[TMP0]]
1463 //
test_vsriq_n_u32(uint32x4_t a,uint32x4_t b)1464 uint32x4_t test_vsriq_n_u32(uint32x4_t a, uint32x4_t b)
1465 {
1466 #ifdef POLYMORPHIC
1467 return vsriq(a, b, 26);
1468 #else /* POLYMORPHIC */
1469 return vsriq_n_u32(a, b, 26);
1470 #endif /* POLYMORPHIC */
1471 }
1472
1473 // CHECK-LABEL: @test_vsriq_m_n_s8(
1474 // CHECK-NEXT: entry:
1475 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1476 // CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]])
1477 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vsri.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], <16 x i8> [[B:%.*]], i32 4, <16 x i1> [[TMP1]])
1478 // CHECK-NEXT: ret <16 x i8> [[TMP2]]
1479 //
test_vsriq_m_n_s8(int8x16_t a,int8x16_t b,mve_pred16_t p)1480 int8x16_t test_vsriq_m_n_s8(int8x16_t a, int8x16_t b, mve_pred16_t p)
1481 {
1482 #ifdef POLYMORPHIC
1483 return vsriq_m(a, b, 4, p);
1484 #else /* POLYMORPHIC */
1485 return vsriq_m_n_s8(a, b, 4, p);
1486 #endif /* POLYMORPHIC */
1487 }
1488
1489 // CHECK-LABEL: @test_vsriq_m_n_s16(
1490 // CHECK-NEXT: entry:
1491 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1492 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
1493 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vsri.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], <8 x i16> [[B:%.*]], i32 1, <8 x i1> [[TMP1]])
1494 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
1495 //
test_vsriq_m_n_s16(int16x8_t a,int16x8_t b,mve_pred16_t p)1496 int16x8_t test_vsriq_m_n_s16(int16x8_t a, int16x8_t b, mve_pred16_t p)
1497 {
1498 #ifdef POLYMORPHIC
1499 return vsriq_m(a, b, 1, p);
1500 #else /* POLYMORPHIC */
1501 return vsriq_m_n_s16(a, b, 1, p);
1502 #endif /* POLYMORPHIC */
1503 }
1504
1505 // CHECK-LABEL: @test_vsriq_m_n_s32(
1506 // CHECK-NEXT: entry:
1507 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1508 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
1509 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vsri.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], i32 27, <4 x i1> [[TMP1]])
1510 // CHECK-NEXT: ret <4 x i32> [[TMP2]]
1511 //
test_vsriq_m_n_s32(int32x4_t a,int32x4_t b,mve_pred16_t p)1512 int32x4_t test_vsriq_m_n_s32(int32x4_t a, int32x4_t b, mve_pred16_t p)
1513 {
1514 #ifdef POLYMORPHIC
1515 return vsriq_m(a, b, 27, p);
1516 #else /* POLYMORPHIC */
1517 return vsriq_m_n_s32(a, b, 27, p);
1518 #endif /* POLYMORPHIC */
1519 }
1520
1521 // CHECK-LABEL: @test_vsriq_m_n_u8(
1522 // CHECK-NEXT: entry:
1523 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1524 // CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]])
1525 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vsri.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], <16 x i8> [[B:%.*]], i32 7, <16 x i1> [[TMP1]])
1526 // CHECK-NEXT: ret <16 x i8> [[TMP2]]
1527 //
test_vsriq_m_n_u8(uint8x16_t a,uint8x16_t b,mve_pred16_t p)1528 uint8x16_t test_vsriq_m_n_u8(uint8x16_t a, uint8x16_t b, mve_pred16_t p)
1529 {
1530 #ifdef POLYMORPHIC
1531 return vsriq_m(a, b, 7, p);
1532 #else /* POLYMORPHIC */
1533 return vsriq_m_n_u8(a, b, 7, p);
1534 #endif /* POLYMORPHIC */
1535 }
1536
1537 // CHECK-LABEL: @test_vsriq_m_n_u16(
1538 // CHECK-NEXT: entry:
1539 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1540 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
1541 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vsri.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], <8 x i16> [[B:%.*]], i32 9, <8 x i1> [[TMP1]])
1542 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
1543 //
test_vsriq_m_n_u16(uint16x8_t a,uint16x8_t b,mve_pred16_t p)1544 uint16x8_t test_vsriq_m_n_u16(uint16x8_t a, uint16x8_t b, mve_pred16_t p)
1545 {
1546 #ifdef POLYMORPHIC
1547 return vsriq_m(a, b, 9, p);
1548 #else /* POLYMORPHIC */
1549 return vsriq_m_n_u16(a, b, 9, p);
1550 #endif /* POLYMORPHIC */
1551 }
1552
1553 // CHECK-LABEL: @test_vsriq_m_n_u32(
1554 // CHECK-NEXT: entry:
1555 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1556 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
1557 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vsri.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], i32 13, <4 x i1> [[TMP1]])
1558 // CHECK-NEXT: ret <4 x i32> [[TMP2]]
1559 //
test_vsriq_m_n_u32(uint32x4_t a,uint32x4_t b,mve_pred16_t p)1560 uint32x4_t test_vsriq_m_n_u32(uint32x4_t a, uint32x4_t b, mve_pred16_t p)
1561 {
1562 #ifdef POLYMORPHIC
1563 return vsriq_m(a, b, 13, p);
1564 #else /* POLYMORPHIC */
1565 return vsriq_m_n_u32(a, b, 13, p);
1566 #endif /* POLYMORPHIC */
1567 }
1568