[PATCH 3/4] Use libc_fe* macros in ldbl-128/e_expl.c.
Adhemerval Zanella
adhemerval.zanella@linaro.org
Wed Mar 25 15:42:58 GMT 2020
On 25/03/2020 12:07, Adhemerval Zanella wrote:
>
>
> On 25/03/2020 12:00, Adhemerval Zanella wrote:
>>
>>
>> On 25/03/2020 07:13, Stefan Liebler via Libc-alpha wrote:
>>> Unfortunately, this patch is responsible for testfails on x86_64:
>>>
>>> math/test-float128-exp.out:
>>> Failure: exp (-0x1p-10000): Exception "Underflow" set
>>> Failure: exp (-0x2p-16384): Exception "Underflow" set
>>> ...
>>>
>>> math/test-float128-cexp.out:
>>> Failure: Real part of: cexp (0x2p-16384 - 0x4p-1076 i): Exception "Underflow" set
>>> Failure: Real part of: cexp (0x2p-16384 - 0x8p-152 i): Exception "Underflow" set
>>
>> The sysdeps/x86/fpu/fenv_private.h states:
>>
>> 296 #ifdef __x86_64__
>> 297 /* The SSE rounding mode is used by soft-fp (libgcc and glibc) on
>> 298 x86_64, so that must be set for float128 computations. */
>> 299 # define SET_RESTORE_ROUNDF128(RM) \
>> 300 SET_RESTORE_ROUND_GENERIC (RM, libc_feholdsetround_sse, libc_feresetround_sse)
>>
>> So
>>
>>>> diff --git a/sysdeps/ieee754/ldbl-128/e_expl.c b/sysdeps/ieee754/ldbl-128/e_expl.c
>>>> index 37c1538c08..104ace1690 100644
>>>> --- a/sysdeps/ieee754/ldbl-128/e_expl.c
>>>> +++ b/sysdeps/ieee754/ldbl-128/e_expl.c
>>>> @@ -66,6 +66,7 @@
>>>> #include <inttypes.h>
>>>> #include <math-barriers.h>
>>>> #include <math_private.h>
>>>> +#include <fenv_private.h>
>>>> #include <math-underflow.h>
>>>> #include <stdlib.h>
>>>> #include "t_expl.h"
>>>> @@ -146,9 +147,10 @@ __ieee754_expl (_Float128 x)
>>>> union ieee854_long_double ex2_u, scale_u;
>>>> fenv_t oldenv;
>>>> - feholdexcept (&oldenv);
>>>> #ifdef FE_TONEAREST
>>>> - fesetround (FE_TONEAREST);
>>>> + libc_feholdexcept_setroundl (&oldenv, FE_TONEAREST);
>>
>> Should be libc_feholdexcept_setroundf128.
>
> But it does not see to help here, so I don't know what is failing as well.
Ok, so what is happening __sfp_handle_exceptions always use 387 exception
mode for FP_EX_OVERFLOW and FP_EX_UNDERFLOW:
config/i386/sfp-exceptions.c
79 if (_fex & FP_EX_OVERFLOW)
80 {
81 struct fenv temp;
82 asm volatile ("fnstenv\t%0" : "=m" (temp));
83 temp.__status_word |= FP_EX_OVERFLOW;
84 asm volatile ("fldenv\t%0" : : "m" (temp));
85 asm volatile ("fwait");
86 }
87 if (_fex & FP_EX_UNDERFLOW)
88 {
89 struct fenv temp;
90 asm volatile ("fnstenv\t%0" : "=m" (temp));
91 temp.__status_word |= FP_EX_UNDERFLOW;
92 asm volatile ("fldenv\t%0" : : "m" (temp));
93 asm volatile ("fwait");
94 }
Different that FP_EX_INEXACT, for instance, where __SSE_MATH__ sets
whether SSE is used or not.
So I think it is not safe to use the SSE variants for libc_*_testf128,
as for i387 we should use the default_* instead.
More information about the Libc-alpha
mailing list