]> git.lizzy.rs Git - rust.git/blob - src/test/assembly/asm/riscv-types.rs
Fix font color for help button in ayu and dark themes
[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: lb t0, extern_static
59 // CHECK: #NO_APP
60 #[no_mangle]
61 pub unsafe fn sym_static() {
62     asm!("lb t0, {}", sym extern_static);
63 }
64
65 macro_rules! check {
66     ($func:ident $ty:ident $class:ident $mov:literal) => {
67         #[no_mangle]
68         pub unsafe fn $func(x: $ty) -> $ty {
69             // Hack to avoid function merging
70             extern "Rust" {
71                 fn dont_merge(s: &str);
72             }
73             dont_merge(stringify!($func));
74
75             let y;
76             asm!(concat!($mov, " {}, {}"), out($class) y, in($class) x);
77             y
78         }
79     };
80 }
81
82 macro_rules! check_reg {
83     ($func:ident $ty:ident $reg:tt $mov:literal) => {
84         #[no_mangle]
85         pub unsafe fn $func(x: $ty) -> $ty {
86             // Hack to avoid function merging
87             extern "Rust" {
88                 fn dont_merge(s: &str);
89             }
90             dont_merge(stringify!($func));
91
92             let y;
93             asm!(concat!($mov, " ", $reg, ", ", $reg), lateout($reg) y, in($reg) x);
94             y
95         }
96     };
97 }
98
99 // CHECK-LABEL: reg_i8:
100 // CHECK: #APP
101 // CHECK: mv {{[a-z0-9]+}}, {{[a-z0-9]+}}
102 // CHECK: #NO_APP
103 check!(reg_i8 i8 reg "mv");
104
105 // CHECK-LABEL: reg_i16:
106 // CHECK: #APP
107 // CHECK: mv {{[a-z0-9]+}}, {{[a-z0-9]+}}
108 // CHECK: #NO_APP
109 check!(reg_i16 i16 reg "mv");
110
111 // CHECK-LABEL: reg_i32:
112 // CHECK: #APP
113 // CHECK: mv {{[a-z0-9]+}}, {{[a-z0-9]+}}
114 // CHECK: #NO_APP
115 check!(reg_i32 i32 reg "mv");
116
117 // CHECK-LABEL: reg_f32:
118 // CHECK: #APP
119 // CHECK: mv {{[a-z0-9]+}}, {{[a-z0-9]+}}
120 // CHECK: #NO_APP
121 check!(reg_f32 f32 reg "mv");
122
123 // riscv64-LABEL: reg_i64:
124 // riscv64: #APP
125 // riscv64: mv {{[a-z0-9]+}}, {{[a-z0-9]+}}
126 // riscv64: #NO_APP
127 #[cfg(riscv64)]
128 check!(reg_i64 i64 reg "mv");
129
130 // riscv64-LABEL: reg_f64:
131 // riscv64: #APP
132 // riscv64: mv {{[a-z0-9]+}}, {{[a-z0-9]+}}
133 // riscv64: #NO_APP
134 #[cfg(riscv64)]
135 check!(reg_f64 f64 reg "mv");
136
137 // CHECK-LABEL: reg_ptr:
138 // CHECK: #APP
139 // CHECK: mv {{[a-z0-9]+}}, {{[a-z0-9]+}}
140 // CHECK: #NO_APP
141 check!(reg_ptr ptr reg "mv");
142
143 // CHECK-LABEL: freg_f32:
144 // CHECK: #APP
145 // CHECK: fmv.s f{{[a-z0-9]+}}, f{{[a-z0-9]+}}
146 // CHECK: #NO_APP
147 check!(freg_f32 f32 freg "fmv.s");
148
149 // CHECK-LABEL: freg_f64:
150 // CHECK: #APP
151 // CHECK: fmv.d f{{[a-z0-9]+}}, f{{[a-z0-9]+}}
152 // CHECK: #NO_APP
153 check!(freg_f64 f64 freg "fmv.d");
154
155 // CHECK-LABEL: a0_i8:
156 // CHECK: #APP
157 // CHECK: mv a0, a0
158 // CHECK: #NO_APP
159 check_reg!(a0_i8 i8 "a0" "mv");
160
161 // CHECK-LABEL: a0_i16:
162 // CHECK: #APP
163 // CHECK: mv a0, a0
164 // CHECK: #NO_APP
165 check_reg!(a0_i16 i16 "a0" "mv");
166
167 // CHECK-LABEL: a0_i32:
168 // CHECK: #APP
169 // CHECK: mv a0, a0
170 // CHECK: #NO_APP
171 check_reg!(a0_i32 i32 "a0" "mv");
172
173 // CHECK-LABEL: a0_f32:
174 // CHECK: #APP
175 // CHECK: mv a0, a0
176 // CHECK: #NO_APP
177 check_reg!(a0_f32 f32 "a0" "mv");
178
179 // riscv64-LABEL: a0_i64:
180 // riscv64: #APP
181 // riscv64: mv a0, a0
182 // riscv64: #NO_APP
183 #[cfg(riscv64)]
184 check_reg!(a0_i64 i64 "a0" "mv");
185
186 // riscv64-LABEL: a0_f64:
187 // riscv64: #APP
188 // riscv64: mv a0, a0
189 // riscv64: #NO_APP
190 #[cfg(riscv64)]
191 check_reg!(a0_f64 f64 "a0" "mv");
192
193 // CHECK-LABEL: a0_ptr:
194 // CHECK: #APP
195 // CHECK: mv a0, a0
196 // CHECK: #NO_APP
197 check_reg!(a0_ptr ptr "a0" "mv");
198
199 // CHECK-LABEL: fa0_f32:
200 // CHECK: #APP
201 // CHECK: fmv.s fa0, fa0
202 // CHECK: #NO_APP
203 check_reg!(fa0_f32 f32 "fa0" "fmv.s");
204
205 // CHECK-LABEL: fa0_f64:
206 // CHECK: #APP
207 // CHECK: fmv.d fa0, fa0
208 // CHECK: #NO_APP
209 check_reg!(fa0_f64 f64 "fa0" "fmv.d");