m68k: really add fenv from musl-1.1.24
Somehow the first review merged only the commit log. FreeBSD doesn't have m68k anyway, so use fenv from musl with as less changes as possible. Change-Id: I6372af6679e6773fbb6bf4c8b5b30512971a97a6 Reviewed-on: https://review.haiku-os.org/c/haiku/+/3161 Reviewed-by: Alex von Gluck IV <[email protected]>
This commit is contained in:
committed by
Alex von Gluck IV
parent
48099e3e48
commit
425515d0ac
@@ -0,0 +1,63 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2005-2019 Rich Felker, et al.
|
||||||
|
*
|
||||||
|
* Part of MUSL, released under the MIT license.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _FENV_H_
|
||||||
|
#define _FENV_H_
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if __HAVE_68881__ || __mcffpu__
|
||||||
|
|
||||||
|
#define FE_INEXACT 8
|
||||||
|
#define FE_DIVBYZERO 16
|
||||||
|
#define FE_UNDERFLOW 32
|
||||||
|
#define FE_OVERFLOW 64
|
||||||
|
#define FE_INVALID 128
|
||||||
|
|
||||||
|
#define FE_ALL_EXCEPT 0xf8
|
||||||
|
|
||||||
|
#define FE_TONEAREST 0
|
||||||
|
#define FE_TOWARDZERO 16
|
||||||
|
#define FE_DOWNWARD 32
|
||||||
|
#define FE_UPWARD 48
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define FE_ALL_EXCEPT 0
|
||||||
|
#define FE_TONEAREST 0
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef unsigned fexcept_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
unsigned __control_register, __status_register, __instruction_address;
|
||||||
|
} fenv_t;
|
||||||
|
|
||||||
|
#define FE_DFL_ENV ((const fenv_t *) -1)
|
||||||
|
|
||||||
|
int feclearexcept(int);
|
||||||
|
int fegetexceptflag(fexcept_t *, int);
|
||||||
|
int feraiseexcept(int);
|
||||||
|
int fesetexceptflag(const fexcept_t *, int);
|
||||||
|
int fetestexcept(int);
|
||||||
|
|
||||||
|
int fegetround(void);
|
||||||
|
int fesetround(int);
|
||||||
|
|
||||||
|
int fegetenv(fenv_t *);
|
||||||
|
int feholdexcept(fenv_t *);
|
||||||
|
int fesetenv(const fenv_t *);
|
||||||
|
int feupdateenv(const fenv_t *);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
@@ -15,6 +15,8 @@
|
|||||||
# include <arch/riscv64/fenv.h>
|
# include <arch/riscv64/fenv.h>
|
||||||
#elif defined(__sparc__)
|
#elif defined(__sparc__)
|
||||||
# include <arch/sparc64/fenv.h>
|
# include <arch/sparc64/fenv.h>
|
||||||
|
#elif defined(__M68K__)
|
||||||
|
# include <arch/m68k/fenv.h>
|
||||||
#else
|
#else
|
||||||
# error There is no fenv.h for this architecture!
|
# error There is no fenv.h for this architecture!
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2005-2019 Rich Felker, et al.
|
||||||
|
*
|
||||||
|
* Part of MUSL, released under the MIT license.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <fenv.h>
|
||||||
|
|
||||||
|
/* Dummy functions for archs lacking fenv implementation */
|
||||||
|
|
||||||
|
int feclearexcept(int mask)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int feraiseexcept(int mask)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int fetestexcept(int mask)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int fegetround(void)
|
||||||
|
{
|
||||||
|
return FE_TONEAREST;
|
||||||
|
}
|
||||||
|
|
||||||
|
int __fesetround(int r)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int fegetenv(fenv_t *envp)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int fesetenv(const fenv_t *envp)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2005-2019 Rich Felker, et al.
|
||||||
|
*
|
||||||
|
* Part of MUSL, released under the MIT license.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <fenv.h>
|
||||||
|
#include <features.h>
|
||||||
|
|
||||||
|
#define hidden __attribute__((__visibility__("hidden")))
|
||||||
|
|
||||||
|
/* __fesetround wrapper for arch independent argument check */
|
||||||
|
|
||||||
|
hidden int __fesetround(int);
|
||||||
|
|
||||||
|
int fesetround(int r)
|
||||||
|
{
|
||||||
|
if (r != FE_TONEAREST
|
||||||
|
#ifdef FE_DOWNWARD
|
||||||
|
&& r != FE_DOWNWARD
|
||||||
|
#endif
|
||||||
|
#ifdef FE_UPWARD
|
||||||
|
&& r != FE_UPWARD
|
||||||
|
#endif
|
||||||
|
#ifdef FE_TOWARDZERO
|
||||||
|
&& r != FE_TOWARDZERO
|
||||||
|
#endif
|
||||||
|
)
|
||||||
|
return -1;
|
||||||
|
return __fesetround(r);
|
||||||
|
}
|
||||||
@@ -3,13 +3,17 @@ SubDir HAIKU_TOP src system libroot posix arch m68k ;
|
|||||||
local architecture = $(TARGET_ARCH) ;
|
local architecture = $(TARGET_ARCH) ;
|
||||||
|
|
||||||
UsePrivateSystemHeaders ;
|
UsePrivateSystemHeaders ;
|
||||||
|
UseHeaders [ FDirName $(HAIKU_TOP) headers compatibility bsd ] : true ;
|
||||||
|
#SubDirCcFlags -save-temps ;
|
||||||
|
|
||||||
local genericSources =
|
local genericSources =
|
||||||
|
fesetround.c
|
||||||
setjmp_save_sigs.c
|
setjmp_save_sigs.c
|
||||||
longjmp_return.c
|
longjmp_return.c
|
||||||
;
|
;
|
||||||
|
|
||||||
MergeObject <$(TARGET_ARCH)>posix_arch_$(TARGET_ARCH).o :
|
MergeObject <$(TARGET_ARCH)>posix_arch_$(TARGET_ARCH).o :
|
||||||
|
fenv.c
|
||||||
sigsetjmp.S
|
sigsetjmp.S
|
||||||
siglongjmp.S
|
siglongjmp.S
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,94 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2005-2019 Rich Felker, et al.
|
||||||
|
*
|
||||||
|
* Part of MUSL, released under the MIT license.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <fenv.h>
|
||||||
|
#include <features.h>
|
||||||
|
|
||||||
|
#define hidden __attribute__((__visibility__("hidden")))
|
||||||
|
|
||||||
|
#if __HAVE_68881__ || __mcffpu__
|
||||||
|
|
||||||
|
static unsigned getsr()
|
||||||
|
{
|
||||||
|
unsigned v;
|
||||||
|
__asm__ __volatile__ ("fmove.l %%fpsr,%0" : "=dm"(v));
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void setsr(unsigned v)
|
||||||
|
{
|
||||||
|
__asm__ __volatile__ ("fmove.l %0,%%fpsr" : : "dm"(v));
|
||||||
|
}
|
||||||
|
|
||||||
|
static unsigned getcr()
|
||||||
|
{
|
||||||
|
unsigned v;
|
||||||
|
__asm__ __volatile__ ("fmove.l %%fpcr,%0" : "=dm"(v));
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void setcr(unsigned v)
|
||||||
|
{
|
||||||
|
__asm__ __volatile__ ("fmove.l %0,%%fpcr" : : "dm"(v));
|
||||||
|
}
|
||||||
|
|
||||||
|
int feclearexcept(int mask)
|
||||||
|
{
|
||||||
|
if (mask & ~FE_ALL_EXCEPT) return -1;
|
||||||
|
setsr(getsr() & ~mask);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int feraiseexcept(int mask)
|
||||||
|
{
|
||||||
|
if (mask & ~FE_ALL_EXCEPT) return -1;
|
||||||
|
setsr(getsr() | mask);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int fetestexcept(int mask)
|
||||||
|
{
|
||||||
|
return getsr() & mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
int fegetround(void)
|
||||||
|
{
|
||||||
|
return getcr() & FE_UPWARD;
|
||||||
|
}
|
||||||
|
|
||||||
|
hidden int __fesetround(int r)
|
||||||
|
{
|
||||||
|
setcr((getcr() & ~FE_UPWARD) | r);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int fegetenv(fenv_t *envp)
|
||||||
|
{
|
||||||
|
envp->__control_register = getcr();
|
||||||
|
envp->__status_register = getsr();
|
||||||
|
__asm__ __volatile__ ("fmove.l %%fpiar,%0"
|
||||||
|
: "=dm"(envp->__instruction_address));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int fesetenv(const fenv_t *envp)
|
||||||
|
{
|
||||||
|
static const fenv_t default_env = { 0 };
|
||||||
|
if (envp == FE_DFL_ENV)
|
||||||
|
envp = &default_env;
|
||||||
|
setcr(envp->__control_register);
|
||||||
|
setsr(envp->__status_register);
|
||||||
|
__asm__ __volatile__ ("fmove.l %0,%%fpiar"
|
||||||
|
: : "dm"(envp->__instruction_address));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#include "fenv-generic.c"
|
||||||
|
|
||||||
|
#endif
|
||||||
Reference in New Issue
Block a user