]> git.proxmox.com Git - rustc.git/blob - src/test/assembly/asm/arm-types.rs
New upstream version 1.47.0~beta.2+dfsg1
[rustc.git] / src / test / assembly / asm / arm-types.rs
1 // no-system-llvm
2 // assembly-output: emit-asm
3 // compile-flags: --target armv7-unknown-linux-gnueabihf
4 // compile-flags: -C target-feature=+neon
5 // needs-llvm-components: arm
6
7 #![feature(no_core, lang_items, rustc_attrs, repr_simd)]
8 #![crate_type = "rlib"]
9 #![no_core]
10 #![allow(asm_sub_register, non_camel_case_types)]
11
12 #[rustc_builtin_macro]
13 macro_rules! asm {
14 () => {};
15 }
16 #[rustc_builtin_macro]
17 macro_rules! concat {
18 () => {};
19 }
20 #[rustc_builtin_macro]
21 macro_rules! stringify {
22 () => {};
23 }
24
25 #[lang = "sized"]
26 trait Sized {}
27 #[lang = "copy"]
28 trait Copy {}
29
30 type ptr = *mut u8;
31
32 #[repr(simd)]
33 pub struct i8x8(i8, i8, i8, i8, i8, i8, i8, i8);
34 #[repr(simd)]
35 pub struct i16x4(i16, i16, i16, i16);
36 #[repr(simd)]
37 pub struct i32x2(i32, i32);
38 #[repr(simd)]
39 pub struct i64x1(i64);
40 #[repr(simd)]
41 pub struct f32x2(f32, f32);
42 #[repr(simd)]
43 pub struct i8x16(i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8);
44 #[repr(simd)]
45 pub struct i16x8(i16, i16, i16, i16, i16, i16, i16, i16);
46 #[repr(simd)]
47 pub struct i32x4(i32, i32, i32, i32);
48 #[repr(simd)]
49 pub struct i64x2(i64, i64);
50 #[repr(simd)]
51 pub struct f32x4(f32, f32, f32, f32);
52
53 impl Copy for i8 {}
54 impl Copy for i16 {}
55 impl Copy for i32 {}
56 impl Copy for f32 {}
57 impl Copy for i64 {}
58 impl Copy for f64 {}
59 impl Copy for ptr {}
60 impl Copy for i8x8 {}
61 impl Copy for i16x4 {}
62 impl Copy for i32x2 {}
63 impl Copy for i64x1 {}
64 impl Copy for f32x2 {}
65 impl Copy for i8x16 {}
66 impl Copy for i16x8 {}
67 impl Copy for i32x4 {}
68 impl Copy for i64x2 {}
69 impl Copy for f32x4 {}
70
71 extern "C" {
72 fn extern_func();
73 static extern_static: u8;
74 }
75
76 // CHECK-LABEL: sym_fn:
77 // CHECK: @APP
78 // CHECK: bl extern_func
79 // CHECK: @NO_APP
80 #[no_mangle]
81 pub unsafe fn sym_fn() {
82 asm!("bl {}", sym extern_func);
83 }
84
85 // CHECK-LABEL: sym_static:
86 // CHECK: @APP
87 // CHECK: adr r0, extern_static
88 // CHECK: @NO_APP
89 #[no_mangle]
90 pub unsafe fn sym_static() {
91 asm!("adr r0, {}", sym extern_static);
92 }
93
94 macro_rules! check {
95 ($func:ident $ty:ident $class:ident $mov:literal) => {
96 #[no_mangle]
97 pub unsafe fn $func(x: $ty) -> $ty {
98 // Hack to avoid function merging
99 extern "Rust" {
100 fn dont_merge(s: &str);
101 }
102 dont_merge(stringify!($func));
103
104 let y;
105 asm!(concat!($mov, " {}, {}"), out($class) y, in($class) x);
106 y
107 }
108 };
109 }
110
111 macro_rules! check_reg {
112 ($func:ident $ty:ident $reg:tt $mov:literal) => {
113 #[no_mangle]
114 pub unsafe fn $func(x: $ty) -> $ty {
115 // Hack to avoid function merging
116 extern "Rust" {
117 fn dont_merge(s: &str);
118 }
119 dont_merge(stringify!($func));
120
121 let y;
122 asm!(concat!($mov, " ", $reg, ", ", $reg), lateout($reg) y, in($reg) x);
123 y
124 }
125 };
126 }
127
128 // CHECK-LABEL: reg_i8:
129 // CHECK: @APP
130 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
131 // CHECK: @NO_APP
132 check!(reg_i8 i8 reg "mov");
133
134 // CHECK-LABEL: reg_i16:
135 // CHECK: @APP
136 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
137 // CHECK: @NO_APP
138 check!(reg_i16 i16 reg "mov");
139
140 // CHECK-LABEL: reg_i32:
141 // CHECK: @APP
142 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
143 // CHECK: @NO_APP
144 check!(reg_i32 i32 reg "mov");
145
146 // CHECK-LABEL: reg_f32:
147 // CHECK: @APP
148 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
149 // CHECK: @NO_APP
150 check!(reg_f32 f32 reg "mov");
151
152 // CHECK-LABEL: reg_ptr:
153 // CHECK: @APP
154 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
155 // CHECK: @NO_APP
156 check!(reg_ptr ptr reg "mov");
157
158 // CHECK-LABEL: reg_thumb_i8:
159 // CHECK: @APP
160 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
161 // CHECK: @NO_APP
162 check!(reg_thumb_i8 i8 reg_thumb "mov");
163
164 // CHECK-LABEL: reg_thumb_i16:
165 // CHECK: @APP
166 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
167 // CHECK: @NO_APP
168 check!(reg_thumb_i16 i16 reg_thumb "mov");
169
170 // CHECK-LABEL: reg_thumb_i32:
171 // CHECK: @APP
172 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
173 // CHECK: @NO_APP
174 check!(reg_thumb_i32 i32 reg_thumb "mov");
175
176 // CHECK-LABEL: reg_thumb_f32:
177 // CHECK: @APP
178 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
179 // CHECK: @NO_APP
180 check!(reg_thumb_f32 f32 reg_thumb "mov");
181
182 // CHECK-LABEL: reg_thumb_ptr:
183 // CHECK: @APP
184 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
185 // CHECK: @NO_APP
186 check!(reg_thumb_ptr ptr reg_thumb "mov");
187
188 // CHECK-LABEL: sreg_i32:
189 // CHECK: @APP
190 // CHECK: vmov.f32 s{{[0-9]+}}, s{{[0-9]+}}
191 // CHECK: @NO_APP
192 check!(sreg_i32 i32 sreg "vmov.f32");
193
194 // CHECK-LABEL: sreg_f32:
195 // CHECK: @APP
196 // CHECK: vmov.f32 s{{[0-9]+}}, s{{[0-9]+}}
197 // CHECK: @NO_APP
198 check!(sreg_f32 f32 sreg "vmov.f32");
199
200 // CHECK-LABEL: sreg_ptr:
201 // CHECK: @APP
202 // CHECK: vmov.f32 s{{[0-9]+}}, s{{[0-9]+}}
203 // CHECK: @NO_APP
204 check!(sreg_ptr ptr sreg "vmov.f32");
205
206 // CHECK-LABEL: sreg_low16_i32:
207 // CHECK: @APP
208 // CHECK: vmov.f32 s{{[0-9]+}}, s{{[0-9]+}}
209 // CHECK: @NO_APP
210 check!(sreg_low16_i32 i32 sreg_low16 "vmov.f32");
211
212 // CHECK-LABEL: sreg_low16_f32:
213 // CHECK: @APP
214 // CHECK: vmov.f32 s{{[0-9]+}}, s{{[0-9]+}}
215 // CHECK: @NO_APP
216 check!(sreg_low16_f32 f32 sreg_low16 "vmov.f32");
217
218 // CHECK-LABEL: dreg_i64:
219 // CHECK: @APP
220 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
221 // CHECK: @NO_APP
222 check!(dreg_i64 i64 dreg "vmov.f64");
223
224 // CHECK-LABEL: dreg_f64:
225 // CHECK: @APP
226 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
227 // CHECK: @NO_APP
228 check!(dreg_f64 f64 dreg "vmov.f64");
229
230 // CHECK-LABEL: dreg_i8x8:
231 // CHECK: @APP
232 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
233 // CHECK: @NO_APP
234 check!(dreg_i8x8 i8x8 dreg "vmov.f64");
235
236 // CHECK-LABEL: dreg_i16x4:
237 // CHECK: @APP
238 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
239 // CHECK: @NO_APP
240 check!(dreg_i16x4 i16x4 dreg "vmov.f64");
241
242 // CHECK-LABEL: dreg_i32x2:
243 // CHECK: @APP
244 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
245 // CHECK: @NO_APP
246 check!(dreg_i32x2 i32x2 dreg "vmov.f64");
247
248 // CHECK-LABEL: dreg_i64x1:
249 // CHECK: @APP
250 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
251 // CHECK: @NO_APP
252 check!(dreg_i64x1 i64x1 dreg "vmov.f64");
253
254 // CHECK-LABEL: dreg_f32x2:
255 // CHECK: @APP
256 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
257 // CHECK: @NO_APP
258 check!(dreg_f32x2 f32x2 dreg "vmov.f64");
259
260 // CHECK-LABEL: dreg_low16_i64:
261 // CHECK: @APP
262 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
263 // CHECK: @NO_APP
264 check!(dreg_low16_i64 i64 dreg_low16 "vmov.f64");
265
266 // CHECK-LABEL: dreg_low16_f64:
267 // CHECK: @APP
268 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
269 // CHECK: @NO_APP
270 check!(dreg_low16_f64 f64 dreg_low16 "vmov.f64");
271
272 // CHECK-LABEL: dreg_low16_i8x8:
273 // CHECK: @APP
274 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
275 // CHECK: @NO_APP
276 check!(dreg_low16_i8x8 i8x8 dreg_low16 "vmov.f64");
277
278 // CHECK-LABEL: dreg_low16_i16x4:
279 // CHECK: @APP
280 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
281 // CHECK: @NO_APP
282 check!(dreg_low16_i16x4 i16x4 dreg_low16 "vmov.f64");
283
284 // CHECK-LABEL: dreg_low16_i32x2:
285 // CHECK: @APP
286 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
287 // CHECK: @NO_APP
288 check!(dreg_low16_i32x2 i32x2 dreg_low16 "vmov.f64");
289
290 // CHECK-LABEL: dreg_low16_i64x1:
291 // CHECK: @APP
292 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
293 // CHECK: @NO_APP
294 check!(dreg_low16_i64x1 i64x1 dreg_low16 "vmov.f64");
295
296 // CHECK-LABEL: dreg_low16_f32x2:
297 // CHECK: @APP
298 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
299 // CHECK: @NO_APP
300 check!(dreg_low16_f32x2 f32x2 dreg_low16 "vmov.f64");
301
302 // CHECK-LABEL: dreg_low8_i64:
303 // CHECK: @APP
304 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
305 // CHECK: @NO_APP
306 check!(dreg_low8_i64 i64 dreg_low8 "vmov.f64");
307
308 // CHECK-LABEL: dreg_low8_f64:
309 // CHECK: @APP
310 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
311 // CHECK: @NO_APP
312 check!(dreg_low8_f64 f64 dreg_low8 "vmov.f64");
313
314 // CHECK-LABEL: dreg_low8_i8x8:
315 // CHECK: @APP
316 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
317 // CHECK: @NO_APP
318 check!(dreg_low8_i8x8 i8x8 dreg_low8 "vmov.f64");
319
320 // CHECK-LABEL: dreg_low8_i16x4:
321 // CHECK: @APP
322 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
323 // CHECK: @NO_APP
324 check!(dreg_low8_i16x4 i16x4 dreg_low8 "vmov.f64");
325
326 // CHECK-LABEL: dreg_low8_i32x2:
327 // CHECK: @APP
328 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
329 // CHECK: @NO_APP
330 check!(dreg_low8_i32x2 i32x2 dreg_low8 "vmov.f64");
331
332 // CHECK-LABEL: dreg_low8_i64x1:
333 // CHECK: @APP
334 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
335 // CHECK: @NO_APP
336 check!(dreg_low8_i64x1 i64x1 dreg_low8 "vmov.f64");
337
338 // CHECK-LABEL: dreg_low8_f32x2:
339 // CHECK: @APP
340 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
341 // CHECK: @NO_APP
342 check!(dreg_low8_f32x2 f32x2 dreg_low8 "vmov.f64");
343
344 // CHECK-LABEL: qreg_i8x16:
345 // CHECK: @APP
346 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
347 // CHECK: @NO_APP
348 check!(qreg_i8x16 i8x16 qreg "vmov");
349
350 // CHECK-LABEL: qreg_i16x8:
351 // CHECK: @APP
352 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
353 // CHECK: @NO_APP
354 check!(qreg_i16x8 i16x8 qreg "vmov");
355
356 // CHECK-LABEL: qreg_i32x4:
357 // CHECK: @APP
358 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
359 // CHECK: @NO_APP
360 check!(qreg_i32x4 i32x4 qreg "vmov");
361
362 // CHECK-LABEL: qreg_i64x2:
363 // CHECK: @APP
364 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
365 // CHECK: @NO_APP
366 check!(qreg_i64x2 i64x2 qreg "vmov");
367
368 // CHECK-LABEL: qreg_f32x4:
369 // CHECK: @APP
370 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
371 // CHECK: @NO_APP
372 check!(qreg_f32x4 f32x4 qreg "vmov");
373
374 // CHECK-LABEL: qreg_low8_i8x16:
375 // CHECK: @APP
376 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
377 // CHECK: @NO_APP
378 check!(qreg_low8_i8x16 i8x16 qreg_low8 "vmov");
379
380 // CHECK-LABEL: qreg_low8_i16x8:
381 // CHECK: @APP
382 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
383 // CHECK: @NO_APP
384 check!(qreg_low8_i16x8 i16x8 qreg_low8 "vmov");
385
386 // CHECK-LABEL: qreg_low8_i32x4:
387 // CHECK: @APP
388 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
389 // CHECK: @NO_APP
390 check!(qreg_low8_i32x4 i32x4 qreg_low8 "vmov");
391
392 // CHECK-LABEL: qreg_low8_i64x2:
393 // CHECK: @APP
394 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
395 // CHECK: @NO_APP
396 check!(qreg_low8_i64x2 i64x2 qreg_low8 "vmov");
397
398 // CHECK-LABEL: qreg_low8_f32x4:
399 // CHECK: @APP
400 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
401 // CHECK: @NO_APP
402 check!(qreg_low8_f32x4 f32x4 qreg_low8 "vmov");
403
404 // CHECK-LABEL: qreg_low4_i8x16:
405 // CHECK: @APP
406 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
407 // CHECK: @NO_APP
408 check!(qreg_low4_i8x16 i8x16 qreg_low4 "vmov");
409
410 // CHECK-LABEL: qreg_low4_i16x8:
411 // CHECK: @APP
412 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
413 // CHECK: @NO_APP
414 check!(qreg_low4_i16x8 i16x8 qreg_low4 "vmov");
415
416 // CHECK-LABEL: qreg_low4_i32x4:
417 // CHECK: @APP
418 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
419 // CHECK: @NO_APP
420 check!(qreg_low4_i32x4 i32x4 qreg_low4 "vmov");
421
422 // CHECK-LABEL: qreg_low4_i64x2:
423 // CHECK: @APP
424 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
425 // CHECK: @NO_APP
426 check!(qreg_low4_i64x2 i64x2 qreg_low4 "vmov");
427
428 // CHECK-LABEL: qreg_low4_f32x4:
429 // CHECK: @APP
430 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
431 // CHECK: @NO_APP
432 check!(qreg_low4_f32x4 f32x4 qreg_low4 "vmov");
433
434 // CHECK-LABEL: r0_i8:
435 // CHECK: @APP
436 // CHECK: mov r0, r0
437 // CHECK: @NO_APP
438 check_reg!(r0_i8 i8 "r0" "mov");
439
440 // CHECK-LABEL: r0_i16:
441 // CHECK: @APP
442 // CHECK: mov r0, r0
443 // CHECK: @NO_APP
444 check_reg!(r0_i16 i16 "r0" "mov");
445
446 // CHECK-LABEL: r0_i32:
447 // CHECK: @APP
448 // CHECK: mov r0, r0
449 // CHECK: @NO_APP
450 check_reg!(r0_i32 i32 "r0" "mov");
451
452 // CHECK-LABEL: r0_f32:
453 // CHECK: @APP
454 // CHECK: mov r0, r0
455 // CHECK: @NO_APP
456 check_reg!(r0_f32 f32 "r0" "mov");
457
458 // CHECK-LABEL: r0_ptr:
459 // CHECK: @APP
460 // CHECK: mov r0, r0
461 // CHECK: @NO_APP
462 check_reg!(r0_ptr ptr "r0" "mov");
463
464 // CHECK-LABEL: s0_i32:
465 // CHECK: @APP
466 // CHECK: vmov.f32 s0, s0
467 // CHECK: @NO_APP
468 check_reg!(s0_i32 i32 "s0" "vmov.f32");
469
470 // CHECK-LABEL: s0_f32:
471 // CHECK: @APP
472 // CHECK: vmov.f32 s0, s0
473 // CHECK: @NO_APP
474 check_reg!(s0_f32 f32 "s0" "vmov.f32");
475
476 // CHECK-LABEL: s0_ptr:
477 // CHECK: @APP
478 // CHECK: vmov.f32 s0, s0
479 // CHECK: @NO_APP
480 check_reg!(s0_ptr ptr "s0" "vmov.f32");
481
482 // CHECK-LABEL: d0_i64:
483 // CHECK: @APP
484 // CHECK: vmov.f64 d0, d0
485 // CHECK: @NO_APP
486 check_reg!(d0_i64 i64 "d0" "vmov.f64");
487
488 // CHECK-LABEL: d0_f64:
489 // CHECK: @APP
490 // CHECK: vmov.f64 d0, d0
491 // CHECK: @NO_APP
492 check_reg!(d0_f64 f64 "d0" "vmov.f64");
493
494 // CHECK-LABEL: d0_i8x8:
495 // CHECK: @APP
496 // CHECK: vmov.f64 d0, d0
497 // CHECK: @NO_APP
498 check_reg!(d0_i8x8 i8x8 "d0" "vmov.f64");
499
500 // CHECK-LABEL: d0_i16x4:
501 // CHECK: @APP
502 // CHECK: vmov.f64 d0, d0
503 // CHECK: @NO_APP
504 check_reg!(d0_i16x4 i16x4 "d0" "vmov.f64");
505
506 // CHECK-LABEL: d0_i32x2:
507 // CHECK: @APP
508 // CHECK: vmov.f64 d0, d0
509 // CHECK: @NO_APP
510 check_reg!(d0_i32x2 i32x2 "d0" "vmov.f64");
511
512 // CHECK-LABEL: d0_i64x1:
513 // CHECK: @APP
514 // CHECK: vmov.f64 d0, d0
515 // CHECK: @NO_APP
516 check_reg!(d0_i64x1 i64x1 "d0" "vmov.f64");
517
518 // CHECK-LABEL: d0_f32x2:
519 // CHECK: @APP
520 // CHECK: vmov.f64 d0, d0
521 // CHECK: @NO_APP
522 check_reg!(d0_f32x2 f32x2 "d0" "vmov.f64");
523
524 // CHECK-LABEL: q0_i8x16:
525 // CHECK: @APP
526 // CHECK: vorr q0, q0, q0
527 // CHECK: @NO_APP
528 check_reg!(q0_i8x16 i8x16 "q0" "vmov");
529
530 // CHECK-LABEL: q0_i16x8:
531 // CHECK: @APP
532 // CHECK: vorr q0, q0, q0
533 // CHECK: @NO_APP
534 check_reg!(q0_i16x8 i16x8 "q0" "vmov");
535
536 // CHECK-LABEL: q0_i32x4:
537 // CHECK: @APP
538 // CHECK: vorr q0, q0, q0
539 // CHECK: @NO_APP
540 check_reg!(q0_i32x4 i32x4 "q0" "vmov");
541
542 // CHECK-LABEL: q0_i64x2:
543 // CHECK: @APP
544 // CHECK: vorr q0, q0, q0
545 // CHECK: @NO_APP
546 check_reg!(q0_i64x2 i64x2 "q0" "vmov");
547
548 // CHECK-LABEL: q0_f32x4:
549 // CHECK: @APP
550 // CHECK: vorr q0, q0, q0
551 // CHECK: @NO_APP
552 check_reg!(q0_f32x4 f32x4 "q0" "vmov");