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 -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 -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 #include <arm_mve.h>
6 
7 // CHECK-LABEL: @test_vmovlbq_s8(
8 // CHECK-NEXT:  entry:
9 // CHECK-NEXT:    [[TMP0:%.*]] = shufflevector <16 x i8> [[A:%.*]], <16 x i8> undef, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
10 // CHECK-NEXT:    [[TMP1:%.*]] = sext <8 x i8> [[TMP0]] to <8 x i16>
11 // CHECK-NEXT:    ret <8 x i16> [[TMP1]]
12 //
test_vmovlbq_s8(int8x16_t a)13 int16x8_t test_vmovlbq_s8(int8x16_t a)
14 {
15 #ifdef POLYMORPHIC
16     return vmovlbq(a);
17 #else /* POLYMORPHIC */
18     return vmovlbq_s8(a);
19 #endif /* POLYMORPHIC */
20 }
21 
22 // CHECK-LABEL: @test_vmovlbq_s16(
23 // CHECK-NEXT:  entry:
24 // CHECK-NEXT:    [[TMP0:%.*]] = shufflevector <8 x i16> [[A:%.*]], <8 x i16> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
25 // CHECK-NEXT:    [[TMP1:%.*]] = sext <4 x i16> [[TMP0]] to <4 x i32>
26 // CHECK-NEXT:    ret <4 x i32> [[TMP1]]
27 //
test_vmovlbq_s16(int16x8_t a)28 int32x4_t test_vmovlbq_s16(int16x8_t a)
29 {
30 #ifdef POLYMORPHIC
31     return vmovlbq(a);
32 #else /* POLYMORPHIC */
33     return vmovlbq_s16(a);
34 #endif /* POLYMORPHIC */
35 }
36 
37 // CHECK-LABEL: @test_vmovlbq_u8(
38 // CHECK-NEXT:  entry:
39 // CHECK-NEXT:    [[TMP0:%.*]] = shufflevector <16 x i8> [[A:%.*]], <16 x i8> undef, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
40 // CHECK-NEXT:    [[TMP1:%.*]] = zext <8 x i8> [[TMP0]] to <8 x i16>
41 // CHECK-NEXT:    ret <8 x i16> [[TMP1]]
42 //
test_vmovlbq_u8(uint8x16_t a)43 uint16x8_t test_vmovlbq_u8(uint8x16_t a)
44 {
45 #ifdef POLYMORPHIC
46     return vmovlbq(a);
47 #else /* POLYMORPHIC */
48     return vmovlbq_u8(a);
49 #endif /* POLYMORPHIC */
50 }
51 
52 // CHECK-LABEL: @test_vmovlbq_u16(
53 // CHECK-NEXT:  entry:
54 // CHECK-NEXT:    [[TMP0:%.*]] = shufflevector <8 x i16> [[A:%.*]], <8 x i16> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
55 // CHECK-NEXT:    [[TMP1:%.*]] = zext <4 x i16> [[TMP0]] to <4 x i32>
56 // CHECK-NEXT:    ret <4 x i32> [[TMP1]]
57 //
test_vmovlbq_u16(uint16x8_t a)58 uint32x4_t test_vmovlbq_u16(uint16x8_t a)
59 {
60 #ifdef POLYMORPHIC
61     return vmovlbq(a);
62 #else /* POLYMORPHIC */
63     return vmovlbq_u16(a);
64 #endif /* POLYMORPHIC */
65 }
66 
67 // CHECK-LABEL: @test_vmovltq_s8(
68 // CHECK-NEXT:  entry:
69 // CHECK-NEXT:    [[TMP0:%.*]] = shufflevector <16 x i8> [[A:%.*]], <16 x i8> undef, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>
70 // CHECK-NEXT:    [[TMP1:%.*]] = sext <8 x i8> [[TMP0]] to <8 x i16>
71 // CHECK-NEXT:    ret <8 x i16> [[TMP1]]
72 //
test_vmovltq_s8(int8x16_t a)73 int16x8_t test_vmovltq_s8(int8x16_t a)
74 {
75 #ifdef POLYMORPHIC
76     return vmovltq(a);
77 #else /* POLYMORPHIC */
78     return vmovltq_s8(a);
79 #endif /* POLYMORPHIC */
80 }
81 
82 // CHECK-LABEL: @test_vmovltq_s16(
83 // CHECK-NEXT:  entry:
84 // CHECK-NEXT:    [[TMP0:%.*]] = shufflevector <8 x i16> [[A:%.*]], <8 x i16> undef, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
85 // CHECK-NEXT:    [[TMP1:%.*]] = sext <4 x i16> [[TMP0]] to <4 x i32>
86 // CHECK-NEXT:    ret <4 x i32> [[TMP1]]
87 //
test_vmovltq_s16(int16x8_t a)88 int32x4_t test_vmovltq_s16(int16x8_t a)
89 {
90 #ifdef POLYMORPHIC
91     return vmovltq(a);
92 #else /* POLYMORPHIC */
93     return vmovltq_s16(a);
94 #endif /* POLYMORPHIC */
95 }
96 
97 // CHECK-LABEL: @test_vmovltq_u8(
98 // CHECK-NEXT:  entry:
99 // CHECK-NEXT:    [[TMP0:%.*]] = shufflevector <16 x i8> [[A:%.*]], <16 x i8> undef, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>
100 // CHECK-NEXT:    [[TMP1:%.*]] = zext <8 x i8> [[TMP0]] to <8 x i16>
101 // CHECK-NEXT:    ret <8 x i16> [[TMP1]]
102 //
test_vmovltq_u8(uint8x16_t a)103 uint16x8_t test_vmovltq_u8(uint8x16_t a)
104 {
105 #ifdef POLYMORPHIC
106     return vmovltq(a);
107 #else /* POLYMORPHIC */
108     return vmovltq_u8(a);
109 #endif /* POLYMORPHIC */
110 }
111 
112 // CHECK-LABEL: @test_vmovltq_u16(
113 // CHECK-NEXT:  entry:
114 // CHECK-NEXT:    [[TMP0:%.*]] = shufflevector <8 x i16> [[A:%.*]], <8 x i16> undef, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
115 // CHECK-NEXT:    [[TMP1:%.*]] = zext <4 x i16> [[TMP0]] to <4 x i32>
116 // CHECK-NEXT:    ret <4 x i32> [[TMP1]]
117 //
test_vmovltq_u16(uint16x8_t a)118 uint32x4_t test_vmovltq_u16(uint16x8_t a)
119 {
120 #ifdef POLYMORPHIC
121     return vmovltq(a);
122 #else /* POLYMORPHIC */
123     return vmovltq_u16(a);
124 #endif /* POLYMORPHIC */
125 }
126 
127 // CHECK-LABEL: @test_vmovlbq_m_s8(
128 // CHECK-NEXT:  entry:
129 // CHECK-NEXT:    [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
130 // CHECK-NEXT:    [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
131 // CHECK-NEXT:    [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vmovl.predicated.v8i16.v16i8.v8i1(<16 x i8> [[A:%.*]], i32 0, i32 0, <8 x i1> [[TMP1]], <8 x i16> [[INACTIVE:%.*]])
132 // CHECK-NEXT:    ret <8 x i16> [[TMP2]]
133 //
test_vmovlbq_m_s8(int16x8_t inactive,int8x16_t a,mve_pred16_t p)134 int16x8_t test_vmovlbq_m_s8(int16x8_t inactive, int8x16_t a, mve_pred16_t p)
135 {
136 #ifdef POLYMORPHIC
137     return vmovlbq_m(inactive, a, p);
138 #else /* POLYMORPHIC */
139     return vmovlbq_m_s8(inactive, a, p);
140 #endif /* POLYMORPHIC */
141 }
142 
143 // CHECK-LABEL: @test_vmovlbq_m_s16(
144 // CHECK-NEXT:  entry:
145 // CHECK-NEXT:    [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
146 // CHECK-NEXT:    [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
147 // CHECK-NEXT:    [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vmovl.predicated.v4i32.v8i16.v4i1(<8 x i16> [[A:%.*]], i32 0, i32 0, <4 x i1> [[TMP1]], <4 x i32> [[INACTIVE:%.*]])
148 // CHECK-NEXT:    ret <4 x i32> [[TMP2]]
149 //
test_vmovlbq_m_s16(int32x4_t inactive,int16x8_t a,mve_pred16_t p)150 int32x4_t test_vmovlbq_m_s16(int32x4_t inactive, int16x8_t a, mve_pred16_t p)
151 {
152 #ifdef POLYMORPHIC
153     return vmovlbq_m(inactive, a, p);
154 #else /* POLYMORPHIC */
155     return vmovlbq_m_s16(inactive, a, p);
156 #endif /* POLYMORPHIC */
157 }
158 
159 // CHECK-LABEL: @test_vmovlbq_m_u8(
160 // CHECK-NEXT:  entry:
161 // CHECK-NEXT:    [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
162 // CHECK-NEXT:    [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
163 // CHECK-NEXT:    [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vmovl.predicated.v8i16.v16i8.v8i1(<16 x i8> [[A:%.*]], i32 1, i32 0, <8 x i1> [[TMP1]], <8 x i16> [[INACTIVE:%.*]])
164 // CHECK-NEXT:    ret <8 x i16> [[TMP2]]
165 //
test_vmovlbq_m_u8(uint16x8_t inactive,uint8x16_t a,mve_pred16_t p)166 uint16x8_t test_vmovlbq_m_u8(uint16x8_t inactive, uint8x16_t a, mve_pred16_t p)
167 {
168 #ifdef POLYMORPHIC
169     return vmovlbq_m(inactive, a, p);
170 #else /* POLYMORPHIC */
171     return vmovlbq_m_u8(inactive, a, p);
172 #endif /* POLYMORPHIC */
173 }
174 
175 // CHECK-LABEL: @test_vmovlbq_m_u16(
176 // CHECK-NEXT:  entry:
177 // CHECK-NEXT:    [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
178 // CHECK-NEXT:    [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
179 // CHECK-NEXT:    [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vmovl.predicated.v4i32.v8i16.v4i1(<8 x i16> [[A:%.*]], i32 1, i32 0, <4 x i1> [[TMP1]], <4 x i32> [[INACTIVE:%.*]])
180 // CHECK-NEXT:    ret <4 x i32> [[TMP2]]
181 //
test_vmovlbq_m_u16(uint32x4_t inactive,uint16x8_t a,mve_pred16_t p)182 uint32x4_t test_vmovlbq_m_u16(uint32x4_t inactive, uint16x8_t a, mve_pred16_t p)
183 {
184 #ifdef POLYMORPHIC
185     return vmovlbq_m(inactive, a, p);
186 #else /* POLYMORPHIC */
187     return vmovlbq_m_u16(inactive, a, p);
188 #endif /* POLYMORPHIC */
189 }
190 
191 // CHECK-LABEL: @test_vmovltq_m_s8(
192 // CHECK-NEXT:  entry:
193 // CHECK-NEXT:    [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
194 // CHECK-NEXT:    [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
195 // CHECK-NEXT:    [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vmovl.predicated.v8i16.v16i8.v8i1(<16 x i8> [[A:%.*]], i32 0, i32 1, <8 x i1> [[TMP1]], <8 x i16> [[INACTIVE:%.*]])
196 // CHECK-NEXT:    ret <8 x i16> [[TMP2]]
197 //
test_vmovltq_m_s8(int16x8_t inactive,int8x16_t a,mve_pred16_t p)198 int16x8_t test_vmovltq_m_s8(int16x8_t inactive, int8x16_t a, mve_pred16_t p)
199 {
200 #ifdef POLYMORPHIC
201     return vmovltq_m(inactive, a, p);
202 #else /* POLYMORPHIC */
203     return vmovltq_m_s8(inactive, a, p);
204 #endif /* POLYMORPHIC */
205 }
206 
207 // CHECK-LABEL: @test_vmovltq_m_s16(
208 // CHECK-NEXT:  entry:
209 // CHECK-NEXT:    [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
210 // CHECK-NEXT:    [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
211 // CHECK-NEXT:    [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vmovl.predicated.v4i32.v8i16.v4i1(<8 x i16> [[A:%.*]], i32 0, i32 1, <4 x i1> [[TMP1]], <4 x i32> [[INACTIVE:%.*]])
212 // CHECK-NEXT:    ret <4 x i32> [[TMP2]]
213 //
test_vmovltq_m_s16(int32x4_t inactive,int16x8_t a,mve_pred16_t p)214 int32x4_t test_vmovltq_m_s16(int32x4_t inactive, int16x8_t a, mve_pred16_t p)
215 {
216 #ifdef POLYMORPHIC
217     return vmovltq_m(inactive, a, p);
218 #else /* POLYMORPHIC */
219     return vmovltq_m_s16(inactive, a, p);
220 #endif /* POLYMORPHIC */
221 }
222 
223 // CHECK-LABEL: @test_vmovltq_m_u8(
224 // CHECK-NEXT:  entry:
225 // CHECK-NEXT:    [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
226 // CHECK-NEXT:    [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
227 // CHECK-NEXT:    [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vmovl.predicated.v8i16.v16i8.v8i1(<16 x i8> [[A:%.*]], i32 1, i32 1, <8 x i1> [[TMP1]], <8 x i16> [[INACTIVE:%.*]])
228 // CHECK-NEXT:    ret <8 x i16> [[TMP2]]
229 //
test_vmovltq_m_u8(uint16x8_t inactive,uint8x16_t a,mve_pred16_t p)230 uint16x8_t test_vmovltq_m_u8(uint16x8_t inactive, uint8x16_t a, mve_pred16_t p)
231 {
232 #ifdef POLYMORPHIC
233     return vmovltq_m(inactive, a, p);
234 #else /* POLYMORPHIC */
235     return vmovltq_m_u8(inactive, a, p);
236 #endif /* POLYMORPHIC */
237 }
238 
239 // CHECK-LABEL: @test_vmovltq_m_u16(
240 // CHECK-NEXT:  entry:
241 // CHECK-NEXT:    [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
242 // CHECK-NEXT:    [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
243 // CHECK-NEXT:    [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vmovl.predicated.v4i32.v8i16.v4i1(<8 x i16> [[A:%.*]], i32 1, i32 1, <4 x i1> [[TMP1]], <4 x i32> [[INACTIVE:%.*]])
244 // CHECK-NEXT:    ret <4 x i32> [[TMP2]]
245 //
test_vmovltq_m_u16(uint32x4_t inactive,uint16x8_t a,mve_pred16_t p)246 uint32x4_t test_vmovltq_m_u16(uint32x4_t inactive, uint16x8_t a, mve_pred16_t p)
247 {
248 #ifdef POLYMORPHIC
249     return vmovltq_m(inactive, a, p);
250 #else /* POLYMORPHIC */
251     return vmovltq_m_u16(inactive, a, p);
252 #endif /* POLYMORPHIC */
253 }
254 
255 // CHECK-LABEL: @test_vmovlbq_x_s8(
256 // CHECK-NEXT:  entry:
257 // CHECK-NEXT:    [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
258 // CHECK-NEXT:    [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
259 // CHECK-NEXT:    [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vmovl.predicated.v8i16.v16i8.v8i1(<16 x i8> [[A:%.*]], i32 0, i32 0, <8 x i1> [[TMP1]], <8 x i16> undef)
260 // CHECK-NEXT:    ret <8 x i16> [[TMP2]]
261 //
test_vmovlbq_x_s8(int8x16_t a,mve_pred16_t p)262 int16x8_t test_vmovlbq_x_s8(int8x16_t a, mve_pred16_t p)
263 {
264 #ifdef POLYMORPHIC
265     return vmovlbq_x(a, p);
266 #else /* POLYMORPHIC */
267     return vmovlbq_x_s8(a, p);
268 #endif /* POLYMORPHIC */
269 }
270 
271 // CHECK-LABEL: @test_vmovlbq_x_s16(
272 // CHECK-NEXT:  entry:
273 // CHECK-NEXT:    [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
274 // CHECK-NEXT:    [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
275 // CHECK-NEXT:    [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vmovl.predicated.v4i32.v8i16.v4i1(<8 x i16> [[A:%.*]], i32 0, i32 0, <4 x i1> [[TMP1]], <4 x i32> undef)
276 // CHECK-NEXT:    ret <4 x i32> [[TMP2]]
277 //
test_vmovlbq_x_s16(int16x8_t a,mve_pred16_t p)278 int32x4_t test_vmovlbq_x_s16(int16x8_t a, mve_pred16_t p)
279 {
280 #ifdef POLYMORPHIC
281     return vmovlbq_x(a, p);
282 #else /* POLYMORPHIC */
283     return vmovlbq_x_s16(a, p);
284 #endif /* POLYMORPHIC */
285 }
286 
287 // CHECK-LABEL: @test_vmovlbq_x_u8(
288 // CHECK-NEXT:  entry:
289 // CHECK-NEXT:    [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
290 // CHECK-NEXT:    [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
291 // CHECK-NEXT:    [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vmovl.predicated.v8i16.v16i8.v8i1(<16 x i8> [[A:%.*]], i32 1, i32 0, <8 x i1> [[TMP1]], <8 x i16> undef)
292 // CHECK-NEXT:    ret <8 x i16> [[TMP2]]
293 //
test_vmovlbq_x_u8(uint8x16_t a,mve_pred16_t p)294 uint16x8_t test_vmovlbq_x_u8(uint8x16_t a, mve_pred16_t p)
295 {
296 #ifdef POLYMORPHIC
297     return vmovlbq_x(a, p);
298 #else /* POLYMORPHIC */
299     return vmovlbq_x_u8(a, p);
300 #endif /* POLYMORPHIC */
301 }
302 
303 // CHECK-LABEL: @test_vmovlbq_x_u16(
304 // CHECK-NEXT:  entry:
305 // CHECK-NEXT:    [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
306 // CHECK-NEXT:    [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
307 // CHECK-NEXT:    [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vmovl.predicated.v4i32.v8i16.v4i1(<8 x i16> [[A:%.*]], i32 1, i32 0, <4 x i1> [[TMP1]], <4 x i32> undef)
308 // CHECK-NEXT:    ret <4 x i32> [[TMP2]]
309 //
test_vmovlbq_x_u16(uint16x8_t a,mve_pred16_t p)310 uint32x4_t test_vmovlbq_x_u16(uint16x8_t a, mve_pred16_t p)
311 {
312 #ifdef POLYMORPHIC
313     return vmovlbq_x(a, p);
314 #else /* POLYMORPHIC */
315     return vmovlbq_x_u16(a, p);
316 #endif /* POLYMORPHIC */
317 }
318 
319 // CHECK-LABEL: @test_vmovltq_x_s8(
320 // CHECK-NEXT:  entry:
321 // CHECK-NEXT:    [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
322 // CHECK-NEXT:    [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
323 // CHECK-NEXT:    [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vmovl.predicated.v8i16.v16i8.v8i1(<16 x i8> [[A:%.*]], i32 0, i32 1, <8 x i1> [[TMP1]], <8 x i16> undef)
324 // CHECK-NEXT:    ret <8 x i16> [[TMP2]]
325 //
test_vmovltq_x_s8(int8x16_t a,mve_pred16_t p)326 int16x8_t test_vmovltq_x_s8(int8x16_t a, mve_pred16_t p)
327 {
328 #ifdef POLYMORPHIC
329     return vmovltq_x(a, p);
330 #else /* POLYMORPHIC */
331     return vmovltq_x_s8(a, p);
332 #endif /* POLYMORPHIC */
333 }
334 
335 // CHECK-LABEL: @test_vmovltq_x_s16(
336 // CHECK-NEXT:  entry:
337 // CHECK-NEXT:    [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
338 // CHECK-NEXT:    [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
339 // CHECK-NEXT:    [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vmovl.predicated.v4i32.v8i16.v4i1(<8 x i16> [[A:%.*]], i32 0, i32 1, <4 x i1> [[TMP1]], <4 x i32> undef)
340 // CHECK-NEXT:    ret <4 x i32> [[TMP2]]
341 //
test_vmovltq_x_s16(int16x8_t a,mve_pred16_t p)342 int32x4_t test_vmovltq_x_s16(int16x8_t a, mve_pred16_t p)
343 {
344 #ifdef POLYMORPHIC
345     return vmovltq_x(a, p);
346 #else /* POLYMORPHIC */
347     return vmovltq_x_s16(a, p);
348 #endif /* POLYMORPHIC */
349 }
350 
351 // CHECK-LABEL: @test_vmovltq_x_u8(
352 // CHECK-NEXT:  entry:
353 // CHECK-NEXT:    [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
354 // CHECK-NEXT:    [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])
355 // CHECK-NEXT:    [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vmovl.predicated.v8i16.v16i8.v8i1(<16 x i8> [[A:%.*]], i32 1, i32 1, <8 x i1> [[TMP1]], <8 x i16> undef)
356 // CHECK-NEXT:    ret <8 x i16> [[TMP2]]
357 //
test_vmovltq_x_u8(uint8x16_t a,mve_pred16_t p)358 uint16x8_t test_vmovltq_x_u8(uint8x16_t a, mve_pred16_t p)
359 {
360 #ifdef POLYMORPHIC
361     return vmovltq_x(a, p);
362 #else /* POLYMORPHIC */
363     return vmovltq_x_u8(a, p);
364 #endif /* POLYMORPHIC */
365 }
366 
367 // CHECK-LABEL: @test_vmovltq_x_u16(
368 // CHECK-NEXT:  entry:
369 // CHECK-NEXT:    [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32
370 // CHECK-NEXT:    [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])
371 // CHECK-NEXT:    [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vmovl.predicated.v4i32.v8i16.v4i1(<8 x i16> [[A:%.*]], i32 1, i32 1, <4 x i1> [[TMP1]], <4 x i32> undef)
372 // CHECK-NEXT:    ret <4 x i32> [[TMP2]]
373 //
test_vmovltq_x_u16(uint16x8_t a,mve_pred16_t p)374 uint32x4_t test_vmovltq_x_u16(uint16x8_t a, mve_pred16_t p)
375 {
376 #ifdef POLYMORPHIC
377     return vmovltq_x(a, p);
378 #else /* POLYMORPHIC */
379     return vmovltq_x_u16(a, p);
380 #endif /* POLYMORPHIC */
381 }
382 
383