]>
Commit | Line | Data |
---|---|---|
cdc7bbd5 | 1 | // min-llvm-version: 10.0.1 |
f9f354fc XL |
2 | // revisions: riscv64 riscv32 |
3 | // assembly-output: emit-asm | |
4 | //[riscv64] compile-flags: --target riscv64imac-unknown-none-elf | |
136023e0 | 5 | //[riscv64] needs-llvm-components: riscv |
f9f354fc | 6 | //[riscv32] compile-flags: --target riscv32imac-unknown-none-elf |
136023e0 | 7 | //[riscv32] needs-llvm-components: riscv |
f9f354fc | 8 | // compile-flags: -C target-feature=+d |
6a06907d | 9 | // min-system-llvm-version: 12.0 |
f9f354fc XL |
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 | type ptr = *mut u8; | |
35 | ||
36 | impl Copy for i8 {} | |
37 | impl Copy for i16 {} | |
38 | impl Copy for i32 {} | |
39 | impl Copy for f32 {} | |
40 | impl Copy for i64 {} | |
41 | impl Copy for f64 {} | |
42 | impl Copy for ptr {} | |
43 | ||
44 | extern "C" { | |
45 | fn extern_func(); | |
46 | static extern_static: u8; | |
47 | } | |
48 | ||
49 | // CHECK-LABEL: sym_fn: | |
50 | // CHECK: #APP | |
51 | // CHECK: call extern_func | |
52 | // CHECK: #NO_APP | |
53 | #[no_mangle] | |
54 | pub unsafe fn sym_fn() { | |
55 | asm!("call {}", sym extern_func); | |
56 | } | |
57 | ||
58 | // CHECK-LABEL: sym_static: | |
59 | // CHECK: #APP | |
3dfed10e XL |
60 | // CHECK: auipc t0, %pcrel_hi(extern_static) |
61 | // CHECK: lb t0, %pcrel_lo(.Lpcrel_hi0)(t0) | |
f9f354fc XL |
62 | // CHECK: #NO_APP |
63 | #[no_mangle] | |
64 | pub unsafe fn sym_static() { | |
65 | asm!("lb t0, {}", sym extern_static); | |
66 | } | |
67 | ||
68 | macro_rules! check { | |
69 | ($func:ident $ty:ident $class:ident $mov:literal) => { | |
70 | #[no_mangle] | |
71 | pub unsafe fn $func(x: $ty) -> $ty { | |
72 | // Hack to avoid function merging | |
73 | extern "Rust" { | |
74 | fn dont_merge(s: &str); | |
75 | } | |
76 | dont_merge(stringify!($func)); | |
77 | ||
78 | let y; | |
79 | asm!(concat!($mov, " {}, {}"), out($class) y, in($class) x); | |
80 | y | |
81 | } | |
82 | }; | |
83 | } | |
84 | ||
3dfed10e XL |
85 | macro_rules! check_reg { |
86 | ($func:ident $ty:ident $reg:tt $mov:literal) => { | |
87 | #[no_mangle] | |
88 | pub unsafe fn $func(x: $ty) -> $ty { | |
89 | // Hack to avoid function merging | |
90 | extern "Rust" { | |
91 | fn dont_merge(s: &str); | |
92 | } | |
93 | dont_merge(stringify!($func)); | |
94 | ||
95 | let y; | |
96 | asm!(concat!($mov, " ", $reg, ", ", $reg), lateout($reg) y, in($reg) x); | |
97 | y | |
98 | } | |
99 | }; | |
100 | } | |
101 | ||
f9f354fc XL |
102 | // CHECK-LABEL: reg_i8: |
103 | // CHECK: #APP | |
6a06907d | 104 | // CHECK: mv {{[a-z0-9]+}}, {{[a-z0-9]+}} |
f9f354fc XL |
105 | // CHECK: #NO_APP |
106 | check!(reg_i8 i8 reg "mv"); | |
107 | ||
108 | // CHECK-LABEL: reg_i16: | |
109 | // CHECK: #APP | |
6a06907d | 110 | // CHECK: mv {{[a-z0-9]+}}, {{[a-z0-9]+}} |
f9f354fc XL |
111 | // CHECK: #NO_APP |
112 | check!(reg_i16 i16 reg "mv"); | |
113 | ||
114 | // CHECK-LABEL: reg_i32: | |
115 | // CHECK: #APP | |
6a06907d | 116 | // CHECK: mv {{[a-z0-9]+}}, {{[a-z0-9]+}} |
f9f354fc XL |
117 | // CHECK: #NO_APP |
118 | check!(reg_i32 i32 reg "mv"); | |
119 | ||
120 | // CHECK-LABEL: reg_f32: | |
121 | // CHECK: #APP | |
6a06907d | 122 | // CHECK: mv {{[a-z0-9]+}}, {{[a-z0-9]+}} |
f9f354fc XL |
123 | // CHECK: #NO_APP |
124 | check!(reg_f32 f32 reg "mv"); | |
125 | ||
126 | // riscv64-LABEL: reg_i64: | |
127 | // riscv64: #APP | |
6a06907d | 128 | // riscv64: mv {{[a-z0-9]+}}, {{[a-z0-9]+}} |
f9f354fc XL |
129 | // riscv64: #NO_APP |
130 | #[cfg(riscv64)] | |
131 | check!(reg_i64 i64 reg "mv"); | |
132 | ||
133 | // riscv64-LABEL: reg_f64: | |
134 | // riscv64: #APP | |
6a06907d | 135 | // riscv64: mv {{[a-z0-9]+}}, {{[a-z0-9]+}} |
f9f354fc XL |
136 | // riscv64: #NO_APP |
137 | #[cfg(riscv64)] | |
138 | check!(reg_f64 f64 reg "mv"); | |
139 | ||
140 | // CHECK-LABEL: reg_ptr: | |
141 | // CHECK: #APP | |
6a06907d | 142 | // CHECK: mv {{[a-z0-9]+}}, {{[a-z0-9]+}} |
f9f354fc XL |
143 | // CHECK: #NO_APP |
144 | check!(reg_ptr ptr reg "mv"); | |
145 | ||
146 | // CHECK-LABEL: freg_f32: | |
147 | // CHECK: #APP | |
148 | // CHECK: fmv.s f{{[a-z0-9]+}}, f{{[a-z0-9]+}} | |
149 | // CHECK: #NO_APP | |
150 | check!(freg_f32 f32 freg "fmv.s"); | |
151 | ||
152 | // CHECK-LABEL: freg_f64: | |
153 | // CHECK: #APP | |
154 | // CHECK: fmv.d f{{[a-z0-9]+}}, f{{[a-z0-9]+}} | |
155 | // CHECK: #NO_APP | |
156 | check!(freg_f64 f64 freg "fmv.d"); | |
3dfed10e XL |
157 | |
158 | // CHECK-LABEL: a0_i8: | |
159 | // CHECK: #APP | |
6a06907d | 160 | // CHECK: mv a0, a0 |
3dfed10e XL |
161 | // CHECK: #NO_APP |
162 | check_reg!(a0_i8 i8 "a0" "mv"); | |
163 | ||
164 | // CHECK-LABEL: a0_i16: | |
165 | // CHECK: #APP | |
6a06907d | 166 | // CHECK: mv a0, a0 |
3dfed10e XL |
167 | // CHECK: #NO_APP |
168 | check_reg!(a0_i16 i16 "a0" "mv"); | |
169 | ||
170 | // CHECK-LABEL: a0_i32: | |
171 | // CHECK: #APP | |
6a06907d | 172 | // CHECK: mv a0, a0 |
3dfed10e XL |
173 | // CHECK: #NO_APP |
174 | check_reg!(a0_i32 i32 "a0" "mv"); | |
175 | ||
176 | // CHECK-LABEL: a0_f32: | |
177 | // CHECK: #APP | |
6a06907d | 178 | // CHECK: mv a0, a0 |
3dfed10e XL |
179 | // CHECK: #NO_APP |
180 | check_reg!(a0_f32 f32 "a0" "mv"); | |
181 | ||
182 | // riscv64-LABEL: a0_i64: | |
183 | // riscv64: #APP | |
6a06907d | 184 | // riscv64: mv a0, a0 |
3dfed10e XL |
185 | // riscv64: #NO_APP |
186 | #[cfg(riscv64)] | |
187 | check_reg!(a0_i64 i64 "a0" "mv"); | |
188 | ||
189 | // riscv64-LABEL: a0_f64: | |
190 | // riscv64: #APP | |
6a06907d | 191 | // riscv64: mv a0, a0 |
3dfed10e XL |
192 | // riscv64: #NO_APP |
193 | #[cfg(riscv64)] | |
194 | check_reg!(a0_f64 f64 "a0" "mv"); | |
195 | ||
196 | // CHECK-LABEL: a0_ptr: | |
197 | // CHECK: #APP | |
6a06907d | 198 | // CHECK: mv a0, a0 |
3dfed10e XL |
199 | // CHECK: #NO_APP |
200 | check_reg!(a0_ptr ptr "a0" "mv"); | |
201 | ||
202 | // CHECK-LABEL: fa0_f32: | |
203 | // CHECK: #APP | |
204 | // CHECK: fmv.s fa0, fa0 | |
205 | // CHECK: #NO_APP | |
206 | check_reg!(fa0_f32 f32 "fa0" "fmv.s"); | |
207 | ||
208 | // CHECK-LABEL: fa0_f64: | |
209 | // CHECK: #APP | |
210 | // CHECK: fmv.d fa0, fa0 | |
211 | // CHECK: #NO_APP | |
212 | check_reg!(fa0_f64 f64 "fa0" "fmv.d"); |