VDIV.VV

RISC-V VDIV.VV 指令详解

指令手册V-type

向量-向量有符号整数除法,把逐元素商写入 vd;除零不触发异常。

指令语法

vdiv.vv vd, vs2, vs1[, v0.t]
操作数说明
vd 与 vs2 是 SEW 位向量寄存器组;同 EEW 源/目标可重叠,同名源读取相同初值。
vs1 是同 lane 的 SEW 位向量除数,vs2 是被除数;没有立即数或反向标量除向量形式。
商向零舍入;除零返回全 1 位模式,不产生除零 trap。有符号最小负数/-1 返回被除数;无符号除法不会溢出。
要求 V、向量状态已启用且 vtype 受支持;活动元素满足 vstart≤i<vl 且(vm=1 或 v0[i]=1),VL=0 时目标完全不更新。省略 v0.t 表示 vm=1。inactive/tail 遵循 vma/vta;masked vd 不得覆盖 v0,v0 不能同时以 EEW=1 和 SEW 作为源读取。
V向量运算整数算术

指令行为说明

VDIV.VV 对活动元素执行 SEW 位有符号整数除法:vs2 是被除数,vs1 的同 lane 元素是除数,商向零舍入并写入 vd。除零返回全 1 位模式,不产生除零 trap。最小负数除以 -1 返回被除数。

VDIV.VV 指令解析与执行动画

从 OP-V 编码字段开始,展示 VDIV 如何逐元素计算有符号商,并按官方规则处理除零和有符号溢出特例。

输入的指令
vdiv.vv
执行环境

教学模型固定 LMUL=m1、vstart=0,只展示所选 VL 的 body 元素。固定 VLEN=4096,VLMAX=4096/16=256,只演示支持所选 SEW 的实现;同名向量源必须具有相同元素。普通掩码形式的 inactive 与 tail 元素按 vtype.vma/vta 处理,不在结果行中伪造确定值;VADC/VMADC/VSBC/VMSBC 则对所有 body 元素执行,v0 位仅作 carry/borrow-in。

OP-V encodingvdiv.vv
funct6
100001
vm
0
vs2
01000
vs1
01100
funct3
010
vd
00100
opcode
1010111
lane
0
1
2
3
4
5
6
7
v8
0x0064
0xffd6
0x8000
0x007f
0xffff
0x0001
0x0064
0xffd6
/
/
/
/
/
/
/
/
v12
0x0009
0x0000
0xffff
0xffff
0x0003
0x0001
0x0009
0x0000
v0.t
1
0
1
1
1
0
1
1
v4
...
-
...
...
...
-
...
...
当前步骤

显示 OP-V 32 位编码字段

vdiv.vv 使用 OP-V 编码。动画把固定字段、寄存器字段、vm 和 vs1 字段放在同一条编码带中。

动画只展示官方 V 扩展定义的 ISA 可见关系:OP-V 字段解析、活动元素读取、SEW 宽度整数有符号除法、mask 控制和 vd 写回;不模拟流水线、缓存或执行时延。

快速理解与检索要点

VDIV.VV 不产生除零异常。它在当前 vl 的活动元素上读取 vs2 作为被除数、读取vs1 同 lane 元素作为除数,写回 有符号商;vm=0 时只执行 v0.t 为 1 的 body 元素。

VDIV.VV 使用 OP-V 编码;.vv 形式由 funct3=010 选择,funct6=100001 选择 VDIV。
vs2 是被除数;除数来自vs1 同 lane 元素;每个 lane 独立计算,不跨 lane 组合。
源操作数按有符号二进制补码 SEW 整数解释,结果是商。
商向零舍入;整数除法不读取 frm 或 vxrm,也不设置浮点异常标志。
除数为 0 时,商结果按官方极端输入规则产生:无符号和有符号除法都写回全 1 位模式。
有符号最小负数除以 -1 的溢出特例:VDIV 写回被除数,VREM 写回 0。
vm=0 使用 v0.t 执行掩码;mask-off 与 tail 元素按当前 vtype 策略处理。

向量执行上下文

vd 与 vs2 是 SEW 位向量寄存器组;同 EEW 源/目标可重叠,同名源读取相同初值。

vs1 是同 lane 的 SEW 位向量除数,vs2 是被除数;没有立即数或反向标量除向量形式。

商向零舍入;除零返回全 1 位模式,不产生除零 trap。有符号最小负数/-1 返回被除数;无符号除法不会溢出。

要求 V、向量状态已启用且 vtype 受支持;活动元素满足 vstart≤i<vl 且(vm=1 或 v0[i]=1),VL=0 时目标完全不更新。省略 v0.t 表示 vm=1。inactive/tail 遵循 vma/vta;masked vd 不得覆盖 v0,v0 不能同时以 EEW=1 和 SEW 作为源读取。

The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture — Version 20260120, Chapter 31

常见使用场景

向量化整数缩放

假定 V/向量状态已启用、vstart=0、e32,m1 可用、VLMAX≥4 且 a0=4;示例未掩码,全部四个 body 元素执行。v2=[20,21,22,23],v3=[3,4,5,6],得到 v1=[6,5,4,3];商向零舍入。尾元素按 ta 处理,不假定清零。

批量求商

假定 V/向量状态已启用、vstart=0、e32,m1 可用、VLMAX≥4 且 a0=4;示例未掩码,全部四个 body 元素执行。v2=[20,21,22,23],v3=[3,4,5,6],得到 v1=[6,5,4,3];商向零舍入。尾元素按 ta 处理,不假定清零。

使用前检查清单

语法检查
  • vd 与 vs2 是 SEW 位向量寄存器组;同 EEW 源/目标可重叠,同名源读取相同初值。
  • vs1 是同 lane 的 SEW 位向量除数,vs2 是被除数;没有立即数或反向标量除向量形式。
语义检查
  • 商向零舍入;除零返回全 1 位模式,不产生除零 trap。有符号最小负数/-1 返回被除数;无符号除法不会溢出。
  • 要求 V、向量状态已启用且 vtype 受支持;活动元素满足 vstart≤i<vl 且(vm=1 或 v0[i]=1),VL=0 时目标完全不更新。省略 v0.t 表示 vm=1。inactive/tail 遵循 vma/vta;masked vd 不得覆盖 v0,v0 不能同时以 EEW=1 和 SEW 作为源读取。

容易混淆 / 常见误区

除数为 0 不会 trap;需要错误路径的软件必须显式检测除数。
有符号最小负数除以 -1 是官方定义的溢出特例:除法写回被除数,余数写回 0。
第二源来自 vs1 的同 lane 元素;没有标量除以向量的反向形式。

常见问题

VDIV.VV 除零会产生异常吗?

不会。官方 V 扩展为除零定义了确定结果:商写回全 1 位模式,指令本身不产生除零 trap。

VDIV.VV 和 VREM 的关系是什么?

VDIV.VV 写回商;配套的 VREM 形式写回同一除法关系下的余数。两者都使用相同的除零和有符号溢出特例规则。

VDIV.VV 的商如何舍入?

商向零舍入。例如 SEW=32 时,-21/4 得到 -5,而不是 -6。普通掩码形式仅对活动元素计算。