On 12 May 2018 at 01:42, Richard Henderson <richard.hender...@linaro.org> wrote:
> From: Peter Maydell <peter.mayd...@linaro.org>
>
> In float-to-integer conversion, if the floating point input
> converts exactly to the largest or smallest integer that
> fits in to the result type, this is not an overflow.
> In this situation we were producing the correct result value,
> but were incorrectly setting the Invalid flag.
> For example for Arm A64, "FCVTAS w0, d0" on an input of
> 0x41dfffffffc00000 should produce 0x7fffffff and set no flags.
>
> Fix the boundary case to take the right half of the if()
> statements.
>
> This fixes a regression from 2.11 introduced by the softfloat
> refactoring.
>
> Cc: qemu-sta...@nongnu.org
> Fixes: ab52f973a50
> Signed-off-by: Peter Maydell <peter.mayd...@linaro.org>

This is missing your Signed-off-by: line (and a reviewed-by
would be nice too :-))

> ---
>  fpu/softfloat.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/fpu/softfloat.c b/fpu/softfloat.c
> index b39c0c6fbb..bc0f52fa54 100644
> --- a/fpu/softfloat.c
> +++ b/fpu/softfloat.c
> @@ -1368,14 +1368,14 @@ static int64_t round_to_int_and_pack(FloatParts in, 
> int rmode,
>              r = UINT64_MAX;
>          }
>          if (p.sign) {
> -            if (r < -(uint64_t) min) {
> +            if (r <= -(uint64_t) min) {
>                  return -r;
>              } else {
>                  s->float_exception_flags = orig_flags | float_flag_invalid;
>                  return min;
>              }
>          } else {
> -            if (r < max) {
> +            if (r <= max) {
>                  return r;
>              } else {
>                  s->float_exception_flags = orig_flags | float_flag_invalid;
> --
> 2.17.0

thanks
-- PMM

Reply via email to