]> git.lizzy.rs Git - rust.git/blob - tests/assembly/asm/aarch64-types.rs
Rollup merge of #106113 - krasimirgg:llvm-16-ext-tyid, r=nikic
[rust.git] / tests / assembly / asm / aarch64-types.rs
1 // assembly-output: emit-asm
2 // compile-flags: --target aarch64-unknown-linux-gnu
3 // needs-llvm-components: aarch64
4
5 #![feature(no_core, lang_items, rustc_attrs, repr_simd)]
6 #![crate_type = "rlib"]
7 #![no_core]
8 #![allow(asm_sub_register, non_camel_case_types)]
9
10 #[rustc_builtin_macro]
11 macro_rules! asm {
12     () => {};
13 }
14 #[rustc_builtin_macro]
15 macro_rules! concat {
16     () => {};
17 }
18 #[rustc_builtin_macro]
19 macro_rules! stringify {
20     () => {};
21 }
22
23 #[lang = "sized"]
24 trait Sized {}
25 #[lang = "copy"]
26 trait Copy {}
27
28 type ptr = *mut u8;
29
30 #[repr(simd)]
31 pub struct i8x8(i8, i8, i8, i8, i8, i8, i8, i8);
32 #[repr(simd)]
33 pub struct i16x4(i16, i16, i16, i16);
34 #[repr(simd)]
35 pub struct i32x2(i32, i32);
36 #[repr(simd)]
37 pub struct i64x1(i64);
38 #[repr(simd)]
39 pub struct f32x2(f32, f32);
40 #[repr(simd)]
41 pub struct f64x1(f64);
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 #[repr(simd)]
53 pub struct f64x2(f64, f64);
54
55 impl Copy for i8 {}
56 impl Copy for i16 {}
57 impl Copy for i32 {}
58 impl Copy for f32 {}
59 impl Copy for i64 {}
60 impl Copy for f64 {}
61 impl Copy for ptr {}
62 impl Copy for i8x8 {}
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 {}
74
75 extern "C" {
76     fn extern_func();
77     static extern_static: u8;
78 }
79
80 // CHECK-LABEL: sym_fn:
81 // CHECK: //APP
82 // CHECK: bl extern_func
83 // CHECK: //NO_APP
84 #[no_mangle]
85 pub unsafe fn sym_fn() {
86     asm!("bl {}", sym extern_func);
87 }
88
89 // CHECK-LABEL: sym_static:
90 // CHECK: //APP
91 // CHECK: adr x0, extern_static
92 // CHECK: //NO_APP
93 #[no_mangle]
94 pub unsafe fn sym_static() {
95     asm!("adr x0, {}", sym extern_static);
96 }
97
98 // Regression test for #75761
99 // CHECK-LABEL: issue_75761:
100 // CHECK: str {{.*}}x30
101 // CHECK: //APP
102 // CHECK: //NO_APP
103 // CHECK: ldr {{.*}}x30
104 #[no_mangle]
105 pub unsafe fn issue_75761() {
106     asm!("", out("v0") _, out("x30") _);
107 }
108
109 macro_rules! check {
110     ($func:ident $ty:ident $class:ident $mov:literal $modifier:literal) => {
111         #[no_mangle]
112         pub unsafe fn $func(x: $ty) -> $ty {
113             // Hack to avoid function merging
114             extern "Rust" {
115                 fn dont_merge(s: &str);
116             }
117             dont_merge(stringify!($func));
118
119             let y;
120             asm!(
121                 concat!($mov, " {:", $modifier, "}, {:", $modifier, "}"),
122                 out($class) y,
123                 in($class) x
124             );
125             y
126         }
127     };
128 }
129
130 macro_rules! check_reg {
131     ($func:ident $ty:ident $reg:tt $mov:literal) => {
132         #[no_mangle]
133         pub unsafe fn $func(x: $ty) -> $ty {
134             // Hack to avoid function merging
135             extern "Rust" {
136                 fn dont_merge(s: &str);
137             }
138             dont_merge(stringify!($func));
139
140             let y;
141             asm!(concat!($mov, " ", $reg, ", ", $reg), lateout($reg) y, in($reg) x);
142             y
143         }
144     };
145 }
146
147 // CHECK-LABEL: reg_i8:
148 // CHECK: //APP
149 // CHECK: mov x{{[0-9]+}}, x{{[0-9]+}}
150 // CHECK: //NO_APP
151 check!(reg_i8 i8 reg "mov" "");
152
153 // CHECK-LABEL: reg_i16:
154 // CHECK: //APP
155 // CHECK: mov x{{[0-9]+}}, x{{[0-9]+}}
156 // CHECK: //NO_APP
157 check!(reg_i16 i16 reg "mov" "");
158
159 // CHECK-LABEL: reg_i32:
160 // CHECK: //APP
161 // CHECK: mov x{{[0-9]+}}, x{{[0-9]+}}
162 // CHECK: //NO_APP
163 check!(reg_i32 i32 reg "mov" "");
164
165 // CHECK-LABEL: reg_f32:
166 // CHECK: //APP
167 // CHECK: mov x{{[0-9]+}}, x{{[0-9]+}}
168 // CHECK: //NO_APP
169 check!(reg_f32 f32 reg "mov" "");
170
171 // CHECK-LABEL: reg_i64:
172 // CHECK: //APP
173 // CHECK: mov x{{[0-9]+}}, x{{[0-9]+}}
174 // CHECK: //NO_APP
175 check!(reg_i64 i64 reg "mov" "");
176
177 // CHECK-LABEL: reg_f64:
178 // CHECK: //APP
179 // CHECK: mov x{{[0-9]+}}, x{{[0-9]+}}
180 // CHECK: //NO_APP
181 check!(reg_f64 f64 reg "mov" "");
182
183 // CHECK-LABEL: reg_ptr:
184 // CHECK: //APP
185 // CHECK: mov x{{[0-9]+}}, x{{[0-9]+}}
186 // CHECK: //NO_APP
187 check!(reg_ptr ptr reg "mov" "");
188
189 // CHECK-LABEL: vreg_i8:
190 // CHECK: //APP
191 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
192 // CHECK: //NO_APP
193 check!(vreg_i8 i8 vreg "fmov" "s");
194
195 // CHECK-LABEL: vreg_i16:
196 // CHECK: //APP
197 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
198 // CHECK: //NO_APP
199 check!(vreg_i16 i16 vreg "fmov" "s");
200
201 // CHECK-LABEL: vreg_i32:
202 // CHECK: //APP
203 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
204 // CHECK: //NO_APP
205 check!(vreg_i32 i32 vreg "fmov" "s");
206
207 // CHECK-LABEL: vreg_f32:
208 // CHECK: //APP
209 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
210 // CHECK: //NO_APP
211 check!(vreg_f32 f32 vreg "fmov" "s");
212
213 // CHECK-LABEL: vreg_i64:
214 // CHECK: //APP
215 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
216 // CHECK: //NO_APP
217 check!(vreg_i64 i64 vreg "fmov" "s");
218
219 // CHECK-LABEL: vreg_f64:
220 // CHECK: //APP
221 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
222 // CHECK: //NO_APP
223 check!(vreg_f64 f64 vreg "fmov" "s");
224
225 // CHECK-LABEL: vreg_ptr:
226 // CHECK: //APP
227 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
228 // CHECK: //NO_APP
229 check!(vreg_ptr ptr vreg "fmov" "s");
230
231 // CHECK-LABEL: vreg_i8x8:
232 // CHECK: //APP
233 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
234 // CHECK: //NO_APP
235 check!(vreg_i8x8 i8x8 vreg "fmov" "s");
236
237 // CHECK-LABEL: vreg_i16x4:
238 // CHECK: //APP
239 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
240 // CHECK: //NO_APP
241 check!(vreg_i16x4 i16x4 vreg "fmov" "s");
242
243 // CHECK-LABEL: vreg_i32x2:
244 // CHECK: //APP
245 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
246 // CHECK: //NO_APP
247 check!(vreg_i32x2 i32x2 vreg "fmov" "s");
248
249 // CHECK-LABEL: vreg_i64x1:
250 // CHECK: //APP
251 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
252 // CHECK: //NO_APP
253 check!(vreg_i64x1 i64x1 vreg "fmov" "s");
254
255 // CHECK-LABEL: vreg_f32x2:
256 // CHECK: //APP
257 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
258 // CHECK: //NO_APP
259 check!(vreg_f32x2 f32x2 vreg "fmov" "s");
260
261 // CHECK-LABEL: vreg_f64x1:
262 // CHECK: //APP
263 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
264 // CHECK: //NO_APP
265 check!(vreg_f64x1 f64x1 vreg "fmov" "s");
266
267 // CHECK-LABEL: vreg_i8x16:
268 // CHECK: //APP
269 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
270 // CHECK: //NO_APP
271 check!(vreg_i8x16 i8x16 vreg "fmov" "s");
272
273 // CHECK-LABEL: vreg_i16x8:
274 // CHECK: //APP
275 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
276 // CHECK: //NO_APP
277 check!(vreg_i16x8 i16x8 vreg "fmov" "s");
278
279 // CHECK-LABEL: vreg_i32x4:
280 // CHECK: //APP
281 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
282 // CHECK: //NO_APP
283 check!(vreg_i32x4 i32x4 vreg "fmov" "s");
284
285 // CHECK-LABEL: vreg_i64x2:
286 // CHECK: //APP
287 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
288 // CHECK: //NO_APP
289 check!(vreg_i64x2 i64x2 vreg "fmov" "s");
290
291 // CHECK-LABEL: vreg_f32x4:
292 // CHECK: //APP
293 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
294 // CHECK: //NO_APP
295 check!(vreg_f32x4 f32x4 vreg "fmov" "s");
296
297 // CHECK-LABEL: vreg_f64x2:
298 // CHECK: //APP
299 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
300 // CHECK: //NO_APP
301 check!(vreg_f64x2 f64x2 vreg "fmov" "s");
302
303 // CHECK-LABEL: vreg_low16_i8:
304 // CHECK: //APP
305 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
306 // CHECK: //NO_APP
307 check!(vreg_low16_i8 i8 vreg_low16 "fmov" "s");
308
309 // CHECK-LABEL: vreg_low16_i16:
310 // CHECK: //APP
311 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
312 // CHECK: //NO_APP
313 check!(vreg_low16_i16 i16 vreg_low16 "fmov" "s");
314
315 // CHECK-LABEL: vreg_low16_f32:
316 // CHECK: //APP
317 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
318 // CHECK: //NO_APP
319 check!(vreg_low16_f32 f32 vreg_low16 "fmov" "s");
320
321 // CHECK-LABEL: vreg_low16_i64:
322 // CHECK: //APP
323 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
324 // CHECK: //NO_APP
325 check!(vreg_low16_i64 i64 vreg_low16 "fmov" "s");
326
327 // CHECK-LABEL: vreg_low16_f64:
328 // CHECK: //APP
329 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
330 // CHECK: //NO_APP
331 check!(vreg_low16_f64 f64 vreg_low16 "fmov" "s");
332
333 // CHECK-LABEL: vreg_low16_ptr:
334 // CHECK: //APP
335 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
336 // CHECK: //NO_APP
337 check!(vreg_low16_ptr ptr vreg_low16 "fmov" "s");
338
339 // CHECK-LABEL: vreg_low16_i8x8:
340 // CHECK: //APP
341 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
342 // CHECK: //NO_APP
343 check!(vreg_low16_i8x8 i8x8 vreg_low16 "fmov" "s");
344
345 // CHECK-LABEL: vreg_low16_i16x4:
346 // CHECK: //APP
347 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
348 // CHECK: //NO_APP
349 check!(vreg_low16_i16x4 i16x4 vreg_low16 "fmov" "s");
350
351 // CHECK-LABEL: vreg_low16_i32x2:
352 // CHECK: //APP
353 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
354 // CHECK: //NO_APP
355 check!(vreg_low16_i32x2 i32x2 vreg_low16 "fmov" "s");
356
357 // CHECK-LABEL: vreg_low16_i64x1:
358 // CHECK: //APP
359 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
360 // CHECK: //NO_APP
361 check!(vreg_low16_i64x1 i64x1 vreg_low16 "fmov" "s");
362
363 // CHECK-LABEL: vreg_low16_f32x2:
364 // CHECK: //APP
365 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
366 // CHECK: //NO_APP
367 check!(vreg_low16_f32x2 f32x2 vreg_low16 "fmov" "s");
368
369 // CHECK-LABEL: vreg_low16_f64x1:
370 // CHECK: //APP
371 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
372 // CHECK: //NO_APP
373 check!(vreg_low16_f64x1 f64x1 vreg_low16 "fmov" "s");
374
375 // CHECK-LABEL: vreg_low16_i8x16:
376 // CHECK: //APP
377 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
378 // CHECK: //NO_APP
379 check!(vreg_low16_i8x16 i8x16 vreg_low16 "fmov" "s");
380
381 // CHECK-LABEL: vreg_low16_i16x8:
382 // CHECK: //APP
383 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
384 // CHECK: //NO_APP
385 check!(vreg_low16_i16x8 i16x8 vreg_low16 "fmov" "s");
386
387 // CHECK-LABEL: vreg_low16_i32x4:
388 // CHECK: //APP
389 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
390 // CHECK: //NO_APP
391 check!(vreg_low16_i32x4 i32x4 vreg_low16 "fmov" "s");
392
393 // CHECK-LABEL: vreg_low16_i64x2:
394 // CHECK: //APP
395 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
396 // CHECK: //NO_APP
397 check!(vreg_low16_i64x2 i64x2 vreg_low16 "fmov" "s");
398
399 // CHECK-LABEL: vreg_low16_f32x4:
400 // CHECK: //APP
401 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
402 // CHECK: //NO_APP
403 check!(vreg_low16_f32x4 f32x4 vreg_low16 "fmov" "s");
404
405 // CHECK-LABEL: vreg_low16_f64x2:
406 // CHECK: //APP
407 // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
408 // CHECK: //NO_APP
409 check!(vreg_low16_f64x2 f64x2 vreg_low16 "fmov" "s");
410
411 // CHECK-LABEL: x0_i8:
412 // CHECK: //APP
413 // CHECK: mov x{{[0-9]+}}, x{{[0-9]+}}
414 // CHECK: //NO_APP
415 check_reg!(x0_i8 i8 "x0" "mov");
416
417 // CHECK-LABEL: x0_i16:
418 // CHECK: //APP
419 // CHECK: mov x{{[0-9]+}}, x{{[0-9]+}}
420 // CHECK: //NO_APP
421 check_reg!(x0_i16 i16 "x0" "mov");
422
423 // CHECK-LABEL: x0_i32:
424 // CHECK: //APP
425 // CHECK: mov x{{[0-9]+}}, x{{[0-9]+}}
426 // CHECK: //NO_APP
427 check_reg!(x0_i32 i32 "x0" "mov");
428
429 // CHECK-LABEL: x0_f32:
430 // CHECK: //APP
431 // CHECK: mov x{{[0-9]+}}, x{{[0-9]+}}
432 // CHECK: //NO_APP
433 check_reg!(x0_f32 f32 "x0" "mov");
434
435 // CHECK-LABEL: x0_i64:
436 // CHECK: //APP
437 // CHECK: mov x{{[0-9]+}}, x{{[0-9]+}}
438 // CHECK: //NO_APP
439 check_reg!(x0_i64 i64 "x0" "mov");
440
441 // CHECK-LABEL: x0_f64:
442 // CHECK: //APP
443 // CHECK: mov x{{[0-9]+}}, x{{[0-9]+}}
444 // CHECK: //NO_APP
445 check_reg!(x0_f64 f64 "x0" "mov");
446
447 // CHECK-LABEL: x0_ptr:
448 // CHECK: //APP
449 // CHECK: mov x{{[0-9]+}}, x{{[0-9]+}}
450 // CHECK: //NO_APP
451 check_reg!(x0_ptr ptr "x0" "mov");
452
453 // CHECK-LABEL: v0_i8:
454 // CHECK: //APP
455 // CHECK: fmov s0, s0
456 // CHECK: //NO_APP
457 check_reg!(v0_i8 i8 "s0" "fmov");
458
459 // CHECK-LABEL: v0_i16:
460 // CHECK: //APP
461 // CHECK: fmov s0, s0
462 // CHECK: //NO_APP
463 check_reg!(v0_i16 i16 "s0" "fmov");
464
465 // CHECK-LABEL: v0_i32:
466 // CHECK: //APP
467 // CHECK: fmov s0, s0
468 // CHECK: //NO_APP
469 check_reg!(v0_i32 i32 "s0" "fmov");
470
471 // CHECK-LABEL: v0_f32:
472 // CHECK: //APP
473 // CHECK: fmov s0, s0
474 // CHECK: //NO_APP
475 check_reg!(v0_f32 f32 "s0" "fmov");
476
477 // CHECK-LABEL: v0_i64:
478 // CHECK: //APP
479 // CHECK: fmov s0, s0
480 // CHECK: //NO_APP
481 check_reg!(v0_i64 i64 "s0" "fmov");
482
483 // CHECK-LABEL: v0_f64:
484 // CHECK: //APP
485 // CHECK: fmov s0, s0
486 // CHECK: //NO_APP
487 check_reg!(v0_f64 f64 "s0" "fmov");
488
489 // CHECK-LABEL: v0_ptr:
490 // CHECK: //APP
491 // CHECK: fmov s0, s0
492 // CHECK: //NO_APP
493 check_reg!(v0_ptr ptr "s0" "fmov");
494
495 // CHECK-LABEL: v0_i8x8:
496 // CHECK: //APP
497 // CHECK: fmov s0, s0
498 // CHECK: //NO_APP
499 check_reg!(v0_i8x8 i8x8 "s0" "fmov");
500
501 // CHECK-LABEL: v0_i16x4:
502 // CHECK: //APP
503 // CHECK: fmov s0, s0
504 // CHECK: //NO_APP
505 check_reg!(v0_i16x4 i16x4 "s0" "fmov");
506
507 // CHECK-LABEL: v0_i32x2:
508 // CHECK: //APP
509 // CHECK: fmov s0, s0
510 // CHECK: //NO_APP
511 check_reg!(v0_i32x2 i32x2 "s0" "fmov");
512
513 // CHECK-LABEL: v0_i64x1:
514 // CHECK: //APP
515 // CHECK: fmov s0, s0
516 // CHECK: //NO_APP
517 check_reg!(v0_i64x1 i64x1 "s0" "fmov");
518
519 // CHECK-LABEL: v0_f32x2:
520 // CHECK: //APP
521 // CHECK: fmov s0, s0
522 // CHECK: //NO_APP
523 check_reg!(v0_f32x2 f32x2 "s0" "fmov");
524
525 // CHECK-LABEL: v0_f64x1:
526 // CHECK: //APP
527 // CHECK: fmov s0, s0
528 // CHECK: //NO_APP
529 check_reg!(v0_f64x1 f64x1 "s0" "fmov");
530
531 // CHECK-LABEL: v0_i8x16:
532 // CHECK: //APP
533 // CHECK: fmov s0, s0
534 // CHECK: //NO_APP
535 check_reg!(v0_i8x16 i8x16 "s0" "fmov");
536
537 // CHECK-LABEL: v0_i16x8:
538 // CHECK: //APP
539 // CHECK: fmov s0, s0
540 // CHECK: //NO_APP
541 check_reg!(v0_i16x8 i16x8 "s0" "fmov");
542
543 // CHECK-LABEL: v0_i32x4:
544 // CHECK: //APP
545 // CHECK: fmov s0, s0
546 // CHECK: //NO_APP
547 check_reg!(v0_i32x4 i32x4 "s0" "fmov");
548
549 // CHECK-LABEL: v0_i64x2:
550 // CHECK: //APP
551 // CHECK: fmov s0, s0
552 // CHECK: //NO_APP
553 check_reg!(v0_i64x2 i64x2 "s0" "fmov");
554
555 // CHECK-LABEL: v0_f32x4:
556 // CHECK: //APP
557 // CHECK: fmov s0, s0
558 // CHECK: //NO_APP
559 check_reg!(v0_f32x4 f32x4 "s0" "fmov");
560
561 // CHECK-LABEL: v0_f64x2:
562 // CHECK: //APP
563 // CHECK: fmov s0, s0
564 // CHECK: //NO_APP
565 check_reg!(v0_f64x2 f64x2 "s0" "fmov");