Build fixes for Windows

This commit is contained in:
Keno Fischer 2012-05-25 21:25:13 -04:00
parent 229949d965
commit adb103acec
14 changed files with 531 additions and 64 deletions

View file

@ -1,5 +1,7 @@
CC=gcc CC=gcc
CFLAGS= -Wall -O2 -I$(OPENLIBM_HOME) -I$(OPENLIBM_HOME)/include -I$(OPENLIBM_HOME)/ld80 -I$(OPENLIBM_HOME)/src -DASSEMBLER -D__BSD_VISIBLE -Wno-implicit-function-declaration OS = $(shell uname)
ARCH = $(shell uname -m)
CFLAGS= -std=gnu99 -Wall -O2 -I$(OPENLIBM_HOME) -I$(OPENLIBM_HOME)/include -I$(OPENLIBM_HOME)/ld80 -I$(OPENLIBM_HOME)/$(ARCH) -I$(OPENLIBM_HOME)/src -DASSEMBLER -D__BSD_VISIBLE -Wno-implicit-function-declaration
default: all default: all
@ -13,9 +15,6 @@ clean:
rm -f *.o *.c.o *.S.o *~ rm -f *.o *.c.o *.S.o *~
# OS-specific stuff # OS-specific stuff
OS = $(shell uname)
ARCH = $(shell uname -m)
ifeq ($(ARCH),i386) ifeq ($(ARCH),i386)
override ARCH = i387 override ARCH = i387
endif endif
@ -24,23 +23,28 @@ ifeq ($(ARCH),x86_64)
override ARCH = amd64 override ARCH = amd64
endif endif
ifeq ($(ARCH),i686)
override ARCH = amd64
endif
ifeq ($(OS), MINGW32_NT-6.1) ifeq ($(OS), MINGW32_NT-6.1)
OS=WINNT OS=WINNT
CFLAGS+=-nodefaultlibs
endif endif
ifeq ($(OS), Linux) ifeq ($(OS), Linux)
SHLIB_EXT = so SHLIB_EXT = so
CFLAGS+=-std=gnu99 -fPIC CFLAGS+=-fPIC
endif endif
ifeq ($(OS), FreeBSD) ifeq ($(OS), FreeBSD)
SHLIB_EXT = so SHLIB_EXT = so
CFLAGS+=-std=gnu99 -fPIC CFLAGS+=-fPIC
endif endif
ifeq ($(OS), Darwin) ifeq ($(OS), Darwin)
SHLIB_EXT = dylib SHLIB_EXT = dylib
CFLAGS+=-std=gnu99 -fPIC CFLAGS+=-fPIC
endif endif
ifeq ($(OS), WINNT) ifeq ($(OS), WINNT)

View file

@ -23,7 +23,7 @@ all: libopenlibm.a libopenlibm.$(SHLIB_EXT)
libopenlibm.a: $(OBJS) libopenlibm.a: $(OBJS)
$(QUIET_LINK)ar -rcs libopenlibm.a $(OBJS) $(QUIET_LINK)ar -rcs libopenlibm.a $(OBJS)
libopenlibm.$(SHLIB_EXT): $(OBJS) libopenlibm.$(SHLIB_EXT): $(OBJS)
$(QUIET_LINK)$(CC) -shared -fPIC $(OBJS) -o libopenlibm.$(SHLIB_EXT) $(QUIET_LINK)$(CC) -shared $(OBJS) -o libopenlibm.$(SHLIB_EXT)
cleanall: cleanall:
rm -f $(OBJS) *.a *.$(SHLIB_EXT) rm -f $(OBJS) *.a *.$(SHLIB_EXT)

283
amd64/bsd_ieeefp.h Normal file
View file

