VOR.VX

RISC-V VOR.VX 指令详解

指令手册OPIVX (OP-V)

VOR.VX 对 RVV 活动元素执行 SEW 宽整数按位或。

指令语法

vor.vx vd, vs2, rs1[, v0.t]
操作数说明
语法:vor.vx vd, vs2, rs1[, v0.t];省略 v0.t 为 vm=1,给出为 vm=0。32 位 OP-V:opcode=1010111、funct3=100 (OPIVX)、funct6=001010。
vd/vs2 是 SEW/LMUL 向量组,rs1 是整数标量源。XLEN>SEW 取低 SEW 位,XLEN<SEW 符号扩展;x0 提供零,活动结果为 vs2[i] | scalar。
活动 body 为 vstart≤i<vl 且掩码开启;prestart 不变,inactive/tail 按 vma/vta,agnostic 可保留旧值或写全1。vstart≥vl(含 vl=0)不更新任何目标元素。
同宽源/目标允许重叠,组起点按 EMUL 对齐,EMUL≤8。masked vd 不可包含 v0;v0 用作 EEW=1 掩码时不可同时作 SEW 数据源。
要求 V 1.0、已启用向量状态和合法受支持 vtype/SEW;成功执行后 vstart 复位为0。动画按其声明的 m1/vstart=0 条件展示,不表示处理器周期。
V向量整数运算位操作

指令行为说明

VOR.VX 对活动元素计算 vd[i]=vs2[i] | scalar。标量来自 x[rs1]:XLEN>SEW 取低 SEW 位,XLEN<SEW 符号扩展;x0 提供零。省略 v0.t 为未掩码,给出时仅 v0.mask[i]=1 的 body 元素参与。

VOR.VX 指令解析与执行动画

从 OP-V 编码字段开始,展示 VOR 如何对活动元素执行 SEW 宽逐位 OR,并写回 vd。

输入的指令
vor.vx

要求 V 1.0、已启用向量状态及合法受支持 vtype/SEW。固定 LMUL=m1、vstart=0、VLEN=4096,VLMAX=4096/16=256。普通 masked vd 不可为 v0;同宽源/目标可重叠。XLEN>SEW 取标量低 SEW 位,XLEN<SEW 符号扩展,x0 提供零。v0 提供 EEW=1 掩码时不可同时作 SEW 数据源。VL=0 不更新任何目标元素;这里只展示 body,不伪造 inactive/tail 的确定值。步骤是教学分解,不是处理器周期。

执行环境
OP-V encodingvor.vx
funct6
001010
vm
0
vs2
01000
rs1
01011
funct3
100
vd
00100
opcode
1010111
lane
0
1
2
3
4
5
6
7
v8
0x00fa
0x010b
0x011c
0x012d
0x013e
0x014f
0x0160
0x0171
|
|
|
|
|
|
|
|
x11
0x0013
0x0013
0x0013
0x0013
0x0013
0x0013
0x0013
0x0013
v0.t
1
0
1
1
1
0
1
1
v4
...
-
...
...
...
-
...
...
当前步骤

显示 OP-V 32 位编码字段

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

动画展示 OP-V 字段解析、活动元素读取、SEW 宽度整数按位或、mask 控制和 vd 写回。步骤是教学分解,不表示流水线、缓存或执行时延。

快速理解与检索要点

VOR.VX 是 V 扩展单宽整数逻辑指令:在 vl 范围内,只对活动元素计算 vs2 | 第二源,结果保持 SEW 位并写入普通向量寄存器 vd。

32 位 OP-V:opcode=1010111、funct6=001010、funct3=100;rs1 是整数寄存器。
XLEN>SEW 取低 SEW 位,XLEN<SEW 符号扩展;活动结果为 vs2[i] | scalar。
活动 body 为 vstart≤i<vl 且 vm=1 或 v0.mask[i]=1;prestart 不变,inactive/tail 按 vma/vta;agnostic 可保留或写全1。
同宽源/目标可重叠;组起点按 EMUL 对齐,EMUL≤8。masked vd 不可包含 v0;v0 不可同时提供 EEW=1 掩码和 SEW 数据。
要求 V 1.0、已启用向量状态与合法受支持 vtype/SEW;vstart≥vl(含 vl=0)不更新任何目标元素。

