== "Q" Extension for Quad-Precision Floating-Point, Version 2.2 This chapter describes the Q standard extension for 128-bit quad-precision binary floating-point instructions compliant with the IEEE 754-2008 arithmetic standard. The quad-precision binary floating-point instruction-set extension is named "Q"; it depends on the double-precision floating-point extension D. The floating-point registers are now extended to hold either a single, double, or quad-precision floating-point value (FLEN=128). The NaN-boxing scheme described in <> is now extended recursively to allow a single-precision value to be NaN-boxed inside a double-precision value which is itself NaN-boxed inside a quad-precision value. === Quad-Precision Load and Store Instructions New 128-bit variants of LOAD-FP and STORE-FP instructions are added, encoded with a new value for the funct3 width field. include::images/wavedrom/quad-ls.adoc[] [[quad-ls]] //.Quad-precision load and store FLQ and FSQ are only guaranteed to execute atomically if the effective address is naturally aligned and XLEN=128. FLQ and FSQ do not modify the bits being transferred; in particular, the payloads of non-canonical NaNs are preserved. === Quad-Precision Computational Instructions A new supported format is added to the format field of most instructions, as shown in <> [[fpextfmt]] .Format field encoding. [%autowidth,float="center",align="center",cols="^,^,<",options="header",] |=== |_fmt_ field |Mnemonic |Meaning |00 |S |32-bit single-precision |01 |D |64-bit double-precision |10 |H |16-bit half-precision |11 |Q |128-bit quad-precision |=== The quad-precision floating-point computational instructions are defined analogously to their double-precision counterparts, but operate on quad-precision operands and produce quad-precision results. include::images/wavedrom/quad-compute.adoc[] [[quad-compute]] //.Quad-precision computational === Quad-Precision Convert and Move Instructions New floating-point-to-integer and integer-to-floating-point conversion instructions are added. These instructions are defined analogously to the double-precision-to-integer and integer-to-double-precision conversion instructions. FCVT.W.Q or FCVT.L.Q converts a quad-precision floating-point number to a signed 32-bit or 64-bit integer, respectively. FCVT.Q.W or FCVT.Q.L converts a 32-bit or 64-bit signed integer, respectively, into a quad-precision floating-point number. FCVT.WU.Q, FCVT.LU.Q, FCVT.Q.WU, and FCVT.Q.LU variants convert to or from unsigned integer values. FCVT.L[U].Q and FCVT.Q.L[U] are RV64-only instructions. Note FCVT.Q.L[U] always produces an exact result and is unaffected by rounding mode. include::images/wavedrom/quad-cnvrt-mv.adoc[] [[quad-cnvrt-mv]] //.Quad-precision convert and move New floating-point-to-floating-point conversion instructions are added. These instructions are defined analogously to the double-precision floating-point-to-floating-point conversion instructions. FCVT.S.Q or FCVT.Q.S converts a quad-precision floating-point number to a single-precision floating-point number, or vice-versa, respectively. FCVT.D.Q or FCVT.Q.D converts a quad-precision floating-point number to a double-precision floating-point number, or vice-versa, respectively. include::images/wavedrom/quad-cnvt-interchange.adoc[] [[quad-convrt-interchange]] //.Quad-precision convert and move interchangeably Floating-point to floating-point sign-injection instructions, FSGNJ.Q, FSGNJN.Q, and FSGNJX.Q are defined analogously to the double-precision sign-injection instruction. include::images/wavedrom/quad-cnvrt-intch-xqqx.adoc[] [[quad-cnvrt-intch-xqqx]] //.Quad-precision convert and move interchangeably XQ-QX FMV.X.Q and FMV.Q.X instructions are not provided in RV32 or RV64, so quad-precision bit patterns must be moved to the integer registers via memory. [NOTE] ==== RV128 will support FMV.X.Q and FMV.Q.X in the Q extension. ==== === Quad-Precision Floating-Point Compare Instructions The quad-precision floating-point compare instructions are defined analogously to their double-precision counterparts, but operate on quad-precision operands. include::images/wavedrom/quad-float-compare.adoc[] [[quad-float-compare]] //.Quad-precision floatinf-point compare === Quad-Precision Floating-Point Classify Instruction The quad-precision floating-point classify instruction, FCLASS.Q, is defined analogously to its double-precision counterpart, but operates on quad-precision operands. include::images/wavedrom/quad-float-clssfy.adoc[] [[quad-float-clssfy]] //.Quad-precision floating point classify