@ -0,0 +1,283 @@
/*-
* Copyright (c) 2003 Peter Wemm.
* Copyright (c) 1990 Andrew Moore, Talke Studio
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* from: @(#) ieeefp.h 1.0 (Berkeley) 9/23/93
* $FreeBSD: src/sys/amd64/include/ieeefp.h,v 1.14 2005/04/12 23:12:00 jhb Exp $
*/
/*
* IEEE floating point type and constant definitions.
*/
#ifndef _MACHINE_IEEEFP_H_
#define _MACHINE_IEEEFP_H_
#warning test
#ifndef _SYS_CDEFS_H_
#error this file needs sys/cdefs.h as a prerequisite
#endif
/*
* FP rounding modes
*/
typedef enum {
FP_RN=0, /* round to nearest */
FP_RM, /* round down to minus infinity */
FP_RP, /* round up to plus infinity */
FP_RZ /* truncate */
} fp_rnd_t;
/*
* FP precision modes
*/
typedef enum {
FP_PS=0, /* 24 bit (single-precision) */
FP_PRS, /* reserved */
FP_PD, /* 53 bit (double-precision) */
FP_PE /* 64 bit (extended-precision) */
} fp_prec_t;
#define fp_except_t int
/*
* FP exception masks
*/
#define FP_X_INV 0x01 /* invalid operation */
#define FP_X_DNML 0x02 /* denormal */
#define FP_X_DZ 0x04 /* zero divide */
#define FP_X_OFL 0x08 /* overflow */
#define FP_X_UFL 0x10 /* underflow */
#define FP_X_IMP 0x20 /* (im)precision */
#define FP_X_STK 0x40 /* stack fault */
/*
* FP registers
*/
#define FP_MSKS_REG 0 /* exception masks */
#define FP_PRC_REG 0 /* precision */
#define FP_RND_REG 0 /* direction */
#define FP_STKY_REG 1 /* sticky flags */
/*
* FP register bit field masks
*/
#define FP_MSKS_FLD 0x3f /* exception masks field */
#define FP_PRC_FLD 0x300 /* precision control field */
#define FP_RND_FLD 0xc00 /* round control field */
#define FP_STKY_FLD 0x3f /* sticky flags field */
/*
* SSE mxcsr register bit field masks
*/
#define SSE_STKY_FLD 0x3f /* exception flags */
#define SSE_DAZ_FLD 0x40 /* Denormals are zero */
#define SSE_MSKS_FLD 0x1f80 /* exception masks field */
#define SSE_RND_FLD 0x6000 /* rounding control */
#define SSE_FZ_FLD 0x8000 /* flush to zero on underflow */
/*
* FP register bit field offsets
*/
#define FP_MSKS_OFF 0 /* exception masks offset */
#define FP_PRC_OFF 8 /* precision control offset */
#define FP_RND_OFF 10 /* round control offset */
#define FP_STKY_OFF 0 /* sticky flags offset */
/*
* SSE mxcsr register bit field offsets
*/
#define SSE_STKY_OFF 0 /* exception flags offset */
#define SSE_DAZ_OFF 6 /* DAZ exception mask offset */
#define SSE_MSKS_OFF 7 /* other exception masks offset */
#define SSE_RND_OFF 13 /* rounding control offset */
#define SSE_FZ_OFF 15 /* flush to zero offset */
#if (defined(__GNUCLIKE_ASM) && defined(__CC_SUPPORTS___INLINE__)) || defined(__WIN32__) \
&& !defined(__cplusplus)
#warning test2
#define __fldenv(addr) __asm __volatile("fldenv %0" : : "m" (*(addr)))
#define __fnstenv(addr) __asm __volatile("fnstenv %0" : "=m" (*(addr)))
#define __fldcw(addr) __asm __volatile("fldcw %0" : : "m" (*(addr)))
#define __fnstcw(addr) __asm __volatile("fnstcw %0" : "=m" (*(addr)))
#define __fnstsw(addr) __asm __volatile("fnstsw %0" : "=m" (*(addr)))
#define __ldmxcsr(addr) __asm __volatile("ldmxcsr %0" : : "m" (*(addr)))
#define __stmxcsr(addr) __asm __volatile("stmxcsr %0" : "=m" (*(addr)))
/*
* General notes about conflicting SSE vs FP status bits.
* This code assumes that software will not fiddle with the control
* bits of the SSE and x87 in such a way to get them out of sync and
* still expect this to work. Break this at your peril.
* Because I based this on the i386 port, the x87 state is used for
* the fpget*() functions, and is shadowed into the SSE state for
* the fpset*() functions. For dual source fpget*() functions, I
* merge the two together. I think.
*/
/* Set rounding control */
static __inline__ fp_rnd_t
__fpgetround(void)
{
unsigned short _cw;
__fnstcw(&_cw);
return ((_cw & FP_RND_FLD) >> FP_RND_OFF);
}
static __inline__ fp_rnd_t
__fpsetround(fp_rnd_t _m)
{
unsigned short _cw;
unsigned int _mxcsr;
fp_rnd_t _p;
__fnstcw(&_cw);
_p = (_cw & FP_RND_FLD) >> FP_RND_OFF;
_cw &= ~FP_RND_FLD;
_cw |= (_m << FP_RND_OFF) & FP_RND_FLD;
__fldcw(&_cw);
__stmxcsr(&_mxcsr);
_mxcsr &= ~SSE_RND_FLD;
_mxcsr |= (_m << SSE_RND_OFF) & SSE_RND_FLD;
__ldmxcsr(&_mxcsr);
return (_p);
}
/*
* Set precision for fadd/fsub/fsqrt etc x87 instructions
* There is no equivalent SSE mode or control.
*/
static __inline__ fp_prec_t
__fpgetprec(void)
{
unsigned short _cw;
__fnstcw(&_cw);
return ((_cw & FP_PRC_FLD) >> FP_PRC_OFF);
}
static __inline__ fp_prec_t
__fpsetprec(fp_rnd_t _m)
{
unsigned short _cw;
fp_prec_t _p;
__fnstcw(&_cw);
_p = (_cw & FP_PRC_FLD) >> FP_PRC_OFF;
_cw &= ~FP_PRC_FLD;
_cw |= (_m << FP_PRC_OFF) & FP_PRC_FLD;
__fldcw(&_cw);
return (_p);
}
/*
* Look at the exception masks
* Note that x87 masks are inverse of the fp*() functions
* API. ie: mask = 1 means disable for x87 and SSE, but
* for the fp*() api, mask = 1 means enabled.
*/
static __inline__ fp_except_t
__fpgetmask(void)
{
unsigned short _cw;
__fnstcw(&_cw);
return ((~_cw) & FP_MSKS_FLD);
}
static __inline__ fp_except_t
__fpsetmask(fp_except_t _m)
{
unsigned short _cw;
unsigned int _mxcsr;
fp_except_t _p;
__fnstcw(&_cw);
_p = (~_cw) & FP_MSKS_FLD;
_cw &= ~FP_MSKS_FLD;
_cw |= (~_m) & FP_MSKS_FLD;
__fldcw(&_cw);
__stmxcsr(&_mxcsr);
/* XXX should we clear non-ieee SSE_DAZ_FLD and SSE_FZ_FLD ? */
_mxcsr &= ~SSE_MSKS_FLD;
_mxcsr |= ((~_m) << SSE_MSKS_OFF) & SSE_MSKS_FLD;
__ldmxcsr(&_mxcsr);
return (_p);
}
/* See which sticky exceptions are pending, and reset them */
static __inline__ fp_except_t
__fpgetsticky(void)
{
unsigned short _sw;
unsigned int _mxcsr;
fp_except_t _ex;
__fnstsw(&_sw);
_ex = _sw & FP_STKY_FLD;
__stmxcsr(&_mxcsr);
_ex |= _mxcsr & SSE_STKY_FLD;
return (_ex);
}
#endif /* __GNUCLIKE_ASM && __CC_SUPPORTS___INLINE__ && !__cplusplus */
#if !defined(__IEEEFP_NOINLINES__) && !defined(__cplusplus) \
&& defined(__GNUCLIKE_ASM) && defined(__CC_SUPPORTS___INLINE__)
#define fpgetround() __fpgetround()
#define fpsetround(_m) __fpsetround(_m)
#define fpgetprec() __fpgetprec()
#define fpsetprec(_m) __fpsetprec(_m)
#define fpgetmask() __fpgetmask()
#define fpsetmask(_m) __fpsetmask(_m)
#define fpgetsticky() __fpgetsticky()
/* Suppress prototypes in the MI header. */
#define _IEEEFP_INLINED_ 1
#else /* !__IEEEFP_NOINLINES__ && !__cplusplus && __GNUCLIKE_ASM
&& __CC_SUPPORTS___INLINE__ */
/* Augment the userland declarations */
__BEGIN_DECLS
extern fp_prec_t fpgetprec(void);
extern fp_prec_t fpsetprec(fp_prec_t);
__END_DECLS
#endif /* !__IEEEFP_NOINLINES__ && !__cplusplus && __GNUCLIKE_ASM
&& __CC_SUPPORTS___INLINE__ */
#endif /* !_MACHINE_IEEEFP_H_ */

