Message ID | 20231228172026.2013007-13-adhemerval.zanella@linaro.org |
---|---|
State | New |
Headers | show |
Series | Improve rounding to interger function for C23 | expand |
On Thu, Dec 28, 2023 at 9:23 AM Adhemerval Zanella <adhemerval.zanella@linaro.org> wrote: > > It is not allowed anymore on ISO C23. > > Checked on x86_64-linux-gnu and i686-linux-gnu. > --- > sysdeps/i386/fpu/{s_trunc.S => s_trunc.c} | 37 +++++++++++---------- > sysdeps/i386/fpu/{s_truncf.S => s_truncf.c} | 37 +++++++++++---------- > 2 files changed, 38 insertions(+), 36 deletions(-) > rename sysdeps/i386/fpu/{s_trunc.S => s_trunc.c} (61%) > rename sysdeps/i386/fpu/{s_truncf.S => s_truncf.c} (61%) > > diff --git a/sysdeps/i386/fpu/s_trunc.S b/sysdeps/i386/fpu/s_trunc.c > similarity index 61% > rename from sysdeps/i386/fpu/s_trunc.S > rename to sysdeps/i386/fpu/s_trunc.c > index 145288bc8e..b071ad9750 100644 > --- a/sysdeps/i386/fpu/s_trunc.S > +++ b/sysdeps/i386/fpu/s_trunc.c > @@ -1,5 +1,5 @@ > -/* Truncate double value. > - Copyright (C) 1997-2023 Free Software Foundation, Inc. > +/* Round to integer, toward zero. i386 version. > + Copyright (C) 2023 Free Software Foundation, Inc. 2024. > This file is part of the GNU C Library. > > The GNU C Library is free software; you can redistribute it and/or > @@ -16,22 +16,23 @@ > License along with the GNU C Library; if not, see > <https://www.gnu.org/licenses/>. */ > > -#include <machine/asm.h> > +#define NO_MATH_REDIRECT > +#include <math.h> > +#include <fenv_private.h> > #include <libm-alias-double.h> > > -ENTRY(__trunc) > - fldl 4(%esp) > - subl $32, %esp > - cfi_adjust_cfa_offset (32) > - fnstenv 4(%esp) > - movl $0xc00, %edx > - orl 4(%esp), %edx > - movl %edx, (%esp) > - fldcw (%esp) > - frndint > - fldenv 4(%esp) > - addl $32, %esp > - cfi_adjust_cfa_offset (-32) > - ret > -END(__trunc) > +double > +__trunc (double x) > +{ > + fenv_t fenv; > + double r; > + > + libc_feholdexcept_setround_387 (&fenv, FE_TOWARDZERO); > + asm volatile ("frndint" : "=t" (r) : "0" (x)); > + /* Preserve "invalid" exceptions from sNaN input. */ > + fenv.__status_word |= libc_fetestexcept_387 (FE_INVALID); > + libc_fesetenv_387 (&fenv); > + > + return r; > +} > libm_alias_double (__trunc, trunc) > diff --git a/sysdeps/i386/fpu/s_truncf.S b/sysdeps/i386/fpu/s_truncf.c > similarity index 61% > rename from sysdeps/i386/fpu/s_truncf.S > rename to sysdeps/i386/fpu/s_truncf.c > index 7bdf0e5111..86d46ff660 100644 > --- a/sysdeps/i386/fpu/s_truncf.S > +++ b/sysdeps/i386/fpu/s_truncf.c > @@ -1,5 +1,5 @@ > -/* Truncate float value. > - Copyright (C) 1997-2023 Free Software Foundation, Inc. > +/* Round to integer, toward zero. i386 version. > + Copyright (C) 2023 Free Software Foundation, Inc. 2024. > This file is part of the GNU C Library. > > The GNU C Library is free software; you can redistribute it and/or > @@ -16,22 +16,23 @@ > License along with the GNU C Library; if not, see > <https://www.gnu.org/licenses/>. */ > > -#include <machine/asm.h> > +#define NO_MATH_REDIRECT > +#include <math.h> > +#include <fenv_private.h> > #include <libm-alias-float.h> > > -ENTRY(__truncf) > - flds 4(%esp) > - subl $32, %esp > - cfi_adjust_cfa_offset (32) > - fnstenv 4(%esp) > - movl $0xc00, %edx > - orl 4(%esp), %edx > - movl %edx, (%esp) > - fldcw (%esp) > - frndint > - fldenv 4(%esp) > - addl $32, %esp > - cfi_adjust_cfa_offset (-32) > - ret > -END(__truncf) > +float > +__truncf (float x) > +{ > + fenv_t fenv; > + float r; > + > + libc_feholdexcept_setround_387 (&fenv, FE_TOWARDZERO); > + asm volatile ("frndint" : "=t" (r) : "0" (x)); > + /* Preserve "invalid" exceptions from sNaN input. */ > + fenv.__status_word |= libc_fetestexcept_387 (FE_INVALID); > + libc_fesetenv_387 (&fenv); > + > + return r; > +} > libm_alias_float (__trunc, trunc) > -- > 2.34.1 >
diff --git a/sysdeps/i386/fpu/s_trunc.S b/sysdeps/i386/fpu/s_trunc.c similarity index 61% rename from sysdeps/i386/fpu/s_trunc.S rename to sysdeps/i386/fpu/s_trunc.c index 145288bc8e..b071ad9750 100644 --- a/sysdeps/i386/fpu/s_trunc.S +++ b/sysdeps/i386/fpu/s_trunc.c @@ -1,5 +1,5 @@ -/* Truncate double value. - Copyright (C) 1997-2023 Free Software Foundation, Inc. +/* Round to integer, toward zero. i386 version. + Copyright (C) 2023 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -16,22 +16,23 @@ License along with the GNU C Library; if not, see <https://www.gnu.org/licenses/>. */ -#include <machine/asm.h> +#define NO_MATH_REDIRECT +#include <math.h> +#include <fenv_private.h> #include <libm-alias-double.h> -ENTRY(__trunc) - fldl 4(%esp) - subl $32, %esp - cfi_adjust_cfa_offset (32) - fnstenv 4(%esp) - movl $0xc00, %edx - orl 4(%esp), %edx - movl %edx, (%esp) - fldcw (%esp) - frndint - fldenv 4(%esp) - addl $32, %esp - cfi_adjust_cfa_offset (-32) - ret -END(__trunc) +double +__trunc (double x) +{ + fenv_t fenv; + double r; + + libc_feholdexcept_setround_387 (&fenv, FE_TOWARDZERO); + asm volatile ("frndint" : "=t" (r) : "0" (x)); + /* Preserve "invalid" exceptions from sNaN input. */ + fenv.__status_word |= libc_fetestexcept_387 (FE_INVALID); + libc_fesetenv_387 (&fenv); + + return r; +} libm_alias_double (__trunc, trunc) diff --git a/sysdeps/i386/fpu/s_truncf.S b/sysdeps/i386/fpu/s_truncf.c similarity index 61% rename from sysdeps/i386/fpu/s_truncf.S rename to sysdeps/i386/fpu/s_truncf.c index 7bdf0e5111..86d46ff660 100644 --- a/sysdeps/i386/fpu/s_truncf.S +++ b/sysdeps/i386/fpu/s_truncf.c @@ -1,5 +1,5 @@ -/* Truncate float value. - Copyright (C) 1997-2023 Free Software Foundation, Inc. +/* Round to integer, toward zero. i386 version. + Copyright (C) 2023 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -16,22 +16,23 @@ License along with the GNU C Library; if not, see <https://www.gnu.org/licenses/>. */ -#include <machine/asm.h> +#define NO_MATH_REDIRECT +#include <math.h> +#include <fenv_private.h> #include <libm-alias-float.h> -ENTRY(__truncf) - flds 4(%esp) - subl $32, %esp - cfi_adjust_cfa_offset (32) - fnstenv 4(%esp) - movl $0xc00, %edx - orl 4(%esp), %edx - movl %edx, (%esp) - fldcw (%esp) - frndint - fldenv 4(%esp) - addl $32, %esp - cfi_adjust_cfa_offset (-32) - ret -END(__truncf) +float +__truncf (float x) +{ + fenv_t fenv; + float r; + + libc_feholdexcept_setround_387 (&fenv, FE_TOWARDZERO); + asm volatile ("frndint" : "=t" (r) : "0" (x)); + /* Preserve "invalid" exceptions from sNaN input. */ + fenv.__status_word |= libc_fetestexcept_387 (FE_INVALID); + libc_fesetenv_387 (&fenv); + + return r; +} libm_alias_float (__trunc, trunc)