Does VREMU.VV trap on divide by zero?
No. The official V extension defines the divide-by-zero result: the remainder is the dividend, and the instruction itself does not raise a divide-by-zero trap.
vector-vector unsigned integer remainder; writes each remainder to vd, and divide by zero does not trap.
VREMU.VV is a RISC-V V extension vector-vector unsigned integer remainder instruction. Each active element uses vs2 as the dividend and the same-lane vs1 element as the divisor, computes the SEW-width remainder, and writes vd; zero divisors use the official specified result without a divide-by-zero trap.
Starts from OP-V encoding fields, then shows unsigned remainders and the zero-divisor result; unsigned division cannot overflow.
Require V 1.0, enabled vector state and valid supported vtype/SEW; fix LMUL=m1 and vstart=0. Fix VLEN=4096 and VLMAX=4096/16=256; equal-width sources/destination may overlap. Compute unsigned SEW remainders. A zero divisor returns the dividend. Masked vd cannot be v0; v0 cannot supply both mask and SEW data. Enter nonnegative element bit patterns. VL=0 leaves vd unchanged. Only body is shown; no definite inactive/tail values. Teaching stages are not processor cycles.
vremu.vv uses OP-V encoding. The animation places fixed fields, register fields, vm, and the vs1 field in one encoding strip.
This animation shows OP-V field decode, active-element reads, unsigned remainder, mask control, and vd writeback. These are teaching stages; they do not model pipelines, caches, or timing.
VREMU.VV does not raise a divide-by-zero exception. For active elements within the current vl, it reads vs2 as the dividend and the same-lane vs1 element as the divisor, writes the unsigned remainder, and with vm=0 only body elements whose v0.t bit is 1 execute.
Syntax: vremu.vv vd, vs2, vs1[, v0.t]; omit the mask for vm=1, include v0.t for vm=0. 32-bit OP-V: opcode=1010111, funct3=010 (OPMVV), funct6=100010.
vs2[i] is the dividend; vs1[i] is the same-lane divisor. Compute unsigned SEW remainders. A zero divisor returns the dividend; unsigned division cannot overflow.
Active body satisfies vstart≤i<vl with the mask enabled. Inactive/tail follow vma/vta: retain or agnostic, without a fixed value to rely on. vl=0 updates no destination elements.
Same-width sources/destination may overlap. Masked vd cannot be v0; v0 cannot provide both the EEW=1 mask and SEW data. Group starts align to EMUL, EMUL≤8.
Require V 1.0, enabled vector state and valid supported vtype/SEW. The animation fixes m1 and vstart=0; VLEN=4096. Steps are not processor cycles.
Assume enabled V/VS, valid m1, supported SEW, VLEN≥128 and XLEN=64, vl=4, vstart=0, v0.mask[0..3]=1111 and initialized sources. SEW=8, v12=[255,7,128,5], v4=[3,0,255,2] → v8=[0,7,128,1]. Inactive/tail follow vma/vta; vl=0 leaves vd unchanged.
Assume enabled V/VS, valid m1, supported SEW, VLEN≥128 and XLEN=64, vl=4, vstart=0, v0.mask[0..3]=1111 and initialized sources. SEW=8, v12=[255,7,128,5], v4=[3,0,255,2] → v8=[0,7,128,1]. Inactive/tail follow vma/vta; vl=0 leaves vd unchanged.
No. The official V extension defines the divide-by-zero result: the remainder is the dividend, and the instruction itself does not raise a divide-by-zero trap.
VREMU writes the remainder; VDIVU writes the quotient. With a zero divisor, VREMU returns the dividend and VDIVU returns all ones. Unsigned division cannot overflow.