首页/指令库/VGHSH.VV
VGHSH.VV

RISC-V VGHSH.VV 指令详解

指令手册OP-VE OPMVV (funct6=101100, vm=1, funct3=010)

向量 GHASH 加乘:用 vs1 密文组和 vs2 哈希子密钥更新 vd 中的部分哈希。

指令语法

vghsh.vv vd, vs2, vs1

语法 vghsh.vv vd, vs2, vs1;向量寄存器选择 v0–v31。vd 同时提供输入;固定 vm=1,不可掩码。没有立即数。

32 位 OP-VE:funct6=101100,固定 vm=1[25],vs2[24:20],vs1[19:15],funct3=010,vd[11:7],opcode=1110111。

Zvkg 依赖 Zve32x;SEW=32、EGW=128、EGS=4,其它 SEW 保留。vd 的原 Y 与 vs1 的 X 异或后再乘 vs2 的 H;按 x^128+x^7+x^2+x+1 约简,输入和输出按每字节位反转衔接 GHASH 位序。执行延迟必须与数据无关。

vl 和 vstart 必须为 4 的整数倍,否则编码保留。LMUL*VLEN<128 即使 vl=0 也引发非法指令异常。启用向量状态,使用合法受支持的 vtype;同宽源/目的允许重叠,读取原始源值,同名输入值须一致;LMUL>1 的组须对齐。

仅处理 body 内活动元素,prestart 保持,inactive/tail 遵守 vma/vta。vstart≥vl(含 vl=0)不更新任何目标元素;成功执行清零 vstart。实现可拒绝不支持的非零 vstart。

Zvkg向量密码GCM/GHASH

指令行为说明

vghsh.vv 在 SEW=32 的 128 位 element group 上执行 GHASH add-multiply。它从 vd 读取部分哈希 Y_i,从 vs1 读取密文 X_i,从 vs2 读取哈希子密钥 H,并把更新后的 Y_(i+1) 写回 vd。

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

此有界模型展示一个 128 位 element group 的 ISA 可见状态;不表示流水线、密码协议或未指定的实现细节。

执行环境:启用 Zvkg 与向量状态,合法支持的 vtype;LMUL=1,正常分支 VLEN≥256,仅展开组 0(最低 128 位,元素 0 在低 32 位)。容量不足分支表示 LMUL*VLEN<128。非零 vstart 假设实现支持。

有界执行环境
32 位 OP-VE 编码字段
31..26
funct6
101100
25
vm
1
24..20
vs2
01000
19..15
vs1
01100
14..12
funct3
010
11..7
vd
00100
6..0
OP-VE
1110111
执行数据路径

funct6=101100, funct3=010, Zvkg

v4[0..3] <- pending

快速理解与检索要点

读取 vd 中的原值与 vs1 做 XOR 后,再与 vs2 做 GHASH 域乘法。

在 SEW=32、128 位 element group 上执行 GHASH 的 ((Y_i XOR X_i) · H) 更新。
该 element-group 密码指令没有 vm 掩码操作数,按 element group 粒度执行。
SEW=32,EGW=128,EGS=4;vl 和 vstart 必须是 4 的倍数,且 LMUL*VLEN 必须容纳至少一个 element group。
域乘法按 x^128+x^7+x^2+x+1 约简;输入与输出均按每字节位反转衔接 GHASH 位序。
LMUL*VLEN<128 即使 vl=0 也触发非法指令异常。vl=0 或受支持的 vstart≥vl 不更新任何目标元素;成功执行后 vstart 清零。

向量执行上下文

语法 vghsh.vv vd, vs2, vs1;向量寄存器选择 v0–v31。vd 同时提供输入;固定 vm=1,不可掩码。没有立即数。

32 位 OP-VE:funct6=101100,固定 vm=1[25],vs2[24:20],vs1[19:15],funct3=010,vd[11:7],opcode=1110111。

Zvkg 依赖 Zve32x;SEW=32、EGW=128、EGS=4,其它 SEW 保留。vd 的原 Y 与 vs1 的 X 异或后再乘 vs2 的 H;按 x^128+x^7+x^2+x+1 约简,输入和输出按每字节位反转衔接 GHASH 位序。执行延迟必须与数据无关。

vl 和 vstart 必须为 4 的整数倍,否则编码保留。LMUL*VLEN<128 即使 vl=0 也引发非法指令异常。启用向量状态,使用合法受支持的 vtype;同宽源/目的允许重叠,读取原始源值,同名输入值须一致;LMUL>1 的组须对齐。

仅处理 body 内活动元素,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=4, v4=0x0, v8=0x80, v12=0x80: v4=0x80。示例只给出活动组/元素,尾部按 tu 保持。成功后 vstart=0。

向量化加速

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

使用前检查清单

语法检查
  • 语法 vghsh.vv vd, vs2, vs1;向量寄存器选择 v0–v31。vd 同时提供输入;固定 vm=1,不可掩码。没有立即数。
  • 32 位 OP-VE:funct6=101100,固定 vm=1[25],vs2[24:20],vs1[19:15],funct3=010,vd[11:7],opcode=1110111。
语义检查
  • Zvkg 依赖 Zve32x;SEW=32、EGW=128、EGS=4,其它 SEW 保留。vd 的原 Y 与 vs1 的 X 异或后再乘 vs2 的 H;按 x^128+x^7+x^2+x+1 约简,输入和输出按每字节位反转衔接 GHASH 位序。执行延迟必须与数据无关。
  • vl 和 vstart 必须为 4 的整数倍,否则编码保留。LMUL*VLEN<128 即使 vl=0 也引发非法指令异常。启用向量状态,使用合法受支持的 vtype;同宽源/目的允许重叠,读取原始源值,同名输入值须一致;LMUL>1 的组须对齐。
  • 仅处理 body 内活动元素,prestart 保持,inactive/tail 遵守 vma/vta。vstart≥vl(含 vl=0)不更新任何目标元素;成功执行清零 vstart。实现可拒绝不支持的非零 vstart。

容易混淆 / 常见误区

没有 vm 操作数;该 element-group crypto 指令不可掩码执行。
要求 SEW=32、EGW=128,并以 128 位组为粒度操作。
GHASH 使用 GF(2^128) 上的特定多项式运算,不是普通整数算术。
SEW=32、EGW=128、EGS=4;vl 和 vstart 必须是 4 的整数倍,且 LMUL*VLEN 至少为 128。

常见问题

VGHSH.VV 是否总能带 v0.t 掩码?

不能。该类 element-group 密码指令没有 vm 操作数;不要把普通 RVV 掩码语法套到页面示例中。

VGHSH.VV 的元素宽度由什么决定?

SEW 必须为 32,EGW=128、EGS=4;其它 SEW 编码保留。