1 // min-llvm-version: 10.0.1
2 // revisions: mips32 mips64
3 // assembly-output: emit-asm
4 //[mips32] compile-flags: --target mips-unknown-linux-gnu
5 //[mips32] needs-llvm-components: mips
6 //[mips64] compile-flags: --target mips64-unknown-linux-gnuabi64
7 //[mips64] needs-llvm-components: mips
9 #![feature(no_core, lang_items, rustc_attrs, repr_simd)]
10 #![crate_type = "rlib"]
12 #![allow(asm_sub_register, non_camel_case_types)]
14 #[rustc_builtin_macro]
18 #[rustc_builtin_macro]
22 #[rustc_builtin_macro]
23 macro_rules! stringify {
32 type ptr = *const i32;
44 static extern_static: u8;
47 // Hack to avoid function merging
49 fn dont_merge(s: &str);
52 macro_rules! check { ($func:ident, $ty:ty, $class:ident, $mov:literal) => {
54 pub unsafe fn $func(x: $ty) -> $ty {
55 dont_merge(stringify!($func));
58 asm!(concat!($mov," {}, {}"), out($class) y, in($class) x);
63 macro_rules! check_reg { ($func:ident, $ty:ty, $reg:tt, $mov:literal) => {
65 pub unsafe fn $func(x: $ty) -> $ty {
66 dont_merge(stringify!($func));
69 asm!(concat!($mov, " ", $reg, ", ", $reg), lateout($reg) y, in($reg) x);
74 // mips32-LABEL: sym_static_32:
76 // mips32: lw $3, %got(extern_static)
80 pub unsafe fn sym_static_32() {
81 asm!("lw $v1, {}", sym extern_static);
84 // mips32-LABEL: sym_fn_32:
86 // mips32: lw $3, %got(extern_func)
90 pub unsafe fn sym_fn_32() {
91 asm!("lw $v1, {}", sym extern_func);
94 // mips64-LABEL: sym_static_64:
96 // mips64: ld $3, %got_disp(extern_static)
100 pub unsafe fn sym_static_64() {
101 asm!("ld $v1, {}", sym extern_static);
104 // mips64-LABEL: sym_fn_64:
106 // mips64: ld $3, %got_disp(extern_func)
110 pub unsafe fn sym_fn_64() {
111 asm!("ld $v1, {}", sym extern_func);
114 // CHECK-LABEL: reg_f32:
116 // CHECK: mov.s $f{{[0-9]+}}, $f{{[0-9]+}}
118 check!(reg_f32, f32, freg, "mov.s");
120 // CHECK-LABEL: f0_f32:
122 // CHECK: mov.s $f0, $f0
125 check_reg!(f0_f32, f32, "$f0", "mov.s");
127 // CHECK-LABEL: reg_f32_64:
129 // CHECK: mov.d $f{{[0-9]+}}, $f{{[0-9]+}}
131 check!(reg_f32_64, f32, freg, "mov.d");
133 // CHECK-LABEL: f0_f32_64:
135 // CHECK: mov.d $f0, $f0
138 check_reg!(f0_f32_64, f32, "$f0", "mov.d");
140 // CHECK-LABEL: reg_f64:
142 // CHECK: mov.d $f{{[0-9]+}}, $f{{[0-9]+}}
145 check!(reg_f64, f64, freg, "mov.d");
147 // CHECK-LABEL: f0_f64:
149 // CHECK: mov.d $f0, $f0
152 check_reg!(f0_f64, f64, "$f0", "mov.d");
154 // CHECK-LABEL: reg_ptr:
156 // CHECK: move ${{[0-9]+}}, ${{[0-9]+}}
158 check!(reg_ptr, ptr, reg, "move");
160 // CHECK-LABEL: reg_i32:
162 // CHECK: move ${{[0-9]+}}, ${{[0-9]+}}
164 check!(reg_i32, i32, reg, "move");
166 // CHECK-LABEL: reg_f32_soft:
168 // CHECK: move ${{[0-9]+}}, ${{[0-9]+}}
170 check!(reg_f32_soft, f32, reg, "move");
172 // mips64-LABEL: reg_f64_soft:
174 // mips64: move ${{[0-9]+}}, ${{[0-9]+}}
177 check!(reg_f64_soft, f64, reg, "move");
179 // CHECK-LABEL: reg_i8:
181 // CHECK: move ${{[0-9]+}}, ${{[0-9]+}}
183 check!(reg_i8, i8, reg, "move");
185 // CHECK-LABEL: reg_u8:
187 // CHECK: move ${{[0-9]+}}, ${{[0-9]+}}
189 check!(reg_u8, u8, reg, "move");
191 // CHECK-LABEL: reg_i16:
193 // CHECK: move ${{[0-9]+}}, ${{[0-9]+}}
195 check!(reg_i16, i16, reg, "move");
197 // mips64-LABEL: reg_i64:
199 // mips64: move ${{[0-9]+}}, ${{[0-9]+}}
202 check!(reg_i64, i64, reg, "move");
204 // CHECK-LABEL: r8_ptr:
206 // CHECK: move $8, $8
208 check_reg!(r8_ptr, ptr, "$8", "move");
210 // CHECK-LABEL: r8_i32:
212 // CHECK: move $8, $8
214 check_reg!(r8_i32, i32, "$8", "move");
216 // CHECK-LABEL: r8_f32:
218 // CHECK: move $8, $8
220 check_reg!(r8_f32, f32, "$8", "move");
222 // CHECK-LABEL: r8_i8:
224 // CHECK: move $8, $8
226 check_reg!(r8_i8, i8, "$8", "move");
228 // CHECK-LABEL: r8_u8:
230 // CHECK: move $8, $8
232 check_reg!(r8_u8, u8, "$8", "move");
234 // CHECK-LABEL: r8_i16:
236 // CHECK: move $8, $8
238 check_reg!(r8_i16, i16, "$8", "move");