首页/指令库/字乘法
MULW

RISC-V MULW 指令详解

指令手册R-type

将rs1和rs2的低32位相乘,结果低32位符号扩展至64位写入rd

指令语法

mulw rd, rs1, rs2
操作数说明
目标寄存器 rd:存放运算结果的通用寄存器。
源寄存器 rs1:第一个操作数寄存器。
源寄存器 rs2:第二个操作数寄存器。
M算术运算乘法

扩展条件:仅 RV64,需 M 或 Zmmul 扩展。

指令行为说明

MULW是RV64专用的乘法指令,将rs1的低32位与rs2的低32位相乘,取结果的低32位符号扩展至64位后写入rd。该指令定义于RV64M,也包含在RV64的Zmmul中。

MULW 指令解析与执行动画

从机器码字段解析开始,依次展示操作数读取、该指令专属语义计算和 ISA 可见状态更新。

rd
rs1
rs2
mulw
,
,
执行环境

本例使用固定寄存器初值和初始 PC=0x2000;取指成功,没有异步中断或额外扩展检查。异常分支只显示普通提交停止,陷入后的 PC 和处理程序状态由 EEI 决定。

a6(x16)
0xFFFFFFFFFFFFFFF0
t2(x7)
0x0000000000000007
31..25
24..20
19..15
14..12
11..7
6..0
0000001
funct7
00111
rs2
10000
rs1
000
funct3
00101
rd
0111011
opcode
执行数据路径
instruction
0x027802BB
opcode
0111011 -> OP-32
funct3
000 -> MULW
funct7
0000001 -> integer multiply selector
rd / rs1 / rs2
t0(x5) / a6(x16)=0xFFFFFFF0 (4294967280) / t2(x7)=0x00000007 (7)
32-bit multiply
尚未计算
x5
t0(x5) = 0x0000000000003001; pc = 0x0000000000002000
当前步骤

概念步骤:拿到 32-bit 指令编码

机器码按当前指令格式切成字段,动画从 encoding/decode 开始。

encoding: 0x027802BB
syntax : mulw t0(x5), a6(x16), t2(x7)
待提交结果: 尚未计算
当前架构状态
t0(x5) = 0x0000000000003001; pc = 0x0000000000002000

该动画展示 ISA 可见的解码和状态变化,不表示任何特定 CPU 的流水线、缓存、预测或时序实现。

快速理解与检索要点

rd、rs1、rs2 为三个 5 位通用寄存器字段,没有立即数;单条指令允许目的与源重叠,使用写回前的源值。
M 与 Zmmul 中的编码相同;M 包含 Zmmul。MULW 仅适用于 RV64。

常见使用场景

RV64低32位整数乘法

结合 «mulw a0, a1, a2 # a0 = sign-extend((a1[31:0] * a2[31:0])[31:0])» 等实际代码理解该场景。

使用前检查清单

语法检查
  • rd、rs1、rs2 是三个 x0–x31 寄存器字段(可用 ABI 别名),没有 rs3 或立即数。
  • 需要 M 或 Zmmul;MULW 仅适用于 RV64,其他四条适用于 RV32/RV64。
语义检查
  • 将rs1和rs2的低32位相乘,结果低32位符号扩展至64位写入rd
  • rd 与源重叠时先读取旧源值;rd=x0 丢弃写回。配对高半指令与 MUL 时使用相同源顺序,并让高半目的与两源不同。

容易混淆 / 常见误区

只使用两个源寄存器的低 32 位;结果低 32 位的 bit 31 决定写回高 32 位。
如需两个 32 位数的完整 64 位乘积,可在 RV64 使用 MUL;有符号源须正确符号扩展,无符号源须高 32 位为零。

常见问题

rd 可以与源寄存器相同或为 x0 吗?

允许:读取旧源值,x0 写回丢弃。需要两半时,推荐先 MULH/MULHSU/MULHU 再 MUL,源顺序相同且高半目的不同于任一源。这是配对序列条件,不是单条乘法的合法性限制。