How does VFNCVT differ from VFWCVT?
VFNCVT narrows from 2*SEW source elements to SEW destination elements; VFWCVT widens from SEW source elements to 2*SEW destination elements. The direction, register-group size, and allowed overlap rules differ.
Narrow 2*SEW FP source elements to SEW unsigned integers using frm rounding.
VFNCVT.XU.F.W converts EEW=2*SEW FP elements in vs2 to SEW-bit unsigned integers in vd using dynamic frm. Unrepresentable rounded results clip under scalar conversion rules and raise NV; otherwise a changed value raises NX. Only active elements execute; no integer GPR is written.
Decode the OP-V encoding and execute a VFUNARY0 narrowing conversion lane by lane: each active lane converts the 2*SEW FP value in vs2[i] to an unsigned integer.
lane 0: narrow_round.frm_unsigned(0.25) -> 0
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.
The teaching context fixes VLEN=4096, LMUL=m1, SEW=32, vstart=0, valid vtype, enabled VS/FS, and valid frm. The source is an even vs2..vs2+1 group and the destination is one register; overlap must start at the source group's lowest register and forces mask/tail agnostic. VL=0 updates no destination elements, including tails. Inactive and tail values remain unspecified in this display; full fflags are not modeled. NaNs, infinities, and out-of-range integer conversions are legal FP inputs outside this model, not illegal instructions.
Read it as a 2*SEW FP to SEW unsigned-integer narrowing conversion, then check that rounding comes from frm.
Syntax is vd, vs2[, v0.t]; vs1=10000 is a VFUNARY0 selector, not a second source. funct6=010010, funct3=001, opcode=1010111; the instruction is 32 bits.
Source EEW=2*SEW, EMUL=2*LMUL; destination EEW=SEW, EMUL=LMUL. Groups are at most eight registers and align to their size. Overlap must start at the same lowest register and forces mask/tail agnostic; .w does not mean a fixed 32-bit width.
Optional v0.t means vm=0; omission means vm=1. Active elements satisfy vstart≤i<vl with the mask enabled. Masked vd cannot overlap v0; data sources cannot read v0 at both data EEW and mask EEW=1.
Prestart is unchanged. At vl=0 or vstart≥vl no destination elements change, including tails. Other inactive/tail values follow vma/vta; ta/ma does not guarantee zeros. Successful execution resets vstart=0.
FP-to-integer conversion rounds by dynamic frm before checking the SEW destination range. Overflow, infinity, and NaN clip under scalar conversion rules and raise NV; changed values raise NX only without NV. A negative fraction rounded to 0 can be a valid unsigned conversion. The animation accepts only finite binary64 inputs whose result fits 32 bits and does not display fflags.
V 1.0 supports this 64-to-32 path on RV32/RV64 and depends on F/D. This conversion at SEW=16 requires Zvfh; Zvfh also defines the SEW=8 binary16-to-8-bit-integer path. The animation fixes SEW=32, LMUL=m1, VLEN=4096, and vstart=0.
Valid vtype, supported FP widths, and enabled VS/FS are required; with H and virtualization V=1, vsstatus.VS/FS must also be enabled. Invalid frm use is reserved even at vl=0 or with no active elements. vxrm does not control FP operations. Teaching steps are not processor cycles.
Assume V/VS/FS enabled, valid vtype, frm=RNE, supported e32,m1 and required FP formats, VLMAX≥4, and a0=4; vsetvli sets vl=4 and vstart=0. The source group is v2/v3 with EEW=64. Omitting v0.t makes the example unmasked: binary64 v2=[-0.25,0.25,1.5,2.5] → uint32 v1=[0,0,2,2] (NX). Tails follow ta without assumed zeroing.
Assume V/VS/FS enabled, valid vtype, frm=RNE, supported e32,m1 and required FP formats, VLMAX≥4, and a0=4; vsetvli sets vl=4 and vstart=0. The source group is v2/v3 with EEW=64. Omitting v0.t makes the example unmasked: binary64 v2=[-0.25,0.25,1.5,2.5] → uint32 v1=[0,0,2,2] (NX). Tails follow ta without assumed zeroing.
VFNCVT narrows from 2*SEW source elements to SEW destination elements; VFWCVT widens from SEW source elements to 2*SEW destination elements. The direction, register-group size, and allowed overlap rules differ.
No. VFNCVT is a floating-point/integer conversion family: ordinary forms use floating-point frm, while rtz and rod are instruction-specified fixed rounding forms. vxrm is for fixed-point rounding instructions.
The destination range is 0..2^SEW−1. A negative out-of-range rounded result or −∞ yields 0; positive overflow, +∞, or NaN yields 2^SEW−1, raising NV. A negative fraction rounded to 0 is valid and raises NX when its value changes.