On 11 December 2013 20:39, Tom Musta <tommu...@gmail.com> wrote:
> On 12/11/2013 1:53 PM, Peter Maydell wrote:
>> On 11 December 2013 19:16, Tom Musta <tommu...@gmail.com> wrote:
>>>  uint32 float64_to_uint32( float64 a STATUS_PARAM )
>>>  {
>>> -    int64_t v;
>>> +    uint64_t v;
>>>      uint32 res;
>>>
>>> -    v = float64_to_int64(a STATUS_VAR);
>>> -    if (v < 0) {
>>> -        res = 0;
>>> -        float_raise( float_flag_invalid STATUS_VAR);
>>> -    } else if (v > 0xffffffff) {
>>> +    v = float64_to_uint64(a STATUS_VAR);
>>> +    if (v > 0xffffffff) {
>>>          res = 0xffffffff;
>>> +        STATUS(float_exception_flags) &= ~float_flag_inexact;
>>
>> The IEEE exception flags are cumulative (ie never get cleared
>> except by guest program explicit request); this change means
>> that if a previous operation raised the inexact flag you've just
>> lost that.
>>
>> thanks
>> -- PMM
>>
> Thank you, Peter.  I will fix.

I'm partway through fixing this bug in an implementation of
float*_to_uint16 which the ARM AArch64 needs. I think the
cleanest approach to this looks like this:

uint32 float64_to_uint32( float64 a STATUS_PARAM )
{
    int64_t v;
    uint32 res;
    int old_exc_flags = get_float_exception_flags(status);

    v = float64_to_uint64(a STATUS_VAR);
    if (v > 0xffffffff) {
        res = 0xffffffff;
    } else {
        return v;
    }
    set_float_exception_flags(old_exc_flags);
    float_raise(float_flag_invalid STATUS_VAR);
    return res;
}

thanks
-- PMM

Reply via email to