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"