View file

@ -1,16 +1,22 @@
ARCH_SRCS = e_exp.S e_fmod.S e_log.S e_log10.S \ $(CUR_SRCS) = e_exp.S e_fmod.S e_log.S e_log10.S \
e_remainder.S e_sqrt.S s_ceil.S s_copysign.S \ e_remainder.S e_sqrt.S s_ceil.S s_copysign.S \
s_cos.S s_finite.S s_floor.S s_llrint.S s_logb.S s_lrint.S \ s_cos.S s_finite.S s_floor.S s_llrint.S s_logb.S s_lrint.S \
s_remquo.S s_rint.S s_scalbn.S s_significand.S s_sin.S s_tan.S \ s_remquo.S s_rint.S s_significand.S s_sin.S s_tan.S \
s_trunc.S s_trunc.S
ifneq ($(OS), WINNT)
$(CUR_SRCS) += s_scalbn.S s_scalbnf.S s_scalbnl.S
endif
# float counterparts # float counterparts
ARCH_SRCS+= e_log10f.S e_logf.S e_remainderf.S \ $(CUR_SRCS)+= e_log10f.S e_logf.S e_remainderf.S \
e_sqrtf.S s_ceilf.S s_copysignf.S s_floorf.S \ e_sqrtf.S s_ceilf.S s_copysignf.S s_floorf.S \
s_llrintf.S s_logbf.S s_lrintf.S \ s_llrintf.S s_logbf.S s_lrintf.S \
s_remquof.S s_rintf.S s_scalbnf.S s_significandf.S s_truncf.S s_remquof.S s_rintf.S s_significandf.S s_truncf.S
# long double counterparts # long double counterparts
ARCH_SRCS+= e_remainderl.S e_sqrtl.S s_ceill.S s_copysignl.S \ $(CUR_SRCS)+= e_remainderl.S e_sqrtl.S s_ceill.S s_copysignl.S \
s_floorl.S s_llrintl.S \ s_floorl.S s_llrintl.S \
s_logbl.S s_lrintl.S s_remquol.S s_rintl.S s_scalbnl.S s_truncl.S s_logbl.S s_lrintl.S s_remquol.S s_rintl.S s_truncl.S
$(CUR_SRCS)+= fenv.c

