RISC-V 寄存器在系统调用期间被替换
RISC-V register gets replaced during system call
内联汇编系统调用的浮点 return 值被编译器意外保存,然后在调用后恢复。
inline float fsyscallf(long n, float farg0)
{
register long a0 asm("a0");
register float fa0 asm("fa0") = farg0;
register long syscall_id asm("a7") = n;
asm volatile ("scall"
: "=r"(a0), "+r"(fa0) : "r"(syscall_id));
return fa0;
}
系统调用return来自 FA0 的浮点值。
syscall.hpp:149
101fc: e00507d3 fmv.x.w a5,fa0
10200: 00000073 ecall
10204: f0078553 fmv.w.x fa0,a5
编译器在系统调用期间保存和恢复FA0。我在这里做错了什么?
约束r
表示通用寄存器,但您需要fa0
,这是一个浮点寄存器,所以使用f
作为约束。将 "+r"
更改为 "+f"
。
内联汇编系统调用的浮点 return 值被编译器意外保存,然后在调用后恢复。
inline float fsyscallf(long n, float farg0)
{
register long a0 asm("a0");
register float fa0 asm("fa0") = farg0;
register long syscall_id asm("a7") = n;
asm volatile ("scall"
: "=r"(a0), "+r"(fa0) : "r"(syscall_id));
return fa0;
}
系统调用return来自 FA0 的浮点值。
syscall.hpp:149
101fc: e00507d3 fmv.x.w a5,fa0
10200: 00000073 ecall
10204: f0078553 fmv.w.x fa0,a5
编译器在系统调用期间保存和恢复FA0。我在这里做错了什么?
约束r
表示通用寄存器,但您需要fa0
,这是一个浮点寄存器,所以使用f
作为约束。将 "+r"
更改为 "+f"
。