首页/指令库/VREDOR.VS
VREDOR.VS

RISC-V VREDOR.VS 指令详解

指令手册OPMVV (OP-V)

VREDOR.VS 使用 vs1[0] 初值对活动 vs2 元素执行按位或归约,结果只写入 vd[0]。

指令语法

vredor.vs vd, vs2, vs1, vm
操作数说明
语法:vredor.vs vd, vs2, vs1[, v0.t];省略掩码为 vm=1,给出 v0.t 为 vm=0。32 位 OP-V:opcode=1010111、funct3=010(OPMVV)、funct6=000010。
vs2 是 SEW/LMUL 向量组;vs1[0] 是 SEW 初值,vd[0] 是 SEW 结果。两种标量各占单个向量寄存器,不随 LMUL 成组。
vl>0 时初值始终参与,仅活动 vs2 元素参与归约;全部掩码关闭仍写初值。vl=0 不更新目标;非零 vstart 引发非法指令异常。vd[0] 外均为 tail,按 vta 处理。
vd 可与源或 v0 重叠;同名 vs2/vs1 必须从同一寄存器读取一致的元素0。v0 不能同时提供 EEW=1 掩码和 SEW 数据。源组起点按 EMUL 对齐,EMUL≤8。
要求 V 1.0、已启用向量状态和合法受支持 vtype/SEW。动画固定 m1、vstart=0、VLEN=4096;教学步骤不表示处理器周期。
V向量归约操作

指令行为说明

VREDOR.VS 是 RISC-V V 扩展的单宽整数归约指令。语法为 `vredor.vs vd, vs2, vs1, vm`;它以 vs1[0] 为初值,只让当前 vl 内且掩码选中的 vs2 元素参与按位或归约,并把最终 SEW 宽结果写入 vd[0]。若 vl=0,不执行操作且不更新目标寄存器。每一步对 SEW 位模式进行按位归约。

VREDOR.VS 指令解析与执行动画

从 OP-V 编码字段开始,展示 VREDOR 如何以 vs1[0] 为初值,只归约活动 vs2 元素,并把SEW 宽结果写入 vd[0]。

输入的指令
vredor.vs

要求 V 1.0、已启用向量状态及合法受支持 vtype/SEW。固定 LMUL=m1、vstart=0、VLEN=4096,VLMAX=4096/16=256。归约指令的 vstart 非零会触发非法指令异常,因此不提供该值作为可执行输入。归约只写单个 vd 的元素0,其余元素是 tail,按 vta 处理;vd 可与源或 v0 重叠。vs2=vs1 时 seed 必须等于 vs2[0]。v0 提供 EEW=1 掩码时不可同时作 SEW 数据源。VL=0 不更新任何目标元素;这里只展示 body,不伪造 inactive/tail 的确定值。步骤是教学分解,不是处理器周期。

执行环境
OP-V encodingvredor.vs
funct6
000010
vm
0
vs2
01000
vs1
01100
funct3
010
vd
00100
opcode
1010111
lane
0
1
2
3
4
5
6
7
acc
0x0003
0x0013
0x0013
0x001f
0x003f
0x007f
0x007f
0x007f
v8
0x0010
0x0003
0x000c
0x0021
0x0040
0x0005
0x0010
0x0003
acc|
acc|
acc|
acc|
acc|
acc|
acc|
acc|
v0.t
1
0
1
1
1
0
1
1
v4
...
tail
tail
tail
tail
tail
tail
tail
当前步骤

显示 OP-V 32 位编码字段

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

动画展示 OP-V 字段解析、活动元素读取、以 vs1[0] 为初值的整数按位或归约、mask 参与元素筛选和 vd[0] 写回。步骤是教学分解,不表示流水线、缓存或执行时延。

快速理解与检索要点

VREDOR.VS 是单宽整数归约指令,结果集中到目标向量寄存器的第 0 个元素。

32 位 OP-V:opcode=1010111、funct3=010(OPMVV);vredor.vs 的所有数据操作数和结果均为 SEW 位。
vs2 提供向量组;vs1[0] 提供初值,vd[0] 保存结果,两种标量各占单个向量寄存器,不随 LMUL 成组。
vl>0 时,初值始终参与,仅活动 vs2 元素参与归约;全部掩码关闭时仍将初值写到 vd[0]。vl=0 不更新任何目标元素。
vd[0] 之外的目标元素是 tail,按 vta 处理。vd 可与源或 v0 重叠;v0 提供 EEW=1 掩码时不可同时作 SEW 数据源。
要求已启用向量状态、合法受支持 vtype/SEW;vstart 非零引发非法指令异常。
按按位或规则组合 SEW 位模式。

