VROR.VI

RISC-V VROR.VI 指令详解

指令手册Vector OP-V (OPIVI)

向量循环右移(立即数移位量),每个 vs2 元素按低 log2(SEW) 位移位量轮转。

指令语法

vror.vi vd, vs2, uimm[, v0.t]

语法 vror.vi vd, vs2, uimm[, v0.t];向量寄存器选择 v0–v31。uimm 是 0–63 的 6 位无符号立即数。省略 v0.t 为 vm=1,带 v0.t 为 vm=0。

32 位 OP-V:funct5=01010[31:27],i5=uimm[5][26],vm[25],vs2[24:20],uimm[4:0][19:15],funct3=011,vd[11:7],opcode=1010111。

支持 Zvbb 或 Zvkb,依赖 Zve32x,支持 SEW=8/16/32;64 另需 Zve64x。每个活动 vs2 元素按uimm低 log2(SEW) 位循环右移,结果仍为 SEW 位。

启用向量状态、使用合法受支持 vtype;同宽源/目的可重叠并读取原值,同名源输入值须一致。LMUL>1 的组须对齐。vm=0 时 vd 不得与 v0 重叠,v0 不能同时作为 SEW 数据源与 EEW=1 掩码。

启用向量状态并使用合法受支持 vtype。prestart 保持,inactive/tail 遵守 vma/vta;vstart≥vl(含 vl=0)不更新任何目标元素。成功执行将 vstart 清零;非零 vstart 假定实现支持,否则允许非法指令异常。

ZvbbZvkb向量位操作

指令行为说明

VROR.VI 是 Zvbb 或 Zvkb 向量循环右移指令。每个活动元素从 vs2 取数据,按 uimm 给出的移位量进行位轮转;只使用移位量的低 log2(SEW) 位,其他位忽略。

VROR.VI 指令解析与执行动画

此有界模型只展示 lane 0 的 ISA 可见状态;不表示流水线、密码协议或未指定的非活跃/尾部值。

执行环境:启用本页扩展与向量状态,合法支持的 vtype,LMUL=1、VLEN≥64×SEW,仅展开 lane 0;vl=32/64 不复制 lane 0 到其他元素。SEW=64 要求 Zve64x。非零 vstart 假设实现支持,否则可产生非法指令异常。

有界执行环境
32 位 OP-V 编码字段
31..27
funct5
01010
26
i5
0
25
vm
1
24..20
vs2
01000
19..15
uimm[4:0]
01011
14..12
OPIVI
011
11..7
vd
00100
6..0
OP-V
1010111
执行数据路径

funct5=01010, i5=0, funct3=011, Zvbb/Zvkb

v4[0] <- pending

快速理解与检索要点

VROR.VI 对每个活动元素执行 Zvbb/Zvkb 循环右移;立即数操作数只提供移位量,数据来自 vs2。

支持 Zvbb 或 Zvkb;Zve32x 提供 SEW=8/16/32,SEW=64 还需 Zve64x。
uimm 是 0–63 的 6 位无符号立即数;bit5 编入 inst[26],只使用低 log2(SEW) 位。
省略 v0.t 为 vm=1;带 v0.t 为 vm=0,按 v0.mask[i] 选择活动元素。
prestart 保持;inactive/tail 遵守 vma/vta。vstart≥vl(含 vl=0)不更新任何目标元素,成功后清零 vstart。

向量执行上下文

语法 vror.vi vd, vs2, uimm[, v0.t];向量寄存器选择 v0–v31。uimm 是 0–63 的 6 位无符号立即数。省略 v0.t 为 vm=1,带 v0.t 为 vm=0。

32 位 OP-V:funct5=01010[31:27],i5=uimm[5][26],vm[25],vs2[24:20],uimm[4:0][19:15],funct3=011,vd[11:7],opcode=1010111。

支持 Zvbb 或 Zvkb,依赖 Zve32x,支持 SEW=8/16/32;64 另需 Zve64x。每个活动 vs2 元素按uimm低 log2(SEW) 位循环右移,结果仍为 SEW 位。

启用向量状态、使用合法受支持 vtype;同宽源/目的可重叠并读取原值,同名源输入值须一致。LMUL>1 的组须对齐。vm=0 时 vd 不得与 v0 重叠,v0 不能同时作为 SEW 数据源与 EEW=1 掩码。

启用向量状态并使用合法受支持 vtype。prestart 保持,inactive/tail 遵守 vma/vta;vstart≥vl(含 vl=0)不更新任何目标元素。成功执行将 vstart 清零;非零 vstart 假定实现支持,否则允许非法指令异常。

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

常见使用场景

加密与密码

启用本页扩展与向量状态,合法受支持 vtype、LMUL=1、VLEN=256、vstart=0、无掩码;SEW=32, vl=1, v8[0]=0x12345678, uimm=4: v4[0]=0x81234567。只列活动元素/组,尾部按 tu 保持;成功后 vstart=0。

向量化加速

启用本页扩展与向量状态,合法受支持 vtype、LMUL=1、VLEN=256、vstart=0、无掩码;SEW=32, vl=1, v8[0]=0x12345678, uimm=4: v4[0]=0x81234567。只列活动元素/组,尾部按 tu 保持;成功后 vstart=0。

使用前检查清单

语法检查
  • 语法 vror.vi vd, vs2, uimm[, v0.t];向量寄存器选择 v0–v31。uimm 是 0–63 的 6 位无符号立即数。省略 v0.t 为 vm=1,带 v0.t 为 vm=0。
  • 32 位 OP-V:funct5=01010[31:27],i5=uimm[5][26],vm[25],vs2[24:20],uimm[4:0][19:15],funct3=011,vd[11:7],opcode=1010111。
语义检查
  • 支持 Zvbb 或 Zvkb,依赖 Zve32x,支持 SEW=8/16/32;64 另需 Zve64x。每个活动 vs2 元素按uimm低 log2(SEW) 位循环右移,结果仍为 SEW 位。
  • 启用向量状态、使用合法受支持 vtype;同宽源/目的可重叠并读取原值,同名源输入值须一致。LMUL>1 的组须对齐。vm=0 时 vd 不得与 v0 重叠,v0 不能同时作为 SEW 数据源与 EEW=1 掩码。
  • 启用向量状态并使用合法受支持 vtype。prestart 保持,inactive/tail 遵守 vma/vta;vstart≥vl(含 vl=0)不更新任何目标元素。成功执行将 vstart 清零;非零 vstart 假定实现支持,否则允许非法指令异常。

容易混淆 / 常见误区

这是循环右移,移出的位从另一端进入,不等同于普通逻辑移位。
移位量按 SEW 宽度截断;不要把高位当作额外移位控制。
遵守 V 扩展的 vl、vstart、vtype 和可选 vm 掩码规则。

常见问题

VROR.VI 会改变元素宽度吗?

不会。结果元素宽度仍为当前 SEW。

VROR.VI 和 VWSLL 有什么区别?

循环移位不丢位且不拓宽;VWSLL 是拓宽逻辑左移,输出为 2*SEW。