What does the vm operand control for VFRDIV.VF?
With vm=0, only active elements selected by v0.t execute; vm=1 is unmasked. The page formula is vd[i] = f[rs1] / vs2[i].
VFRDIV.VF is an RVV single-width vector-scalar reverse floating-point divide instruction with syntax vfrdiv.vf vd, vs2, rs1, vm; each active element computes vd[i] = f[rs1] / vs2[i].
VFRDIV.VF divides the floating-point scalar f[rs1] by each active vector element vs2[i]. Its operand direction is the reverse of VFDIV.VF, so the key learning point is not to read f[rs1] / vs2[i] as vs2[i] / f[rs1]. Rounding, NaNs, infinities, divide-by-zero, and exception flags follow the official RVV floating-point rules.
Decode the OP-V encoding and execute reverse FP division lane by lane: each active lane computes f[rs1] / vs2[i].
lane 0: 1.5 / 1 -> 1.5
This lane follows the current-step highlight; the remaining lane results appear below.
V-extension FP instructions use the OP-V major opcode, with funct6, source registers, vm, funct3, vd, and opcode fields.
VFRDIV.VF runs in the scalar-divided-by-vector direction: f[rs1] / vs2[i]. It exists to distinguish the operand direction from vfdiv.vf.
vd and vs2 are SEW-wide vector register groups; same-width source/destination overlap is allowed. An ordinary masked destination cannot overlap v0.
rs1 selects an FP f register; compute f[rs1]/vs2[i]. With FLEN>SEW, a valid NaN box supplies low SEW bits and an invalid box supplies canonical NaN; FLEN<SEW is reserved.
Assembly vm denotes optional v0.t: omission means vm=1; v0.t means vm=0, selecting active vs2 elements. One source register cannot be read as both an EEW=1 mask and SEW-wide data.
Active elements satisfy vstart≤i<vl with the mask enabled; vstart≥vl or vl=0 leaves all destination elements unchanged. Other inactive/tail destinations follow vma/vta without guaranteed zeroing.
V 1.0 applies to RV32/RV64, includes FP32/FP64, and depends on F/D; SEW=16 arithmetic requires Zvfh. Require valid vtype, supported widths, enabled VS/FS, and valid frm; invalid frm use is reserved even at vl=0. vxrm does not control these FP operations.
Assume V/VS/FS enabled, valid vtype, frm=RNE, supported e32,m1, VLMAX≥4, and x10=4; after vsetvli, vl=4 and vstart=0. Inputs are binary32; f0, when used, is validly NaN-boxed at FLEN=64. The example is unmasked: f0=8, v2=[2,4,8,16] → v1=[4,2,1,0.5]. Tails follow ta without assumed zeroing.
Assume V/VS/FS enabled, valid vtype, frm=RNE, supported e32,m1, VLMAX≥4, and x10=4; after vsetvli, vl=4 and vstart=0. Inputs are binary32; f0, when used, is validly NaN-boxed at FLEN=64. The example is unmasked: f0=8, v2=[2,4,8,16] → v1=[4,2,1,0.5]. Tails follow ta without assumed zeroing.
Assume V/VS/FS enabled, valid vtype, frm=RNE, supported e32,m1, VLMAX≥4, and x10=4; after vsetvli, vl=4 and vstart=0. Inputs are binary32; f0, when used, is validly NaN-boxed at FLEN=64. The example is unmasked: f0=8, v2=[2,4,8,16] → v1=[4,2,1,0.5]. Tails follow ta without assumed zeroing.
With vm=0, only active elements selected by v0.t execute; vm=1 is unmasked. The page formula is vd[i] = f[rs1] / vs2[i].
No. Ordinary RVV floating-point operations use the floating-point rounding mode frm and set FP exception flags; vxrm is for fixed-point rounding instructions.
Divide-by-zero, 0/0, NaN operands, and infinity inputs are handled by the FP rules. Results, rounding, and fflags follow the official RVV floating-point rules; this page does not simplify them into integer-style fixed results.