gcc/ 2008-06-29 H.J. Lu * config.gcc: Remove i386/t-fprules-softfp64 soft-fp/t-softfp from tmake_file from i[34567]86-*-darwin*, x86_64-*-darwin*, i[34567]86-*-linux*, x86_64-*-linux*. Add i386/t-fprules-softfp and soft-fp/t-softfp to tmake_file for i[34567]86-*-darwin*, x86_64-*-darwin*, i[34567]86-*-linux*, x86_64-*-linux*. * config/i386/sfp-machine.h: Moved to libgcc. * config/i386/sfp-machine.h: New. * config/i386/t-darwin: Remove softfp_wrap_start and softfp_wrap_end. * config/i386/t-darwin64: Likewise. * config/i386/t-linux64: Likewise. * config/i386/t-fprules-softfp64: Renamed to ... * config/i386/t-fprules-softfp: This. libgcc/ 2008-06-29 H.J. Lu * config.host: Add i386/${host_address}/t-fprules-softfp to tmake_file for i[34567]86-*-darwin*, x86_64-*-darwin*, i[34567]86-*-linux*, x86_64-*-linux*. * configure.ac: Set host_address to 64 or 32 for x86. * configure: Regenerated. * config/i386/32/sfp-machine.h: New. * config/i386/32/t-fprules-softfp: Likewise. * config/i386/64/sfp-machine.h: New. Moved from gcc. --- gcc/gcc/config.gcc.quad 2008-06-27 18:43:07.000000000 -0700 +++ gcc/gcc/config.gcc 2008-06-29 07:25:20.000000000 -0700 @@ -1006,11 +1006,11 @@ i[34567]86-*-darwin*) # then this file using that to set --with-cpu=i386 which has no -m64 # support. with_cpu=${with_cpu:-generic} - tmake_file="${tmake_file} i386/t-fprules-softfp64 soft-fp/t-softfp i386/t-crtpc i386/t-crtfm" + tmake_file="${tmake_file} i386/t-crtpc i386/t-crtfm" ;; x86_64-*-darwin*) with_cpu=${with_cpu:-generic} - tmake_file="t-darwin ${cpu_type}/t-darwin64 t-slibgcc-darwin i386/t-fprules-softfp64 soft-fp/t-softfp i386/t-crtpc i386/t-crtfm" + tmake_file="t-darwin ${cpu_type}/t-darwin64 t-slibgcc-darwin i386/t-crtpc i386/t-crtfm" tm_file="${tm_file} ${cpu_type}/darwin64.h" ;; i[34567]86-*-elf*) @@ -1069,7 +1069,7 @@ i[34567]86-*-linux* | i[34567]86-*-kfree if test x$enable_targets = xall; then tm_file="${tm_file} i386/x86-64.h i386/linux64.h" tm_defines="${tm_defines} TARGET_BI_ARCH=1" - tmake_file="${tmake_file} i386/t-linux64 i386/t-fprules-softfp64 soft-fp/t-softfp" + tmake_file="${tmake_file} i386/t-linux64" need_64bit_hwint=yes case X"${with_cpu}" in Xgeneric|Xcore2|Xnocona|Xx86-64|Xamdfam10|Xbarcelona|Xk8|Xopteron|Xathlon64|Xathlon-fx) @@ -1101,7 +1101,7 @@ x86_64-*-linux* | x86_64-*-kfreebsd*-gnu x86_64-*-kfreebsd*-gnu) tm_file="${tm_file} kfreebsd-gnu.h" ;; x86_64-*-knetbsd*-gnu) tm_file="${tm_file} knetbsd-gnu.h" ;; esac - tmake_file="${tmake_file} i386/t-linux64 i386/t-crtstuff i386/t-crtpc i386/t-crtfm i386/t-fprules-softfp64 soft-fp/t-softfp t-dfprules" + tmake_file="${tmake_file} i386/t-linux64 i386/t-crtstuff i386/t-crtpc i386/t-crtfm t-dfprules" ;; i[34567]86-*-gnu*) ;; @@ -2973,6 +2973,11 @@ case ${target} in fi ;; + i[34567]86-*-darwin* | x86_64-*-darwin* | \ + i[34567]86-*-linux* | x86_64-*-linux*) + tmake_file="${tmake_file} i386/t-fprules-softfp soft-fp/t-softfp" + ;; + mips*-*-*) if test x$gnu_ld = xyes then --- gcc/gcc/config/i386/sfp-machine.h.quad 2008-02-19 20:52:26.000000000 -0800 +++ gcc/gcc/config/i386/sfp-machine.h 2008-06-29 07:52:03.000000000 -0700 @@ -1,143 +1,5 @@ -#define _FP_W_TYPE_SIZE 64 -#define _FP_W_TYPE unsigned long -#define _FP_WS_TYPE signed long -#define _FP_I_TYPE long - -typedef int TItype __attribute__ ((mode (TI))); -typedef unsigned int UTItype __attribute__ ((mode (TI))); - -#define TI_BITS (__CHAR_BIT__ * (int)sizeof(TItype)) - -/* The type of the result of a floating point comparison. This must - match `__libgcc_cmp_return__' in GCC for the target. */ -typedef int __gcc_CMPtype __attribute__ ((mode (__libgcc_cmp_return__))); -#define CMPtype __gcc_CMPtype - -#define _FP_MUL_MEAT_Q(R,X,Y) \ - _FP_MUL_MEAT_2_wide(_FP_WFRACBITS_Q,R,X,Y,umul_ppmm) - -#define _FP_DIV_MEAT_Q(R,X,Y) _FP_DIV_MEAT_2_udiv(Q,R,X,Y) - -#define _FP_NANFRAC_S _FP_QNANBIT_S -#define _FP_NANFRAC_D _FP_QNANBIT_D -#define _FP_NANFRAC_E _FP_QNANBIT_E, 0 -#define _FP_NANFRAC_Q _FP_QNANBIT_Q, 0 -#define _FP_NANSIGN_S 1 -#define _FP_NANSIGN_D 1 -#define _FP_NANSIGN_E 1 -#define _FP_NANSIGN_Q 1 - -#define _FP_KEEPNANFRACP 1 - -/* Here is something Intel misdesigned: the specs don't define - the case where we have two NaNs with same mantissas, but - different sign. Different operations pick up different NaNs. */ -#define _FP_CHOOSENAN(fs, wc, R, X, Y, OP) \ - do { \ - if (_FP_FRAC_GT_##wc(X, Y) \ - || (_FP_FRAC_EQ_##wc(X,Y) && (OP == '+' || OP == '*'))) \ - { \ - R##_s = X##_s; \ - _FP_FRAC_COPY_##wc(R,X); \ - } \ - else \ - { \ - R##_s = Y##_s; \ - _FP_FRAC_COPY_##wc(R,Y); \ - } \ - R##_c = FP_CLS_NAN; \ - } while (0) - -#define FP_EX_INVALID 0x01 -#define FP_EX_DENORM 0x02 -#define FP_EX_DIVZERO 0x04 -#define FP_EX_OVERFLOW 0x08 -#define FP_EX_UNDERFLOW 0x10 -#define FP_EX_INEXACT 0x20 - -struct fenv -{ - unsigned short int __control_word; - unsigned short int __unused1; - unsigned short int __status_word; - unsigned short int __unused2; - unsigned short int __tags; - unsigned short int __unused3; - unsigned int __eip; - unsigned short int __cs_selector; - unsigned int __opcode:11; - unsigned int __unused4:5; - unsigned int __data_offset; - unsigned short int __data_selector; - unsigned short int __unused5; -}; - -#define FP_HANDLE_EXCEPTIONS \ - do { \ - if (_fex & FP_EX_INVALID) \ - { \ - float f = 0.0; \ - __asm__ __volatile__ ("divss %0, %0 " : : "x" (f)); \ - } \ - if (_fex & FP_EX_DIVZERO) \ - { \ - float f = 1.0, g = 0.0; \ - __asm__ __volatile__ ("divss %1, %0" : : "x" (f), "x" (g)); \ - } \ - if (_fex & FP_EX_OVERFLOW) \ - { \ - struct fenv temp; \ - __asm__ __volatile__ ("fnstenv %0" : "=m" (temp)); \ - temp.__status_word |= FP_EX_OVERFLOW; \ - __asm__ __volatile__ ("fldenv %0" : : "m" (temp)); \ - __asm__ __volatile__ ("fwait"); \ - } \ - if (_fex & FP_EX_UNDERFLOW) \ - { \ - struct fenv temp; \ - __asm__ __volatile__ ("fnstenv %0" : "=m" (temp)); \ - temp.__status_word |= FP_EX_UNDERFLOW; \ - __asm__ __volatile__ ("fldenv %0" : : "m" (temp)); \ - __asm__ __volatile__ ("fwait"); \ - } \ - if (_fex & FP_EX_INEXACT) \ - { \ - struct fenv temp; \ - __asm__ __volatile__ ("fnstenv %0" : "=m" (temp)); \ - temp.__status_word |= FP_EX_INEXACT; \ - __asm__ __volatile__ ("fldenv %0" : : "m" (temp)); \ - __asm__ __volatile__ ("fwait"); \ - } \ - } while (0) - -#define FP_RND_NEAREST 0 -#define FP_RND_ZERO 0xc00 -#define FP_RND_PINF 0x800 -#define FP_RND_MINF 0x400 - -#define _FP_DECL_EX \ - unsigned short _fcw __attribute__ ((unused)) = FP_RND_NEAREST - -#define FP_INIT_ROUNDMODE \ - do { \ - __asm__ ("fnstcw %0" : "=m" (_fcw)); \ - } while (0) - -#define FP_ROUNDMODE (_fcw & 0xc00) - -#define __LITTLE_ENDIAN 1234 -#define __BIG_ENDIAN 4321 - -#define __BYTE_ORDER __LITTLE_ENDIAN - -/* Define ALIASNAME as a strong alias for NAME. */ -#if defined __MACH__ -/* Mach-O doesn't support aliasing. If these functions ever return - anything but CMPtype we need to revisit this... */ -#define strong_alias(name, aliasname) \ - CMPtype aliasname (TFtype a, TFtype b) { return name(a, b); } +#ifdef __x86_64__ +#include "config/i386/64/sfp-machine.h" #else -# define strong_alias(name, aliasname) _strong_alias(name, aliasname) -# define _strong_alias(name, aliasname) \ - extern __typeof (name) aliasname __attribute__ ((alias (#name))); +#include "config/i386/32/sfp-machine.h" #endif --- gcc/gcc/config/i386/t-darwin.quad 2007-05-26 07:35:21.000000000 -0700 +++ gcc/gcc/config/i386/t-darwin 2008-06-29 07:08:22.000000000 -0700 @@ -2,6 +2,3 @@ MULTILIB_OPTIONS = m64 MULTILIB_DIRNAMES = x86_64 LIB2_SIDITI_CONV_FUNCS=yes LIB2FUNCS_EXTRA = $(srcdir)/config/darwin-64.c - -softfp_wrap_start := '\#ifdef __x86_64__' -softfp_wrap_end := '\#endif' --- gcc/gcc/config/i386/t-darwin64.quad 2007-05-26 07:35:21.000000000 -0700 +++ gcc/gcc/config/i386/t-darwin64 2008-06-29 07:08:26.000000000 -0700 @@ -1,5 +1,2 @@ LIB2_SIDITI_CONV_FUNCS=yes LIB2FUNCS_EXTRA = $(srcdir)/config/darwin-64.c - -softfp_wrap_start := '\#ifdef __x86_64__' -softfp_wrap_end := '\#endif' --- gcc/gcc/config/i386/t-fprules-softfp.quad 2008-06-29 07:25:58.000000000 -0700 +++ gcc/gcc/config/i386/t-fprules-softfp 2008-06-29 07:34:08.000000000 -0700 @@ -0,0 +1,6 @@ +softfp_float_modes := tf +softfp_int_modes := si di ti +softfp_extensions := sftf dftf xftf +softfp_truncations := tfsf tfdf tfxf +softfp_machine_header := i386/sfp-machine.h +softfp_exclude_libgcc2 := n --- gcc/gcc/config/i386/t-fprules-softfp64.quad 2007-05-18 07:10:43.000000000 -0700 +++ gcc/gcc/config/i386/t-fprules-softfp64 2008-06-29 10:13:33.000000000 -0700 @@ -1,6 +0,0 @@ -softfp_float_modes := tf -softfp_int_modes := si di ti -softfp_extensions := sftf dftf xftf -softfp_truncations := tfsf tfdf tfxf -softfp_machine_header := i386/sfp-machine.h -softfp_exclude_libgcc2 := n --- gcc/gcc/config/i386/t-linux64.quad 2007-09-29 07:58:28.000000000 -0700 +++ gcc/gcc/config/i386/t-linux64 2008-06-29 07:08:31.000000000 -0700 @@ -21,6 +21,3 @@ INSTALL_LIBGCC = install-multilib EXTRA_MULTILIB_PARTS=crtbegin.o crtend.o crtbeginS.o crtendS.o \ crtbeginT.o crtprec32.o crtprec64.o crtprec80.o \ crtfastmath.o - -softfp_wrap_start := '\#ifdef __x86_64__' -softfp_wrap_end := '\#endif' --- gcc/libgcc/config.host.quad 2008-06-08 08:48:36.000000000 -0700 +++ gcc/libgcc/config.host 2008-06-29 10:04:21.000000000 -0700 @@ -578,3 +578,12 @@ i[34567]86-*-linux* | x86_64-*-linux*) tmake_file="${tmake_file} t-tls" ;; esac + +case ${host} in +i[34567]86-*-darwin* | x86_64-*-darwin* | \ + i[34567]86-*-linux* | x86_64-*-linux*) + if test "${host_address}" = 32; then + tmake_file="${tmake_file} i386/${host_address}/t-fprules-softfp" + fi + ;; +esac --- gcc/libgcc/config/i386/32/sfp-machine.h.quad 2008-06-29 10:11:58.000000000 -0700 +++ gcc/libgcc/config/i386/32/sfp-machine.h 2008-06-29 09:18:56.000000000 -0700 @@ -0,0 +1,187 @@ +#define _FP_W_TYPE_SIZE 32 +#define _FP_W_TYPE unsigned int +#define _FP_WS_TYPE signed int +#define _FP_I_TYPE int + +/* The type of the result of a floating point comparison. This must + match `__libgcc_cmp_return__' in GCC for the target. */ +typedef int __gcc_CMPtype __attribute__ ((mode (__libgcc_cmp_return__))); +#define CMPtype __gcc_CMPtype + +#define __FP_FRAC_ADD_2(rh, rl, xh, xl, yh, yl) \ + __asm__("addl %5,%1; adcl %3,%0" \ + : "=r"(rh), "=r"(rl) \ + : "%0"(xh), "g"(yh), "%1"(xl), "g"(yl) \ + : "cc") + +#define __FP_FRAC_ADD_4(r3,r2,r1,r0,x3,x2,x1,x0,y3,y2,y1,y0) \ + do { \ + __asm__ volatile("addl %5,%1; adcl %3,%0" \ + : "=r"(r1), "=r"(r0) \ + : "%0"(x1), "g"(y1), "%1"(x0), "g"(y0) \ + : "cc"); \ + __asm__ volatile("adcl %5,%1; adcl %3,%0" \ + : "=r"(r3), "=r"(r2) \ + : "%0"(x3), "g"(y3), "%1"(x2), "g"(y2) \ + : "cc"); \ + } while (0) + +#define __FP_FRAC_SUB_2(rh, rl, xh, xl, yh, yl) \ + __asm__("subl %5,%1; sbbl %4,%0" \ + : "=r"(rh), "=r"(rl) \ + : "0"(xh), "1"(xl), "g"(yh), "g"(yl) \ + : "cc") + +#define __FP_CLZ(r, x) \ + do { \ + __asm__("bsrl %1,%0" : "=r"(r) : "g"(x) : "cc"); \ + r ^= 31; \ + } while (0) + +#define _i386_mul_32_64(rh, rl, x, y) \ + __asm__("mull %2" : "=d"(rh), "=a"(rl) : "%g"(x), "1"(y) : "cc") + +#define _i386_div_64_32(q, r, nh, nl, d) \ + __asm__ ("divl %4" : "=a"(q), "=d"(r) : "0"(nl), "1"(nh), "g"(d) : "cc") + + +#define _FP_MUL_MEAT_S(R,X,Y) \ + _FP_MUL_MEAT_1_wide(_FP_WFRACBITS_S,R,X,Y,_i386_mul_32_64) +#define _FP_MUL_MEAT_D(R,X,Y) \ + _FP_MUL_MEAT_2_wide(_FP_WFRACBITS_D,R,X,Y,_i386_mul_32_64) +#define _FP_MUL_MEAT_Q(R,X,Y) \ + _FP_MUL_MEAT_4_wide(_FP_WFRACBITS_Q,R,X,Y,umul_ppmm) + +#define _FP_DIV_MEAT_S(R,X,Y) _FP_DIV_MEAT_1_udiv(S,R,X,Y) +#define _FP_DIV_MEAT_D(R,X,Y) _FP_DIV_MEAT_2_udiv(D,R,X,Y) +#define _FP_DIV_MEAT_Q(R,X,Y) _FP_DIV_MEAT_4_udiv(Q,R,X,Y) + +#define _FP_NANFRAC_S _FP_QNANBIT_S +#define _FP_NANFRAC_D _FP_QNANBIT_D, 0 +/* Even if XFmode is 12byte, we have to pad it to 16byte since soft-fp + emulation is done in 16byte. */ +#define _FP_NANFRAC_E _FP_QNANBIT_E, 0, 0, 0 +#define _FP_NANFRAC_Q _FP_QNANBIT_Q, 0, 0, 0 +#define _FP_NANSIGN_S 1 +#define _FP_NANSIGN_D 1 +#define _FP_NANSIGN_E 1 +#define _FP_NANSIGN_Q 1 + +#define _FP_KEEPNANFRACP 1 + +/* Here is something Intel misdesigned: the specs don't define + the case where we have two NaNs with same mantissas, but + different sign. Different operations pick up different NaNs. */ +#define _FP_CHOOSENAN(fs, wc, R, X, Y, OP) \ + do { \ + if (_FP_FRAC_GT_##wc(X, Y) \ + || (_FP_FRAC_EQ_##wc(X,Y) && (OP == '+' || OP == '*'))) \ + { \ + R##_s = X##_s; \ + _FP_FRAC_COPY_##wc(R,X); \ + } \ + else \ + { \ + R##_s = Y##_s; \ + _FP_FRAC_COPY_##wc(R,Y); \ + } \ + R##_c = FP_CLS_NAN; \ + } while (0) + +#define FP_EX_INVALID 0x01 +#define FP_EX_DENORM 0x02 +#define FP_EX_DIVZERO 0x04 +#define FP_EX_OVERFLOW 0x08 +#define FP_EX_UNDERFLOW 0x10 +#define FP_EX_INEXACT 0x20 + +struct fenv +{ + unsigned short int __control_word; + unsigned short int __unused1; + unsigned short int __status_word; + unsigned short int __unused2; + unsigned short int __tags; + unsigned short int __unused3; + unsigned int __eip; + unsigned short int __cs_selector; + unsigned int __opcode:11; + unsigned int __unused4:5; + unsigned int __data_offset; + unsigned short int __data_selector; + unsigned short int __unused5; +}; + +#define FP_HANDLE_EXCEPTIONS \ + do { \ + if (_fex & FP_EX_INVALID) \ + { \ + double d; \ + __asm__ __volatile__ ("fldz"); \ + __asm__ __volatile__ ("fdiv %%st, %%st(0)" : "=t" (d)); \ + __asm__ __volatile__ ("fwait"); \ + } \ + if (_fex & FP_EX_DIVZERO) \ + { \ + double d; \ + __asm__ __volatile__ ("fldz; fld1"); \ + __asm__ __volatile__ ("fdivp %%st, %%st(1)" : "=t" (d)); \ + __asm__ __volatile__ ("fwait"); \ + } \ + if (_fex & FP_EX_OVERFLOW) \ + { \ + struct fenv temp; \ + __asm__ __volatile__ ("fnstenv %0" : "=m" (temp)); \ + temp.__status_word |= FP_EX_OVERFLOW; \ + __asm__ __volatile__ ("fldenv %0" : : "m" (temp)); \ + __asm__ __volatile__ ("fwait"); \ + } \ + if (_fex & FP_EX_UNDERFLOW) \ + { \ + struct fenv temp; \ + __asm__ __volatile__ ("fnstenv %0" : "=m" (temp)); \ + temp.__status_word |= FP_EX_UNDERFLOW; \ + __asm__ __volatile__ ("fldenv %0" : : "m" (temp)); \ + __asm__ __volatile__ ("fwait"); \ + } \ + if (_fex & FP_EX_INEXACT) \ + { \ + struct fenv temp; \ + __asm__ __volatile__ ("fnstenv %0" : "=m" (temp)); \ + temp.__status_word |= FP_EX_INEXACT; \ + __asm__ __volatile__ ("fldenv %0" : : "m" (temp)); \ + __asm__ __volatile__ ("fwait"); \ + } \ + } while (0) + +#define FP_RND_NEAREST 0 +#define FP_RND_ZERO 0xc00 +#define FP_RND_PINF 0x800 +#define FP_RND_MINF 0x400 + +#define _FP_DECL_EX \ + unsigned short _fcw __attribute__ ((unused)) = FP_RND_NEAREST + +#define FP_INIT_ROUNDMODE \ + do { \ + __asm__ ("fnstcw %0" : "=m" (_fcw)); \ + } while (0) + +#define FP_ROUNDMODE (_fcw & 0xc00) + +#define __LITTLE_ENDIAN 1234 +#define __BIG_ENDIAN 4321 + +#define __BYTE_ORDER __LITTLE_ENDIAN + +/* Define ALIASNAME as a strong alias for NAME. */ +#if defined __MACH__ +/* Mach-O doesn't support aliasing. If these functions ever return + anything but CMPtype we need to revisit this... */ +#define strong_alias(name, aliasname) \ + CMPtype aliasname (TFtype a, TFtype b) { return name(a, b); } +#else +# define strong_alias(name, aliasname) _strong_alias(name, aliasname) +# define _strong_alias(name, aliasname) \ + extern __typeof (name) aliasname __attribute__ ((alias (#name))); +#endif --- gcc/libgcc/config/i386/32/t-fprules-softfp.quad 2008-06-29 10:13:31.000000000 -0700 +++ gcc/libgcc/config/i386/32/t-fprules-softfp 2008-06-29 08:32:04.000000000 -0700 @@ -0,0 +1,5 @@ +# Filter out TImode functions +tifunctions = fixtfti.c fixunstfti.c floattitf.c floatuntitf.c +tifunctions := $(addprefix $(gcc_srcdir)/config/soft-fp/, $(tifunctions)) + +LIB2ADD := $(filter-out $(tifunctions), $(LIB2ADD)) --- gcc/libgcc/config/i386/64/sfp-machine.h.quad 2008-06-29 10:12:22.000000000 -0700 +++ gcc/libgcc/config/i386/64/sfp-machine.h 2008-06-29 06:31:46.000000000 -0700 @@ -0,0 +1,143 @@ +#define _FP_W_TYPE_SIZE 64 +#define _FP_W_TYPE unsigned long +#define _FP_WS_TYPE signed long +#define _FP_I_TYPE long + +typedef int TItype __attribute__ ((mode (TI))); +typedef unsigned int UTItype __attribute__ ((mode (TI))); + +#define TI_BITS (__CHAR_BIT__ * (int)sizeof(TItype)) + +/* The type of the result of a floating point comparison. This must + match `__libgcc_cmp_return__' in GCC for the target. */ +typedef int __gcc_CMPtype __attribute__ ((mode (__libgcc_cmp_return__))); +#define CMPtype __gcc_CMPtype + +#define _FP_MUL_MEAT_Q(R,X,Y) \ + _FP_MUL_MEAT_2_wide(_FP_WFRACBITS_Q,R,X,Y,umul_ppmm) + +#define _FP_DIV_MEAT_Q(R,X,Y) _FP_DIV_MEAT_2_udiv(Q,R,X,Y) + +#define _FP_NANFRAC_S _FP_QNANBIT_S +#define _FP_NANFRAC_D _FP_QNANBIT_D +#define _FP_NANFRAC_E _FP_QNANBIT_E, 0 +#define _FP_NANFRAC_Q _FP_QNANBIT_Q, 0 +#define _FP_NANSIGN_S 1 +#define _FP_NANSIGN_D 1 +#define _FP_NANSIGN_E 1 +#define _FP_NANSIGN_Q 1 + +#define _FP_KEEPNANFRACP 1 + +/* Here is something Intel misdesigned: the specs don't define + the case where we have two NaNs with same mantissas, but + different sign. Different operations pick up different NaNs. */ +#define _FP_CHOOSENAN(fs, wc, R, X, Y, OP) \ + do { \ + if (_FP_FRAC_GT_##wc(X, Y) \ + || (_FP_FRAC_EQ_##wc(X,Y) && (OP == '+' || OP == '*'))) \ + { \ + R##_s = X##_s; \ + _FP_FRAC_COPY_##wc(R,X); \ + } \ + else \ + { \ + R##_s = Y##_s; \ + _FP_FRAC_COPY_##wc(R,Y); \ + } \ + R##_c = FP_CLS_NAN; \ + } while (0) + +#define FP_EX_INVALID 0x01 +#define FP_EX_DENORM 0x02 +#define FP_EX_DIVZERO 0x04 +#define FP_EX_OVERFLOW 0x08 +#define FP_EX_UNDERFLOW 0x10 +#define FP_EX_INEXACT 0x20 + +struct fenv +{ + unsigned short int __control_word; + unsigned short int __unused1; + unsigned short int __status_word; + unsigned short int __unused2; + unsigned short int __tags; + unsigned short int __unused3; + unsigned int __eip; + unsigned short int __cs_selector; + unsigned int __opcode:11; + unsigned int __unused4:5; + unsigned int __data_offset; + unsigned short int __data_selector; + unsigned short int __unused5; +}; + +#define FP_HANDLE_EXCEPTIONS \ + do { \ + if (_fex & FP_EX_INVALID) \ + { \ + float f = 0.0; \ + __asm__ __volatile__ ("divss %0, %0 " : : "x" (f)); \ + } \ + if (_fex & FP_EX_DIVZERO) \ + { \ + float f = 1.0, g = 0.0; \ + __asm__ __volatile__ ("divss %1, %0" : : "x" (f), "x" (g)); \ + } \ + if (_fex & FP_EX_OVERFLOW) \ + { \ + struct fenv temp; \ + __asm__ __volatile__ ("fnstenv %0" : "=m" (temp)); \ + temp.__status_word |= FP_EX_OVERFLOW; \ + __asm__ __volatile__ ("fldenv %0" : : "m" (temp)); \ + __asm__ __volatile__ ("fwait"); \ + } \ + if (_fex & FP_EX_UNDERFLOW) \ + { \ + struct fenv temp; \ + __asm__ __volatile__ ("fnstenv %0" : "=m" (temp)); \ + temp.__status_word |= FP_EX_UNDERFLOW; \ + __asm__ __volatile__ ("fldenv %0" : : "m" (temp)); \ + __asm__ __volatile__ ("fwait"); \ + } \ + if (_fex & FP_EX_INEXACT) \ + { \ + struct fenv temp; \ + __asm__ __volatile__ ("fnstenv %0" : "=m" (temp)); \ + temp.__status_word |= FP_EX_INEXACT; \ + __asm__ __volatile__ ("fldenv %0" : : "m" (temp)); \ + __asm__ __volatile__ ("fwait"); \ + } \ + } while (0) + +#define FP_RND_NEAREST 0 +#define FP_RND_ZERO 0xc00 +#define FP_RND_PINF 0x800 +#define FP_RND_MINF 0x400 + +#define _FP_DECL_EX \ + unsigned short _fcw __attribute__ ((unused)) = FP_RND_NEAREST + +#define FP_INIT_ROUNDMODE \ + do { \ + __asm__ ("fnstcw %0" : "=m" (_fcw)); \ + } while (0) + +#define FP_ROUNDMODE (_fcw & 0xc00) + +#define __LITTLE_ENDIAN 1234 +#define __BIG_ENDIAN 4321 + +#define __BYTE_ORDER __LITTLE_ENDIAN + +/* Define ALIASNAME as a strong alias for NAME. */ +#if defined __MACH__ +/* Mach-O doesn't support aliasing. If these functions ever return + anything but CMPtype we need to revisit this... */ +#define strong_alias(name, aliasname) \ + CMPtype aliasname (TFtype a, TFtype b) { return name(a, b); } +#else +# define strong_alias(name, aliasname) _strong_alias(name, aliasname) +# define _strong_alias(name, aliasname) \ + extern __typeof (name) aliasname __attribute__ ((alias (#name))); +#endif --- gcc/libgcc/configure.ac.quad 2008-06-21 07:10:37.000000000 -0700 +++ gcc/libgcc/configure.ac 2008-06-29 06:55:16.000000000 -0700 @@ -153,6 +153,21 @@ AC_CACHE_CHECK([whether fixed-point is s fixed_point=$libgcc_cv_fixed_point AC_SUBST(fixed_point) +# Check 32bit or 64bit for x86. +case ${host} in +i[34567]86-*-* | x86_64-*-*) + cat > conftest.c < fixed_point=$libgcc_cv_fixed_point +# Check 32bit or 64bit for x86. +case ${host} in +i3456786-*-* | x86_64-*-*) + cat > conftest.c <