]>
git.proxmox.com Git - rustc.git/blob - src/test/assembly/asm/riscv-types.rs
1 // min-llvm-version: 10.0.1
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 // min-system-llvm-version: 12.0
10 #![feature(no_core, lang_items, rustc_attrs)]
11 #![crate_type = "rlib"]
13 #![allow(asm_sub_register)]
15 #[rustc_builtin_macro]
19 #[rustc_builtin_macro]
23 #[rustc_builtin_macro]
24 macro_rules
! stringify
{
45 static extern_static
: u8;
48 // CHECK-LABEL: sym_fn:
50 // CHECK: call extern_func
53 pub unsafe fn sym_fn() {
54 asm
!("call {}", sym extern_func
);
57 // CHECK-LABEL: sym_static:
59 // CHECK: auipc t0, %pcrel_hi(extern_static)
60 // CHECK: lb t0, %pcrel_lo(.Lpcrel_hi0)(t0)
63 pub unsafe fn sym_static() {
64 asm
!("lb t0, {}", sym extern_static
);
68 ($func
:ident $ty
:ident $class
:ident $mov
:literal
) => {
70 pub unsafe fn $
func(x
: $ty
) -> $ty
{
71 // Hack to avoid function merging
73 fn dont_merge(s
: &str);
75 dont_merge(stringify
!($func
));
78 asm
!(concat
!($mov
, " {}, {}"), out($class
) y
, in($class
) x
);
84 macro_rules
! check_reg
{
85 ($func
:ident $ty
:ident $reg
:tt $mov
:literal
) => {
87 pub unsafe fn $
func(x
: $ty
) -> $ty
{
88 // Hack to avoid function merging
90 fn dont_merge(s
: &str);
92 dont_merge(stringify
!($func
));
95 asm
!(concat
!($mov
, " ", $reg
, ", ", $reg
), lateout($reg
) y
, in($reg
) x
);
101 // CHECK-LABEL: reg_i8:
103 // CHECK: mv {{[a-z0-9]+}}, {{[a-z0-9]+}}
105 check
!(reg_i8
i8 reg
"mv");
107 // CHECK-LABEL: reg_i16:
109 // CHECK: mv {{[a-z0-9]+}}, {{[a-z0-9]+}}
111 check
!(reg_i16
i16 reg
"mv");
113 // CHECK-LABEL: reg_i32:
115 // CHECK: mv {{[a-z0-9]+}}, {{[a-z0-9]+}}
117 check
!(reg_i32
i32 reg
"mv");
119 // CHECK-LABEL: reg_f32:
121 // CHECK: mv {{[a-z0-9]+}}, {{[a-z0-9]+}}
123 check
!(reg_f32
f32 reg
"mv");
125 // riscv64-LABEL: reg_i64:
127 // riscv64: mv {{[a-z0-9]+}}, {{[a-z0-9]+}}
130 check
!(reg_i64
i64 reg
"mv");
132 // riscv64-LABEL: reg_f64:
134 // riscv64: mv {{[a-z0-9]+}}, {{[a-z0-9]+}}
137 check
!(reg_f64
f64 reg
"mv");
139 // CHECK-LABEL: reg_ptr:
141 // CHECK: mv {{[a-z0-9]+}}, {{[a-z0-9]+}}
143 check
!(reg_ptr ptr reg
"mv");
145 // CHECK-LABEL: freg_f32:
147 // CHECK: fmv.s f{{[a-z0-9]+}}, f{{[a-z0-9]+}}
149 check
!(freg_f32
f32 freg
"fmv.s");
151 // CHECK-LABEL: freg_f64:
153 // CHECK: fmv.d f{{[a-z0-9]+}}, f{{[a-z0-9]+}}
155 check
!(freg_f64
f64 freg
"fmv.d");
157 // CHECK-LABEL: a0_i8:
161 check_reg
!(a0_i8
i8 "a0" "mv");
163 // CHECK-LABEL: a0_i16:
167 check_reg
!(a0_i16
i16 "a0" "mv");
169 // CHECK-LABEL: a0_i32:
173 check_reg
!(a0_i32
i32 "a0" "mv");
175 // CHECK-LABEL: a0_f32:
179 check_reg
!(a0_f32
f32 "a0" "mv");
181 // riscv64-LABEL: a0_i64:
183 // riscv64: mv a0, a0
186 check_reg
!(a0_i64
i64 "a0" "mv");
188 // riscv64-LABEL: a0_f64:
190 // riscv64: mv a0, a0
193 check_reg
!(a0_f64
f64 "a0" "mv");
195 // CHECK-LABEL: a0_ptr:
199 check_reg
!(a0_ptr ptr
"a0" "mv");
201 // CHECK-LABEL: fa0_f32:
203 // CHECK: fmv.s fa0, fa0
205 check_reg
!(fa0_f32
f32 "fa0" "fmv.s");
207 // CHECK-LABEL: fa0_f64:
209 // CHECK: fmv.d fa0, fa0
211 check_reg
!(fa0_f64
f64 "fa0" "fmv.d");