qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] Help with softfloat.c code


From: Programmingkid
Subject: [Qemu-devel] Help with softfloat.c code
Date: Mon, 17 Sep 2018 13:48:12 -0400

In the softfloat.c file there is a function called float64_add(). What I need 
is a way to pack and canonicalize a FloatParts value. There doesn't appear to 
be any way.  This is what I have tried so far, but the results are not good. 
The intermediate_result and the rounded_result should be close to each other. 
What currently happens is the values are very far from each other. 

float64 __attribute__((flatten)) float64_add(float64 a, float64 b,
                                             float_status *status)
{
    FloatParts pa = float64_unpack_canonical(a, status);
    FloatParts pb = float64_unpack_canonical(b, status);
    FloatParts pr = addsub_floats(pa, pb, false, status);
    
    FloatParts intermediate_parts = canonicalize(pr, &float64_params, status);
    float64 intermediate_result = float64_pack_raw(intermediate_parts);
    
    float64 rounded_result = float64_round_pack_canonical(pr, status);
    
    if (intermediate_result != rounded_result) {
        printf("a = 0x%" PRIx64 "\n", a);
        printf("b = 0x%" PRIx64 "\n", b);
        printf("intermediate result: 0x%" PRIx64 "\n", intermediate_result);
        printf("rounded result: 0x%" PRIx64 "\n", rounded_result);
    }
    
    return rounded_result;
}


Here is some example output:

a = 0x40b11f0000000000                          4383
b = 0x4076d00000000000                          365
intermediate result: 0x40d0000000000000         16384
rounded result: 0x40b28c0000000000              4748

Here the intermediate result is way bigger than the rounded result. 

What I hope to do is implement a PowerPC CPU flag that indicates if an rounded 
result is inexact.


reply via email to

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