This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
On 08/08/2017 11:10 AM, Steve Ellcey wrote: > @@ -44,6 +66,32 @@ __CONCATX(__,FUNC) (ITYPE x) > { > OTYPE result; > ITYPE temp; > + > +#if IREG_SIZE == 64 && OREG_SIZE == 32 > + if (__builtin_fabs (x) > INT32_MAX) > + { > + /* Converting large values to a 32 bit int may cause the frintx/fcvtza > + sequence to set both FE_INVALID and FE_INEXACT. To avoid this > + we save and restore the FE and only set one or the other. */ > + > + fenv_t env; > + int feflags; > + > + libc_feholdexcept (&env); > + asm ( "frintx" "\t%" IREGS "1, %" IREGS "2\n\t" > + "fcvtzs" "\t%" OREGS "0, %" IREGS "1" > + : "=r" (result), "=w" (temp) : "w" (x) ); > + feflags = libc_fetestexcept (FE_INVALID | FE_INEXACT); > + libc_fesetenv (&env); > + > + if (feflags & FE_INVALID) > + feraiseexcept (FE_INVALID); > + else if (feflags & FE_INEXACT) > + feraiseexcept (FE_INEXACT); > + > + return result; > + } > +#endif Surely it is simply better to do the conversion in one step, getting the proper flags set the first time. Like so. r~
Attachment:
zz
Description: Text document
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |