首页/指令库/向量按位与非
VANDN.VV

RISC-V VANDN.VV 指令详解

指令手册OP-V vector-vector form

向量按位 AND-NOT:vd[i] = vs2[i] & ~vs1[i]

指令语法

vandn.vv vd, vs2, vs1[, v0.t]

vd、vs2、vs1 选择向量寄存器 v0–v31;可选掩码写作 v0.t,省略时 vm=1,带掩码时 vm=0;没有立即数。

32 位 OP-V:funct6=000001,vm[25],vs2[24:20],vs1[19:15],funct3=000,vd[11:7],opcode=1010111。

支持 Zvbb 或 Zvkb;在当前 SEW 内,对活动元素计算 vd[i]=vs2[i]&~vs1[i]。SEW 取实现支持的宽度:Zve32x 提供 8/16/32,Zve64x 还提供 64;无 AES 元素组约束。

执行范围为 vstart≤i<vl,掩码关闭元素按 vma、尾部按 vta 处理;前置元素保持。掩码目的组不得与 v0 重叠,v0 也不能同时作为 SEW 数据源与 EEW=1 掩码;同宽源/目的可重叠并读取原源值。vstart≥vl(含 vl=0)时不更新目标;普通 agnostic 元素可保持或写全 1,不保证清零。

ZvbbZvkb向量位操作

指令编码

31..26
funct6=000001
25
vm
24..20
vs2
19..15
vs1
14..12
000
11..7
vd
6..0
1010111

VANDN.VV 使用 opcode 1010111(0x57)、funct3 000。32 位 OP-V:funct6=000001,vm[25],vs2[24:20],vs1[19:15],funct3=000,vd[11:7],opcode=1010111。

格式: OP-V OPIVV(funct6=000001,vm,vs2,vs1)
opcode: 1010111 (0x57)
funct3: 000 (0x0)

指令行为说明

vandn.vv 对每个活动元素计算 vd[i] = vs2[i] & ~vs1[i],结果宽度为当前 SEW。支持 Zvbb 或其子集 Zvkb;省略 v0.t 时不掩码,带 v0.t 时仅处理 v0.mask[i]=1 的活动元素。

快速理解与检索要点

向量按位 AND-NOT:vd[i] = vs2[i] & ~vs1[i]

vd[i] = vs2[i] & ~vs1[i];注意语法中 vs1 是被取反的第二源。
遵守 V 扩展的 vl、vstart、vtype 和可选 vm 掩码规则。

向量执行上下文

vd、vs2、vs1 选择向量寄存器 v0–v31;可选掩码写作 v0.t,省略时 vm=1,带掩码时 vm=0;没有立即数。

32 位 OP-V:funct6=000001,vm[25],vs2[24:20],vs1[19:15],funct3=000,vd[11:7],opcode=1010111。

支持 Zvbb 或 Zvkb;在当前 SEW 内,对活动元素计算 vd[i]=vs2[i]&~vs1[i]。SEW 取实现支持的宽度:Zve32x 提供 8/16/32,Zve64x 还提供 64;无 AES 元素组约束。

执行范围为 vstart≤i<vl,掩码关闭元素按 vma、尾部按 vta 处理;前置元素保持。掩码目的组不得与 v0 重叠,v0 也不能同时作为 SEW 数据源与 EEW=1 掩码;同宽源/目的可重叠并读取原源值。vstart≥vl(含 vl=0)时不更新目标;普通 agnostic 元素可保持或写全 1,不保证清零。

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

常见使用场景

加密与密码

Zvbb 或 Zvkb,SEW=8、vl=1、vstart=0,无掩码,vs2[0]=0xF0、vs1[0]=0xCC:0xF0 & ~0xCC = 0x30,写入 vd[0]。

向量化加速

Zvbb 或 Zvkb,SEW=8、vl=1、vstart=0,无掩码,vs2[0]=0xF0、vs1[0]=0xCC:0xF0 & ~0xCC = 0x30,写入 vd[0]。

使用前检查清单

语法检查
  • vd、vs2、vs1 选择向量寄存器 v0–v31;可选掩码写作 v0.t,省略时 vm=1,带掩码时 vm=0;没有立即数。
  • 32 位 OP-V:funct6=000001,vm[25],vs2[24:20],vs1[19:15],funct3=000,vd[11:7],opcode=1010111。
语义检查
  • 支持 Zvbb 或 Zvkb;在当前 SEW 内,对活动元素计算 vd[i]=vs2[i]&~vs1[i]。SEW 取实现支持的宽度:Zve32x 提供 8/16/32,Zve64x 还提供 64;无 AES 元素组约束。
  • 执行范围为 vstart≤i<vl,掩码关闭元素按 vma、尾部按 vta 处理;前置元素保持。掩码目的组不得与 v0 重叠,v0 也不能同时作为 SEW 数据源与 EEW=1 掩码;同宽源/目的可重叠并读取原源值。vstart≥vl(含 vl=0)时不更新目标;普通 agnostic 元素可保持或写全 1,不保证清零。

容易混淆 / 常见误区

语法中 vs1 是被取反的第二源;vs2 不取反。
支持实现可用的 SEW:Zve32x 提供 8/16/32,Zve64x 还提供 64;不是任意数值宽度。
掩码执行的 vd 寄存器组不能与 v0 重叠;否则编码保留。未活动与尾部元素遵守 vma/vta,不能一概视为清零或保持。

常见问题

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

可以带可选 v0.t;省略时 vm=1,使用时 vm=0。但掩码执行的 vd 寄存器组不得与 v0 重叠。

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

由 vtype.SEW 和实现支持决定:Zve32x 提供 8/16/32,Zve64x 还提供 64。该指令没有 AES 的 SEW=32 或 128 位元素组限制。