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,sroa,early-cse<>' | FileCheck %s --check-prefixes=CHECK,CHECK-LE
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,sroa,early-cse<>' | FileCheck %s --check-prefixes=CHECK,CHECK-LE
4 // RUN: %clang_cc1 -triple thumbebv8.1m.main-none-none-eabi -target-feature +mve.fp -mfloat-abi hard -O0 -disable-O0-optnone -emit-llvm -o - %s | opt -S -passes='mem2reg,sroa,early-cse<>' | FileCheck %s --check-prefixes=CHECK,CHECK-BE
5 // RUN: %clang_cc1 -triple thumbebv8.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,sroa,early-cse<>' | FileCheck %s --check-prefixes=CHECK,CHECK-BE
6
7 // REQUIRES: aarch64-registered-target || arm-registered-target
8
9 #include <arm_mve.h>
10
11 // CHECK-LE-LABEL: @test_vcreateq_f16(
12 // CHECK-LE-NEXT: entry:
13 // CHECK-LE-NEXT: [[TMP0:%.*]] = insertelement <2 x i64> undef, i64 [[A:%.*]], i64 0
14 // CHECK-LE-NEXT: [[TMP1:%.*]] = insertelement <2 x i64> [[TMP0]], i64 [[B:%.*]], i64 1
15 // CHECK-LE-NEXT: [[TMP2:%.*]] = bitcast <2 x i64> [[TMP1]] to <8 x half>
16 // CHECK-LE-NEXT: ret <8 x half> [[TMP2]]
17 //
18 // CHECK-BE-LABEL: @test_vcreateq_f16(
19 // CHECK-BE-NEXT: entry:
20 // CHECK-BE-NEXT: [[TMP0:%.*]] = insertelement <2 x i64> undef, i64 [[A:%.*]], i64 0
21 // CHECK-BE-NEXT: [[TMP1:%.*]] = insertelement <2 x i64> [[TMP0]], i64 [[B:%.*]], i64 1
22 // CHECK-BE-NEXT: [[TMP2:%.*]] = call <8 x half> @llvm.arm.mve.vreinterpretq.v8f16.v2i64(<2 x i64> [[TMP1]])
23 // CHECK-BE-NEXT: ret <8 x half> [[TMP2]]
24 //
test_vcreateq_f16(uint64_t a,uint64_t b)25 float16x8_t test_vcreateq_f16(uint64_t a, uint64_t b)
26 {
27 return vcreateq_f16(a, b);
28 }
29
30 // CHECK-LE-LABEL: @test_vcreateq_f32(
31 // CHECK-LE-NEXT: entry:
32 // CHECK-LE-NEXT: [[TMP0:%.*]] = insertelement <2 x i64> undef, i64 [[A:%.*]], i64 0
33 // CHECK-LE-NEXT: [[TMP1:%.*]] = insertelement <2 x i64> [[TMP0]], i64 [[B:%.*]], i64 1
34 // CHECK-LE-NEXT: [[TMP2:%.*]] = bitcast <2 x i64> [[TMP1]] to <4 x float>
35 // CHECK-LE-NEXT: ret <4 x float> [[TMP2]]
36 //
37 // CHECK-BE-LABEL: @test_vcreateq_f32(
38 // CHECK-BE-NEXT: entry:
39 // CHECK-BE-NEXT: [[TMP0:%.*]] = insertelement <2 x i64> undef, i64 [[A:%.*]], i64 0
40 // CHECK-BE-NEXT: [[TMP1:%.*]] = insertelement <2 x i64> [[TMP0]], i64 [[B:%.*]], i64 1
41 // CHECK-BE-NEXT: [[TMP2:%.*]] = call <4 x float> @llvm.arm.mve.vreinterpretq.v4f32.v2i64(<2 x i64> [[TMP1]])
42 // CHECK-BE-NEXT: ret <4 x float> [[TMP2]]
43 //
test_vcreateq_f32(uint64_t a,uint64_t b)44 float32x4_t test_vcreateq_f32(uint64_t a, uint64_t b)
45 {
46 return vcreateq_f32(a, b);
47 }
48
49 // CHECK-LE-LABEL: @test_vcreateq_s16(
50 // CHECK-LE-NEXT: entry:
51 // CHECK-LE-NEXT: [[TMP0:%.*]] = insertelement <2 x i64> undef, i64 [[A:%.*]], i64 0
52 // CHECK-LE-NEXT: [[TMP1:%.*]] = insertelement <2 x i64> [[TMP0]], i64 [[B:%.*]], i64 1
53 // CHECK-LE-NEXT: [[TMP2:%.*]] = bitcast <2 x i64> [[TMP1]] to <8 x i16>
54 // CHECK-LE-NEXT: ret <8 x i16> [[TMP2]]
55 //
56 // CHECK-BE-LABEL: @test_vcreateq_s16(
57 // CHECK-BE-NEXT: entry:
58 // CHECK-BE-NEXT: [[TMP0:%.*]] = insertelement <2 x i64> undef, i64 [[A:%.*]], i64 0
59 // CHECK-BE-NEXT: [[TMP1:%.*]] = insertelement <2 x i64> [[TMP0]], i64 [[B:%.*]], i64 1
60 // CHECK-BE-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vreinterpretq.v8i16.v2i64(<2 x i64> [[TMP1]])
61 // CHECK-BE-NEXT: ret <8 x i16> [[TMP2]]
62 //
test_vcreateq_s16(uint64_t a,uint64_t b)63 int16x8_t test_vcreateq_s16(uint64_t a, uint64_t b)
64 {
65 return vcreateq_s16(a, b);
66 }
67
68 // CHECK-LE-LABEL: @test_vcreateq_s32(
69 // CHECK-LE-NEXT: entry:
70 // CHECK-LE-NEXT: [[TMP0:%.*]] = insertelement <2 x i64> undef, i64 [[A:%.*]], i64 0
71 // CHECK-LE-NEXT: [[TMP1:%.*]] = insertelement <2 x i64> [[TMP0]], i64 [[B:%.*]], i64 1
72 // CHECK-LE-NEXT: [[TMP2:%.*]] = bitcast <2 x i64> [[TMP1]] to <4 x i32>
73 // CHECK-LE-NEXT: ret <4 x i32> [[TMP2]]
74 //
75 // CHECK-BE-LABEL: @test_vcreateq_s32(
76 // CHECK-BE-NEXT: entry:
77 // CHECK-BE-NEXT: [[TMP0:%.*]] = insertelement <2 x i64> undef, i64 [[A:%.*]], i64 0
78 // CHECK-BE-NEXT: [[TMP1:%.*]] = insertelement <2 x i64> [[TMP0]], i64 [[B:%.*]], i64 1
79 // CHECK-BE-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vreinterpretq.v4i32.v2i64(<2 x i64> [[TMP1]])
80 // CHECK-BE-NEXT: ret <4 x i32> [[TMP2]]
81 //
test_vcreateq_s32(uint64_t a,uint64_t b)82 int32x4_t test_vcreateq_s32(uint64_t a, uint64_t b)
83 {
84 return vcreateq_s32(a, b);
85 }
86
87 // CHECK-LABEL: @test_vcreateq_s64(
88 // CHECK-NEXT: entry:
89 // CHECK-NEXT: [[TMP0:%.*]] = insertelement <2 x i64> undef, i64 [[A:%.*]], i64 0
90 // CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x i64> [[TMP0]], i64 [[B:%.*]], i64 1
91 // CHECK-NEXT: ret <2 x i64> [[TMP1]]
92 //
test_vcreateq_s64(uint64_t a,uint64_t b)93 int64x2_t test_vcreateq_s64(uint64_t a, uint64_t b)
94 {
95 return vcreateq_s64(a, b);
96 }
97
98 // CHECK-LE-LABEL: @test_vcreateq_s8(
99 // CHECK-LE-NEXT: entry:
100 // CHECK-LE-NEXT: [[TMP0:%.*]] = insertelement <2 x i64> undef, i64 [[A:%.*]], i64 0
101 // CHECK-LE-NEXT: [[TMP1:%.*]] = insertelement <2 x i64> [[TMP0]], i64 [[B:%.*]], i64 1
102 // CHECK-LE-NEXT: [[TMP2:%.*]] = bitcast <2 x i64> [[TMP1]] to <16 x i8>
103 // CHECK-LE-NEXT: ret <16 x i8> [[TMP2]]
104 //
105 // CHECK-BE-LABEL: @test_vcreateq_s8(
106 // CHECK-BE-NEXT: entry:
107 // CHECK-BE-NEXT: [[TMP0:%.*]] = insertelement <2 x i64> undef, i64 [[A:%.*]], i64 0
108 // CHECK-BE-NEXT: [[TMP1:%.*]] = insertelement <2 x i64> [[TMP0]], i64 [[B:%.*]], i64 1
109 // CHECK-BE-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vreinterpretq.v16i8.v2i64(<2 x i64> [[TMP1]])
110 // CHECK-BE-NEXT: ret <16 x i8> [[TMP2]]
111 //
test_vcreateq_s8(uint64_t a,uint64_t b)112 int8x16_t test_vcreateq_s8(uint64_t a, uint64_t b)
113 {
114 return vcreateq_s8(a, b);
115 }
116
117 // CHECK-LE-LABEL: @test_vcreateq_u16(
118 // CHECK-LE-NEXT: entry:
119 // CHECK-LE-NEXT: [[TMP0:%.*]] = insertelement <2 x i64> undef, i64 [[A:%.*]], i64 0
120 // CHECK-LE-NEXT: [[TMP1:%.*]] = insertelement <2 x i64> [[TMP0]], i64 [[B:%.*]], i64 1
121 // CHECK-LE-NEXT: [[TMP2:%.*]] = bitcast <2 x i64> [[TMP1]] to <8 x i16>
122 // CHECK-LE-NEXT: ret <8 x i16> [[TMP2]]
123 //
124 // CHECK-BE-LABEL: @test_vcreateq_u16(
125 // CHECK-BE-NEXT: entry:
126 // CHECK-BE-NEXT: [[TMP0:%.*]] = insertelement <2 x i64> undef, i64 [[A:%.*]], i64 0
127 // CHECK-BE-NEXT: [[TMP1:%.*]] = insertelement <2 x i64> [[TMP0]], i64 [[B:%.*]], i64 1
128 // CHECK-BE-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vreinterpretq.v8i16.v2i64(<2 x i64> [[TMP1]])
129 // CHECK-BE-NEXT: ret <8 x i16> [[TMP2]]
130 //
test_vcreateq_u16(uint64_t a,uint64_t b)131 uint16x8_t test_vcreateq_u16(uint64_t a, uint64_t b)
132 {
133 return vcreateq_u16(a, b);
134 }
135
136 // CHECK-LE-LABEL: @test_vcreateq_u32(
137 // CHECK-LE-NEXT: entry:
138 // CHECK-LE-NEXT: [[TMP0:%.*]] = insertelement <2 x i64> undef, i64 [[A:%.*]], i64 0
139 // CHECK-LE-NEXT: [[TMP1:%.*]] = insertelement <2 x i64> [[TMP0]], i64 [[B:%.*]], i64 1
140 // CHECK-LE-NEXT: [[TMP2:%.*]] = bitcast <2 x i64> [[TMP1]] to <4 x i32>
141 // CHECK-LE-NEXT: ret <4 x i32> [[TMP2]]
142 //
143 // CHECK-BE-LABEL: @test_vcreateq_u32(
144 // CHECK-BE-NEXT: entry:
145 // CHECK-BE-NEXT: [[TMP0:%.*]] = insertelement <2 x i64> undef, i64 [[A:%.*]], i64 0
146 // CHECK-BE-NEXT: [[TMP1:%.*]] = insertelement <2 x i64> [[TMP0]], i64 [[B:%.*]], i64 1
147 // CHECK-BE-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vreinterpretq.v4i32.v2i64(<2 x i64> [[TMP1]])
148 // CHECK-BE-NEXT: ret <4 x i32> [[TMP2]]
149 //
test_vcreateq_u32(uint64_t a,uint64_t b)150 uint32x4_t test_vcreateq_u32(uint64_t a, uint64_t b)
151 {
152 return vcreateq_u32(a, b);
153 }
154
155 // CHECK-LABEL: @test_vcreateq_u64(
156 // CHECK-NEXT: entry:
157 // CHECK-NEXT: [[TMP0:%.*]] = insertelement <2 x i64> undef, i64 [[A:%.*]], i64 0
158 // CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x i64> [[TMP0]], i64 [[B:%.*]], i64 1
159 // CHECK-NEXT: ret <2 x i64> [[TMP1]]
160 //
test_vcreateq_u64(uint64_t a,uint64_t b)161 uint64x2_t test_vcreateq_u64(uint64_t a, uint64_t b)
162 {
163 return vcreateq_u64(a, b);
164 }
165
166 // CHECK-LE-LABEL: @test_vcreateq_u8(
167 // CHECK-LE-NEXT: entry:
168 // CHECK-LE-NEXT: [[TMP0:%.*]] = insertelement <2 x i64> undef, i64 [[A:%.*]], i64 0
169 // CHECK-LE-NEXT: [[TMP1:%.*]] = insertelement <2 x i64> [[TMP0]], i64 [[B:%.*]], i64 1
170 // CHECK-LE-NEXT: [[TMP2:%.*]] = bitcast <2 x i64> [[TMP1]] to <16 x i8>
171 // CHECK-LE-NEXT: ret <16 x i8> [[TMP2]]
172 //
173 // CHECK-BE-LABEL: @test_vcreateq_u8(
174 // CHECK-BE-NEXT: entry:
175 // CHECK-BE-NEXT: [[TMP0:%.*]] = insertelement <2 x i64> undef, i64 [[A:%.*]], i64 0
176 // CHECK-BE-NEXT: [[TMP1:%.*]] = insertelement <2 x i64> [[TMP0]], i64 [[B:%.*]], i64 1
177 // CHECK-BE-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vreinterpretq.v16i8.v2i64(<2 x i64> [[TMP1]])
178 // CHECK-BE-NEXT: ret <16 x i8> [[TMP2]]
179 //
test_vcreateq_u8(uint64_t a,uint64_t b)180 uint8x16_t test_vcreateq_u8(uint64_t a, uint64_t b)
181 {
182 return vcreateq_u8(a, b);
183 }
184
185 // CHECK-LABEL: @test_vuninitializedq_polymorphic_f16(
186 // CHECK-NEXT: entry:
187 // CHECK-NEXT: ret <8 x half> undef
188 //
test_vuninitializedq_polymorphic_f16(float16x8_t (* funcptr)(void))189 float16x8_t test_vuninitializedq_polymorphic_f16(float16x8_t (*funcptr)(void))
190 {
191 return vuninitializedq(funcptr());
192 }
193
194 // CHECK-LABEL: @test_vuninitializedq_polymorphic_f32(
195 // CHECK-NEXT: entry:
196 // CHECK-NEXT: ret <4 x float> undef
197 //
test_vuninitializedq_polymorphic_f32(float32x4_t (* funcptr)(void))198 float32x4_t test_vuninitializedq_polymorphic_f32(float32x4_t (*funcptr)(void))
199 {
200 return vuninitializedq(funcptr());
201 }
202
203 // CHECK-LABEL: @test_vuninitializedq_polymorphic_s8(
204 // CHECK-NEXT: entry:
205 // CHECK-NEXT: ret <16 x i8> undef
206 //
test_vuninitializedq_polymorphic_s8(int8x16_t (* funcptr)(void))207 int8x16_t test_vuninitializedq_polymorphic_s8(int8x16_t (*funcptr)(void))
208 {
209 return vuninitializedq(funcptr());
210 }
211
212 // CHECK-LABEL: @test_vuninitializedq_polymorphic_s16(
213 // CHECK-NEXT: entry:
214 // CHECK-NEXT: ret <8 x i16> undef
215 //
test_vuninitializedq_polymorphic_s16(int16x8_t (* funcptr)(void))216 int16x8_t test_vuninitializedq_polymorphic_s16(int16x8_t (*funcptr)(void))
217 {
218 return vuninitializedq(funcptr());
219 }
220
221 // CHECK-LABEL: @test_vuninitializedq_polymorphic_s32(
222 // CHECK-NEXT: entry:
223 // CHECK-NEXT: ret <4 x i32> undef
224 //
test_vuninitializedq_polymorphic_s32(int32x4_t (* funcptr)(void))225 int32x4_t test_vuninitializedq_polymorphic_s32(int32x4_t (*funcptr)(void))
226 {
227 return vuninitializedq(funcptr());
228 }
229
230 // CHECK-LABEL: @test_vuninitializedq_polymorphic_s64(
231 // CHECK-NEXT: entry:
232 // CHECK-NEXT: ret <2 x i64> undef
233 //
test_vuninitializedq_polymorphic_s64(int64x2_t (* funcptr)(void))234 int64x2_t test_vuninitializedq_polymorphic_s64(int64x2_t (*funcptr)(void))
235 {
236 return vuninitializedq(funcptr());
237 }
238
239 // CHECK-LABEL: @test_vuninitializedq_polymorphic_u8(
240 // CHECK-NEXT: entry:
241 // CHECK-NEXT: ret <16 x i8> undef
242 //
test_vuninitializedq_polymorphic_u8(uint8x16_t (* funcptr)(void))243 uint8x16_t test_vuninitializedq_polymorphic_u8(uint8x16_t (*funcptr)(void))
244 {
245 return vuninitializedq(funcptr());
246 }
247
248 // CHECK-LABEL: @test_vuninitializedq_polymorphic_u16(
249 // CHECK-NEXT: entry:
250 // CHECK-NEXT: ret <8 x i16> undef
251 //
test_vuninitializedq_polymorphic_u16(uint16x8_t (* funcptr)(void))252 uint16x8_t test_vuninitializedq_polymorphic_u16(uint16x8_t (*funcptr)(void))
253 {
254 return vuninitializedq(funcptr());
255 }
256
257 // CHECK-LABEL: @test_vuninitializedq_polymorphic_u32(
258 // CHECK-NEXT: entry:
259 // CHECK-NEXT: ret <4 x i32> undef
260 //
test_vuninitializedq_polymorphic_u32(uint32x4_t (* funcptr)(void))261 uint32x4_t test_vuninitializedq_polymorphic_u32(uint32x4_t (*funcptr)(void))
262 {
263 return vuninitializedq(funcptr());
264 }
265
266 // CHECK-LABEL: @test_vuninitializedq_polymorphic_u64(
267 // CHECK-NEXT: entry:
268 // CHECK-NEXT: ret <2 x i64> undef
269 //
test_vuninitializedq_polymorphic_u64(uint64x2_t (* funcptr)(void))270 uint64x2_t test_vuninitializedq_polymorphic_u64(uint64x2_t (*funcptr)(void))
271 {
272 return vuninitializedq(funcptr());
273 }
274
275 // CHECK-LABEL: @test_vuninitializedq_f16(
276 // CHECK-NEXT: entry:
277 // CHECK-NEXT: ret <8 x half> undef
278 //
test_vuninitializedq_f16(void)279 float16x8_t test_vuninitializedq_f16(void)
280 {
281 return vuninitializedq_f16();
282 }
283
284 // CHECK-LABEL: @test_vuninitializedq_f32(
285 // CHECK-NEXT: entry:
286 // CHECK-NEXT: ret <4 x float> undef
287 //
test_vuninitializedq_f32(void)288 float32x4_t test_vuninitializedq_f32(void)
289 {
290 return vuninitializedq_f32();
291 }
292
293 // CHECK-LABEL: @test_vuninitializedq_s16(
294 // CHECK-NEXT: entry:
295 // CHECK-NEXT: ret <8 x i16> undef
296 //
test_vuninitializedq_s16(void)297 int16x8_t test_vuninitializedq_s16(void)
298 {
299 return vuninitializedq_s16();
300 }
301
302 // CHECK-LABEL: @test_vuninitializedq_s32(
303 // CHECK-NEXT: entry:
304 // CHECK-NEXT: ret <4 x i32> undef
305 //
test_vuninitializedq_s32(void)306 int32x4_t test_vuninitializedq_s32(void)
307 {
308 return vuninitializedq_s32();
309 }
310
311 // CHECK-LABEL: @test_vuninitializedq_s64(
312 // CHECK-NEXT: entry:
313 // CHECK-NEXT: ret <2 x i64> undef
314 //
test_vuninitializedq_s64(void)315 int64x2_t test_vuninitializedq_s64(void)
316 {
317 return vuninitializedq_s64();
318 }
319
320 // CHECK-LABEL: @test_vuninitializedq_s8(
321 // CHECK-NEXT: entry:
322 // CHECK-NEXT: ret <16 x i8> undef
323 //
test_vuninitializedq_s8(void)324 int8x16_t test_vuninitializedq_s8(void)
325 {
326 return vuninitializedq_s8();
327 }
328
329 // CHECK-LABEL: @test_vuninitializedq_u16(
330 // CHECK-NEXT: entry:
331 // CHECK-NEXT: ret <8 x i16> undef
332 //
test_vuninitializedq_u16(void)333 uint16x8_t test_vuninitializedq_u16(void)
334 {
335 return vuninitializedq_u16();
336 }
337
338 // CHECK-LABEL: @test_vuninitializedq_u32(
339 // CHECK-NEXT: entry:
340 // CHECK-NEXT: ret <4 x i32> undef
341 //
test_vuninitializedq_u32(void)342 uint32x4_t test_vuninitializedq_u32(void)
343 {
344 return vuninitializedq_u32();
345 }
346
347 // CHECK-LABEL: @test_vuninitializedq_u64(
348 // CHECK-NEXT: entry:
349 // CHECK-NEXT: ret <2 x i64> undef
350 //
test_vuninitializedq_u64(void)351 uint64x2_t test_vuninitializedq_u64(void)
352 {
353 return vuninitializedq_u64();
354 }
355
356 // CHECK-LABEL: @test_vuninitializedq_u8(
357 // CHECK-NEXT: entry:
358 // CHECK-NEXT: ret <16 x i8> undef
359 //
test_vuninitializedq_u8(void)360 uint8x16_t test_vuninitializedq_u8(void)
361 {
362 return vuninitializedq_u8();
363 }
364
365