首页/指令库/VMORN-MM
VMORN.MM

RISC-V VMORN.MM 指令详解

指令手册V-type

向量掩码 OR-NOT:vd.mask[i] = vs2.mask[i] | ~vs1.mask[i]

指令语法

vmorn.mm vd, vs2, vs1
操作数说明
vd:目标 mask register,接收逐元素 1 bit 布尔结果。
vs2:第一个源 mask register;元素 i 提供 vs2.mask[i]。
vs1:第二个源 mask register;元素 i 提供 vs1.mask[i]。`.mm` mask logical 指令总是 unmasked,不由 v0.t 控制;vd 可为任意 mask register,只有结果写到或搬到 v0 后,后续普通 masked vector 指令才通过 v0.t 消费。
V向量运算掩码逻辑

指令行为说明

VMORN.MM 是 RVV 的 向量掩码或非 指令。`.mm` 表示源和目的都是 mask register 操作数;每个 mask 元素只有 1 bit,并按元素索引计算 vd.mask[i] = vs2.mask[i] | ~vs1.mask[i]。该类指令总是 unmasked,vm=0 编码保留;尾部元素按 tail-agnostic 策略更新。

VMORN.MM 指令解析与执行动画

从 V 扩展编码字段开始,展示 OR-NOT mask 逻辑的字段解析、mask bit 读取、逐 lane 运算和 vd 写回。

vd
vs2
vs1
vmorn.mm
,
,
执行环境
V-format mask logical encoding
31..26
25
24..20
19..15
14..12
11..7
6..0
lane
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
v8
1
0
1
1
0
1
0
0
1
0
1
1
0
1
0
0
OR-NOT
|~
|~
|~
|~
|~
|~
|~
|~
|~
|~
|~
|~
|~
|~
|~
|~
v16
1
1
0
0
1
1
0
0
1
1
0
0
1
1
0
0
v0
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-

本动画只模拟 vd.mask[i] = vs2.mask[i] | ~vs1.mask[i] 的 ISA 语义关系:读取两个 mask register 的 predicate bits,逐 lane 计算 OR-NOT,再写入目标 mask register。

快速理解与检索要点

VMORN.MM 对两个 RVV mask register 做逐 bit OR-NOT,语义是 vd.mask[i] = vs2.mask[i] | ~vs1.mask[i]。注意取反的是汇编语法中的第三个操作数 vs1;结果仍是 one-bit-per-element predicate mask。

操作数语义:vd 可为任意 mask register 并接收结果 mask;vs2 和 vs1 提供两个源 mask。元素 i 的布尔公式是 vd.mask[i] = vs2.mask[i] | ~vs1.mask[i]。
mask register 是按元素索引排列的一位谓词值,不是 SEW 宽的数据元素;改变 SEW 会改变普通数据元素解释,但不会把一个 mask 元素变成 SEW 位。
掩码逻辑指令总是 unmasked;它们不使用 v0.t 来限制本条指令执行,且 vm=0 编码保留。vd 可为任意 mask register;只有结果写到或搬到 v0 后,后续普通 masked vector 指令才通过 v0.t 消费。
用来保留 vs2 为真的 lane,并加入 vs1 为假的 lane;取反对象是第三个操作数 vs1,而不是整个 OR 结果。C 语义类比:maskC = (a > 0) || !(b < 10),先生成两个比较 mask,再用 VMORN.MM 组合。
典型 workflow:先用 vmsgt/vmslt/vmseq 等比较指令生成 predicate masks,再用 VMORN.MM 做 OR-NOT 组合,最后在组合结果位于 v0 时,让后续支持掩码的向量指令通过 v0.t 消费该 mask。

向量执行上下文

阅读 VMORN.MM 时,重点是 mask register 上的逐 bit 谓词组合。.mm:源和目的都是 mask register,逐元素处理 1 bit 谓词值。

mask 元素

每个元素索引对应 1 bit 谓词值;本页指令操作 mask 位,不操作 SEW 宽的数据元素。

.mm 操作数

vd 可为任意 mask register,接收结果 mask;vs2 与 vs1 提供两个源 mask,按相同元素索引逐 bit 组合。

v0.t 关系

mask logical 指令总是 unmasked;只有把组合结果写到或搬到 v0 后,后续普通 masked vector 指令才通过 v0.t 消费它。

官方来源:RISC-V V Standard Extension for Vector Operations

常见使用场景

predicate 条件组合

结合 «vmorn.mm v1, v2, v3» 等实际代码理解该场景。

mask logical family 对比

结合 «vmorn.mm v1, v2, v3» 等实际代码理解该场景。

masked execution 前的掩码构造

结合 «vmorn.mm v1, v2, v3» 等实际代码理解该场景。

使用前检查清单

语法检查
  • 确认当前指令格式为 V-type。
  • 确认操作数排列顺序与示例一致。
语义检查
  • 确认目标寄存器用途和调用约定兼容。
  • 确认该指令不是伪指令展开后的底层形式。

容易混淆 / 常见误区

汇编操作数顺序是 vd, vs2, vs1;ANDN/ORN 的取反对象是 vs1。
这些 mask logical 指令总是 unmasked,vm=0 编码保留;不要把 v0.t 当成本条指令的执行掩码。
它们操作 one-bit mask 元素,不是普通 SEW 宽向量数据元素;不要与 vand/vor/vxor 混淆。

常见问题

`.mm` 后缀具体表示什么?

它表示 mask-mask 形式:vd、vs2、vs1 都按 mask register 解释,逐元素处理 1 bit 谓词值。

VMORN.MM 的布尔公式是什么?

公式是 vd.mask[i] = vs2.mask[i] | ~vs1.mask[i]。

是否受 v0 掩码控制?

不受。向量 mask logical 指令总是 unmasked,vm=0 编码保留;vd 可为任意 mask register。只有结果写到或搬到 v0 后,后续普通 masked vector 指令才通过 v0.t 消费。

VMORN.MM 取反哪个源操作数?

取反对象是 vs1,也就是汇编语法里的第三个操作数;公式是 vs2 | ~vs1。

VMORN.MM 和 VMNOR.MM 有什么不同?

VMORN.MM 是 vs2 | ~vs1,只取反 vs1;VMNOR.MM 是 ~(vs2 | vs1),取反整个 OR 结果。