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