]> git.lizzy.rs Git - rust.git/blob - tests/assembly/asm/x86-modifiers.rs
Rollup merge of #104965 - zacklukem:p-option-as_ref-docs, r=scottmcm
[rust.git] / tests / assembly / asm / x86-modifiers.rs
1 // revisions: x86_64 i686
2 // assembly-output: emit-asm
3 // compile-flags: -O
4 //[x86_64] compile-flags: --target x86_64-unknown-linux-gnu
5 //[x86_64] needs-llvm-components: x86
6 //[i686] compile-flags: --target i686-unknown-linux-gnu
7 //[i686] needs-llvm-components: x86
8 // compile-flags: -C llvm-args=--x86-asm-syntax=intel
9 // compile-flags: -C target-feature=+avx512bw
10
11 #![feature(no_core, lang_items, rustc_attrs)]
12 #![crate_type = "rlib"]
13 #![no_core]
14 #![allow(asm_sub_register)]
15
16 #[rustc_builtin_macro]
17 macro_rules! asm {
18     () => {};
19 }
20 #[rustc_builtin_macro]
21 macro_rules! concat {
22     () => {};
23 }
24 #[rustc_builtin_macro]
25 macro_rules! stringify {
26     () => {};
27 }
28
29 #[lang = "sized"]
30 trait Sized {}
31 #[lang = "copy"]
32 trait Copy {}
33
34 impl Copy for i32 {}
35
36 macro_rules! check {
37     ($func:ident $modifier:literal $reg:ident $mov:literal) => {
38         // -O and extern "C" guarantee that the selected register is always ax/xmm0
39         #[no_mangle]
40         pub unsafe extern "C" fn $func() -> i32 {
41             // Hack to avoid function merging
42             extern "Rust" {
43                 fn dont_merge(s: &str);
44             }
45             dont_merge(stringify!($func));
46
47             let y;
48             asm!(concat!($mov, " {0:", $modifier, "}, {0:", $modifier, "}"), out($reg) y);
49             y
50         }
51     };
52 }
53
54 // CHECK-LABEL: reg:
55 // CHECK: #APP
56 // x86_64: mov rax, rax
57 // i686: mov eax, eax
58 // CHECK: #NO_APP
59 check!(reg "" reg "mov");
60
61 // x86_64-LABEL: reg_l:
62 // x86_64: #APP
63 // x86_64: mov al, al
64 // x86_64: #NO_APP
65 #[cfg(x86_64)]
66 check!(reg_l "l" reg "mov");
67
68 // CHECK-LABEL: reg_x:
69 // CHECK: #APP
70 // CHECK: mov ax, ax
71 // CHECK: #NO_APP
72 check!(reg_x "x" reg "mov");
73
74 // CHECK-LABEL: reg_e:
75 // CHECK: #APP
76 // CHECK: mov eax, eax
77 // CHECK: #NO_APP
78 check!(reg_e "e" reg "mov");
79
80 // x86_64-LABEL: reg_r:
81 // x86_64: #APP
82 // x86_64: mov rax, rax
83 // x86_64: #NO_APP
84 #[cfg(x86_64)]
85 check!(reg_r "r" reg "mov");
86
87 // CHECK-LABEL: reg_abcd:
88 // CHECK: #APP
89 // x86_64: mov rax, rax
90 // i686: mov eax, eax
91 // CHECK: #NO_APP
92 check!(reg_abcd "" reg_abcd "mov");
93
94 // CHECK-LABEL: reg_abcd_l:
95 // CHECK: #APP
96 // CHECK: mov al, al
97 // CHECK: #NO_APP
98 check!(reg_abcd_l "l" reg_abcd "mov");
99
100 // CHECK-LABEL: reg_abcd_h:
101 // CHECK: #APP
102 // CHECK: mov ah, ah
103 // CHECK: #NO_APP
104 check!(reg_abcd_h "h" reg_abcd "mov");
105
106 // CHECK-LABEL: reg_abcd_x:
107 // CHECK: #APP
108 // CHECK: mov ax, ax
109 // CHECK: #NO_APP
110 check!(reg_abcd_x "x" reg_abcd "mov");
111
112 // CHECK-LABEL: reg_abcd_e:
113 // CHECK: #APP
114 // CHECK: mov eax, eax
115 // CHECK: #NO_APP
116 check!(reg_abcd_e "e" reg_abcd "mov");
117
118 // x86_64-LABEL: reg_abcd_r:
119 // x86_64: #APP
120 // x86_64: mov rax, rax
121 // x86_64: #NO_APP
122 #[cfg(x86_64)]
123 check!(reg_abcd_r "r" reg_abcd "mov");
124
125 // CHECK-LABEL: xmm_reg
126 // CHECK: #APP
127 // CHECK: movaps xmm0, xmm0
128 // CHECK: #NO_APP
129 check!(xmm_reg "" xmm_reg "movaps");
130
131 // CHECK-LABEL: xmm_reg_x
132 // CHECK: #APP
133 // CHECK: movaps xmm0, xmm0
134 // CHECK: #NO_APP
135 check!(xmm_reg_x "x" xmm_reg "movaps");
136
137 // CHECK-LABEL: xmm_reg_y
138 // CHECK: #APP
139 // CHECK: vmovaps ymm0, ymm0
140 // CHECK: #NO_APP
141 check!(xmm_reg_y "y" xmm_reg "vmovaps");
142
143 // CHECK-LABEL: xmm_reg_z
144 // CHECK: #APP
145 // CHECK: vmovaps zmm0, zmm0
146 // CHECK: #NO_APP
147 check!(xmm_reg_z "z" xmm_reg "vmovaps");
148
149 // CHECK-LABEL: ymm_reg
150 // CHECK: #APP
151 // CHECK: movaps ymm0, ymm0
152 // CHECK: #NO_APP
153 check!(ymm_reg "" ymm_reg "vmovaps");
154
155 // CHECK-LABEL: ymm_reg_x
156 // CHECK: #APP
157 // CHECK: movaps xmm0, xmm0
158 // CHECK: #NO_APP
159 check!(ymm_reg_x "x" ymm_reg "movaps");
160
161 // CHECK-LABEL: ymm_reg_y
162 // CHECK: #APP
163 // CHECK: vmovaps ymm0, ymm0
164 // CHECK: #NO_APP
165 check!(ymm_reg_y "y" ymm_reg "vmovaps");
166
167 // CHECK-LABEL: ymm_reg_z
168 // CHECK: #APP
169 // CHECK: vmovaps zmm0, zmm0
170 // CHECK: #NO_APP
171 check!(ymm_reg_z "z" ymm_reg "vmovaps");
172
173 // CHECK-LABEL: zmm_reg
174 // CHECK: #APP
175 // CHECK: movaps zmm0, zmm0
176 // CHECK: #NO_APP
177 check!(zmm_reg "" zmm_reg "vmovaps");
178
179 // CHECK-LABEL: zmm_reg_x
180 // CHECK: #APP
181 // CHECK: movaps xmm0, xmm0
182 // CHECK: #NO_APP
183 check!(zmm_reg_x "x" zmm_reg "movaps");
184
185 // CHECK-LABEL: zmm_reg_y
186 // CHECK: #APP
187 // CHECK: vmovaps ymm0, ymm0
188 // CHECK: #NO_APP
189 check!(zmm_reg_y "y" zmm_reg "vmovaps");
190
191 // CHECK-LABEL: zmm_reg_z
192 // CHECK: #APP
193 // CHECK: vmovaps zmm0, zmm0
194 // CHECK: #NO_APP
195 check!(zmm_reg_z "z" zmm_reg "vmovaps");
196
197 // Note: we don't have any way of ensuring that k1 is actually the register
198 // chosen by the register allocator, so this check may fail if a different
199 // register is chosen.
200
201 // CHECK-LABEL: kreg:
202 // CHECK: #APP
203 // CHECK: kmovb k1, k1
204 // CHECK: #NO_APP
205 check!(kreg "" kreg "kmovb");