]> git.lizzy.rs Git - rust.git/blob - src/test/assembly/asm/arm-modifiers.rs
Merge commit '9809f5d21990d9e24b3e9876ea7da756fd4e9def' into libgccjit-codegen
[rust.git] / src / test / assembly / asm / arm-modifiers.rs
1 // min-llvm-version: 10.0.1
2 // assembly-output: emit-asm
3 // compile-flags: -O
4 // compile-flags: --target armv7-unknown-linux-gnueabihf
5 // compile-flags: -C target-feature=+neon
6 // needs-llvm-components: arm
7
8 #![feature(no_core, lang_items, rustc_attrs, repr_simd)]
9 #![crate_type = "rlib"]
10 #![no_core]
11 #![allow(asm_sub_register, non_camel_case_types)]
12
13 #[rustc_builtin_macro]
14 macro_rules! asm {
15     () => {};
16 }
17 #[rustc_builtin_macro]
18 macro_rules! concat {
19     () => {};
20 }
21 #[rustc_builtin_macro]
22 macro_rules! stringify {
23     () => {};
24 }
25
26 #[lang = "sized"]
27 trait Sized {}
28 #[lang = "copy"]
29 trait Copy {}
30
31 #[repr(simd)]
32 pub struct f32x4(f32, f32, f32, f32);
33
34 impl Copy for i32 {}
35 impl Copy for f32 {}
36 impl Copy for f64 {}
37 impl Copy for f32x4 {}
38
39 macro_rules! check {
40     ($func:ident $modifier:literal $reg:ident $ty:ident $mov:literal) => {
41         // -O and extern "C" guarantee that the selected register is always r0/s0/d0/q0
42         #[no_mangle]
43         pub unsafe extern "C" fn $func() -> $ty {
44             // Hack to avoid function merging
45             extern "Rust" {
46                 fn dont_merge(s: &str);
47             }
48             dont_merge(stringify!($func));
49
50             let y;
51             asm!(concat!($mov, " {0:", $modifier, "}, {0:", $modifier, "}"), out($reg) y);
52             y
53         }
54     };
55 }
56
57 // CHECK-LABEL: reg:
58 // CHECK: @APP
59 // CHECK: mov r0, r0
60 // CHECK: @NO_APP
61 check!(reg "" reg i32 "mov");
62
63 // CHECK-LABEL: reg_thumb:
64 // CHECK: @APP
65 // CHECK: mov r0, r0
66 // CHECK: @NO_APP
67 check!(reg_thumb "" reg_thumb i32 "mov");
68
69 // CHECK-LABEL: sreg:
70 // CHECK: @APP
71 // CHECK: vmov.f32 s0, s0
72 // CHECK: @NO_APP
73 check!(sreg "" sreg f32 "vmov.f32");
74
75 // CHECK-LABEL: sreg_low16:
76 // CHECK: @APP
77 // CHECK: vmov.f32 s0, s0
78 // CHECK: @NO_APP
79 check!(sreg_low16 "" sreg_low16 f32 "vmov.f32");
80
81 // CHECK-LABEL: dreg:
82 // CHECK: @APP
83 // CHECK: vmov.f64 d0, d0
84 // CHECK: @NO_APP
85 check!(dreg "" dreg f64 "vmov.f64");
86
87 // CHECK-LABEL: dreg_low16:
88 // CHECK: @APP
89 // CHECK: vmov.f64 d0, d0
90 // CHECK: @NO_APP
91 check!(dreg_low16 "" dreg_low16 f64 "vmov.f64");
92
93 // CHECK-LABEL: dreg_low8:
94 // CHECK: @APP
95 // CHECK: vmov.f64 d0, d0
96 // CHECK: @NO_APP
97 check!(dreg_low8 "" dreg_low8 f64 "vmov.f64");
98
99 // CHECK-LABEL: qreg:
100 // CHECK: @APP
101 // CHECK: vorr q0, q0, q0
102 // CHECK: @NO_APP
103 check!(qreg "" qreg f32x4 "vmov");
104
105 // CHECK-LABEL: qreg_e:
106 // CHECK: @APP
107 // CHECK: vmov.f64 d0, d0
108 // CHECK: @NO_APP
109 check!(qreg_e "e" qreg f32x4 "vmov.f64");
110
111 // CHECK-LABEL: qreg_f:
112 // CHECK: @APP
113 // CHECK: vmov.f64 d1, d1
114 // CHECK: @NO_APP
115 check!(qreg_f "f" qreg f32x4 "vmov.f64");
116
117 // CHECK-LABEL: qreg_low8:
118 // CHECK: @APP
119 // CHECK: vorr q0, q0, q0
120 // CHECK: @NO_APP
121 check!(qreg_low8 "" qreg_low8 f32x4 "vmov");
122
123 // CHECK-LABEL: qreg_low8_e:
124 // CHECK: @APP
125 // CHECK: vmov.f64 d0, d0
126 // CHECK: @NO_APP
127 check!(qreg_low8_e "e" qreg_low8 f32x4 "vmov.f64");
128
129 // CHECK-LABEL: qreg_low8_f:
130 // CHECK: @APP
131 // CHECK: vmov.f64 d1, d1
132 // CHECK: @NO_APP
133 check!(qreg_low8_f "f" qreg_low8 f32x4 "vmov.f64");
134
135 // CHECK-LABEL: qreg_low4:
136 // CHECK: @APP
137 // CHECK: vorr q0, q0, q0
138 // CHECK: @NO_APP
139 check!(qreg_low4 "" qreg_low4 f32x4 "vmov");
140
141 // CHECK-LABEL: qreg_low4_e:
142 // CHECK: @APP
143 // CHECK: vmov.f64 d0, d0
144 // CHECK: @NO_APP
145 check!(qreg_low4_e "e" qreg_low4 f32x4 "vmov.f64");
146
147 // CHECK-LABEL: qreg_low4_f:
148 // CHECK: @APP
149 // CHECK: vmov.f64 d1, d1
150 // CHECK: @NO_APP
151 check!(qreg_low4_f "f" qreg_low4 f32x4 "vmov.f64");