Floating-point to Integer Conversion Overview

IEEE 754 does not 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:

    Used by most other PowerISA instructions, as well as commonly used floating-point to integer conversions on x86.

  • S-Type:

    Used for several notable programming languages:

    • Java's conversion from float/double to long/int1
    • Rust's as operator2
    • LLVM's llvm.fptosi.sat3 and llvm.fptoui.sat4 intrinsics
    • SPIR-V's OpenCL dialect's OpConvertFToU5 and OpConvertFToS6 instructions when decorated with the SaturatedConversion7 decorator.
    • Also WebAssembly's trunc_sat_u8 and trunc_sat_s9 instructions,
  • E-Type:

    Used for ECMAScript's ToInt32 abstract operation10. Also implemented in ARMv8.3A as the FJCVTZS instruction11.

Floating-point to Integer Conversion Semantics Summary

Let round 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:

+------+------+---------------------------------------------------------------+
|Type| Result | Category of rounding                                          |
|    | Sign   +----------+-----------+----------+-----------+---------+-------+
|    |        | NaN      | +Inf      | -Inf     | > Max     | < Min   | Else  |
|    |        |          |           |          | Possible  | Possible|       |
|    |        |          |           |          | Result    | Result  |       |
+----+--------+----------+-----------+----------+-----------+---------+-------+
|  P |Unsigned| 0        | 2^w - 1   | 0        | 2^w - 1   | 0       | round |
|    +--------+----------+-----------+----------+-----------+---------+-------+
|    | Signed | -2^(w-1) | 2^(w-1)-1 | -2^(w-1) | 2^(w-1)-1 | -2^(w-1)| round |
+----+--------+----------+-----------+----------+-----------+---------+-------+
|  S |Unsigned| 0        | 2^w - 1   | 0        | 2^w - 1   | 0       | round |
|    +--------+----------+-----------+----------+-----------+---------+-------+
|    | Signed | 0        | 2^(w-1)-1 | -2^(w-1) | 2^(w-1)-1 | -2^(w-1)| round |
+----+--------+----------+-----------+----------+-----------+---------+-------+
|  E | Either | 0                               | round & (2^w - 1)           |
+----+--------+---------------------------------+-----------------------------+