先看 vl
当前 vl 决定 body 元素数量。典型代码会先执行 vsetvli、vsetivli 或 vsetvl,再执行本页指令。
查找最低编号 active set mask bit 并写入整数 rd
VFIRST.M 在 vs2 源掩码中查找最低编号 active 且为 1 的元素,将该元素索引写入整数寄存器 rd;若没有找到,则写入 -1。
从 OP-V 编码字段开始,展示 VFIRST.M 如何寻找最低编号 active set bit;没有找到时写 -1。
vfirst.m 使用 OP-V 编码;vs1 字段固定为 10001,语法中没有 vs1 操作数。
动画只展示官方 V 扩展定义的 ISA 可见关系:OP-V 字段解析、vl 内 active mask bit 扫描、整数 rd 写回;不模拟流水线、缓存或执行时延。
VFIRST.M 是 mask 到标量查找指令:结果是最低编号 active set bit 的元素索引,没找到时为 -1。
阅读 VFIRST.M 时,不要只看助记符。官方 V 扩展语义还依赖当前 vl、vtype 和掩码状态。后缀和操作数形式决定源操作数来自向量、标量还是立即数。
当前 vl 决定 body 元素数量。典型代码会先执行 vsetvli、vsetivli 或 vsetvl,再执行本页指令。
当前 vtype 提供 SEW、LMUL、tail policy 和 mask policy;这些规则影响元素宽度、寄存器组大小以及非活动/尾部目标元素。
带 vm 的普通向量指令在 vm=0 时用 v0 作为执行掩码,vm=1 表示未掩码。VMERGE 等少数形式会把 v0 当作数据选择输入。
结合 «vsetvli t0, a0, e32, m1, ta, ma vmseq.vv v0, v8, v9 vfirst.m a0, v0» 等实际代码理解该场景。
结合 «vsetvli t0, a0, e32, m1, ta, ma vmseq.vv v0, v8, v9 vfirst.m a0, v0» 等实际代码理解该场景。
返回 -1,写入整数寄存器 rd。
不会。vm=0 时 v0.t 为 0 的位置不参与扫描,即使 vs2 bit 为 1 也不能成为结果。