]> git.lizzy.rs Git - rust.git/blob - tests/assembly/asm/arm-types.rs
Rollup merge of #104965 - zacklukem:p-option-as_ref-docs, r=scottmcm
[rust.git] / tests / assembly / asm / arm-types.rs
1 // assembly-output: emit-asm
2 // compile-flags: --target armv7-unknown-linux-gnueabihf
3 // compile-flags: -C target-feature=+neon
4 // needs-llvm-components: arm
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 i8x16(i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8);
43 #[repr(simd)]
44 pub struct i16x8(i16, i16, i16, i16, i16, i16, i16, i16);
45 #[repr(simd)]
46 pub struct i32x4(i32, i32, i32, i32);
47 #[repr(simd)]
48 pub struct i64x2(i64, i64);
49 #[repr(simd)]
50 pub struct f32x4(f32, f32, f32, f32);
51
52 impl Copy for i8 {}
53 impl Copy for i16 {}
54 impl Copy for i32 {}
55 impl Copy for f32 {}
56 impl Copy for i64 {}
57 impl Copy for f64 {}
58 impl Copy for ptr {}
59 impl Copy for i8x8 {}
60 impl Copy for i16x4 {}
61 impl Copy for i32x2 {}
62 impl Copy for i64x1 {}
63 impl Copy for f32x2 {}
64 impl Copy for i8x16 {}
65 impl Copy for i16x8 {}
66 impl Copy for i32x4 {}
67 impl Copy for i64x2 {}
68 impl Copy for f32x4 {}
69
70 extern "C" {
71     fn extern_func();
72     static extern_static: u8;
73 }
74
75 // CHECK-LABEL: sym_fn:
76 // CHECK: @APP
77 // CHECK: bl extern_func
78 // CHECK: @NO_APP
79 #[no_mangle]
80 pub unsafe fn sym_fn() {
81     asm!("bl {}", sym extern_func);
82 }
83
84 // CHECK-LABEL: sym_static:
85 // CHECK: @APP
86 // CHECK: adr r0, extern_static
87 // CHECK: @NO_APP
88 #[no_mangle]
89 pub unsafe fn sym_static() {
90     asm!("adr r0, {}", sym extern_static);
91 }
92
93 // Regression test for #82052.
94 // CHECK-LABEL: issue_82052
95 // CHECK: push {{.*}}lr
96 // CHECK: @APP
97 // CHECK: @NO_APP
98 pub unsafe fn issue_82052() {
99     asm!("", out("r14") _);
100 }
101
102 macro_rules! check {
103     ($func:ident $ty:ident $class:ident $mov:literal) => {
104         #[no_mangle]
105         pub unsafe fn $func(x: $ty) -> $ty {
106             // Hack to avoid function merging
107             extern "Rust" {
108                 fn dont_merge(s: &str);
109             }
110             dont_merge(stringify!($func));
111
112             let y;
113             asm!(concat!($mov, " {}, {}"), out($class) y, in($class) x);
114             y
115         }
116     };
117 }
118
119 macro_rules! check_reg {
120     ($func:ident $ty:ident $reg:tt $mov:literal) => {
121         #[no_mangle]
122         pub unsafe fn $func(x: $ty) -> $ty {
123             // Hack to avoid function merging
124             extern "Rust" {
125                 fn dont_merge(s: &str);
126             }
127             dont_merge(stringify!($func));
128
129             let y;
130             asm!(concat!($mov, " ", $reg, ", ", $reg), lateout($reg) y, in($reg) x);
131             y
132         }
133     };
134 }
135
136 // CHECK-LABEL: reg_i8:
137 // CHECK: @APP
138 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
139 // CHECK: @NO_APP
140 check!(reg_i8 i8 reg "mov");
141
142 // CHECK-LABEL: reg_i16:
143 // CHECK: @APP
144 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
145 // CHECK: @NO_APP
146 check!(reg_i16 i16 reg "mov");
147
148 // CHECK-LABEL: reg_i32:
149 // CHECK: @APP
150 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
151 // CHECK: @NO_APP
152 check!(reg_i32 i32 reg "mov");
153
154 // CHECK-LABEL: reg_f32:
155 // CHECK: @APP
156 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
157 // CHECK: @NO_APP
158 check!(reg_f32 f32 reg "mov");
159
160 // CHECK-LABEL: reg_ptr:
161 // CHECK: @APP
162 // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
163 // CHECK: @NO_APP
164 check!(reg_ptr ptr reg "mov");
165
166 // CHECK-LABEL: sreg_i32:
167 // CHECK: @APP
168 // CHECK: vmov.f32 s{{[0-9]+}}, s{{[0-9]+}}
169 // CHECK: @NO_APP
170 check!(sreg_i32 i32 sreg "vmov.f32");
171
172 // CHECK-LABEL: sreg_f32:
173 // CHECK: @APP
174 // CHECK: vmov.f32 s{{[0-9]+}}, s{{[0-9]+}}
175 // CHECK: @NO_APP
176 check!(sreg_f32 f32 sreg "vmov.f32");
177
178 // CHECK-LABEL: sreg_ptr:
179 // CHECK: @APP
180 // CHECK: vmov.f32 s{{[0-9]+}}, s{{[0-9]+}}
181 // CHECK: @NO_APP
182 check!(sreg_ptr ptr sreg "vmov.f32");
183
184 // CHECK-LABEL: sreg_low16_i32:
185 // CHECK: @APP
186 // CHECK: vmov.f32 s{{[0-9]+}}, s{{[0-9]+}}
187 // CHECK: @NO_APP
188 check!(sreg_low16_i32 i32 sreg_low16 "vmov.f32");
189
190 // CHECK-LABEL: sreg_low16_f32:
191 // CHECK: @APP
192 // CHECK: vmov.f32 s{{[0-9]+}}, s{{[0-9]+}}
193 // CHECK: @NO_APP
194 check!(sreg_low16_f32 f32 sreg_low16 "vmov.f32");
195
196 // CHECK-LABEL: dreg_i64:
197 // CHECK: @APP
198 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
199 // CHECK: @NO_APP
200 check!(dreg_i64 i64 dreg "vmov.f64");
201
202 // CHECK-LABEL: dreg_f64:
203 // CHECK: @APP
204 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
205 // CHECK: @NO_APP
206 check!(dreg_f64 f64 dreg "vmov.f64");
207
208 // CHECK-LABEL: dreg_i8x8:
209 // CHECK: @APP
210 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
211 // CHECK: @NO_APP
212 check!(dreg_i8x8 i8x8 dreg "vmov.f64");
213
214 // CHECK-LABEL: dreg_i16x4:
215 // CHECK: @APP
216 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
217 // CHECK: @NO_APP
218 check!(dreg_i16x4 i16x4 dreg "vmov.f64");
219
220 // CHECK-LABEL: dreg_i32x2:
221 // CHECK: @APP
222 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
223 // CHECK: @NO_APP
224 check!(dreg_i32x2 i32x2 dreg "vmov.f64");
225
226 // CHECK-LABEL: dreg_i64x1:
227 // CHECK: @APP
228 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
229 // CHECK: @NO_APP
230 check!(dreg_i64x1 i64x1 dreg "vmov.f64");
231
232 // CHECK-LABEL: dreg_f32x2:
233 // CHECK: @APP
234 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
235 // CHECK: @NO_APP
236 check!(dreg_f32x2 f32x2 dreg "vmov.f64");
237
238 // CHECK-LABEL: dreg_low16_i64:
239 // CHECK: @APP
240 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
241 // CHECK: @NO_APP
242 check!(dreg_low16_i64 i64 dreg_low16 "vmov.f64");
243
244 // CHECK-LABEL: dreg_low16_f64:
245 // CHECK: @APP
246 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
247 // CHECK: @NO_APP
248 check!(dreg_low16_f64 f64 dreg_low16 "vmov.f64");
249
250 // CHECK-LABEL: dreg_low16_i8x8:
251 // CHECK: @APP
252 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
253 // CHECK: @NO_APP
254 check!(dreg_low16_i8x8 i8x8 dreg_low16 "vmov.f64");
255
256 // CHECK-LABEL: dreg_low16_i16x4:
257 // CHECK: @APP
258 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
259 // CHECK: @NO_APP
260 check!(dreg_low16_i16x4 i16x4 dreg_low16 "vmov.f64");
261
262 // CHECK-LABEL: dreg_low16_i32x2:
263 // CHECK: @APP
264 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
265 // CHECK: @NO_APP
266 check!(dreg_low16_i32x2 i32x2 dreg_low16 "vmov.f64");
267
268 // CHECK-LABEL: dreg_low16_i64x1:
269 // CHECK: @APP
270 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
271 // CHECK: @NO_APP
272 check!(dreg_low16_i64x1 i64x1 dreg_low16 "vmov.f64");
273
274 // CHECK-LABEL: dreg_low16_f32x2:
275 // CHECK: @APP
276 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
277 // CHECK: @NO_APP
278 check!(dreg_low16_f32x2 f32x2 dreg_low16 "vmov.f64");
279
280 // CHECK-LABEL: dreg_low8_i64:
281 // CHECK: @APP
282 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
283 // CHECK: @NO_APP
284 check!(dreg_low8_i64 i64 dreg_low8 "vmov.f64");
285
286 // CHECK-LABEL: dreg_low8_f64:
287 // CHECK: @APP
288 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
289 // CHECK: @NO_APP
290 check!(dreg_low8_f64 f64 dreg_low8 "vmov.f64");
291
292 // CHECK-LABEL: dreg_low8_i8x8:
293 // CHECK: @APP
294 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
295 // CHECK: @NO_APP
296 check!(dreg_low8_i8x8 i8x8 dreg_low8 "vmov.f64");
297
298 // CHECK-LABEL: dreg_low8_i16x4:
299 // CHECK: @APP
300 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
301 // CHECK: @NO_APP
302 check!(dreg_low8_i16x4 i16x4 dreg_low8 "vmov.f64");
303
304 // CHECK-LABEL: dreg_low8_i32x2:
305 // CHECK: @APP
306 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
307 // CHECK: @NO_APP
308 check!(dreg_low8_i32x2 i32x2 dreg_low8 "vmov.f64");
309
310 // CHECK-LABEL: dreg_low8_i64x1:
311 // CHECK: @APP
312 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
313 // CHECK: @NO_APP
314 check!(dreg_low8_i64x1 i64x1 dreg_low8 "vmov.f64");
315
316 // CHECK-LABEL: dreg_low8_f32x2:
317 // CHECK: @APP
318 // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
319 // CHECK: @NO_APP
320 check!(dreg_low8_f32x2 f32x2 dreg_low8 "vmov.f64");
321
322 // CHECK-LABEL: qreg_i8x16:
323 // CHECK: @APP
324 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
325 // CHECK: @NO_APP
326 check!(qreg_i8x16 i8x16 qreg "vmov");
327
328 // CHECK-LABEL: qreg_i16x8:
329 // CHECK: @APP
330 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
331 // CHECK: @NO_APP
332 check!(qreg_i16x8 i16x8 qreg "vmov");
333
334 // CHECK-LABEL: qreg_i32x4:
335 // CHECK: @APP
336 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
337 // CHECK: @NO_APP
338 check!(qreg_i32x4 i32x4 qreg "vmov");
339
340 // CHECK-LABEL: qreg_i64x2:
341 // CHECK: @APP
342 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
343 // CHECK: @NO_APP
344 check!(qreg_i64x2 i64x2 qreg "vmov");
345
346 // CHECK-LABEL: qreg_f32x4:
347 // CHECK: @APP
348 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
349 // CHECK: @NO_APP
350 check!(qreg_f32x4 f32x4 qreg "vmov");
351
352 // CHECK-LABEL: qreg_low8_i8x16:
353 // CHECK: @APP
354 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
355 // CHECK: @NO_APP
356 check!(qreg_low8_i8x16 i8x16 qreg_low8 "vmov");
357
358 // CHECK-LABEL: qreg_low8_i16x8:
359 // CHECK: @APP
360 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
361 // CHECK: @NO_APP
362 check!(qreg_low8_i16x8 i16x8 qreg_low8 "vmov");
363
364 // CHECK-LABEL: qreg_low8_i32x4:
365 // CHECK: @APP
366 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
367 // CHECK: @NO_APP
368 check!(qreg_low8_i32x4 i32x4 qreg_low8 "vmov");
369
370 // CHECK-LABEL: qreg_low8_i64x2:
371 // CHECK: @APP
372 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
373 // CHECK: @NO_APP
374 check!(qreg_low8_i64x2 i64x2 qreg_low8 "vmov");
375
376 // CHECK-LABEL: qreg_low8_f32x4:
377 // CHECK: @APP
378 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
379 // CHECK: @NO_APP
380 check!(qreg_low8_f32x4 f32x4 qreg_low8 "vmov");
381
382 // CHECK-LABEL: qreg_low4_i8x16:
383 // CHECK: @APP
384 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
385 // CHECK: @NO_APP
386 check!(qreg_low4_i8x16 i8x16 qreg_low4 "vmov");
387
388 // CHECK-LABEL: qreg_low4_i16x8:
389 // CHECK: @APP
390 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
391 // CHECK: @NO_APP
392 check!(qreg_low4_i16x8 i16x8 qreg_low4 "vmov");
393
394 // CHECK-LABEL: qreg_low4_i32x4:
395 // CHECK: @APP
396 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
397 // CHECK: @NO_APP
398 check!(qreg_low4_i32x4 i32x4 qreg_low4 "vmov");
399
400 // CHECK-LABEL: qreg_low4_i64x2:
401 // CHECK: @APP
402 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
403 // CHECK: @NO_APP
404 check!(qreg_low4_i64x2 i64x2 qreg_low4 "vmov");
405
406 // CHECK-LABEL: qreg_low4_f32x4:
407 // CHECK: @APP
408 // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
409 // CHECK: @NO_APP
410 check!(qreg_low4_f32x4 f32x4 qreg_low4 "vmov");
411
412 // CHECK-LABEL: r0_i8:
413 // CHECK: @APP
414 // CHECK: mov r0, r0
415 // CHECK: @NO_APP
416 check_reg!(r0_i8 i8 "r0" "mov");
417
418 // CHECK-LABEL: r0_i16:
419 // CHECK: @APP
420 // CHECK: mov r0, r0
421 // CHECK: @NO_APP
422 check_reg!(r0_i16 i16 "r0" "mov");
423
424 // CHECK-LABEL: r0_i32:
425 // CHECK: @APP
426 // CHECK: mov r0, r0
427 // CHECK: @NO_APP
428 check_reg!(r0_i32 i32 "r0" "mov");
429
430 // CHECK-LABEL: r0_f32:
431 // CHECK: @APP
432 // CHECK: mov r0, r0
433 // CHECK: @NO_APP
434 check_reg!(r0_f32 f32 "r0" "mov");
435
436 // CHECK-LABEL: r0_ptr:
437 // CHECK: @APP
438 // CHECK: mov r0, r0
439 // CHECK: @NO_APP
440 check_reg!(r0_ptr ptr "r0" "mov");
441
442 // CHECK-LABEL: s0_i32:
443 // CHECK: @APP
444 // CHECK: vmov.f32 s0, s0
445 // CHECK: @NO_APP
446 check_reg!(s0_i32 i32 "s0" "vmov.f32");
447
448 // CHECK-LABEL: s0_f32:
449 // CHECK: @APP
450 // CHECK: vmov.f32 s0, s0
451 // CHECK: @NO_APP
452 check_reg!(s0_f32 f32 "s0" "vmov.f32");
453
454 // CHECK-LABEL: s0_ptr:
455 // CHECK: @APP
456 // CHECK: vmov.f32 s0, s0
457 // CHECK: @NO_APP
458 check_reg!(s0_ptr ptr "s0" "vmov.f32");
459
460 // CHECK-LABEL: d0_i64:
461 // CHECK: @APP
462 // CHECK: vmov.f64 d0, d0
463 // CHECK: @NO_APP
464 check_reg!(d0_i64 i64 "d0" "vmov.f64");
465
466 // CHECK-LABEL: d0_f64:
467 // CHECK: @APP
468 // CHECK: vmov.f64 d0, d0
469 // CHECK: @NO_APP
470 check_reg!(d0_f64 f64 "d0" "vmov.f64");
471
472 // CHECK-LABEL: d0_i8x8:
473 // CHECK: @APP
474 // CHECK: vmov.f64 d0, d0
475 // CHECK: @NO_APP
476 check_reg!(d0_i8x8 i8x8 "d0" "vmov.f64");
477
478 // CHECK-LABEL: d0_i16x4:
479 // CHECK: @APP
480 // CHECK: vmov.f64 d0, d0
481 // CHECK: @NO_APP
482 check_reg!(d0_i16x4 i16x4 "d0" "vmov.f64");
483
484 // CHECK-LABEL: d0_i32x2:
485 // CHECK: @APP
486 // CHECK: vmov.f64 d0, d0
487 // CHECK: @NO_APP
488 check_reg!(d0_i32x2 i32x2 "d0" "vmov.f64");
489
490 // CHECK-LABEL: d0_i64x1:
491 // CHECK: @APP
492 // CHECK: vmov.f64 d0, d0
493 // CHECK: @NO_APP
494 check_reg!(d0_i64x1 i64x1 "d0" "vmov.f64");
495
496 // CHECK-LABEL: d0_f32x2:
497 // CHECK: @APP
498 // CHECK: vmov.f64 d0, d0
499 // CHECK: @NO_APP
500 check_reg!(d0_f32x2 f32x2 "d0" "vmov.f64");
501
502 // CHECK-LABEL: q0_i8x16:
503 // CHECK: @APP
504 // CHECK: vorr q0, q0, q0
505 // CHECK: @NO_APP
506 check_reg!(q0_i8x16 i8x16 "q0" "vmov");
507
508 // CHECK-LABEL: q0_i16x8:
509 // CHECK: @APP
510 // CHECK: vorr q0, q0, q0
511 // CHECK: @NO_APP
512 check_reg!(q0_i16x8 i16x8 "q0" "vmov");
513
514 // CHECK-LABEL: q0_i32x4:
515 // CHECK: @APP
516 // CHECK: vorr q0, q0, q0
517 // CHECK: @NO_APP
518 check_reg!(q0_i32x4 i32x4 "q0" "vmov");
519
520 // CHECK-LABEL: q0_i64x2:
521 // CHECK: @APP
522 // CHECK: vorr q0, q0, q0
523 // CHECK: @NO_APP
524 check_reg!(q0_i64x2 i64x2 "q0" "vmov");
525
526 // CHECK-LABEL: q0_f32x4:
527 // CHECK: @APP
528 // CHECK: vorr q0, q0, q0
529 // CHECK: @NO_APP
530 check_reg!(q0_f32x4 f32x4 "q0" "vmov");