View file

@ -39,7 +39,7 @@
#if defined(__APPLE__) #if defined(__APPLE__)
#include "osx_asm.h" #include "osx_asm.h"
#define CNAME(x) EXT(x) #define CNAME(x) EXT(x)
#elif defined(__FreeBSD__) || defined(__linux__) #elif defined(__FreeBSD__) || defined(__linux__) || defined(__WIN32__)
#include "bsd_cdefs.h" #include "bsd_cdefs.h"
#ifdef PIC #ifdef PIC
@ -68,30 +68,23 @@
* to a possibly-modified form that will be invisible to C programs. * to a possibly-modified form that will be invisible to C programs.
*/ */
#if defined(__FreeBSD__) || defined(__linux__)
#define CNAME(csym) csym #define CNAME(csym) csym
#define HIDENAME(asmsym) .asmsym #define HIDENAME(asmsym) .asmsym
/* XXX should use .p2align 4,0x90 for -m486. */ /* XXX should use .p2align 4,0x90 for -m486. */
#define _START_ENTRY .text; .p2align 2,0x90 #define _START_ENTRY .text; .p2align 2,0x90
#if defined(__linux__) || defined(__FreeBSD__) || defined(__ELF__)
#define _ENTRY(x) _START_ENTRY; \ #define _ENTRY(x) _START_ENTRY; \
.globl CNAME(x); .type CNAME(x),@function; CNAME(x): .globl CNAME(x); .type CNAME(x),@function; CNAME(x):
#define END(x) .size x, . - x #define END(x) .size x, . - x
#else #elif defined(__WIN32__)
#define CNAME(csym) _csym #define _ENTRY(x) \
#define HIDENAME(asmsym) .asmsym _START_ENTRY; .globl CNAME(x) ; .def CNAME(X);\
.scl 2;.type 32;.endef; CNAME(x):
/* XXX should use .p2align 4,0x90 for -m486. */ #define END(x) .end
#define _START_ENTRY .text; .p2align 2,0x90
#define _ENTRY(x) _START_ENTRY; \
.globl CNAME(x); CNAME(x):
#define END(x) .size x, . - x
#endif #endif
#ifdef PROF #ifdef PROF
#define ALTENTRY(x) _ENTRY(x); \ #define ALTENTRY(x) _ENTRY(x); \
pushl %ebp; movl %esp,%ebp; \ pushl %ebp; movl %esp,%ebp; \

