RV32M向RV32I中添加了整数乘法和除法指令;
- RV32M具有有符号和无符号整数的除法指令:divide(div)和divide unsigned(divu),它们将 商放入目标寄存器。
- 在少数情况下,程序员需要余数而不是商,因此RV32M提供 remainder(rem)和 remainder unsigned(remu),它们在目标寄存器写入余数,而不是商。
- 要测试除数是否为零,只需要在除法操作之前加入一条用于测试的beqz指令。RV32I不会 因为除零操作而trap,因为极少数程序需要这种行为,而且在那些软件中可以很容易地检查 是否除零。当然,除以其它常数永远不需要检查。
- 乘法比除法要更为复杂,是因为积的长度是乘数和被乘数长度的和。
- 将两个32位数相乘得到 的是64位的乘积。为了正确地得到一个有符号或无符号的64位积,RISC-V中带有四个乘 法指令。
- 要得到整数32位乘积(64位中的低32位)就用mul指令。
- 要得到高32位,如果 操作数都是有符号数,就用mulh指令;
- 如果操作数都是无符号数,就用mulhu指令;
- 如 果一个有符号一个无符号,可以用mulhsu指令。
- 在一条指令中完成把64位积写入两个32 位寄存器的操作会使硬件设计变得复杂,所以RV32M需要两条乘法指令才能得到一个完整 的64位积。
附录:除以零的行为;
原文链接:https://blog.csdn.net/weixin_44013026/article/details/132846103
riscv架构
当发生除零操作时,不会触发异常,硬件会返回一个默认的特殊值,该特殊值由硬件设计确定。可以通过查看FS/FD寄存器查看是否发生除零操作,FS寄存器用于表示浮点运算的状态,其中第1位和第2位分别表示除以0和无效操作的错误标志。如果除零操作发生了错误,这些位将被设置为1。FD寄存器用于表示定点运算的状态,其中第1位和第2位分别表示除以0和无效操作的错误标志。如果除零操作发生了错误,这些位也将被设置为1。