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