Implement RVV single-width floating-point conversions
Implements the single-width conversions from #734. First of three PRs that
share the VFUNARY0 decode site (funct6=0x12, funct3=0x1); see the note at
the end.
Adds the six same-width vfcvt forms (V 1.0 §13.17). The .rtz variants
pin round-towards-zero through the _r_minMag SoftFloat entry points, while
the plain forms follow the dynamic rounding mode installed by
rvv_fp_begin_round().
The widening (vfwcvt, vs1 0x08-0x0f) and narrowing (vfncvt, vs1
0x10-0x17) members are not decoded here and continue to be rejected rather
than misdecoded; the decode tests assert that.
One note on the smoke coverage: the test uses 1.5 as an input because it
rounds to 2 under RNE but truncates to 1 under RTZ. A value such as 2.5
gives 2 under both because of ties-to-even and would not distinguish an
implementation that ignored the .rtz suffix. Signed vs unsigned is pinned
with -3, which differs in both directions.
make check passes; the build was checked in the default, EXT_V,
JIT+EXT_V and EXT_V-without-EXT_F configurations. clang-format 20.1.7
clean.
Ordering: this touches the same case 1: block as the vfwcvt and
vfncvt PRs. They are independent in substance but will conflict textually,
so they are best taken in order (this one, then vfwcvt, then vfncvt); I will
rebase the later two as each lands and update the "not implemented yet"
comments accordingly.
Summary by cubic
Implements the six same-width vfcvt conversion instructions (V 1.0 §13.17), which were previously rejected. The .rtz variants pin round-towards-zero; the plain forms follow the dynamic rounding mode. Widening and narrowing forms remain unimplemented and are still rejected.
- Adds smoke tests that use 1.5 to distinguish dynamic rounding from
.rtzbehavior. - Shares the VFUNARY0 decode site with future
vfwcvt/vfncvtPRs; those will need rebasing in sequence.