On 7/23/20 7:47 PM, LIU Zhiwei wrote: > > > On 2020/7/24 8:28, Richard Henderson wrote: >> If a 32-bit input is not properly nanboxed, then the input is >> replaced with the default qnan. >> >> Signed-off-by: Richard Henderson <richard.hender...@linaro.org> >> --- >> target/riscv/internals.h | 11 +++++++ >> target/riscv/fpu_helper.c | 64 ++++++++++++++++++++++++++++----------- >> 2 files changed, 57 insertions(+), 18 deletions(-) >> >> diff --git a/target/riscv/internals.h b/target/riscv/internals.h >> index 9f4ba7d617..f1a546dba6 100644 >> --- a/target/riscv/internals.h >> +++ b/target/riscv/internals.h >> @@ -43,4 +43,15 @@ static inline uint64_t nanbox_s(float32 f) >> return f | MAKE_64BIT_MASK(32, 32); >> } >> +static inline float32 check_nanbox_s(uint64_t f) >> +{ >> + uint64_t mask = MAKE_64BIT_MASK(32, 32); >> + >> + if (likely((f & mask) == mask)) { >> + return (uint32_t)f; >> + } else { >> + return 0x7fc00000u; /* default qnan */ >> + } >> +} >> + > If possible, > > +static inline float32 check_nanbox(uint64_t f, uint32_t flen) > +{ > + uint64_t mask = MAKE_64BIT_MASK(flen, 64 - flen); > + > + if (likely((f & mask) == mask)) { > + return (uint32_t)f; > + } else { > + return (flen == 32) ? 0x7fc00000u : 0x7e00u; /* default qnan */ > + } > +}
The difficulty of choosing the proper default qnan is an example of why we should *not* attempt to make this function fully general, but should instead define separate functions for each type. E.g. static inline float16 check_nanbox_h(uint64_t f); static inline bfloat16 check_nanbox_b(uint64_t f); r~