2
i387/bsd_ieeefp.h Normal file
View file

@ -0,0 +1,2 @@
#include "include/cdefs-compat.h"
#include "amd64/bsd_ieeefp.h"

160
i387/bsd_npx.h Normal file
View file

@ -0,0 +1,160 @@
/*-
* Copyright (c) 1990 The Regents of the University of California.
* All rights reserved.
*
* This code is derived from software contributed to Berkeley by
* William Jolitz.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* from: @(#)npx.h 5.3 (Berkeley) 1/18/91
* $FreeBSD: src/sys/i386/include/npx.h,v 1.29.2.1 2006/07/01 00:57:55 davidxu Exp $
*/
/*
* 287/387 NPX Coprocessor Data Structures and Constants
* W. Jolitz 1/90
*/
#ifndef _MACHINE_NPX_H_
#define _MACHINE_NPX_H_
/* Environment information of floating point unit */
struct env87 {
long en_cw; /* control word (16bits) */
long en_sw; /* status word (16bits) */
long en_tw; /* tag word (16bits) */
long en_fip; /* floating point instruction pointer */
unsigned short en_fcs; /* floating code segment selector */
unsigned short en_opcode; /* opcode last executed (11 bits ) */
long en_foo; /* floating operand offset */
long en_fos; /* floating operand segment selector */
};
/* Contents of each floating point accumulator */
struct fpacc87 {
#ifdef dontdef /* too unportable */
unsigned long fp_mantlo; /* mantissa low (31:0) */
unsigned long fp_manthi; /* mantissa high (63:32) */
int fp_exp:15; /* exponent */
int fp_sgn:1; /* mantissa sign */
#else
unsigned char fp_bytes[10];
#endif
};
/* Floating point context */
struct save87 {
struct env87 sv_env; /* floating point control/status */
struct fpacc87 sv_ac[8]; /* accumulator contents, 0-7 */
unsigned char sv_pad0[4]; /* padding for (now unused) saved status word */
/*
* Bogus padding for emulators. Emulators should use their own
* struct and arrange to store into this struct (ending here)
* before it is inspected for ptracing or for core dumps. Some
* emulators overwrite the whole struct. We have no good way of
* knowing how much padding to leave. Leave just enough for the
* GPL emulator's i387_union (176 bytes total).
*/
unsigned char sv_pad[64]; /* padding; used by emulators */
};
struct envxmm {
uint16_t en_cw; /* control word (16bits) */
uint16_t en_sw; /* status word (16bits) */
uint16_t en_tw; /* tag word (16bits) */
uint16_t en_opcode; /* opcode last executed (11 bits ) */
uint32_t en_fip; /* floating point instruction pointer */
uint16_t en_fcs; /* floating code segment selector */
uint16_t en_pad0; /* padding */
uint32_t en_foo; /* floating operand offset */
uint16_t en_fos; /* floating operand segment selector */
uint16_t en_pad1; /* padding */
uint32_t en_mxcsr; /* SSE sontorol/status register */
uint32_t en_mxcsr_mask; /* valid bits in mxcsr */
};
/* Contents of each SSE extended accumulator */
struct xmmacc {
unsigned char xmm_bytes[16];
};
struct savexmm {
struct envxmm sv_env;
struct {
struct fpacc87 fp_acc;
unsigned char fp_pad[6]; /* padding */
} sv_fp[8];
struct xmmacc sv_xmm[8];
unsigned char sv_pad[224];
} __attribute__((__aligned__(16)));
union savefpu {
struct save87 sv_87;
struct savexmm sv_xmm;
};
/*
* The hardware default control word for i387's and later coprocessors is
* 0x37F, giving:
*
* round to nearest
* 64-bit precision
* all exceptions masked.
*
* We modify the affine mode bit and precision bits in this to give:
*
* affine mode for 287's (if they work at all) (1 in bitfield 1<<12)
* 53-bit precision (2 in bitfield 3<<8)
*
* 64-bit precision often gives bad results with high level languages
* because it makes the results of calculations depend on whether
* intermediate values are stored in memory or in FPU registers.
*/
#define __INITIAL_NPXCW__ 0x127F
#define __INITIAL_MXCSR__ 0x1F80
#ifdef _KERNEL
#define IO_NPX 0x0F0 /* Numeric Coprocessor */
#define IO_NPXSIZE 16 /* 80387/80487 NPX registers */
#define IRQ_NPX 13
/* full reset on some systems, NOP on others */
#define npx_full_reset() outb(IO_NPX + 1, 0)
int npxdna(void);
void npxdrop(void);
void npxexit(struct thread *td);
int npxformat(void);
int npxgetregs(struct thread *td, union savefpu *addr);
void npxinit(unsigned short control);
void npxsave(union savefpu *addr);
void npxsetregs(struct thread *td, union savefpu *addr);
int npxtrap(void);
#endif
#endif /* !_MACHINE_NPX_H_ */

