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
7 #![feature(no_core, lang_items, rustc_attrs, repr_simd)]
8 #![crate_type = "rlib"]
10 #![allow(asm_sub_register, non_camel_case_types)]
12 #[rustc_builtin_macro]
16 #[rustc_builtin_macro]
20 #[rustc_builtin_macro]
21 macro_rules
! stringify
{
33 pub struct i8x8(i8, i8, i8, i8, i8, i8, i8, i8);
35 pub struct i16x4(i16, i16, i16, i16);
37 pub struct i32x2(i32, i32);
39 pub struct i64x1(i64);
41 pub struct f32x2(f32, f32);
43 pub struct i8x16(i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8);
45 pub struct i16x8(i16, i16, i16, i16, i16, i16, i16, i16);
47 pub struct i32x4(i32, i32, i32, i32);
49 pub struct i64x2(i64, i64);
51 pub struct f32x4(f32, f32, f32, f32);
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 {}
73 static extern_static
: u8;
76 // CHECK-LABEL: sym_fn:
78 // CHECK: bl extern_func
81 pub unsafe fn sym_fn() {
82 asm
!("bl {}", sym extern_func
);
85 // CHECK-LABEL: sym_static:
87 // CHECK: adr r0, extern_static
90 pub unsafe fn sym_static() {
91 asm
!("adr r0, {}", sym extern_static
);
94 // Regression test for #82052.
95 // CHECK-LABEL: issue_82052
96 // CHECK: push {{.*}}lr
99 pub unsafe fn issue_82052() {
100 asm
!("", out("r14") _
);
104 ($func
:ident $ty
:ident $class
:ident $mov
:literal
) => {
106 pub unsafe fn $
func(x
: $ty
) -> $ty
{
107 // Hack to avoid function merging
109 fn dont_merge(s
: &str);
111 dont_merge(stringify
!($func
));
114 asm
!(concat
!($mov
, " {}, {}"), out($class
) y
, in($class
) x
);
120 macro_rules
! check_reg
{
121 ($func
:ident $ty
:ident $reg
:tt $mov
:literal
) => {
123 pub unsafe fn $
func(x
: $ty
) -> $ty
{
124 // Hack to avoid function merging
126 fn dont_merge(s
: &str);
128 dont_merge(stringify
!($func
));
131 asm
!(concat
!($mov
, " ", $reg
, ", ", $reg
), lateout($reg
) y
, in($reg
) x
);
137 // CHECK-LABEL: reg_i8:
139 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
141 check
!(reg_i8
i8 reg
"mov");
143 // CHECK-LABEL: reg_i16:
145 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
147 check
!(reg_i16
i16 reg
"mov");
149 // CHECK-LABEL: reg_i32:
151 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
153 check
!(reg_i32
i32 reg
"mov");
155 // CHECK-LABEL: reg_f32:
157 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
159 check
!(reg_f32
f32 reg
"mov");
161 // CHECK-LABEL: reg_ptr:
163 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
165 check
!(reg_ptr ptr reg
"mov");
167 // CHECK-LABEL: reg_thumb_i8:
169 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
171 check
!(reg_thumb_i8
i8 reg_thumb
"mov");
173 // CHECK-LABEL: reg_thumb_i16:
175 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
177 check
!(reg_thumb_i16
i16 reg_thumb
"mov");
179 // CHECK-LABEL: reg_thumb_i32:
181 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
183 check
!(reg_thumb_i32
i32 reg_thumb
"mov");
185 // CHECK-LABEL: reg_thumb_f32:
187 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
189 check
!(reg_thumb_f32
f32 reg_thumb
"mov");
191 // CHECK-LABEL: reg_thumb_ptr:
193 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
195 check
!(reg_thumb_ptr ptr reg_thumb
"mov");
197 // CHECK-LABEL: sreg_i32:
199 // CHECK: vmov.f32 s{{[0-9]+}}, s{{[0-9]+}}
201 check
!(sreg_i32
i32 sreg
"vmov.f32");
203 // CHECK-LABEL: sreg_f32:
205 // CHECK: vmov.f32 s{{[0-9]+}}, s{{[0-9]+}}
207 check
!(sreg_f32
f32 sreg
"vmov.f32");
209 // CHECK-LABEL: sreg_ptr:
211 // CHECK: vmov.f32 s{{[0-9]+}}, s{{[0-9]+}}
213 check
!(sreg_ptr ptr sreg
"vmov.f32");
215 // CHECK-LABEL: sreg_low16_i32:
217 // CHECK: vmov.f32 s{{[0-9]+}}, s{{[0-9]+}}
219 check
!(sreg_low16_i32
i32 sreg_low16
"vmov.f32");
221 // CHECK-LABEL: sreg_low16_f32:
223 // CHECK: vmov.f32 s{{[0-9]+}}, s{{[0-9]+}}
225 check
!(sreg_low16_f32
f32 sreg_low16
"vmov.f32");
227 // CHECK-LABEL: dreg_i64:
229 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
231 check
!(dreg_i64
i64 dreg
"vmov.f64");
233 // CHECK-LABEL: dreg_f64:
235 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
237 check
!(dreg_f64
f64 dreg
"vmov.f64");
239 // CHECK-LABEL: dreg_i8x8:
241 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
243 check
!(dreg_i8x8 i8x8 dreg
"vmov.f64");
245 // CHECK-LABEL: dreg_i16x4:
247 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
249 check
!(dreg_i16x4 i16x4 dreg
"vmov.f64");
251 // CHECK-LABEL: dreg_i32x2:
253 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
255 check
!(dreg_i32x2 i32x2 dreg
"vmov.f64");
257 // CHECK-LABEL: dreg_i64x1:
259 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
261 check
!(dreg_i64x1 i64x1 dreg
"vmov.f64");
263 // CHECK-LABEL: dreg_f32x2:
265 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
267 check
!(dreg_f32x2 f32x2 dreg
"vmov.f64");
269 // CHECK-LABEL: dreg_low16_i64:
271 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
273 check
!(dreg_low16_i64
i64 dreg_low16
"vmov.f64");
275 // CHECK-LABEL: dreg_low16_f64:
277 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
279 check
!(dreg_low16_f64
f64 dreg_low16
"vmov.f64");
281 // CHECK-LABEL: dreg_low16_i8x8:
283 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
285 check
!(dreg_low16_i8x8 i8x8 dreg_low16
"vmov.f64");
287 // CHECK-LABEL: dreg_low16_i16x4:
289 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
291 check
!(dreg_low16_i16x4 i16x4 dreg_low16
"vmov.f64");
293 // CHECK-LABEL: dreg_low16_i32x2:
295 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
297 check
!(dreg_low16_i32x2 i32x2 dreg_low16
"vmov.f64");
299 // CHECK-LABEL: dreg_low16_i64x1:
301 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
303 check
!(dreg_low16_i64x1 i64x1 dreg_low16
"vmov.f64");
305 // CHECK-LABEL: dreg_low16_f32x2:
307 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
309 check
!(dreg_low16_f32x2 f32x2 dreg_low16
"vmov.f64");
311 // CHECK-LABEL: dreg_low8_i64:
313 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
315 check
!(dreg_low8_i64
i64 dreg_low8
"vmov.f64");
317 // CHECK-LABEL: dreg_low8_f64:
319 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
321 check
!(dreg_low8_f64
f64 dreg_low8
"vmov.f64");
323 // CHECK-LABEL: dreg_low8_i8x8:
325 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
327 check
!(dreg_low8_i8x8 i8x8 dreg_low8
"vmov.f64");
329 // CHECK-LABEL: dreg_low8_i16x4:
331 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
333 check
!(dreg_low8_i16x4 i16x4 dreg_low8
"vmov.f64");
335 // CHECK-LABEL: dreg_low8_i32x2:
337 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
339 check
!(dreg_low8_i32x2 i32x2 dreg_low8
"vmov.f64");
341 // CHECK-LABEL: dreg_low8_i64x1:
343 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
345 check
!(dreg_low8_i64x1 i64x1 dreg_low8
"vmov.f64");
347 // CHECK-LABEL: dreg_low8_f32x2:
349 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
351 check
!(dreg_low8_f32x2 f32x2 dreg_low8
"vmov.f64");
353 // CHECK-LABEL: qreg_i8x16:
355 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
357 check
!(qreg_i8x16 i8x16 qreg
"vmov");
359 // CHECK-LABEL: qreg_i16x8:
361 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
363 check
!(qreg_i16x8 i16x8 qreg
"vmov");
365 // CHECK-LABEL: qreg_i32x4:
367 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
369 check
!(qreg_i32x4 i32x4 qreg
"vmov");
371 // CHECK-LABEL: qreg_i64x2:
373 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
375 check
!(qreg_i64x2 i64x2 qreg
"vmov");
377 // CHECK-LABEL: qreg_f32x4:
379 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
381 check
!(qreg_f32x4 f32x4 qreg
"vmov");
383 // CHECK-LABEL: qreg_low8_i8x16:
385 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
387 check
!(qreg_low8_i8x16 i8x16 qreg_low8
"vmov");
389 // CHECK-LABEL: qreg_low8_i16x8:
391 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
393 check
!(qreg_low8_i16x8 i16x8 qreg_low8
"vmov");
395 // CHECK-LABEL: qreg_low8_i32x4:
397 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
399 check
!(qreg_low8_i32x4 i32x4 qreg_low8
"vmov");
401 // CHECK-LABEL: qreg_low8_i64x2:
403 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
405 check
!(qreg_low8_i64x2 i64x2 qreg_low8
"vmov");
407 // CHECK-LABEL: qreg_low8_f32x4:
409 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
411 check
!(qreg_low8_f32x4 f32x4 qreg_low8
"vmov");
413 // CHECK-LABEL: qreg_low4_i8x16:
415 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
417 check
!(qreg_low4_i8x16 i8x16 qreg_low4
"vmov");
419 // CHECK-LABEL: qreg_low4_i16x8:
421 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
423 check
!(qreg_low4_i16x8 i16x8 qreg_low4
"vmov");
425 // CHECK-LABEL: qreg_low4_i32x4:
427 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
429 check
!(qreg_low4_i32x4 i32x4 qreg_low4
"vmov");
431 // CHECK-LABEL: qreg_low4_i64x2:
433 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
435 check
!(qreg_low4_i64x2 i64x2 qreg_low4
"vmov");
437 // CHECK-LABEL: qreg_low4_f32x4:
439 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
441 check
!(qreg_low4_f32x4 f32x4 qreg_low4
"vmov");
443 // CHECK-LABEL: r0_i8:
447 check_reg
!(r0_i8
i8 "r0" "mov");
449 // CHECK-LABEL: r0_i16:
453 check_reg
!(r0_i16
i16 "r0" "mov");
455 // CHECK-LABEL: r0_i32:
459 check_reg
!(r0_i32
i32 "r0" "mov");
461 // CHECK-LABEL: r0_f32:
465 check_reg
!(r0_f32
f32 "r0" "mov");
467 // CHECK-LABEL: r0_ptr:
471 check_reg
!(r0_ptr ptr
"r0" "mov");
473 // CHECK-LABEL: s0_i32:
475 // CHECK: vmov.f32 s0, s0
477 check_reg
!(s0_i32
i32 "s0" "vmov.f32");
479 // CHECK-LABEL: s0_f32:
481 // CHECK: vmov.f32 s0, s0
483 check_reg
!(s0_f32
f32 "s0" "vmov.f32");
485 // CHECK-LABEL: s0_ptr:
487 // CHECK: vmov.f32 s0, s0
489 check_reg
!(s0_ptr ptr
"s0" "vmov.f32");
491 // CHECK-LABEL: d0_i64:
493 // CHECK: vmov.f64 d0, d0
495 check_reg
!(d0_i64
i64 "d0" "vmov.f64");
497 // CHECK-LABEL: d0_f64:
499 // CHECK: vmov.f64 d0, d0
501 check_reg
!(d0_f64
f64 "d0" "vmov.f64");
503 // CHECK-LABEL: d0_i8x8:
505 // CHECK: vmov.f64 d0, d0
507 check_reg
!(d0_i8x8 i8x8
"d0" "vmov.f64");
509 // CHECK-LABEL: d0_i16x4:
511 // CHECK: vmov.f64 d0, d0
513 check_reg
!(d0_i16x4 i16x4
"d0" "vmov.f64");
515 // CHECK-LABEL: d0_i32x2:
517 // CHECK: vmov.f64 d0, d0
519 check_reg
!(d0_i32x2 i32x2
"d0" "vmov.f64");
521 // CHECK-LABEL: d0_i64x1:
523 // CHECK: vmov.f64 d0, d0
525 check_reg
!(d0_i64x1 i64x1
"d0" "vmov.f64");
527 // CHECK-LABEL: d0_f32x2:
529 // CHECK: vmov.f64 d0, d0
531 check_reg
!(d0_f32x2 f32x2
"d0" "vmov.f64");
533 // CHECK-LABEL: q0_i8x16:
535 // CHECK: vorr q0, q0, q0
537 check_reg
!(q0_i8x16 i8x16
"q0" "vmov");
539 // CHECK-LABEL: q0_i16x8:
541 // CHECK: vorr q0, q0, q0
543 check_reg
!(q0_i16x8 i16x8
"q0" "vmov");
545 // CHECK-LABEL: q0_i32x4:
547 // CHECK: vorr q0, q0, q0
549 check_reg
!(q0_i32x4 i32x4
"q0" "vmov");
551 // CHECK-LABEL: q0_i64x2:
553 // CHECK: vorr q0, q0, q0
555 check_reg
!(q0_i64x2 i64x2
"q0" "vmov");
557 // CHECK-LABEL: q0_f32x4:
559 // CHECK: vorr q0, q0, q0
561 check_reg
!(q0_f32x4 f32x4
"q0" "vmov");