Let PowerPC world optionally build with -msoft-float. For FPU-less PowerPC
variations (e500 currently), this provides a gcc-level FPU emulation and is an alternative approach to the recently introduced kernel-level emulation (FPU_EMU). Approved by: cognet (mentor) MFp4: e500
This commit is contained in:
parent
39358b4e6c
commit
56ae1bed48
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=176530
@ -122,7 +122,7 @@ LIB2ADDEH = unwind-ia64.c unwind-sjlj.c unwind-c.c
|
||||
|
||||
.if ${TARGET_ARCH} == "powerpc"
|
||||
# from config/rs6000/t-ppccomm
|
||||
LIB2FUNCS_EXTRA = tramp.asm darwin-ldouble.c
|
||||
LIB2FUNCS_EXTRA = tramp.asm
|
||||
LIB2FUNCS_STATIC_EXTRA = eabi.asm
|
||||
.endif
|
||||
|
||||
|
@ -37,6 +37,7 @@ __FBSDID("$FreeBSD$");
|
||||
#include <sys/types.h>
|
||||
#include <machine/float.h>
|
||||
|
||||
#ifndef _SOFT_FLOAT
|
||||
static const int map[] = {
|
||||
1, /* round to nearest */
|
||||
0, /* round to zero */
|
||||
@ -52,3 +53,4 @@ __flt_rounds()
|
||||
__asm__ __volatile("mffs %0" : "=f"(fpscr));
|
||||
return map[(fpscr & 0x03)];
|
||||
}
|
||||
#endif
|
||||
|
@ -43,6 +43,7 @@ __FBSDID("$FreeBSD$");
|
||||
#include <sys/types.h>
|
||||
#include <ieeefp.h>
|
||||
|
||||
#ifndef _SOFT_FLOAT
|
||||
fp_except_t
|
||||
fpgetmask()
|
||||
{
|
||||
@ -51,3 +52,4 @@ fpgetmask()
|
||||
__asm__("mffs %0" : "=f"(fpscr));
|
||||
return ((fp_except_t)((fpscr >> 3) & 0x1f));
|
||||
}
|
||||
#endif
|
||||
|
@ -43,6 +43,7 @@ __FBSDID("$FreeBSD$");
|
||||
#include <sys/types.h>
|
||||
#include <ieeefp.h>
|
||||
|
||||
#ifndef _SOFT_FLOAT
|
||||
fp_rnd_t
|
||||
fpgetround()
|
||||
{
|
||||
@ -51,3 +52,4 @@ fpgetround()
|
||||
__asm__("mffs %0" : "=f"(fpscr));
|
||||
return ((fp_rnd_t)(fpscr & 0x3));
|
||||
}
|
||||
#endif
|
||||
|
@ -45,6 +45,7 @@
|
||||
#include <sys/types.h>
|
||||
#include <ieeefp.h>
|
||||
|
||||
#ifndef _SOFT_FLOAT
|
||||
#ifdef __weak_alias
|
||||
__weak_alias(fpgetsticky,_fpgetsticky)
|
||||
#endif
|
||||
@ -57,3 +58,4 @@ fpgetsticky()
|
||||
__asm__ __volatile("mffs %0" : "=f"(fpscr));
|
||||
return ((fp_except_t)((fpscr >> 25) & 0x1f));
|
||||
}
|
||||
#endif
|
||||
|
@ -43,6 +43,7 @@ __FBSDID("$FreeBSD$");
|
||||
#include <sys/types.h>
|
||||
#include <ieeefp.h>
|
||||
|
||||
#ifndef _SOFT_FLOAT
|
||||
fp_except_t
|
||||
fpsetmask(fp_except_t mask)
|
||||
{
|
||||
@ -55,3 +56,4 @@ fpsetmask(fp_except_t mask)
|
||||
__asm__ __volatile("mtfsf 0xff,%0" :: "f"(fpscr));
|
||||
return (old);
|
||||
}
|
||||
#endif
|
||||
|
@ -43,6 +43,7 @@ __FBSDID("$FreeBSD$");
|
||||
#include <sys/types.h>
|
||||
#include <ieeefp.h>
|
||||
|
||||
#ifndef _SOFT_FLOAT
|
||||
fp_rnd_t
|
||||
fpsetround(fp_rnd_t rnd_dir)
|
||||
{
|
||||
@ -55,3 +56,4 @@ fpsetround(fp_rnd_t rnd_dir)
|
||||
__asm__ __volatile("mtfsf 0xff,%0" :: "f"(fpscr));
|
||||
return (old);
|
||||
}
|
||||
#endif
|
||||
|
@ -82,8 +82,13 @@ extern const fenv_t __fe_dfl_env;
|
||||
#define _ENABLE_MASK ((FE_DIVBYZERO | FE_INEXACT | FE_INVALID | \
|
||||
FE_OVERFLOW | FE_UNDERFLOW) >> _FPUSW_SHIFT)
|
||||
|
||||
#ifndef _SOFT_FLOAT
|
||||
#define __mffs(__env) __asm __volatile("mffs %0" : "=f" (*(__env)))
|
||||
#define __mtfsf(__env) __asm __volatile("mtfsf 255,%0" : : "f" (__env))
|
||||
#else
|
||||
#define __mffs(__env)
|
||||
#define __mtfsf(__env)
|
||||
#endif
|
||||
|
||||
union __fpscr {
|
||||
double __d;
|
||||
|
@ -36,12 +36,16 @@
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
|
||||
#ifndef _SOFT_FLOAT
|
||||
__BEGIN_DECLS
|
||||
extern int __flt_rounds(void);
|
||||
__END_DECLS
|
||||
#define FLT_ROUNDS __flt_rounds()
|
||||
#else
|
||||
#define FLT_ROUNDS -1
|
||||
#endif
|
||||
|
||||
#define FLT_RADIX 2 /* b */
|
||||
#define FLT_ROUNDS __flt_rounds()
|
||||
#if __ISO_C_VISIBLE >= 1999
|
||||
#define FLT_EVAL_METHOD 1 /* operands promoted to double */
|
||||
#define DECIMAL_DIG 35 /* max precision in decimal digits */
|
||||
|
Loading…
Reference in New Issue
Block a user