]> git.proxmox.com Git - rustc.git/blame - src/test/assembly/asm/riscv-types.rs
New upstream version 1.55.0+dfsg1
[rustc.git] / src / test / assembly / asm / riscv-types.rs
CommitLineData
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]
17macro_rules! asm {
18 () => {};
19}
20#[rustc_builtin_macro]
21macro_rules! concat {
22 () => {};
23}
24#[rustc_builtin_macro]
25macro_rules! stringify {
26 () => {};
27}
28
29#[lang = "sized"]
30trait Sized {}
31#[lang = "copy"]
32trait Copy {}
33
34type ptr = *mut u8;
35
36impl Copy for i8 {}
37impl Copy for i16 {}
38impl Copy for i32 {}
39impl Copy for f32 {}
40impl Copy for i64 {}
41impl Copy for f64 {}
42impl Copy for ptr {}
43
44extern "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]
54pub 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]
64pub unsafe fn sym_static() {
65 asm!("lb t0, {}", sym extern_static);
66}
67
68macro_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
85macro_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
106check!(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
112check!(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
118check!(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
124check!(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)]
131check!(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)]
138check!(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
144check!(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
150check!(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
156check!(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
162check_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
168check_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
174check_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
180check_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)]
187check_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)]
194check_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
200check_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
206check_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
212check_reg!(fa0_f64 f64 "fa0" "fmv.d");