浮点运算单元的实现——浮点指令内联汇编(二)
浮点运算单元的实现——浮点指令内联汇编(二)
团队编号: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;}
//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
//fclass_test
//fsgnjs_test
//fsgnjns_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;
}
__STATIC_FORCEINLINE int fclass_test(float a)
{
int zero = 0;
asm volatile (
"fclass.s %0, %1\n\t"
:"=r"(zero)
:"f"(a)
);
return zero;
}
__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;
}
__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
//fcvts_sw_test
//fcvts_swu_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;
}
__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;
}
__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
//fcvts_wus_test
//fmv_xw_test
//fmv_wx_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;
}
__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;
}
__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;
}
__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;
}
暂无回复,抢个沙发~
💡 请 登录 后参与讨论(微信扫码即登录/注册)
帖子信息
版块开源蜂鸟E203
回复0
浏览3294
发布2023-05-27 19:38