皋陶 发表于 2021-3-5 22:09:59

RV32M/RV64M指令集

本帖最后由 皋陶 于 2021-3-5 22:09 编辑

RISC-V定义了可选的RV32M,它定义了整数乘法除法指令。总共8条指令。
一、mul
mul rd, rs1, rs2    //x = x × x
乘(Multiply). R-type, RV32M and RV64M.
把寄存器 x乘到寄存器 x上,乘积写入 x。忽略算术溢出。


func7rs2rs1func3rdopcode
nametype313029282726252423222120191817161514131211109876543210
mulR00000010000110011
例子:00000000 <.text>:
    0:   027302b3                mul   x5,x6,x7

二、mulh
mulh rd, rs1, rs2    //x = (x s ×s x) ≫s XLEN
高位乘(Multiply High). R-type, RV32M and RV64M.
把寄存器 x乘到寄存器 x上,都视为 2 的补码,将乘积的高位写入 x。


func7rs2rs1func3rdopcode
nametype313029282726252423222120191817161514131211109876543210
mulhR00000010010110011
例子:00000000 <.text>:
    0:   027312b3                mulh    x5,x6,x7

三、mulhu
mulhu rd, rs1, rs2   //x = (xu ×u x) ≫u XLEN
高位无符号乘(Multiply High Unsigned). R-type, RV32M and RV64M.
把寄存器 x乘到寄存器 x上, x、 x均为无符号数,将乘积的高位写入 x。


func7rs2rs1func3rdopcode
nametype313029282726252423222120191817161514131211109876543210
mulhuR00000010110110011
例子:   0:   027332b3                mulhu   x5,x6,x7

四、mulhsu
mulhsu rd, rs1, rs2   //x = (xu ×s x) ≫s XLEN

高位有符号-无符号乘(Multiply High Signed-Unsigned). R-type, RV32M and RV64M.

把寄存器 x乘到寄存器 x上, x为 2 的补码, x为无符号数,将乘积的高位写入 x



func7rs2rs1func3rdopcode
nametype313029282726252423222120191817161514131211109876543210
mulhsuR00000010100110011
例子:00000000 <.text>:
    0:   027322b3                mulhsux5,x6,x7

五、div
div rd, rs1, rs2   //x = x ÷s x
除法(Divide). R-type, RV32M and RV64M.
用寄存器 x的值除以寄存器 x的值,向零舍入,将这些数视为二进制补码,把商写入 x。

func7rs2rs1func3rdopcode
nametype313029282726252423222120191817161514131211109876543210
divR00000011000110011
例子:   0:   027342b3                div   x5,x6,x7

六、divu
divu rd, rs1, rs2 x = x ÷u x
无符号除法(Divide, Unsigned). R-type, RV32M and RV64M.
用寄存器 x的值除以寄存器 x的值,向零舍入,将这些数视为无符号数,把商写入x。


func7rs2rs1func3rdopcode
nametype313029282726252423222120191817161514131211109876543210
divuR00000011010110011
例子:   0:   027352b3                divu    x5,x6,x7

七、rem
rem rd, rs1, rs2    //x = x %s x
求余数(Remainder). R-type, RV32M and RV64M.
x除以 x,向 0 舍入,都视为 2 的补码,余数写入 x。


func7rs2rs1func3rdopcode
nametype313029282726252423222120191817161514131211109876543210
remR00000011100110011
例子:   0:   027362b3                rem   x5,x6,x7

八、remu
remu rd, rs1, rs2 x = x %u x
求无符号数的余数(Remainder, Unsigned). R-type, RV32M and RV64M.
x除以 x,向 0 舍入,都视为无符号数,余数写入 x。


func7rs2rs1func3rdopcode
nametype313029282726252423222120191817161514131211109876543210
remuR00000011110110011
例子:   0:   027372b3                remu    x5,x6,x7

如果希望得到两个32位整数相乘的完整的64位结果,Risc-V推荐使用下面的指令:
mulh rdh,rs1, rs2;mul rdl rs1,rs2
其中要求:两条指令的源操作数索引号和顺序必须完全相同。第一条指令的rdh索引必须不能与rs1,rs2索引号相同。处理器实现的微架构可以把两条指令融合成一条指令执行,从而提高性能。
如果希望同时得到两个32位数相除的商和余数,Risc-V推荐用以下指令:
div rdq, rs1, rs2;rem rdr,rs1,rs2;
其中要求:两条指令的源操作数索引号和顺序必须完全相同。第一条指令的rdh索引必须不能与rs1,rs2索引号相同。处理器实现的微架构可以把两条指令融合成一条指令执行,从而提高性能。
Risv-V中除以0,并不会产生异常,仍会产生一个特殊的结果。

RV32M是RV64M的子集,除了RV32M的8条指令,RV64M还增加以下5条RV32M中没有的指令。

九、mulw
mulw rd, rs1, rs2   //x = sext((x × x))
乘字(Multiply Word). R-type, RV64M.
把寄存器 x乘到寄存器 x上,乘积截为 32 位,进行有符号扩展后写入 x。忽略算术溢出。


func7rs2rs1func3rdopcode
nametype313029282726252423222120191817161514131211109876543210
mulwR00000010000111011
例子:0:   027302bb                mulw    x5,x6,x7

十、remw
remw rd, rs1, rs2   //x = sext(x %s x)
求余数字(Remainder Word). R-type, RV64M .
x的低 32 位除以 x的低 32 位,向 0 舍入,都视为 2 的补码,将余数的有符号扩展写入 x。


func7rs2rs1func3rdopcode
nametype313029282726252423222120191817161514131211109876543210
remwR00000011100111011
例子:   0:   027362bb                remw    x5,x6,x7


十一、divuw

divuw rd, rs1, rs2    //x = sext(x ÷u x)
无符号字除法(Divide Word, Unsigned). R-type, RV64M.
用寄存器 x的低 32 位除以寄存器 x的低 32 位,向零舍入,将这些数视为无符号数, 把经符号位扩展的 32 位商写入 x。


func7rs2rs1func3rdopcode
nametype313029282726252423222120191817161514131211109876543210
divuwR00000011010111011
例子:   0:   027352bb                divuw   x5,x6,x7

十二、divw
divw rd, rs1, rs2 x   // = sext(x ÷s x)
字除法(Divide Word). R-type, RV64M.
用寄存器 x的低 32 位除以寄存器 x的低 32 位,向零舍入,将这些数视为二进制补码,把经符号位扩展的 32 位商写入 x。


func7rs2rs1func3rdopcode
nametype313029282726252423222120191817161514131211109876543210
divwR00000011000111011
例子:   0:   027342bb                divw    x5,x6,x7

十三、remuw
remuw rd, rs1, rs2   //x = sext(x %u x)
求无符号数的余数字(Remainder Word, Unsigned). R-type, RV64M.
x的低 32 位除以 x的低 32 位,向 0 舍入,都视为无符号数,将余数的有符号扩展写入 x。


func7rs2rs1func3rdopcode
nametype313029282726252423222120191817161514131211109876543210
remuwR00000011110111011
例子:   0:   027372bb                remuw   x5,x6,x7
页: [1]
查看完整版本: RV32M/RV64M指令集