向量执行上下文

语法:vredor.vs vd, vs2, vs1[, v0.t];省略掩码为 vm=1,给出 v0.t 为 vm=0。32 位 OP-V:opcode=1010111、funct3=010(OPMVV)、funct6=000010。

vs2 是 SEW/LMUL 向量组;vs1[0] 是 SEW 初值,vd[0] 是 SEW 结果。两种标量各占单个向量寄存器,不随 LMUL 成组。

vl>0 时初值始终参与,仅活动 vs2 元素参与归约;全部掩码关闭仍写初值。vl=0 不更新目标;非零 vstart 引发非法指令异常。vd[0] 外均为 tail,按 vta 处理。

vd 可与源或 v0 重叠;同名 vs2/vs1 必须从同一寄存器读取一致的元素0。v0 不能同时提供 EEW=1 掩码和 SEW 数据。源组起点按 EMUL 对齐,EMUL≤8。

要求 V 1.0、已启用向量状态和合法受支持 vtype/SEW。动画固定 m1、vstart=0、VLEN=4096;教学步骤不表示处理器周期。

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

常见使用场景

单宽按位或归约

假定 V/VS 已启用、合法 m1、支持 SEW、VLEN≥128、vl=4、vstart=0、v0.mask[0..3]=1111,源已初始化。SEW=8, v4[0]=3, v12=[16,3,12,33] → v8[0]=63。初值与活动源共同归约;其余目标元素按 vta 作 tail 处理。vl=0 不更新目标。

带初值的掩码归约

假定 V/VS 已启用、合法 m1、支持 SEW、VLEN≥128、vl=4、vstart=0、v0.mask[0..3]=1111,源已初始化。SEW=8, v4[0]=3, v12=[16,3,12,33] → v8[0]=63。初值与活动源共同归约;其余目标元素按 vta 作 tail 处理。vl=0 不更新目标。

使用前检查清单

语法检查
  • 语法:vredor.vs vd, vs2, vs1[, v0.t];省略掩码为 vm=1,给出 v0.t 为 vm=0。32 位 OP-V:opcode=1010111、funct3=010(OPMVV)、funct6=000010。
  • vs2 是 SEW/LMUL 向量组;vs1[0] 是 SEW 初值,vd[0] 是 SEW 结果。两种标量各占单个向量寄存器,不随 LMUL 成组。
语义检查
  • vl>0 时初值始终参与,仅活动 vs2 元素参与归约;全部掩码关闭仍写初值。vl=0 不更新目标;非零 vstart 引发非法指令异常。vd[0] 外均为 tail,按 vta 处理。
  • vd 可与源或 v0 重叠;同名 vs2/vs1 必须从同一寄存器读取一致的元素0。v0 不能同时提供 EEW=1 掩码和 SEW 数据。源组起点按 EMUL 对齐,EMUL≤8。
  • 要求 V 1.0、已启用向量状态和合法受支持 vtype/SEW。动画固定 m1、vstart=0、VLEN=4096;教学步骤不表示处理器周期。

容易混淆 / 常见误区

vs1[0] 是归约初值;不要把整个 vs1 当作逐元素第二源。
只有 vd[0] 保存归约结果;其它目标元素不是逐 lane 输出。
v0.t 掩码关闭的 vs2 元素不参与归约,但初值 vs1[0] 仍是归约起点。
归约不是普通逐元素 ALU 指令;不能把结果理解为广播到所有元素。
不要把整数归约当作可从任意 vstart 元素继续的逐元素操作;官方要求 vstart=0。

常见问题

VREDOR.VS 会把结果写到每个 vd 元素吗?

不会。有效归约结果只写入 vd[0],不是逐元素输出,也不是广播结果。

VREDOR.VS 中 vs1 的作用是什么?

vs1[0] 提供归约初值;整条 vs1 向量不是与 vs2 同 lane 配对的第二输入。

VREDOR.VS 全部掩码关闭和 vl=0 有何不同?

vl>0 且全部 vs2 元素被掩码关闭时,仍把 vs1[0] 初值写到 vd[0];vl=0 则完全不更新目标寄存器。