Zdinx Extension

Versions

Version 1.0.0

State

ratified

Ratification date

2021-11

Synopsis

The Zdinx extension provides analogous double-precision floating-point instructions.

The Zdinx extension adds all of the instructions that the D extension adds, except for the transfer instructions FLD, FSD, FMV.D.X, FMV.X.D, C.FLD[SP], and C.FSD[SP].

The Zdinx variants of these D-extension instructions have the same semantics, except that whenever such an instruction would have accessed an f register, it instead accesses the x register with the same number.

Processing of Wider Values

Double-precision operands in RV32Zdinx are held in aligned x-register pairs, i.e., register numbers must be even. Use of misaligned (odd-numbered) registers for double-width floating-point operands is reserved.

Regardless of endianness, the lower-numbered register holds the low-order bits, and the higher-numbered register holds the high-order bits: e.g., bits 31:0 of a double-precision operand in RV32Zdinx might be held in register x14, with bits 63:32 of that operand held in x15.

When a double-width floating-point result is written to x0, the entire write takes no effect: e.g., for RV32Zdinx, writing a double-precision result to x0 does not cause x1 to be written.

When x0 is used as a double-width floating-point operand, the entire operand is zero—i.e., x1 is not accessed.

Load-pair and store-pair instructions are contained in a separate extension (see Section Extensions for Load/Store pair for RV32). In case this is not available, transferring double-precision operands in RV32Zdinx from or to memory requires two loads or stores. Register moves need only a single FSGNJ.D instruction, however.

Instructions

The following instructions are affected by this extension:

fadd.d

Floating-Point Add Double-Precision

fclass.d

Floating-Point Classify Double-Precision

fcvt.d.s

Floating-Point Convert Single-Precision to Double-Precision

fcvt.d.w

Floating-Point Convert Word to Double-Precision

fcvt.d.wu

Floating-Point Convert Unsigned Word to Double-Precision

fcvt.s.d

Floating-Point Convert Double-Precision to Single-Precision

fcvt.w.d

Floating-Point Convert Double-Precision to Word

fcvt.wu.d

Floating-Point Convert Double-Precision to Unsigned Word

fdiv.d

Floating-Point Divide Double-Precision

feq.d

Floating-Point Equal Double-Precision

fle.d

Floating-Point Less Than or Equal Double-Precision

flt.d

Floating-Point Less Than Double-Precision

fmadd.d

Floating-Point Multiply-Add Double-Precision

fmax.d

Floating-Point Maximum-Number Double-Precision

fmin.d

Floating-Point Minimum-Number Double-Precision

fmsub.d

Floating-Point Multiply-Subtract Double-Precision

fmul.d

Floating-Point Multiply Double-Precision

fnmadd.d

Floating-Point Negate-Multiply-Add Double-Precision

fnmsub.d

Floating-Point Negate-Multiply-Subtract Double-Precision

fsgnj.d

Floating-Point Sign-Inject Double-Precision

fsgnjn.d

Floating-Point Sign-Inject Negate Double-Precision

fsgnjx.d

Floating-Point Sign-Inject XOR Double-Precision

fsqrt.d

Floating-Point Square Root Double-Precision

fsub.d

Floating-Point Subtract Double-Precision