1 // revisions: x86_64 i686
2 // assembly-output: emit-asm
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
11 #![feature(no_core, lang_items, rustc_attrs)]
12 #![crate_type = "rlib"]
14 #![allow(asm_sub_register)]
16 #[rustc_builtin_macro]
20 #[rustc_builtin_macro]
24 #[rustc_builtin_macro]
25 macro_rules! stringify {
37 ($func:ident $modifier:literal $reg:ident $mov:literal) => {
38 // -O and extern "C" guarantee that the selected register is always ax/xmm0
40 pub unsafe extern "C" fn $func() -> i32 {
41 // Hack to avoid function merging
43 fn dont_merge(s: &str);
45 dont_merge(stringify!($func));
48 asm!(concat!($mov, " {0:", $modifier, "}, {0:", $modifier, "}"), out($reg) y);
56 // x86_64: mov rax, rax
59 check!(reg "" reg "mov");
61 // x86_64-LABEL: reg_l:
66 check!(reg_l "l" reg "mov");
68 // CHECK-LABEL: reg_x:
72 check!(reg_x "x" reg "mov");
74 // CHECK-LABEL: reg_e:
76 // CHECK: mov eax, eax
78 check!(reg_e "e" reg "mov");
80 // x86_64-LABEL: reg_r:
82 // x86_64: mov rax, rax
85 check!(reg_r "r" reg "mov");
87 // CHECK-LABEL: reg_abcd:
89 // x86_64: mov rax, rax
92 check!(reg_abcd "" reg_abcd "mov");
94 // CHECK-LABEL: reg_abcd_l:
98 check!(reg_abcd_l "l" reg_abcd "mov");
100 // CHECK-LABEL: reg_abcd_h:
104 check!(reg_abcd_h "h" reg_abcd "mov");
106 // CHECK-LABEL: reg_abcd_x:
110 check!(reg_abcd_x "x" reg_abcd "mov");
112 // CHECK-LABEL: reg_abcd_e:
114 // CHECK: mov eax, eax
116 check!(reg_abcd_e "e" reg_abcd "mov");
118 // x86_64-LABEL: reg_abcd_r:
120 // x86_64: mov rax, rax
123 check!(reg_abcd_r "r" reg_abcd "mov");
125 // CHECK-LABEL: xmm_reg
127 // CHECK: movaps xmm0, xmm0
129 check!(xmm_reg "" xmm_reg "movaps");
131 // CHECK-LABEL: xmm_reg_x
133 // CHECK: movaps xmm0, xmm0
135 check!(xmm_reg_x "x" xmm_reg "movaps");
137 // CHECK-LABEL: xmm_reg_y
139 // CHECK: vmovaps ymm0, ymm0
141 check!(xmm_reg_y "y" xmm_reg "vmovaps");
143 // CHECK-LABEL: xmm_reg_z
145 // CHECK: vmovaps zmm0, zmm0
147 check!(xmm_reg_z "z" xmm_reg "vmovaps");
149 // CHECK-LABEL: ymm_reg
151 // CHECK: movaps ymm0, ymm0
153 check!(ymm_reg "" ymm_reg "vmovaps");
155 // CHECK-LABEL: ymm_reg_x
157 // CHECK: movaps xmm0, xmm0
159 check!(ymm_reg_x "x" ymm_reg "movaps");
161 // CHECK-LABEL: ymm_reg_y
163 // CHECK: vmovaps ymm0, ymm0
165 check!(ymm_reg_y "y" ymm_reg "vmovaps");
167 // CHECK-LABEL: ymm_reg_z
169 // CHECK: vmovaps zmm0, zmm0
171 check!(ymm_reg_z "z" ymm_reg "vmovaps");
173 // CHECK-LABEL: zmm_reg
175 // CHECK: movaps zmm0, zmm0
177 check!(zmm_reg "" zmm_reg "vmovaps");
179 // CHECK-LABEL: zmm_reg_x
181 // CHECK: movaps xmm0, xmm0
183 check!(zmm_reg_x "x" zmm_reg "movaps");
185 // CHECK-LABEL: zmm_reg_y
187 // CHECK: vmovaps ymm0, ymm0
189 check!(zmm_reg_y "y" zmm_reg "vmovaps");
191 // CHECK-LABEL: zmm_reg_z
193 // CHECK: vmovaps zmm0, zmm0
195 check!(zmm_reg_z "z" zmm_reg "vmovaps");
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.
201 // CHECK-LABEL: kreg:
203 // CHECK: kmovb k1, k1
205 check!(kreg "" kreg "kmovb");