1. 整数乘除法的标准扩展“M”
整数乘法和除法的指令扩展“M”包含对两个整数寄存器中的值做乘、除法的指令。而之所以把乘除法单独列出来,是为了简化低端硬件的实现,毕竟某些场景极少用到整数乘除法,不用单独实现。
(1) 乘法操作
MUL/MULH[S][H]/MULW
MUL执行一次两个XLEN位的带符号乘法rs1×rs2,并将结果的低XLEN存到rd中,忽略溢出。
MULH、MULHU、MULHSU执行相同的乘法,分别针对的对象为有符号×有符号、无符号×无符号、 有符号×无符号乘法,并将运算结果2×XLEN位中的高XLEN位返回。
如果同时需要结果的高、低XLEN位,一般代码顺序为:
MULH[[S]U] rdh,rs1,rs2 ;
MUL rdl,rs1,rs2;
(源寄存器区分符必须按照同样的顺序,并且 rdh 不能是 rs1 或者 rs2 )。允许硬件实现时将其融合为单一操作,而不是分两次操作。MULW属于RV64I暂不表(>_< 暂时用不到,就不写了)。
(2) 除法操作
DIV/DIVU/REM/REMU
DIV/DIVU分别做带符号和无符号的整数除法,REM/REMU分别做带符号和无符号的取余。
如果同时要商和余数,建议代码为
DIV[U] rdq,rs1,rs2;
REM[U] rdq,rs1,rs2;
同样建议硬件实现能够把这两个操作融合为单一操作。<