RV32M添加了整数乘法和除法指令
除法指令
- div、divu: 有符号和无符号整数的除法指令,它们将商放入目标寄存器
- rem、remu: 将余数写入目标寄存器
- beqz: 测试除数是否为零
乘法指令
积=被乘数×乘数
积的长度是乘数和被乘数长度的和,将两个32位数相乘得到的是64位乘积
- mul:要得到整数32位成绩(64位中的低32位)
- mulh:得到高32位,有符号
- mulhu:操作数都是无符号数
- mulhus:一个有符号,一个无符号
mulh和mulhu可以检查乘法的溢出
在一条指令中完成把64位积写入两个32位寄存器的操作会使硬件设计变得复杂,所以RV32M需要两条乘法指令才能都得到一个完整的64位积。
结束语
为了为嵌入式提供最小的RISC-V处理器,乘法和除法被归入RISC-V的第一个可选标志扩展的一部分RV32M。许多RISC-V处理器将包括RV32M。
RV32F和RV32D:单精度和双精度浮点数
浮点寄存器
-
32F和32D使用32个独立的f寄存器而不是x寄存器
-
主要原因:处理器在不增加RISC-V之林那个格式中寄存器描述符所占空间的情况下使用两组寄存器来将寄存器容量和带宽是乘2,着可以提高处理器性能
-
主要影响:必须添加新的指令来加载和存储数据f寄存器,还需要添加新指令用于在x和f寄存器之间传递数据
-
如果同时支持扩展,则单精度数据仅仅使用f寄存器的低32位,寄存器f0不是硬连线到常量0,而是和所有其他31个f寄存器一样是可变寄存器
浮点加载,存储和算术指令
- flw,fld:加载指令
- fsw fsd:存储指令
他们和lw和sw拥有相同的寻址模式和指令格式
- 标准运算指令:fadd.s,fadd.s,fsub.s,fsub.d,fmul.s,fmul.d,fdiv.s,fdiv.d
- 平方根指令:fsqrt.s fsqrt,d
- 最大值和最小值:fmin.s fmin.d fmax.s fmax.d
这些指令在不适用分支指令进行比较的情况下,将一对源操作数中的较小值或较大值写入目的寄存器
32F和32D没有提供浮点分支指令,而提供了浮点比较指令,这些指令根据两个浮点的比较结果将一个整数寄存器设置为1或0
feq.s ffeq.d flt.s flt.d fle.s fle.d
浮点转换和搬运
- 32F和32D支持在32位有符号整数,32位无符号整数,32位浮点和64位浮点之间进行所有组合的转换
- 32F还提供了将数据从f寄存器(fmv.x.w)移动到x寄存器的指令,以及反方向移动数据的指令(fmv.w.x)
其他浮点指令
除了有助于数学库中的符号操作,还提供了三种流行的浮点伪指令:
结束语
IEEE754-2008浮点标准定义了浮点数据类型,计算精度和所需操作。它的广泛流行大大降低了移植浮点数程序的难度。