RV32FDQ/RV64RDQ指令集(1)

      Risc-V架構定義了可選的單精度浮點指令(F擴展指令集)和雙精度浮點指令(D擴展指令集),以及四精度浮點指令集(Q擴展指令集)。Risc-V架構規定:處理器能夠選擇只實現F擴展指令子集而不支持D擴展指令子集;可是若是支持了D擴展指令子集,則必須支持F擴展指令子集;若是支持了Q擴展指令集,必須支持D擴展指令集。Risc-V架構規定的浮點數符合IEEE754 2008規則,能夠從下面的連接瞭解浮點數格式的詳細信息:html

http://www.javashuo.com/article/p-rglglvrn-ba.html架構

      Risc-V規定,若是支持單精度浮點指令或者雙精度浮點指令,四精度浮點指令,則須要增長一組獨立的通用浮點寄存器組,包括32個通用浮點寄存器,標號位f0到f31。若是僅支持F擴展指令子集,則每一個通用寄存器是32位的,若是支持D擴展指令子集,則每一個通用寄存器是64位的,若是支持Q擴展指令集,則每一個浮點通用寄存器是128位的。ide

      若是處理器同時支持 RV32F 和 RV32D 擴展,則單精度數據僅使用 f 寄存器中的低 32位。與 RV32I 中的 x0 不一樣,寄存器 f0 不是硬連線到常量 0, 而是和全部其餘 31 個 f 寄存器同樣,是一個可變寄存器。下面是32位和64位浮點寄存器的名字,別名和註釋。ui

63-32 31-0(名字和別名) 註釋
  f0/ft0 FP Temporary
  f1/ft1 FP Temporary
  f2/ft2 FP Temporary
  f3/ft3 FP Temporary
  f4/ft4 FP Temporary
  f5/ft5 FP Temporary
  f6/ft6 FP Temporary
  f7/ft7 FP 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寄存器。編碼

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Reserved Rounding mode(frm) accrued exceptions(fflags)
NV DZ OF UF NX


     fcsr寄存器包含浮點異常標誌域(fflags),不一樣的標誌位表示不一樣的異常類型。若是浮點運算單元在運算中出現了相應的異常,則會將fcsr寄存器中對應的標誌位設置爲1,且會一直保持累積。軟件能夠經過寫0的方式單獨清除某個異常標誌位。spa

flag mnemonic flag meaning
NV invalid operation
DZ divide by zero
OF overflow
UF underflow
NX inexact,不精確


     根據IEEE-754標準,浮點運算須要指定舍入模式(rounding mode),這有助於肯定偏差範圍和編寫數值庫。最準確且最多見的舍入模式是舍入到最近的偶數(RNE)。舍入模式能夠經過浮點控制和狀態寄存器 fcsr 進行設置。rest

Risc-V架構浮點運算的舍入模式能夠經過兩種方式指定。code

     使用靜態舍入模式,浮點指令編碼中有3位做爲舍入模式域,不一樣的舍入模式編碼以下圖,Risc-V支持5種合法的舍入模式。若是舍入模式編碼爲101或110,則爲非法模式;若是舍入模式編碼爲111,則意味着使用動態舍入模式。若是使用動態舍入模式,則使用fcsr寄存器中的舍入模式域,舍入模式域定義如上圖,若是fcsr寄存器中的舍入模式域指定爲非法的舍入模式,則後續浮點指令會產生非法指令異常。orm

rounding mode mnemonic meaning
000 RNE round to nearest ties to even,舍入到最近的偶數
001 RTZ round towards zero 向零舍入
010 RDN round down(towards -∞),向負無窮舍入
011 RUP round up(towards +∞),向正無窮舍入
100 RMM round 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寄存器的操做或者執行浮點指令的行爲將會產生非法指令異常htm

      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條,指令格式以下列表。

      rs2 rs1 func3(rm) rd opcode            
