RISC-V(三):RV32M(RISC-V 32 位乘法 / 除法扩展指令集)

RISC-V 的 RV32M 是 RV32I 基础整数指令集的乘法 / 除法扩展指令集 (M = Multiplication and Division),专门提供 32 位有符号 / 无符号整数的乘法、除法、取余操作,填补了 RV32I 仅支持基础算术运算的空白。RV32M 属于 RISC-V 标准扩展(非必选,但主流处理器均会实现),所有指令均为 R 型格式(寄存器 - 寄存器操作),操作数和结果均存于通用寄存器(x0~x31)。

一、RV32M 核心特性

  1. 指令格式 :全部为R 型指令 ,编码格式如下(7 位 opcode 固定为0110011,与 RV32I 的算术运算指令同 opcode,通过 funct3/funct7 区分):

    31-25 (funct7) 24-20 (rs2) 19-15 (rs1) 14-12 (funct3) 11-7 (rd) 6-0 (opcode)
    乘法 / 除法区分 源寄存器 2 源寄存器 1 操作类型 目的寄存器 0110011
  2. 数据类型 :仅支持32 位有符号(signed)32 位无符号(unsigned) 整数运算;

  3. 结果处理 :乘法指令会产生 64 位结果,RV32M 拆分为高 32 位低 32 位分别存入两个寄存器;除法 / 取余指令直接产生 32 位结果;

  4. 异常处理 :除法 / 取余指令若遇到除数为 0 ,会触发非法指令异常(Illegal Instruction Exception),具体行为由处理器实现定义(部分处理器会返回 0 或固定值)。

二、RV32M 指令集完整列表

RV32M 共包含10 条核心指令 ,分为乘法类除法 / 取余类,按功能分类如下(均为 R 型指令):

1. 乘法类指令(6 条)

处理 32 位整数乘法,结果为 64 位,拆分为低 32 位(LO)高 32 位(HI) 分别存储,支持有符号 / 无符号及混合符号乘法。

指令名 汇编格式 funct7 funct3 功能描述 有符号 / 无符号说明
mul mul rd, rs1, rs2 0000001 000 计算 rs1 × rs2,将低 32 位结果存入 rd 有符号 × 有符号
mulh mulh rd, rs1, rs2 0000001 001 计算 rs1 × rs2,将高 32 位结果存入 rd 有符号 × 有符号
mulhsu mulhsu rd, rs1, rs2 0000001 010 计算 rs1 × rs2,将高 32 位结果存入 rd 有符号(rs1) × 无符号(rs2)
mulhu mulhu rd, rs1, rs2 0000001 011 计算 rs1 × rs2,将高 32 位结果存入 rd 无符号 × 无符号
muli muli rd, rs1, imm - - 乘法立即数指令(RV32M 可选扩展),rs1 × 立即数,低 32 位存入 rd 有符号 × 有符号(立即数为 12 位有符号)
mulw mulw rd, rs1, rs2 0000001 000 仅 RV64M 支持(RV32M 无),32 位乘法结果符号扩展为 64 位存入 rd -

关键说明

  • 32 位 × 32 位 乘法的结果是 64 位,因此需要mul(低 32 位)+mulh/mulhsu/mulhu(高 32 位)配合,才能获取完整结果;
  • 混合符号乘法(mulhsu)主要用于地址计算、无符号数与有符号数的运算场景(如偏移量为有符号,基地址为无符号)。
2. 除法 / 取余类指令(4 条)

处理 32 位整数的除法和取余,直接产生 32 位结果,支持有符号 / 无符号运算,除数为 0 会触发异常

指令名 汇编格式 funct7 funct3 功能描述 有符号 / 无符号说明 余数符号规则
div div rd, rs1, rs2 0000001 100 计算 rs1 ÷ rs2,商存入 rd(向零取整) 有符号 -
divu divu rd, rs1, rs2 0000001 101 计算 rs1 ÷ rs2,商存入 rd(向零取整) 无符号 -
rem rem rd, rs1, rs2 0000001 110 计算 rs1 ÷ rs2,余数存入 rd 有符号 余数符号与被除数(rs1) 一致
remu remu rd, rs1, rs2 0000001 111 计算 rs1 ÷ rs2,余数存入 rd 无符号 余数为非负数

关键说明

  • 向零取整 :无论被除数 / 除数正负,商的小数部分直接舍弃(如 5 ÷ 2 = 2-5 ÷ 2 = -2);
  • 余数符号 :有符号取余(rem)的余数符号与被除数一致(如 rem x1, x2, x3,若 x2=-5、x3=2,则 x1=-1);无符号取余(remu)余数恒为正。

三、指令使用示例

通过具体汇编代码,说明 RV32M 指令的实际应用(基于 RV32IM 架构):

示例 1:32 位有符号乘法(完整 64 位结果)

计算 12345 × -6789(32 位有符号),获取低 32 位和高 32 位结果:

riscv

