Max Filippov <jcmvb...@gmail.com> writes:
> target/xtensa, the only user of NO_SIGNALING_NANS macro has FPU > implementations with and without the corresponding property. With > NO_SIGNALING_NANS being a macro they cannot be a part of the same QEMU > executable. > Replace macro with new property in float_status to allow cores with > different FPU implementations coexist. > > Cc: Peter Maydell <peter.mayd...@linaro.org> > Cc: "Alex Bennée" <alex.ben...@linaro.org> > Signed-off-by: Max Filippov <jcmvb...@gmail.com> > --- > fpu/softfloat-specialize.inc.c | 228 ++++++++++++++++---------------- > include/fpu/softfloat-helpers.h | 5 + > include/fpu/softfloat-types.h | 1 + > 3 files changed, 117 insertions(+), 117 deletions(-) > > diff --git a/fpu/softfloat-specialize.inc.c b/fpu/softfloat-specialize.inc.c > index 44f5b661f831..b26bc039b0b6 100644 > --- a/fpu/softfloat-specialize.inc.c > +++ b/fpu/softfloat-specialize.inc.c > @@ -79,13 +79,6 @@ this code that are retained. > * version 2 or later. See the COPYING file in the top-level directory. > */ > > -/* Define for architectures which deviate from IEEE in not supporting > - * signaling NaNs (so all NaNs are treated as quiet). > - */ > -#if defined(TARGET_XTENSA) > -#define NO_SIGNALING_NANS 1 > -#endif > - > /* Define how the architecture discriminates signaling NaNs. > * This done with the most significant bit of the fraction. > * In IEEE 754-1985 this was implementation defined, but in IEEE 754-2008 > @@ -111,12 +104,12 @@ static inline bool snan_bit_is_one(float_status *status) > > static bool parts_is_snan_frac(uint64_t frac, float_status *status) > { > -#ifdef NO_SIGNALING_NANS > - return false; > -#else > - bool msb = extract64(frac, DECOMPOSED_BINARY_POINT - 1, 1); > - return msb == snan_bit_is_one(status); > -#endif > + if (status->no_signaling_nans) { > + return false; I have no objection in principle but seeing as we go to the trouble of allowing snan_bit_is_one() to constant fold away I think it would be worth doing the same with a no_signalling_nans(status). We can then avoid an admittedly well predicted test for the non XTENSA case. > + } else { > + bool msb = extract64(frac, DECOMPOSED_BINARY_POINT - 1, 1); > + return msb == snan_bit_is_one(status); > + } > } > > > /*---------------------------------------------------------------------------- > @@ -170,9 +163,10 @@ static FloatParts parts_default_nan(float_status *status) > > static FloatParts parts_silence_nan(FloatParts a, float_status *status) > { > -#ifdef NO_SIGNALING_NANS > - g_assert_not_reached(); We could then keep the assert: g_assert(!no_signaling_nan(status)) <snip> > return status->tininess_before_rounding; > diff --git a/include/fpu/softfloat-types.h b/include/fpu/softfloat-types.h > index 7680193ebc1c..10bd208e559f 100644 > --- a/include/fpu/softfloat-types.h > +++ b/include/fpu/softfloat-types.h > @@ -167,6 +167,7 @@ typedef struct float_status { > bool default_nan_mode; > /* not always used -- see snan_bit_is_one() in > softfloat-specialize.h */ and then expand this comment: /* the flags bellow are not used on all specializations and may * constant fold away (see snan_bit_is_one()/no_signalling_nans() in * softfloat-specialize.h) */ > bool snan_bit_is_one; > + bool no_signaling_nans; > } float_status; > > #endif /* SOFTFLOAT_TYPES_H */ -- Alex Bennée