Hi, Max:

On 1/8/2026 11:16 PM, Max Chou wrote:
> This patchset adds support for the OCP (Open Compute Project) 8-bit and
> 4-bit floating-point formats, along with the RISC-V Zvfofp8min and
> Zvfofp4min vector extensions that provide conversion operations for
> these formats.
> 
> OCP Floating-Point Formats
> * The OCP FP8 specification defines two 8-bit floating-point formats:
>   - E4M3: 4-bit exponent, 3-bit mantissa
>     * No infinity representation; only 0x7f and 0xff are NaN
>   - E5M2: 5-bit exponent, 2-bit mantissa
>     * IEEE-like format with infinity representation
>     * Multiple NaN encodings supported
> * The OCP FP4 specification defines the E2M1 format:
>   - E2M1: 2-bit exponent, 1-bit mantissa
>     * No NaN representation
> 
> RISC-V ISA Extensions
> * Zvfofp8min (Version 0.2.1):
>   The Zvfofp8min extension provides minimal vector conversion support
>   for OFP8 formats. It requires the Zve32f extension and leverages the
>   altfmt field in the VTYPE CSR (introduced by Zvfbfa) to select between
>   E4M3 (altfmt=0) and E5M2 (altfmt=1) formats.
>   - Canonical NaN for both E4M3 and E5M2 is 0x7f
>   - All NaNs are treated as quiet NaNs
>   Instructions added/extended:
>   - vfwcvtbf16.f.f.v: OFP8 to BF16 widening conversion
>   - vfncvtbf16.f.f.w: BF16 to OFP8 narrowing conversion
>   - vfncvtbf16.sat.f.f.w: BF16 to OFP8 with saturation (new)
>   - vfncvt.f.f.q: FP32 to OFP8 quad-narrowing conversion (new)
>   - vfncvt.sat.f.f.q: FP32 to OFP8 with saturation (new)
> 
> * Zvfofp4min (Version 0.1):
>   The Zvfofp4min extension provides minimal vector conversion support
>   for the OFP4 E2M1 format. It requires the Zve32f extension.
>   Instructions added:
>   - vfext.vf2: OFP4 E2M1 to OFP8 E4M3 widening conversion
> 
> Modifications
> * Softfloat library:
>   - New float8_e4m3 and float8_e5m2 types with NaN checking functions
>   - New float4_e2m1 type for OFP4 support
>   - Conversion functions: bfloat16/float32 <-> float8_e4m3/float8_e5m2
>   - Conversion function: float4_e2m1 -> float8_e4m3
>   - Implementation-defined behavior flags in float_status:
>     * ocp_fp8e5m2_no_signal_nan: Treat all E5M2 NaNs as quiet
>     * ocp_fp8_same_canonical_nan: Use 0x7f as canonical NaN for all OFP8
> * RISC-V target:
>   - CPU configuration properties for Zvfofp8min and Zvfofp4min
>   - Extension implied rules (Zvfofp8min requires Zve32f and Zvfbfa)
>   - Vector helper functions for OFP8/OFP4 conversion instructions
>   - Disassembler support for new instructions
> 
Nice work! The code quality looks good. I've been working on similar stuff
recently, so happy to review.

A quick suggestion: run checkpatch.pl to catch any style issues.

Also, are we planning to add softfloat unit tests for OCP floating-point
formats? Would be great for code quality coverage.

Thanks,
Chao

> References
> * OCP FP8 specification:
>   
> https://www.opencompute.org/documents/ocp-8-bit-floating-point-specification-ofp8-revision-1-0-2023-12-01-pdf-1
> * Zvfofp8min specification (v0.2.1 commit e1e20a7):
>   https://github.com/aswaterman/riscv-misc/blob/main/isa/zvfofp8min.adoc
> * Zvfofp4min specification (v0.1 commit e1e20a7):
>   https://github.com/aswaterman/riscv-misc/blob/main/isa/zvfofp4min.adoc
> 
> PS: This series depends on the Zvfbfa extension patchset which introduces:
>   - The altfmt field in VTYPE CSR
>   - BF16 vector operations infrastructure
>   - vfwcvtbf16.f.f.v and vfncvtbf16.f.f.w base instructions
> 
> Based-on: [email protected]
> 
> Max Chou (18):
>   target/riscv: rvv: Fix NOP_UU_B vs2 width
>   fpu/softfloat: Add OCP(Open Compute Project) OFP8 data type
>   fpu/softfloat: Add convert operations(bf16, fp32) for OFP8 data types
>   fpu/softfloat: Add OCP(Open Compute Project) OFP4 data type
>   fpu/softfloat: Add OCP FP4 E2M1 to OCP FP8 E4M3 convert operation
>   target/riscv: Add cfg properity for Zvfofp8min extension
>   target/riscv: Add implied rules for Zvfofp8min extension
>   target/riscv: rvv: Make vfwcvtbf16.f.f.v support OFP8 to BF16
>     conversion for Zvfofp8min extension
>   target/riscv: rvv: Make vfncvtbf16.f.f.w support BF16 to OFP8
>     conversion for Zvfofp8min extension
>   target/riscv: rvv: Add vfncvtbf16.sat.f.f.w instruction for Zvfofp8min
>     extension
>   target/riscv: rvv: Add vfncvt.f.f.q and vfncvt.sat.f.f.q instructions
>     for Zvfofp8min extension
>   target/riscv: Expose Zvfofp8min properity
>   disas/riscv: Add support of Zvfofp8min extension
>   target/riscv: Add cfg properity for Zvfofp4min extension
>   target/riscv: Add implied rules for Zvfofp4min extension
>   target/riscv: rvv: Add vfext.vf2 instruction for Zvfofp4min extension
>   target/riscv: Expose Zvfofp4min properity
>   disas/riscv: Add support of Zvfofp4min extension
> 
>  disas/riscv.c                              |  12 +
>  fpu/softfloat-parts.c.inc                  |  77 +++++-
>  fpu/softfloat-specialize.c.inc             |  57 ++++-
>  fpu/softfloat.c                            | 274 +++++++++++++++++++++
>  include/fpu/softfloat-helpers.h            |  20 ++
>  include/fpu/softfloat-types.h              |  28 +++
>  include/fpu/softfloat.h                    | 124 ++++++++++
>  target/riscv/cpu.c                         |  35 ++-
>  target/riscv/cpu_cfg_fields.h.inc          |   2 +
>  target/riscv/helper.h                      |  15 ++
>  target/riscv/insn32.decode                 |   8 +
>  target/riscv/insn_trans/trans_rvbf16.c.inc |  32 ++-
>  target/riscv/insn_trans/trans_rvofp4.c.inc |  54 ++++
>  target/riscv/insn_trans/trans_rvofp8.c.inc | 115 +++++++++
>  target/riscv/insn_trans/trans_rvv.c.inc    |  39 +++
>  target/riscv/tcg/tcg-cpu.c                 |  15 ++
>  target/riscv/translate.c                   |   2 +
>  target/riscv/vector_helper.c               | 131 +++++++++-
>  18 files changed, 1022 insertions(+), 18 deletions(-)
>  create mode 100644 target/riscv/insn_trans/trans_rvofp4.c.inc
>  create mode 100644 target/riscv/insn_trans/trans_rvofp8.c.inc
> 


Reply via email to