qemu-ppc
[Top][All Lists]
Advanced

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

Re: [PATCH] ppc/translate: Fix unordered f64/f128 comparisons


From: LemonBoy
Subject: Re: [PATCH] ppc/translate: Fix unordered f64/f128 comparisons
Date: Tue, 10 Nov 2020 10:06:35 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.4.0

On 10/11/20 04:24, Richard Henderson wrote:
> On 11/9/20 2:21 AM, LemonBoy wrote:
>> According to the PowerISA v3.1 reference, Table 68 "Actions for xscmpudp
>> - Part 1: Compare Unordered", whenever one of the two operands is a NaN
>> the SO bit is set while the other three bits are cleared.
>>
>> Apply the same change to xscmpuqp.
>>
>> The respective ordered counterparts are unaffected.
>>
>> Signed-off-by: Giuseppe Musacchio <thatlemon@gmail.com>
>> ---
>>  target/ppc/fpu_helper.c | 32 ++++++++++++++++++++++----------
>>  1 file changed, 22 insertions(+), 10 deletions(-)
>>
>> diff --git a/target/ppc/fpu_helper.c b/target/ppc/fpu_helper.c
>> index 9b8c8b70b6..b07ff66375 100644
>> --- a/target/ppc/fpu_helper.c
>> +++ b/target/ppc/fpu_helper.c
>> @@ -2479,13 +2479,11 @@ void helper_##op(CPUPPCState *env, uint32_t opcode,  
>>                     \
>>      if (float64_is_signaling_nan(xa->VsrD(0), &env->fp_status) ||        \
>>          float64_is_signaling_nan(xb->VsrD(0), &env->fp_status)) {        \
>>          vxsnan_flag = true;                                              \
>> -        cc = CRF_SO;                                                     \
>>          if (fpscr_ve == 0 && ordered) {                                  \
>>              vxvc_flag = true;                                            \
>>          }                                                                \
>>      } else if (float64_is_quiet_nan(xa->VsrD(0), &env->fp_status) ||     \
>>                 float64_is_quiet_nan(xb->VsrD(0), &env->fp_status)) {     \
>> -        cc = CRF_SO;                                                     \
>>          if (ordered) {                                                   \
>>              vxvc_flag = true;                                            \
>>          }                                                                \
>> @@ -2497,12 +2495,19 @@ void helper_##op(CPUPPCState *env, uint32_t opcode,  
>>                     \
>>          float_invalid_op_vxvc(env, 0, GETPC());                          \
>>      }                                                                    \
>>                                                                           \
>> -    if (float64_lt(xa->VsrD(0), xb->VsrD(0), &env->fp_status)) {         \
>> +    switch (float64_compare(xa->VsrD(0), xb->VsrD(0), &env->fp_status)) {\
>> +    case float_relation_less:                                            \
>>          cc |= CRF_LT;                                                    \
>> -    } else if (!float64_le(xa->VsrD(0), xb->VsrD(0), &env->fp_status)) { \
>> -        cc |= CRF_GT;                                                    \
>> -    } else {                                                             \
>> +        break;                                                           \
>> +    case float_relation_equal:                                           \
>>          cc |= CRF_EQ;                                                    \
>> +        break;                                                           \
>> +    case float_relation_greater:                                         \
>> +        cc |= CRF_GT;                                                    \
>> +        break;                                                           \
>> +    case float_relation_unordered:                                       \
>> +        cc |= CRF_SO;                                                    \
>> +        break;                                                           \
>>      }                          
> 
> This needs some more cleanup.  There's no point in checking for nans first;
> wait until you get to float_relation_unordered.
> 
> These macros should be made into straight functions.
> 

Will do, I tried to keep the amount of changed lines as small as possible
but I'm happy to nuke that macro: aligning the trailing slashes took more
time than finding and fixing the bug :)

> 
> r~
> 



reply via email to

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