On Mon, 2007-03-19 at 20:37 +0000, Julian Seward wrote:
> > Note that float64_to_uint64 functions are not correct, as they won't
> > return results between INT64_MAX and UINT64_MAX. Hope someone may know
> > the proper solution for this.
> 
> How about this?

Yes, it seems to be the correct way, but thinking more about the
problem, it appeared to me that the implementation could be even easier
than yours. It seems to me that this may be sufficient:
uint64_t float64_to_uint64 (float64 a STATUS_PARAM)
{
    int64_t v;

    v = llrint(a + (float64)INT64_MIN);

    return v - INT64_MIN;
}
uint64_t float64_to_uint64_round_to_zero (float64 a STATUS_PARAM)
{
    int64_t v;

    v = (int64_t)(a + (float64)INT64_MIN);

    return v - INT64_MIN;
}

For "not-native" softfloat, this gives:
uint64_t float64_to_uint64 (float64 a STATUS_PARAM)
{
    int64_t v;

    v = int64_to_float64(INT64_MIN STATUS_VAR);
    v = float64_to_int64((a + v) STATUS_VAR);

    return v - INT64_MIN;
}

uint64_t float64_to_uint64_round_to_zero (float64 a STATUS_PARAM)
{
    int64_t v;

    v = int64_to_float64(INT64_MIN STATUS_VAR);
    v = float64_to_int64_round_to_zero((a + v) STATUS_VAR);

    return v - INT64_MIN;
}

This should also give the correct result for NaN and overflows, if we
rely to the fact float64_to_int64 is correct. Please tell me if I'm
wrong !

-- 
J. Mayer <[EMAIL PROTECTED]>
Never organized



_______________________________________________
Qemu-devel mailing list
Qemu-devel@nongnu.org
http://lists.nongnu.org/mailman/listinfo/qemu-devel

Reply via email to