diff options
| author | Ruslan Bukin <br@FreeBSD.org> | 2016-10-31 15:33:58 +0000 |
|---|---|---|
| committer | Ruslan Bukin <br@FreeBSD.org> | 2016-10-31 15:33:58 +0000 |
| commit | 5bca221511e448277905383c6c08180e624c7460 (patch) | |
| tree | 6e8b7ee360ff41786ad352e2b2797425cfbd6255 /lib/libc/mips | |
| parent | ad9f2cecd74098261d39c1b2a0e85908fa9e122f (diff) | |
Notes
Diffstat (limited to 'lib/libc/mips')
| -rw-r--r-- | lib/libc/mips/Makefile.inc | 2 | ||||
| -rw-r--r-- | lib/libc/mips/Symbol.map | 4 | ||||
| -rw-r--r-- | lib/libc/mips/gen/Makefile.inc | 2 | ||||
| -rw-r--r-- | lib/libc/mips/gen/flt_rounds.c | 20 |
4 files changed, 23 insertions, 5 deletions
diff --git a/lib/libc/mips/Makefile.inc b/lib/libc/mips/Makefile.inc index 4ec20d47d1dd3..54ce38e49bfa9 100644 --- a/lib/libc/mips/Makefile.inc +++ b/lib/libc/mips/Makefile.inc @@ -1,7 +1,9 @@ # $NetBSD: Makefile.inc,v 1.7 2005/09/17 11:49:39 tsutsui Exp $ # $FreeBSD$ +.if ${MACHINE_ARCH:Mmips*hf} == "" CFLAGS+=-DSOFTFLOAT +.endif MDSRCS+= machdep_ldisd.c SYM_MAPS+= ${LIBC_SRCTOP}/mips/Symbol.map diff --git a/lib/libc/mips/Symbol.map b/lib/libc/mips/Symbol.map index 38680807adc4c..9791359c93f60 100644 --- a/lib/libc/mips/Symbol.map +++ b/lib/libc/mips/Symbol.map @@ -31,6 +31,10 @@ FBSD_1.0 { sbrk; }; +FBSD_1.3 { + __flt_rounds; +}; + FBSDprivate_1.0 { /* PSEUDO syscalls */ __sys_getlogin; diff --git a/lib/libc/mips/gen/Makefile.inc b/lib/libc/mips/gen/Makefile.inc index a186fda620363..56fa380f7777a 100644 --- a/lib/libc/mips/gen/Makefile.inc +++ b/lib/libc/mips/gen/Makefile.inc @@ -1,7 +1,7 @@ # $NetBSD: Makefile.inc,v 1.27 2005/10/07 17:16:40 tsutsui Exp $ # $FreeBSD$ -SRCS+= infinity.c fabs.c ldexp.c +SRCS+= infinity.c fabs.c ldexp.c flt_rounds.c # SRCS+= flt_rounds.c fpgetmask.c fpgetround.c fpgetsticky.c fpsetmask.c \ # fpsetround.c fpsetsticky.c diff --git a/lib/libc/mips/gen/flt_rounds.c b/lib/libc/mips/gen/flt_rounds.c index 9fc64a5370533..73428d907d116 100644 --- a/lib/libc/mips/gen/flt_rounds.c +++ b/lib/libc/mips/gen/flt_rounds.c @@ -11,7 +11,14 @@ __FBSDID("$FreeBSD$"); __RCSID("$NetBSD: flt_rounds.c,v 1.5 2005/12/24 23:10:08 perry Exp $"); #endif /* LIBC_SCCS and not lint */ -#include <machine/float.h> +#include <fenv.h> +#include <float.h> + +#ifdef SOFTFLOAT +#include "softfloat-for-gcc.h" +#include "milieu.h" +#include "softfloat.h" +#endif static const int map[] = { 1, /* round to nearest */ @@ -23,8 +30,13 @@ static const int map[] = { int __flt_rounds() { - int x; + int mode; + +#ifdef SOFTFLOAT + mode = __softfloat_float_rounding_mode; +#else + __asm __volatile("cfc1 %0,$31" : "=r" (mode)); +#endif - __asm("cfc1 %0,$31" : "=r" (x)); - return map[x & 0x03]; + return map[mode & 0x03]; } |
