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] |