View file

@ -26,9 +26,13 @@
* $FreeBSD: src/lib/msun/i387/fenv.c,v 1.8 2011/10/21 06:25:31 das Exp $ * $FreeBSD: src/lib/msun/i387/fenv.c,v 1.8 2011/10/21 06:25:31 das Exp $
*/ */
#include <sys/cdefs.h> #include <include/cdefs-compat.h>
#include <sys/types.h> #include <include/types-compat.h>
#ifdef __WIN32__
#include <i387/bsd_npx.h>
#else
#include <machine/npx.h> #include <machine/npx.h>
#endif
#define __fenv_static #define __fenv_static
#include "fenv.h" #include "fenv.h"
@ -96,7 +100,7 @@ int
fesetexceptflag(const fexcept_t *flagp, int excepts) fesetexceptflag(const fexcept_t *flagp, int excepts)
{ {
fenv_t env; fenv_t env;
__uint32_t mxcsr; uint32_t mxcsr;
__fnstenv(&env); __fnstenv(&env);
env.__status &= ~excepts; env.__status &= ~excepts;
@ -130,7 +134,7 @@ extern inline int fesetround(int __round);
int int
fegetenv(fenv_t *envp) fegetenv(fenv_t *envp)
{ {
__uint32_t mxcsr; uint32_t mxcsr;
__fnstenv(envp); __fnstenv(envp);
/* /*
@ -148,7 +152,7 @@ fegetenv(fenv_t *envp)
int int
feholdexcept(fenv_t *envp) feholdexcept(fenv_t *envp)
{ {
__uint32_t mxcsr; uint32_t mxcsr;
__fnstenv(envp); __fnstenv(envp);
__fnclex(); __fnclex();
@ -167,8 +171,8 @@ extern inline int fesetenv(const fenv_t *__envp);
int int
feupdateenv(const fenv_t *envp) feupdateenv(const fenv_t *envp)
{ {
__uint32_t mxcsr; uint32_t mxcsr;
__uint16_t status; uint16_t status;
__fnstsw(&status); __fnstsw(&status);
if (__HAS_SSE()) if (__HAS_SSE())
@ -183,8 +187,8 @@ feupdateenv(const fenv_t *envp)
int int
__feenableexcept(int mask) __feenableexcept(int mask)
{ {
__uint32_t mxcsr, omask; uint32_t mxcsr, omask;
__uint16_t control; uint16_t control;
mask &= FE_ALL_EXCEPT; mask &= FE_ALL_EXCEPT;
__fnstcw(&control); __fnstcw(&control);
@ -205,8 +209,8 @@ __feenableexcept(int mask)
int int
__fedisableexcept(int mask) __fedisableexcept(int mask)
{ {
__uint32_t mxcsr, omask; uint32_t mxcsr, omask;
__uint16_t control; uint16_t control;
mask &= FE_ALL_EXCEPT; mask &= FE_ALL_EXCEPT;
__fnstcw(&control); __fnstcw(&control);

View file

@ -29,8 +29,8 @@
#ifndef _FENV_H_ #ifndef _FENV_H_
#define _FENV_H_ #define _FENV_H_
#include <sys/cdefs.h> #include "include/cdefs-compat.h"
#include <sys/_types.h> #include "include/types-compat.h"
#ifndef __fenv_static #ifndef __fenv_static
#define __fenv_static static #define __fenv_static static
@ -41,22 +41,22 @@
* mxcsr into some reserved fields, rather than changing sizeof(fenv_t). * mxcsr into some reserved fields, rather than changing sizeof(fenv_t).
*/ */
typedef struct { typedef struct {
__uint16_t __control; uint16_t __control;
__uint16_t __mxcsr_hi; uint16_t __mxcsr_hi;
__uint16_t __status; uint16_t __status;
__uint16_t __mxcsr_lo; uint16_t __mxcsr_lo;
__uint32_t __tag; uint32_t __tag;
char __other[16]; char __other[16];
} fenv_t; } fenv_t;
#define __get_mxcsr(env) (((env).__mxcsr_hi << 16) | \ #define __get_mxcsr(env) (((env).__mxcsr_hi << 16) | \
((env).__mxcsr_lo)) ((env).__mxcsr_lo))
#define __set_mxcsr(env, x) do { \ #define __set_mxcsr(env, x) do { \
(env).__mxcsr_hi = (__uint32_t)(x) >> 16; \ (env).__mxcsr_hi = (uint32_t)(x) >> 16; \
(env).__mxcsr_lo = (__uint16_t)(x); \ (env).__mxcsr_lo = (uint16_t)(x); \
} while (0) } while (0)
typedef __uint16_t fexcept_t; typedef uint16_t fexcept_t;
/* Exception flags */ /* Exception flags */
#define FE_INVALID 0x01 #define FE_INVALID 0x01
@ -118,7 +118,7 @@ __fenv_static inline int
feclearexcept(int __excepts) feclearexcept(int __excepts)
{ {
fenv_t __env; fenv_t __env;
__uint32_t __mxcsr; uint32_t __mxcsr;
if (__excepts == FE_ALL_EXCEPT) { if (__excepts == FE_ALL_EXCEPT) {
__fnclex(); __fnclex();
@ -138,8 +138,8 @@ feclearexcept(int __excepts)
__fenv_static inline int __fenv_static inline int
fegetexceptflag(fexcept_t *__flagp, int __excepts) fegetexceptflag(fexcept_t *__flagp, int __excepts)
{ {
__uint32_t __mxcsr; uint32_t __mxcsr;
__uint16_t __status; uint16_t __status;
__fnstsw(&__status); __fnstsw(&__status);
if (__HAS_SSE()) if (__HAS_SSE())
@ -156,8 +156,8 @@ int feraiseexcept(int __excepts);
__fenv_static inline int __fenv_static inline int
fetestexcept(int __excepts) fetestexcept(int __excepts)
{ {
__uint32_t __mxcsr; uint32_t __mxcsr;
__uint16_t __status; uint16_t __status;
__fnstsw(&__status); __fnstsw(&__status);
if (__HAS_SSE()) if (__HAS_SSE())
@ -170,7 +170,7 @@ fetestexcept(int __excepts)
__fenv_static inline int __fenv_static inline int
fegetround(void) fegetround(void)
{ {
__uint16_t __control; uint16_t __control;
/* /*
* We assume that the x87 and the SSE unit agree on the * We assume that the x87 and the SSE unit agree on the
@ -185,8 +185,8 @@ fegetround(void)
__fenv_static inline int __fenv_static inline int
fesetround(int __round) fesetround(int __round)
{ {
__uint32_t __mxcsr; uint32_t __mxcsr;
__uint16_t __control; uint16_t __control;
if (__round & ~_ROUND_MASK) if (__round & ~_ROUND_MASK)
return (-1); return (-1);
@ -213,7 +213,7 @@ __fenv_static inline int
fesetenv(const fenv_t *__envp) fesetenv(const fenv_t *__envp)
{ {
fenv_t __env = *__envp; fenv_t __env = *__envp;
__uint32_t __mxcsr; uint32_t __mxcsr;
__mxcsr = __get_mxcsr(__env); __mxcsr = __get_mxcsr(__env);
__set_mxcsr(__env, 0xffffffff); __set_mxcsr(__env, 0xffffffff);
@ -242,7 +242,7 @@ int fedisableexcept(int __mask);
static inline int static inline int
fegetexcept(void) fegetexcept(void)
{ {
__uint16_t __control; uint16_t __control;
/* /*
* We assume that the masks for the x87 and the SSE unit are * We assume that the masks for the x87 and the SSE unit are

View file

@ -7,7 +7,6 @@
#ifndef __WIN32__ #ifndef __WIN32__
#include "sys/cdefs.h" #include "sys/cdefs.h"
#else /* __WIN32__ */ #else /* __WIN32__ */
#if defined(__cplusplus) #if defined(__cplusplus)
@ -18,6 +17,8 @@
#define __END_DECLS #define __END_DECLS
#endif #endif
#define _SYS_CDEFS_H_
#endif /* __WIN32__ */ #endif /* __WIN32__ */

View file

@ -1,2 +1,6 @@
$(CUR_SRCS) += invtrig.c k_cosl.c k_sinl.c\ $(CUR_SRCS) += invtrig.c k_cosl.c k_sinl.c\
k_tanl.c s_exp2l.c s_nanl.c k_tanl.c s_exp2l.c
ifneq ($(OS), WINNT)
$(CUR_SRCS) += s_nanl.c
endif

View file

@ -30,7 +30,9 @@
#include <float.h> #include <float.h>
#include <stdint.h> #include <stdint.h>
#ifdef __i386__ #ifdef __WIN32__
#include "amd64/bsd_ieeefp.h"
#else
#include <ieeefp.h> #include <ieeefp.h>
#endif #endif
@ -243,10 +245,11 @@ exp2l(long double x)
* The default precision on i386 is 53 bits, so long doubles are * The default precision on i386 is 53 bits, so long doubles are
* broken. Call exp2() to get an accurate (double precision) result. * broken. Call exp2() to get an accurate (double precision) result.
*/ */
if (fpgetprec() != FP_PE) if (__fpgetprec() != FP_PE)
return (exp2(x)); return (exp2(x));
#endif #endif
/* /*
* Reduce x, computing z, i0, and k. The low bits of x + redux * Reduce x, computing z, i0, and k. The low bits of x + redux
* contain the 16-bit integer part of the exponent (k) followed by * contain the 16-bit integer part of the exponent (k) followed by

View file

@ -24,7 +24,7 @@ $(CUR_SRCS) = \
s_llrint.c s_llrintf.c s_llround.c s_llroundf.c s_llroundl.c \ s_llrint.c s_llrintf.c s_llround.c s_llroundf.c s_llroundl.c \
s_log1p.c s_log1pf.c s_logb.c s_logbf.c s_lrint.c s_lrintf.c \ s_log1p.c s_log1pf.c s_logb.c s_logbf.c s_lrint.c s_lrintf.c \
s_lround.c s_lroundf.c s_lroundl.c s_modf.c s_modff.c \ s_lround.c s_lroundf.c s_lroundl.c s_modf.c s_modff.c \
s_nan.c s_nearbyint.c s_nextafter.c s_nextafterf.c \ s_nearbyint.c s_nextafter.c s_nextafterf.c \
s_nexttowardf.c s_remquo.c s_remquof.c \ s_nexttowardf.c s_remquo.c s_remquof.c \
s_rint.c s_rintf.c s_round.c s_roundf.c s_roundl.c \ s_rint.c s_rintf.c s_round.c s_roundf.c s_roundl.c \
s_scalbln.c s_scalbn.c s_scalbnf.c s_signbit.c \ s_scalbln.c s_scalbn.c s_scalbnf.c s_signbit.c \
@ -32,6 +32,10 @@ $(CUR_SRCS) = \
s_tan.c s_tanf.c s_tanh.c s_tanhf.c s_tgammaf.c s_trunc.c s_truncf.c \ s_tan.c s_tanf.c s_tanh.c s_tanhf.c s_tgammaf.c s_trunc.c s_truncf.c \
w_cabs.c w_cabsf.c w_drem.c w_dremf.c w_cabs.c w_cabsf.c w_drem.c w_dremf.c
ifneq ($(OS), WINNT)
$(CUR_SRCS) += s_nan.c
endif
# C99 long double functions # C99 long double functions
$(CUR_SRCS) += s_copysignl.c s_fabsl.c s_llrintl.c s_lrintl.c s_modfl.c $(CUR_SRCS) += s_copysignl.c s_fabsl.c s_llrintl.c s_lrintl.c s_modfl.c

View file

@ -24,6 +24,9 @@
#include "fpmath.h" #include "fpmath.h"
#include "openlibm.h" #include "openlibm.h"
#include "math_private.h" #include "math_private.h"
#if defined(__WIN32__) && defined(__i386__)
#include "i387/bsd_ieeefp.h"
#endif
#define BIAS (LDBL_MAX_EXP - 1) #define BIAS (LDBL_MAX_EXP - 1)