大家好,我们是摸鱼怪小队,队伍编号CICC2355
蜂鸟E203 SoC仅支持RV32I或RV32E指令集,如果要支持浮点数运算,需要扩展riscv的F指令集。
E203未给F指令集扩展留有通路,需要自行添加。
①F扩展需要FCSR与32个32位的F register。
②修改decode相关代码,添加F指令集相关译码。
③修改disp相关代码,添加fpu的指令派出部分。
④OITF部分已支持FPU相关接口,但内部未实现连接,需要重新设置宏定义并连接。
⑤FPU模块可使用开源的FPU
⑥写回部分:由于FPU有一些多周期的指令,需要添加FPU相关的长周期写回。
如无特殊说明,所有数据来自于浮点寄存器。
FLW:将内存中的一个值以浮点数格式加载到浮点寄存器。其中rs1为整型寄存器。
FSW:将浮点寄存器中的一个数以加载到内存中。其中rs1为整型寄存器。
FMADD.S: rd=rs1rs2+rs3,所有数据来源以及目的地都是浮点寄存器
FMSUB.S:rd= rs1rs2-rs3。
FNMSUB.S :rd= -(rs1rs2-rs3)。
FNMADD.S : rd = -(rs1rs2+rs3)。
FADD.S:rd=rs1+rs2。
FSUB.S:rd=rs1-rs2。
FMUL.S:rd=rs1*rs2。
FDIV.S:rd=rs1/rs2。
FSQRT.S:rd=sqrt(rs1)。
FSGNJ.S、FSGNJN.S、FSGNJX.S:rd=rs1除符号位以外值,符号位来自rs2,FSGNJ.S直接取符号位,FSGNJN.S对符号位取反,FSGNJX.S将rs1与rs2符号位异或。
FMIN.S:rd=rs1与rs2中较小值。
FMAX.S:rd=rs1与rs2中较大值。
FCVT.W.S:将rs1单精度浮点数转化为rd整型,rd为整型寄存器。
FCVT.WU.S:将rs1单精度浮点数转化为rd无符号整型,rd为整型寄存器。
FMV.X.W:将rs1数据直接写入rd。rd为整型寄存器。
FEQ.S:判断rs1与rs2是否相等,并将结果写入rd,rd为整型寄存器。
FLT.S:同上,判断rs1是否小于rs2。
FLE.S:同上,判断rs1是否小于等于rs2。
FCLASS.S:判断rs1数据类型,写入rd,rd为整型寄存器。
FCVT.S.W:将rs1整型转化为rd单精度浮点数,rs1为整型寄存器。
FCVT.S.WU:将rs1无符号整型转化为rd单精度浮点数,rs1为整型寄存器。
FMV.W.X:将整型寄存器rs1中的数据直接写入浮点寄存器rd。