首页 > 解决方案 > RISC-V 寄存器在系统调用期间被替换

问题描述

内联汇编系统调用的浮点返回值被编译器意外保存,然后在调用后恢复。

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;
}

从 FA0 返回浮点值的系统调用。

syscall.hpp:149
   101fc:       e00507d3                fmv.x.w a5,fa0
   10200:       00000073                ecall
   10204:       f0078553                fmv.w.x fa0,a5

编译器在系统调用期间保存和恢复FA0。我在这里做错了什么?

标签: c++inline-assemblyriscv

解决方案


约束r意味着一个通用寄存器,但是你需要fa0,它是一个浮点寄存器,所以使用f它作为约束。更改"+r""+f"


推荐阅读