f9989b51a9
toplevel: * Makefile.tpl (EXTRA_GCC_FLAGS): Remove LIBGCC2_CFLAGS, LIBGCC2_DEBUG_CFLAGS, LIBGCC2_INCLUDES. * Makefile.in: Regenerate. config: * mh-interix (LIBGCC2_DEBUG_CFLAGS): Remove. gcc: * Makefile.in (LIBGCC2_DEBUG_CFLAGS LIBGCC2_CFLAGS) (LIBGCC2_INCLUDES, TARGET_LIBGCC2_CFLAGS, LIB2FUNCS_EXTRA) (LIB2FUNCS_STATIC_EXTRA, LIB2FUNCS_EXCLUDE, T, T_TARGET) (INCLUDES_FOR_TARGET): Remove. (LIBGCC2_CFLAGS): Don't export. (LIB2FUNCS_ST, LIB2_DIVMOD_FUNCS, LIB2ADD, LIB2ADD_ST, srcdirify): Remove. (libgcc-support): Remove $(LIB2ADD), $(LIB2ADD_ST) dependencies. (libgcc.mvars): Likewise. Don't emit LIB2FUNCS_ST, LIB2FUNCS_EXCLUDE, LIB2ADD, LIB2ADD_ST, LIB2_SIDITI_CONV_FUNCS, LIB2_DIVMOD_FUNCS, LIBGCC2_CFLAGS, TARGET_LIBGCC2_CFLAGS. Emit GTHREAD_FLAGS. * libgcc2.c, libgcc2.h, gbl-ctors.h, longlong.h: Move to ../libgcc. * config/darwin-64.c: Move to ../libgcc/config. * config/divmod.c, config/floatunsidf.c, config/floatunsisf.c, config/floatunsitf.c, config/floatunsixf.c, config/udivmod.c, config/udivmodsi4.c: Move to ../libgcc/config. * config/gthr-posix.c: Move to ../libgcc/config/alpha. * config/memcmp.c, config/memcpy.c, config/memmove.c, config/memset.c: Move to ../libgcc/config. * config/t-darwin (TARGET_LIBGCC2_CFLAGS): Remove. * config/t-freebsd: Remove. * config/t-freebsd-thread: Move to ../libgcc/config. * config/t-libgcc-pic: Move to ../libgcc/config. * config/t-libunwind (TARGET_LIBGCC2_CFLAGS): Remove. * config/t-linux: Remove. * config/t-lynx (TARGET_LIBGCC2_CFLAGS, LIBGCC, INSTALL_LIBGCC): Remove * config/t-openbsd-thread: Move to ../libgcc/config. * config/t-rtems (LIBGCC2_INCLUDES): Remove. * config/t-sol2 (TARGET_LIBGCC2_CFLAGS): Remove. * config/t-svr4: Remove. * config/t-vxworks (LIBGCC, INSTALL_LIBGCC, TARGET_LIBGCC2_CFLAGS) (LIBGCC2_DEBUG_CFLAGS, LIB2FUNCS_EXTRA, LIBGCC2_INCLUDES): Remove. * config/vxlib.c, config/vxlib-tls.c: Move to ../libgcc/config. * config/alpha/qrnnd.asm: Move to ../libgcc/config/alpha/qrnnd.S. * config/alpha/t-alpha, config/alpha/t-ieee: Remove. * config/alpha/t-vms (LIB2FUNCS_EXTRA, LIBGCC, INSTALL_LIBGCC): Remove. * config/alpha/vms-gcc_shell_handler.c: Move to ../libgcc/config/alpha. * config/arm/bpabi.c, config/arm/unaligned-funcs.c, config/arm/fp16.c, config/arm/linux-atomic.c, config/arm/linux-atomic-64bit.c: Move to ../libgcc/config/arm. * config/arm/t-arm-elf (LIBGCC, INSTALL_LIBGCC) (TARGET_LIBGCC2_CFLAGS): Remove. * config/arm/t-bpabi, config/arm/t-linux: Remove. * config/arm/t-linux-eabi (TARGET_LIBGCC2_CFLAGS) (LIB2FUNCS_STATIC_EXTRA): Remove. * config/arm/t-netbsd: Remove. * config/arm/t-strongarm-elf (LIBGCC, INSTALL_LIBGCC) (TARGET_LIBGCC2_CFLAGS): Remove. * config/arm/t-symbian (LIB2FUNCS_STATIC_EXTRA): Remove. * config/arm/t-wince-pe (LIBGCC, INSTALL_LIBGCC) (TARGET_LIBGCC2_CFLAGS): Remove. * config/avr/t-avr (LIB2FUNCS_EXCLUDE, TARGET_LIBGCC2_CFLAGS) (LIBGCC, INSTALL_LIBGCC): Remove. * config/bfin/t-bfin-elf (TARGET_LIBGCC2_CFLAGS): Remove. * config/bfin/t-bfin-linux: Likewise. * config/bfin/t-bfin-uclinux: Likewise. * config/c6x/eqd.c, config/c6x/eqf.c, config/c6x/ged.c, config/c6x/gef.c, config/c6x/gtd.c, config/c6x/gtf.c, config/c6x/led.c, config/c6x/lef.c, config/c6x/ltd.c, config/c6x/ltf.c: Move to ../libgcc/config/c6x. * config/c6x/t-c6x-elf (LIB2FUNCS_EXCLUDE, LIB2FUNCS_EXTRA): Remove. * config/c6x/t-c6x-uclinux (TARGET_LIBGCC2_CFLAGS): Remove. * config/cris/arit.c: Move to ../libgcc/config/cris. * config/cris/cris_abi_symbol.c: Remove. * config/cris/cris.h: Remove obsolete comment. * config/cris/mulsi3.asm: Move to ../libgcc/config/cris/mulsi3.S. * config/cris/t-cris (LIB2FUNCS_EXTRA, CRIS_LIB1CSRC) ($(LIB2FUNCS_EXTRA)): Remove. * config/cris/t-elfmulti (LIB2FUNCS_STATIC_EXTRA, INSTALL_LIBGCC) (LIBGCC): Remove. * config/cris/t-linux (TARGET_LIBGCC2_CFLAGS): Remove. * config/fr30/t-fr30: Remove. * config/frv/cmovd.c, config/frv/cmovh.c, config/frv/cmovw.c, config/frv/modi.c, config/frv/uitod.c, config/frv/uitof.c, config/frv/ulltod.c, config/frv/ulltof.c, config/frv/umodi.c: Move to ../libgcc/config/frv. * config/frv/t-frv (LIB2FUNCS_EXTRA, TARGET_LIBGCC2_CFLAGS) (cmovh.c, cmovw.c, cmovd.c, modi.c, umodi.c, uitof.c, uitod.c) (ulltof.c, LIBGCC, INSTALL_LIBGCC): Remove. * config/frv/t-linux (TARGET_LIBGCC2_CFLAGS): Remove. * config/h8300/clzhi2.c, config/h8300/ctzhi2.c, config/h8300/fixunssfsi.c, config/h8300/parityhi2.c, config/h8300/popcounthi2.c: Move to ../libgcc/config/h8300. * config/h8300/t-h8300 (LIB2FUNCS_EXTRA, TARGET_LIBGCC2_CFLAGS) (LIBGCC, INSTALL_LIBGCC): Remove. * config/i386/gthr-win32.c: Move to ../libgcc/config/i386. * config/i386/t-cygming (LIBGCC2_INCLUDES): Remove. * config/i386/t-cygwin: Remove. * config/i386/t-darwin (LIB2_SIDITI_CONV_FUNCS, LIB2FUNCS_EXTRA) (LIB2FUNCS_EXCLUDE): Remove. * config/i386/t-darwin64 (LIB2_SIDITI_CONV_FUNCS, LIB2FUNCS_EXTRA) (LIBGCC, INSTALL_LIBGCC): Remove. * config/i386/t-gthr-win32: Move to ../libgcc/config/i386. * config/i386/t-linux64 (LIBGCC, INSTALL_LIBGCC): Remove. * config/i386/t-mingw-w32: Likewise. * config/i386/t-mingw-w64: Likewise. * config/i386/t-openbsd: Likewise. * config/i386/t-nto: Remove. * config/ia64/quadlib.c: Move to ../libgcc/config/ia64. * config/ia64/t-hpux (LIBGCC, INSTALL_LIBGCC, LIB2FUNCS_EXTRA) (quadlib.c): Remove. * config/ia64/t-ia64: Remove comment. * config/iq2000/lib2extra-funcs.c: Move to ../libgcc/config/iq2000/lib2funcs.c. * config/iq2000/t-iq2000: Remove. * config/m32c/m32c-lib2.c: Move to ../libgcc/config/m32c/lib2funcs.c. * config/m32c/m32c-lib2-trapv.c: Move to ../libgcc/config/m32c/trapv.c. * config/m32r/t-linux (TARGET_LIBGCC2_CFLAGS): Remove. * config/m32c/t-m32c (LIB2FUNCS_EXTRA): Remove. * config/m32r/t-m32r (TARGET_LIBGCC2_CFLAGS, LIBGCC) (INSTALL_LIBGCC): Remove. * config/m68k/fpgnulib.c: Move to ../libgcc/config/m68k. * config/m68k/t-floatlib: Remove. * config/m68k/t-mlibs (LIBGCC, INSTALL_LIBGCC): Remove. * config/mcore/t-mcore (TARGET_LIBGCC2_CFLAGS): Remove. Fix typo. (LIBGCC, INSTALL_LIBGCC): Remove. * config/mep/mep-lib2.c: Move to ../libgcc/config/mep/lib2funcs.c. * config/mep/mep-tramp.c: Move to ../libgcc/config/mep/tramp.c. * config/mep/t-mep (LIB2FUNCS_EXTRA): Remove. * config/mips/t-elf (TARGET_LIBGCC2_CFLAGS, LIBGCC) (INSTALL_LIBGCC): Remove. * config/mips/t-isa3264: Likewise. * config/mips/t-mips (LIB2_SIDITI_CONV_FUNCS): Remove. * config/mips/t-r3900 (TARGET_LIBGCC2_CFLAGS, LIBGCC) (INSTALL_LIBGCC): Remove. * config/mips/t-sde (LIBGCC, INSTALL_LIBGCC): Remove. * config/mips/t-sr71k (TARGET_LIBGCC2_CFLAGS, LIBGCC) (INSTALL_LIBGCC): Remove. * config/mips/t-vr (TARGET_LIBGCC2_CFLAGS) (LIB2FUNCS_STATIC_EXTRA): Remove. * config/mips/vr4120-div.S: Move to ../libgcc/config/mips. * config/mmix/t-mmix (TARGET_LIBGCC2_CFLAGS): Remove. * config/mn10300/t-mn10300 (LIBGCC, INSTALL_LIBGCC): Remove. * config/pa/fptr.c, config/pa/linux-atomic.c: Move to ../libgcc/config/pa. * config/pa/lib2funcs.asm: Move to ../libgcc/config/pa/lib2funcs.S. * config/pa/quadlib.c: Move to ../libgcc/config/pa. * config/pa/t-dce-thr (LIBGCC, INSTALL_LIBGCC): Remove. * config/pa/t-linux, config/pa/t-linux64: Remove. * config/pa/t-pa-hpux, config/pa/t-pa-hpux10, config/pa/t-pa-hpux11, config/pa/t-pa64: Remove. * config/pdp11/t-pdp11 (TARGET_LIBGCC2_CFLAGS, LIB2FUNCS_EXTRA): Remove. * config/picochip/libgccExtras: Move to ../libgcc/config/picochip. * config/picochip/t-picochip (LIB2FUNCS_EXTRA, RANLIB_FOR_TARGET) (TARGET_LIBGCC2_CFLAGS, LIBGCC2_DEBUG_CFLAGS): Remove. * config/rs6000/crtresfpr.asm: Move to ../libgcc/config/rs6000/crtresfpr.S. * config/rs6000/crtresgpr.asm: Move to ../libgcc/config/rs6000/crtresgpr.S. * config/rs6000/crtresxfpr.asm: Move to ../libgcc/config/rs6000/crtresxfpr.S. * config/rs6000/crtresxgpr.asm: Move to ../libgcc/config/rs6000/crtresxgpr.S. * config/rs6000/crtsavfpr.asm: Move to ../libgcc/config/rs6000/crtsavfpr.S. * config/rs6000/crtsavgpr.asm: Move to ../libgcc/config/rs6000/crtsavgpr.S. * config/rs6000/darwin-asm.h: Move to ../libgcc/config/rs6000. * config/rs6000/darwin-fpsave.asm: Move to ../libgcc/config/rs6000/darwin-fpsave.S. * config/rs6000/darwin-gpsave.asm: Move to ../libgcc/config/rs6000/darwin-gpsave.S. * config/rs6000/darwin-tramp.asm: Move to ../libgcc/config/rs6000/darwin-tramp.S. * config/rs6000/darwin-vecsave.asm: Move to ../libgcc/config/rs6000/darwin-vecsave.S. * config/rs6000/darwin-world.asm: Move to ../libgcc/config/rs6000/darwin-world.S. * config/rs6000/e500crtres32gpr.asm: Move to ../libgcc/config/rs6000/e500crtres32gpr.S. * config/rs6000/e500crtres64gpr.asm: Move to ../libgcc/config/rs6000/e500crtres64gpr.S. * config/rs6000/e500crtres64gprctr.asm: Move to ../libgcc/config/rs6000/e500crtres64gprctr.S. * config/rs6000/e500crtrest32gpr.asm: Move to ../libgcc/config/rs6000/e500crtrest32gpr.S. * config/rs6000/e500crtrest64gpr.asm: Move to ../libgcc/config/rs6000/e500crtrest64gpr.S. * config/rs6000/e500crtresx32gpr.asm: Move to ../libgcc/config/rs6000/e500crtresx32gpr.S. * config/rs6000/e500crtresx64gpr.asm: Move to ../libgcc/config/rs6000/e500crtresx64gpr.S. * config/rs6000/e500crtsav32gpr.asm: Move to ../libgcc/config/rs6000/e500crtsav32gpr.S. * config/rs6000/e500crtsav64gpr.asm: Move to ../libgcc/config/rs6000/e500crtsav64gpr.S. * config/rs6000/e500crtsav64gprctr.asm: Move to ../libgcc/config/rs6000/e500crtsav64gprctr.S. * config/rs6000/e500crtsavg32gpr.asm: Move to ../libgcc/config/rs6000/e500crtsavg32gpr.S. * config/rs6000/e500crtsavg64gpr.asm: Move to ../libgcc/config/rs6000/e500crtsavg64gpr.S. * config/rs6000/e500crtsavg64gprctr.asm: Move to ../libgcc/config/rs6000/e500crtsavg64gprctr.S. * config/rs6000/eabi.asm: Move to ../libgcc/config/rs6000/eabi.S. * config/rs6000/t-aix43 (LIBGCC, INSTALL_LIBGCC, LIB2FUNCS_EXTRA) (TARGET_LIBGCC2_CFLAGS): Remove. * config/rs6000/t-aix52: Likewise. * config/rs6000/t-darwin: Remove. * config/rs6000/t-darwin64 (LIB2_SIDITI_CONV_FUNCS) (LIB2FUNCS_EXTRA): Remove. * config/rs6000/t-fprules (LIBGCC, INSTALL_LIBGCC): Remove. * config/rs6000/t-linux64 (TARGET_LIBGCC2_CFLAGS): Remove. * config/rs6000/t-lynx (LIB2FUNCS_EXTRA, tramp.S, LIBGCC) (INSTALL_LIBGCC): Remove. * config/rs6000/t-netbsd (LIB2FUNCS_EXTRA) (LIB2FUNCS_STATIC_EXTRA, tramp.S, crtsavfpr.S, crtresfpr.S) (crtsavgpr.S, crtresgpr.S, crtresxfpr.S, crtresxgpr.S, LIBGCC) (INSTALL_LIBGCC, $(T)crtsavfpr$(objext), $(T)crtresfpr$(objext)) (($(T)crtsavgpr$(objext), $(T)crtresgpr$(objext), $(T)crtresxfpr$(objext), $(T)crtresxgpr$(objext)): Remove. * config/rs6000/t-ppccomm (LIB2FUNCS_EXTRA) (LIB2FUNCS_STATIC_EXTRA, eabi.S, tramp.S): Remove. * config/rs6000/t-spe (LIBGCC, INSTALL_LIBGCC): Remove. * config/rs6000/t-vxworks: Remove comment. * config/rs6000/tramp.asm: Move to ../libgcc/config/rs6000/tramp.S. * config/rx/t-rx (LIBGCC, INSTALL_LIBGCC): Remove. * config/sh/linux-atomic.asm: Move to ../libgcc/config/sh/linux-atomic.S. * config/sh/t-linux (LIB2FUNCS_EXTRA): Remove. * config/sh/t-netbsd: Remove. * config/sh/t-sh (TARGET_LIBGCC2_CFLAGS, LIBGCC, INSTALL_LIBGCC): Remove. * config/sparc/t-elf (LIBGCC, INSTALL_LIBGCC): Remove. * config/sparc/t-leon: Likewise. * config/sparc/t-leon3: Likewise. * config/sparc/t-linux64: Likewise. * config/sparc/t-netbsd64: Fix typo. Remove comment. * config/spu/divmodti4.c, config/spu/divv2df3.c, config/spu/float_disf.c, config/spu/float_unsdidf.c, config/spu/float_unsdisf.c, config/spu/float_unssidf.c, config/spu/mfc_multi_tag_release.c, config/spu/mfc_multi_tag_reserve.c, config/spu/mfc_tag_release.c, config/spu/mfc_tag_reserve.c, config/spu/mfc_tag_table.c, config/spu/multi3.c: Move to ../libgcc/config/spu. * config/spu/t-spu-elf (TARGET_LIBGCC2_CFLAGS, LIB2FUNCS_EXCLUDE) (LIB2FUNCS_STATIC_EXTRA, LIB2_SIDITI_CONV_FUNCS, LIBGCC) (INSTALL_LIBGCC): Remove. * config/stormy16/stormy16-lib2.c: Move to ../libgcc/config/stormy16/lib2.c. * config/stormy16/stormy16-lib2-ashlsi3.c: Move to ../libgcc/config/stormy16/ashlsi3.c. * config/stormy16/stormy16-lib2-ashrsi3.c: Move to ../libgcc/config/stormy16/ashrsi3.c. * config/stormy16/stormy16-lib2-clzhi2.c: Move to ../libgcc/config/stormy16/clzhi2.c. * config/stormy16/stormy16-lib2-cmpsi2.c: Move to ../libgcc/config/stormy16/cmpsi2.c. * config/stormy16/stormy16-lib2-ctzhi2.c: Move to ../libgcc/config/stormy16/ctzhi2.c. * config/stormy16/stormy16-lib2-divsi3.c: Move to ../libgcc/config/stormy16/divsi3.c. * config/stormy16/stormy16-lib2-ffshi2.c: Move to ../libgcc/config/stormy16/ffshi2.c. * config/stormy16/stormy16-lib2-lshrsi3.c: Move to ../libgcc/config/stormy16/lshrsi3.c. * config/stormy16/stormy16-lib2-modsi3.c: Move to ../libgcc/config/stormy16/modsi3.c. * config/stormy16/stormy16-lib2-parityhi2.c: Move to ../libgcc/config/stormy16/parityhi2.c. * config/stormy16/stormy16-lib2-popcounthi2.c: Move to ../libgcc/config/stormy16/popcounthi2.c. * config/stormy16/stormy16-lib2-ucmpsi2.c: Move to ../libgcc/config/stormy16/ucmpsi2.c. * config/stormy16/stormy16-lib2-udivmodsi4.c: Move to ../libgcc/config/stormy16/udivmodsi4.c. * config/stormy16/stormy16-lib2-udivsi3.c: Move to ../libgcc/config/stormy16/udivsi3.c. * config/stormy16/stormy16-lib2-umodsi3.c: Move to ../libgcc/config/stormy16/umodsi3.c. * config/stormy16/t-stormy16: Move to ../libgcc/config/t-stormy16. * config/v850/t-v850 (INSTALL_LIBGCC): Remove. * config/xtensa/lib2funcs.S: Move to ../libgcc/config/xtensa. * config/xtensa/t-elf: Remove. * config/xtensa/t-xtensa (LIB2FUNCS_EXTRA): Remove. * config.gcc (*-*-freebsd*): Remove t-freebsd, t-freebsd-thread from tmake_file. (*-*-linux*, frv-*-*linux*, *-*-kfreebsd*-gnu, *-*-knetbsd*-gnu, *-*-gnu*, *-*-kopensolaris*-gnu): Remove t-linux from tmake_file. (*-*-netbsd*): Remove t-libgcc-pic from tmake_file. (*-*-openbsd*): Likewise. Remove t-openbsd-thread for posix threads. (alpha*-*-linux*): Remove alpha/t-alpha, alpha/t-ieee from tmake_file. (alpha*-*-freebsd*): Likewise. (alpha*-*-netbsd*): Likewise. (alpha*-*-openbsd*): Likewise. (alpha64-dec-*vms*): Likewise. (alpha*-dec-*vms*): Likewise. (arm*-*-netbsdelf*): Remove arm/t-netbsd from tmake_file. (arm*-*-linux*): Remove t-linux from tmake_file. Remove arm/t-bpabi from tmake_file for arm*-*-linux-*eabi. (arm*-*-uclinux*): Remove arm/t-bpabi from tmake_file for arm*-*-uclinux*eabi. (arm*-*-eabi*, arm*-*-symbianelf* ): Remove arm/t-bpabi from tmake_file for arm*-*-eabi*. (fr30-*-elf): Remove tmake_file. (hppa*64*-*-linux*): Remove tmake_file. (hppa*-*-linux*): Likewise. (hppa[12]*-*-hpux10*): Remove pa/t-pa-hpux10, pa/t-pa-hpux from tmake_file. (hppa*64*-*-hpux11*): Remove pa/t-pa64, pa/t-pa-hpux from tmake_file. (hppa[12]*-*-hpux11*): Remove pa/t-pa-hpux11, pa/t-pa-hpux from tmake_file. (i[34567]86-*-elf*): Remove tmake_file. (x86_64-*-elf*): Likewise. (i[34567]86-*-nto-qnx*): Likewise. (i[34567]86-*-cygwin*): Remove i386/t-cygwin from tmake_file. (i[34567]86-*-mingw*, x86_64-*-mingw*): Remove i386/t-gthr-win32 from tmake_file if using win32 threads. (iq2000*-*-elf*): Remove tmake-file. (microblaze*-linux*): Likewise. (sh-*-elf*, sh[12346l]*-*-elf*, sh-*-linux*) (sh[2346lbe]*-*-linux*, sh-*-netbsdelf*, shl*-*-netbsdelf*) (sh5-*-netbsd*, sh5l*-*-netbsd*, sh64-*-netbsd*) (sh64l*-*-netbsd*): Remove sh/t-netbsd from tmake_file for sh5*-*-netbsd*, sh64*-netbsd*, *-*-netbsd. (xtensa*-*-elf*): Remove tmake_file. gcc/po: * EXCLUDES (config/vxlib.c, gbl-ctors.h, libgcc2.c, libgcc2.h) (longlong.h): Remove. libgcc: * configure.ac: Include ../config/picflag.m4. (GCC_PICFLAG): Call it. Substitute. * configure: Regenerate. * Makefile.in (gcc_srcdir): Remove. (LIBGCC2_DEBUG_CFLAGS, LIBGCC2_CFLAGS, LIBGCC2_INCLUDES) (HOST_LIBGCC2_CFLAGS, PICFLAG, LIB2FUNCS_ST, LIB2FUNCS_EXCLUDE) (LIB2_DIVMOD_FUNCS, LIB2ADD, LIB2ADD_ST): Set. ($(lib2funcs-o), $(lib2funcs-s-o), $(lib2-divmod-o)) ($(lib2-divmod-s-o)): Use $(srcdir) to refer to libgcc2.c. Use $<. Remove comment. * libgcc2.c, libgcc2.h, gbl-ctors.h, longlong.h: New files. * siditi-object.mk ($o$(objext), $(o)_s$(objext)): Use $(srcdir) to refer to libgcc2.c. Use $<. * config/darwin-64.c: New file. * config/darwin-crt3.c: Remove comment. * config/divmod.c, config/floatunsidf.c, config/floatunsisf.c, config/floatunsitf.c, config/floatunsixf.c, config/udivmod.c, config/udivmodsi4.c: New files. * config/memcmp.c, config/memcpy.c, config/memmove.c, config/memset.c: New files. * config/t-crtstuff-pic (CRTSTUFF_T_CFLAGS_S): Use $(PICFLAG). * config/t-darwin (HOST_LIBGCC2_CFLAGS): Set. * config/t-freebsd-thread, config/t-libgcc-pic: New files. * config/t-libunwind (HOST_LIBGCC2_CFLAGS): Set. * config/t-openbsd-thread: New file. * config/t-sol2 (HOST_LIBGCC2_CFLAGS): Remove. * config/t-vxworks, config/vxlib-tls.c, config/vxlib.c: New files. * config/alpha/gthr-posix.c, config/alpha/qrnnd.S: New files. * config/alpha/t-alpha (LIB2ADD): Use $(srcdir) to refer to qrnnd.S. Adapt filename. * config/alpha/t-osf-pthread (LIB2ADD): Use $(srcdir)/config/alpha to refer to gthr-posix.c. * config/alpha/t-vms (LIB2ADD): Set. * config/alpha/vms-gcc_shell_handler.c: New file. * config/arm/bpabi.c, config/arm/fp16.c, config/arm/linux-atomic.c, config/arm/linux-atomic-64bit.c, config/arm/unaligned-funcs.c: New files. * config/arm/t-bpabi (LIB2ADD, LIB2ADD_ST): Set. * config/arm/t-elf (HOST_LIBGCC2_CFLAGS): Set. * config/arm/t-linux: Likewise. * config/arm/t-linux-eabi (LIB2ADD_ST): Add. * config/arm/t-netbsd: New file. * config/arm/t-strongarm-elf (HOST_LIBGCC2_CFLAGS): Set. * config/arm/t-symbian (LIB2ADD_ST): Set. * config/avr/t-avr (LIB2FUNCS_EXCLUDE, HOST_LIBGCC2_CFLAGS): Set. * config/bfin/t-crtstuff (CRTSTUFF_T_CFLAGS): Use $(PICFLAG). * config/bfin/t-elf: New file. * config/c6x/eqd.c, config/c6x/eqf.c, config/c6x/ged.c, config/c6x/gef.c, config/c6x/gtd.c, config/c6x/gtf.c, config/c6x/led.c, config/c6x/lef.c, config/c6x/ltd.c, config/c6x/ltf.c: New files. * config/c6x/t-elf (LIB2FUNCS_EXCLUDE, LIB2ADD) (HOST_LIBGCC2_CFLAGS): Set. * config/c6x/t-uclinux (HOST_LIBGCC2_CFLAGS): Set. (CRTSTUFF_T_CFLAGS): Use $(PICFLAG). * config/cris/arit.c, config/cris/mulsi3.S, config/cris/t-cris: New files. * config/cris/t-elfmulti (LIB2ADD_ST): Set. * config/cris/t-linux (HOST_LIBGCC2_CFLAGS): Remove. * config/frv/cmovd.c, config/frv/cmovh.c, config/frv/cmovw.c, config/frv/modi.c, config/frv/uitod.c, config/frv/uitof.c, config/frv/ulltod.c, config/frv/ulltof.c, config/frv/umodi.c: New files. * config/frv/t-frv (LIB2ADD): Set. * config/frv/t-linux (CRTSTUFF_T_CFLAGS): Use $(PICFLAG). * config/h8300/clzhi2.c, config/h8300/ctzhi2.c, config/h8300/fixunssfsi.c, config/h8300/parityhi2.c, config/h8300/popcounthi2.c: New files. * config/h8300/t-h8300 (LIB2ADD, HOST_LIBGCC2_CFLAGS): Set. * config/i386/gthr-win32.c: New file. * config/i386/t-cygming (LIBGCC2_INCLUDES): Set. * config/i386/t-cygwin: Likewise. * config/i386/t-darwin, config/i386/t-darwin64, config/i386/t-gthr-win32, config/i386/t-interix: New files. * config/i386/t-nto (HOST_LIBGCC2_CFLAGS): Set. (CRTSTUFF_T_CFLAGS): Use $(PICFLAG). * config/i386/t-sol2 (CRTSTUFF_T_CFLAGS): Use $(PICFLAG). * config/ia64/quadlib.c: New file. * config/ia64/t-hpux (LIB2ADD): Set. * config/ia64/t-ia64: Add comment. * config/iq2000/lib2funcs.c, config/iq2000/t-iq2000: New files. * config/lm32/t-uclinux (CRTSTUFF_T_CFLAGS): Use $(PICFLAG). (HOST_LIBGCC2_CFLAGS): Append, remove -fPIC. * config/m32c/lib2funcs.c, config/m32c/trapv.c: New files. * config/m32c/t-m32c (LIB2ADD): Set. * config/m32r/t-linux (HOST_LIBGCC2_CFLAGS): Set. * config/m32r/t-m32r: Likewise. * config/m68k/fpgnulib.c: New file. * config/m68k/t-floatlib (LIB2ADD): Set. (xfgnulib.c): New target. * config/mcore/t-mcore (HOST_LIBGCC2_CFLAGS): Set. * config/mep/lib2funcs.c, config/mep/tramp.c: New files. * config/mep/t-mep (LIB2ADD): Set. * config/microblaze/divsi3.asm: Rename to divsi3.S. * config/microblaze/moddi3.asm: Rename to moddi3.S. * config/microblaze/modsi3.asm: Rename to modsi3.S. * config/microblaze/muldi3_hard.asm: Rename to hard.S. * config/microblaze/mulsi3.asm: Rename to mulsi3.S. * config/microblaze/stack_overflow_exit.asm: Rename to exit.S. * config/microblaze/udivsi3.asm: Rename to udivsi3.S. * config/microblaze/umodsi3.asm: Rename to umodsi3.S. * config/microblaze/t-microblaze (LIB2ADD): Reflect this. * config/mips/t-elf, config/mips/t-vr, config/mips/vr4120-div.S: New files. * config/mips/t-mips (LIB2_SIDITI_CONV_FUNCS): Set. * config/mmix/t-mmix (HOST_LIBGCC2_CFLAGS): Set. * config/pa/fptr.c, config/pa/lib2funcs.S, config/pa/linux-atomic.c, config/pa/quadlib.c: New files. * config/pa/t-linux (HOST_LIBGCC2_CFLAGS): Set. (LIB2ADD, LIB2ADD_ST): Set. * config/pa/t-hpux, config/pa/t-hpux10, config/pa/t-pa64: New files. * config/pa/t-linux (HOST_LIBGCC2_CFLAGS, LIB2ADD, LIB2ADD_ST): Set. * config/pa/t-linux64 (LIB2ADD_ST, HOST_LIBGCC2_CFLAGS): Set. * config/pdp11/t-pdp11: New file. * config/picochip/libgccExtras/adddi3.S, config/picochip/libgccExtras/ashlsi3.S, config/picochip/libgccExtras/ashrsi3.S, config/picochip/libgccExtras/clzsi2.S, config/picochip/libgccExtras/cmpsi2.S, config/picochip/libgccExtras/divmod15.S, config/picochip/libgccExtras/divmodhi4.S, config/picochip/libgccExtras/divmodsi4.S, config/picochip/libgccExtras/lshrsi3.S, config/picochip/libgccExtras/parityhi2.S, config/picochip/libgccExtras/popcounthi2.S, config/picochip/libgccExtras/subdi3.S, config/picochip/libgccExtras/ucmpsi2.S, config/picochip/libgccExtras/udivmodhi4.S, config/picochip/libgccExtras/udivmodsi4.S: New files. * config/picochip/t-picochip (LIB2ADD, HOST_LIBGCC2_CFLAGS) (LIBGCC2_DEBUG_CFLAGS, RANLIB_FOR_TARGET): Set. * config/rs6000/crtresfpr.S, config/rs6000/crtresgpr.S, config/rs6000/crtresxfpr.S, config/rs6000/crtresxgpr.S, config/rs6000/crtsavfpr.S, config/rs6000/crtsavgpr.S) config/rs6000/darwin-asm.h, config/rs6000/darwin-fpsave.S, config/rs6000/darwin-gpsave.S, config/rs6000/darwin-tramp.S, config/rs6000/darwin-vecsave.S, config/rs6000/darwin-world.S: New files. * config/rs6000/t-darwin (LIB2ADD, LIB2ADD_ST) (HOST_LIBGCC2_CFLAGS): Set. * config/rs6000/t-darwin64: New file. * config/rs6000/t-linux64 (HOST_LIBGCC2_CFLAGS): Set. * config/rs6000/t-lynx, config/rs6000/t-netbsd: New files. * config/rs6000/t-ppccomm (LIB2ADD): Add $(srcdir)/config/rs6000/tramp.S. (LIB2ADD_ST): Use $(srcdir)/config/rs6000 to refer to sources. Add $(srcdir)/config/rs6000/eabi.S. (crtsavfpr.S, crtresfpr.S, crtsavgpr.S, crtresgpr.S, crtresxfpr.S) (crtresxgpr.S, e500crtres32gpr.S, e500crtres64gpr.S) (e500crtres64gprctr.S, e500crtrest32gpr.S, e500crtrest64gpr.S) (e500crtresx32gpr.S, e500crtresx64gpr.S, e500crtsav32gpr.S) (e500crtsav64gpr.S, e500crtsav64gprctr.S, e500crtsavg32gpr.S) (e500crtsavg64gpr.S, e500crtsavg64gprctr.S): Remove. * config/rs6000/tramp.S: New file. * config/s390/t-tpf: Remove. * config/sh/linux-atomic.S: New file. * config/sh/t-linux (LIB2ADD): Set. (HOST_LIBGCC2_CFLAGS): Append, remove -fpic. * config/sh/t-netbsd (LIB2ADD, HOST_LIBGCC2_CFLAGS): Set. * config/sh/t-sh (unwind-dw2-Os-4-200.o): Use $(srcdir) to refer to unwind-dw2.c. (HOST_LIBGCC2_CFLAGS): Set. * config/sparc/t-sol2 (CRTSTUFF_T_CFLAGS): Use $(PICFLAG). * config/spu/divmodti4.c, config/spu/divv2df3.c, config/spu/float_disf.c, config/spu/float_unsdidf.c, config/spu/float_unsdisf.c, config/spu/float_unssidf.c, config/spu/mfc_multi_tag_release.c, config/spu/mfc_multi_tag_reserve.c, config/spu/mfc_tag_release.c, config/spu/mfc_tag_reserve.c, config/spu/mfc_tag_table.c, config/spu/multi3.c: New files. * config/spu/t-elf (LIB2ADD, LIB2ADD_ST, LIB2_SIDITI_CONV_FUNCS) (HOST_LIBGCC2_CFLAGS): Set. * config/stormy16/ashlsi3.c, config/stormy16/ashrsi3.c, config/stormy16/clzhi2.c, config/stormy16/cmpsi2.c, config/stormy16/ctzhi2.c, config/stormy16/divsi3.c, config/stormy16/ffshi2.c, config/stormy16/lib2.c, config/stormy16/lshrsi3.c, config/stormy16/modsi3.c, config/stormy16/parityhi2.c, config/stormy16/popcounthi2.c, config/stormy16/t-stormy16, config/stormy16/ucmpsi2.c, config/stormy16/udivmodsi4.c, config/stormy16/udivsi3.c, config/stormy16/umodsi3.c: New files. * config/xtensa/lib2funcs.S: New file. * config/xtensa/t-elf (HOST_LIBGCC2_CFLAGS): Set. * config/xtensa/t-xtensa (LIB2ADD): Set. * config.host (*-*-darwin*): Add t-libgcc-pic to tmake_file. (*-*-freebsd*): Add t-freebsd, t-libgcc-pic to tmake_file. Add t-freebsd-thread to tmake_file for posix threads. (*-*-linux*, frv-*-*linux*, *-*-kfreebsd*-gnu, *-*-knetbsd*-gnu) (*-*-gnu*, *-*-kopensolaris*-gnu): Add t-libgcc-pic to tmake_file. (*-*-lynxos*): Likewise. (*-*-netbsd*): Likewise. (*-*-openbsd*): Likewise. Add t-openbsd-thread to tmake_file for posix threads. (*-*-solaris2*): Add t-libgcc-pic to tmake_file. (*-*-vxworks*): Set tmake_file. (alpha*-*-linux*): Add alpha/t-alpha, alpha/t-ieee to tmake_file. (alpha*-*-freebsd*): Likewise. (alpha*-*-netbsd*): Likewise. (alpha*-*-openbsd*): Likewise. (alpha*-dec-osf5.1*): Remove qrnnd.o, gthr-posix.o from extra_parts. (alpha64-dec-*vms*): Add alpha/t-alpha, alpha/t-ieee to tmake_file. (alpha*-dec-*vms*): Likewise. (arm*-*-netbsdelf*): Add arm/t-netbsd to tmake_file. (bfin*-elf*): Add bfin/t-elf to tmake_file. (bfin*-uclinux*): Likewise. (bfin*-linux-uclibc*): Likewise. (crisv32-*-elf): Add cris/t-cris to tmake_file. (crisv32-*-none): Likewise. (cris-*-elf): Likewise. (cris-*-none): Likewise. (cris-*-linux*, crisv32-*-linux*): Likewise. (hppa[12]*-*-hpux10*): Add pa/t-hpux pa/t-hpux10, t-libgcc-pic to tmake_file. (hppa*64*-*-hpux11*): Add pa/t-hpux, pa/t-pa64, t-libgcc-pic to tmake_file. (hppa[12]*-*-hpux11*): Add pa/t-hpux, t-libgcc-pic to tmake_file. (i[34567]86-*-elf*): Add t-libgcc-pic to tmake_file. (x86_64-*-elf*): Likewise. (i[34567]86-*-nto-qnx*): Likewise. (i[34567]86-*-mingw*): Add i386/t-gthr-win32 to tmake_file for win32 threads. (x86_64-*-mingw*): Likewise. (i[34567]86-*-interix3*): Add i386/t-interix to tmake_file. (lm32-*-uclinux*): Add t-libgcc-pic to tmake_file. (mipsisa32-*-elf*, mipsisa32el-*-elf*, mipsisa32r2-*-elf*) (mipsisa32r2el-*-elf*, mipsisa64-*-elf*, mipsisa64el-*-elf*) (mipsisa64r2-*-elf*, mipsisa64r2el-*-elf*): Add mips/t-elf to tmake_file. (mipsisa64sr71k-*-elf*): Likewise. (mipsisa64sb1-*-elf*, mipsisa64sb1el-*-elf*): Likewise. (mips-*-elf*, mipsel-*-elf*): Likewise. (mips64-*-elf*, mips64el-*-elf*): Likewise. (mips64orion-*-elf*, mips64orionel-*-elf*): Likewise. (mips*-*-rtems*): Likewise. (mips64vr-*-elf*, mips64vrel-*-elf*): Add mips/t-elf, mips/t-vr to tmake_file. (pdp11-*-*): Add pdp11/t-pdp11 to tmake_file. (powerpc64-*-darwin*): Add rs6000/t-darwin64 to tmake_file. (s390x-ibm-tpf*): Add t-libgcc-pic to tmake_file. (spu-*-elf*): Likewise. (tic6x-*-uclinux): Add t-libgcc-pic to tmake_file. libquadmath: * printf/gmp-impl.h: Adapt path to longlong.h. From-SVN: r180774
596 lines
12 KiB
C
596 lines
12 KiB
C
/* This is a stripped down version of floatlib.c. It supplies only those
|
||
functions which exist in libgcc, but for which there is not assembly
|
||
language versions in m68k/lb1sf68.S.
|
||
|
||
It also includes simplistic support for extended floats (by working in
|
||
double precision). You must compile this file again with -DEXTFLOAT
|
||
to get this support. */
|
||
|
||
/*
|
||
** gnulib support for software floating point.
|
||
** Copyright (C) 1991 by Pipeline Associates, Inc. All rights reserved.
|
||
** Permission is granted to do *anything* you want with this file,
|
||
** commercial or otherwise, provided this message remains intact. So there!
|
||
** I would appreciate receiving any updates/patches/changes that anyone
|
||
** makes, and am willing to be the repository for said changes (am I
|
||
** making a big mistake?).
|
||
**
|
||
** Pat Wood
|
||
** Pipeline Associates, Inc.
|
||
** pipeline!phw@motown.com or
|
||
** sun!pipeline!phw or
|
||
** uunet!motown!pipeline!phw
|
||
**
|
||
** 05/01/91 -- V1.0 -- first release to gcc mailing lists
|
||
** 05/04/91 -- V1.1 -- added float and double prototypes and return values
|
||
** -- fixed problems with adding and subtracting zero
|
||
** -- fixed rounding in truncdfsf2
|
||
** -- fixed SWAP define and tested on 386
|
||
*/
|
||
|
||
/*
|
||
** The following are routines that replace the gnulib soft floating point
|
||
** routines that are called automatically when -msoft-float is selected.
|
||
** The support single and double precision IEEE format, with provisions
|
||
** for byte-swapped machines (tested on 386). Some of the double-precision
|
||
** routines work at full precision, but most of the hard ones simply punt
|
||
** and call the single precision routines, producing a loss of accuracy.
|
||
** long long support is not assumed or included.
|
||
** Overall accuracy is close to IEEE (actually 68882) for single-precision
|
||
** arithmetic. I think there may still be a 1 in 1000 chance of a bit
|
||
** being rounded the wrong way during a multiply. I'm not fussy enough to
|
||
** bother with it, but if anyone is, knock yourself out.
|
||
**
|
||
** Efficiency has only been addressed where it was obvious that something
|
||
** would make a big difference. Anyone who wants to do this right for
|
||
** best speed should go in and rewrite in assembler.
|
||
**
|
||
** I have tested this only on a 68030 workstation and 386/ix integrated
|
||
** in with -msoft-float.
|
||
*/
|
||
|
||
/* the following deal with IEEE single-precision numbers */
|
||
#define EXCESS 126L
|
||
#define SIGNBIT 0x80000000L
|
||
#define HIDDEN (1L << 23L)
|
||
#define SIGN(fp) ((fp) & SIGNBIT)
|
||
#define EXP(fp) (((fp) >> 23L) & 0xFF)
|
||
#define MANT(fp) (((fp) & 0x7FFFFFL) | HIDDEN)
|
||
#define PACK(s,e,m) ((s) | ((e) << 23L) | (m))
|
||
|
||
/* the following deal with IEEE double-precision numbers */
|
||
#define EXCESSD 1022L
|
||
#define HIDDEND (1L << 20L)
|
||
#define EXPDBITS 11
|
||
#define EXPDMASK 0x7FFL
|
||
#define EXPD(fp) (((fp.l.upper) >> 20L) & 0x7FFL)
|
||
#define SIGND(fp) ((fp.l.upper) & SIGNBIT)
|
||
#define MANTD(fp) (((((fp.l.upper) & 0xFFFFF) | HIDDEND) << 10) | \
|
||
(fp.l.lower >> 22))
|
||
#define MANTDMASK 0xFFFFFL /* mask of upper part */
|
||
|
||
/* the following deal with IEEE extended-precision numbers */
|
||
#define EXCESSX 16382L
|
||
#define HIDDENX (1L << 31L)
|
||
#define EXPXBITS 15
|
||
#define EXPXMASK 0x7FFF
|
||
#define EXPX(fp) (((fp.l.upper) >> 16) & EXPXMASK)
|
||
#define SIGNX(fp) ((fp.l.upper) & SIGNBIT)
|
||
#define MANTXMASK 0x7FFFFFFFL /* mask of upper part */
|
||
|
||
union double_long
|
||
{
|
||
double d;
|
||
struct {
|
||
long upper;
|
||
unsigned long lower;
|
||
} l;
|
||
};
|
||
|
||
union float_long {
|
||
float f;
|
||
long l;
|
||
};
|
||
|
||
union long_double_long
|
||
{
|
||
long double ld;
|
||
struct
|
||
{
|
||
long upper;
|
||
unsigned long middle;
|
||
unsigned long lower;
|
||
} l;
|
||
};
|
||
|
||
#ifndef EXTFLOAT
|
||
|
||
int
|
||
__unordsf2(float a, float b)
|
||
{
|
||
union float_long fl;
|
||
|
||
fl.f = a;
|
||
if (EXP(fl.l) == EXP(~0u) && (MANT(fl.l) & ~HIDDEN) != 0)
|
||
return 1;
|
||
fl.f = b;
|
||
if (EXP(fl.l) == EXP(~0u) && (MANT(fl.l) & ~HIDDEN) != 0)
|
||
return 1;
|
||
return 0;
|
||
}
|
||
|
||
int
|
||
__unorddf2(double a, double b)
|
||
{
|
||
union double_long dl;
|
||
|
||
dl.d = a;
|
||
if (EXPD(dl) == EXPDMASK
|
||
&& ((dl.l.upper & MANTDMASK) != 0 || dl.l.lower != 0))
|
||
return 1;
|
||
dl.d = b;
|
||
if (EXPD(dl) == EXPDMASK
|
||
&& ((dl.l.upper & MANTDMASK) != 0 || dl.l.lower != 0))
|
||
return 1;
|
||
return 0;
|
||
}
|
||
|
||
/* convert unsigned int to double */
|
||
double
|
||
__floatunsidf (unsigned long a1)
|
||
{
|
||
long exp = 32 + EXCESSD;
|
||
union double_long dl;
|
||
|
||
if (!a1)
|
||
{
|
||
dl.l.upper = dl.l.lower = 0;
|
||
return dl.d;
|
||
}
|
||
|
||
while (a1 < 0x2000000L)
|
||
{
|
||
a1 <<= 4;
|
||
exp -= 4;
|
||
}
|
||
|
||
while (a1 < 0x80000000L)
|
||
{
|
||
a1 <<= 1;
|
||
exp--;
|
||
}
|
||
|
||
/* pack up and go home */
|
||
dl.l.upper = exp << 20L;
|
||
dl.l.upper |= (a1 >> 11L) & ~HIDDEND;
|
||
dl.l.lower = a1 << 21L;
|
||
|
||
return dl.d;
|
||
}
|
||
|
||
/* convert int to double */
|
||
double
|
||
__floatsidf (long a1)
|
||
{
|
||
long sign = 0, exp = 31 + EXCESSD;
|
||
union double_long dl;
|
||
|
||
if (!a1)
|
||
{
|
||
dl.l.upper = dl.l.lower = 0;
|
||
return dl.d;
|
||
}
|
||
|
||
if (a1 < 0)
|
||
{
|
||
sign = SIGNBIT;
|
||
a1 = (long)-(unsigned long)a1;
|
||
if (a1 < 0)
|
||
{
|
||
dl.l.upper = SIGNBIT | ((32 + EXCESSD) << 20L);
|
||
dl.l.lower = 0;
|
||
return dl.d;
|
||
}
|
||
}
|
||
|
||
while (a1 < 0x1000000L)
|
||
{
|
||
a1 <<= 4;
|
||
exp -= 4;
|
||
}
|
||
|
||
while (a1 < 0x40000000L)
|
||
{
|
||
a1 <<= 1;
|
||
exp--;
|
||
}
|
||
|
||
/* pack up and go home */
|
||
dl.l.upper = sign;
|
||
dl.l.upper |= exp << 20L;
|
||
dl.l.upper |= (a1 >> 10L) & ~HIDDEND;
|
||
dl.l.lower = a1 << 22L;
|
||
|
||
return dl.d;
|
||
}
|
||
|
||
/* convert unsigned int to float */
|
||
float
|
||
__floatunsisf (unsigned long l)
|
||
{
|
||
double foo = __floatunsidf (l);
|
||
return foo;
|
||
}
|
||
|
||
/* convert int to float */
|
||
float
|
||
__floatsisf (long l)
|
||
{
|
||
double foo = __floatsidf (l);
|
||
return foo;
|
||
}
|
||
|
||
/* convert float to double */
|
||
double
|
||
__extendsfdf2 (float a1)
|
||
{
|
||
register union float_long fl1;
|
||
register union double_long dl;
|
||
register long exp;
|
||
register long mant;
|
||
|
||
fl1.f = a1;
|
||
|
||
dl.l.upper = SIGN (fl1.l);
|
||
if ((fl1.l & ~SIGNBIT) == 0)
|
||
{
|
||
dl.l.lower = 0;
|
||
return dl.d;
|
||
}
|
||
|
||
exp = EXP(fl1.l);
|
||
mant = MANT (fl1.l) & ~HIDDEN;
|
||
if (exp == 0)
|
||
{
|
||
/* Denormal. */
|
||
exp = 1;
|
||
while (!(mant & HIDDEN))
|
||
{
|
||
mant <<= 1;
|
||
exp--;
|
||
}
|
||
mant &= ~HIDDEN;
|
||
}
|
||
exp = exp - EXCESS + EXCESSD;
|
||
dl.l.upper |= exp << 20;
|
||
dl.l.upper |= mant >> 3;
|
||
dl.l.lower = mant << 29;
|
||
|
||
return dl.d;
|
||
}
|
||
|
||
/* convert double to float */
|
||
float
|
||
__truncdfsf2 (double a1)
|
||
{
|
||
register long exp;
|
||
register long mant;
|
||
register union float_long fl;
|
||
register union double_long dl1;
|
||
int sticky;
|
||
int shift;
|
||
|
||
dl1.d = a1;
|
||
|
||
if ((dl1.l.upper & ~SIGNBIT) == 0 && !dl1.l.lower)
|
||
{
|
||
fl.l = SIGND(dl1);
|
||
return fl.f;
|
||
}
|
||
|
||
exp = EXPD (dl1) - EXCESSD + EXCESS;
|
||
|
||
sticky = dl1.l.lower & ((1 << 22) - 1);
|
||
mant = MANTD (dl1);
|
||
/* shift double mantissa 6 bits so we can round */
|
||
sticky |= mant & ((1 << 6) - 1);
|
||
mant >>= 6;
|
||
|
||
/* Check for underflow and denormals. */
|
||
if (exp <= 0)
|
||
{
|
||
if (exp < -24)
|
||
{
|
||
sticky |= mant;
|
||
mant = 0;
|
||
}
|
||
else
|
||
{
|
||
sticky |= mant & ((1 << (1 - exp)) - 1);
|
||
mant >>= 1 - exp;
|
||
}
|
||
exp = 0;
|
||
}
|
||
|
||
/* now round */
|
||
shift = 1;
|
||
if ((mant & 1) && (sticky || (mant & 2)))
|
||
{
|
||
int rounding = exp ? 2 : 1;
|
||
|
||
mant += 1;
|
||
|
||
/* did the round overflow? */
|
||
if (mant >= (HIDDEN << rounding))
|
||
{
|
||
exp++;
|
||
shift = rounding;
|
||
}
|
||
}
|
||
/* shift down */
|
||
mant >>= shift;
|
||
|
||
mant &= ~HIDDEN;
|
||
|
||
/* pack up and go home */
|
||
fl.l = PACK (SIGND (dl1), exp, mant);
|
||
return (fl.f);
|
||
}
|
||
|
||
/* convert double to int */
|
||
long
|
||
__fixdfsi (double a1)
|
||
{
|
||
register union double_long dl1;
|
||
register long exp;
|
||
register long l;
|
||
|
||
dl1.d = a1;
|
||
|
||
if (!dl1.l.upper && !dl1.l.lower)
|
||
return 0;
|
||
|
||
exp = EXPD (dl1) - EXCESSD - 31;
|
||
l = MANTD (dl1);
|
||
|
||
if (exp > 0)
|
||
{
|
||
/* Return largest integer. */
|
||
return SIGND (dl1) ? 0x80000000L : 0x7fffffffL;
|
||
}
|
||
|
||
if (exp <= -32)
|
||
return 0;
|
||
|
||
/* shift down until exp = 0 */
|
||
if (exp < 0)
|
||
l >>= -exp;
|
||
|
||
return (SIGND (dl1) ? -l : l);
|
||
}
|
||
|
||
/* convert float to int */
|
||
long
|
||
__fixsfsi (float a1)
|
||
{
|
||
double foo = a1;
|
||
return __fixdfsi (foo);
|
||
}
|
||
|
||
#else /* EXTFLOAT */
|
||
|
||
/* We do not need these routines for coldfire, as it has no extended
|
||
float format. */
|
||
#if !defined (__mcoldfire__)
|
||
|
||
/* Primitive extended precision floating point support.
|
||
|
||
We assume all numbers are normalized, don't do any rounding, etc. */
|
||
|
||
/* Prototypes for the above in case we use them. */
|
||
double __floatunsidf (unsigned long);
|
||
double __floatsidf (long);
|
||
float __floatsisf (long);
|
||
double __extendsfdf2 (float);
|
||
float __truncdfsf2 (double);
|
||
long __fixdfsi (double);
|
||
long __fixsfsi (float);
|
||
|
||
int
|
||
__unordxf2(long double a, long double b)
|
||
{
|
||
union long_double_long ldl;
|
||
|
||
ldl.ld = a;
|
||
if (EXPX(ldl) == EXPXMASK
|
||
&& ((ldl.l.middle & MANTXMASK) != 0 || ldl.l.lower != 0))
|
||
return 1;
|
||
ldl.ld = b;
|
||
if (EXPX(ldl) == EXPXMASK
|
||
&& ((ldl.l.middle & MANTXMASK) != 0 || ldl.l.lower != 0))
|
||
return 1;
|
||
return 0;
|
||
}
|
||
|
||
/* convert double to long double */
|
||
long double
|
||
__extenddfxf2 (double d)
|
||
{
|
||
register union double_long dl;
|
||
register union long_double_long ldl;
|
||
register long exp;
|
||
|
||
dl.d = d;
|
||
/*printf ("dfxf in: %g\n", d);*/
|
||
|
||
ldl.l.upper = SIGND (dl);
|
||
if ((dl.l.upper & ~SIGNBIT) == 0 && !dl.l.lower)
|
||
{
|
||
ldl.l.middle = 0;
|
||
ldl.l.lower = 0;
|
||
return ldl.ld;
|
||
}
|
||
|
||
exp = EXPD (dl) - EXCESSD + EXCESSX;
|
||
ldl.l.upper |= exp << 16;
|
||
ldl.l.middle = HIDDENX;
|
||
/* 31-20: # mantissa bits in ldl.l.middle - # mantissa bits in dl.l.upper */
|
||
ldl.l.middle |= (dl.l.upper & MANTDMASK) << (31 - 20);
|
||
/* 1+20: explicit-integer-bit + # mantissa bits in dl.l.upper */
|
||
ldl.l.middle |= dl.l.lower >> (1 + 20);
|
||
/* 32 - 21: # bits of dl.l.lower in ldl.l.middle */
|
||
ldl.l.lower = dl.l.lower << (32 - 21);
|
||
|
||
/*printf ("dfxf out: %s\n", dumpxf (ldl.ld));*/
|
||
return ldl.ld;
|
||
}
|
||
|
||
/* convert long double to double */
|
||
double
|
||
__truncxfdf2 (long double ld)
|
||
{
|
||
register long exp;
|
||
register union double_long dl;
|
||
register union long_double_long ldl;
|
||
|
||
ldl.ld = ld;
|
||
/*printf ("xfdf in: %s\n", dumpxf (ld));*/
|
||
|
||
dl.l.upper = SIGNX (ldl);
|
||
if ((ldl.l.upper & ~SIGNBIT) == 0 && !ldl.l.middle && !ldl.l.lower)
|
||
{
|
||
dl.l.lower = 0;
|
||
return dl.d;
|
||
}
|
||
|
||
exp = EXPX (ldl) - EXCESSX + EXCESSD;
|
||
/* ??? quick and dirty: keep `exp' sane */
|
||
if (exp >= EXPDMASK)
|
||
exp = EXPDMASK - 1;
|
||
dl.l.upper |= exp << (32 - (EXPDBITS + 1));
|
||
/* +1-1: add one for sign bit, but take one off for explicit-integer-bit */
|
||
dl.l.upper |= (ldl.l.middle & MANTXMASK) >> (EXPDBITS + 1 - 1);
|
||
dl.l.lower = (ldl.l.middle & MANTXMASK) << (32 - (EXPDBITS + 1 - 1));
|
||
dl.l.lower |= ldl.l.lower >> (EXPDBITS + 1 - 1);
|
||
|
||
/*printf ("xfdf out: %g\n", dl.d);*/
|
||
return dl.d;
|
||
}
|
||
|
||
/* convert a float to a long double */
|
||
long double
|
||
__extendsfxf2 (float f)
|
||
{
|
||
long double foo = __extenddfxf2 (__extendsfdf2 (f));
|
||
return foo;
|
||
}
|
||
|
||
/* convert a long double to a float */
|
||
float
|
||
__truncxfsf2 (long double ld)
|
||
{
|
||
float foo = __truncdfsf2 (__truncxfdf2 (ld));
|
||
return foo;
|
||
}
|
||
|
||
/* convert an int to a long double */
|
||
long double
|
||
__floatsixf (long l)
|
||
{
|
||
double foo = __floatsidf (l);
|
||
return foo;
|
||
}
|
||
|
||
/* convert an unsigned int to a long double */
|
||
long double
|
||
__floatunsixf (unsigned long l)
|
||
{
|
||
double foo = __floatunsidf (l);
|
||
return foo;
|
||
}
|
||
|
||
/* convert a long double to an int */
|
||
long
|
||
__fixxfsi (long double ld)
|
||
{
|
||
long foo = __fixdfsi ((double) ld);
|
||
return foo;
|
||
}
|
||
|
||
/* The remaining provide crude math support by working in double precision. */
|
||
|
||
long double
|
||
__addxf3 (long double x1, long double x2)
|
||
{
|
||
return (double) x1 + (double) x2;
|
||
}
|
||
|
||
long double
|
||
__subxf3 (long double x1, long double x2)
|
||
{
|
||
return (double) x1 - (double) x2;
|
||
}
|
||
|
||
long double
|
||
__mulxf3 (long double x1, long double x2)
|
||
{
|
||
return (double) x1 * (double) x2;
|
||
}
|
||
|
||
long double
|
||
__divxf3 (long double x1, long double x2)
|
||
{
|
||
return (double) x1 / (double) x2;
|
||
}
|
||
|
||
long double
|
||
__negxf2 (long double x1)
|
||
{
|
||
return - (double) x1;
|
||
}
|
||
|
||
long
|
||
__cmpxf2 (long double x1, long double x2)
|
||
{
|
||
return __cmpdf2 ((double) x1, (double) x2);
|
||
}
|
||
|
||
long
|
||
__eqxf2 (long double x1, long double x2)
|
||
{
|
||
return __cmpdf2 ((double) x1, (double) x2);
|
||
}
|
||
|
||
long
|
||
__nexf2 (long double x1, long double x2)
|
||
{
|
||
return __cmpdf2 ((double) x1, (double) x2);
|
||
}
|
||
|
||
long
|
||
__ltxf2 (long double x1, long double x2)
|
||
{
|
||
return __cmpdf2 ((double) x1, (double) x2);
|
||
}
|
||
|
||
long
|
||
__lexf2 (long double x1, long double x2)
|
||
{
|
||
return __cmpdf2 ((double) x1, (double) x2);
|
||
}
|
||
|
||
long
|
||
__gtxf2 (long double x1, long double x2)
|
||
{
|
||
return __cmpdf2 ((double) x1, (double) x2);
|
||
}
|
||
|
||
long
|
||
__gexf2 (long double x1, long double x2)
|
||
{
|
||
return __cmpdf2 ((double) x1, (double) x2);
|
||
}
|
||
|
||
#endif /* !__mcoldfire__ */
|
||
#endif /* EXTFLOAT */
|