qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: [PATCH v8 16/35] Hexagon (target/hexagon/conv_emu.[ch]) utility func


From: Taylor Simpson
Subject: RE: [PATCH v8 16/35] Hexagon (target/hexagon/conv_emu.[ch]) utility functions
Date: Thu, 18 Mar 2021 18:03:13 +0000


> -----Original Message-----
> From: Richard Henderson <richard.henderson@linaro.org>
> Sent: Thursday, March 18, 2021 10:36 AM
> To: Taylor Simpson <tsimpson@quicinc.com>; qemu-devel@nongnu.org
> Cc: philmd@redhat.com; alex.bennee@linaro.org; laurent@vivier.eu;
> ale@rev.ng; Brian Cain <bcain@quicinc.com>
> Subject: Re: [PATCH v8 16/35] Hexagon (target/hexagon/conv_emu.[ch])
> utility functions
>
> On 3/18/21 8:11 AM, Taylor Simpson wrote:
> > Actually, softfloat raises inexact instead of invalid.  Is there a way to
> override?
>
> Not true:
>
>      switch (p.cls) {
>      case float_class_snan:
>      case float_class_qnan:
>          s->float_exception_flags = orig_flags | float_flag_invalid;
>          return max;

Sorry, I was mistaken.  The difference is in the negative case.
    } else if (float32_is_neg(RsV)) {
        float_raise(float_flag_invalid, &env->fp_status);
        RddV = 0;

For many cases, this is what softfloat does.  The difference comes  when value 
is both negative and near zero (exponent is negative).  Softfloat checks the 
exponent before checking the sign.  round_to_int does this first
        if (a.exp < 0) {
            bool one;
            /* all fractional */
            s->float_exception_flags |= float_flag_inexact;
Then it sets
     a.cls = float_class_zero;
So round_to_uint_and_pack does this
    case float_class_zero:
        return 0;


Here's an example from float_convs
    from single: f32(-0x1.31f75000000000000000p-40:0xab98fba8)
Softfloat:to uint64: 0 (INEXACT )
Hexagon:to uint64: 0 (INVALID)


So, just looking at the float_convs tests the Hexagon version of f32->uint64 
would be
    if (float32_is_neg(RsV) && !float32_is_any_nan(RsV)) {
        float_raise(float_flag_invalid, &env->fp_status);
        RddV = 0;
    } else {
        RddV = float32_to_uint64_round_to_zero(RsV, &env->fp_status);
    }


Thanks,
Taylor

reply via email to

[Prev in Thread] Current Thread [Next in Thread]