## Floating-point to Integer Conversion Overview
IEEE 754 doesn't specify what results are obtained when converting a NaN or out-of-range floating-point value to integer, so different programming languages and ISAs have made different choices. The different conversion modes supported by the `cffpr` instruction are as follows: * P-Type:
This type of conversion is that used by most other PowerISA instructions, as well as commonly used floating-point to integer conversions on x86. * S-Type:
This type of conversion is used for WebAssembly's [`trunc_sat_u`](https://webassembly.github.io/spec/core/exec/numerics.html#op-trunc-sat-u) and [trunc_sat_s](https://webassembly.github.io/spec/core/exec/numerics.html#op-trunc-sat-s) instructions, as well as several notable programming languages: * Java's conversion from [`float`/`double` to `long`/`int`](https://docs.oracle.com/javase/specs/jls/se16/html/jls-5.html#jls-5.1.3) * Rust's [`as` operator](https://doc.rust-lang.org/reference/expressions/operator-expr.html#semantics) * LLVM's [`llvm.fptosi.sat`](https://llvm.org/docs/LangRef.html#llvm-fptosi-sat-intrinsic) and [`llvm.fptoui.sat`](https://llvm.org/docs/LangRef.html#llvm-fptoui-sat-intrinsic) intrinsics * SPIR-V's OpenCL dialect's [`OpConvertFToU`](https://www.khronos.org/registry/spir-v/specs/unified1/SPIRV.html#OpConvertFToU) and [`OpConvertFToS`](https://www.khronos.org/registry/spir-v/specs/unified1/SPIRV.html#OpConvertFToS) instructions when decorated with [the `SaturatedConversion` decorator](https://www.khronos.org/registry/spir-v/specs/unified1/SPIRV.html#_a_id_decoration_a_decoration). * E-Type:
This type of conversion is used for [ECMAScript's `ToInt32` abstract operation](https://262.ecma-international.org/14.0/#sec-toint32). This type of conversion is also implemented in ARMv8.3A as the `FJCVTZS` instruction. ### Floating-point to Integer Conversion Semantics Summary Let `rounded` be the result of `bfp_ROUND_TO_INTEGER(rmode, input)`. Let `w` be the number of bits in the result's type. The result of Floating-point to Integer conversion is as follows: ``` +--------+------------+-----------------------------------------------------------------------+ | Kind | Result's | Category of rounded | | | Signedness +-----------+-----------+-----------+-----------+-----------+-----------+ | | | NaN | +Infinity | -Infinity | > Maximum | < Minimum | Otherwise | | | | | | | Possible | Possible | | | | | | | | Result | Result | | +--------+------------+-----------+-----------+-----------+-----------+-----------+-----------+ | P-Type | Unsigned | 0 | 2^w - 1 | 0 | 2^w - 1 | 0 | rounded | | +------------+-----------+-----------+-----------+-----------+-----------+-----------+ | | Signed | -2^(w-1) | 2^(w-1)-1 | -2^(w-1) | 2^(w-1)-1 | -2^(w-1) | rounded | +--------+------------+-----------+-----------+-----------+-----------+-----------+-----------+ | S-Type | Unsigned | 0 | 2^w - 1 | 0 | 2^w - 1 | 0 | rounded | | +------------+-----------+-----------+-----------+-----------+-----------+-----------+ | | Signed | 0 | 2^(w-1)-1 | -2^(w-1) | 2^(w-1)-1 | -2^(w-1) | rounded | +--------+------------+-----------+-----------+-----------+-----------+-----------+-----------+ | E-Type | Either | 0 | rounded & (2^w - 1) | +--------+------------+-----------------------------------+-----------------------------------+ ```