1 // assembly-output: emit-asm
2 // compile-flags: --target aarch64-unknown-linux-gnu
3 // needs-llvm-components: aarch64
5 #![feature(no_core, lang_items, rustc_attrs, repr_simd, asm_sym)]
6 #![crate_type = "rlib"]
8 #![allow(asm_sub_register, non_camel_case_types)]
10 #[rustc_builtin_macro]
14 #[rustc_builtin_macro]
18 #[rustc_builtin_macro]
19 macro_rules! stringify {
31 pub struct i8x8(i8, i8, i8, i8, i8, i8, i8, i8);
33 pub struct i16x4(i16, i16, i16, i16);
35 pub struct i32x2(i32, i32);
37 pub struct i64x1(i64);
39 pub struct f32x2(f32, f32);
41 pub struct f64x1(f64);
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);
53 pub struct f64x2(f64, f64);
63 impl Copy for i16x4 {}
64 impl Copy for i32x2 {}
65 impl Copy for i64x1 {}
66 impl Copy for f32x2 {}
67 impl Copy for f64x1 {}
68 impl Copy for i8x16 {}
69 impl Copy for i16x8 {}
70 impl Copy for i32x4 {}
71 impl Copy for i64x2 {}
72 impl Copy for f32x4 {}
73 impl Copy for f64x2 {}
77 static extern_static: u8;
80 // CHECK-LABEL: sym_fn:
82 // CHECK: bl extern_func
85 pub unsafe fn sym_fn() {
86 asm!("bl {}", sym extern_func);
89 // CHECK-LABEL: sym_static:
91 // CHECK: adr x0, extern_static
94 pub unsafe fn sym_static() {
95 asm!("adr x0, {}", sym extern_static);
98 // Regression test for #75761
99 // CHECK-LABEL: issue_75761:
100 // CHECK: str {{.*}}x30
103 // CHECK: ldr {{.*}}x30
105 pub unsafe fn issue_75761() {
106 asm!("", out("v0") _, out("x30") _);
110 ($func:ident $ty:ident $class:ident $mov:literal $modifier:literal) => {
112 pub unsafe fn $func(x: $ty) -> $ty {
113 // Hack to avoid function merging
115 fn dont_merge(s: &str);
117 dont_merge(stringify!($func));
121 concat!($mov, " {:", $modifier, "}, {:", $modifier, "}"),
130 macro_rules! check_reg {
131 ($func:ident $ty:ident $reg:tt $mov:literal) => {
133 pub unsafe fn $func(x: $ty) -> $ty {
134 // Hack to avoid function merging
136 fn dont_merge(s: &str);
138 dont_merge(stringify!($func));
141 asm!(concat!($mov, " ", $reg, ", ", $reg), lateout($reg) y, in($reg) x);
147 // CHECK-LABEL: reg_i8:
149 // CHECK: mov x{{[0-9]+}}, x{{[0-9]+}}
151 check!(reg_i8 i8 reg "mov" "");
153 // CHECK-LABEL: reg_i16:
155 // CHECK: mov x{{[0-9]+}}, x{{[0-9]+}}
157 check!(reg_i16 i16 reg "mov" "");
159 // CHECK-LABEL: reg_i32:
161 // CHECK: mov x{{[0-9]+}}, x{{[0-9]+}}
163 check!(reg_i32 i32 reg "mov" "");
165 // CHECK-LABEL: reg_f32:
167 // CHECK: mov x{{[0-9]+}}, x{{[0-9]+}}
169 check!(reg_f32 f32 reg "mov" "");
171 // CHECK-LABEL: reg_i64:
173 // CHECK: mov x{{[0-9]+}}, x{{[0-9]+}}
175 check!(reg_i64 i64 reg "mov" "");
177 // CHECK-LABEL: reg_f64:
179 // CHECK: mov x{{[0-9]+}}, x{{[0-9]+}}
181 check!(reg_f64 f64 reg "mov" "");
183 // CHECK-LABEL: reg_ptr:
185 // CHECK: mov x{{[0-9]+}}, x{{[0-9]+}}
187 check!(reg_ptr ptr reg "mov" "");
189 // CHECK-LABEL: vreg_i8:
191 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
193 check!(vreg_i8 i8 vreg "fmov" "s");
195 // CHECK-LABEL: vreg_i16:
197 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
199 check!(vreg_i16 i16 vreg "fmov" "s");
201 // CHECK-LABEL: vreg_i32:
203 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
205 check!(vreg_i32 i32 vreg "fmov" "s");
207 // CHECK-LABEL: vreg_f32:
209 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
211 check!(vreg_f32 f32 vreg "fmov" "s");
213 // CHECK-LABEL: vreg_i64:
215 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
217 check!(vreg_i64 i64 vreg "fmov" "s");
219 // CHECK-LABEL: vreg_f64:
221 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
223 check!(vreg_f64 f64 vreg "fmov" "s");
225 // CHECK-LABEL: vreg_ptr:
227 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
229 check!(vreg_ptr ptr vreg "fmov" "s");
231 // CHECK-LABEL: vreg_i8x8:
233 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
235 check!(vreg_i8x8 i8x8 vreg "fmov" "s");
237 // CHECK-LABEL: vreg_i16x4:
239 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
241 check!(vreg_i16x4 i16x4 vreg "fmov" "s");
243 // CHECK-LABEL: vreg_i32x2:
245 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
247 check!(vreg_i32x2 i32x2 vreg "fmov" "s");
249 // CHECK-LABEL: vreg_i64x1:
251 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
253 check!(vreg_i64x1 i64x1 vreg "fmov" "s");
255 // CHECK-LABEL: vreg_f32x2:
257 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
259 check!(vreg_f32x2 f32x2 vreg "fmov" "s");
261 // CHECK-LABEL: vreg_f64x1:
263 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
265 check!(vreg_f64x1 f64x1 vreg "fmov" "s");
267 // CHECK-LABEL: vreg_i8x16:
269 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
271 check!(vreg_i8x16 i8x16 vreg "fmov" "s");
273 // CHECK-LABEL: vreg_i16x8:
275 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
277 check!(vreg_i16x8 i16x8 vreg "fmov" "s");
279 // CHECK-LABEL: vreg_i32x4:
281 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
283 check!(vreg_i32x4 i32x4 vreg "fmov" "s");
285 // CHECK-LABEL: vreg_i64x2:
287 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
289 check!(vreg_i64x2 i64x2 vreg "fmov" "s");
291 // CHECK-LABEL: vreg_f32x4:
293 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
295 check!(vreg_f32x4 f32x4 vreg "fmov" "s");
297 // CHECK-LABEL: vreg_f64x2:
299 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
301 check!(vreg_f64x2 f64x2 vreg "fmov" "s");
303 // CHECK-LABEL: vreg_low16_i8:
305 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
307 check!(vreg_low16_i8 i8 vreg_low16 "fmov" "s");
309 // CHECK-LABEL: vreg_low16_i16:
311 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
313 check!(vreg_low16_i16 i16 vreg_low16 "fmov" "s");
315 // CHECK-LABEL: vreg_low16_f32:
317 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
319 check!(vreg_low16_f32 f32 vreg_low16 "fmov" "s");
321 // CHECK-LABEL: vreg_low16_i64:
323 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
325 check!(vreg_low16_i64 i64 vreg_low16 "fmov" "s");
327 // CHECK-LABEL: vreg_low16_f64:
329 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
331 check!(vreg_low16_f64 f64 vreg_low16 "fmov" "s");
333 // CHECK-LABEL: vreg_low16_ptr:
335 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
337 check!(vreg_low16_ptr ptr vreg_low16 "fmov" "s");
339 // CHECK-LABEL: vreg_low16_i8x8:
341 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
343 check!(vreg_low16_i8x8 i8x8 vreg_low16 "fmov" "s");
345 // CHECK-LABEL: vreg_low16_i16x4:
347 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
349 check!(vreg_low16_i16x4 i16x4 vreg_low16 "fmov" "s");
351 // CHECK-LABEL: vreg_low16_i32x2:
353 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
355 check!(vreg_low16_i32x2 i32x2 vreg_low16 "fmov" "s");
357 // CHECK-LABEL: vreg_low16_i64x1:
359 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
361 check!(vreg_low16_i64x1 i64x1 vreg_low16 "fmov" "s");
363 // CHECK-LABEL: vreg_low16_f32x2:
365 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
367 check!(vreg_low16_f32x2 f32x2 vreg_low16 "fmov" "s");
369 // CHECK-LABEL: vreg_low16_f64x1:
371 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
373 check!(vreg_low16_f64x1 f64x1 vreg_low16 "fmov" "s");
375 // CHECK-LABEL: vreg_low16_i8x16:
377 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
379 check!(vreg_low16_i8x16 i8x16 vreg_low16 "fmov" "s");
381 // CHECK-LABEL: vreg_low16_i16x8:
383 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
385 check!(vreg_low16_i16x8 i16x8 vreg_low16 "fmov" "s");
387 // CHECK-LABEL: vreg_low16_i32x4:
389 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
391 check!(vreg_low16_i32x4 i32x4 vreg_low16 "fmov" "s");
393 // CHECK-LABEL: vreg_low16_i64x2:
395 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
397 check!(vreg_low16_i64x2 i64x2 vreg_low16 "fmov" "s");
399 // CHECK-LABEL: vreg_low16_f32x4:
401 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
403 check!(vreg_low16_f32x4 f32x4 vreg_low16 "fmov" "s");
405 // CHECK-LABEL: vreg_low16_f64x2:
407 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
409 check!(vreg_low16_f64x2 f64x2 vreg_low16 "fmov" "s");
411 // CHECK-LABEL: x0_i8:
413 // CHECK: mov x{{[0-9]+}}, x{{[0-9]+}}
415 check_reg!(x0_i8 i8 "x0" "mov");
417 // CHECK-LABEL: x0_i16:
419 // CHECK: mov x{{[0-9]+}}, x{{[0-9]+}}
421 check_reg!(x0_i16 i16 "x0" "mov");
423 // CHECK-LABEL: x0_i32:
425 // CHECK: mov x{{[0-9]+}}, x{{[0-9]+}}
427 check_reg!(x0_i32 i32 "x0" "mov");
429 // CHECK-LABEL: x0_f32:
431 // CHECK: mov x{{[0-9]+}}, x{{[0-9]+}}
433 check_reg!(x0_f32 f32 "x0" "mov");
435 // CHECK-LABEL: x0_i64:
437 // CHECK: mov x{{[0-9]+}}, x{{[0-9]+}}
439 check_reg!(x0_i64 i64 "x0" "mov");
441 // CHECK-LABEL: x0_f64:
443 // CHECK: mov x{{[0-9]+}}, x{{[0-9]+}}
445 check_reg!(x0_f64 f64 "x0" "mov");
447 // CHECK-LABEL: x0_ptr:
449 // CHECK: mov x{{[0-9]+}}, x{{[0-9]+}}
451 check_reg!(x0_ptr ptr "x0" "mov");
453 // CHECK-LABEL: v0_i8:
455 // CHECK: fmov s0, s0
457 check_reg!(v0_i8 i8 "s0" "fmov");
459 // CHECK-LABEL: v0_i16:
461 // CHECK: fmov s0, s0
463 check_reg!(v0_i16 i16 "s0" "fmov");
465 // CHECK-LABEL: v0_i32:
467 // CHECK: fmov s0, s0
469 check_reg!(v0_i32 i32 "s0" "fmov");
471 // CHECK-LABEL: v0_f32:
473 // CHECK: fmov s0, s0
475 check_reg!(v0_f32 f32 "s0" "fmov");
477 // CHECK-LABEL: v0_i64:
479 // CHECK: fmov s0, s0
481 check_reg!(v0_i64 i64 "s0" "fmov");
483 // CHECK-LABEL: v0_f64:
485 // CHECK: fmov s0, s0
487 check_reg!(v0_f64 f64 "s0" "fmov");
489 // CHECK-LABEL: v0_ptr:
491 // CHECK: fmov s0, s0
493 check_reg!(v0_ptr ptr "s0" "fmov");
495 // CHECK-LABEL: v0_i8x8:
497 // CHECK: fmov s0, s0
499 check_reg!(v0_i8x8 i8x8 "s0" "fmov");
501 // CHECK-LABEL: v0_i16x4:
503 // CHECK: fmov s0, s0
505 check_reg!(v0_i16x4 i16x4 "s0" "fmov");
507 // CHECK-LABEL: v0_i32x2:
509 // CHECK: fmov s0, s0
511 check_reg!(v0_i32x2 i32x2 "s0" "fmov");
513 // CHECK-LABEL: v0_i64x1:
515 // CHECK: fmov s0, s0
517 check_reg!(v0_i64x1 i64x1 "s0" "fmov");
519 // CHECK-LABEL: v0_f32x2:
521 // CHECK: fmov s0, s0
523 check_reg!(v0_f32x2 f32x2 "s0" "fmov");
525 // CHECK-LABEL: v0_f64x1:
527 // CHECK: fmov s0, s0
529 check_reg!(v0_f64x1 f64x1 "s0" "fmov");
531 // CHECK-LABEL: v0_i8x16:
533 // CHECK: fmov s0, s0
535 check_reg!(v0_i8x16 i8x16 "s0" "fmov");
537 // CHECK-LABEL: v0_i16x8:
539 // CHECK: fmov s0, s0
541 check_reg!(v0_i16x8 i16x8 "s0" "fmov");
543 // CHECK-LABEL: v0_i32x4:
545 // CHECK: fmov s0, s0
547 check_reg!(v0_i32x4 i32x4 "s0" "fmov");
549 // CHECK-LABEL: v0_i64x2:
551 // CHECK: fmov s0, s0
553 check_reg!(v0_i64x2 i64x2 "s0" "fmov");
555 // CHECK-LABEL: v0_f32x4:
557 // CHECK: fmov s0, s0
559 check_reg!(v0_f32x4 f32x4 "s0" "fmov");
561 // CHECK-LABEL: v0_f64x2:
563 // CHECK: fmov s0, s0
565 check_reg!(v0_f64x2 f64x2 "s0" "fmov");