1. 什么是b2b问题
在分析上述问题之前,我们先来想这么一个问题:对于无符号二进制数,两个4位数相乘需要一个几位的寄存器才能保证结果没有溢出呢?答案是我们需要用一个8位的寄存器来存两个4位操作数相乘的结果。
但是对于RISC-V架构的CPU来说,它所有的通用寄存器都是32位的,如果我们要进行两个32位操作数的乘法操作,那该如何保存这个操作的结果呢?
RISC-V对于乘除法相关的指令设置了一个b2b (back to back) case。在执行Mul/Div指令前,它会首先判断其是否属于back2back fusing类型,如果确实属于下面几种类型就会进行一些判断来保证结果写回的正确性。
2. RISC-V M模块指令集
图 1 RV32M指令图示
图 2 RV32M 操作码映射包含指令布局,操作码,指令格式类型和它们的名称
对于除法操作
商 = (被除数 − 余数) ÷ 除数
或者
被除数 = 除数 × 商 + 余数
余数 = 被除数 − (商 × 除数)
RV32M 具有有符号和无符号整数的除法指令