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

RISC-V VREDMAX.VS 指令详解

指令手册OPMVV (OP-V)

VREDMAX.VS 在 vl>0 时以 vs1[0] 为初值归约活动 vs2 元素的有符号最大值,只把结果写入 vd[0]。

指令语法

vredmax.vs vd, vs2, vs1[, v0.t]
操作数说明
语法:vredmax.vs vd, vs2, vs1[, v0.t];省略 v0.t 为 vm=1,给出为 vm=0。32 位 OP-V:opcode=1010111、funct3=010 (OPMVV)、funct6=000111。
vs2 是 SEW/LMUL 源向量组;vs1[0] 是 SEW 宽初值,vd[0] 是 SEW 宽结果,标量各在单个向量寄存器中,独立于 LMUL。
vl>0 时总是包含 vs1[0],只归约活动 vs2 元素;全部 mask-off 仍将初值写入 vd[0]。其余目标元素是 tail,按 vta 保留或作 agnostic;vl=0 整个 vd 不更新。vstart 非零触发非法指令异常。
vd 可与源和 v0 重叠;同名 vs2/vs1 必须从同一寄存器读取一致的元素0。v0 用作 EEW=1 掩码时不可同时作 SEW 数据源。源组起点按 EMUL 对齐,EMUL≤8。
要求 V 1.0、已启用向量状态和合法受支持 vtype/SEW;成功执行后 vstart 复位为0。动画按其声明的 m1/vstart=0 条件展示,不表示处理器周期。
V向量归约操作

指令行为说明

VREDMAX.VS 是 V 1.0 单宽整数有符号最大值归约指令。vl>0 且 vstart=0 时,vs1[0] 始终参与,vs2 的活动元素按 max 归约,SEW 宽结果写入单个目标寄存器的 vd[0]。其他目标元素为 tail;vl=0 不更新 vd。

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

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

输入的指令
vredmax.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 encodingvredmax.vs
funct6
000111
vm
0
vs2
01000
vs1
01100
funct3
010
vd
00100
opcode
1010111
lane
0
1
2
3
4
5
6
7
acc
0x0004
0x0004
0x0004
0x0011
0x0011
0x0011
0x0011
0x0011
v8
0x0004
0xfffd
0x0011
0xfff0
0x0007
0x0020
0x0004
0xfffd
max
max
max
max
max
max
max
max
v0.t
1
0
1
1
1
0
1
1
v4
...
tail
tail
tail
tail
tail
tail
tail
当前步骤

显示 OP-V 32 位编码字段

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

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

快速理解与检索要点

VREDMAX.VS 在 vl>0 时以 vs1[0] 为初值归约活动 vs2 元素的有符号最大值,只把结果写入 vd[0]。

32 位 OP-V OPMVV:opcode=1010111、funct3=010、funct6=000111;vs2 是源向量组,vs1[0]/vd[0] 是单寄存器标量。
所有操作数和结果均为 SEW 位;执行有符号最大值归约。vs1[0] 不受掩码限制,只有活动 vs2 元素参与。比较按二进制补码有符号整数解释。
vl>0 时结果只写入 vd[0],其余目标元素按 vta 作为 tail 处理;即使所有 vs2 元素被掩码关闭,也写入初值。
vl=0 不执行操作且整个 vd 不更新;vstart≠0 触发非法指令异常。
vd 可与源及 v0 重叠;源组按 LMUL 对齐,同名 vs2/vs1 的 seed 必须等于 vs2[0]。v0 作为 EEW=1 掩码时不可同时作 SEW 源。要求 V 1.0、已启用向量状态及合法受支持 vtype。

向量执行上下文

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

vs2 是 SEW/LMUL 源向量组;vs1[0] 是 SEW 宽初值,vd[0] 是 SEW 宽结果,标量各在单个向量寄存器中,独立于 LMUL。

vl>0 时总是包含 vs1[0],只归约活动 vs2 元素;全部 mask-off 仍将初值写入 vd[0]。其余目标元素是 tail,按 vta 保留或作 agnostic;vl=0 整个 vd 不更新。vstart 非零触发非法指令异常。

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

要求 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=8, v4[0]=254 (-2), v12=[1,128,2,3] → v8[0]=3。先纳入初值,再归约所有活动源元素;其余目标元素按 vta 作为 tail 处理。vl=0 时不更新目标。

使用前检查清单

语法检查
  • 语法:vredmax.vs vd, vs2, vs1[, v0.t];省略 v0.t 为 vm=1,给出为 vm=0。32 位 OP-V:opcode=1010111、funct3=010 (OPMVV)、funct6=000111。
  • vs2 是 SEW/LMUL 源向量组;vs1[0] 是 SEW 宽初值,vd[0] 是 SEW 宽结果,标量各在单个向量寄存器中,独立于 LMUL。
语义检查
  • vl>0 时总是包含 vs1[0],只归约活动 vs2 元素;全部 mask-off 仍将初值写入 vd[0]。其余目标元素是 tail,按 vta 保留或作 agnostic;vl=0 整个 vd 不更新。vstart 非零触发非法指令异常。
  • vd 可与源和 v0 重叠;同名 vs2/vs1 必须从同一寄存器读取一致的元素0。v0 用作 EEW=1 掩码时不可同时作 SEW 数据源。源组起点按 EMUL 对齐,EMUL≤8。
  • 要求 V 1.0、已启用向量状态和合法受支持 vtype/SEW;成功执行后 vstart 复位为0。动画按其声明的 m1/vstart=0 条件展示,不表示处理器周期。

容易混淆 / 常见误区

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

常见问题

VREDMAX.VS 的初值和结果在哪里?

初值为 vs1[0];vl>0 时 SEW 宽结果只写入单个寄存器的 vd[0],其余元素为 tail,按 vta 处理。

VREDMAX.VS 在全部 mask-off 与 vl=0 时相同吗?

不同。vl>0 时即使全部 vs2 元素 mask-off,也把初值写入 vd[0];vl=0 时整个 vd 不更新。vstart 非零触发非法指令异常。