diff options
| author | Waldemar Brodkorb <wbx@openadk.org> | 2025-04-26 19:13:59 +0200 | 
|---|---|---|
| committer | Waldemar Brodkorb <wbx@openadk.org> | 2025-04-27 05:03:56 +0200 | 
| commit | d69c496886cd57f95a13f4f883eb1a5b73be83ab (patch) | |
| tree | d7d8aa34b6cd2bf01e2631713858af67e57009d6 /libc | |
| parent | 12d8572ae301c5ce9a622f658894bdfc88c8d724 (diff) | |
m68k: add fenv support from glibc
Diffstat (limited to 'libc')
| -rw-r--r-- | libc/sysdeps/linux/m68k/bits/fenv.h | 98 | ||||
| -rw-r--r-- | libc/sysdeps/linux/m68k/fpu_control.h | 77 | 
2 files changed, 120 insertions, 55 deletions
| diff --git a/libc/sysdeps/linux/m68k/bits/fenv.h b/libc/sysdeps/linux/m68k/bits/fenv.h index b07f0ab51..37c5fe829 100644 --- a/libc/sysdeps/linux/m68k/bits/fenv.h +++ b/libc/sysdeps/linux/m68k/bits/fenv.h @@ -1,5 +1,4 @@ -/* Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation, Inc. -   This file is part of the GNU C Library. +/* Copyright (C) 1997-2025 Free Software Foundation, Inc.     The GNU C Library is free software; you can redistribute it and/or     modify it under the terms of the GNU Lesser General Public @@ -12,31 +11,38 @@     Lesser General Public License for more details.     You should have received a copy of the GNU Lesser General Public -   License along with the GNU C Library; if not, see -   <http://www.gnu.org/licenses/>.  */ +   License along with the GNU C Library.  If not, see +   <https://www.gnu.org/licenses/>.  */  #ifndef _FENV_H  # error "Never use <bits/fenv.h> directly; include <fenv.h> instead."  #endif +#if defined __HAVE_68881__ || defined __HAVE_FPU__ || defined __mcffpu__ +  /* Define bits representing the exception.  We use the bit positions of     the appropriate bits in the FPSR Accrued Exception Byte.  */  enum    { -    FE_INEXACT = 1 << 3, -#define FE_INEXACT	FE_INEXACT -    FE_DIVBYZERO = 1 << 4, -#define FE_DIVBYZERO	FE_DIVBYZERO -    FE_UNDERFLOW = 1 << 5, -#define FE_UNDERFLOW	FE_UNDERFLOW -    FE_OVERFLOW = 1 << 6, -#define FE_OVERFLOW	FE_OVERFLOW -    FE_INVALID = 1 << 7 -#define FE_INVALID	FE_INVALID +    FE_INEXACT = +# define FE_INEXACT	(1 << 3) +      FE_INEXACT, +    FE_DIVBYZERO = +# define FE_DIVBYZERO	(1 << 4) +      FE_DIVBYZERO, +    FE_UNDERFLOW = +# define FE_UNDERFLOW	(1 << 5) +      FE_UNDERFLOW, +    FE_OVERFLOW = +# define FE_OVERFLOW	(1 << 6) +      FE_OVERFLOW, +    FE_INVALID = +# define FE_INVALID	(1 << 7) +      FE_INVALID    }; -#define FE_ALL_EXCEPT \ +# define FE_ALL_EXCEPT \  	(FE_INEXACT | FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW | FE_INVALID)  /* The m68k FPU supports all of the four defined rounding modes.  We use @@ -44,21 +50,45 @@ enum     appropriate macros.  */  enum    { -    FE_TONEAREST = 0, -#define FE_TONEAREST	FE_TONEAREST -    FE_TOWARDZERO = 1 << 4, -#define FE_TOWARDZERO	FE_TOWARDZERO -    FE_DOWNWARD = 2 << 4, -#define FE_DOWNWARD	FE_DOWNWARD -    FE_UPWARD = 3 << 4 -#define FE_UPWARD	FE_UPWARD +    FE_TONEAREST = +# define FE_TONEAREST	0 +      FE_TONEAREST, +    FE_TOWARDZERO = +# define FE_TOWARDZERO	(1 << 4) +      FE_TOWARDZERO, +    FE_DOWNWARD = +# define FE_DOWNWARD	(2 << 4) +      FE_DOWNWARD, +    FE_UPWARD = +# define FE_UPWARD	(3 << 4) +      FE_UPWARD    }; +#else + +/* In the soft-float case, only rounding to nearest is supported, with +   no exceptions.  */ + +# define FE_ALL_EXCEPT 0 + +enum +  { +    __FE_UNDEFINED = -1, + +    FE_TONEAREST = +# define FE_TONEAREST	0 +      FE_TONEAREST +  }; + +#endif +  /* Type representing exception flags.  */  typedef unsigned int fexcept_t; +#if defined __HAVE_68881__ || defined __HAVE_FPU__ || defined __mcffpu__ +  /* Type representing floating-point environment.  This structure     corresponds to the layout of the block written by `fmovem'.  */  typedef struct @@ -69,10 +99,30 @@ typedef struct    }  fenv_t; +#else + +/* Keep ABI compatibility with the type used in the generic +   bits/fenv.h, formerly used for no-FPU ColdFire.  */ +typedef struct +  { +    fexcept_t __excepts; +  } +fenv_t; + +#endif +  /* If the default argument is used we use this value.  */  #define FE_DFL_ENV	((const fenv_t *) -1) -#ifdef __USE_GNU +#if defined __USE_GNU && (defined __HAVE_68881__	\ +			  || defined __HAVE_FPU__	\ +			  || defined __mcffpu__)  /* Floating-point environment where none of the exceptions are masked.  */  # define FE_NOMASK_ENV	((const fenv_t *) -2)  #endif + +/* Type representing floating-point control modes.  */ +typedef unsigned int femode_t; + +/* Default floating-point control modes.  */ +# define FE_DFL_MODE	((const femode_t *) -1L) diff --git a/libc/sysdeps/linux/m68k/fpu_control.h b/libc/sysdeps/linux/m68k/fpu_control.h index 35ad95e6d..c3a9c6326 100644 --- a/libc/sysdeps/linux/m68k/fpu_control.h +++ b/libc/sysdeps/linux/m68k/fpu_control.h @@ -1,6 +1,5 @@  /* 68k FPU control word definitions. -   Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. -   This file is part of the GNU C Library. +   Copyright (C) 1996-2025 Free Software Foundation, Inc.     The GNU C Library is free software; you can redistribute it and/or     modify it under the terms of the GNU Lesser General Public @@ -13,8 +12,8 @@     Lesser General Public License for more details.     You should have received a copy of the GNU Lesser General Public -   License along with the GNU C Library; if not, see -   <http://www.gnu.org/licenses/>.  */ +   License along with the GNU C Library.  If not, see +   <https://www.gnu.org/licenses/>.  */  #ifndef _FPU_CONTROL_H  #define _FPU_CONTROL_H @@ -29,9 +28,9 @@   * 12     -> enable trap for OVFL exception   * 11     -> enable trap for UNFL exception   * 10     -> enable trap for DZ exception - *  9     -> enable trap for INEX2 exception - *  8     -> enable trap for INEX1 exception - *  7-6   -> Precision Control + *  9     -> enable trap for INEX2 exception (INEX on Coldfire) + *  8     -> enable trap for INEX1 exception (IDE on Coldfire) + *  7-6   -> Precision Control (only bit 6 is used on Coldfire)   *  5-4   -> Rounding Control   *  3-0   -> zero (read as 0, write as 0)   * @@ -53,50 +52,66 @@  #include <features.h> +#if defined (__mcoldfire__) && !defined (__mcffpu__) + +# define _FPU_RESERVED 0xffffffff +# define _FPU_DEFAULT  0x00000000 +# define _FPU_GETCW(cw) ((cw) = 0) +# define _FPU_SETCW(cw) ((void) (cw)) + +#else +  /* masking of interrupts */ -#define _FPU_MASK_BSUN  0x8000 -#define _FPU_MASK_SNAN  0x4000 -#define _FPU_MASK_OPERR 0x2000 -#define _FPU_MASK_OVFL  0x1000 -#define _FPU_MASK_UNFL  0x0800 -#define _FPU_MASK_DZ    0x0400 -#define _FPU_MASK_INEX1 0x0200 -#define _FPU_MASK_INEX2 0x0100 +# define _FPU_MASK_BSUN  0x8000 +# define _FPU_MASK_SNAN  0x4000 +# define _FPU_MASK_OPERR 0x2000 +# define _FPU_MASK_OVFL  0x1000 +# define _FPU_MASK_UNFL  0x0800 +# define _FPU_MASK_DZ    0x0400 +# define _FPU_MASK_INEX1 0x0200 +# define _FPU_MASK_INEX2 0x0100  /* precision control */ -#define _FPU_EXTENDED 0x00   /* RECOMMENDED */ -#define _FPU_DOUBLE   0x80 -#define _FPU_SINGLE   0x40     /* DO NOT USE */ +# ifdef __mcoldfire__ +#  define _FPU_DOUBLE   0x00 +# else +#  define _FPU_EXTENDED 0x00   /* RECOMMENDED */ +#  define _FPU_DOUBLE   0x80 +# endif +# define _FPU_SINGLE   0x40     /* DO NOT USE */  /* rounding control */ -#define _FPU_RC_NEAREST 0x00    /* RECOMMENDED */ -#define _FPU_RC_ZERO    0x10 -#define _FPU_RC_DOWN    0x20 -#define _FPU_RC_UP      0x30 +# define _FPU_RC_NEAREST 0x00    /* RECOMMENDED */ +# define _FPU_RC_ZERO    0x10 +# define _FPU_RC_DOWN    0x20 +# define _FPU_RC_UP      0x30 -#define _FPU_RESERVED 0xFFFF000F  /* Reserved bits in fpucr */ +# ifdef __mcoldfire__ +#  define _FPU_RESERVED 0xFFFF800F +# else +#  define _FPU_RESERVED 0xFFFF000F  /* Reserved bits in fpucr */ +# endif  /* Now two recommended fpucr */  /* The fdlibm code requires no interrupts for exceptions.  Don't     change the rounding mode, it would break long double I/O!  */ -#define _FPU_DEFAULT  0x00000000 +# define _FPU_DEFAULT  0x00000000  /* IEEE:  same as above, but exceptions.  We must make it non-zero so     that __setfpucw works.  This bit will be ignored.  */ -#define _FPU_IEEE     0x00000001 +# define _FPU_IEEE     0x00000001 + +/* Macros for accessing the hardware control word.  */ +# define _FPU_GETCW(cw) __asm__ ("fmove%.l %!, %0" : "=dm" (cw)) +# define _FPU_SETCW(cw) __asm__ volatile ("fmove%.l %0, %!" : : "dm" (cw)) +#endif  /* Type of the control word.  */  typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__SI__))); -/* Macros for accessing the hardware control word.  */ -#define _FPU_GETCW(cw) __asm__ ("fmove%.l %!, %0" : "=dm" (cw)) -#define _FPU_SETCW(cw) __asm__ __volatile__ ("fmove%.l %0, %!" : : "dm" (cw)) - -#if 0  /* Default control word set at startup.  */  extern fpu_control_t __fpu_control; -#endif  #endif /* _M68K_FPU_CONTROL_H */ | 
