RISC-V MCU中文社区

【分享】 浮点运算单元的实现——浮点指令内联汇编(二)

发表于 开源蜂鸟E203 2023-05-27 19:38:57
0
1429
2

浮点运算单元的实现——浮点指令内联汇编(二)

团队编号:CICC1230

团队名称:少吃米饭多吃肉

代码实现

在硬件实现FPU后,可通过内联汇编的方式,指定浮点指令对其进行测试,以下罗列出相关测试代码。如有错误,欢迎大家评论指出。

//feqs_test
__STATIC_FORCEINLINE int feqs_test(float a,float b)
{
    int zero = 0;

    asm volatile (
       "feq.s %0, %1, %2\n\t"
           :"=r"(zero)
           :"f"(a),"f"(b)
     );
    return zero;
}

//flts_test
__STATIC_FORCEINLINE int flts_test(float a,float b)
{
    int zero = 0;

    asm volatile (
       "flt.s %0, %1, %2\n\t"
           :"=r"(zero)
           :"f"(a),"f"(b)
     );
    return zero;
}
//fles_test
__STATIC_FORCEINLINE int fles_test(float a,float b)
{
    int zero = 0;

    asm volatile (
       "fle.s %0, %1, %2\n\t"
           :"=r"(zero)
           :"f"(a),"f"(b)
     );
    return zero;
}
//fclass_test
__STATIC_FORCEINLINE int fclass_test(float a)
{
    int zero = 0;

    asm volatile (
       "fclass.s %0, %1\n\t"
           :"=r"(zero)
           :"f"(a)
     );
    return zero;
}
//fsgnjs_test
__STATIC_FORCEINLINE float fsgnjs_test(float a,float b)
{
    float zero = 0;

    asm volatile (
       "fsgnj.s %0, %1, %2\n\t"
           :"=f"(zero)
           :"f"(a),"f"(b)
     );
    return zero;
}
//fsgnjns_test
__STATIC_FORCEINLINE float fsgnjns_test(float a,float b)
{
    float zero = 0;

    asm volatile (
       "fsgnjn.s %0, %1, %2\n\t"
           :"=f"(zero)
           :"f"(a),"f"(b)
     );
    return zero;
}
//fsgnjxs_test
__STATIC_FORCEINLINE float fsgnjxs_test(float a,float b)
{
    float zero = 0;

    asm volatile (
       "fsgnjx.s %0, %1, %2\n\t"
           :"=f"(zero)
           :"f"(a),"f"(b)
     );
    return zero;
}
//fcvts_sw_test
__STATIC_FORCEINLINE float fcvts_sw_test(int a)
{
    float zero = 0;

    asm volatile (
       "fcvt.s.w %0, %1\n\t"
           :"=f"(zero)
           :"r"(a)
     );
    return zero;
}
//fcvts_swu_test
__STATIC_FORCEINLINE float fcvts_swu_test(unsigned int a)
{
    float zero = 0;

    asm volatile (
       "fcvt.s.wu %0, %1\n\t"
           :"=f"(zero)
           :"r"(a)
     );
    return zero;
}
//fcvts_ws_test
__STATIC_FORCEINLINE int fcvts_ws_test(float a)
{
    int zero = 0;

    asm volatile (
       "fcvt.w.s %0, %1\n\t"
           :"=r"(zero)
           :"f"(a)
     );
    return zero;
}

//fcvts_wus_test
__STATIC_FORCEINLINE unsigned int fcvts_wus_test(float a)
{
    unsigned int zero = 0;

    asm volatile (
       "fcvt.wu.s %0, %1\n\t"
           :"=r"(zero)
           :"f"(a)
     );
    return zero;
}
//fmv_xw_test
__STATIC_FORCEINLINE int fmv_xw_test(float a)
{
    int zero = 0;

    asm volatile (
       "fmv.x.w %0, %1\n\t"
           :"=r"(zero)
           :"f"(a)
     );
    return zero;
}
//fmv_wx_test
__STATIC_FORCEINLINE float fmv_wx_test(int a)
{
    float zero = 0;

    asm volatile (
       "fmv.w.x %0, %1\n\t"
           :"=f"(zero)
           :"r"(a)
     );
    return zero;
}

喜欢2
用户评论
H.H

H.H 实名认证

懒的都不写签名

积分
问答
粉丝
关注
  • RV-STAR 开发板
  • RISC-V处理器设计系列课程
  • 培养RISC-V大学土壤 共建RISC-V教育生态
RV-STAR 开发板