]> git.lizzy.rs Git - rust.git/blob - src/test/assembly/asm/riscv-types.rs
Rollup merge of #75837 - GuillaumeGomez:fix-font-color-help-button, r=Cldfire
[rust.git] / src / test / assembly / asm / riscv-types.rs
1 // no-system-llvm
2 // revisions: riscv64 riscv32
3 // assembly-output: emit-asm
4 //[riscv64] compile-flags: --target riscv64imac-unknown-none-elf
5 //[riscv32] compile-flags: --target riscv32imac-unknown-none-elf
6 // compile-flags: -C target-feature=+d
7 // needs-llvm-components: riscv
8
9 #![feature(no_core, lang_items, rustc_attrs)]
10 #![crate_type = "rlib"]
11 #![no_core]
12 #![allow(asm_sub_register)]
13
14 #[rustc_builtin_macro]
15 macro_rules! asm {
16     () => {};
17 }
18 #[rustc_builtin_macro]
19 macro_rules! concat {
20     () => {};
21 }
22 #[rustc_builtin_macro]
23 macro_rules! stringify {
24     () => {};
25 }
26
27 #[lang = "sized"]
28 trait Sized {}
29 #[lang = "copy"]
30 trait Copy {}
31
32 type ptr = *mut u8;
33
34 impl Copy for i8 {}
35 impl Copy for i16 {}
36 impl Copy for i32 {}
37 impl Copy for f32 {}
38 impl Copy for i64 {}
39 impl Copy for f64 {}
40 impl Copy for ptr {}
41
42 extern "C" {
43     fn extern_func();
44     static extern_static: u8;
45 }
46
47 // CHECK-LABEL: sym_fn:
48 // CHECK: #APP
49 // CHECK: call extern_func
50 // CHECK: #NO_APP
51 #[no_mangle]
52 pub unsafe fn sym_fn() {
53     asm!("call {}", sym extern_func);
54 }
55
56 // CHECK-LABEL: sym_static:
57 // CHECK: #APP
58 // CHECK: auipc t0, %pcrel_hi(extern_static)
59 // CHECK: lb t0, %pcrel_lo(.Lpcrel_hi0)(t0)
60 // CHECK: #NO_APP
61 #[no_mangle]
62 pub unsafe fn sym_static() {
63     asm!("lb t0, {}", sym extern_static);
64 }
65
66 macro_rules! check {
67     ($func:ident $ty:ident $class:ident $mov:literal) => {
68         #[no_mangle]
69         pub unsafe fn $func(x: $ty) -> $ty {
70             // Hack to avoid function merging
71             extern "Rust" {
72                 fn dont_merge(s: &str);
73             }
74             dont_merge(stringify!($func));
75
76             let y;
77             asm!(concat!($mov, " {}, {}"), out($class) y, in($class) x);
78             y
79         }
80     };
81 }
82
83 macro_rules! check_reg {
84     ($func:ident $ty:ident $reg:tt $mov:literal) => {
85         #[no_mangle]
86         pub unsafe fn $func(x: $ty) -> $ty {
87             // Hack to avoid function merging
88             extern "Rust" {
89                 fn dont_merge(s: &str);
90             }
91             dont_merge(stringify!($func));
92
93             let y;
94             asm!(concat!($mov, " ", $reg, ", ", $reg), lateout($reg) y, in($reg) x);
95             y
96         }
97     };
98 }
99
100 // CHECK-LABEL: reg_i8:
101 // CHECK: #APP
102 // CHECK: add {{[a-z0-9]+}}, zero, {{[a-z0-9]+}}
103 // CHECK: #NO_APP
104 check!(reg_i8 i8 reg "mv");
105
106 // CHECK-LABEL: reg_i16:
107 // CHECK: #APP
108 // CHECK: add {{[a-z0-9]+}}, zero, {{[a-z0-9]+}}
109 // CHECK: #NO_APP
110 check!(reg_i16 i16 reg "mv");
111
112 // CHECK-LABEL: reg_i32:
113 // CHECK: #APP
114 // CHECK: add {{[a-z0-9]+}}, zero, {{[a-z0-9]+}}
115 // CHECK: #NO_APP
116 check!(reg_i32 i32 reg "mv");
117
118 // CHECK-LABEL: reg_f32:
119 // CHECK: #APP
120 // CHECK: add {{[a-z0-9]+}}, zero, {{[a-z0-9]+}}
121 // CHECK: #NO_APP
122 check!(reg_f32 f32 reg "mv");
123
124 // riscv64-LABEL: reg_i64:
125 // riscv64: #APP
126 // riscv64: add {{[a-z0-9]+}}, zero, {{[a-z0-9]+}}
127 // riscv64: #NO_APP
128 #[cfg(riscv64)]
129 check!(reg_i64 i64 reg "mv");
130
131 // riscv64-LABEL: reg_f64:
132 // riscv64: #APP
133 // riscv64: add {{[a-z0-9]+}}, zero, {{[a-z0-9]+}}
134 // riscv64: #NO_APP
135 #[cfg(riscv64)]
136 check!(reg_f64 f64 reg "mv");
137
138 // CHECK-LABEL: reg_ptr:
139 // CHECK: #APP
140 // CHECK: add {{[a-z0-9]+}}, zero, {{[a-z0-9]+}}
141 // CHECK: #NO_APP
142 check!(reg_ptr ptr reg "mv");
143
144 // CHECK-LABEL: freg_f32:
145 // CHECK: #APP
146 // CHECK: fmv.s f{{[a-z0-9]+}}, f{{[a-z0-9]+}}
147 // CHECK: #NO_APP
148 check!(freg_f32 f32 freg "fmv.s");
149
150 // CHECK-LABEL: freg_f64:
151 // CHECK: #APP
152 // CHECK: fmv.d f{{[a-z0-9]+}}, f{{[a-z0-9]+}}
153 // CHECK: #NO_APP
154 check!(freg_f64 f64 freg "fmv.d");
155
156 // CHECK-LABEL: a0_i8:
157 // CHECK: #APP
158 // CHECK: add a0, zero, a0
159 // CHECK: #NO_APP
160 check_reg!(a0_i8 i8 "a0" "mv");
161
162 // CHECK-LABEL: a0_i16:
163 // CHECK: #APP
164 // CHECK: add a0, zero, a0
165 // CHECK: #NO_APP
166 check_reg!(a0_i16 i16 "a0" "mv");
167
168 // CHECK-LABEL: a0_i32:
169 // CHECK: #APP
170 // CHECK: add a0, zero, a0
171 // CHECK: #NO_APP
172 check_reg!(a0_i32 i32 "a0" "mv");
173
174 // CHECK-LABEL: a0_f32:
175 // CHECK: #APP
176 // CHECK: add a0, zero, a0
177 // CHECK: #NO_APP
178 check_reg!(a0_f32 f32 "a0" "mv");
179
180 // riscv64-LABEL: a0_i64:
181 // riscv64: #APP
182 // riscv64: add a0, zero, a0
183 // riscv64: #NO_APP
184 #[cfg(riscv64)]
185 check_reg!(a0_i64 i64 "a0" "mv");
186
187 // riscv64-LABEL: a0_f64:
188 // riscv64: #APP
189 // riscv64: add a0, zero, a0
190 // riscv64: #NO_APP
191 #[cfg(riscv64)]
192 check_reg!(a0_f64 f64 "a0" "mv");
193
194 // CHECK-LABEL: a0_ptr:
195 // CHECK: #APP
196 // CHECK: add a0, zero, a0
197 // CHECK: #NO_APP
198 check_reg!(a0_ptr ptr "a0" "mv");
199
200 // CHECK-LABEL: fa0_f32:
201 // CHECK: #APP
202 // CHECK: fmv.s fa0, fa0
203 // CHECK: #NO_APP
204 check_reg!(fa0_f32 f32 "fa0" "fmv.s");
205
206 // CHECK-LABEL: fa0_f64:
207 // CHECK: #APP
208 // CHECK: fmv.d fa0, fa0
209 // CHECK: #NO_APP
210 check_reg!(fa0_f64 f64 "fa0" "fmv.d");