VREM.VX 除零会产生异常吗?
不会。官方 V 扩展为除零定义了确定结果:余数写回被除数,指令本身不产生除零 trap。
向量-标量 有符号整数余数,把逐元素余数写入 vd;除零不触发异常。
VREM.VX 是 RISC-V V 扩展的 向量-标量 有符号整数余数指令。每个活动元素以 vs2 为被除数、以x[rs1] 标量值为除数,按 SEW 位宽计算余数并写回 vd;除数为 0 和有符号溢出特例使用官方定义结果,不产生除零 trap。
从 OP-V 编码字段开始,展示 VREM 如何逐元素计算有符号余数,并按官方规则处理除零和有符号溢出特例。
要求 V 1.0、启用向量状态及合法受支持 vtype/SEW;固定 LMUL=m1、vstart=0。固定 VLEN=4096,VLMAX=4096/16=256;同宽源/目标可重叠。有符号商向零舍入,非零余数与被除数同号;MIN/-1 余数为0。除零返回被除数。XLEN>SEW 取标量低位,XLEN<SEW 符号扩展(无符号运算也如此),x0 提供零。masked vd 不可为 v0,v0 不可同时提供掩码与 SEW 数据。输入元素为非负位模式;VL=0 不更新目标。只展示 body,不确定 inactive/tail 值;教学步骤不是处理器周期。
vrem.vx 使用 OP-V 编码。动画把固定字段、寄存器字段、vm 和 rs1 字段放在同一条编码带中。
动画展示 OP-V 字段解析、活动元素读取、有符号余数、mask 控制和 vd 写回。步骤是教学分解,不表示流水线、缓存或执行时延。
VREM.VX 不产生除零异常。它在当前 vl 的活动元素上读取 vs2 作为被除数、读取x[rs1] 标量值作为除数,写回 有符号余数;vm=0 时只执行 v0.t 为 1 的 body 元素。
语法:vrem.vx vd, vs2, rs1[, v0.t];省略掩码为 vm=1,给出 v0.t 为 vm=0。32 位 OP-V:opcode=1010111、funct3=110(OPMVX)、funct6=100011。
vs2[i] 是被除数;x[rs1] 提供标量除数,XLEN>SEW 取低 SEW 位,XLEN<SEW 符号扩展(即使无符号运算),x0 提供零。按有符号 SEW 整数求余;除零返回被除数,非零余数与被除数同号,最小负数除以-1返回余数0。
活动 body 满足 vstart≤i<vl 且掩码开启;inactive/tail 按 vma/vta 保留或取 agnostic,不依赖固定值。vl=0 不更新任何目标元素。
同宽源/目标允许重叠;masked vd 不可为 v0,v0 不能同时提供 EEW=1 掩码和 SEW 数据。组起点按 EMUL 对齐,EMUL≤8。
要求 V 1.0、启用向量状态及合法受支持 vtype/SEW。动画固定 m1、vstart=0;VLEN=4096。步骤不表示处理器周期。
假定 V/VS 已启用、合法 m1、支持 SEW、VLEN≥128、XLEN=64、vl=4、vstart=0、v0.mask[0..3]=1111,源已初始化。SEW=8, a1=3, v12=[249(-7),7,128(-128),5] → v8=[255(-1),1,254(-2),2]。inactive/tail 按 vma/vta;vl=0 不更新目标。
假定 V/VS 已启用、合法 m1、支持 SEW、VLEN≥128、XLEN=64、vl=4、vstart=0、v0.mask[0..3]=1111,源已初始化。SEW=8, a1=3, v12=[249(-7),7,128(-128),5] → v8=[255(-1),1,254(-2),2]。inactive/tail 按 vma/vta;vl=0 不更新目标。
不会。官方 V 扩展为除零定义了确定结果:余数写回被除数,指令本身不产生除零 trap。
VREM.VX 写回余数;配套的 VDIV 形式写回同一除法关系下的商。两者都使用相同的除零和有符号溢出特例规则。