C.MUL

RISC-V C.MUL 指令详解

指令手册C-type

Zcb 的 16 位乘法:对两个有符号 XLEN 操作数相乘,并写回乘积低 XLEN 位。

指令语法

c.mul rsd', rs2'
操作数说明
RV32/RV64 Zcb,依赖 Zca;16位 CA 格式,另需 M 或 Zmmul。
rd'/rs1' 和 rs2' 的3位字段选择 x8–x15;目的也是第一源。
没有立即数;计算有符号乘积,仅写低 XLEN 位,不保留高位。
重叠源读取相同的写回前值;x0 不在可编码寄存器子集内。
Zcb压缩指令

指令行为说明

C.MUL(Zcb,CA 格式)将 rsd' 与 rs2' 作为有符号 XLEN 值相乘,并把乘积低 XLEN 位写回 rsd'。两个压缩寄存器都限于 x8-x15;Zcb 依赖 Zca,且还必须配置 M 或 Zmmul。

C.MUL 指令解析与执行动画

仅显示 ISA 可见的 16 位编码、操作数和状态,不表示流水线、缓存或时序。

c.mul,
执行环境
x10 <- 0xFFFFFFFD * 0x00000007 = 0xFFFFFFEB
16 位编码字段
15..10
funct6
100111
9..7
rd'/rs1'
010
6..5
funct2
10
4..2
rs2'
011
1..0
op
01
执行数据路径
压缩操作数映射
rd'/rs1'=010 -> x(8+2)=x10, rs2'=011 -> x(8+3)=x11; 读取写回前值
具体计算
在“计算”阶段显示当前输入的等式。
架构可见结果

继续到“提交结果”以显示架构状态。

快速理解与检索要点

C.MUL 的两个 CA 压缩寄存器字段映射到 x8-x15;结果只保留有符号乘积的低 XLEN 位。

C.MUL 不带立即数;rsd' 是读写操作数,rs2' 是第二个源操作数。
本指令只有在 Zcb 与 M 或 Zmmul 均可用时才定义。

常见使用场景

压缩与代码优化

RV32 Zcb+Zca+M/Zmmul,x10=-3、x11=7:c.mul x10, x11 写 x10=0xffffffeb(-21 的低32位)。

使用前检查清单

语法检查
  • RV32/RV64 Zcb,依赖 Zca;16位 CA 格式,另需 M 或 Zmmul。
  • rd'/rs1' 和 rs2' 的3位字段选择 x8–x15;目的也是第一源。
语义检查
  • 没有立即数;计算有符号乘积,仅写低 XLEN 位,不保留高位。
  • 重叠源读取相同的写回前值;x0 不在可编码寄存器子集内。

容易混淆 / 常见误区

需要M或Zmmul支持
rd'和rs2'仅限x8-x15
仅取乘积低XLEN位(截断)

常见问题

C.MUL 需要哪些扩展?

Zcb 依赖 Zca,C.MUL 另需 M 或 Zmmul;支持 RV32/RV64。

乘积会保留高位吗?

不保留,只写低 XLEN 位;rsd' 同时是源和目的,两个寄存器限 x8–x15。