Zdinx Extension
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:
Floating-Point Add Double-Precision |
|
Floating-Point Classify Double-Precision |
|
Floating-Point Convert Single-Precision to Double-Precision |
|
Floating-Point Convert Word to Double-Precision |
|
Floating-Point Convert Unsigned Word to Double-Precision |
|
Floating-Point Convert Double-Precision to Single-Precision |
|
Floating-Point Convert Double-Precision to Word |
|
Floating-Point Convert Double-Precision to Unsigned Word |
|
Floating-Point Divide Double-Precision |
|
Floating-Point Equal Double-Precision |
|
Floating-Point Less Than or Equal Double-Precision |
|
Floating-Point Less Than Double-Precision |
|
Floating-Point Multiply-Add Double-Precision |
|
Floating-Point Maximum-Number Double-Precision |
|
Floating-Point Minimum-Number Double-Precision |
|
Floating-Point Multiply-Subtract Double-Precision |
|
Floating-Point Multiply Double-Precision |
|
Floating-Point Negate-Multiply-Add Double-Precision |
|
Floating-Point Negate-Multiply-Subtract Double-Precision |
|
Floating-Point Sign-Inject Double-Precision |
|
Floating-Point Sign-Inject Negate Double-Precision |
|
Floating-Point Sign-Inject XOR Double-Precision |
|
Floating-Point Square Root Double-Precision |
|
Floating-Point Subtract Double-Precision |