On 7 February 2011 17:00, Christophe Lyon <[email protected]> wrote:
>
> Some CPUs have a status flag imposing to return floatxx_default_nan
> whatever the input value, when converting from one FP format to
> another. Implement this, using the already existing default_nan_mode
> status flag (currently used on ARM and SH4 at the moment).
>
> Signed-off-by: Christophe Lyon <[email protected]>
Your subject is a bit long, which can make it wrap annoyingly in git logs.
I'd suggest something like:
===begin===
softfloat: Honour default_nan_mode for float-to-float conversions
Honour the default_nan_mode flag when doing conversions between
different floating point formats, as well as when returning a NaN from
a two-operand floating point function. This corrects the behaviour
of float<->double conversions on both ARM and SH4.
===endit===
> +/*----------------------------------------------------------------------------
> +| The pattern for a default generated haft-precision NaN.
> +*----------------------------------------------------------------------------*/
"half-precision".
> @@ -2767,11 +2767,7 @@ bits16 float32_to_float16( float32 a, flag ieee
> STATUS_PARAM)
> aExp = extractFloat32Exp( a );
> aSign = extractFloat32Sign( a );
> if ( aExp == 0xFF ) {
> - if (aSig) {
> - /* Make sure correct exceptions are raised. */
> - float32ToCommonNaN(a STATUS_VAR);
> - aSig |= 0x00400000;
> - }
> + if ( aSig ) return commonNaNToFloat16( float32ToCommonNaN( a
> STATUS_VAR ) STATUS_VAR );
> return packFloat16(aSign, 0x1f, aSig >> 13);
> }
> if (aExp == 0 && aSign == 0) {
This is float32_to_float16() but it looks like you've missed
float16_to_float32() ?
Otherwise, looks good, and I can confirm that it fixes
behaviour of VCVT.F32.F64 and VCVT.F64.F32 when
the FPSCR.DN bit is set.
-- PMM