向量执行上下文

语法:vor.vx vd, vs2, rs1[, v0.t];省略 v0.t 为 vm=1,给出为 vm=0。32 位 OP-V:opcode=1010111、funct3=100 (OPIVX)、funct6=001010。

vd/vs2 是 SEW/LMUL 向量组,rs1 是整数标量源。XLEN>SEW 取低 SEW 位,XLEN<SEW 符号扩展;x0 提供零,活动结果为 vs2[i] | scalar。

活动 body 为 vstart≤i<vl 且掩码开启;prestart 不变,inactive/tail 按 vma/vta,agnostic 可保留旧值或写全1。vstart≥vl(含 vl=0)不更新任何目标元素。

同宽源/目标允许重叠,组起点按 EMUL 对齐,EMUL≤8。masked vd 不可包含 v0;v0 用作 EEW=1 掩码时不可同时作 SEW 数据源。

要求 V 1.0、已启用向量状态和合法受支持 vtype/SEW;成功执行后 vstart 复位为0。动画按其声明的 m1/vstart=0 条件展示,不表示处理器周期。

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

常见使用场景

设置特定位、合并位字段或组合逐元素数据位模式

假定 V/VS 已启用、合法 m1、VLEN≥128、支持 SEW、vl=4、vstart=0、v0.mask[0..3]=1111,源已初始化。SEW=16, x11=0x8000, v8=[1,2,3,4] → v4=[32769,32770,32771,32772]。逐元素按位或,XLEN=32/64 均取标量低16位。vl=0 时不更新目标。

RVV 逐元素位操作

假定 V/VS 已启用、合法 m1、VLEN≥128、支持 SEW、vl=4、vstart=0、v0.mask[0..3]=1111,源已初始化。SEW=16, x11=0x8000, v8=[1,2,3,4] → v4=[32769,32770,32771,32772]。逐元素按位或,XLEN=32/64 均取标量低16位。vl=0 时不更新目标。

使用前检查清单

语法检查
  • 语法:vor.vx vd, vs2, rs1[, v0.t];省略 v0.t 为 vm=1,给出为 vm=0。32 位 OP-V:opcode=1010111、funct3=100 (OPIVX)、funct6=001010。
  • vd/vs2 是 SEW/LMUL 向量组,rs1 是整数标量源。XLEN>SEW 取低 SEW 位,XLEN<SEW 符号扩展;x0 提供零,活动结果为 vs2[i] | scalar。
语义检查
  • 活动 body 为 vstart≤i<vl 且掩码开启;prestart 不变,inactive/tail 按 vma/vta,agnostic 可保留旧值或写全1。vstart≥vl(含 vl=0)不更新任何目标元素。
  • 同宽源/目标允许重叠,组起点按 EMUL 对齐,EMUL≤8。masked vd 不可包含 v0;v0 用作 EEW=1 掩码时不可同时作 SEW 数据源。
  • 要求 V 1.0、已启用向量状态和合法受支持 vtype/SEW;成功执行后 vstart 复位为0。动画按其声明的 m1/vstart=0 条件展示,不表示处理器周期。

容易混淆 / 常见误区

VOR.VX 写普通 SEW 宽向量元素,结果不是每个元素一位的掩码。
VOR.VX 的 VI 近邻形式使用 -16..15 的 5 位有符号立即数;大常量通常应通过 .vx 形式来自整数寄存器。
mask-off 元素和尾部元素由当前 vtype 的 vma/vta 策略控制,不应假定固定清零或固定保持。

常见问题

VOR.VX 的标量怎样转成 SEW 位?

XLEN>SEW 取低 SEW 位;XLEN<SEW 符号扩展;x0 提供零,因此活动结果等于 vs2。

VOR.VX 会生成掩码或固定清零 inactive 元素吗?

不会生成掩码;它写普通 SEW 元素。inactive 按 vma、tail 按 vta;agnostic 可保留旧值或写全1,不能假定清零。