RV32FDQ/RV64RDQ指令集(1)
本帖最后由 皋陶 于 2021-3-6 19:17 编辑RV32FDQ/RV64RDQ指令集(1)RV32FDQ/RV64RDQ指令集(2)
Risc-V架构定义了可选的单精度浮点指令(F扩展指令集)和双精度浮点指令(D扩展指令集),以及四精度浮点指令集(Q扩展指令集)。Risc-V架构规定:处理器可以选择只实现F扩展指令子集而不支持D扩展指令子集;但是如果支持了D扩展指令子集,则必须支持F扩展指令子集;如果支持了Q扩展指令集,必须支持D扩展指令集。Risc-V架构规定的浮点数符合IEEE754 2008规则,可以从下面的链接了解浮点数格式的详细信息: IEEE 754浮点数表示标准 https://www.cnblogs.com/german-iris/p/5759557.html Risc-V规定,如果支持单精度浮点指令或者双精度浮点指令,四精度浮点指令,则需要增加一组独立的通用浮点寄存器组,包括32个通用浮点寄存器,标号位f0到f31。如果仅支持F扩展指令子集,则每个通用寄存器是32位的,如果支持D扩展指令子集,则每个通用寄存器是64位的,如果支持Q扩展指令集,则每个浮点通用寄存器是128位的。 如果处理器同时支持 RV32F 和 RV32D 扩展,则单精度数据仅使用 f 寄存器中的低 32位。与 RV32I 中的 x0 不同,寄存器 f0 不是硬连线到常量 0, 而是和所有其他 31 个 f 寄存器一样,是一个可变寄存器。下面是32位和64位浮点寄存器的名字,别名和注释。
63-3231-0(名字和别名)注释
f0/ft0FP Temporary
f1/ft1FP Temporary
f2/ft2FP Temporary
f3/ft3FP Temporary
f4/ft4FP Temporary
f5/ft5FP Temporary
f6/ft6FP Temporary
f7/ft7FP Temporary
f8 / fs0 FP Saved register
f9 / fs1 FP Saved register
f10 / fa0 FP Function argument, return value
f11 / fa1 FP Function argument, return value
f12 / fa2 FP Function argument
f13 / fa3 FP Function argument
f14 / fa4 FP Function argument
f15 / fa5 FP Function argument
f16 / fa6 FP Function argument
f17 / fa7 FP Function argument
f18 / fs2 FP Saved register
f19 / fs3 FP Saved register
f20 / fs4 FP Saved register
f21 / fs5 FP Saved register
f22 / fs6 FP Saved register
f23 / fs7 FP Saved register
f24 / fs8 FP Saved register
f25 / fs9 FP Saved register
f26 / fs10 FP Saved register
f27 / fs11 FP Saved register
f28 / ft8 FP Temporary
f29 / ft9 FP Temporary
f30 / ft10 FP Temporary
f31 / ft11 FP Temporary
Risc-V架构规定,如果支持浮点指令,需要增加一个浮点控制状态寄存器fcsr,该寄存器是一个可读可写的csr寄存器。
313029282726252423222120191817161514131211109876543210
ReservedRounding mode(frm)accrued exceptions(fflags)
NVDZOFUFNX
fcsr寄存器包含浮点异常标志域(fflags),不同的标志位表示不同的异常类型。如果浮点运算单元在运算中出现了相应的异常,则会将fcsr寄存器中对应的标志位设置为1,且会一直保持累积。软件可以通过写0的方式单独清除某个异常标志位。
flag mnemonicflag meaning
NVinvalid operation
DZdivide by zero
OFoverflow
UFunderflow
NXinexact,不精确
根据IEEE-754标准,浮点运算需要指定舍入模式(rounding mode),这有助于确定误差范围和编写数值库。最准确且最常见的舍入模式是舍入到最近的偶数(RNE)。舍入模式可以通过浮点控制和状态寄存器 fcsr 进行设置。Risc-V架构浮点运算的舍入模式可以通过两种方式指定。 使用静态舍入模式,浮点指令编码中有3位作为舍入模式域,不同的舍入模式编码如下图,Risc-V支持5种合法的舍入模式。如果舍入模式编码为101或110,则为非法模式;如果舍入模式编码为111,则意味着使用动态舍入模式。如果使用动态舍入模式,则使用fcsr寄存器中的舍入模式域,舍入模式域定义如上图,如果fcsr寄存器中的舍入模式域指定为非法的舍入模式,则后续浮点指令会产生非法指令异常。
rounding modemnemonicmeaning
000RNEround to nearest ties to even,舍入到最近的偶数
001RTZround towards zero 向零舍入
010RDNround down(towards -∞),向负无穷舍入
011RUPround up(towards +∞),向正无穷舍入
100RMMround to nearest ties to max magnitude,向最近的最大值舍入
101 invalid reserved for future use
110 invalid reserved for future use
111 in instruction's rm field, selects dynamic rounding mode;
in rounding mode register, invalid.
如果处理器不想使用浮点单元,比如把浮点单元关电以节省功耗,可以使用csr写指令将mstatus寄存器的FS域设置成0,将浮点单元的功能予以关闭。当浮点单元功能关闭后,任何访问浮点csr寄存器的操作或者执行浮点指令的行为将会产生非法指令异常。 Risc-V规定,对于非规格化数(subnormal Numbers)的处理完全遵循IEEE754定义。根据IEEE-754标准,在浮点数的表示中,有一类特殊编码数据属于NaN(not a number)类型,且NaN分为Signaling-NaN和Quiet-NAN。Risc-V架构规定,如果浮点运算的结果是一个NaN数,那么使用一个固定的NaN数,将之命名为Canonical-NaN。单精度浮点对应的Canonical-NaN数值为0x7fc00000,双精度浮点对应Canonical-NaN数值为0x7ff80000_00000000 如果同时支持单精度浮点(F扩展指令子集)和双精度浮点(D扩展指令子集),由于浮点通用寄存器的宽度为64位,Risc-V架构规定单精度浮点指令产生的32位结果写入浮点通用寄存器(64位)时,将结果写入低32位,而高位全部写入数值1,RiscV架构规定此种做法称之为NaN-Boxing。NaN-boxing可以发生在如下情形: 对于单精度浮点数的读(Load)/写(store)指令和传送(Move)指令(包括FLW,FSW,FMV.W.X,FMV.X.W),如果需要将32位的数值写入通用浮点寄存器,则采用NaN-boxing的方式;如果需要将浮点通用寄存器中的数值读出,则仅使用其低32位值。 对于单精度浮点运算(compute)和符号注入(sign-injection)指令,需要判断其操作数浮点寄存器中的值是否为合法的NaN-Boxed值,即高位都是1,如果是,则正常使用其低32位,如果不是,则将此操作数当作Canonical-NaN来使用。 对于整数至单精度的浮点转化指令(比如FCVT.S.X),则采用NaN-boxing的方式写回浮点通用寄存器。对于单精度浮点至整数的转化指令(比如FCVT.X.S),需要判断其操作数浮点寄存器中的值是否为合法的NaN-boxed值(即高位都为1)。如果是,则正常使用其低32位,如果不是,则将此操作数当作Canonical-NaN来使用。 浮点指令总共96条,指令格式如下列表。
rs2rs1func3(rm)rdopcode
nametype313029282726252423222120191817161514131211109876543210RV32FRV64FRV32DRV64DRV32QRV64Q
fadd.sR0000000 rm 1010011√√✘✘✘✘
fsub.sR0000100 rm 1010011√√✘✘✘✘
fmul.sR0001000 rm 1010011√√✘✘✘✘
fdiv.sR0001100 rm 1010011√√✘✘✘✘
fsgnj.sR0010000 000 1010011√√✘✘✘✘
fsgnjn.sR0010000 001 1010011√√✘✘✘✘
fsgnjx.sR0010000 010 1010011√√✘✘✘✘
fmin.sR0010100 000 1010011√√✘✘✘✘
fmax.sR0010100 001 1010011√√✘✘✘✘
fsqrt.sR010110000000 rm 1010011√√✘✘✘✘
fadd.dR0000001 rm 1010011✘✘√√✘✘
fsub.dR0000101 rm 1010011✘✘√√✘✘
fmul.dR0001001 rm 1010011✘✘√√✘✘
fdiv.dR0001101 rm 1010011✘✘√√✘✘
fsgnj.dR0010001 000 1010011✘✘√√✘✘
fsgnjn.dR0010001 001 1010011✘✘√√✘✘
fsgnjx.dR0010001 010 1010011✘✘√√✘✘
fmin.dR0010101 000 1010011✘✘√√✘✘
fmax.dR0010101 001 1010011✘✘√√✘✘
fcvt.s.dR010000000001 rm 1010011√√✘✘✘✘
fcvt.d.sR010000100000 rm 1010011✘✘√√✘✘
fsqrt.dR010110100000 rm 1010011✘✘√√✘✘
fadd.qR0000011 rm 1010011✘✘✘✘√√
fsub.qR0000111 rm 1010011✘✘✘✘√√
fmul.qR0001011 rm 1010011✘✘✘✘√√
fdiv.qR0001111 rm 1010011✘✘✘✘√√
fsgnj.qR0010011 000 1010011✘✘✘✘√√
fsgnjn.qR0010011 001 1010011✘✘✘✘√√
fsgnjx.qR0010011 010 1010011✘✘✘✘√√
fmin.qR0010111 000 1010011✘✘✘✘√√
fmax.qR0010111 001 1010011✘✘✘✘√√
fcvt.s.qR010000000011 rm 1010011✘✘✘✘√√
fcvt.q.sR010001100000 rm 1010011✘✘✘✘√√
fcvt.d.qR010000100011 rm 1010011✘✘✘✘√√
fcvt.q.dR010001100001 rm 1010011✘✘✘✘√√
fsqrt.qR010111100000 rm 1010011✘✘✘✘√√
fle.sR1010000 000 1010011√√✘✘✘✘
flt.sR1010000 001 1010011√√✘✘✘✘
feq.sR1010000 010 1010011√√✘✘✘✘
fle.dR1010001 000 1010011✘✘√√✘✘
flt.dR1010001 001 1010011✘✘√√✘✘
feq.dR1010001 010 1010011✘✘√√✘✘
fle.qR1010011 000 1010011✘✘✘✘√√
flt.qR1010011 001 1010011✘✘✘✘√√
feq.qR1010011 010 1010011✘✘✘✘√√
fcvt.w.sR110000000000 rm 1010011√√✘✘✘✘
fcvt.wu.sR110000000001 rm 1010011√√✘✘✘✘
fcvt.l.sR110000000010 rm 1010011√√✘✘✘✘
fcvt.lu.sR110000000011 rm 1010011√√✘✘✘✘
fmv.xR111000000000 000 1010011✘✘√√✘✘
fclass.sR111000000000 001 1010011√√✘✘✘✘
fcvt.w.dR110000100000 rm 1010011✘✘√√✘✘
fcvt.wu.dR110000100001 rm 1010011✘✘√√✘✘
fcvt.l.dR110000100010 rm 1010011✘✘√√✘✘
fcvt.lu.dR110000100011 rm 1010011✘✘√√✘✘
fmv.xR111000100000 000 1010011✘✘√√✘✘
fclass.dR111000000000 001 1010011✘✘√√✘✘
fcvt.w.qR110001100000 rm 1010011✘✘✘✘√√
fcvt.wuR110001100001 rm 1010011✘✘✘✘√√
fcvt.l.qR110001100010 rm 1010011✘✘✘✘√√
fcvt.lu.qR110001100011 rm 1010011✘✘✘✘√√
fmv.xR111001100000 000 1010011✘✘✘✘√√
fclass.qR111001100000 001 1010011✘✘✘✘√√
fcvt.s.wR110100000000 rm 1010011√√✘✘✘✘
fcvt.s.wuR110100000001 rm 1010011√√✘✘✘✘
fcvt.s.lR110100000010 rm 1010011√√✘✘✘✘
fcvt.s.luR110100000011 rm 1010011√√✘✘✘✘
fmv.wR111000000000 000 1010011√✘✘✘✘✘
fcvt.d.wR110100100000 rm 1010011✘✘√√✘✘
fcvt.d.wuR110100100000 rm 1010011✘✘√√✘✘
fcvt.d.lR110100100010 rm 1010011✘✘✘√✘✘
fcvt.d.luR110100100011 rm 1010011✘✘✘√✘✘
fmv.d.xR111100100000 000 1010011✘✘√√✘✘
fcvt.q.wuR110101100000 rm 1010011✘✘✘✘√√
fcvt.q.wuR110101100001 rm 1010011✘✘✘✘√√
fcvt.q.luR110101100010 rm 1010011✘✘✘✘√√
fcvt.q.luR110101100011 rm 1010011✘✘✘✘√√
fmv.qR111101100000 000 1010011✘✘✘✘√√
imm
11109876543210rs1func3rdopcode
nametype313029282726252423222120191817161514131211109876543210RV32FRV64FRV32DRV64DRV32QRV64Q
flwI 010 0000111√√✘✘✘✘
fld I 011 0000111✘✘√√✘✘
flq I 100 0000111✘✘✘✘√√
imm imm
111098765rs2rs1func343210opcode
nametype313029282726252423222120191817161514131211109876543210RV32FRV64FRV32DRV64DRV32QRV64Q
fsw S 010 0100111√√✘✘✘✘
fsd S 011 0100111✘✘√√✘✘
fsqS 100 0100111✘✘✘✘√√
rs3 rs2rs1func3(rm)rdopcode
nametype313029282726252423222120191817161514131211109876543210RV32FRV64FRV32DRV64DRV32QRV64Q
fmadd.sR4 00 rm 1000011√√✘✘✘✘
fmsub.sR4 00 rm 1000111√√✘✘✘✘
fnmsub.sR4 00 rm 1001011√√✘✘✘✘
fnmadd.sR4 00 rm 1001111√√✘✘✘✘
fmadd.dR4 01 rm 1000011✘✘√√✘✘
fmsub.dR4 01 rm 1000111✘✘√√✘✘
fnmsub.dR4 01 rm 1001011✘✘√√✘✘
fnmadd.dR4 01 rm 1001111✘✘√√✘✘
fmadd.qR4 11 rm 1000011✘✘✘✘√√
fmsub.qR4 11 rm 1000111✘✘✘✘√√
fnmsub.qR4 11 rm 1001011✘✘✘✘√√
fnmadd.qR4 11 rm 1001111✘✘✘✘√√
完
页:
[1]