While working with Berkeley TestFloat I've noticed that testing of floating-point to integer conversion is done by checking (in particular) a specific result values:
// file: test_a_f32_z_i32_rx.c
// function: test_a_f32_z_i32_rx
...
if ( (trueZ != subjZ) || (trueFlags != subjFlags) ) {
if (
verCases_checkInvInts
|| (trueFlags != softfloat_flag_invalid)
|| (subjFlags != softfloat_flag_invalid)
|| ((subjZ != 0x7FFFFFFF) && (subjZ != -0x7FFFFFFF - 1)
&& (! f32_isNaN( genCases_f32_a ) || (subjZ != 0)))
) {
++verCases_errorCount;
Here we see the specific result values: 0
, 0x7FFFFFFF
(max. signed integer), -0x7FFFFFFF - 1
(min. signed integer).
However, per C11 (and higher) standard conversion of out of range floating-point to integer leads to UB. Since usually (int)f
leads to generation of hardware instruction (e.g. cvttss2si
for x86_64), I wonder: is there any hardware which converts out of range floating-point to non-zero/min/max integer?