From 69575dab5278af6417ba186bc878ac07a058e66c Mon Sep 17 00:00:00 2001 From: raj Date: Sun, 24 Feb 2008 19:22:53 +0000 Subject: 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 --- gnu/lib/libgcc/Makefile | 2 +- lib/libc/powerpc/gen/flt_rounds.c | 2 ++ lib/libc/powerpc/gen/fpgetmask.c | 2 ++ lib/libc/powerpc/gen/fpgetround.c | 2 ++ lib/libc/powerpc/gen/fpgetsticky.c | 2 ++ lib/libc/powerpc/gen/fpsetmask.c | 2 ++ lib/libc/powerpc/gen/fpsetround.c | 2 ++ lib/msun/powerpc/fenv.h | 5 +++++ sys/powerpc/include/float.h | 6 +++++- 9 files changed, 23 insertions(+), 2 deletions(-) diff --git a/gnu/lib/libgcc/Makefile b/gnu/lib/libgcc/Makefile index 82bf504..fa8a26f 100644 --- a/gnu/lib/libgcc/Makefile +++ b/gnu/lib/libgcc/Makefile @@ -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 diff --git a/lib/libc/powerpc/gen/flt_rounds.c b/lib/libc/powerpc/gen/flt_rounds.c index ec32a36..6294be7 100644 --- a/lib/libc/powerpc/gen/flt_rounds.c +++ b/lib/libc/powerpc/gen/flt_rounds.c @@ -37,6 +37,7 @@ __FBSDID("$FreeBSD$"); #include #include +#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 diff --git a/lib/libc/powerpc/gen/fpgetmask.c b/lib/libc/powerpc/gen/fpgetmask.c index 4d9a3b0..aa7623b 100644 --- a/lib/libc/powerpc/gen/fpgetmask.c +++ b/lib/libc/powerpc/gen/fpgetmask.c @@ -43,6 +43,7 @@ __FBSDID("$FreeBSD$"); #include #include +#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 diff --git a/lib/libc/powerpc/gen/fpgetround.c b/lib/libc/powerpc/gen/fpgetround.c index 2e4b922..5381378 100644 --- a/lib/libc/powerpc/gen/fpgetround.c +++ b/lib/libc/powerpc/gen/fpgetround.c @@ -43,6 +43,7 @@ __FBSDID("$FreeBSD$"); #include #include +#ifndef _SOFT_FLOAT fp_rnd_t fpgetround() { @@ -51,3 +52,4 @@ fpgetround() __asm__("mffs %0" : "=f"(fpscr)); return ((fp_rnd_t)(fpscr & 0x3)); } +#endif diff --git a/lib/libc/powerpc/gen/fpgetsticky.c b/lib/libc/powerpc/gen/fpgetsticky.c index e8a21ca..feb2ccc 100644 --- a/lib/libc/powerpc/gen/fpgetsticky.c +++ b/lib/libc/powerpc/gen/fpgetsticky.c @@ -45,6 +45,7 @@ #include #include +#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 diff --git a/lib/libc/powerpc/gen/fpsetmask.c b/lib/libc/powerpc/gen/fpsetmask.c index 76a6867..e1433a5 100644 --- a/lib/libc/powerpc/gen/fpsetmask.c +++ b/lib/libc/powerpc/gen/fpsetmask.c @@ -43,6 +43,7 @@ __FBSDID("$FreeBSD$"); #include #include +#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 diff --git a/lib/libc/powerpc/gen/fpsetround.c b/lib/libc/powerpc/gen/fpsetround.c index 1337756..b4f00d4 100644 --- a/lib/libc/powerpc/gen/fpsetround.c +++ b/lib/libc/powerpc/gen/fpsetround.c @@ -43,6 +43,7 @@ __FBSDID("$FreeBSD$"); #include #include +#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 diff --git a/lib/msun/powerpc/fenv.h b/lib/msun/powerpc/fenv.h index 3010472..c29f8a0 100644 --- a/lib/msun/powerpc/fenv.h +++ b/lib/msun/powerpc/fenv.h @@ -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; diff --git a/sys/powerpc/include/float.h b/sys/powerpc/include/float.h index 5ac715a..d20736d 100644 --- a/sys/powerpc/include/float.h +++ b/sys/powerpc/include/float.h @@ -36,12 +36,16 @@ #include +#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 */ -- cgit v1.1