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 -fallow-half-arguments-and-returns -O0 -disable-O0-optnone -S -emit-llvm -o - %s | opt -S -mem2reg | FileCheck %s
3 // RUN: %clang_cc1 -triple thumbv8.1m.main-none-none-eabi -target-feature +mve.fp -mfloat-abi hard -fallow-half-arguments-and-returns -O0 -disable-O0-optnone -DPOLYMORPHIC -S -emit-llvm -o - %s | opt -S -mem2reg | FileCheck %s
4
5 // REQUIRES: aarch64-registered-target || arm-registered-target
6
7 #include <arm_mve.h>
8
9 // CHECK-LABEL: @test_vshlq_n_s8(
10 // CHECK-NEXT: entry:
11 // CHECK-NEXT: [[TMP0:%.*]] = shl <16 x i8> [[A:%.*]], <i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5>
12 // CHECK-NEXT: ret <16 x i8> [[TMP0]]
13 //
test_vshlq_n_s8(int8x16_t a)14 int8x16_t test_vshlq_n_s8(int8x16_t a)
15 {
16 #ifdef POLYMORPHIC
17 return vshlq_n(a, 5);
18 #else /* POLYMORPHIC */
19 return vshlq_n_s8(a, 5);
20 #endif /* POLYMORPHIC */
21 }
22
23 // CHECK-LABEL: @test_vshlq_n_s16(
24 // CHECK-NEXT: entry:
25 // CHECK-NEXT: [[TMP0:%.*]] = shl <8 x i16> [[A:%.*]], <i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5>
26 // CHECK-NEXT: ret <8 x i16> [[TMP0]]
27 //
test_vshlq_n_s16(int16x8_t a)28 int16x8_t test_vshlq_n_s16(int16x8_t a)
29 {
30 #ifdef POLYMORPHIC
31 return vshlq_n(a, 5);
32 #else /* POLYMORPHIC */
33 return vshlq_n_s16(a, 5);
34 #endif /* POLYMORPHIC */
35 }
36
37 // CHECK-LABEL: @test_vshlq_n_s32(
38 // CHECK-NEXT: entry:
39 // CHECK-NEXT: [[TMP0:%.*]] = shl <4 x i32> [[A:%.*]], <i32 18, i32 18, i32 18, i32 18>
40 // CHECK-NEXT: ret <4 x i32> [[TMP0]]
41 //
test_vshlq_n_s32(int32x4_t a)42 int32x4_t test_vshlq_n_s32(int32x4_t a)
43 {
44 #ifdef POLYMORPHIC
45 return vshlq_n(a, 18);
46 #else /* POLYMORPHIC */
47 return vshlq_n_s32(a, 18);
48 #endif /* POLYMORPHIC */
49 }
50
51 // CHECK-LABEL: @test_vshlq_n_s8_trivial(
52 // CHECK-NEXT: entry:
53 // CHECK-NEXT: [[TMP0:%.*]] = shl <16 x i8> [[A:%.*]], zeroinitializer
54 // CHECK-NEXT: ret <16 x i8> [[TMP0]]
55 //
test_vshlq_n_s8_trivial(int8x16_t a)56 int8x16_t test_vshlq_n_s8_trivial(int8x16_t a)
57 {
58 #ifdef POLYMORPHIC
59 return vshlq_n(a, 0);
60 #else /* POLYMORPHIC */
61 return vshlq_n_s8(a, 0);
62 #endif /* POLYMORPHIC */
63 }
64
65 // CHECK-LABEL: @test_vshlq_n_s16_trivial(
66 // CHECK-NEXT: entry:
67 // CHECK-NEXT: [[TMP0:%.*]] = shl <8 x i16> [[A:%.*]], zeroinitializer
68 // CHECK-NEXT: ret <8 x i16> [[TMP0]]
69 //
test_vshlq_n_s16_trivial(int16x8_t a)70 int16x8_t test_vshlq_n_s16_trivial(int16x8_t a)
71 {
72 #ifdef POLYMORPHIC
73 return vshlq_n(a, 0);
74 #else /* POLYMORPHIC */
75 return vshlq_n_s16(a, 0);
76 #endif /* POLYMORPHIC */
77 }
78
79 // CHECK-LABEL: @test_vshlq_n_s32_trivial(
80 // CHECK-NEXT: entry:
81 // CHECK-NEXT: [[TMP0:%.*]] = shl <4 x i32> [[A:%.*]], zeroinitializer
82 // CHECK-NEXT: ret <4 x i32> [[TMP0]]
83 //
test_vshlq_n_s32_trivial(int32x4_t a)84 int32x4_t test_vshlq_n_s32_trivial(int32x4_t a)
85 {
86 #ifdef POLYMORPHIC
87 return vshlq_n(a, 0);
88 #else /* POLYMORPHIC */
89 return vshlq_n_s32(a, 0);
90 #endif /* POLYMORPHIC */
91 }
92
93 // CHECK-LABEL: @test_vshlq_n_u8(
94 // CHECK-NEXT: entry:
95 // CHECK-NEXT: [[TMP0:%.*]] = shl <16 x i8> [[A:%.*]], <i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3>
96 // CHECK-NEXT: ret <16 x i8> [[TMP0]]
97 //
test_vshlq_n_u8(uint8x16_t a)98 uint8x16_t test_vshlq_n_u8(uint8x16_t a)
99 {
100 #ifdef POLYMORPHIC
101 return vshlq_n(a, 3);
102 #else /* POLYMORPHIC */
103 return vshlq_n_u8(a, 3);
104 #endif /* POLYMORPHIC */
105 }
106
107 // CHECK-LABEL: @test_vshlq_n_u16(
108 // CHECK-NEXT: entry:
109 // CHECK-NEXT: [[TMP0:%.*]] = shl <8 x i16> [[A:%.*]], <i16 11, i16 11, i16 11, i16 11, i16 11, i16 11, i16 11, i16 11>
110 // CHECK-NEXT: ret <8 x i16> [[TMP0]]
111 //
test_vshlq_n_u16(uint16x8_t a)112 uint16x8_t test_vshlq_n_u16(uint16x8_t a)
113 {
114 #ifdef POLYMORPHIC
115 return vshlq_n(a, 11);
116 #else /* POLYMORPHIC */
117 return vshlq_n_u16(a, 11);
118 #endif /* POLYMORPHIC */
119 }
120
121 // CHECK-LABEL: @test_vshlq_n_u32(
122 // CHECK-NEXT: entry:
123 // CHECK-NEXT: [[TMP0:%.*]] = shl <4 x i32> [[A:%.*]], <i32 7, i32 7, i32 7, i32 7>
124 // CHECK-NEXT: ret <4 x i32> [[TMP0]]
125 //
test_vshlq_n_u32(uint32x4_t a)126 uint32x4_t test_vshlq_n_u32(uint32x4_t a)
127 {
128 #ifdef POLYMORPHIC
129 return vshlq_n(a, 7);
130 #else /* POLYMORPHIC */
131 return vshlq_n_u32(a, 7);
132 #endif /* POLYMORPHIC */
133 }
134
135 // CHECK-LABEL: @test_vshlq_n_u8_trivial(
136 // CHECK-NEXT: entry:
137 // CHECK-NEXT: [[TMP0:%.*]] = shl <16 x i8> [[A:%.*]], zeroinitializer
138 // CHECK-NEXT: ret <16 x i8> [[TMP0]]
139 //
test_vshlq_n_u8_trivial(uint8x16_t a)140 uint8x16_t test_vshlq_n_u8_trivial(uint8x16_t a)
141 {
142 #ifdef POLYMORPHIC
143 return vshlq_n(a, 0);
144 #else /* POLYMORPHIC */
145 return vshlq_n_u8(a, 0);
146 #endif /* POLYMORPHIC */
147 }
148
149 // CHECK-LABEL: @test_vshlq_n_u16_trivial(
150 // CHECK-NEXT: entry:
151 // CHECK-NEXT: [[TMP0:%.*]] = shl <8 x i16> [[A:%.*]], zeroinitializer
152 // CHECK-NEXT: ret <8 x i16> [[TMP0]]
153 //
test_vshlq_n_u16_trivial(uint16x8_t a)154 uint16x8_t test_vshlq_n_u16_trivial(uint16x8_t a)
155 {
156 #ifdef POLYMORPHIC
157 return vshlq_n(a, 0);
158 #else /* POLYMORPHIC */
159 return vshlq_n_u16(a, 0);
160 #endif /* POLYMORPHIC */
161 }
162
163 // CHECK-LABEL: @test_vshlq_n_u32_trivial(
164 // CHECK-NEXT: entry:
165 // CHECK-NEXT: [[TMP0:%.*]] = shl <4 x i32> [[A:%.*]], zeroinitializer
166 // CHECK-NEXT: ret <4 x i32> [[TMP0]]
167 //
test_vshlq_n_u32_trivial(uint32x4_t a)168 uint32x4_t test_vshlq_n_u32_trivial(uint32x4_t a)
169 {
170 #ifdef POLYMORPHIC
171 return vshlq_n(a, 0);
172 #else /* POLYMORPHIC */
173 return vshlq_n_u32(a, 0);
174 #endif /* POLYMORPHIC */
175 }
176
177 // CHECK-LABEL: @test_vshrq_n_s8(
178 // CHECK-NEXT: entry:
179 // CHECK-NEXT: [[TMP0:%.*]] = ashr <16 x i8> [[A:%.*]], <i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4>
180 // CHECK-NEXT: ret <16 x i8> [[TMP0]]
181 //
test_vshrq_n_s8(int8x16_t a)182 int8x16_t test_vshrq_n_s8(int8x16_t a)
183 {
184 #ifdef POLYMORPHIC
185 return vshrq(a, 4);
186 #else /* POLYMORPHIC */
187 return vshrq_n_s8(a, 4);
188 #endif /* POLYMORPHIC */
189 }
190
191 // CHECK-LABEL: @test_vshrq_n_s16(
192 // CHECK-NEXT: entry:
193 // CHECK-NEXT: [[TMP0:%.*]] = ashr <8 x i16> [[A:%.*]], <i16 10, i16 10, i16 10, i16 10, i16 10, i16 10, i16 10, i16 10>
194 // CHECK-NEXT: ret <8 x i16> [[TMP0]]
195 //
test_vshrq_n_s16(int16x8_t a)196 int16x8_t test_vshrq_n_s16(int16x8_t a)
197 {
198 #ifdef POLYMORPHIC
199 return vshrq(a, 10);
200 #else /* POLYMORPHIC */
201 return vshrq_n_s16(a, 10);
202 #endif /* POLYMORPHIC */
203 }
204
205 // CHECK-LABEL: @test_vshrq_n_s32(
206 // CHECK-NEXT: entry:
207 // CHECK-NEXT: [[TMP0:%.*]] = ashr <4 x i32> [[A:%.*]], <i32 19, i32 19, i32 19, i32 19>
208 // CHECK-NEXT: ret <4 x i32> [[TMP0]]
209 //
test_vshrq_n_s32(int32x4_t a)210 int32x4_t test_vshrq_n_s32(int32x4_t a)
211 {
212 #ifdef POLYMORPHIC
213 return vshrq(a, 19);
214 #else /* POLYMORPHIC */
215 return vshrq_n_s32(a, 19);
216 #endif /* POLYMORPHIC */
217 }
218
219 // CHECK-LABEL: @test_vshrq_n_s8_trivial(
220 // CHECK-NEXT: entry:
221 // CHECK-NEXT: [[TMP0:%.*]] = ashr <16 x i8> [[A:%.*]], <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7>
222 // CHECK-NEXT: ret <16 x i8> [[TMP0]]
223 //
test_vshrq_n_s8_trivial(int8x16_t a)224 int8x16_t test_vshrq_n_s8_trivial(int8x16_t a)
225 {
226 #ifdef POLYMORPHIC
227 return vshrq(a, 8);
228 #else /* POLYMORPHIC */
229 return vshrq_n_s8(a, 8);
230 #endif /* POLYMORPHIC */
231 }
232
233 // CHECK-LABEL: @test_vshrq_n_s16_trivial(
234 // CHECK-NEXT: entry:
235 // CHECK-NEXT: [[TMP0:%.*]] = ashr <8 x i16> [[A:%.*]], <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>
236 // CHECK-NEXT: ret <8 x i16> [[TMP0]]
237 //
test_vshrq_n_s16_trivial(int16x8_t a)238 int16x8_t test_vshrq_n_s16_trivial(int16x8_t a)
239 {
240 #ifdef POLYMORPHIC
241 return vshrq(a, 16);
242 #else /* POLYMORPHIC */
243 return vshrq_n_s16(a, 16);
244 #endif /* POLYMORPHIC */
245 }
246
247 // CHECK-LABEL: @test_vshrq_n_s32_trivial(
248 // CHECK-NEXT: entry:
249 // CHECK-NEXT: [[TMP0:%.*]] = ashr <4 x i32> [[A:%.*]], <i32 31, i32 31, i32 31, i32 31>
250 // CHECK-NEXT: ret <4 x i32> [[TMP0]]
251 //
test_vshrq_n_s32_trivial(int32x4_t a)252 int32x4_t test_vshrq_n_s32_trivial(int32x4_t a)
253 {
254 #ifdef POLYMORPHIC
255 return vshrq(a, 32);
256 #else /* POLYMORPHIC */
257 return vshrq_n_s32(a, 32);
258 #endif /* POLYMORPHIC */
259 }
260
261 // CHECK-LABEL: @test_vshrq_n_u8(
262 // CHECK-NEXT: entry:
263 // CHECK-NEXT: [[TMP0:%.*]] = lshr <16 x i8> [[A:%.*]], <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
264 // CHECK-NEXT: ret <16 x i8> [[TMP0]]
265 //
test_vshrq_n_u8(uint8x16_t a)266 uint8x16_t test_vshrq_n_u8(uint8x16_t a)
267 {
268 #ifdef POLYMORPHIC
269 return vshrq(a, 1);
270 #else /* POLYMORPHIC */
271 return vshrq_n_u8(a, 1);
272 #endif /* POLYMORPHIC */
273 }
274
275 // CHECK-LABEL: @test_vshrq_n_u16(
276 // CHECK-NEXT: entry:
277 // CHECK-NEXT: [[TMP0:%.*]] = lshr <8 x i16> [[A:%.*]], <i16 10, i16 10, i16 10, i16 10, i16 10, i16 10, i16 10, i16 10>
278 // CHECK-NEXT: ret <8 x i16> [[TMP0]]
279 //
test_vshrq_n_u16(uint16x8_t a)280 uint16x8_t test_vshrq_n_u16(uint16x8_t a)
281 {
282 #ifdef POLYMORPHIC
283 return vshrq(a, 10);
284 #else /* POLYMORPHIC */
285 return vshrq_n_u16(a, 10);
286 #endif /* POLYMORPHIC */
287 }
288
289 // CHECK-LABEL: @test_vshrq_n_u32(
290 // CHECK-NEXT: entry:
291 // CHECK-NEXT: [[TMP0:%.*]] = lshr <4 x i32> [[A:%.*]], <i32 10, i32 10, i32 10, i32 10>
292 // CHECK-NEXT: ret <4 x i32> [[TMP0]]
293 //
test_vshrq_n_u32(uint32x4_t a)294 uint32x4_t test_vshrq_n_u32(uint32x4_t a)
295 {
296 #ifdef POLYMORPHIC
297 return vshrq(a, 10);
298 #else /* POLYMORPHIC */
299 return vshrq_n_u32(a, 10);
300 #endif /* POLYMORPHIC */
301 }
302
303 // CHECK-LABEL: @test_vshrq_n_u8_trivial(
304 // CHECK-NEXT: entry:
305 // CHECK-NEXT: ret <16 x i8> zeroinitializer
306 //
test_vshrq_n_u8_trivial(uint8x16_t a)307 uint8x16_t test_vshrq_n_u8_trivial(uint8x16_t a)
308 {
309 #ifdef POLYMORPHIC
310 return vshrq(a, 8);
311 #else /* POLYMORPHIC */
312 return vshrq_n_u8(a, 8);
313 #endif /* POLYMORPHIC */
314 }
315
316 // CHECK-LABEL: @test_vshrq_n_u16_trivial(
317 // CHECK-NEXT: entry:
318 // CHECK-NEXT: ret <8 x i16> zeroinitializer
319 //
test_vshrq_n_u16_trivial(uint16x8_t a)320 uint16x8_t test_vshrq_n_u16_trivial(uint16x8_t a)
321 {
322 #ifdef POLYMORPHIC
323 return vshrq(a, 16);
324 #else /* POLYMORPHIC */
325 return vshrq_n_u16(a, 16);
326 #endif /* POLYMORPHIC */
327 }
328
329 // CHECK-LABEL: @test_vshrq_n_u32_trivial(
330 // CHECK-NEXT: entry:
331 // CHECK-NEXT: ret <4 x i32> zeroinitializer
332 //
test_vshrq_n_u32_trivial(uint32x4_t a)333 uint32x4_t test_vshrq_n_u32_trivial(uint32x4_t a)
334 {
335 #ifdef POLYMORPHIC
336 return vshrq(a, 32);
337 #else /* POLYMORPHIC */
338 return vshrq_n_u32(a, 32);
339 #endif /* POLYMORPHIC */
340 }
341
342 // CHECK-LABEL: @test_vshlq_m_n_s8(
343 // CHECK-NEXT: entry:
344 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
345 // CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]])
346 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.shl.imm.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], i32 6, <16 x i1> [[TMP1]], <16 x i8> [[INACTIVE:%.*]])
347 // CHECK-NEXT: ret <16 x i8> [[TMP2]]
348 //
test_vshlq_m_n_s8(int8x16_t inactive,int8x16_t a,mve_pred16_t p)349 int8x16_t test_vshlq_m_n_s8(int8x16_t inactive, int8x16_t a, mve_pred16_t p)
350 {
351 #ifdef POLYMORPHIC
352 return vshlq_m_n(inactive, a, 6, p);
353 #else /* POLYMORPHIC */
354 return vshlq_m_n_s8(inactive, a, 6, p);
355 #endif /* POLYMORPHIC */
356 }
357
358 // CHECK-LABEL: @test_vshlq_m_n_s16(
359 // CHECK-NEXT: entry:
360 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
361 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
362 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.shl.imm.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], i32 13, <8 x i1> [[TMP1]], <8 x i16> [[INACTIVE:%.*]])
363 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
364 //
test_vshlq_m_n_s16(int16x8_t inactive,int16x8_t a,mve_pred16_t p)365 int16x8_t test_vshlq_m_n_s16(int16x8_t inactive, int16x8_t a, mve_pred16_t p)
366 {
367 #ifdef POLYMORPHIC
368 return vshlq_m_n(inactive, a, 13, p);
369 #else /* POLYMORPHIC */
370 return vshlq_m_n_s16(inactive, a, 13, p);
371 #endif /* POLYMORPHIC */
372 }
373
374 // CHECK-LABEL: @test_vshlq_m_n_s32(
375 // CHECK-NEXT: entry:
376 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
377 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
378 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.shl.imm.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], i32 0, <4 x i1> [[TMP1]], <4 x i32> [[INACTIVE:%.*]])
379 // CHECK-NEXT: ret <4 x i32> [[TMP2]]
380 //
test_vshlq_m_n_s32(int32x4_t inactive,int32x4_t a,mve_pred16_t p)381 int32x4_t test_vshlq_m_n_s32(int32x4_t inactive, int32x4_t a, mve_pred16_t p)
382 {
383 #ifdef POLYMORPHIC
384 return vshlq_m_n(inactive, a, 0, p);
385 #else /* POLYMORPHIC */
386 return vshlq_m_n_s32(inactive, a, 0, p);
387 #endif /* POLYMORPHIC */
388 }
389
390 // CHECK-LABEL: @test_vshlq_m_n_u8(
391 // CHECK-NEXT: entry:
392 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
393 // CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]])
394 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.shl.imm.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], i32 3, <16 x i1> [[TMP1]], <16 x i8> [[INACTIVE:%.*]])
395 // CHECK-NEXT: ret <16 x i8> [[TMP2]]
396 //
test_vshlq_m_n_u8(uint8x16_t inactive,uint8x16_t a,mve_pred16_t p)397 uint8x16_t test_vshlq_m_n_u8(uint8x16_t inactive, uint8x16_t a, mve_pred16_t p)
398 {
399 #ifdef POLYMORPHIC
400 return vshlq_m_n(inactive, a, 3, p);
401 #else /* POLYMORPHIC */
402 return vshlq_m_n_u8(inactive, a, 3, p);
403 #endif /* POLYMORPHIC */
404 }
405
406 // CHECK-LABEL: @test_vshlq_m_n_u16(
407 // CHECK-NEXT: entry:
408 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
409 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
410 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.shl.imm.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], i32 1, <8 x i1> [[TMP1]], <8 x i16> [[INACTIVE:%.*]])
411 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
412 //
test_vshlq_m_n_u16(uint16x8_t inactive,uint16x8_t a,mve_pred16_t p)413 uint16x8_t test_vshlq_m_n_u16(uint16x8_t inactive, uint16x8_t a, mve_pred16_t p)
414 {
415 #ifdef POLYMORPHIC
416 return vshlq_m_n(inactive, a, 1, p);
417 #else /* POLYMORPHIC */
418 return vshlq_m_n_u16(inactive, a, 1, p);
419 #endif /* POLYMORPHIC */
420 }
421
422 // CHECK-LABEL: @test_vshlq_m_n_u32(
423 // CHECK-NEXT: entry:
424 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
425 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
426 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.shl.imm.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], i32 24, <4 x i1> [[TMP1]], <4 x i32> [[INACTIVE:%.*]])
427 // CHECK-NEXT: ret <4 x i32> [[TMP2]]
428 //
test_vshlq_m_n_u32(uint32x4_t inactive,uint32x4_t a,mve_pred16_t p)429 uint32x4_t test_vshlq_m_n_u32(uint32x4_t inactive, uint32x4_t a, mve_pred16_t p)
430 {
431 #ifdef POLYMORPHIC
432 return vshlq_m_n(inactive, a, 24, p);
433 #else /* POLYMORPHIC */
434 return vshlq_m_n_u32(inactive, a, 24, p);
435 #endif /* POLYMORPHIC */
436 }
437
438 // CHECK-LABEL: @test_vshrq_m_n_s8(
439 // CHECK-NEXT: entry:
440 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
441 // CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]])
442 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.shr.imm.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], i32 2, i32 0, <16 x i1> [[TMP1]], <16 x i8> [[INACTIVE:%.*]])
443 // CHECK-NEXT: ret <16 x i8> [[TMP2]]
444 //
test_vshrq_m_n_s8(int8x16_t inactive,int8x16_t a,mve_pred16_t p)445 int8x16_t test_vshrq_m_n_s8(int8x16_t inactive, int8x16_t a, mve_pred16_t p)
446 {
447 #ifdef POLYMORPHIC
448 return vshrq_m(inactive, a, 2, p);
449 #else /* POLYMORPHIC */
450 return vshrq_m_n_s8(inactive, a, 2, p);
451 #endif /* POLYMORPHIC */
452 }
453
454 // CHECK-LABEL: @test_vshrq_m_n_s16(
455 // CHECK-NEXT: entry:
456 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
457 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
458 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.shr.imm.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], i32 3, i32 0, <8 x i1> [[TMP1]], <8 x i16> [[INACTIVE:%.*]])
459 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
460 //
test_vshrq_m_n_s16(int16x8_t inactive,int16x8_t a,mve_pred16_t p)461 int16x8_t test_vshrq_m_n_s16(int16x8_t inactive, int16x8_t a, mve_pred16_t p)
462 {
463 #ifdef POLYMORPHIC
464 return vshrq_m(inactive, a, 3, p);
465 #else /* POLYMORPHIC */
466 return vshrq_m_n_s16(inactive, a, 3, p);
467 #endif /* POLYMORPHIC */
468 }
469
470 // CHECK-LABEL: @test_vshrq_m_n_s32(
471 // CHECK-NEXT: entry:
472 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
473 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
474 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.shr.imm.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], i32 13, i32 0, <4 x i1> [[TMP1]], <4 x i32> [[INACTIVE:%.*]])
475 // CHECK-NEXT: ret <4 x i32> [[TMP2]]
476 //
test_vshrq_m_n_s32(int32x4_t inactive,int32x4_t a,mve_pred16_t p)477 int32x4_t test_vshrq_m_n_s32(int32x4_t inactive, int32x4_t a, mve_pred16_t p)
478 {
479 #ifdef POLYMORPHIC
480 return vshrq_m(inactive, a, 13, p);
481 #else /* POLYMORPHIC */
482 return vshrq_m_n_s32(inactive, a, 13, p);
483 #endif /* POLYMORPHIC */
484 }
485
486 // CHECK-LABEL: @test_vshrq_m_n_u8(
487 // CHECK-NEXT: entry:
488 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
489 // CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]])
490 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.shr.imm.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], i32 4, i32 1, <16 x i1> [[TMP1]], <16 x i8> [[INACTIVE:%.*]])
491 // CHECK-NEXT: ret <16 x i8> [[TMP2]]
492 //
test_vshrq_m_n_u8(uint8x16_t inactive,uint8x16_t a,mve_pred16_t p)493 uint8x16_t test_vshrq_m_n_u8(uint8x16_t inactive, uint8x16_t a, mve_pred16_t p)
494 {
495 #ifdef POLYMORPHIC
496 return vshrq_m(inactive, a, 4, p);
497 #else /* POLYMORPHIC */
498 return vshrq_m_n_u8(inactive, a, 4, p);
499 #endif /* POLYMORPHIC */
500 }
501
502 // CHECK-LABEL: @test_vshrq_m_n_u16(
503 // CHECK-NEXT: entry:
504 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
505 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
506 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.shr.imm.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], i32 14, i32 1, <8 x i1> [[TMP1]], <8 x i16> [[INACTIVE:%.*]])
507 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
508 //
test_vshrq_m_n_u16(uint16x8_t inactive,uint16x8_t a,mve_pred16_t p)509 uint16x8_t test_vshrq_m_n_u16(uint16x8_t inactive, uint16x8_t a, mve_pred16_t p)
510 {
511 #ifdef POLYMORPHIC
512 return vshrq_m(inactive, a, 14, p);
513 #else /* POLYMORPHIC */
514 return vshrq_m_n_u16(inactive, a, 14, p);
515 #endif /* POLYMORPHIC */
516 }
517
518 // CHECK-LABEL: @test_vshrq_m_n_u32(
519 // CHECK-NEXT: entry:
520 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
521 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
522 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.shr.imm.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], i32 21, i32 1, <4 x i1> [[TMP1]], <4 x i32> [[INACTIVE:%.*]])
523 // CHECK-NEXT: ret <4 x i32> [[TMP2]]
524 //
test_vshrq_m_n_u32(uint32x4_t inactive,uint32x4_t a,mve_pred16_t p)525 uint32x4_t test_vshrq_m_n_u32(uint32x4_t inactive, uint32x4_t a, mve_pred16_t p)
526 {
527 #ifdef POLYMORPHIC
528 return vshrq_m(inactive, a, 21, p);
529 #else /* POLYMORPHIC */
530 return vshrq_m_n_u32(inactive, a, 21, p);
531 #endif /* POLYMORPHIC */
532 }
533
534 // CHECK-LABEL: @test_vshlq_x_n_s8(
535 // CHECK-NEXT: entry:
536 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
537 // CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]])
538 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.shl.imm.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], i32 1, <16 x i1> [[TMP1]], <16 x i8> undef)
539 // CHECK-NEXT: ret <16 x i8> [[TMP2]]
540 //
test_vshlq_x_n_s8(int8x16_t a,mve_pred16_t p)541 int8x16_t test_vshlq_x_n_s8(int8x16_t a, mve_pred16_t p)
542 {
543 #ifdef POLYMORPHIC
544 return vshlq_x_n(a, 1, p);
545 #else /* POLYMORPHIC */
546 return vshlq_x_n_s8(a, 1, p);
547 #endif /* POLYMORPHIC */
548 }
549
550 // CHECK-LABEL: @test_vshlq_x_n_s16(
551 // CHECK-NEXT: entry:
552 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
553 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
554 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.shl.imm.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], i32 15, <8 x i1> [[TMP1]], <8 x i16> undef)
555 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
556 //
test_vshlq_x_n_s16(int16x8_t a,mve_pred16_t p)557 int16x8_t test_vshlq_x_n_s16(int16x8_t a, mve_pred16_t p)
558 {
559 #ifdef POLYMORPHIC
560 return vshlq_x_n(a, 15, p);
561 #else /* POLYMORPHIC */
562 return vshlq_x_n_s16(a, 15, p);
563 #endif /* POLYMORPHIC */
564 }
565
566 // CHECK-LABEL: @test_vshlq_x_n_s32(
567 // CHECK-NEXT: entry:
568 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
569 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
570 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.shl.imm.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], i32 13, <4 x i1> [[TMP1]], <4 x i32> undef)
571 // CHECK-NEXT: ret <4 x i32> [[TMP2]]
572 //
test_vshlq_x_n_s32(int32x4_t a,mve_pred16_t p)573 int32x4_t test_vshlq_x_n_s32(int32x4_t a, mve_pred16_t p)
574 {
575 #ifdef POLYMORPHIC
576 return vshlq_x_n(a, 13, p);
577 #else /* POLYMORPHIC */
578 return vshlq_x_n_s32(a, 13, p);
579 #endif /* POLYMORPHIC */
580 }
581
582 // CHECK-LABEL: @test_vshlq_x_n_u8(
583 // CHECK-NEXT: entry:
584 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
585 // CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]])
586 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.shl.imm.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], i32 4, <16 x i1> [[TMP1]], <16 x i8> undef)
587 // CHECK-NEXT: ret <16 x i8> [[TMP2]]
588 //
test_vshlq_x_n_u8(uint8x16_t a,mve_pred16_t p)589 uint8x16_t test_vshlq_x_n_u8(uint8x16_t a, mve_pred16_t p)
590 {
591 #ifdef POLYMORPHIC
592 return vshlq_x_n(a, 4, p);
593 #else /* POLYMORPHIC */
594 return vshlq_x_n_u8(a, 4, p);
595 #endif /* POLYMORPHIC */
596 }
597
598 // CHECK-LABEL: @test_vshlq_x_n_u16(
599 // CHECK-NEXT: entry:
600 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
601 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
602 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.shl.imm.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], i32 10, <8 x i1> [[TMP1]], <8 x i16> undef)
603 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
604 //
test_vshlq_x_n_u16(uint16x8_t a,mve_pred16_t p)605 uint16x8_t test_vshlq_x_n_u16(uint16x8_t a, mve_pred16_t p)
606 {
607 #ifdef POLYMORPHIC
608 return vshlq_x_n(a, 10, p);
609 #else /* POLYMORPHIC */
610 return vshlq_x_n_u16(a, 10, p);
611 #endif /* POLYMORPHIC */
612 }
613
614 // CHECK-LABEL: @test_vshlq_x_n_u32(
615 // CHECK-NEXT: entry:
616 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
617 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
618 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.shl.imm.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], i32 30, <4 x i1> [[TMP1]], <4 x i32> undef)
619 // CHECK-NEXT: ret <4 x i32> [[TMP2]]
620 //
test_vshlq_x_n_u32(uint32x4_t a,mve_pred16_t p)621 uint32x4_t test_vshlq_x_n_u32(uint32x4_t a, mve_pred16_t p)
622 {
623 #ifdef POLYMORPHIC
624 return vshlq_x_n(a, 30, p);
625 #else /* POLYMORPHIC */
626 return vshlq_x_n_u32(a, 30, p);
627 #endif /* POLYMORPHIC */
628 }
629
630 // CHECK-LABEL: @test_vshrq_x_n_s8(
631 // CHECK-NEXT: entry:
632 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
633 // CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]])
634 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.shr.imm.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], i32 4, i32 0, <16 x i1> [[TMP1]], <16 x i8> undef)
635 // CHECK-NEXT: ret <16 x i8> [[TMP2]]
636 //
test_vshrq_x_n_s8(int8x16_t a,mve_pred16_t p)637 int8x16_t test_vshrq_x_n_s8(int8x16_t a, mve_pred16_t p)
638 {
639 #ifdef POLYMORPHIC
640 return vshrq_x(a, 4, p);
641 #else /* POLYMORPHIC */
642 return vshrq_x_n_s8(a, 4, p);
643 #endif /* POLYMORPHIC */
644 }
645
646 // CHECK-LABEL: @test_vshrq_x_n_s16(
647 // CHECK-NEXT: entry:
648 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
649 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
650 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.shr.imm.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], i32 10, i32 0, <8 x i1> [[TMP1]], <8 x i16> undef)
651 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
652 //
test_vshrq_x_n_s16(int16x8_t a,mve_pred16_t p)653 int16x8_t test_vshrq_x_n_s16(int16x8_t a, mve_pred16_t p)
654 {
655 #ifdef POLYMORPHIC
656 return vshrq_x(a, 10, p);
657 #else /* POLYMORPHIC */
658 return vshrq_x_n_s16(a, 10, p);
659 #endif /* POLYMORPHIC */
660 }
661
662 // CHECK-LABEL: @test_vshrq_x_n_s32(
663 // CHECK-NEXT: entry:
664 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
665 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
666 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.shr.imm.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], i32 7, i32 0, <4 x i1> [[TMP1]], <4 x i32> undef)
667 // CHECK-NEXT: ret <4 x i32> [[TMP2]]
668 //
test_vshrq_x_n_s32(int32x4_t a,mve_pred16_t p)669 int32x4_t test_vshrq_x_n_s32(int32x4_t a, mve_pred16_t p)
670 {
671 #ifdef POLYMORPHIC
672 return vshrq_x(a, 7, p);
673 #else /* POLYMORPHIC */
674 return vshrq_x_n_s32(a, 7, p);
675 #endif /* POLYMORPHIC */
676 }
677
678 // CHECK-LABEL: @test_vshrq_x_n_u8(
679 // CHECK-NEXT: entry:
680 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
681 // CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]])
682 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.shr.imm.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], i32 7, i32 1, <16 x i1> [[TMP1]], <16 x i8> undef)
683 // CHECK-NEXT: ret <16 x i8> [[TMP2]]
684 //
test_vshrq_x_n_u8(uint8x16_t a,mve_pred16_t p)685 uint8x16_t test_vshrq_x_n_u8(uint8x16_t a, mve_pred16_t p)
686 {
687 #ifdef POLYMORPHIC
688 return vshrq_x(a, 7, p);
689 #else /* POLYMORPHIC */
690 return vshrq_x_n_u8(a, 7, p);
691 #endif /* POLYMORPHIC */
692 }
693
694 // CHECK-LABEL: @test_vshrq_x_n_u16(
695 // CHECK-NEXT: entry:
696 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
697 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
698 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.shr.imm.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], i32 7, i32 1, <8 x i1> [[TMP1]], <8 x i16> undef)
699 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
700 //
test_vshrq_x_n_u16(uint16x8_t a,mve_pred16_t p)701 uint16x8_t test_vshrq_x_n_u16(uint16x8_t a, mve_pred16_t p)
702 {
703 #ifdef POLYMORPHIC
704 return vshrq_x(a, 7, p);
705 #else /* POLYMORPHIC */
706 return vshrq_x_n_u16(a, 7, p);
707 #endif /* POLYMORPHIC */
708 }
709
710 // CHECK-LABEL: @test_vshrq_x_n_u32(
711 // CHECK-NEXT: entry:
712 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
713 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
714 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.shr.imm.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], i32 6, i32 1, <4 x i1> [[TMP1]], <4 x i32> undef)
715 // CHECK-NEXT: ret <4 x i32> [[TMP2]]
716 //
test_vshrq_x_n_u32(uint32x4_t a,mve_pred16_t p)717 uint32x4_t test_vshrq_x_n_u32(uint32x4_t a, mve_pred16_t p)
718 {
719 #ifdef POLYMORPHIC
720 return vshrq_x(a, 6, p);
721 #else /* POLYMORPHIC */
722 return vshrq_x_n_u32(a, 6, p);
723 #endif /* POLYMORPHIC */
724 }
725
726 // CHECK-LABEL: @test_vqshlq_n_s8(
727 // CHECK-NEXT: entry:
728 // CHECK-NEXT: [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vqshl.imm.v16i8(<16 x i8> [[A:%.*]], i32 3, i32 0)
729 // CHECK-NEXT: ret <16 x i8> [[TMP0]]
730 //
test_vqshlq_n_s8(int8x16_t a)731 int8x16_t test_vqshlq_n_s8(int8x16_t a)
732 {
733 #ifdef POLYMORPHIC
734 return vqshlq_n(a, 3);
735 #else /* POLYMORPHIC */
736 return vqshlq_n_s8(a, 3);
737 #endif /* POLYMORPHIC */
738 }
739
740 // CHECK-LABEL: @test_vqshlq_n_s16(
741 // CHECK-NEXT: entry:
742 // CHECK-NEXT: [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vqshl.imm.v8i16(<8 x i16> [[A:%.*]], i32 4, i32 0)
743 // CHECK-NEXT: ret <8 x i16> [[TMP0]]
744 //
test_vqshlq_n_s16(int16x8_t a)745 int16x8_t test_vqshlq_n_s16(int16x8_t a)
746 {
747 #ifdef POLYMORPHIC
748 return vqshlq_n(a, 4);
749 #else /* POLYMORPHIC */
750 return vqshlq_n_s16(a, 4);
751 #endif /* POLYMORPHIC */
752 }
753
754 // CHECK-LABEL: @test_vqshlq_n_s32(
755 // CHECK-NEXT: entry:
756 // CHECK-NEXT: [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vqshl.imm.v4i32(<4 x i32> [[A:%.*]], i32 4, i32 0)
757 // CHECK-NEXT: ret <4 x i32> [[TMP0]]
758 //
test_vqshlq_n_s32(int32x4_t a)759 int32x4_t test_vqshlq_n_s32(int32x4_t a)
760 {
761 #ifdef POLYMORPHIC
762 return vqshlq_n(a, 4);
763 #else /* POLYMORPHIC */
764 return vqshlq_n_s32(a, 4);
765 #endif /* POLYMORPHIC */
766 }
767
768 // CHECK-LABEL: @test_vqshlq_n_u8(
769 // CHECK-NEXT: entry:
770 // CHECK-NEXT: [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vqshl.imm.v16i8(<16 x i8> [[A:%.*]], i32 0, i32 1)
771 // CHECK-NEXT: ret <16 x i8> [[TMP0]]
772 //
test_vqshlq_n_u8(uint8x16_t a)773 uint8x16_t test_vqshlq_n_u8(uint8x16_t a)
774 {
775 #ifdef POLYMORPHIC
776 return vqshlq_n(a, 0);
777 #else /* POLYMORPHIC */
778 return vqshlq_n_u8(a, 0);
779 #endif /* POLYMORPHIC */
780 }
781
782 // CHECK-LABEL: @test_vqshlq_n_u16(
783 // CHECK-NEXT: entry:
784 // CHECK-NEXT: [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vqshl.imm.v8i16(<8 x i16> [[A:%.*]], i32 13, i32 1)
785 // CHECK-NEXT: ret <8 x i16> [[TMP0]]
786 //
test_vqshlq_n_u16(uint16x8_t a)787 uint16x8_t test_vqshlq_n_u16(uint16x8_t a)
788 {
789 #ifdef POLYMORPHIC
790 return vqshlq_n(a, 13);
791 #else /* POLYMORPHIC */
792 return vqshlq_n_u16(a, 13);
793 #endif /* POLYMORPHIC */
794 }
795
796 // CHECK-LABEL: @test_vqshlq_n_u32(
797 // CHECK-NEXT: entry:
798 // CHECK-NEXT: [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vqshl.imm.v4i32(<4 x i32> [[A:%.*]], i32 6, i32 1)
799 // CHECK-NEXT: ret <4 x i32> [[TMP0]]
800 //
test_vqshlq_n_u32(uint32x4_t a)801 uint32x4_t test_vqshlq_n_u32(uint32x4_t a)
802 {
803 #ifdef POLYMORPHIC
804 return vqshlq_n(a, 6);
805 #else /* POLYMORPHIC */
806 return vqshlq_n_u32(a, 6);
807 #endif /* POLYMORPHIC */
808 }
809
810 // CHECK-LABEL: @test_vqshluq_n_s8(
811 // CHECK-NEXT: entry:
812 // CHECK-NEXT: [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vqshlu.imm.v16i8(<16 x i8> [[A:%.*]], i32 5)
813 // CHECK-NEXT: ret <16 x i8> [[TMP0]]
814 //
test_vqshluq_n_s8(int8x16_t a)815 uint8x16_t test_vqshluq_n_s8(int8x16_t a)
816 {
817 #ifdef POLYMORPHIC
818 return vqshluq(a, 5);
819 #else /* POLYMORPHIC */
820 return vqshluq_n_s8(a, 5);
821 #endif /* POLYMORPHIC */
822 }
823
824 // CHECK-LABEL: @test_vqshluq_n_s16(
825 // CHECK-NEXT: entry:
826 // CHECK-NEXT: [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vqshlu.imm.v8i16(<8 x i16> [[A:%.*]], i32 5)
827 // CHECK-NEXT: ret <8 x i16> [[TMP0]]
828 //
test_vqshluq_n_s16(int16x8_t a)829 uint16x8_t test_vqshluq_n_s16(int16x8_t a)
830 {
831 #ifdef POLYMORPHIC
832 return vqshluq(a, 5);
833 #else /* POLYMORPHIC */
834 return vqshluq_n_s16(a, 5);
835 #endif /* POLYMORPHIC */
836 }
837
838 // CHECK-LABEL: @test_vqshluq_n_s32(
839 // CHECK-NEXT: entry:
840 // CHECK-NEXT: [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vqshlu.imm.v4i32(<4 x i32> [[A:%.*]], i32 4)
841 // CHECK-NEXT: ret <4 x i32> [[TMP0]]
842 //
test_vqshluq_n_s32(int32x4_t a)843 uint32x4_t test_vqshluq_n_s32(int32x4_t a)
844 {
845 #ifdef POLYMORPHIC
846 return vqshluq(a, 4);
847 #else /* POLYMORPHIC */
848 return vqshluq_n_s32(a, 4);
849 #endif /* POLYMORPHIC */
850 }
851
852 // CHECK-LABEL: @test_vrshrq_n_s8(
853 // CHECK-NEXT: entry:
854 // CHECK-NEXT: [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vrshr.imm.v16i8(<16 x i8> [[A:%.*]], i32 4, i32 0)
855 // CHECK-NEXT: ret <16 x i8> [[TMP0]]
856 //
test_vrshrq_n_s8(int8x16_t a)857 int8x16_t test_vrshrq_n_s8(int8x16_t a)
858 {
859 #ifdef POLYMORPHIC
860 return vrshrq(a, 4);
861 #else /* POLYMORPHIC */
862 return vrshrq_n_s8(a, 4);
863 #endif /* POLYMORPHIC */
864 }
865
866 // CHECK-LABEL: @test_vrshrq_n_s16(
867 // CHECK-NEXT: entry:
868 // CHECK-NEXT: [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vrshr.imm.v8i16(<8 x i16> [[A:%.*]], i32 12, i32 0)
869 // CHECK-NEXT: ret <8 x i16> [[TMP0]]
870 //
test_vrshrq_n_s16(int16x8_t a)871 int16x8_t test_vrshrq_n_s16(int16x8_t a)
872 {
873 #ifdef POLYMORPHIC
874 return vrshrq(a, 12);
875 #else /* POLYMORPHIC */
876 return vrshrq_n_s16(a, 12);
877 #endif /* POLYMORPHIC */
878 }
879
880 // CHECK-LABEL: @test_vrshrq_n_s32(
881 // CHECK-NEXT: entry:
882 // CHECK-NEXT: [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vrshr.imm.v4i32(<4 x i32> [[A:%.*]], i32 30, i32 0)
883 // CHECK-NEXT: ret <4 x i32> [[TMP0]]
884 //
test_vrshrq_n_s32(int32x4_t a)885 int32x4_t test_vrshrq_n_s32(int32x4_t a)
886 {
887 #ifdef POLYMORPHIC
888 return vrshrq(a, 30);
889 #else /* POLYMORPHIC */
890 return vrshrq_n_s32(a, 30);
891 #endif /* POLYMORPHIC */
892 }
893
894 // CHECK-LABEL: @test_vrshrq_n_u8(
895 // CHECK-NEXT: entry:
896 // CHECK-NEXT: [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vrshr.imm.v16i8(<16 x i8> [[A:%.*]], i32 1, i32 1)
897 // CHECK-NEXT: ret <16 x i8> [[TMP0]]
898 //
test_vrshrq_n_u8(uint8x16_t a)899 uint8x16_t test_vrshrq_n_u8(uint8x16_t a)
900 {
901 #ifdef POLYMORPHIC
902 return vrshrq(a, 1);
903 #else /* POLYMORPHIC */
904 return vrshrq_n_u8(a, 1);
905 #endif /* POLYMORPHIC */
906 }
907
908 // CHECK-LABEL: @test_vrshrq_n_u16(
909 // CHECK-NEXT: entry:
910 // CHECK-NEXT: [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vrshr.imm.v8i16(<8 x i16> [[A:%.*]], i32 15, i32 1)
911 // CHECK-NEXT: ret <8 x i16> [[TMP0]]
912 //
test_vrshrq_n_u16(uint16x8_t a)913 uint16x8_t test_vrshrq_n_u16(uint16x8_t a)
914 {
915 #ifdef POLYMORPHIC
916 return vrshrq(a, 15);
917 #else /* POLYMORPHIC */
918 return vrshrq_n_u16(a, 15);
919 #endif /* POLYMORPHIC */
920 }
921
922 // CHECK-LABEL: @test_vrshrq_n_u32(
923 // CHECK-NEXT: entry:
924 // CHECK-NEXT: [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vrshr.imm.v4i32(<4 x i32> [[A:%.*]], i32 20, i32 1)
925 // CHECK-NEXT: ret <4 x i32> [[TMP0]]
926 //
test_vrshrq_n_u32(uint32x4_t a)927 uint32x4_t test_vrshrq_n_u32(uint32x4_t a)
928 {
929 #ifdef POLYMORPHIC
930 return vrshrq(a, 20);
931 #else /* POLYMORPHIC */
932 return vrshrq_n_u32(a, 20);
933 #endif /* POLYMORPHIC */
934 }
935
936 // CHECK-LABEL: @test_vqshlq_m_n_s8(
937 // CHECK-NEXT: entry:
938 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
939 // CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]])
940 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vqshl.imm.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], i32 6, i32 0, <16 x i1> [[TMP1]], <16 x i8> [[INACTIVE:%.*]])
941 // CHECK-NEXT: ret <16 x i8> [[TMP2]]
942 //
test_vqshlq_m_n_s8(int8x16_t inactive,int8x16_t a,mve_pred16_t p)943 int8x16_t test_vqshlq_m_n_s8(int8x16_t inactive, int8x16_t a, mve_pred16_t p)
944 {
945 #ifdef POLYMORPHIC
946 return vqshlq_m_n(inactive, a, 6, p);
947 #else /* POLYMORPHIC */
948 return vqshlq_m_n_s8(inactive, a, 6, p);
949 #endif /* POLYMORPHIC */
950 }
951
952 // CHECK-LABEL: @test_vqshlq_m_n_s16(
953 // CHECK-NEXT: entry:
954 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
955 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
956 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vqshl.imm.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], i32 13, i32 0, <8 x i1> [[TMP1]], <8 x i16> [[INACTIVE:%.*]])
957 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
958 //
test_vqshlq_m_n_s16(int16x8_t inactive,int16x8_t a,mve_pred16_t p)959 int16x8_t test_vqshlq_m_n_s16(int16x8_t inactive, int16x8_t a, mve_pred16_t p)
960 {
961 #ifdef POLYMORPHIC
962 return vqshlq_m_n(inactive, a, 13, p);
963 #else /* POLYMORPHIC */
964 return vqshlq_m_n_s16(inactive, a, 13, p);
965 #endif /* POLYMORPHIC */
966 }
967
968 // CHECK-LABEL: @test_vqshlq_m_n_s32(
969 // CHECK-NEXT: entry:
970 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
971 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
972 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vqshl.imm.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], i32 14, i32 0, <4 x i1> [[TMP1]], <4 x i32> [[INACTIVE:%.*]])
973 // CHECK-NEXT: ret <4 x i32> [[TMP2]]
974 //
test_vqshlq_m_n_s32(int32x4_t inactive,int32x4_t a,mve_pred16_t p)975 int32x4_t test_vqshlq_m_n_s32(int32x4_t inactive, int32x4_t a, mve_pred16_t p)
976 {
977 #ifdef POLYMORPHIC
978 return vqshlq_m_n(inactive, a, 14, p);
979 #else /* POLYMORPHIC */
980 return vqshlq_m_n_s32(inactive, a, 14, p);
981 #endif /* POLYMORPHIC */
982 }
983
984 // CHECK-LABEL: @test_vqshlq_m_n_u8(
985 // CHECK-NEXT: entry:
986 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
987 // CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]])
988 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vqshl.imm.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], i32 4, i32 1, <16 x i1> [[TMP1]], <16 x i8> [[INACTIVE:%.*]])
989 // CHECK-NEXT: ret <16 x i8> [[TMP2]]
990 //
test_vqshlq_m_n_u8(uint8x16_t inactive,uint8x16_t a,mve_pred16_t p)991 uint8x16_t test_vqshlq_m_n_u8(uint8x16_t inactive, uint8x16_t a, mve_pred16_t p)
992 {
993 #ifdef POLYMORPHIC
994 return vqshlq_m_n(inactive, a, 4, p);
995 #else /* POLYMORPHIC */
996 return vqshlq_m_n_u8(inactive, a, 4, p);
997 #endif /* POLYMORPHIC */
998 }
999
1000 // CHECK-LABEL: @test_vqshlq_m_n_u16(
1001 // CHECK-NEXT: entry:
1002 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1003 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
1004 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vqshl.imm.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], i32 9, i32 1, <8 x i1> [[TMP1]], <8 x i16> [[INACTIVE:%.*]])
1005 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
1006 //
test_vqshlq_m_n_u16(uint16x8_t inactive,uint16x8_t a,mve_pred16_t p)1007 uint16x8_t test_vqshlq_m_n_u16(uint16x8_t inactive, uint16x8_t a, mve_pred16_t p)
1008 {
1009 #ifdef POLYMORPHIC
1010 return vqshlq_m_n(inactive, a, 9, p);
1011 #else /* POLYMORPHIC */
1012 return vqshlq_m_n_u16(inactive, a, 9, p);
1013 #endif /* POLYMORPHIC */
1014 }
1015
1016 // CHECK-LABEL: @test_vqshlq_m_n_u32(
1017 // CHECK-NEXT: entry:
1018 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1019 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
1020 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vqshl.imm.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], i32 25, i32 1, <4 x i1> [[TMP1]], <4 x i32> [[INACTIVE:%.*]])
1021 // CHECK-NEXT: ret <4 x i32> [[TMP2]]
1022 //
test_vqshlq_m_n_u32(uint32x4_t inactive,uint32x4_t a,mve_pred16_t p)1023 uint32x4_t test_vqshlq_m_n_u32(uint32x4_t inactive, uint32x4_t a, mve_pred16_t p)
1024 {
1025 #ifdef POLYMORPHIC
1026 return vqshlq_m_n(inactive, a, 25, p);
1027 #else /* POLYMORPHIC */
1028 return vqshlq_m_n_u32(inactive, a, 25, p);
1029 #endif /* POLYMORPHIC */
1030 }
1031
1032 // CHECK-LABEL: @test_vqshluq_m_n_s8(
1033 // CHECK-NEXT: entry:
1034 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1035 // CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]])
1036 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vqshlu.imm.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], i32 2, <16 x i1> [[TMP1]], <16 x i8> [[INACTIVE:%.*]])
1037 // CHECK-NEXT: ret <16 x i8> [[TMP2]]
1038 //
test_vqshluq_m_n_s8(uint8x16_t inactive,int8x16_t a,mve_pred16_t p)1039 uint8x16_t test_vqshluq_m_n_s8(uint8x16_t inactive, int8x16_t a, mve_pred16_t p)
1040 {
1041 #ifdef POLYMORPHIC
1042 return vqshluq_m(inactive, a, 2, p);
1043 #else /* POLYMORPHIC */
1044 return vqshluq_m_n_s8(inactive, a, 2, p);
1045 #endif /* POLYMORPHIC */
1046 }
1047
1048 // CHECK-LABEL: @test_vqshluq_m_n_s16(
1049 // CHECK-NEXT: entry:
1050 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1051 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
1052 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vqshlu.imm.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], i32 12, <8 x i1> [[TMP1]], <8 x i16> [[INACTIVE:%.*]])
1053 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
1054 //
test_vqshluq_m_n_s16(uint16x8_t inactive,int16x8_t a,mve_pred16_t p)1055 uint16x8_t test_vqshluq_m_n_s16(uint16x8_t inactive, int16x8_t a, mve_pred16_t p)
1056 {
1057 #ifdef POLYMORPHIC
1058 return vqshluq_m(inactive, a, 12, p);
1059 #else /* POLYMORPHIC */
1060 return vqshluq_m_n_s16(inactive, a, 12, p);
1061 #endif /* POLYMORPHIC */
1062 }
1063
1064 // CHECK-LABEL: @test_vqshluq_m_n_s32(
1065 // CHECK-NEXT: entry:
1066 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1067 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
1068 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vqshlu.imm.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], i32 24, <4 x i1> [[TMP1]], <4 x i32> [[INACTIVE:%.*]])
1069 // CHECK-NEXT: ret <4 x i32> [[TMP2]]
1070 //
test_vqshluq_m_n_s32(uint32x4_t inactive,int32x4_t a,mve_pred16_t p)1071 uint32x4_t test_vqshluq_m_n_s32(uint32x4_t inactive, int32x4_t a, mve_pred16_t p)
1072 {
1073 #ifdef POLYMORPHIC
1074 return vqshluq_m(inactive, a, 24, p);
1075 #else /* POLYMORPHIC */
1076 return vqshluq_m_n_s32(inactive, a, 24, p);
1077 #endif /* POLYMORPHIC */
1078 }
1079
1080 // CHECK-LABEL: @test_vrshrq_m_n_s8(
1081 // CHECK-NEXT: entry:
1082 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1083 // CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]])
1084 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vrshr.imm.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], i32 2, i32 0, <16 x i1> [[TMP1]], <16 x i8> [[INACTIVE:%.*]])
1085 // CHECK-NEXT: ret <16 x i8> [[TMP2]]
1086 //
test_vrshrq_m_n_s8(int8x16_t inactive,int8x16_t a,mve_pred16_t p)1087 int8x16_t test_vrshrq_m_n_s8(int8x16_t inactive, int8x16_t a, mve_pred16_t p)
1088 {
1089 #ifdef POLYMORPHIC
1090 return vrshrq_m(inactive, a, 2, p);
1091 #else /* POLYMORPHIC */
1092 return vrshrq_m_n_s8(inactive, a, 2, p);
1093 #endif /* POLYMORPHIC */
1094 }
1095
1096 // CHECK-LABEL: @test_vrshrq_m_n_s16(
1097 // CHECK-NEXT: entry:
1098 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1099 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
1100 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vrshr.imm.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], i32 11, i32 0, <8 x i1> [[TMP1]], <8 x i16> [[INACTIVE:%.*]])
1101 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
1102 //
test_vrshrq_m_n_s16(int16x8_t inactive,int16x8_t a,mve_pred16_t p)1103 int16x8_t test_vrshrq_m_n_s16(int16x8_t inactive, int16x8_t a, mve_pred16_t p)
1104 {
1105 #ifdef POLYMORPHIC
1106 return vrshrq_m(inactive, a, 11, p);
1107 #else /* POLYMORPHIC */
1108 return vrshrq_m_n_s16(inactive, a, 11, p);
1109 #endif /* POLYMORPHIC */
1110 }
1111
1112 // CHECK-LABEL: @test_vrshrq_m_n_s32(
1113 // CHECK-NEXT: entry:
1114 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1115 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
1116 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vrshr.imm.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], i32 24, i32 0, <4 x i1> [[TMP1]], <4 x i32> [[INACTIVE:%.*]])
1117 // CHECK-NEXT: ret <4 x i32> [[TMP2]]
1118 //
test_vrshrq_m_n_s32(int32x4_t inactive,int32x4_t a,mve_pred16_t p)1119 int32x4_t test_vrshrq_m_n_s32(int32x4_t inactive, int32x4_t a, mve_pred16_t p)
1120 {
1121 #ifdef POLYMORPHIC
1122 return vrshrq_m(inactive, a, 24, p);
1123 #else /* POLYMORPHIC */
1124 return vrshrq_m_n_s32(inactive, a, 24, p);
1125 #endif /* POLYMORPHIC */
1126 }
1127
1128 // CHECK-LABEL: @test_vrshrq_m_n_u8(
1129 // CHECK-NEXT: entry:
1130 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1131 // CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]])
1132 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vrshr.imm.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], i32 7, i32 1, <16 x i1> [[TMP1]], <16 x i8> [[INACTIVE:%.*]])
1133 // CHECK-NEXT: ret <16 x i8> [[TMP2]]
1134 //
test_vrshrq_m_n_u8(uint8x16_t inactive,uint8x16_t a,mve_pred16_t p)1135 uint8x16_t test_vrshrq_m_n_u8(uint8x16_t inactive, uint8x16_t a, mve_pred16_t p)
1136 {
1137 #ifdef POLYMORPHIC
1138 return vrshrq_m(inactive, a, 7, p);
1139 #else /* POLYMORPHIC */
1140 return vrshrq_m_n_u8(inactive, a, 7, p);
1141 #endif /* POLYMORPHIC */
1142 }
1143
1144 // CHECK-LABEL: @test_vrshrq_m_n_u16(
1145 // CHECK-NEXT: entry:
1146 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1147 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
1148 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vrshr.imm.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], i32 4, i32 1, <8 x i1> [[TMP1]], <8 x i16> [[INACTIVE:%.*]])
1149 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
1150 //
test_vrshrq_m_n_u16(uint16x8_t inactive,uint16x8_t a,mve_pred16_t p)1151 uint16x8_t test_vrshrq_m_n_u16(uint16x8_t inactive, uint16x8_t a, mve_pred16_t p)
1152 {
1153 #ifdef POLYMORPHIC
1154 return vrshrq_m(inactive, a, 4, p);
1155 #else /* POLYMORPHIC */
1156 return vrshrq_m_n_u16(inactive, a, 4, p);
1157 #endif /* POLYMORPHIC */
1158 }
1159
1160 // CHECK-LABEL: @test_vrshrq_m_n_u32(
1161 // CHECK-NEXT: entry:
1162 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1163 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
1164 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vrshr.imm.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], i32 27, i32 1, <4 x i1> [[TMP1]], <4 x i32> [[INACTIVE:%.*]])
1165 // CHECK-NEXT: ret <4 x i32> [[TMP2]]
1166 //
test_vrshrq_m_n_u32(uint32x4_t inactive,uint32x4_t a,mve_pred16_t p)1167 uint32x4_t test_vrshrq_m_n_u32(uint32x4_t inactive, uint32x4_t a, mve_pred16_t p)
1168 {
1169 #ifdef POLYMORPHIC
1170 return vrshrq_m(inactive, a, 27, p);
1171 #else /* POLYMORPHIC */
1172 return vrshrq_m_n_u32(inactive, a, 27, p);
1173 #endif /* POLYMORPHIC */
1174 }
1175
1176 // CHECK-LABEL: @test_vrshrq_x_n_s8(
1177 // CHECK-NEXT: entry:
1178 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1179 // CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]])
1180 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vrshr.imm.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], i32 3, i32 0, <16 x i1> [[TMP1]], <16 x i8> undef)
1181 // CHECK-NEXT: ret <16 x i8> [[TMP2]]
1182 //
test_vrshrq_x_n_s8(int8x16_t a,mve_pred16_t p)1183 int8x16_t test_vrshrq_x_n_s8(int8x16_t a, mve_pred16_t p)
1184 {
1185 #ifdef POLYMORPHIC
1186 return vrshrq_x(a, 3, p);
1187 #else /* POLYMORPHIC */
1188 return vrshrq_x_n_s8(a, 3, p);
1189 #endif /* POLYMORPHIC */
1190 }
1191
1192 // CHECK-LABEL: @test_vrshrq_x_n_s16(
1193 // CHECK-NEXT: entry:
1194 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1195 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
1196 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vrshr.imm.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], i32 12, i32 0, <8 x i1> [[TMP1]], <8 x i16> undef)
1197 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
1198 //
test_vrshrq_x_n_s16(int16x8_t a,mve_pred16_t p)1199 int16x8_t test_vrshrq_x_n_s16(int16x8_t a, mve_pred16_t p)
1200 {
1201 #ifdef POLYMORPHIC
1202 return vrshrq_x(a, 12, p);
1203 #else /* POLYMORPHIC */
1204 return vrshrq_x_n_s16(a, 12, p);
1205 #endif /* POLYMORPHIC */
1206 }
1207
1208 // CHECK-LABEL: @test_vrshrq_x_n_s32(
1209 // CHECK-NEXT: entry:
1210 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1211 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
1212 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vrshr.imm.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], i32 20, i32 0, <4 x i1> [[TMP1]], <4 x i32> undef)
1213 // CHECK-NEXT: ret <4 x i32> [[TMP2]]
1214 //
test_vrshrq_x_n_s32(int32x4_t a,mve_pred16_t p)1215 int32x4_t test_vrshrq_x_n_s32(int32x4_t a, mve_pred16_t p)
1216 {
1217 #ifdef POLYMORPHIC
1218 return vrshrq_x(a, 20, p);
1219 #else /* POLYMORPHIC */
1220 return vrshrq_x_n_s32(a, 20, p);
1221 #endif /* POLYMORPHIC */
1222 }
1223
1224 // CHECK-LABEL: @test_vrshrq_x_n_u8(
1225 // CHECK-NEXT: entry:
1226 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1227 // CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]])
1228 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vrshr.imm.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], i32 1, i32 1, <16 x i1> [[TMP1]], <16 x i8> undef)
1229 // CHECK-NEXT: ret <16 x i8> [[TMP2]]
1230 //
test_vrshrq_x_n_u8(uint8x16_t a,mve_pred16_t p)1231 uint8x16_t test_vrshrq_x_n_u8(uint8x16_t a, mve_pred16_t p)
1232 {
1233 #ifdef POLYMORPHIC
1234 return vrshrq_x(a, 1, p);
1235 #else /* POLYMORPHIC */
1236 return vrshrq_x_n_u8(a, 1, p);
1237 #endif /* POLYMORPHIC */
1238 }
1239
1240 // CHECK-LABEL: @test_vrshrq_x_n_u16(
1241 // CHECK-NEXT: entry:
1242 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1243 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
1244 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vrshr.imm.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], i32 13, i32 1, <8 x i1> [[TMP1]], <8 x i16> undef)
1245 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
1246 //
test_vrshrq_x_n_u16(uint16x8_t a,mve_pred16_t p)1247 uint16x8_t test_vrshrq_x_n_u16(uint16x8_t a, mve_pred16_t p)
1248 {
1249 #ifdef POLYMORPHIC
1250 return vrshrq_x(a, 13, p);
1251 #else /* POLYMORPHIC */
1252 return vrshrq_x_n_u16(a, 13, p);
1253 #endif /* POLYMORPHIC */
1254 }
1255
1256 // CHECK-LABEL: @test_vrshrq_x_n_u32(
1257 // CHECK-NEXT: entry:
1258 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1259 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
1260 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vrshr.imm.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], i32 6, i32 1, <4 x i1> [[TMP1]], <4 x i32> undef)
1261 // CHECK-NEXT: ret <4 x i32> [[TMP2]]
1262 //
test_vrshrq_x_n_u32(uint32x4_t a,mve_pred16_t p)1263 uint32x4_t test_vrshrq_x_n_u32(uint32x4_t a, mve_pred16_t p)
1264 {
1265 #ifdef POLYMORPHIC
1266 return vrshrq_x(a, 6, p);
1267 #else /* POLYMORPHIC */
1268 return vrshrq_x_n_u32(a, 6, p);
1269 #endif /* POLYMORPHIC */
1270 }
1271
1272 // CHECK-LABEL: @test_vshllbq_n_s8(
1273 // CHECK-NEXT: entry:
1274 // CHECK-NEXT: [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vshll.imm.v8i16.v16i8(<16 x i8> [[A:%.*]], i32 2, i32 0, i32 0)
1275 // CHECK-NEXT: ret <8 x i16> [[TMP0]]
1276 //
test_vshllbq_n_s8(int8x16_t a)1277 int16x8_t test_vshllbq_n_s8(int8x16_t a)
1278 {
1279 #ifdef POLYMORPHIC
1280 return vshllbq(a, 2);
1281 #else /* POLYMORPHIC */
1282 return vshllbq_n_s8(a, 2);
1283 #endif /* POLYMORPHIC */
1284 }
1285
1286 // CHECK-LABEL: @test_vshllbq_n_s16(
1287 // CHECK-NEXT: entry:
1288 // CHECK-NEXT: [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vshll.imm.v4i32.v8i16(<8 x i16> [[A:%.*]], i32 13, i32 0, i32 0)
1289 // CHECK-NEXT: ret <4 x i32> [[TMP0]]
1290 //
test_vshllbq_n_s16(int16x8_t a)1291 int32x4_t test_vshllbq_n_s16(int16x8_t a)
1292 {
1293 #ifdef POLYMORPHIC
1294 return vshllbq(a, 13);
1295 #else /* POLYMORPHIC */
1296 return vshllbq_n_s16(a, 13);
1297 #endif /* POLYMORPHIC */
1298 }
1299
1300 // CHECK-LABEL: @test_vshllbq_n_u8(
1301 // CHECK-NEXT: entry:
1302 // CHECK-NEXT: [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vshll.imm.v8i16.v16i8(<16 x i8> [[A:%.*]], i32 5, i32 1, i32 0)
1303 // CHECK-NEXT: ret <8 x i16> [[TMP0]]
1304 //
test_vshllbq_n_u8(uint8x16_t a)1305 uint16x8_t test_vshllbq_n_u8(uint8x16_t a)
1306 {
1307 #ifdef POLYMORPHIC
1308 return vshllbq(a, 5);
1309 #else /* POLYMORPHIC */
1310 return vshllbq_n_u8(a, 5);
1311 #endif /* POLYMORPHIC */
1312 }
1313
1314 // CHECK-LABEL: @test_vshllbq_n_u16(
1315 // CHECK-NEXT: entry:
1316 // CHECK-NEXT: [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vshll.imm.v4i32.v8i16(<8 x i16> [[A:%.*]], i32 6, i32 1, i32 0)
1317 // CHECK-NEXT: ret <4 x i32> [[TMP0]]
1318 //
test_vshllbq_n_u16(uint16x8_t a)1319 uint32x4_t test_vshllbq_n_u16(uint16x8_t a)
1320 {
1321 #ifdef POLYMORPHIC
1322 return vshllbq(a, 6);
1323 #else /* POLYMORPHIC */
1324 return vshllbq_n_u16(a, 6);
1325 #endif /* POLYMORPHIC */
1326 }
1327
1328 // CHECK-LABEL: @test_vshlltq_n_s8(
1329 // CHECK-NEXT: entry:
1330 // CHECK-NEXT: [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vshll.imm.v8i16.v16i8(<16 x i8> [[A:%.*]], i32 7, i32 0, i32 1)
1331 // CHECK-NEXT: ret <8 x i16> [[TMP0]]
1332 //
test_vshlltq_n_s8(int8x16_t a)1333 int16x8_t test_vshlltq_n_s8(int8x16_t a)
1334 {
1335 #ifdef POLYMORPHIC
1336 return vshlltq(a, 7);
1337 #else /* POLYMORPHIC */
1338 return vshlltq_n_s8(a, 7);
1339 #endif /* POLYMORPHIC */
1340 }
1341
1342 // CHECK-LABEL: @test_vshlltq_n_s16(
1343 // CHECK-NEXT: entry:
1344 // CHECK-NEXT: [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vshll.imm.v4i32.v8i16(<8 x i16> [[A:%.*]], i32 2, i32 0, i32 1)
1345 // CHECK-NEXT: ret <4 x i32> [[TMP0]]
1346 //
test_vshlltq_n_s16(int16x8_t a)1347 int32x4_t test_vshlltq_n_s16(int16x8_t a)
1348 {
1349 #ifdef POLYMORPHIC
1350 return vshlltq(a, 2);
1351 #else /* POLYMORPHIC */
1352 return vshlltq_n_s16(a, 2);
1353 #endif /* POLYMORPHIC */
1354 }
1355
1356 // CHECK-LABEL: @test_vshlltq_n_u8(
1357 // CHECK-NEXT: entry:
1358 // CHECK-NEXT: [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vshll.imm.v8i16.v16i8(<16 x i8> [[A:%.*]], i32 7, i32 1, i32 1)
1359 // CHECK-NEXT: ret <8 x i16> [[TMP0]]
1360 //
test_vshlltq_n_u8(uint8x16_t a)1361 uint16x8_t test_vshlltq_n_u8(uint8x16_t a)
1362 {
1363 #ifdef POLYMORPHIC
1364 return vshlltq(a, 7);
1365 #else /* POLYMORPHIC */
1366 return vshlltq_n_u8(a, 7);
1367 #endif /* POLYMORPHIC */
1368 }
1369
1370 // CHECK-LABEL: @test_vshlltq_n_u16(
1371 // CHECK-NEXT: entry:
1372 // CHECK-NEXT: [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vshll.imm.v4i32.v8i16(<8 x i16> [[A:%.*]], i32 14, i32 1, i32 1)
1373 // CHECK-NEXT: ret <4 x i32> [[TMP0]]
1374 //
test_vshlltq_n_u16(uint16x8_t a)1375 uint32x4_t test_vshlltq_n_u16(uint16x8_t a)
1376 {
1377 #ifdef POLYMORPHIC
1378 return vshlltq(a, 14);
1379 #else /* POLYMORPHIC */
1380 return vshlltq_n_u16(a, 14);
1381 #endif /* POLYMORPHIC */
1382 }
1383
1384 // CHECK-LABEL: @test_vshllbq_m_n_s8(
1385 // CHECK-NEXT: entry:
1386 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1387 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
1388 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vshll.imm.predicated.v8i16.v16i8.v8i1(<16 x i8> [[A:%.*]], i32 6, i32 0, i32 0, <8 x i1> [[TMP1]], <8 x i16> [[INACTIVE:%.*]])
1389 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
1390 //
test_vshllbq_m_n_s8(int16x8_t inactive,int8x16_t a,mve_pred16_t p)1391 int16x8_t test_vshllbq_m_n_s8(int16x8_t inactive, int8x16_t a, mve_pred16_t p)
1392 {
1393 #ifdef POLYMORPHIC
1394 return vshllbq_m(inactive, a, 6, p);
1395 #else /* POLYMORPHIC */
1396 return vshllbq_m_n_s8(inactive, a, 6, p);
1397 #endif /* POLYMORPHIC */
1398 }
1399
1400 // CHECK-LABEL: @test_vshllbq_m_n_s16(
1401 // CHECK-NEXT: entry:
1402 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1403 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
1404 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vshll.imm.predicated.v4i32.v8i16.v4i1(<8 x i16> [[A:%.*]], i32 10, i32 0, i32 0, <4 x i1> [[TMP1]], <4 x i32> [[INACTIVE:%.*]])
1405 // CHECK-NEXT: ret <4 x i32> [[TMP2]]
1406 //
test_vshllbq_m_n_s16(int32x4_t inactive,int16x8_t a,mve_pred16_t p)1407 int32x4_t test_vshllbq_m_n_s16(int32x4_t inactive, int16x8_t a, mve_pred16_t p)
1408 {
1409 #ifdef POLYMORPHIC
1410 return vshllbq_m(inactive, a, 10, p);
1411 #else /* POLYMORPHIC */
1412 return vshllbq_m_n_s16(inactive, a, 10, p);
1413 #endif /* POLYMORPHIC */
1414 }
1415
1416 // CHECK-LABEL: @test_vshllbq_m_n_u8(
1417 // CHECK-NEXT: entry:
1418 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1419 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
1420 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vshll.imm.predicated.v8i16.v16i8.v8i1(<16 x i8> [[A:%.*]], i32 3, i32 1, i32 0, <8 x i1> [[TMP1]], <8 x i16> [[INACTIVE:%.*]])
1421 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
1422 //
test_vshllbq_m_n_u8(uint16x8_t inactive,uint8x16_t a,mve_pred16_t p)1423 uint16x8_t test_vshllbq_m_n_u8(uint16x8_t inactive, uint8x16_t a, mve_pred16_t p)
1424 {
1425 #ifdef POLYMORPHIC
1426 return vshllbq_m(inactive, a, 3, p);
1427 #else /* POLYMORPHIC */
1428 return vshllbq_m_n_u8(inactive, a, 3, p);
1429 #endif /* POLYMORPHIC */
1430 }
1431
1432 // CHECK-LABEL: @test_vshllbq_m_n_u16(
1433 // CHECK-NEXT: entry:
1434 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1435 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
1436 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vshll.imm.predicated.v4i32.v8i16.v4i1(<8 x i16> [[A:%.*]], i32 14, i32 1, i32 0, <4 x i1> [[TMP1]], <4 x i32> [[INACTIVE:%.*]])
1437 // CHECK-NEXT: ret <4 x i32> [[TMP2]]
1438 //
test_vshllbq_m_n_u16(uint32x4_t inactive,uint16x8_t a,mve_pred16_t p)1439 uint32x4_t test_vshllbq_m_n_u16(uint32x4_t inactive, uint16x8_t a, mve_pred16_t p)
1440 {
1441 #ifdef POLYMORPHIC
1442 return vshllbq_m(inactive, a, 14, p);
1443 #else /* POLYMORPHIC */
1444 return vshllbq_m_n_u16(inactive, a, 14, p);
1445 #endif /* POLYMORPHIC */
1446 }
1447
1448 // CHECK-LABEL: @test_vshlltq_m_n_s8(
1449 // CHECK-NEXT: entry:
1450 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1451 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
1452 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vshll.imm.predicated.v8i16.v16i8.v8i1(<16 x i8> [[A:%.*]], i32 4, i32 0, i32 1, <8 x i1> [[TMP1]], <8 x i16> [[INACTIVE:%.*]])
1453 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
1454 //
test_vshlltq_m_n_s8(int16x8_t inactive,int8x16_t a,mve_pred16_t p)1455 int16x8_t test_vshlltq_m_n_s8(int16x8_t inactive, int8x16_t a, mve_pred16_t p)
1456 {
1457 #ifdef POLYMORPHIC
1458 return vshlltq_m(inactive, a, 4, p);
1459 #else /* POLYMORPHIC */
1460 return vshlltq_m_n_s8(inactive, a, 4, p);
1461 #endif /* POLYMORPHIC */
1462 }
1463
1464 // CHECK-LABEL: @test_vshlltq_m_n_s16(
1465 // CHECK-NEXT: entry:
1466 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1467 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
1468 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vshll.imm.predicated.v4i32.v8i16.v4i1(<8 x i16> [[A:%.*]], i32 12, i32 0, i32 1, <4 x i1> [[TMP1]], <4 x i32> [[INACTIVE:%.*]])
1469 // CHECK-NEXT: ret <4 x i32> [[TMP2]]
1470 //
test_vshlltq_m_n_s16(int32x4_t inactive,int16x8_t a,mve_pred16_t p)1471 int32x4_t test_vshlltq_m_n_s16(int32x4_t inactive, int16x8_t a, mve_pred16_t p)
1472 {
1473 #ifdef POLYMORPHIC
1474 return vshlltq_m(inactive, a, 12, p);
1475 #else /* POLYMORPHIC */
1476 return vshlltq_m_n_s16(inactive, a, 12, p);
1477 #endif /* POLYMORPHIC */
1478 }
1479
1480 // CHECK-LABEL: @test_vshlltq_m_n_u8(
1481 // CHECK-NEXT: entry:
1482 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1483 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
1484 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vshll.imm.predicated.v8i16.v16i8.v8i1(<16 x i8> [[A:%.*]], i32 2, i32 1, i32 1, <8 x i1> [[TMP1]], <8 x i16> [[INACTIVE:%.*]])
1485 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
1486 //
test_vshlltq_m_n_u8(uint16x8_t inactive,uint8x16_t a,mve_pred16_t p)1487 uint16x8_t test_vshlltq_m_n_u8(uint16x8_t inactive, uint8x16_t a, mve_pred16_t p)
1488 {
1489 #ifdef POLYMORPHIC
1490 return vshlltq_m(inactive, a, 2, p);
1491 #else /* POLYMORPHIC */
1492 return vshlltq_m_n_u8(inactive, a, 2, p);
1493 #endif /* POLYMORPHIC */
1494 }
1495
1496 // CHECK-LABEL: @test_vshlltq_m_n_u16(
1497 // CHECK-NEXT: entry:
1498 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1499 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
1500 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vshll.imm.predicated.v4i32.v8i16.v4i1(<8 x i16> [[A:%.*]], i32 9, i32 1, i32 1, <4 x i1> [[TMP1]], <4 x i32> [[INACTIVE:%.*]])
1501 // CHECK-NEXT: ret <4 x i32> [[TMP2]]
1502 //
test_vshlltq_m_n_u16(uint32x4_t inactive,uint16x8_t a,mve_pred16_t p)1503 uint32x4_t test_vshlltq_m_n_u16(uint32x4_t inactive, uint16x8_t a, mve_pred16_t p)
1504 {
1505 #ifdef POLYMORPHIC
1506 return vshlltq_m(inactive, a, 9, p);
1507 #else /* POLYMORPHIC */
1508 return vshlltq_m_n_u16(inactive, a, 9, p);
1509 #endif /* POLYMORPHIC */
1510 }
1511
1512 // CHECK-LABEL: @test_vshllbq_x_n_s8(
1513 // CHECK-NEXT: entry:
1514 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1515 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
1516 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vshll.imm.predicated.v8i16.v16i8.v8i1(<16 x i8> [[A:%.*]], i32 1, i32 0, i32 0, <8 x i1> [[TMP1]], <8 x i16> undef)
1517 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
1518 //
test_vshllbq_x_n_s8(int8x16_t a,mve_pred16_t p)1519 int16x8_t test_vshllbq_x_n_s8(int8x16_t a, mve_pred16_t p)
1520 {
1521 #ifdef POLYMORPHIC
1522 return vshllbq_x(a, 1, p);
1523 #else /* POLYMORPHIC */
1524 return vshllbq_x_n_s8(a, 1, p);
1525 #endif /* POLYMORPHIC */
1526 }
1527
1528 // CHECK-LABEL: @test_vshllbq_x_n_s16(
1529 // CHECK-NEXT: entry:
1530 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1531 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
1532 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vshll.imm.predicated.v4i32.v8i16.v4i1(<8 x i16> [[A:%.*]], i32 10, i32 0, i32 0, <4 x i1> [[TMP1]], <4 x i32> undef)
1533 // CHECK-NEXT: ret <4 x i32> [[TMP2]]
1534 //
test_vshllbq_x_n_s16(int16x8_t a,mve_pred16_t p)1535 int32x4_t test_vshllbq_x_n_s16(int16x8_t a, mve_pred16_t p)
1536 {
1537 #ifdef POLYMORPHIC
1538 return vshllbq_x(a, 10, p);
1539 #else /* POLYMORPHIC */
1540 return vshllbq_x_n_s16(a, 10, p);
1541 #endif /* POLYMORPHIC */
1542 }
1543
1544 // CHECK-LABEL: @test_vshllbq_x_n_u8(
1545 // CHECK-NEXT: entry:
1546 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1547 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
1548 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vshll.imm.predicated.v8i16.v16i8.v8i1(<16 x i8> [[A:%.*]], i32 6, i32 1, i32 0, <8 x i1> [[TMP1]], <8 x i16> undef)
1549 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
1550 //
test_vshllbq_x_n_u8(uint8x16_t a,mve_pred16_t p)1551 uint16x8_t test_vshllbq_x_n_u8(uint8x16_t a, mve_pred16_t p)
1552 {
1553 #ifdef POLYMORPHIC
1554 return vshllbq_x(a, 6, p);
1555 #else /* POLYMORPHIC */
1556 return vshllbq_x_n_u8(a, 6, p);
1557 #endif /* POLYMORPHIC */
1558 }
1559
1560 // CHECK-LABEL: @test_vshllbq_x_n_u16(
1561 // CHECK-NEXT: entry:
1562 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1563 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
1564 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vshll.imm.predicated.v4i32.v8i16.v4i1(<8 x i16> [[A:%.*]], i32 10, i32 1, i32 0, <4 x i1> [[TMP1]], <4 x i32> undef)
1565 // CHECK-NEXT: ret <4 x i32> [[TMP2]]
1566 //
test_vshllbq_x_n_u16(uint16x8_t a,mve_pred16_t p)1567 uint32x4_t test_vshllbq_x_n_u16(uint16x8_t a, mve_pred16_t p)
1568 {
1569 #ifdef POLYMORPHIC
1570 return vshllbq_x(a, 10, p);
1571 #else /* POLYMORPHIC */
1572 return vshllbq_x_n_u16(a, 10, p);
1573 #endif /* POLYMORPHIC */
1574 }
1575
1576 // CHECK-LABEL: @test_vshlltq_x_n_s8(
1577 // CHECK-NEXT: entry:
1578 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1579 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
1580 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vshll.imm.predicated.v8i16.v16i8.v8i1(<16 x i8> [[A:%.*]], i32 2, i32 0, i32 1, <8 x i1> [[TMP1]], <8 x i16> undef)
1581 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
1582 //
test_vshlltq_x_n_s8(int8x16_t a,mve_pred16_t p)1583 int16x8_t test_vshlltq_x_n_s8(int8x16_t a, mve_pred16_t p)
1584 {
1585 #ifdef POLYMORPHIC
1586 return vshlltq_x(a, 2, p);
1587 #else /* POLYMORPHIC */
1588 return vshlltq_x_n_s8(a, 2, p);
1589 #endif /* POLYMORPHIC */
1590 }
1591
1592 // CHECK-LABEL: @test_vshlltq_x_n_s16(
1593 // CHECK-NEXT: entry:
1594 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1595 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
1596 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vshll.imm.predicated.v4i32.v8i16.v4i1(<8 x i16> [[A:%.*]], i32 6, i32 0, i32 1, <4 x i1> [[TMP1]], <4 x i32> undef)
1597 // CHECK-NEXT: ret <4 x i32> [[TMP2]]
1598 //
test_vshlltq_x_n_s16(int16x8_t a,mve_pred16_t p)1599 int32x4_t test_vshlltq_x_n_s16(int16x8_t a, mve_pred16_t p)
1600 {
1601 #ifdef POLYMORPHIC
1602 return vshlltq_x(a, 6, p);
1603 #else /* POLYMORPHIC */
1604 return vshlltq_x_n_s16(a, 6, p);
1605 #endif /* POLYMORPHIC */
1606 }
1607
1608 // CHECK-LABEL: @test_vshlltq_x_n_u8(
1609 // CHECK-NEXT: entry:
1610 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1611 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
1612 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vshll.imm.predicated.v8i16.v16i8.v8i1(<16 x i8> [[A:%.*]], i32 5, i32 1, i32 1, <8 x i1> [[TMP1]], <8 x i16> undef)
1613 // CHECK-NEXT: ret <8 x i16> [[TMP2]]
1614 //
test_vshlltq_x_n_u8(uint8x16_t a,mve_pred16_t p)1615 uint16x8_t test_vshlltq_x_n_u8(uint8x16_t a, mve_pred16_t p)
1616 {
1617 #ifdef POLYMORPHIC
1618 return vshlltq_x(a, 5, p);
1619 #else /* POLYMORPHIC */
1620 return vshlltq_x_n_u8(a, 5, p);
1621 #endif /* POLYMORPHIC */
1622 }
1623
1624 // CHECK-LABEL: @test_vshlltq_x_n_u16(
1625 // CHECK-NEXT: entry:
1626 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
1627 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
1628 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vshll.imm.predicated.v4i32.v8i16.v4i1(<8 x i16> [[A:%.*]], i32 3, i32 1, i32 1, <4 x i1> [[TMP1]], <4 x i32> undef)
1629 // CHECK-NEXT: ret <4 x i32> [[TMP2]]
1630 //
test_vshlltq_x_n_u16(uint16x8_t a,mve_pred16_t p)1631 uint32x4_t test_vshlltq_x_n_u16(uint16x8_t a, mve_pred16_t p)
1632 {
1633 #ifdef POLYMORPHIC
1634 return vshlltq_x(a, 3, p);
1635 #else /* POLYMORPHIC */
1636 return vshlltq_x_n_u16(a, 3, p);
1637 #endif /* POLYMORPHIC */
1638 }
1639
1640