皋陶 发表于 2021-3-6 19:17:57

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]
查看完整版本: RV32FDQ/RV64RDQ指令集(1)