复制代码
# 寄存器初始化:x1=12345(0x3039),x2=-6789(0xFFFFE533)
li x1, 12345
li x2, -6789

# 乘法运算:x3=低32位,x4=高32位
mul  x3, x1, x2   # x3 = (12345 × -6789) & 0xFFFFFFFF
mulh x4, x1, x2   # x4 = (12345 × -6789) >> 32(有符号移位)

# 结果:12345 × -6789 = -83810205,64位表示为 0xFFFFFFFC7E6F75B,因此:
# x3 = 0x7E6F75B(低32位),x4 = 0xFFFFFFFF(高32位,有符号扩展)
示例 2:无符号除法与取余

计算 0x12345678 ÷ 0x100(无符号),获取商和余数:

riscv

复制代码
# 寄存器初始化:x1=0x12345678,x2=0x100
li x1, 0x12345678
li x2, 0x100

# 无符号除法+取余:x3=商,x4=余数
divu x3, x1, x2   # x3 = 0x12345678 ÷ 0x100 = 0x123456(商)
remu x4, x1, x2   # x4 = 0x12345678 % 0x100 = 0x78(余数)
示例 3:有符号除法与取余(余数符号与被除数一致)

计算 -10 ÷ 3(有符号),验证商和余数规则:

riscv

复制代码
# 寄存器初始化:x1=-10(0xFFFFFFF6),x2=3
li x1, -10
li x2, 3

# 有符号除法+取余:x3=商,x4=余数
div  x3, x1, x2   # x3 = -10 ÷ 3 = -3(向零取整)
rem  x4, x1, x2   # x4 = -10 % 3 = -1(余数符号与被除数x1一致)

四、RV32M 与 RV64M 的区别

RV32M 是 32 位架构的乘法 / 除法扩展,而 RV64M 是 64 位架构的扩展,核心区别在于:

  1. 操作数宽度:RV32M 操作 32 位整数,RV64M 操作 64 位整数;
  2. 乘法结果:RV32M 乘法结果为 64 位(拆分为两个 32 位寄存器),RV64M 乘法结果为 128 位(拆分为两个 64 位寄存器);
  3. 额外指令 :RV64M 新增mulw/divw/remw等指令,支持32 位运算结果符号扩展为 64 位,兼容 RV32M 的操作。

五、RV32M 实现注意事项

  1. 硬件开销 :乘法 / 除法单元是处理器中面积和功耗较大的模块,RV32M 支持流水线实现 (高吞吐率)或迭代实现(低面积),处理器可根据应用场景选择;
  2. 异常处理 :必须处理除数为 0 的异常,主流实现会触发illegal_instruction异常,由操作系统内核处理;
  3. 指令兼容性:RV32M 是 RV32I 的扩展,若处理器未实现 RV32M,执行 M 类指令会触发非法指令异常;
  4. 性能优化:乘法指令可与其他指令流水线并行执行,除法指令因迭代特性,延迟通常更高(3~10 个时钟周期)。

六、总结

RV32M 是 RISC-V RV32 架构的核心算术扩展 ,通过 10 条 R 型指令实现了 32 位有符号 / 无符号的乘法、除法、取余操作,解决了 RV32I 仅支持基础运算的局限。其设计遵循 RISC-V 的模块化、精简性原则:

  • 乘法指令拆分高低位结果,适配 32 位寄存器的限制;
  • 除法 / 取余指令明确向零取整和余数符号规则,保证跨平台兼容性;
  • 可选实现的特性,让处理器可在性能面积 / 功耗之间做权衡。

RV32M 广泛应用于嵌入式、物联网等 32 位 RISC-V 处理器中,是除 RV32I 外最常用的标准扩展。

相关推荐
Sumlll_11 小时前
Ubuntu系统下QEMU的安装与RISC-V的测试
linux·ubuntu·risc-v
早日退休!!!2 天前
ARM A核、ARM M核、X86与RISC-V架构:寄存器作用及上下文处理差异报告
arm开发·架构·risc-v
国科安芯5 天前
商业卫星多轴步进驱动系统的抗辐照MCU集成方案
运维·网络·单片机·嵌入式硬件·安全·安全威胁分析·risc-v
农民真快落6 天前
【操作系统】手撸xv6操作系统——types.h/param.h/memlayout.h/riscv.h/defs.h头文件解析
操作系统·risc-v·嵌入式软件·xv6
lkbhua莱克瓦247 天前
CPU三大核心部件功能详解
计算机·cpu·oc·ir·id
lkbhua莱克瓦247 天前
CPU中核心参数的通俗介绍
计算机·cpu
lkbhua莱克瓦247 天前
手机选购关注的参数-CPU篇
计算机·智能手机·cpu·oc·ir·id
HyperAI超神经7 天前
【TVM教程】TVM 运行时系统
人工智能·深度学习·学习·机器学习·cpu·gpu
lkbhua莱克瓦247 天前
CPU的架构与技术和实际性能指标
计算机·cpu