name type 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 RV32F RV64F RV32D RV64D RV32Q RV64Q
fadd.s R 0 0 0 0 0 0 0                     rm           1 0 1 0 0 1 1
fsub.s R 0 0 0 0 1 0 0                     rm           1 0 1 0 0 1 1
fmul.s R 0 0 0 1 0 0 0                     rm           1 0 1 0 0 1 1
fdiv.s R 0 0 0 1 1 0 0                     rm           1 0 1 0 0 1 1
fsgnj.s R 0 0 1 0 0 0 0                     0 0 0           1 0 1 0 0 1 1
fsgnjn.s R 0 0 1 0 0 0 0                     0 0 1           1 0 1 0 0 1 1
fsgnjx.s R 0 0 1 0 0 0 0                     0 1 0           1 0 1 0 0 1 1
fmin.s R 0 0 1 0 1 0 0                     0 0 0           1 0 1 0 0 1 1
fmax.s R 0 0 1 0 1 0 0                     0 0 1           1 0 1 0 0 1 1
fsqrt.s R 0 1 0 1 1 0 0 0 0 0 0 0           rm           1 0 1 0 0 1 1
fadd.d R 0 0 0 0 0 0 1                     rm           1 0 1 0 0 1 1
fsub.d R 0 0 0 0 1 0 1                     rm           1 0 1 0 0 1 1
fmul.d R 0 0 0 1 0 0 1                     rm           1 0 1 0 0 1 1
fdiv.d R 0 0 0 1 1 0 1                     rm           1 0 1 0 0 1 1
fsgnj.d R 0 0 1 0 0 0 1                     0 0 0           1 0 1 0 0 1 1
fsgnjn.d R 0 0 1 0 0 0 1                     0 0 1           1 0 1 0 0 1 1
fsgnjx.d R 0 0 1 0 0 0 1                     0 1 0           1 0 1 0 0 1 1
fmin.d R 0 0 1 0 1 0 1                     0 0 0           1 0 1 0 0 1 1
fmax.d R 0 0 1 0 1 0 1                     0 0 1           1 0 1 0 0 1 1
fcvt.s.d R 0 1 0 0 0 0 0 0 0 0 0 1           rm           1 0 1 0 0 1 1
fcvt.d.s R 0 1 0 0 0 0 1 0 0 0 0 0           rm           1 0 1 0 0 1 1
fsqrt.d R 0 1 0 1 1 0 1 0 0 0 0 0           rm           1 0 1 0 0 1 1
fadd.q R 0 0 0 0 0 1 1                     rm           1 0 1 0 0 1 1
fsub.q R 0 0 0 0 1 1 1                     rm           1 0 1 0 0 1 1
fmul.q R 0 0 0 1 0 1 1                     rm           1 0 1 0 0 1 1
fdiv.q R 0 0 0 1 1 1 1                     rm           1 0 1 0 0 1 1
fsgnj.q R 0 0 1 0 0 1 1                     0 0 0           1 0 1 0 0 1 1
fsgnjn.q R 0 0 1 0 0 1 1                     0 0 1           1 0 1 0 0 1 1
fsgnjx.q R 0 0 1 0 0 1 1                     0 1 0           1 0 1 0 0 1 1
fmin.q R 0 0 1 0 1 1 1                     0 0 0           1 0 1 0 0 1 1
fmax.q R 0 0 1 0 1 1 1                     0 0 1           1 0 1 0 0 1 1
fcvt.s.q R 0 1 0 0 0 0 0 0 0 0 1 1           rm           1 0 1 0 0 1 1
fcvt.q.s R 0 1 0 0 0 1 1 0 0 0 0 0           rm           1 0 1 0 0 1 1
fcvt.d.q R 0 1 0 0 0 0 1 0 0 0 1 1           rm           1 0 1 0 0 1 1
fcvt.q.d R 0 1 0 0 0 1 1 0 0 0 0 1           rm           1 0 1 0 0 1 1
fsqrt.q R 0 1 0 1 1 1 1 0 0 0 0 0           rm           1 0 1 0 0 1 1
fle.s R 1 0 1 0 0 0 0                     0 0 0           1 0 1 0 0 1 1
flt.s R 1 0 1 0 0 0 0                     0 0 1           1 0 1 0 0 1 1
feq.s R 1 0 1 0 0 0 0                     0 1 0           1 0 1 0 0 1 1
fle.d R 1 0 1 0 0 0 1                     0 0 0           1 0 1 0 0 1 1
flt.d R 1 0 1 0 0 0 1                     0 0 1           1 0 1 0 0 1 1
feq.d R 1 0 1 0 0 0 1                     0 1 0           1 0 1 0 0 1 1
fle.q R 1 0 1 0 0 1 1                     0 0 0           1 0 1 0 0 1 1
flt.q R 1 0 1 0 0 1 1                     0 0 1           1 0 1 0 0 1 1
feq.q R 1 0 1 0 0 1 1                     0 1 0           1 0 1 0 0 1 1
fcvt.w.s R 1 1 0 0 0 0 0 0 0 0 0 0           rm           1 0 1 0 0 1 1
fcvt.wu.s R 1 1 0 0 0 0 0 0 0 0 0 1           rm           1 0 1 0 0 1 1
fcvt.l.s R 1 1 0 0 0 0 0 0 0 0 1 0           rm           1 0 1 0 0 1 1
fcvt.lu.s R 1 1 0 0 0 0 0 0 0 0 1 1           rm           1 0 1 0 0 1 1
fmv.x R 1 1 1 0 0 0 0 0 0 0 0 0           0 0 0           1 0 1 0 0 1 1
fclass.s R 1 1 1 0 0 0 0 0 0 0 0 0           0 0 1           1 0 1 0 0 1 1
fcvt.w.d R 1 1 0 0 0 0 1 0 0 0 0 0           rm           1 0 1 0 0 1 1
fcvt.wu.d R 1 1 0 0 0 0 1 0 0 0 0 1           rm           1 0 1 0 0 1 1
fcvt.l.d R 1 1 0 0 0 0 1 0 0 0 1 0           rm           1 0 1 0 0 1 1
fcvt.lu.d R 1 1 0 0 0 0 1 0 0 0 1 1           rm           1 0 1 0 0 1 1
fmv.x R 1 1 1 0 0 0 1 0 0 0 0 0           0 0 0           1 0 1 0 0 1 1
fclass.d R 1 1 1 0 0 0 0 0 0 0 0 0           0 0 1           1 0 1 0 0 1 1
fcvt.w.q R 1 1 0 0 0 1 1 0 0 0 0 0           rm           1 0 1 0 0 1 1
fcvt.wu R 1 1 0 0 0 1 1 0 0 0 0 1           rm           1 0 1 0 0 1 1
fcvt.l.q R 1 1 0 0 0 1 1 0 0 0 1 0           rm           1 0 1 0 0 1 1
fcvt.lu.q R 1 1 0 0 0 1 1 0 0 0 1 1           rm           1 0 1 0 0 1 1
fmv.x R 1 1 1 0 0 1 1 0 0 0 0 0           0 0 0           1 0 1 0 0 1 1
fclass.q R 1 1 1 0 0 1 1 0 0 0 0 0           0 0 1           1 0 1 0 0 1 1
fcvt.s.w R 1 1 0 1 0 0 0 0 0 0 0 0           rm           1 0 1 0 0 1 1
fcvt.s.wu R 1 1 0 1 0 0 0 0 0 0 0 1           rm           1 0 1 0 0 1 1
fcvt.s.l R 1 1 0 1 0 0 0 0 0 0 1 0           rm           1 0 1 0 0 1 1
fcvt.s.lu R 1 1 0 1 0 0 0 0 0 0 1 1           rm           1 0 1 0 0 1 1
fmv.w R 1 1 1 0 0 0 0 0 0 0 0 0           0 0 0           1 0 1 0 0 1 1
fcvt.d.w R 1 1 0 1 0 0 1 0 0 0 0 0           rm           1 0 1 0 0 1 1
fcvt.d.wu R 1 1 0 1 0 0 1 0 0 0 0 0           rm           1 0 1 0 0 1 1
fcvt.d.l R 1 1 0 1 0 0 1 0 0 0 1 0           rm           1 0 1 0 0 1 1
fcvt.d.lu R 1 1 0 1 0 0 1 0 0 0 1 1           rm           1 0 1 0 0 1 1
相關文章
相關標籤/搜索