diff --git a/qemu/aarch64.h b/qemu/aarch64.h index b6173f0a..64639702 100644 --- a/qemu/aarch64.h +++ b/qemu/aarch64.h @@ -491,6 +491,7 @@ #define float16_is_quiet_nan float16_is_quiet_nan_aarch64 #define float16_is_signaling_nan float16_is_signaling_nan_aarch64 #define float16_maybe_silence_nan float16_maybe_silence_nan_aarch64 +#define float16_squash_input_denormal float16_squash_input_denormal_aarch64 #define float16_to_float32 float16_to_float32_aarch64 #define float16_to_float64 float16_to_float64_aarch64 #define float32ToCommonNaN float32ToCommonNaN_aarch64 diff --git a/qemu/aarch64eb.h b/qemu/aarch64eb.h index 2f134370..38ad68d1 100644 --- a/qemu/aarch64eb.h +++ b/qemu/aarch64eb.h @@ -491,6 +491,7 @@ #define float16_is_quiet_nan float16_is_quiet_nan_aarch64eb #define float16_is_signaling_nan float16_is_signaling_nan_aarch64eb #define float16_maybe_silence_nan float16_maybe_silence_nan_aarch64eb +#define float16_squash_input_denormal float16_squash_input_denormal_aarch64eb #define float16_to_float32 float16_to_float32_aarch64eb #define float16_to_float64 float16_to_float64_aarch64eb #define float32ToCommonNaN float32ToCommonNaN_aarch64eb diff --git a/qemu/arm.h b/qemu/arm.h index c5b0f1f0..6b000561 100644 --- a/qemu/arm.h +++ b/qemu/arm.h @@ -491,6 +491,7 @@ #define float16_is_quiet_nan float16_is_quiet_nan_arm #define float16_is_signaling_nan float16_is_signaling_nan_arm #define float16_maybe_silence_nan float16_maybe_silence_nan_arm +#define float16_squash_input_denormal float16_squash_input_denormal_arm #define float16_to_float32 float16_to_float32_arm #define float16_to_float64 float16_to_float64_arm #define float32ToCommonNaN float32ToCommonNaN_arm diff --git a/qemu/armeb.h b/qemu/armeb.h index 9439b9ac..ac58929c 100644 --- a/qemu/armeb.h +++ b/qemu/armeb.h @@ -491,6 +491,7 @@ #define float16_is_quiet_nan float16_is_quiet_nan_armeb #define float16_is_signaling_nan float16_is_signaling_nan_armeb #define float16_maybe_silence_nan float16_maybe_silence_nan_armeb +#define float16_squash_input_denormal float16_squash_input_denormal_armeb #define float16_to_float32 float16_to_float32_armeb #define float16_to_float64 float16_to_float64_armeb #define float32ToCommonNaN float32ToCommonNaN_armeb diff --git a/qemu/fpu/softfloat.c b/qemu/fpu/softfloat.c index 8a325bc2..08594f54 100644 --- a/qemu/fpu/softfloat.c +++ b/qemu/fpu/softfloat.c @@ -3452,6 +3452,21 @@ static float16 roundAndPackFloat16(flag zSign, int zExp, return packFloat16(zSign, zExp, zSig >> 13); } +/*---------------------------------------------------------------------------- +| If `a' is denormal and we are in flush-to-zero mode then set the +| input-denormal exception and return zero. Otherwise just return the value. +*----------------------------------------------------------------------------*/ +float16 float16_squash_input_denormal(float16 a, float_status *status) +{ + if (status->flush_inputs_to_zero) { + if (extractFloat16Exp(a) == 0 && extractFloat16Frac(a) != 0) { + float_raise(float_flag_input_denormal, status); + return make_float16(float16_val(a) & 0x8000); + } + } + return a; +} + static void normalizeFloat16Subnormal(uint32_t aSig, int *zExpPtr, uint32_t *zSigPtr) { diff --git a/qemu/header_gen.py b/qemu/header_gen.py index b4e3e82e..fbb45c07 100644 --- a/qemu/header_gen.py +++ b/qemu/header_gen.py @@ -497,6 +497,7 @@ symbols = ( 'float16_is_quiet_nan', 'float16_is_signaling_nan', 'float16_maybe_silence_nan', + 'float16_squash_input_denormal', 'float16_to_float32', 'float16_to_float64', 'float32ToCommonNaN', diff --git a/qemu/include/fpu/softfloat.h b/qemu/include/fpu/softfloat.h index b2121abc..69fb965d 100644 --- a/qemu/include/fpu/softfloat.h +++ b/qemu/include/fpu/softfloat.h @@ -289,6 +289,7 @@ void float_raise(uint8_t flags, float_status *status); | If `a' is denormal and we are in flush-to-zero mode then set the | input-denormal exception and return zero. Otherwise just return the value. *----------------------------------------------------------------------------*/ +float16 float16_squash_input_denormal(float16 a, float_status *status); float32 float32_squash_input_denormal(float32 a, float_status *status); float64 float64_squash_input_denormal(float64 a, float_status *status); diff --git a/qemu/m68k.h b/qemu/m68k.h index 532d30c0..e6c8bd73 100644 --- a/qemu/m68k.h +++ b/qemu/m68k.h @@ -491,6 +491,7 @@ #define float16_is_quiet_nan float16_is_quiet_nan_m68k #define float16_is_signaling_nan float16_is_signaling_nan_m68k #define float16_maybe_silence_nan float16_maybe_silence_nan_m68k +#define float16_squash_input_denormal float16_squash_input_denormal_m68k #define float16_to_float32 float16_to_float32_m68k #define float16_to_float64 float16_to_float64_m68k #define float32ToCommonNaN float32ToCommonNaN_m68k diff --git a/qemu/mips.h b/qemu/mips.h index 299d816c..7ce22446 100644 --- a/qemu/mips.h +++ b/qemu/mips.h @@ -491,6 +491,7 @@ #define float16_is_quiet_nan float16_is_quiet_nan_mips #define float16_is_signaling_nan float16_is_signaling_nan_mips #define float16_maybe_silence_nan float16_maybe_silence_nan_mips +#define float16_squash_input_denormal float16_squash_input_denormal_mips #define float16_to_float32 float16_to_float32_mips #define float16_to_float64 float16_to_float64_mips #define float32ToCommonNaN float32ToCommonNaN_mips diff --git a/qemu/mips64.h b/qemu/mips64.h index 3a6f09d7..08c68ce0 100644 --- a/qemu/mips64.h +++ b/qemu/mips64.h @@ -491,6 +491,7 @@ #define float16_is_quiet_nan float16_is_quiet_nan_mips64 #define float16_is_signaling_nan float16_is_signaling_nan_mips64 #define float16_maybe_silence_nan float16_maybe_silence_nan_mips64 +#define float16_squash_input_denormal float16_squash_input_denormal_mips64 #define float16_to_float32 float16_to_float32_mips64 #define float16_to_float64 float16_to_float64_mips64 #define float32ToCommonNaN float32ToCommonNaN_mips64 diff --git a/qemu/mips64el.h b/qemu/mips64el.h index dab784d5..520a091b 100644 --- a/qemu/mips64el.h +++ b/qemu/mips64el.h @@ -491,6 +491,7 @@ #define float16_is_quiet_nan float16_is_quiet_nan_mips64el #define float16_is_signaling_nan float16_is_signaling_nan_mips64el #define float16_maybe_silence_nan float16_maybe_silence_nan_mips64el +#define float16_squash_input_denormal float16_squash_input_denormal_mips64el #define float16_to_float32 float16_to_float32_mips64el #define float16_to_float64 float16_to_float64_mips64el #define float32ToCommonNaN float32ToCommonNaN_mips64el diff --git a/qemu/mipsel.h b/qemu/mipsel.h index 939de5a2..31bebed7 100644 --- a/qemu/mipsel.h +++ b/qemu/mipsel.h @@ -491,6 +491,7 @@ #define float16_is_quiet_nan float16_is_quiet_nan_mipsel #define float16_is_signaling_nan float16_is_signaling_nan_mipsel #define float16_maybe_silence_nan float16_maybe_silence_nan_mipsel +#define float16_squash_input_denormal float16_squash_input_denormal_mipsel #define float16_to_float32 float16_to_float32_mipsel #define float16_to_float64 float16_to_float64_mipsel #define float32ToCommonNaN float32ToCommonNaN_mipsel diff --git a/qemu/powerpc.h b/qemu/powerpc.h index 955524c0..bde83cf6 100644 --- a/qemu/powerpc.h +++ b/qemu/powerpc.h @@ -491,6 +491,7 @@ #define float16_is_quiet_nan float16_is_quiet_nan_powerpc #define float16_is_signaling_nan float16_is_signaling_nan_powerpc #define float16_maybe_silence_nan float16_maybe_silence_nan_powerpc +#define float16_squash_input_denormal float16_squash_input_denormal_powerpc #define float16_to_float32 float16_to_float32_powerpc #define float16_to_float64 float16_to_float64_powerpc #define float32ToCommonNaN float32ToCommonNaN_powerpc diff --git a/qemu/sparc.h b/qemu/sparc.h index ec9b72cb..aa01ea5e 100644 --- a/qemu/sparc.h +++ b/qemu/sparc.h @@ -491,6 +491,7 @@ #define float16_is_quiet_nan float16_is_quiet_nan_sparc #define float16_is_signaling_nan float16_is_signaling_nan_sparc #define float16_maybe_silence_nan float16_maybe_silence_nan_sparc +#define float16_squash_input_denormal float16_squash_input_denormal_sparc #define float16_to_float32 float16_to_float32_sparc #define float16_to_float64 float16_to_float64_sparc #define float32ToCommonNaN float32ToCommonNaN_sparc diff --git a/qemu/sparc64.h b/qemu/sparc64.h index f58c57cc..8828489c 100644 --- a/qemu/sparc64.h +++ b/qemu/sparc64.h @@ -491,6 +491,7 @@ #define float16_is_quiet_nan float16_is_quiet_nan_sparc64 #define float16_is_signaling_nan float16_is_signaling_nan_sparc64 #define float16_maybe_silence_nan float16_maybe_silence_nan_sparc64 +#define float16_squash_input_denormal float16_squash_input_denormal_sparc64 #define float16_to_float32 float16_to_float32_sparc64 #define float16_to_float64 float16_to_float64_sparc64 #define float32ToCommonNaN float32ToCommonNaN_sparc64 diff --git a/qemu/x86_64.h b/qemu/x86_64.h index 0b81bbf7..2eb879a4 100644 --- a/qemu/x86_64.h +++ b/qemu/x86_64.h @@ -491,6 +491,7 @@ #define float16_is_quiet_nan float16_is_quiet_nan_x86_64 #define float16_is_signaling_nan float16_is_signaling_nan_x86_64 #define float16_maybe_silence_nan float16_maybe_silence_nan_x86_64 +#define float16_squash_input_denormal float16_squash_input_denormal_x86_64 #define float16_to_float32 float16_to_float32_x86_64 #define float16_to_float64 float16_to_float64_x86_64 #define float32ToCommonNaN float32ToCommonNaN_x86_64