soft-fp: Move to ../libgcc.
authorRainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
Fri, 5 Aug 2011 15:13:48 +0000 (15:13 +0000)
committerRainer Orth <ro@gcc.gnu.org>
Fri, 5 Aug 2011 15:13:48 +0000 (15:13 +0000)
gcc:
* config/soft-fp: Move to ../libgcc.
* Makefile.in (SFP_MACHINE): Remove.
(libgcc-support): Remove $(SFP_MACHINE) dependency.
* config/arm/sfp-machine.h: Move to ../libgcc/config/arm.
* config/arm/t-arm-softfp: Move to
../libgcc/config/arm/t-softfp.
* config/c6x/sfp-machine.h: Move to ../libgcc/config/c6x.
* config/c6x/t-c6x-softfp: Remove.
* config/i386/sfp-machine.h: Move to ../libgcc/config/i386.
* config/i386/t-fprules-softfp: Move to
../libgcc/config/t-softfp-tf.
* config/ia64/sfp-machine.h: Move to ../libgcc/config/ia64.
* config/ia64/t-fprules-softfp: Remove.
* config/lm32/sfp-machine.h: Move to ../libgcc/config/lm32.
* config/lm32/t-fprules-softfp: Remove.
* config/moxie/sfp-machine.h: Remove.
* config/moxie/t-moxie-softfp: Remove.
* config/rs6000/darwin-ldouble-format: Move to
../libgcc/config/rs6000/ibm-ldouble-format.
* config/rs6000/darwin-ldouble.c: Move to
../libgcc/config/rs6000/ibm-ldouble.c
* config/rs6000/libgcc-ppc-glibc.ver: Move to ../libgcc/config/rs6000.
* config/rs6000/libgcc-ppc64.ver: Likewise.
* config/rs6000/sfp-machine.h: Likewise.
* config/rs6000/t-aix43 (SHLIB_MAPFILES): Remove
$(srcdir)/config/rs6000/libgcc-ppc64.ver.
(LIB2FUNCS_EXTRA): Remove.
(TARGET_LIBGCC2_CFLAGS): Remove.
* config/rs6000/t-aix52: Likewise
* config/rs6000/t-darwin (LIB2FUNCS_EXTRA): Remove
$(srcdir)/config/rs6000/darwin-ldouble.c.
(SHLIB_MAPFILES): Remove.
* config/rs6000/t-darwin64 (LIB2FUNCS_EXTRA): Remove
$(srcdir)/config/rs6000/darwin-ldouble.c.
* config/rs6000/t-fprules-softfp: Move to
../libgcc/config/t-softfp-sfdf.
* config/rs6000/t-freebsd: Move to ../libgcc/config/rs6000.
* config/rs6000/t-linux64 (softfp_wrap_start, softfp_wrap_end): Remove.
* config/rs6000/t-ppccomm (LIB2FUNCS_EXTRA): Remove
$(srcdir)/config/rs6000/darwin-ldouble.c.
* config/score/sfp-machine.h: Move to ../libgcc/config/score.
* config/score/t-score-softfp: Remove.
* config.gcc (arm*-*-linux*): Remove arm/t-arm-softfp,
soft-fp/t-softfp from tmake_file.
(arm*-*-uclinux*): Likewise.
(arm*-*-ecos-elf): Likewise.
(arm*-*-eabi*, arm*-*-symbianelf*): Likewise.
(arm*-*-rtems*): Likewise.
(arm*-*-elf): Likewise.
(moxie-*-elf): Remove moxie/t-moxie-softfp, soft-fp/t-softfp from
tmake_file.
(moxie-*-uclinux*): Likewise.
(moxie-*-rtems*): Likewise.
(lm32-*-elf*): Remove lm32/t-fprules-softfp, soft-fp/t-softfp from
tmake_file.
(lm32-*-rtems*): Likewise.
(lm32-*-uclinux*): Likewise.
(powerpc-*-freebsd*): Remove rs6000/t-freebsd,
rs6000/t-fprules-softfp, soft-fp/t-softfp from tmake_file.
(powerpc-*-linux*, powerpc64-*-linux*): Remove
rs6000/t-fprules-softfp, soft-fp/t-softfp from tmake_file.
(score-*-elf): Remove score/t-score-softfp, soft-fp/t-softfp from
tmake_file.
(tic6x-*-elf): Remove c6x/t-c6x-softfp, soft-fp/t-softfp from
tmake_file.
(tic6x-*-uclinux): Likewise.
(i[34567]86-*-darwin*, x86_64-*-darwin*): Remove i386/t-fprules-softfp,
soft-fp/t-softfp from tmake_file.
(i[34567]86-*-linux*, x86_64-*-linux*, i[34567]86-*-kfreebsd*-gnu)
(x86_64-*-kfreebsd*-gnu, i[34567]86-*-gnu*): Likewise.
(i[34567]86-*-solaris2*, x86_64-*-solaris2.1[0-9]*): Likewise.
(i[34567]86-*-cygwin*, i[34567]86-*-mingw*, x86_64-*-mingw*):
Likewise.
(i[34567]86-*-freebsd*, x86_64-*-freebsd*): Likewise.

libgcc:
* config/t-softfp: Remove.
* soft-fp: Moved from ../gcc/config.
* soft-fp/README: Remove t-softfp reference.
* soft-fp/t-softfp: Move to config/t-softfp.
(softfp_machine_header): Remove.
(softfp_file_list): Remove config subdir.
(soft-fp-objects): New variable.
($(soft-fp-objects)): Set INTERNAL_CFLAGS.
(LIB2FUNCS_EXTRA): Add to LIB2ADD instead.
(SFP_MACHINE, $(SFP_MACHINE)): Remove.
* config/t-softfp-excl: New file.
* config/t-softfp-sfdf: New file.
* config/t-softfp-tf: New file.
* config/no-sfp-machine.h: New file.
* config/arm/sfp-machine.h: New file.
* config/arm/t-softfp: New file.
* config/c6x/sfp-machine.h: New file.
* config/i386/32/t-fprules-softfp: Rename to ...
* config/i386/32/t-softfp: ... this.
(tifunctions, LIB2ADD): Remove.
(softfp_int_modes): Override.
* config/i386/64/t-softfp-compat (tf-functions): Remove config
subdir.
* config/i386/64/eqtf2.c: Likewise.
* config/i386/64/getf2.c: Likewise.
* config/i386/64/letf2.c: Likewise.
* config/ia64/sft-machine.h: New file.
* config/ia64/t-fprules-softfp: Rename to ...
* config/ia64/t-softfp: ... this.
* config/lm32/sfp-machine.h: New file.
* config/moxie/t-moxie-softfp: Remove.
* config/rs6000/ibm-ldouble-format: New file.
* config/rs6000/ibm-ldouble.c: New file.
* config/rs6000/libgcc-ppc-glibc.ver: New file
* config/rs6000/libgcc-ppc64.ver: New file
* config/rs6000/sfp-machine.h: New file.
* config/rs6000/t-freebsd: New file.
* config/rs6000/t-ibm-ldouble: New file.
* config/rs6000/t-ldbl128: Use $(srcdir) to refer to
libgcc-ppc-glibc.ver.
* config/rs6000/t-linux64: New file.
* config/rs6000/t-ppccomm (LIB2ADD): Add
$(srcdir)/config/rs6000/ibm-ldouble.c.
* config/rs6000/t-ppccomm-ldbl: New file.
* config/score/sfp-machine.h: New file.
* config.host (sfp_machine_header): Explain.
(arm*-*-linux*): Add t-softfp-sfdf, t-softfp-excl, arm/t-softfp,
t-softfp to tmake_file.
(arm*-*-uclinux*): Likewise.
(arm*-*-ecos-elf): Likewise.
(arm*-*-eabi*, arm*-*-symbianelf*): Likewise.
(arm*-*-rtems*): Likewise.
(arm*-*-elf): Likewise.
(ia64*-*-linux*): Replace ia64/t-fprules-softfp by ia64/t-softfp
in tmake_file.
Add t-softfp-tf, t-softfp-excl, t-softfp to tmake_file.
(lm32-*-elf*, lm32-*-rtems*): Add t-softfp-sfdf, t-softfp to tmake_file.
(lm32-*-uclinux*): Likewise.
(moxie-*-*): Replace moxie/t-moxie-softfp by t-softfp-sfdf,
t-softfp-excl, t-softfp.
(powerpc-*-darwin*): Add rs6000/t-ibm-ldouble to tmake_file.
(powerpc64-*-darwin*): Likewise.
(powerpc-*-freebsd*): Add t-softfp-sfdf, t-softfp-excl, t-softfp
to tmake_file.
(powerpc-*-eabisimaltivec*): Add rs6000/t-ppccomm-ldbl to
tmake_file.
(powerpc-*-eabisim*): Likewise.
(powerpc-*-elf*): Likewise.
(powerpc-*-eabialtivec*): Likewise.
(powerpc-xilinx-eabi*): Likewise.
(powerpc-*-rtems*): Likewise.
(powerpc-*-linux*, powerpc64-*-linux*): Add t-softfp-sfdf,
t-softfp-excl, t-softfp to tmake_file.
(powerpc-wrs-vxworks, powerpc-wrs-vxworksae): Add
rs6000/t-ppccomm-ldbl to tmake_file.
(powerpcle-*-elf*): Likewise.
(powerpcle-*-eabisim*): Likewise.
(powerpcle-*-eabi*): Likewise.
(rs6000-ibm-aix4.[3456789]*, powerpc-ibm-aix4.[3456789]*): Add
rs6000/t-ibm-ldouble to tmake_file.
(rs6000-ibm-aix5.1.*, powerpc-ibm-aix5.1.*): Likewise.
(rs6000-ibm-aix[56789].*, powerpc-ibm-aix[56789].*): Likewise.
(score-*-elf): Add t-softfp-sfdf, t-softfp-excl, t-softfp to tmake_file.
(tic6x-*-*): Likewise.
(i[34567]86-*-darwin*, x86_64-*-darwin*,
i[34567]86-*-kfreebsd*-gnu, x86_64-*-kfreebsd*-gnu,
i[34567]86-*-linux*, x86_64-*-linux*, i[34567]86-*-gnu*,
i[34567]86-*-solaris2*, x86_64-*-solaris2.1[0-9]*,
i[34567]86-*-cygwin*, i[34567]86-*-mingw*, x86_64-*-mingw*,
i[34567]86-*-freebsd*, x86_64-*-freebsd*): Add t-softfp-tf,
t-softfp to tmake_file.
* configure.ac (sfp_machine_header): Provide default if unset.
Substitute.
Link sfp-machine.h to config/$sfp_machine_header.
* configure: Regenerate.

From-SVN: r177452

231 files changed:
gcc/ChangeLog
gcc/Makefile.in
gcc/config.gcc
gcc/config/arm/sfp-machine.h [deleted file]
gcc/config/arm/t-arm-softfp [deleted file]
gcc/config/c6x/sfp-machine.h [deleted file]
gcc/config/c6x/t-c6x-softfp [deleted file]
gcc/config/i386/sfp-machine.h [deleted file]
gcc/config/i386/t-fprules-softfp [deleted file]
gcc/config/ia64/sfp-machine.h [deleted file]
gcc/config/ia64/t-fprules-softfp [deleted file]
gcc/config/lm32/sfp-machine.h [deleted file]
gcc/config/lm32/t-fprules-softfp [deleted file]
gcc/config/moxie/sfp-machine.h [deleted file]
gcc/config/moxie/t-moxie-softfp [deleted file]
gcc/config/rs6000/darwin-ldouble-format [deleted file]
gcc/config/rs6000/darwin-ldouble.c [deleted file]
gcc/config/rs6000/libgcc-ppc-glibc.ver [deleted file]
gcc/config/rs6000/libgcc-ppc64.ver [deleted file]
gcc/config/rs6000/sfp-machine.h [deleted file]
gcc/config/rs6000/t-aix43
gcc/config/rs6000/t-aix52
gcc/config/rs6000/t-darwin
gcc/config/rs6000/t-darwin64
gcc/config/rs6000/t-fprules-softfp [deleted file]
gcc/config/rs6000/t-freebsd [deleted file]
gcc/config/rs6000/t-linux64
gcc/config/rs6000/t-ppccomm
gcc/config/score/sfp-machine.h [deleted file]
gcc/config/score/t-score-softfp [deleted file]
gcc/config/soft-fp/README [deleted file]
gcc/config/soft-fp/adddf3.c [deleted file]
gcc/config/soft-fp/addsf3.c [deleted file]
gcc/config/soft-fp/addtf3.c [deleted file]
gcc/config/soft-fp/divdf3.c [deleted file]
gcc/config/soft-fp/divsf3.c [deleted file]
gcc/config/soft-fp/divtf3.c [deleted file]
gcc/config/soft-fp/double.h [deleted file]
gcc/config/soft-fp/eqdf2.c [deleted file]
gcc/config/soft-fp/eqsf2.c [deleted file]
gcc/config/soft-fp/eqtf2.c [deleted file]
gcc/config/soft-fp/extenddftf2.c [deleted file]
gcc/config/soft-fp/extended.h [deleted file]
gcc/config/soft-fp/extendsfdf2.c [deleted file]
gcc/config/soft-fp/extendsftf2.c [deleted file]
gcc/config/soft-fp/extendxftf2.c [deleted file]
gcc/config/soft-fp/fixdfdi.c [deleted file]
gcc/config/soft-fp/fixdfsi.c [deleted file]
gcc/config/soft-fp/fixdfti.c [deleted file]
gcc/config/soft-fp/fixsfdi.c [deleted file]
gcc/config/soft-fp/fixsfsi.c [deleted file]
gcc/config/soft-fp/fixsfti.c [deleted file]
gcc/config/soft-fp/fixtfdi.c [deleted file]
gcc/config/soft-fp/fixtfsi.c [deleted file]
gcc/config/soft-fp/fixtfti.c [deleted file]
gcc/config/soft-fp/fixunsdfdi.c [deleted file]
gcc/config/soft-fp/fixunsdfsi.c [deleted file]
gcc/config/soft-fp/fixunsdfti.c [deleted file]
gcc/config/soft-fp/fixunssfdi.c [deleted file]
gcc/config/soft-fp/fixunssfsi.c [deleted file]
gcc/config/soft-fp/fixunssfti.c [deleted file]
gcc/config/soft-fp/fixunstfdi.c [deleted file]
gcc/config/soft-fp/fixunstfsi.c [deleted file]
gcc/config/soft-fp/fixunstfti.c [deleted file]
gcc/config/soft-fp/floatdidf.c [deleted file]
gcc/config/soft-fp/floatdisf.c [deleted file]
gcc/config/soft-fp/floatditf.c [deleted file]
gcc/config/soft-fp/floatsidf.c [deleted file]
gcc/config/soft-fp/floatsisf.c [deleted file]
gcc/config/soft-fp/floatsitf.c [deleted file]
gcc/config/soft-fp/floattidf.c [deleted file]
gcc/config/soft-fp/floattisf.c [deleted file]
gcc/config/soft-fp/floattitf.c [deleted file]
gcc/config/soft-fp/floatundidf.c [deleted file]
gcc/config/soft-fp/floatundisf.c [deleted file]
gcc/config/soft-fp/floatunditf.c [deleted file]
gcc/config/soft-fp/floatunsidf.c [deleted file]
gcc/config/soft-fp/floatunsisf.c [deleted file]
gcc/config/soft-fp/floatunsitf.c [deleted file]
gcc/config/soft-fp/floatuntidf.c [deleted file]
gcc/config/soft-fp/floatuntisf.c [deleted file]
gcc/config/soft-fp/floatuntitf.c [deleted file]
gcc/config/soft-fp/gedf2.c [deleted file]
gcc/config/soft-fp/gesf2.c [deleted file]
gcc/config/soft-fp/getf2.c [deleted file]
gcc/config/soft-fp/ledf2.c [deleted file]
gcc/config/soft-fp/lesf2.c [deleted file]
gcc/config/soft-fp/letf2.c [deleted file]
gcc/config/soft-fp/muldf3.c [deleted file]
gcc/config/soft-fp/mulsf3.c [deleted file]
gcc/config/soft-fp/multf3.c [deleted file]
gcc/config/soft-fp/negdf2.c [deleted file]
gcc/config/soft-fp/negsf2.c [deleted file]
gcc/config/soft-fp/negtf2.c [deleted file]
gcc/config/soft-fp/op-1.h [deleted file]
gcc/config/soft-fp/op-2.h [deleted file]
gcc/config/soft-fp/op-4.h [deleted file]
gcc/config/soft-fp/op-8.h [deleted file]
gcc/config/soft-fp/op-common.h [deleted file]
gcc/config/soft-fp/quad.h [deleted file]
gcc/config/soft-fp/single.h [deleted file]
gcc/config/soft-fp/soft-fp.h [deleted file]
gcc/config/soft-fp/subdf3.c [deleted file]
gcc/config/soft-fp/subsf3.c [deleted file]
gcc/config/soft-fp/subtf3.c [deleted file]
gcc/config/soft-fp/t-softfp [deleted file]
gcc/config/soft-fp/truncdfsf2.c [deleted file]
gcc/config/soft-fp/trunctfdf2.c [deleted file]
gcc/config/soft-fp/trunctfsf2.c [deleted file]
gcc/config/soft-fp/trunctfxf2.c [deleted file]
gcc/config/soft-fp/unorddf2.c [deleted file]
gcc/config/soft-fp/unordsf2.c [deleted file]
gcc/config/soft-fp/unordtf2.c [deleted file]
libgcc/ChangeLog
libgcc/config.host
libgcc/config/arm/sfp-machine.h [new file with mode: 0644]
libgcc/config/arm/t-softfp [new file with mode: 0644]
libgcc/config/c6x/sfp-machine.h [new file with mode: 0644]
libgcc/config/i386/32/t-fprules-softfp [deleted file]
libgcc/config/i386/32/t-softfp [new file with mode: 0644]
libgcc/config/i386/64/eqtf2.c
libgcc/config/i386/64/getf2.c
libgcc/config/i386/64/letf2.c
libgcc/config/i386/64/t-softfp-compat
libgcc/config/i386/sfp-machine.h [new file with mode: 0644]
libgcc/config/ia64/sfp-machine.h [new file with mode: 0644]
libgcc/config/ia64/t-fprules-softfp [deleted file]
libgcc/config/ia64/t-softfp [new file with mode: 0644]
libgcc/config/lm32/sfp-machine.h [new file with mode: 0644]
libgcc/config/moxie/t-moxie-softfp [deleted file]
libgcc/config/no-sfp-machine.h [new file with mode: 0644]
libgcc/config/rs6000/ibm-ldouble-format [new file with mode: 0644]
libgcc/config/rs6000/ibm-ldouble.c [new file with mode: 0644]
libgcc/config/rs6000/libgcc-ppc-glibc.ver [new file with mode: 0644]
libgcc/config/rs6000/libgcc-ppc64.ver [new file with mode: 0644]
libgcc/config/rs6000/sfp-machine.h [new file with mode: 0644]
libgcc/config/rs6000/t-freebsd [new file with mode: 0644]
libgcc/config/rs6000/t-ibm-ldouble [new file with mode: 0644]
libgcc/config/rs6000/t-ldbl128
libgcc/config/rs6000/t-linux64 [new file with mode: 0644]
libgcc/config/rs6000/t-ppccomm
libgcc/config/rs6000/t-ppccomm-ldbl [new file with mode: 0644]
libgcc/config/score/sfp-machine.h [new file with mode: 0644]
libgcc/config/t-softfp
libgcc/config/t-softfp-excl [new file with mode: 0644]
libgcc/config/t-softfp-sfdf [new file with mode: 0644]
libgcc/config/t-softfp-tf [new file with mode: 0644]
libgcc/configure
libgcc/configure.ac
libgcc/soft-fp/README [new file with mode: 0644]
libgcc/soft-fp/adddf3.c [new file with mode: 0644]
libgcc/soft-fp/addsf3.c [new file with mode: 0644]
libgcc/soft-fp/addtf3.c [new file with mode: 0644]
libgcc/soft-fp/divdf3.c [new file with mode: 0644]
libgcc/soft-fp/divsf3.c [new file with mode: 0644]
libgcc/soft-fp/divtf3.c [new file with mode: 0644]
libgcc/soft-fp/double.h [new file with mode: 0644]
libgcc/soft-fp/eqdf2.c [new file with mode: 0644]
libgcc/soft-fp/eqsf2.c [new file with mode: 0644]
libgcc/soft-fp/eqtf2.c [new file with mode: 0644]
libgcc/soft-fp/extenddftf2.c [new file with mode: 0644]
libgcc/soft-fp/extended.h [new file with mode: 0644]
libgcc/soft-fp/extendsfdf2.c [new file with mode: 0644]
libgcc/soft-fp/extendsftf2.c [new file with mode: 0644]
libgcc/soft-fp/extendxftf2.c [new file with mode: 0644]
libgcc/soft-fp/fixdfdi.c [new file with mode: 0644]
libgcc/soft-fp/fixdfsi.c [new file with mode: 0644]
libgcc/soft-fp/fixdfti.c [new file with mode: 0644]
libgcc/soft-fp/fixsfdi.c [new file with mode: 0644]
libgcc/soft-fp/fixsfsi.c [new file with mode: 0644]
libgcc/soft-fp/fixsfti.c [new file with mode: 0644]
libgcc/soft-fp/fixtfdi.c [new file with mode: 0644]
libgcc/soft-fp/fixtfsi.c [new file with mode: 0644]
libgcc/soft-fp/fixtfti.c [new file with mode: 0644]
libgcc/soft-fp/fixunsdfdi.c [new file with mode: 0644]
libgcc/soft-fp/fixunsdfsi.c [new file with mode: 0644]
libgcc/soft-fp/fixunsdfti.c [new file with mode: 0644]
libgcc/soft-fp/fixunssfdi.c [new file with mode: 0644]
libgcc/soft-fp/fixunssfsi.c [new file with mode: 0644]
libgcc/soft-fp/fixunssfti.c [new file with mode: 0644]
libgcc/soft-fp/fixunstfdi.c [new file with mode: 0644]
libgcc/soft-fp/fixunstfsi.c [new file with mode: 0644]
libgcc/soft-fp/fixunstfti.c [new file with mode: 0644]
libgcc/soft-fp/floatdidf.c [new file with mode: 0644]
libgcc/soft-fp/floatdisf.c [new file with mode: 0644]
libgcc/soft-fp/floatditf.c [new file with mode: 0644]
libgcc/soft-fp/floatsidf.c [new file with mode: 0644]
libgcc/soft-fp/floatsisf.c [new file with mode: 0644]
libgcc/soft-fp/floatsitf.c [new file with mode: 0644]
libgcc/soft-fp/floattidf.c [new file with mode: 0644]
libgcc/soft-fp/floattisf.c [new file with mode: 0644]
libgcc/soft-fp/floattitf.c [new file with mode: 0644]
libgcc/soft-fp/floatundidf.c [new file with mode: 0644]
libgcc/soft-fp/floatundisf.c [new file with mode: 0644]
libgcc/soft-fp/floatunditf.c [new file with mode: 0644]
libgcc/soft-fp/floatunsidf.c [new file with mode: 0644]
libgcc/soft-fp/floatunsisf.c [new file with mode: 0644]
libgcc/soft-fp/floatunsitf.c [new file with mode: 0644]
libgcc/soft-fp/floatuntidf.c [new file with mode: 0644]
libgcc/soft-fp/floatuntisf.c [new file with mode: 0644]
libgcc/soft-fp/floatuntitf.c [new file with mode: 0644]
libgcc/soft-fp/gedf2.c [new file with mode: 0644]
libgcc/soft-fp/gesf2.c [new file with mode: 0644]
libgcc/soft-fp/getf2.c [new file with mode: 0644]
libgcc/soft-fp/ledf2.c [new file with mode: 0644]
libgcc/soft-fp/lesf2.c [new file with mode: 0644]
libgcc/soft-fp/letf2.c [new file with mode: 0644]
libgcc/soft-fp/muldf3.c [new file with mode: 0644]
libgcc/soft-fp/mulsf3.c [new file with mode: 0644]
libgcc/soft-fp/multf3.c [new file with mode: 0644]
libgcc/soft-fp/negdf2.c [new file with mode: 0644]
libgcc/soft-fp/negsf2.c [new file with mode: 0644]
libgcc/soft-fp/negtf2.c [new file with mode: 0644]
libgcc/soft-fp/op-1.h [new file with mode: 0644]
libgcc/soft-fp/op-2.h [new file with mode: 0644]
libgcc/soft-fp/op-4.h [new file with mode: 0644]
libgcc/soft-fp/op-8.h [new file with mode: 0644]
libgcc/soft-fp/op-common.h [new file with mode: 0644]
libgcc/soft-fp/quad.h [new file with mode: 0644]
libgcc/soft-fp/single.h [new file with mode: 0644]
libgcc/soft-fp/soft-fp.h [new file with mode: 0644]
libgcc/soft-fp/subdf3.c [new file with mode: 0644]
libgcc/soft-fp/subsf3.c [new file with mode: 0644]
libgcc/soft-fp/subtf3.c [new file with mode: 0644]
libgcc/soft-fp/truncdfsf2.c [new file with mode: 0644]
libgcc/soft-fp/trunctfdf2.c [new file with mode: 0644]
libgcc/soft-fp/trunctfsf2.c [new file with mode: 0644]
libgcc/soft-fp/trunctfxf2.c [new file with mode: 0644]
libgcc/soft-fp/unorddf2.c [new file with mode: 0644]
libgcc/soft-fp/unordsf2.c [new file with mode: 0644]
libgcc/soft-fp/unordtf2.c [new file with mode: 0644]

index e103ea0a52cf45f3bce9a4ac5e218764a13c8b8c..f5776f0b00a260040fae83de22fecb0c7c7d4b5d 100644 (file)
@@ -1,3 +1,80 @@
+2011-08-05  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+
+       * config/soft-fp: Move to ../libgcc.
+       * Makefile.in (SFP_MACHINE): Remove.
+       (libgcc-support): Remove $(SFP_MACHINE) dependency.
+       * config/arm/sfp-machine.h: Move to ../libgcc/config/arm.
+       * config/arm/t-arm-softfp: Move to
+       ../libgcc/config/arm/t-softfp.
+       * config/c6x/sfp-machine.h: Move to ../libgcc/config/c6x.
+       * config/c6x/t-c6x-softfp: Remove.
+       * config/i386/sfp-machine.h: Move to ../libgcc/config/i386.
+       * config/i386/t-fprules-softfp: Move to
+       ../libgcc/config/t-softfp-tf.
+       * config/ia64/sfp-machine.h: Move to ../libgcc/config/ia64.
+       * config/ia64/t-fprules-softfp: Remove.
+       * config/lm32/sfp-machine.h: Move to ../libgcc/config/lm32.
+       * config/lm32/t-fprules-softfp: Remove.
+       * config/moxie/sfp-machine.h: Remove.
+       * config/moxie/t-moxie-softfp: Remove.
+       * config/rs6000/darwin-ldouble-format: Move to
+       ../libgcc/config/rs6000/ibm-ldouble-format.
+       * config/rs6000/darwin-ldouble.c: Move to
+       ../libgcc/config/rs6000/ibm-ldouble.c
+       * config/rs6000/libgcc-ppc-glibc.ver: Move to ../libgcc/config/rs6000.
+       * config/rs6000/libgcc-ppc64.ver: Likewise.
+       * config/rs6000/sfp-machine.h: Likewise.
+       * config/rs6000/t-aix43 (SHLIB_MAPFILES): Remove
+       $(srcdir)/config/rs6000/libgcc-ppc64.ver.
+       (LIB2FUNCS_EXTRA): Remove.
+       (TARGET_LIBGCC2_CFLAGS): Remove.
+       * config/rs6000/t-aix52: Likewise
+       * config/rs6000/t-darwin (LIB2FUNCS_EXTRA): Remove
+       $(srcdir)/config/rs6000/darwin-ldouble.c.
+       (SHLIB_MAPFILES): Remove.
+       * config/rs6000/t-darwin64 (LIB2FUNCS_EXTRA): Remove
+       $(srcdir)/config/rs6000/darwin-ldouble.c.
+       * config/rs6000/t-fprules-softfp: Move to
+       ../libgcc/config/t-softfp-sfdf.
+       * config/rs6000/t-freebsd: Move to ../libgcc/config/rs6000.
+       * config/rs6000/t-linux64 (softfp_wrap_start, softfp_wrap_end): Remove.
+       * config/rs6000/t-ppccomm (LIB2FUNCS_EXTRA): Remove
+       $(srcdir)/config/rs6000/darwin-ldouble.c.
+       * config/score/sfp-machine.h: Move to ../libgcc/config/score.
+       * config/score/t-score-softfp: Remove.
+       * config.gcc (arm*-*-linux*): Remove arm/t-arm-softfp,
+       soft-fp/t-softfp from tmake_file.
+       (arm*-*-uclinux*): Likewise.
+       (arm*-*-ecos-elf): Likewise.
+       (arm*-*-eabi*, arm*-*-symbianelf*): Likewise.
+       (arm*-*-rtems*): Likewise.
+       (arm*-*-elf): Likewise.
+       (moxie-*-elf): Remove moxie/t-moxie-softfp, soft-fp/t-softfp from
+       tmake_file.
+       (moxie-*-uclinux*): Likewise.
+       (moxie-*-rtems*): Likewise.
+       (lm32-*-elf*): Remove lm32/t-fprules-softfp, soft-fp/t-softfp from
+       tmake_file.
+       (lm32-*-rtems*): Likewise.
+       (lm32-*-uclinux*): Likewise.
+       (powerpc-*-freebsd*): Remove rs6000/t-freebsd,
+       rs6000/t-fprules-softfp, soft-fp/t-softfp from tmake_file.
+       (powerpc-*-linux*, powerpc64-*-linux*): Remove
+       rs6000/t-fprules-softfp, soft-fp/t-softfp from tmake_file.
+       (score-*-elf): Remove score/t-score-softfp, soft-fp/t-softfp from
+       tmake_file.
+       (tic6x-*-elf): Remove c6x/t-c6x-softfp, soft-fp/t-softfp from
+       tmake_file.
+       (tic6x-*-uclinux): Likewise.
+       (i[34567]86-*-darwin*, x86_64-*-darwin*): Remove i386/t-fprules-softfp,
+       soft-fp/t-softfp from tmake_file.
+       (i[34567]86-*-linux*, x86_64-*-linux*, i[34567]86-*-kfreebsd*-gnu)
+       (x86_64-*-kfreebsd*-gnu, i[34567]86-*-gnu*): Likewise.
+       (i[34567]86-*-solaris2*, x86_64-*-solaris2.1[0-9]*): Likewise.
+       (i[34567]86-*-cygwin*, i[34567]86-*-mingw*, x86_64-*-mingw*):
+       Likewise.
+       (i[34567]86-*-freebsd*, x86_64-*-freebsd*): Likewise.
+
 2011-08-05  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
        * Makefile.in (FPBIT_FUNCS, DPBIT_FUNCS, TPBIT_FUNCS): Remove.
index ff1dfc6931ad95732e173fb896c3a7cd1faad038..101e35e6bacf4e2d22eecca61c59afd32c0f1efa 100644 (file)
@@ -736,9 +736,6 @@ LIB2FUNCS_STATIC_EXTRA =
 # List of functions not to build from libgcc2.c.
 LIB2FUNCS_EXCLUDE =
 
-# Target sfp-machine.h file.
-SFP_MACHINE =
-
 # Program to convert libraries.
 LIBCONVERT =
 
@@ -1868,7 +1865,7 @@ srcdirify = $(patsubst $$(libgcc_objdir)/%,%, \
 GCC_EXTRA_PARTS := $(sort $(EXTRA_MULTILIB_PARTS) $(EXTRA_PARTS))
 
 libgcc-support: libgcc.mvars stmp-int-hdrs $(TCONFIG_H) \
-       $(MACHMODE_H) $(LIB2ADD) $(LIB2ADD_ST) gcov-iov.h $(SFP_MACHINE)
+       $(MACHMODE_H) $(LIB2ADD) $(LIB2ADD_ST) gcov-iov.h
 
 libgcc.mvars: config.status Makefile $(LIB2ADD) $(LIB2ADD_ST) specs \
                xgcc$(exeext)
index dcc5b4304d7c6ac8a5776e48492be083bf0c1662..716fa224b2a98e3a460f82df18c677267f7dbcb9 100644 (file)
@@ -868,7 +868,6 @@ arm*-*-linux*)                      # ARM GNU/Linux with ELF
        esac
        with_tls=${with_tls:-gnu}
        tm_file="$tm_file arm/aout.h arm/arm.h"
-       tmake_file="${tmake_file} arm/t-arm-softfp soft-fp/t-softfp"
        ;;
 arm*-*-uclinux*)               # ARM ucLinux
        tm_file="dbxelf.h elfos.h arm/unknown-elf.h arm/elf.h arm/linux-gas.h arm/uclinux-elf.h glibc-stdint.h"
@@ -886,12 +885,10 @@ arm*-*-uclinux*)          # ARM ucLinux
            default_use_cxa_atexit=yes
        esac
        tm_file="$tm_file arm/aout.h arm/arm.h"
-       tmake_file="${tmake_file} arm/t-arm-softfp soft-fp/t-softfp"
        ;;
 arm*-*-ecos-elf)
        tm_file="dbxelf.h elfos.h newlib-stdint.h arm/unknown-elf.h arm/elf.h arm/aout.h arm/arm.h arm/ecos-elf.h"
        tmake_file="arm/t-arm arm/t-arm-elf"
-       tmake_file="${tmake_file} arm/t-arm-softfp soft-fp/t-softfp"
        ;;
 arm*-*-eabi* | arm*-*-symbianelf* )
        # The BPABI long long divmod functions return a 128-bit value in
@@ -917,17 +914,14 @@ arm*-*-eabi* | arm*-*-symbianelf* )
          ;;
        esac
        tm_file="${tm_file} arm/aout.h arm/arm.h"
-       tmake_file="${tmake_file} arm/t-arm-softfp soft-fp/t-softfp"
        ;;
 arm*-*-rtems*)
        tm_file="dbxelf.h elfos.h arm/unknown-elf.h arm/elf.h arm/aout.h arm/arm.h arm/rtems-elf.h rtems.h newlib-stdint.h"
        tmake_file="arm/t-arm arm/t-arm-elf t-rtems arm/t-rtems"
-       tmake_file="${tmake_file} arm/t-arm-softfp soft-fp/t-softfp"
        ;;
 arm*-*-elf)
        tm_file="dbxelf.h elfos.h newlib-stdint.h arm/unknown-elf.h arm/elf.h arm/aout.h arm/arm.h"
        tmake_file="arm/t-arm arm/t-arm-elf"
-       tmake_file="${tmake_file} arm/t-arm-softfp soft-fp/t-softfp"
        ;;
 arm*-wince-pe*)
        tm_file="arm/semi.h arm/aout.h arm/arm.h arm/coff.h dbxcoff.h arm/pe.h arm/wince-pe.h"
@@ -1025,17 +1019,17 @@ moxie-*-elf)
        gnu_ld=yes
        tm_file="dbxelf.h elfos.h newlib-stdint.h ${tm_file}"
        extra_parts="crti.o crtn.o crtbegin.o crtend.o"
-       tmake_file="${tmake_file} moxie/t-moxie moxie/t-moxie-softfp soft-fp/t-softfp"
+       tmake_file="${tmake_file} moxie/t-moxie"
        ;;
 moxie-*-uclinux*)
        gas=yes
        gnu_ld=yes
        tm_file="dbxelf.h elfos.h ${tm_file} gnu-user.h linux.h glibc-stdint.h moxie/uclinux.h"
        extra_parts="crti.o crtn.o crtbegin.o crtend.o"
-       tmake_file="${tmake_file} moxie/t-moxie moxie/t-moxie-softfp soft-fp/t-softfp"
+       tmake_file="${tmake_file} moxie/t-moxie"
        ;;
 moxie-*-rtems*)
-       tmake_file="${tmake_file} moxie/t-moxie moxie/t-moxie-softfp soft-fp/t-softfp t-rtems"
+       tmake_file="${tmake_file} moxie/t-moxie t-rtems"
        tm_file="moxie/moxie.h dbxelf.h elfos.h moxie/rtems.h rtems.h newlib-stdint.h"
        ;;
 h8300-*-rtems*)
@@ -1651,16 +1645,16 @@ iq2000*-*-elf*)
         ;;
 lm32-*-elf*)
         tm_file="dbxelf.h elfos.h ${tm_file}"
-       tmake_file="${tmake_file} lm32/t-lm32 lm32/t-fprules-softfp soft-fp/t-softfp"
+       tmake_file="${tmake_file} lm32/t-lm32"
         ;;
 lm32-*-rtems*)
        tm_file="dbxelf.h elfos.h ${tm_file} lm32/rtems.h rtems.h newlib-stdint.h"
-       tmake_file="${tmake_file} lm32/t-lm32 lm32/t-fprules-softfp soft-fp/t-softfp"
+       tmake_file="${tmake_file} lm32/t-lm32"
        tmake_file="${tmake_file} t-rtems"
          ;;
 lm32-*-uclinux*)
         tm_file="dbxelf.h elfos.h ${tm_file} gnu-user.h linux.h lm32/uclinux-elf.h"
-       tmake_file="${tmake_file} lm32/t-lm32 lm32/t-fprules-softfp soft-fp/t-softfp"
+       tmake_file="${tmake_file} lm32/t-lm32"
         ;;
 m32r-*-elf*)
        tm_file="dbxelf.h elfos.h newlib-stdint.h ${tm_file}"
@@ -2048,8 +2042,8 @@ powerpc64-*-darwin*)
        ;;
 powerpc-*-freebsd*)
        tm_file="${tm_file} dbxelf.h elfos.h ${fbsd_tm_file} rs6000/sysv4.h rs6000/freebsd.h"
-       tmake_file="rs6000/t-fprules rs6000/t-ppcos ${tmake_file} rs6000/t-ppccomm rs6000/t-freebsd"
-       tmake_file="${tmake_file} t-slibgcc-libgcc rs6000/t-fprules-softfp soft-fp/t-softfp"
+       tmake_file="rs6000/t-fprules rs6000/t-ppcos ${tmake_file} rs6000/t-ppccomm"
+       tmake_file="${tmake_file} t-slibgcc-libgcc"
        extra_options="${extra_options} rs6000/sysv4.opt"
        ;;
 powerpc-*-netbsd*)
@@ -2135,7 +2129,7 @@ powerpc-*-linux* | powerpc64-*-linux*)
                tm_file="${tm_file} rs6000/linux.h glibc-stdint.h"
                ;;
        esac
-       tmake_file="${tmake_file} t-slibgcc-libgcc rs6000/t-fprules-softfp soft-fp/t-softfp"
+       tmake_file="${tmake_file} t-slibgcc-libgcc"
        case ${target} in
            powerpc*-*-linux*altivec*)
                tm_file="${tm_file} rs6000/linuxaltivec.h" ;;
@@ -2269,7 +2263,7 @@ score-*-elf)
        gnu_ld=yes
         tm_file="dbxelf.h elfos.h score/elf.h score/score.h newlib-stdint.h"
        extra_parts="crti.o crtn.o crtbegin.o crtend.o"
-        tmake_file="${tmake_file} score/t-score-elf score/t-score-softfp soft-fp/t-softfp"
+        tmake_file="${tmake_file} score/t-score-elf"
         ;;
 sh-*-elf* | sh[12346l]*-*-elf* | \
   sh-*-linux* | sh[2346lbe]*-*-linux* | \
@@ -2571,7 +2565,6 @@ tic6x-*-elf)
        tm_file="${tm_file} dbxelf.h tm-dwarf2.h newlib-stdint.h"
        libgcc_tm_file="${libgcc_tm_file} c6x/c6x-abi.h"
        tmake_file="c6x/t-c6x c6x/t-c6x-elf"
-       tmake_file="${tmake_file} c6x/t-c6x-softfp soft-fp/t-softfp"
        use_collect2=no
        ;;
 tic6x-*-uclinux)
@@ -2581,7 +2574,6 @@ tic6x-*-uclinux)
        libgcc_tm_file="${libgcc_tm_file} c6x/c6x-abi.h"
        tmake_file="t-slibgcc-elf-ver t-sysroot-suffix"
        tmake_file="${tmake_file} c6x/t-c6x c6x/t-c6x-elf c6x/t-c6x-uclinux"
-       tmake_file="${tmake_file} c6x/t-c6x-softfp soft-fp/t-softfp"
        use_collect2=no
        ;;
 v850*-*-*)
@@ -3585,24 +3577,19 @@ case ${target} in
                ;;
 
        i[34567]86-*-darwin* | x86_64-*-darwin*)
-               tmake_file="${tmake_file} i386/t-fprules-softfp soft-fp/t-softfp"
                ;;
        i[34567]86-*-linux* | x86_64-*-linux* | \
          i[34567]86-*-kfreebsd*-gnu | x86_64-*-kfreebsd*-gnu | \
          i[34567]86-*-gnu*)
-               tmake_file="${tmake_file} i386/t-fprules-softfp soft-fp/t-softfp i386/t-linux"
+               tmake_file="${tmake_file} i386/t-linux"
                ;;
        i[34567]86-*-solaris2* | x86_64-*-solaris2.1[0-9]*)
-               tmake_file="${tmake_file} i386/t-fprules-softfp soft-fp/t-softfp"
                ;;
        i[34567]86-*-cygwin* | i[34567]86-*-mingw* | x86_64-*-mingw*)
-               tmake_file="${tmake_file} i386/t-fprules-softfp soft-fp/t-softfp"
                ;;
        i[34567]86-*-freebsd* | x86_64-*-freebsd*)
-               tmake_file="${tmake_file} i386/t-fprules-softfp soft-fp/t-softfp"
                ;;
        ia64*-*-linux*)
-               tmake_file="${tmake_file} ia64/t-fprules-softfp soft-fp/t-softfp"
                ;;
 
        mips*-*-*)
diff --git a/gcc/config/arm/sfp-machine.h b/gcc/config/arm/sfp-machine.h
deleted file mode 100644 (file)
index a89d05a..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-#define _FP_W_TYPE_SIZE                32
-#define _FP_W_TYPE             unsigned long
-#define _FP_WS_TYPE            signed long
-#define _FP_I_TYPE             long
-
-/* 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_S(R,X,Y)                          \
-  _FP_MUL_MEAT_1_wide(_FP_WFRACBITS_S,R,X,Y,umul_ppmm)
-#define _FP_MUL_MEAT_D(R,X,Y)                          \
-  _FP_MUL_MEAT_2_wide(_FP_WFRACBITS_D,R,X,Y,umul_ppmm)
-#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_loop(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_H          ((_FP_QNANBIT_H << 1) - 1)
-#define _FP_NANFRAC_S          ((_FP_QNANBIT_S << 1) - 1)
-#define _FP_NANFRAC_D          ((_FP_QNANBIT_D << 1) - 1), -1
-#define _FP_NANFRAC_Q          ((_FP_QNANBIT_Q << 1) - 1), -1, -1, -1
-#define _FP_NANSIGN_H          0
-#define _FP_NANSIGN_S          0
-#define _FP_NANSIGN_D          0
-#define _FP_NANSIGN_Q          0
-
-#define _FP_KEEPNANFRACP 1
-
-/* Someone please check this.  */
-#define _FP_CHOOSENAN(fs, wc, R, X, Y, OP)                     \
-  do {                                                         \
-    if ((_FP_FRAC_HIGH_RAW_##fs(X) & _FP_QNANBIT_##fs)         \
-       && !(_FP_FRAC_HIGH_RAW_##fs(Y) & _FP_QNANBIT_##fs))     \
-      {                                                                \
-       R##_s = Y##_s;                                          \
-       _FP_FRAC_COPY_##wc(R,Y);                                \
-      }                                                                \
-    else                                                       \
-      {                                                                \
-       R##_s = X##_s;                                          \
-       _FP_FRAC_COPY_##wc(R,X);                                \
-      }                                                                \
-    R##_c = FP_CLS_NAN;                                                \
-  } while (0)
-
-#define        __LITTLE_ENDIAN 1234
-#define        __BIG_ENDIAN    4321
-
-#if defined __ARMEB__
-# define __BYTE_ORDER __BIG_ENDIAN
-#else
-# define __BYTE_ORDER __LITTLE_ENDIAN
-#endif
-
-
-/* Define ALIASNAME as a strong alias for NAME.  */
-# define strong_alias(name, aliasname) _strong_alias(name, aliasname)
-# define _strong_alias(name, aliasname) \
-  extern __typeof (name) aliasname __attribute__ ((alias (#name)));
-
-#ifdef __ARM_EABI__
-/* Rename functions to their EABI names.  */
-/* The comparison functions need wrappers for EABI semantics, so
-   leave them unmolested.  */
-#define __negsf2       __aeabi_fneg
-#define __subsf3       __aeabi_fsub
-#define __addsf3       __aeabi_fadd
-#define __floatunsisf  __aeabi_ui2f
-#define __floatsisf    __aeabi_i2f
-#define __floatundisf  __aeabi_ul2f
-#define __floatdisf    __aeabi_l2f
-#define __mulsf3       __aeabi_fmul
-#define __divsf3       __aeabi_fdiv
-#define __unordsf2     __aeabi_fcmpun
-#define __fixsfsi      __aeabi_f2iz
-#define __fixunssfsi   __aeabi_f2uiz
-#define __fixsfdi      __aeabi_f2lz
-#define __fixunssfdi   __aeabi_f2ulz
-#define __floatdisf    __aeabi_l2f
-
-#define __negdf2       __aeabi_dneg
-#define __subdf3       __aeabi_dsub
-#define __adddf3       __aeabi_dadd
-#define __floatunsidf  __aeabi_ui2d
-#define __floatsidf    __aeabi_i2d
-#define __extendsfdf2  __aeabi_f2d
-#define __truncdfsf2   __aeabi_d2f
-#define __floatundidf  __aeabi_ul2d
-#define __floatdidf    __aeabi_l2d
-#define __muldf3       __aeabi_dmul
-#define __divdf3       __aeabi_ddiv
-#define __unorddf2     __aeabi_dcmpun
-#define __fixdfsi      __aeabi_d2iz
-#define __fixunsdfsi   __aeabi_d2uiz
-#define __fixdfdi      __aeabi_d2lz
-#define __fixunsdfdi   __aeabi_d2ulz
-#define __floatdidf    __aeabi_l2d
-#define __extendhfsf2  __gnu_h2f_ieee
-#define __truncsfhf2   __gnu_f2h_ieee
-
-#endif /* __ARM_EABI__ */
diff --git a/gcc/config/arm/t-arm-softfp b/gcc/config/arm/t-arm-softfp
deleted file mode 100644 (file)
index f9cace9..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-# Copyright (C) 2008 Free Software Foundation, Inc.
-#
-# This file is part of GCC.
-#
-# GCC is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-#
-# GCC is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GCC; see the file COPYING3.  If not see
-# <http://www.gnu.org/licenses/>.
-
-softfp_float_modes := sf df
-softfp_int_modes := si di
-softfp_extensions := sfdf
-softfp_truncations := dfsf
-softfp_machine_header := arm/sfp-machine.h
-softfp_exclude_libgcc2 := y
-softfp_wrap_start := '\#ifdef __ARM_ARCH_6M__'
-softfp_wrap_end := '\#endif'
-
-# softfp seems to be missing a whole bunch of prototypes.
-TARGET_LIBGCC2_CFLAGS += -Wno-missing-prototypes
diff --git a/gcc/config/c6x/sfp-machine.h b/gcc/config/c6x/sfp-machine.h
deleted file mode 100644 (file)
index 2c90e58..0000000
+++ /dev/null
@@ -1,120 +0,0 @@
-/* Soft-FP definitions for TI C6X.
-   Copyright (C) 2010, 2011 Free Software Foundation, Inc.
-
-   This files is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   This file is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with GCC; see the file COPYING.LIB.  If not see
-   <http://www.gnu.org/licenses/>.  */
-
-#define _FP_W_TYPE_SIZE                32
-#define _FP_W_TYPE             unsigned long
-#define _FP_WS_TYPE            signed long
-#define _FP_I_TYPE             long
-
-#define _FP_MUL_MEAT_S(R,X,Y)                          \
-  _FP_MUL_MEAT_1_wide(_FP_WFRACBITS_S,R,X,Y,umul_ppmm)
-#define _FP_MUL_MEAT_D(R,X,Y)                          \
-  _FP_MUL_MEAT_2_wide(_FP_WFRACBITS_D,R,X,Y,umul_ppmm)
-#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_loop(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_H          ((_FP_QNANBIT_H << 1) - 1)
-#define _FP_NANFRAC_S          ((_FP_QNANBIT_S << 1) - 1)
-#define _FP_NANFRAC_D          ((_FP_QNANBIT_D << 1) - 1), -1
-#define _FP_NANFRAC_Q          ((_FP_QNANBIT_Q << 1) - 1), -1, -1, -1
-#define _FP_NANSIGN_H          0
-#define _FP_NANSIGN_S          0
-#define _FP_NANSIGN_D          0
-#define _FP_NANSIGN_Q          0
-
-#define _FP_KEEPNANFRACP 1
-
-/* Someone please check this.  */
-#define _FP_CHOOSENAN(fs, wc, R, X, Y, OP)                     \
-  do {                                                         \
-    if ((_FP_FRAC_HIGH_RAW_##fs(X) & _FP_QNANBIT_##fs)         \
-       && !(_FP_FRAC_HIGH_RAW_##fs(Y) & _FP_QNANBIT_##fs))     \
-      {                                                                \
-       R##_s = Y##_s;                                          \
-       _FP_FRAC_COPY_##wc(R,Y);                                \
-      }                                                                \
-    else                                                       \
-      {                                                                \
-       R##_s = X##_s;                                          \
-       _FP_FRAC_COPY_##wc(R,X);                                \
-      }                                                                \
-    R##_c = FP_CLS_NAN;                                                \
-  } while (0)
-
-#define        __LITTLE_ENDIAN 1234
-#define        __BIG_ENDIAN    4321
-
-#if defined _BIG_ENDIAN
-# define __BYTE_ORDER __BIG_ENDIAN
-#else
-# define __BYTE_ORDER __LITTLE_ENDIAN
-#endif
-
-
-/* Define ALIASNAME as a strong alias for NAME.  */
-# define strong_alias(name, aliasname) _strong_alias(name, aliasname)
-# define _strong_alias(name, aliasname) \
-  extern __typeof (name) aliasname __attribute__ ((alias (#name)));
-
-/* Rename helper functions to the names specified in the C6000 ELF ABI.  */
-#define __fixdfsi     __c6xabi_fixdi
-#define __fixsfsi     __c6xabi_fixfi
-#define __floatsidf   __c6xabi_fltid
-#define __floatunsidf __c6xabi_fltud
-#define __floatsisf   __c6xabi_fltif
-#define __floatunsisf __c6xabi_fltuf
-#define __truncdfsf2  __c6xabi_cvtdf
-#define __extendsfdf2 __c6xabi_cvtfd
-#define __adddf3      __c6xabi_addd
-#define __subdf3      __c6xabi_subd
-#define __muldf3      __c6xabi_mpyd
-#define __divdf3      __c6xabi_divd
-#define __negdf2      __c6xabi_negd
-#define __absdf2      __c6xabi_absd
-#define __addsf3      __c6xabi_addf
-#define __subsf3      __c6xabi_subf
-#define __mulsf3      __c6xabi_mpyf
-#define __divsf3      __c6xabi_divf
-#define __negsf2      __c6xabi_negf
-#define __abssf2      __c6xabi_absf
-#define __lesf2       __c6xabi_cmpf
-#define __ledf2       __c6xabi_cmpd
-#define __ltsf2       __gnu_ltsf2
-#define __ltdf2       __gnu_ltdf2
-#define __gesf2       __gnu_gesf2
-#define __gedf2       __gnu_gedf2
-#define __gtsf2       __gnu_gtsf2
-#define __gtdf2       __gnu_gtdf2
-#define __eqsf2       __gnu_eqsf2
-#define __eqdf2       __gnu_eqdf2
-#define __nesf2       __c6xabi_neqf
-#define __nedf2       __c6xabi_neqd
-#define __unordsf2    __c6xabi_unordf
-#define __unorddf2    __c6xabi_unordd
diff --git a/gcc/config/c6x/t-c6x-softfp b/gcc/config/c6x/t-c6x-softfp
deleted file mode 100644 (file)
index 5df90eb..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-softfp_float_modes := sf df
-softfp_int_modes := si di
-softfp_extensions := sfdf
-softfp_truncations := dfsf
-softfp_machine_header := c6x/sfp-machine.h
-softfp_exclude_libgcc2 := y
-
-# softfp seems to be missing a whole bunch of prototypes.
-TARGET_LIBGCC2_CFLAGS += -Wno-missing-prototypes
diff --git a/gcc/config/i386/sfp-machine.h b/gcc/config/i386/sfp-machine.h
deleted file mode 100644 (file)
index f2df869..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-#ifdef __x86_64__
-#include "config/i386/64/sfp-machine.h"
-#else
-#include "config/i386/32/sfp-machine.h"
-#endif
diff --git a/gcc/config/i386/t-fprules-softfp b/gcc/config/i386/t-fprules-softfp
deleted file mode 100644 (file)
index 0b0068f..0000000
+++ /dev/null
@@ -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
diff --git a/gcc/config/ia64/sfp-machine.h b/gcc/config/ia64/sfp-machine.h
deleted file mode 100644 (file)
index bdcce77..0000000
+++ /dev/null
@@ -1,116 +0,0 @@
-#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
-
-#define FP_HANDLE_EXCEPTIONS                                           \
-  do {                                                                 \
-    double tmp, dummy;                                                 \
-    if (_fex & FP_EX_INVALID)                                          \
-      {                                                                        \
-       tmp = 0.0;                                                      \
-       __asm__ __volatile__ ("frcpa.s0 %0,p1=f0,f0"                    \
-                             : "=f" (tmp) : : "p1" );                  \
-      }                                                                        \
-    if (_fex & FP_EX_DIVZERO)                                          \
-      {                                                                        \
-       __asm__ __volatile__ ("frcpa.s0 %0,p1=f1,f0"                    \
-                             : "=f" (tmp) : : "p1" );                  \
-      }                                                                        \
-    if (_fex & FP_EX_OVERFLOW)                                         \
-      {                                                                        \
-       dummy = __DBL_MAX__;                                            \
-       __asm__ __volatile__ ("fadd.d.s0 %0=%1,%1"                      \
-                             : "=f" (dummy) : "0" (dummy));            \
-      }                                                                        \
-    if (_fex & FP_EX_UNDERFLOW)                                                \
-      {                                                                        \
-       dummy = __DBL_MIN__;                                            \
-       __asm__ __volatile__ ("fnma.d.s0 %0=%1,%1,f0"                   \
-                             : "=f" (tmp) : "f" (dummy));              \
-      }                                                                        \
-    if (_fex & FP_EX_INEXACT)                                          \
-      {                                                                        \
-       dummy = __DBL_MAX__;                                            \
-       __asm__ __volatile__ ("fsub.d.s0 %0=%1,f1"                      \
-                             : "=f" (dummy) : "0" (dummy));            \
-      }                                                                        \
-  } while (0)
-
-#define FP_RND_NEAREST         0
-#define FP_RND_ZERO            0xc00L
-#define FP_RND_PINF            0x800L
-#define FP_RND_MINF            0x400L
-
-#define _FP_DECL_EX \
-  unsigned long int _fpsr __attribute__ ((unused)) = FP_RND_NEAREST
-
-#define FP_INIT_ROUNDMODE                      \
-  do {                                         \
-    __asm__ __volatile__ ("mov.m %0=ar.fpsr"   \
-                         : "=r" (_fpsr));      \
-  } while (0)
-
-#define FP_ROUNDMODE           (_fpsr & 0xc00L)
-
-#define        __LITTLE_ENDIAN 1234
-#define        __BIG_ENDIAN    4321
-
-#define __BYTE_ORDER __LITTLE_ENDIAN
-
-/* Define ALIASNAME as a strong alias for NAME.  */
-#define strong_alias(name, aliasname) _strong_alias(name, aliasname)
-#define _strong_alias(name, aliasname) \
-  extern __typeof (name) aliasname __attribute__ ((alias (#name)));
diff --git a/gcc/config/ia64/t-fprules-softfp b/gcc/config/ia64/t-fprules-softfp
deleted file mode 100644 (file)
index 4c876bf..0000000
+++ /dev/null
@@ -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 := ia64/sfp-machine.h
-softfp_exclude_libgcc2 := n
diff --git a/gcc/config/lm32/sfp-machine.h b/gcc/config/lm32/sfp-machine.h
deleted file mode 100644 (file)
index 1903848..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-#define _FP_W_TYPE_SIZE                32
-#define _FP_W_TYPE             unsigned long
-#define _FP_WS_TYPE            signed long
-#define _FP_I_TYPE             long
-
-#define _FP_MUL_MEAT_S(R,X,Y)                          \
-  _FP_MUL_MEAT_1_wide(_FP_WFRACBITS_S,R,X,Y,umul_ppmm)
-#define _FP_MUL_MEAT_D(R,X,Y)                          \
-  _FP_MUL_MEAT_2_wide(_FP_WFRACBITS_D,R,X,Y,umul_ppmm)
-#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_loop(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 << 1) - 1)
-#define _FP_NANFRAC_D          ((_FP_QNANBIT_D << 1) - 1), -1
-#define _FP_NANFRAC_Q          ((_FP_QNANBIT_Q << 1) - 1), -1, -1, -1
-#define _FP_NANSIGN_S          0
-#define _FP_NANSIGN_D          0
-#define _FP_NANSIGN_Q          0
-
-#define _FP_KEEPNANFRACP 1
-
-/* Someone please check this.  */
-#define _FP_CHOOSENAN(fs, wc, R, X, Y, OP)                     \
-  do {                                                         \
-    if ((_FP_FRAC_HIGH_RAW_##fs(X) & _FP_QNANBIT_##fs)         \
-       && !(_FP_FRAC_HIGH_RAW_##fs(Y) & _FP_QNANBIT_##fs))     \
-      {                                                                \
-       R##_s = Y##_s;                                          \
-       _FP_FRAC_COPY_##wc(R,Y);                                \
-      }                                                                \
-    else                                                       \
-      {                                                                \
-       R##_s = X##_s;                                          \
-       _FP_FRAC_COPY_##wc(R,X);                                \
-      }                                                                \
-    R##_c = FP_CLS_NAN;                                                \
-  } while (0)
-
-#define        __LITTLE_ENDIAN 1234
-#define        __BIG_ENDIAN    4321
-
-#define __BYTE_ORDER __BIG_ENDIAN
-
-/* Define ALIASNAME as a strong alias for NAME.  */
-# define strong_alias(name, aliasname) _strong_alias(name, aliasname)
-# define _strong_alias(name, aliasname) \
-  extern __typeof (name) aliasname __attribute__ ((alias (#name)));
diff --git a/gcc/config/lm32/t-fprules-softfp b/gcc/config/lm32/t-fprules-softfp
deleted file mode 100644 (file)
index f99f51c..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-softfp_float_modes := sf df
-softfp_int_modes := si di
-softfp_extensions := sfdf
-softfp_truncations := dfsf
-softfp_machine_header := lm32/sfp-machine.h
diff --git a/gcc/config/moxie/sfp-machine.h b/gcc/config/moxie/sfp-machine.h
deleted file mode 100644 (file)
index 98f9f1b..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-#define _FP_W_TYPE_SIZE                32
-#define _FP_W_TYPE             unsigned long
-#define _FP_WS_TYPE            signed long
-#define _FP_I_TYPE             long
-
-/* 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_S(R,X,Y)                          \
-  _FP_MUL_MEAT_1_wide(_FP_WFRACBITS_S,R,X,Y,umul_ppmm)
-#define _FP_MUL_MEAT_D(R,X,Y)                          \
-  _FP_MUL_MEAT_2_wide(_FP_WFRACBITS_D,R,X,Y,umul_ppmm)
-#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_loop(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 << 1) - 1)
-#define _FP_NANFRAC_D          ((_FP_QNANBIT_D << 1) - 1), -1
-#define _FP_NANFRAC_Q          ((_FP_QNANBIT_Q << 1) - 1), -1, -1, -1
-#define _FP_NANSIGN_S          0
-#define _FP_NANSIGN_D          0
-#define _FP_NANSIGN_Q          0
-
-#define _FP_KEEPNANFRACP 1
-
-/* Someone please check this.  */
-#define _FP_CHOOSENAN(fs, wc, R, X, Y, OP)                     \
-  do {                                                         \
-    if ((_FP_FRAC_HIGH_RAW_##fs(X) & _FP_QNANBIT_##fs)         \
-       && !(_FP_FRAC_HIGH_RAW_##fs(Y) & _FP_QNANBIT_##fs))     \
-      {                                                                \
-       R##_s = Y##_s;                                          \
-       _FP_FRAC_COPY_##wc(R,Y);                                \
-      }                                                                \
-    else                                                       \
-      {                                                                \
-       R##_s = X##_s;                                          \
-       _FP_FRAC_COPY_##wc(R,X);                                \
-      }                                                                \
-    R##_c = FP_CLS_NAN;                                                \
-  } while (0)
-
-#define        __LITTLE_ENDIAN 1234
-#define        __BIG_ENDIAN    4321
-
-# define __BYTE_ORDER __BIG_ENDIAN
-
-/* Define ALIASNAME as a strong alias for NAME.  */
-# define strong_alias(name, aliasname) _strong_alias(name, aliasname)
-# define _strong_alias(name, aliasname) \
-  extern __typeof (name) aliasname __attribute__ ((alias (#name)));
-
diff --git a/gcc/config/moxie/t-moxie-softfp b/gcc/config/moxie/t-moxie-softfp
deleted file mode 100644 (file)
index 61c5751..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-softfp_float_modes := sf df
-softfp_int_modes := si di
-softfp_extensions := sfdf
-softfp_truncations := dfsf
-softfp_machine_header := moxie/sfp-machine.h
-softfp_exclude_libgcc2 := y
-
-# softfp seems to be missing a whole bunch of prototypes.
-TARGET_LIBGCC2_CFLAGS += -Wno-missing-prototypes
diff --git a/gcc/config/rs6000/darwin-ldouble-format b/gcc/config/rs6000/darwin-ldouble-format
deleted file mode 100644 (file)
index 3d1a06a..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-Long double format
-==================
-
-  Each long double is made up of two IEEE doubles.  The value of the
-long double is the sum of the values of the two parts (except for
--0.0).  The most significant part is required to be the value of the
-long double rounded to the nearest double, as specified by IEEE.  For
-Inf values, the least significant part is required to be one of +0.0
-or -0.0.  No other requirements are made; so, for example, 1.0 may be
-represented as (1.0, +0.0) or (1.0, -0.0), and the low part of a NaN
-is don't-care.
-
-Classification
---------------
-
-A long double can represent any value of the form
-  s * 2^e * sum(k=0...105: f_k * 2^(-k))
-where 's' is +1 or -1, 'e' is between 1022 and -968 inclusive, f_0 is
-1, and f_k for k>0 is 0 or 1.  These are the 'normal' long doubles.
-
-A long double can also represent any value of the form
-  s * 2^-968 * sum(k=0...105: f_k * 2^(-k))
-where 's' is +1 or -1, f_0 is 0, and f_k for k>0 is 0 or 1.  These are
-the 'subnormal' long doubles.
-
-There are four long doubles that represent zero, two that represent
-+0.0 and two that represent -0.0.  The sign of the high part is the
-sign of the long double, and the sign of the low part is ignored.
-
-Likewise, there are four long doubles that represent infinities, two
-for +Inf and two for -Inf.
-
-Each NaN, quiet or signalling, that can be represented as a 'double'
-can be represented as a 'long double'.  In fact, there are 2^64
-equivalent representations for each one.
-
-There are certain other valid long doubles where both parts are
-nonzero but the low part represents a value which has a bit set below
-2^(e-105).  These, together with the subnormal long doubles, make up
-the denormal long doubles.
-
-Many possible long double bit patterns are not valid long doubles.
-These do not represent any value.
-
-Limits
-------
-
-The maximum representable long double is 2^1024-2^918.  The smallest
-*normal* positive long double is 2^-968.  The smallest denormalised
-positive long double is 2^-1074 (this is the same as for 'double').
-
-Conversions
------------
-
-A double can be converted to a long double by adding a zero low part.
-
-A long double can be converted to a double by removing the low part.
-
-Comparisons
------------
-
-Two long doubles can be compared by comparing the high parts, and if
-those compare equal, comparing the low parts.
-
-Arithmetic
-----------
-
-The unary negate operation operates by negating the low and high parts.
-
-An absolute or absolute-negate operation must be done by comparing
-against zero and negating if necessary.
-
-Addition and subtraction are performed using library routines.  They
-are not at present performed perfectly accurately, the result produced
-will be within 1ulp of the range generated by adding or subtracting
-1ulp from the input values, where a 'ulp' is 2^(e-106) given the
-exponent 'e'.  In the presence of cancellation, this may be
-arbitrarily inaccurate.  Subtraction is done by negation and addition.
-
-Multiplication is also performed using a library routine.  Its result
-will be within 2ulp of the correct result.
-
-Division is also performed using a library routine.  Its result will
-be within 3ulp of the correct result.
-
-\f
-Copyright (C) 2004 Free Software Foundation, Inc.
-
-Copying and distribution of this file, with or without modification,
-are permitted in any medium without royalty provided the copyright
-notice and this notice are preserved.
diff --git a/gcc/config/rs6000/darwin-ldouble.c b/gcc/config/rs6000/darwin-ldouble.c
deleted file mode 100644 (file)
index d76c1b1..0000000
+++ /dev/null
@@ -1,438 +0,0 @@
-/* 128-bit long double support routines for Darwin.
-   Copyright (C) 1993, 2003, 2004, 2005, 2006, 2007, 2008, 2009
-   Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or
-FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-for more details.
-
-Under Section 7 of GPL version 3, you are granted additional
-permissions described in the GCC Runtime Library Exception, version
-3.1, as published by the Free Software Foundation.
-
-You should have received a copy of the GNU General Public License and
-a copy of the GCC Runtime Library Exception along with this program;
-see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
-<http://www.gnu.org/licenses/>.  */
-
-
-/* Implementations of floating-point long double basic arithmetic
-   functions called by the IBM C compiler when generating code for
-   PowerPC platforms.  In particular, the following functions are
-   implemented: __gcc_qadd, __gcc_qsub, __gcc_qmul, and __gcc_qdiv.
-   Double-double algorithms are based on the paper "Doubled-Precision
-   IEEE Standard 754 Floating-Point Arithmetic" by W. Kahan, February 26,
-   1987.  An alternative published reference is "Software for
-   Doubled-Precision Floating-Point Computations", by Seppo Linnainmaa,
-   ACM TOMS vol 7 no 3, September 1981, pages 272-283.  */
-
-/* Each long double is made up of two IEEE doubles.  The value of the
-   long double is the sum of the values of the two parts.  The most
-   significant part is required to be the value of the long double
-   rounded to the nearest double, as specified by IEEE.  For Inf
-   values, the least significant part is required to be one of +0.0 or
-   -0.0.  No other requirements are made; so, for example, 1.0 may be
-   represented as (1.0, +0.0) or (1.0, -0.0), and the low part of a
-   NaN is don't-care.
-
-   This code currently assumes big-endian.  */
-
-#if (!defined (__LITTLE_ENDIAN__) \
-     && (defined (__MACH__) || defined (__powerpc__) || defined (_AIX)))
-
-#define fabs(x) __builtin_fabs(x)
-#define isless(x, y) __builtin_isless (x, y)
-#define inf() __builtin_inf()
-
-#define unlikely(x) __builtin_expect ((x), 0)
-
-#define nonfinite(a) unlikely (! isless (fabs (a), inf ()))
-
-/* Define ALIASNAME as a strong alias for NAME.  */
-# define strong_alias(name, aliasname) _strong_alias(name, aliasname)
-# define _strong_alias(name, aliasname) \
-  extern __typeof (name) aliasname __attribute__ ((alias (#name)));
-
-/* All these routines actually take two long doubles as parameters,
-   but GCC currently generates poor code when a union is used to turn
-   a long double into a pair of doubles.  */
-
-long double __gcc_qadd (double, double, double, double);
-long double __gcc_qsub (double, double, double, double);
-long double __gcc_qmul (double, double, double, double);
-long double __gcc_qdiv (double, double, double, double);
-
-#if defined __ELF__ && defined SHARED \
-    && (defined __powerpc64__ || !(defined __linux__ || defined __gnu_hurd__))
-/* Provide definitions of the old symbol names to satisfy apps and
-   shared libs built against an older libgcc.  To access the _xlq
-   symbols an explicit version reference is needed, so these won't
-   satisfy an unadorned reference like _xlqadd.  If dot symbols are
-   not needed, the assembler will remove the aliases from the symbol
-   table.  */
-__asm__ (".symver __gcc_qadd,_xlqadd@GCC_3.4\n\t"
-        ".symver __gcc_qsub,_xlqsub@GCC_3.4\n\t"
-        ".symver __gcc_qmul,_xlqmul@GCC_3.4\n\t"
-        ".symver __gcc_qdiv,_xlqdiv@GCC_3.4\n\t"
-        ".symver .__gcc_qadd,._xlqadd@GCC_3.4\n\t"
-        ".symver .__gcc_qsub,._xlqsub@GCC_3.4\n\t"
-        ".symver .__gcc_qmul,._xlqmul@GCC_3.4\n\t"
-        ".symver .__gcc_qdiv,._xlqdiv@GCC_3.4");
-#endif
-
-typedef union
-{
-  long double ldval;
-  double dval[2];
-} longDblUnion;
-
-/* Add two 'long double' values and return the result. */
-long double
-__gcc_qadd (double a, double aa, double c, double cc)
-{
-  longDblUnion x;
-  double z, q, zz, xh;
-
-  z = a + c;
-
-  if (nonfinite (z))
-    {
-      z = cc + aa + c + a;
-      if (nonfinite (z))
-       return z;
-      x.dval[0] = z;  /* Will always be DBL_MAX.  */
-      zz = aa + cc;
-      if (fabs(a) > fabs(c))
-       x.dval[1] = a - z + c + zz;
-      else
-       x.dval[1] = c - z + a + zz;
-    }
-  else
-    {
-      q = a - z;
-      zz = q + c + (a - (q + z)) + aa + cc;
-
-      /* Keep -0 result.  */
-      if (zz == 0.0)
-       return z;
-
-      xh = z + zz;
-      if (nonfinite (xh))
-       return xh;
-
-      x.dval[0] = xh;
-      x.dval[1] = z - xh + zz;
-    }
-  return x.ldval;
-}
-
-long double
-__gcc_qsub (double a, double b, double c, double d)
-{
-  return __gcc_qadd (a, b, -c, -d);
-}
-
-#ifdef __NO_FPRS__
-static double fmsub (double, double, double);
-#endif
-
-long double
-__gcc_qmul (double a, double b, double c, double d)
-{
-  longDblUnion z;
-  double t, tau, u, v, w;
-  
-  t = a * c;                   /* Highest order double term.  */
-
-  if (unlikely (t == 0)                /* Preserve -0.  */
-      || nonfinite (t))
-    return t;
-
-  /* Sum terms of two highest orders. */
-  
-  /* Use fused multiply-add to get low part of a * c.  */
-#ifndef __NO_FPRS__
-  asm ("fmsub %0,%1,%2,%3" : "=f"(tau) : "f"(a), "f"(c), "f"(t));
-#else
-  tau = fmsub (a, c, t);
-#endif
-  v = a*d;
-  w = b*c;
-  tau += v + w;            /* Add in other second-order terms.  */
-  u = t + tau;
-
-  /* Construct long double result.  */
-  if (nonfinite (u))
-    return u;
-  z.dval[0] = u;
-  z.dval[1] = (t - u) + tau;
-  return z.ldval;
-}
-
-long double
-__gcc_qdiv (double a, double b, double c, double d)
-{
-  longDblUnion z;
-  double s, sigma, t, tau, u, v, w;
-  
-  t = a / c;                    /* highest order double term */
-  
-  if (unlikely (t == 0)                /* Preserve -0.  */
-      || nonfinite (t))
-    return t;
-
-  /* Finite nonzero result requires corrections to the highest order term.  */
-
-  s = c * t;                    /* (s,sigma) = c*t exactly.  */
-  w = -(-b + d * t);   /* Written to get fnmsub for speed, but not
-                          numerically necessary.  */
-  
-  /* Use fused multiply-add to get low part of c * t.   */
-#ifndef __NO_FPRS__
-  asm ("fmsub %0,%1,%2,%3" : "=f"(sigma) : "f"(c), "f"(t), "f"(s));
-#else
-  sigma = fmsub (c, t, s);
-#endif
-  v = a - s;
-  
-  tau = ((v-sigma)+w)/c;   /* Correction to t.  */
-  u = t + tau;
-
-  /* Construct long double result.  */
-  if (nonfinite (u))
-    return u;
-  z.dval[0] = u;
-  z.dval[1] = (t - u) + tau;
-  return z.ldval;
-}
-
-#if defined (_SOFT_DOUBLE) && defined (__LONG_DOUBLE_128__)
-
-long double __gcc_qneg (double, double);
-int __gcc_qeq (double, double, double, double);
-int __gcc_qne (double, double, double, double);
-int __gcc_qge (double, double, double, double);
-int __gcc_qle (double, double, double, double);
-long double __gcc_stoq (float);
-long double __gcc_dtoq (double);
-float __gcc_qtos (double, double);
-double __gcc_qtod (double, double);
-int __gcc_qtoi (double, double);
-unsigned int __gcc_qtou (double, double);
-long double __gcc_itoq (int);
-long double __gcc_utoq (unsigned int);
-
-extern int __eqdf2 (double, double);
-extern int __ledf2 (double, double);
-extern int __gedf2 (double, double);
-
-/* Negate 'long double' value and return the result.   */
-long double
-__gcc_qneg (double a, double aa)
-{
-  longDblUnion x;
-
-  x.dval[0] = -a;
-  x.dval[1] = -aa;
-  return x.ldval;
-}
-
-/* Compare two 'long double' values for equality.  */
-int
-__gcc_qeq (double a, double aa, double c, double cc)
-{
-  if (__eqdf2 (a, c) == 0)
-    return __eqdf2 (aa, cc);
-  return 1;
-}
-
-strong_alias (__gcc_qeq, __gcc_qne);
-
-/* Compare two 'long double' values for less than or equal.  */
-int
-__gcc_qle (double a, double aa, double c, double cc)
-{
-  if (__eqdf2 (a, c) == 0)
-    return __ledf2 (aa, cc);
-  return __ledf2 (a, c);
-}
-
-strong_alias (__gcc_qle, __gcc_qlt);
-
-/* Compare two 'long double' values for greater than or equal.  */
-int
-__gcc_qge (double a, double aa, double c, double cc)
-{
-  if (__eqdf2 (a, c) == 0)
-    return __gedf2 (aa, cc);
-  return __gedf2 (a, c);
-}
-
-strong_alias (__gcc_qge, __gcc_qgt);
-
-/* Convert single to long double.  */
-long double
-__gcc_stoq (float a)
-{
-  longDblUnion x;
-
-  x.dval[0] = (double) a;
-  x.dval[1] = 0.0;
-
-  return x.ldval;
-}
-
-/* Convert double to long double.  */
-long double
-__gcc_dtoq (double a)
-{
-  longDblUnion x;
-
-  x.dval[0] = a;
-  x.dval[1] = 0.0;
-
-  return x.ldval;
-}
-
-/* Convert long double to single.  */
-float
-__gcc_qtos (double a, double aa __attribute__ ((__unused__)))
-{
-  return (float) a;
-}
-
-/* Convert long double to double.  */
-double
-__gcc_qtod (double a, double aa __attribute__ ((__unused__)))
-{
-  return a;
-}
-
-/* Convert long double to int.  */
-int
-__gcc_qtoi (double a, double aa)
-{
-  double z = a + aa;
-  return (int) z;
-}
-
-/* Convert long double to unsigned int.  */
-unsigned int
-__gcc_qtou (double a, double aa)
-{
-  double z = a + aa;
-  return (unsigned int) z;
-}
-
-/* Convert int to long double.  */
-long double
-__gcc_itoq (int a)
-{
-  return __gcc_dtoq ((double) a);
-}
-
-/* Convert unsigned int to long double.  */
-long double
-__gcc_utoq (unsigned int a)
-{
-  return __gcc_dtoq ((double) a);
-}
-
-#endif
-
-#ifdef __NO_FPRS__
-
-int __gcc_qunord (double, double, double, double);
-
-extern int __eqdf2 (double, double);
-extern int __unorddf2 (double, double);
-
-/* Compare two 'long double' values for unordered.  */
-int
-__gcc_qunord (double a, double aa, double c, double cc)
-{
-  if (__eqdf2 (a, c) == 0)
-    return __unorddf2 (aa, cc);
-  return __unorddf2 (a, c);
-}
-
-#include "config/soft-fp/soft-fp.h"
-#include "config/soft-fp/double.h"
-#include "config/soft-fp/quad.h"
-
-/* Compute floating point multiply-subtract with higher (quad) precision.  */
-static double
-fmsub (double a, double b, double c)
-{
-    FP_DECL_EX;
-    FP_DECL_D(A);
-    FP_DECL_D(B);
-    FP_DECL_D(C);
-    FP_DECL_Q(X);
-    FP_DECL_Q(Y);
-    FP_DECL_Q(Z);
-    FP_DECL_Q(U);
-    FP_DECL_Q(V);
-    FP_DECL_D(R);
-    double r;
-    long double u, x, y, z;
-
-    FP_INIT_ROUNDMODE;
-    FP_UNPACK_RAW_D (A, a);
-    FP_UNPACK_RAW_D (B, b);
-    FP_UNPACK_RAW_D (C, c);
-
-    /* Extend double to quad.  */
-#if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
-    FP_EXTEND(Q,D,4,2,X,A);
-    FP_EXTEND(Q,D,4,2,Y,B);
-    FP_EXTEND(Q,D,4,2,Z,C);
-#else
-    FP_EXTEND(Q,D,2,1,X,A);
-    FP_EXTEND(Q,D,2,1,Y,B);
-    FP_EXTEND(Q,D,2,1,Z,C);
-#endif
-    FP_PACK_RAW_Q(x,X);
-    FP_PACK_RAW_Q(y,Y);
-    FP_PACK_RAW_Q(z,Z);
-    FP_HANDLE_EXCEPTIONS;
-
-    /* Multiply.  */
-    FP_INIT_ROUNDMODE;
-    FP_UNPACK_Q(X,x);
-    FP_UNPACK_Q(Y,y);
-    FP_MUL_Q(U,X,Y);
-    FP_PACK_Q(u,U);
-    FP_HANDLE_EXCEPTIONS;
-
-    /* Subtract.  */
-    FP_INIT_ROUNDMODE;
-    FP_UNPACK_SEMIRAW_Q(U,u);
-    FP_UNPACK_SEMIRAW_Q(Z,z);
-    FP_SUB_Q(V,U,Z);
-
-    /* Truncate quad to double.  */
-#if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
-    V_f[3] &= 0x0007ffff;
-    FP_TRUNC(D,Q,2,4,R,V);
-#else
-    V_f1 &= 0x0007ffffffffffffL;
-    FP_TRUNC(D,Q,1,2,R,V);
-#endif
-    FP_PACK_SEMIRAW_D(r,R);
-    FP_HANDLE_EXCEPTIONS;
-
-    return r;
-}
-
-#endif
-
-#endif
diff --git a/gcc/config/rs6000/libgcc-ppc-glibc.ver b/gcc/config/rs6000/libgcc-ppc-glibc.ver
deleted file mode 100644 (file)
index 8862c14..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-# Copyright (C) 2006, 2007 Free Software Foundation, Inc.
-#
-# This file is part of GCC.
-#
-# GCC is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-#
-# GCC is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GCC; see the file COPYING3.  If not see
-# <http://www.gnu.org/licenses/>.
-
-%ifndef _SOFT_FLOAT
-%ifndef __powerpc64__
-%exclude {
-  __multc3
-  __divtc3
-  __powitf2
-  __fixtfdi
-  __fixunstfdi
-  __floatditf
-}
-
-GCC_4.1.0 {
-  # long double support
-  __multc3
-  __divtc3
-  __powitf2
-  __fixtfdi
-  __fixunstfdi
-  __floatditf
-
-%else
-GCC_3.4.4 {
-%endif
-%else
-GCC_4.2.0 {
-%endif
-
-  # long double support
-  __gcc_qadd
-  __gcc_qsub
-  __gcc_qmul
-  __gcc_qdiv
-
-%ifdef _SOFT_DOUBLE
-  __gcc_qneg
-  __gcc_qeq
-  __gcc_qne
-  __gcc_qgt
-  __gcc_qge
-  __gcc_qlt
-  __gcc_qle
-  __gcc_stoq
-  __gcc_dtoq
-  __gcc_qtos
-  __gcc_qtod
-  __gcc_qtoi
-  __gcc_qtou
-  __gcc_itoq
-  __gcc_utoq
-%endif
-
-%ifdef __NO_FPRS__
-  __gcc_qunord
-%endif
-}
diff --git a/gcc/config/rs6000/libgcc-ppc64.ver b/gcc/config/rs6000/libgcc-ppc64.ver
deleted file mode 100644 (file)
index b27b4b4..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-GCC_3.4.4 {
-  # long double support
-  __gcc_qadd
-  __gcc_qsub
-  __gcc_qmul
-  __gcc_qdiv
-}
diff --git a/gcc/config/rs6000/sfp-machine.h b/gcc/config/rs6000/sfp-machine.h
deleted file mode 100644 (file)
index a0d1631..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-#define _FP_W_TYPE_SIZE                32
-#define _FP_W_TYPE             unsigned long
-#define _FP_WS_TYPE            signed long
-#define _FP_I_TYPE             long
-
-/* 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_S(R,X,Y)                          \
-  _FP_MUL_MEAT_1_wide(_FP_WFRACBITS_S,R,X,Y,umul_ppmm)
-#define _FP_MUL_MEAT_D(R,X,Y)                          \
-  _FP_MUL_MEAT_2_wide(_FP_WFRACBITS_D,R,X,Y,umul_ppmm)
-#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_loop(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 << 1) - 1)
-#define _FP_NANFRAC_D          ((_FP_QNANBIT_D << 1) - 1), -1
-#define _FP_NANFRAC_Q          ((_FP_QNANBIT_Q << 1) - 1), -1, -1, -1
-#define _FP_NANSIGN_S          0
-#define _FP_NANSIGN_D          0
-#define _FP_NANSIGN_Q          0
-
-#define _FP_KEEPNANFRACP 1
-
-/* Someone please check this.  */
-#define _FP_CHOOSENAN(fs, wc, R, X, Y, OP)                     \
-  do {                                                         \
-    if ((_FP_FRAC_HIGH_RAW_##fs(X) & _FP_QNANBIT_##fs)         \
-       && !(_FP_FRAC_HIGH_RAW_##fs(Y) & _FP_QNANBIT_##fs))     \
-      {                                                                \
-       R##_s = Y##_s;                                          \
-       _FP_FRAC_COPY_##wc(R,Y);                                \
-      }                                                                \
-    else                                                       \
-      {                                                                \
-       R##_s = X##_s;                                          \
-       _FP_FRAC_COPY_##wc(R,X);                                \
-      }                                                                \
-    R##_c = FP_CLS_NAN;                                                \
-  } while (0)
-
-#define        __LITTLE_ENDIAN 1234
-#define        __BIG_ENDIAN    4321
-
-#if defined __BIG_ENDIAN__ || defined _BIG_ENDIAN
-# if defined __LITTLE_ENDIAN__ || defined _LITTLE_ENDIAN
-#  error "Both BIG_ENDIAN and LITTLE_ENDIAN defined!"
-# endif
-# define __BYTE_ORDER __BIG_ENDIAN
-#else
-# if defined __LITTLE_ENDIAN__ || defined _LITTLE_ENDIAN
-#  define __BYTE_ORDER __LITTLE_ENDIAN
-# else
-#  error "Cannot determine current byte order"
-# endif
-#endif
-
-
-/* Define ALIASNAME as a strong alias for NAME.  */
-# define strong_alias(name, aliasname) _strong_alias(name, aliasname)
-# define _strong_alias(name, aliasname) \
-  extern __typeof (name) aliasname __attribute__ ((alias (#name)));
index 4e38ece4678b020d97e8e5e23d4d40292b2242fd..374b98dfa93e3e2197f6f8e2d8db7def39b6552b 100644 (file)
@@ -70,13 +70,9 @@ SHLIB_INSTALL = \
                $$(DESTDIR)$$(slibdir)@shlib_slibdir_qual@/
 SHLIB_LIBS = -lc `case @multilib_dir@ in *pthread*) echo -lpthread ;; esac`
 SHLIB_MKMAP = $(srcdir)/mkmap-flat.awk
-SHLIB_MAPFILES = $$(libgcc_objdir)/libgcc-std.ver $(srcdir)/config/rs6000/libgcc-ppc64.ver
+SHLIB_MAPFILES = $$(libgcc_objdir)/libgcc-std.ver
 SHLIB_NM_FLAGS = -Bpg -X32_64
 
-# GCC 128-bit long double support routines.
-LIB2FUNCS_EXTRA = $(srcdir)/config/rs6000/darwin-ldouble.c
-TARGET_LIBGCC2_CFLAGS = -mlong-double-128
-
 # Either 32-bit and 64-bit objects in archives.
 AR_FLAGS_FOR_TARGET = -X32_64
 
index 3ef61e9cf0f6ba94fa1da9d15390b252b11588d4..79ef16fd84e4b18ec353558f75a8f07784fbebdd 100644 (file)
@@ -51,12 +51,8 @@ SHLIB_INSTALL = \
                $$(DESTDIR)$$(slibdir)@shlib_slibdir_qual@/
 SHLIB_LIBS = -lc `case @multilib_dir@ in *pthread*) echo -lpthread ;; esac`
 SHLIB_MKMAP = $(srcdir)/mkmap-flat.awk
-SHLIB_MAPFILES = $$(libgcc_objdir)/libgcc-std.ver $(srcdir)/config/rs6000/libgcc-ppc64.ver
+SHLIB_MAPFILES = $$(libgcc_objdir)/libgcc-std.ver
 SHLIB_NM_FLAGS = -Bpg -X32_64
 
-# GCC 128-bit long double support routines.
-LIB2FUNCS_EXTRA = $(srcdir)/config/rs6000/darwin-ldouble.c
-TARGET_LIBGCC2_CFLAGS = -mlong-double-128
-
 # Either 32-bit and 64-bit objects in archives.
 AR_FLAGS_FOR_TARGET = -X32_64
index 4ba07a148672add5832e7ea12dbc1ffad77bc021..93d6f884999304d116a9d84d1271bc6dac21032f 100644 (file)
@@ -19,7 +19,6 @@
 
 LIB2FUNCS_EXTRA = $(srcdir)/config/rs6000/darwin-tramp.asm \
        $(srcdir)/config/darwin-64.c \
-       $(srcdir)/config/rs6000/darwin-ldouble.c \
        $(srcdir)/config/rs6000/darwin-world.asm
 
 LIB2FUNCS_STATIC_EXTRA = \
@@ -36,8 +35,5 @@ LIB2FUNCS_STATIC_EXTRA = \
 # works around this by not having any temporary file names.
 TARGET_LIBGCC2_CFLAGS = -Wa,-force_cpusubtype_ALL -pipe -mmacosx-version-min=10.4
 
-# Export the _xlq* symbols from darwin-ldouble.c.
-SHLIB_MAPFILES += $(srcdir)/config/rs6000/libgcc-ppc64.ver
-
 darwin-fpsave.o:       $(srcdir)/config/rs6000/darwin-asm.h
 darwin-tramp.o:                $(srcdir)/config/rs6000/darwin-asm.h
index 2a24d7f2855078eac514b90e50a7d920905da6dc..4c50b243873757cd9a45bc881c8bdf2698bf8bac 100644 (file)
@@ -2,7 +2,6 @@ LIB2_SIDITI_CONV_FUNCS=yes
 
 LIB2FUNCS_EXTRA = $(srcdir)/config/rs6000/darwin-tramp.asm \
        $(srcdir)/config/darwin-64.c \
-       $(srcdir)/config/rs6000/darwin-ldouble.c \
        $(srcdir)/config/rs6000/darwin-world.asm
 
 MULTILIB_OPTIONS = m32
diff --git a/gcc/config/rs6000/t-fprules-softfp b/gcc/config/rs6000/t-fprules-softfp
deleted file mode 100644 (file)
index 10b271f..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-softfp_float_modes := sf df
-softfp_int_modes := si di
-softfp_extensions := sfdf
-softfp_truncations := dfsf
-softfp_machine_header := rs6000/sfp-machine.h
-softfp_exclude_libgcc2 := y
diff --git a/gcc/config/rs6000/t-freebsd b/gcc/config/rs6000/t-freebsd
deleted file mode 100644 (file)
index 60ca86f..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-# Overrides for FreeBSD PowerPC 
-#
-# Copyright (C) 2011 Free Software Foundation, Inc.
-#
-# This file is part of GCC.
-#
-# GCC is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-#
-# GCC is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GCC; see the file COPYING3.  If not see
-# <http://www.gnu.org/licenses/>.
-
-# We do not want to build darwin-ldouble.c, so set the LIB2FUNCS_EXTRA again. 
-# Invoke this file after rs6000/t-ppccomm.
-
-LIB2FUNCS_EXTRA = tramp.S
-
index 3ae05fdad7bc8d930dffa47f9c242aa6c59f8ed5..bd01d319212071b5b95dbc81b0f38054ac6e1110 100644 (file)
@@ -35,6 +35,3 @@ MULTILIB_EXCEPTIONS     = m64/msoft-float
 MULTILIB_EXCLUSIONS     = m64/!m32/msoft-float
 MULTILIB_OSDIRNAMES    = ../lib64 $(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib32),../lib32,../lib) nof
 MULTILIB_MATCHES        = $(MULTILIB_MATCHES_FLOAT)
-
-softfp_wrap_start := '\#ifndef __powerpc64__'
-softfp_wrap_end := '\#endif'
index d91801eaa12d0b41b2b8165a13d99fbdbe0f11eb..b7e07a9b4c90926397ebb1b2c90b82322626e663 100644 (file)
@@ -1,7 +1,7 @@
 # Common support for PowerPC ELF targets (both EABI and SVR4).
 #
 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2006, 2007,
-# 2008 Free Software Foundation, Inc.
+# 2008, 2011 Free Software Foundation, Inc.
 #
 # This file is part of GCC.
 #
@@ -19,7 +19,7 @@
 # along with GCC; see the file COPYING3.  If not see
 # <http://www.gnu.org/licenses/>.
 
-LIB2FUNCS_EXTRA += tramp.S $(srcdir)/config/rs6000/darwin-ldouble.c
+LIB2FUNCS_EXTRA += tramp.S
 
 # These can't end up in shared libgcc
 LIB2FUNCS_STATIC_EXTRA = eabi.S
diff --git a/gcc/config/score/sfp-machine.h b/gcc/config/score/sfp-machine.h
deleted file mode 100644 (file)
index 98f9f1b..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-#define _FP_W_TYPE_SIZE                32
-#define _FP_W_TYPE             unsigned long
-#define _FP_WS_TYPE            signed long
-#define _FP_I_TYPE             long
-
-/* 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_S(R,X,Y)                          \
-  _FP_MUL_MEAT_1_wide(_FP_WFRACBITS_S,R,X,Y,umul_ppmm)
-#define _FP_MUL_MEAT_D(R,X,Y)                          \
-  _FP_MUL_MEAT_2_wide(_FP_WFRACBITS_D,R,X,Y,umul_ppmm)
-#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_loop(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 << 1) - 1)
-#define _FP_NANFRAC_D          ((_FP_QNANBIT_D << 1) - 1), -1
-#define _FP_NANFRAC_Q          ((_FP_QNANBIT_Q << 1) - 1), -1, -1, -1
-#define _FP_NANSIGN_S          0
-#define _FP_NANSIGN_D          0
-#define _FP_NANSIGN_Q          0
-
-#define _FP_KEEPNANFRACP 1
-
-/* Someone please check this.  */
-#define _FP_CHOOSENAN(fs, wc, R, X, Y, OP)                     \
-  do {                                                         \
-    if ((_FP_FRAC_HIGH_RAW_##fs(X) & _FP_QNANBIT_##fs)         \
-       && !(_FP_FRAC_HIGH_RAW_##fs(Y) & _FP_QNANBIT_##fs))     \
-      {                                                                \
-       R##_s = Y##_s;                                          \
-       _FP_FRAC_COPY_##wc(R,Y);                                \
-      }                                                                \
-    else                                                       \
-      {                                                                \
-       R##_s = X##_s;                                          \
-       _FP_FRAC_COPY_##wc(R,X);                                \
-      }                                                                \
-    R##_c = FP_CLS_NAN;                                                \
-  } while (0)
-
-#define        __LITTLE_ENDIAN 1234
-#define        __BIG_ENDIAN    4321
-
-# define __BYTE_ORDER __BIG_ENDIAN
-
-/* Define ALIASNAME as a strong alias for NAME.  */
-# define strong_alias(name, aliasname) _strong_alias(name, aliasname)
-# define _strong_alias(name, aliasname) \
-  extern __typeof (name) aliasname __attribute__ ((alias (#name)));
-
diff --git a/gcc/config/score/t-score-softfp b/gcc/config/score/t-score-softfp
deleted file mode 100644 (file)
index b658ef8..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-softfp_float_modes := sf df
-softfp_int_modes := si di
-softfp_extensions := sfdf
-softfp_truncations := dfsf
-softfp_machine_header := score/sfp-machine.h
-softfp_exclude_libgcc2 := y
-
-# softfp seems to be missing a whole bunch of prototypes.
-TARGET_LIBGCC2_CFLAGS += -Wno-missing-prototypes
diff --git a/gcc/config/soft-fp/README b/gcc/config/soft-fp/README
deleted file mode 100644 (file)
index ea58753..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-Except for t-softfp, conversions involving TImode and conversions involving
-XFmode, the files in this directory are part of the GNU C Library, not part
-of GCC.  As described at <http://gcc.gnu.org/codingconventions.html>, changes
-should be made to the GNU C Library and the changed files then imported
-into GCC.
diff --git a/gcc/config/soft-fp/adddf3.c b/gcc/config/soft-fp/adddf3.c
deleted file mode 100644 (file)
index 24c03db..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Software floating-point emulation.
-   Return a + b
-   Copyright (C) 1997,1999, 2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "double.h"
-
-DFtype __adddf3(DFtype a, DFtype b)
-{
-  FP_DECL_EX;
-  FP_DECL_D(A); FP_DECL_D(B); FP_DECL_D(R);
-  DFtype r;
-
-  FP_INIT_ROUNDMODE;
-  FP_UNPACK_SEMIRAW_D(A, a);
-  FP_UNPACK_SEMIRAW_D(B, b);
-  FP_ADD_D(R, A, B);
-  FP_PACK_SEMIRAW_D(r, R);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
diff --git a/gcc/config/soft-fp/addsf3.c b/gcc/config/soft-fp/addsf3.c
deleted file mode 100644 (file)
index b86991e..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-/* Software floating-point emulation.
-   Return a + b
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "single.h"
-
-SFtype __addsf3(SFtype a, SFtype b)
-{
-  FP_DECL_EX;
-  FP_DECL_S(A); FP_DECL_S(B); FP_DECL_S(R);
-  SFtype r;
-
-  FP_INIT_ROUNDMODE;
-  FP_UNPACK_SEMIRAW_S(A, a);
-  FP_UNPACK_SEMIRAW_S(B, b);
-  FP_ADD_S(R, A, B);
-  FP_PACK_SEMIRAW_S(r, R);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
-
diff --git a/gcc/config/soft-fp/addtf3.c b/gcc/config/soft-fp/addtf3.c
deleted file mode 100644 (file)
index 49b67f0..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Software floating-point emulation.
-   Return a + b
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "quad.h"
-
-TFtype __addtf3(TFtype a, TFtype b)
-{
-  FP_DECL_EX;
-  FP_DECL_Q(A); FP_DECL_Q(B); FP_DECL_Q(R);
-  TFtype r;
-
-  FP_INIT_ROUNDMODE;
-  FP_UNPACK_SEMIRAW_Q(A, a);
-  FP_UNPACK_SEMIRAW_Q(B, b);
-  FP_ADD_Q(R, A, B);
-  FP_PACK_SEMIRAW_Q(r, R);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
diff --git a/gcc/config/soft-fp/divdf3.c b/gcc/config/soft-fp/divdf3.c
deleted file mode 100644 (file)
index c3bb0d2..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Software floating-point emulation.
-   Return a / b
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "double.h"
-
-DFtype __divdf3(DFtype a, DFtype b)
-{
-  FP_DECL_EX;
-  FP_DECL_D(A); FP_DECL_D(B); FP_DECL_D(R);
-  DFtype r;
-
-  FP_INIT_ROUNDMODE;
-  FP_UNPACK_D(A, a);
-  FP_UNPACK_D(B, b);
-  FP_DIV_D(R, A, B);
-  FP_PACK_D(r, R);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
diff --git a/gcc/config/soft-fp/divsf3.c b/gcc/config/soft-fp/divsf3.c
deleted file mode 100644 (file)
index 176bb3c..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Software floating-point emulation.
-   Return a / b
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "single.h"
-
-SFtype __divsf3(SFtype a, SFtype b)
-{
-  FP_DECL_EX;
-  FP_DECL_S(A); FP_DECL_S(B); FP_DECL_S(R);
-  SFtype r;
-
-  FP_INIT_ROUNDMODE;
-  FP_UNPACK_S(A, a);
-  FP_UNPACK_S(B, b);
-  FP_DIV_S(R, A, B);
-  FP_PACK_S(r, R);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
diff --git a/gcc/config/soft-fp/divtf3.c b/gcc/config/soft-fp/divtf3.c
deleted file mode 100644 (file)
index 916fbfe..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Software floating-point emulation.
-   Return a / b
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "quad.h"
-
-TFtype __divtf3(TFtype a, TFtype b)
-{
-  FP_DECL_EX;
-  FP_DECL_Q(A); FP_DECL_Q(B); FP_DECL_Q(R);
-  TFtype r;
-
-  FP_INIT_ROUNDMODE;
-  FP_UNPACK_Q(A, a);
-  FP_UNPACK_Q(B, b);
-  FP_DIV_Q(R, A, B);
-  FP_PACK_Q(r, R);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
diff --git a/gcc/config/soft-fp/double.h b/gcc/config/soft-fp/double.h
deleted file mode 100644 (file)
index 1cde330..0000000
+++ /dev/null
@@ -1,265 +0,0 @@
-/* Software floating-point emulation.
-   Definitions for IEEE Double Precision
-   Copyright (C) 1997, 1998, 1999, 2006, 2007, 2008, 2009
-   Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com),
-                 Jakub Jelinek (jj@ultra.linux.cz),
-                 David S. Miller (davem@redhat.com) and
-                 Peter Maydell (pmaydell@chiark.greenend.org.uk).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#if _FP_W_TYPE_SIZE < 32
-#error "Here's a nickel kid.  Go buy yourself a real computer."
-#endif
-
-#if _FP_W_TYPE_SIZE < 64
-#define _FP_FRACTBITS_D                (2 * _FP_W_TYPE_SIZE)
-#else
-#define _FP_FRACTBITS_D                _FP_W_TYPE_SIZE
-#endif
-
-#define _FP_FRACBITS_D         53
-#define _FP_FRACXBITS_D                (_FP_FRACTBITS_D - _FP_FRACBITS_D)
-#define _FP_WFRACBITS_D                (_FP_WORKBITS + _FP_FRACBITS_D)
-#define _FP_WFRACXBITS_D       (_FP_FRACTBITS_D - _FP_WFRACBITS_D)
-#define _FP_EXPBITS_D          11
-#define _FP_EXPBIAS_D          1023
-#define _FP_EXPMAX_D           2047
-
-#define _FP_QNANBIT_D          \
-       ((_FP_W_TYPE)1 << (_FP_FRACBITS_D-2) % _FP_W_TYPE_SIZE)
-#define _FP_QNANBIT_SH_D               \
-       ((_FP_W_TYPE)1 << (_FP_FRACBITS_D-2+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
-#define _FP_IMPLBIT_D          \
-       ((_FP_W_TYPE)1 << (_FP_FRACBITS_D-1) % _FP_W_TYPE_SIZE)
-#define _FP_IMPLBIT_SH_D               \
-       ((_FP_W_TYPE)1 << (_FP_FRACBITS_D-1+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
-#define _FP_OVERFLOW_D         \
-       ((_FP_W_TYPE)1 << _FP_WFRACBITS_D % _FP_W_TYPE_SIZE)
-
-typedef float DFtype __attribute__((mode(DF)));
-
-#if _FP_W_TYPE_SIZE < 64
-
-union _FP_UNION_D
-{
-  DFtype flt;
-  struct {
-#if __BYTE_ORDER == __BIG_ENDIAN
-    unsigned sign  : 1;
-    unsigned exp   : _FP_EXPBITS_D;
-    unsigned frac1 : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0) - _FP_W_TYPE_SIZE;
-    unsigned frac0 : _FP_W_TYPE_SIZE;
-#else
-    unsigned frac0 : _FP_W_TYPE_SIZE;
-    unsigned frac1 : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0) - _FP_W_TYPE_SIZE;
-    unsigned exp   : _FP_EXPBITS_D;
-    unsigned sign  : 1;
-#endif
-  } bits __attribute__((packed));
-};
-
-#define FP_DECL_D(X)           _FP_DECL(2,X)
-#define FP_UNPACK_RAW_D(X,val) _FP_UNPACK_RAW_2(D,X,val)
-#define FP_UNPACK_RAW_DP(X,val)        _FP_UNPACK_RAW_2_P(D,X,val)
-#define FP_PACK_RAW_D(val,X)   _FP_PACK_RAW_2(D,val,X)
-#define FP_PACK_RAW_DP(val,X)          \
-  do {                                 \
-    if (!FP_INHIBIT_RESULTS)           \
-      _FP_PACK_RAW_2_P(D,val,X);       \
-  } while (0)
-
-#define FP_UNPACK_D(X,val)             \
-  do {                                 \
-    _FP_UNPACK_RAW_2(D,X,val);         \
-    _FP_UNPACK_CANONICAL(D,2,X);       \
-  } while (0)
-
-#define FP_UNPACK_DP(X,val)            \
-  do {                                 \
-    _FP_UNPACK_RAW_2_P(D,X,val);       \
-    _FP_UNPACK_CANONICAL(D,2,X);       \
-  } while (0)
-
-#define FP_UNPACK_SEMIRAW_D(X,val)     \
-  do {                                 \
-    _FP_UNPACK_RAW_2(D,X,val);         \
-    _FP_UNPACK_SEMIRAW(D,2,X);         \
-  } while (0)
-
-#define FP_UNPACK_SEMIRAW_DP(X,val)    \
-  do {                                 \
-    _FP_UNPACK_RAW_2_P(D,X,val);       \
-    _FP_UNPACK_SEMIRAW(D,2,X);         \
-  } while (0)
-
-#define FP_PACK_D(val,X)               \
-  do {                                 \
-    _FP_PACK_CANONICAL(D,2,X);         \
-    _FP_PACK_RAW_2(D,val,X);           \
-  } while (0)
-
-#define FP_PACK_DP(val,X)              \
-  do {                                 \
-    _FP_PACK_CANONICAL(D,2,X);         \
-    if (!FP_INHIBIT_RESULTS)           \
-      _FP_PACK_RAW_2_P(D,val,X);       \
-  } while (0)
-
-#define FP_PACK_SEMIRAW_D(val,X)       \
-  do {                                 \
-    _FP_PACK_SEMIRAW(D,2,X);           \
-    _FP_PACK_RAW_2(D,val,X);           \
-  } while (0)
-
-#define FP_PACK_SEMIRAW_DP(val,X)      \
-  do {                                 \
-    _FP_PACK_SEMIRAW(D,2,X);           \
-    if (!FP_INHIBIT_RESULTS)           \
-      _FP_PACK_RAW_2_P(D,val,X);       \
-  } while (0)
-
-#define FP_ISSIGNAN_D(X)               _FP_ISSIGNAN(D,2,X)
-#define FP_NEG_D(R,X)                  _FP_NEG(D,2,R,X)
-#define FP_ADD_D(R,X,Y)                        _FP_ADD(D,2,R,X,Y)
-#define FP_SUB_D(R,X,Y)                        _FP_SUB(D,2,R,X,Y)
-#define FP_MUL_D(R,X,Y)                        _FP_MUL(D,2,R,X,Y)
-#define FP_DIV_D(R,X,Y)                        _FP_DIV(D,2,R,X,Y)
-#define FP_SQRT_D(R,X)                 _FP_SQRT(D,2,R,X)
-#define _FP_SQRT_MEAT_D(R,S,T,X,Q)     _FP_SQRT_MEAT_2(R,S,T,X,Q)
-
-#define FP_CMP_D(r,X,Y,un)     _FP_CMP(D,2,r,X,Y,un)
-#define FP_CMP_EQ_D(r,X,Y)     _FP_CMP_EQ(D,2,r,X,Y)
-#define FP_CMP_UNORD_D(r,X,Y)  _FP_CMP_UNORD(D,2,r,X,Y)
-
-#define FP_TO_INT_D(r,X,rsz,rsg)       _FP_TO_INT(D,2,r,X,rsz,rsg)
-#define FP_FROM_INT_D(X,r,rs,rt)       _FP_FROM_INT(D,2,X,r,rs,rt)
-
-#define _FP_FRAC_HIGH_D(X)     _FP_FRAC_HIGH_2(X)
-#define _FP_FRAC_HIGH_RAW_D(X) _FP_FRAC_HIGH_2(X)
-
-#else
-
-union _FP_UNION_D
-{
-  DFtype flt;
-  struct {
-#if __BYTE_ORDER == __BIG_ENDIAN
-    unsigned sign   : 1;
-    unsigned exp    : _FP_EXPBITS_D;
-    _FP_W_TYPE frac : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0);
-#else
-    _FP_W_TYPE frac : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0);
-    unsigned exp    : _FP_EXPBITS_D;
-    unsigned sign   : 1;
-#endif
-  } bits __attribute__((packed));
-};
-
-#define FP_DECL_D(X)           _FP_DECL(1,X)
-#define FP_UNPACK_RAW_D(X,val) _FP_UNPACK_RAW_1(D,X,val)
-#define FP_UNPACK_RAW_DP(X,val)        _FP_UNPACK_RAW_1_P(D,X,val)
-#define FP_PACK_RAW_D(val,X)   _FP_PACK_RAW_1(D,val,X)
-#define FP_PACK_RAW_DP(val,X)          \
-  do {                                 \
-    if (!FP_INHIBIT_RESULTS)           \
-      _FP_PACK_RAW_1_P(D,val,X);       \
-  } while (0)
-
-#define FP_UNPACK_D(X,val)             \
-  do {                                 \
-    _FP_UNPACK_RAW_1(D,X,val);         \
-    _FP_UNPACK_CANONICAL(D,1,X);       \
-  } while (0)
-
-#define FP_UNPACK_DP(X,val)            \
-  do {                                 \
-    _FP_UNPACK_RAW_1_P(D,X,val);       \
-    _FP_UNPACK_CANONICAL(D,1,X);       \
-  } while (0)
-
-#define FP_UNPACK_SEMIRAW_D(X,val)     \
-  do {                                 \
-    _FP_UNPACK_RAW_1(D,X,val);         \
-    _FP_UNPACK_SEMIRAW(D,1,X);         \
-  } while (0)
-
-#define FP_UNPACK_SEMIRAW_DP(X,val)    \
-  do {                                 \
-    _FP_UNPACK_RAW_1_P(D,X,val);       \
-    _FP_UNPACK_SEMIRAW(D,1,X);         \
-  } while (0)
-
-#define FP_PACK_D(val,X)               \
-  do {                                 \
-    _FP_PACK_CANONICAL(D,1,X);         \
-    _FP_PACK_RAW_1(D,val,X);           \
-  } while (0)
-
-#define FP_PACK_DP(val,X)              \
-  do {                                 \
-    _FP_PACK_CANONICAL(D,1,X);         \
-    if (!FP_INHIBIT_RESULTS)           \
-      _FP_PACK_RAW_1_P(D,val,X);       \
-  } while (0)
-
-#define FP_PACK_SEMIRAW_D(val,X)       \
-  do {                                 \
-    _FP_PACK_SEMIRAW(D,1,X);           \
-    _FP_PACK_RAW_1(D,val,X);           \
-  } while (0)
-
-#define FP_PACK_SEMIRAW_DP(val,X)      \
-  do {                                 \
-    _FP_PACK_SEMIRAW(D,1,X);           \
-    if (!FP_INHIBIT_RESULTS)           \
-      _FP_PACK_RAW_1_P(D,val,X);       \
-  } while (0)
-
-#define FP_ISSIGNAN_D(X)               _FP_ISSIGNAN(D,1,X)
-#define FP_NEG_D(R,X)                  _FP_NEG(D,1,R,X)
-#define FP_ADD_D(R,X,Y)                        _FP_ADD(D,1,R,X,Y)
-#define FP_SUB_D(R,X,Y)                        _FP_SUB(D,1,R,X,Y)
-#define FP_MUL_D(R,X,Y)                        _FP_MUL(D,1,R,X,Y)
-#define FP_DIV_D(R,X,Y)                        _FP_DIV(D,1,R,X,Y)
-#define FP_SQRT_D(R,X)                 _FP_SQRT(D,1,R,X)
-#define _FP_SQRT_MEAT_D(R,S,T,X,Q)     _FP_SQRT_MEAT_1(R,S,T,X,Q)
-
-/* The implementation of _FP_MUL_D and _FP_DIV_D should be chosen by
-   the target machine.  */
-
-#define FP_CMP_D(r,X,Y,un)     _FP_CMP(D,1,r,X,Y,un)
-#define FP_CMP_EQ_D(r,X,Y)     _FP_CMP_EQ(D,1,r,X,Y)
-#define FP_CMP_UNORD_D(r,X,Y)  _FP_CMP_UNORD(D,1,r,X,Y)
-
-#define FP_TO_INT_D(r,X,rsz,rsg)       _FP_TO_INT(D,1,r,X,rsz,rsg)
-#define FP_FROM_INT_D(X,r,rs,rt)       _FP_FROM_INT(D,1,X,r,rs,rt)
-
-#define _FP_FRAC_HIGH_D(X)     _FP_FRAC_HIGH_1(X)
-#define _FP_FRAC_HIGH_RAW_D(X) _FP_FRAC_HIGH_1(X)
-
-#endif /* W_TYPE_SIZE < 64 */
diff --git a/gcc/config/soft-fp/eqdf2.c b/gcc/config/soft-fp/eqdf2.c
deleted file mode 100644 (file)
index 82a8858..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-/* Software floating-point emulation.
-   Return 0 iff a == b, 1 otherwise
-   Copyright (C) 1997,1999,2006,2007 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "double.h"
-
-CMPtype __eqdf2(DFtype a, DFtype b)
-{
-  FP_DECL_EX;
-  FP_DECL_D(A); FP_DECL_D(B);
-  CMPtype r;
-
-  FP_UNPACK_RAW_D(A, a);
-  FP_UNPACK_RAW_D(B, b);
-  FP_CMP_EQ_D(r, A, B);
-  if (r && (FP_ISSIGNAN_D(A) || FP_ISSIGNAN_D(B)))
-    FP_SET_EXCEPTION(FP_EX_INVALID);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
-
-strong_alias(__eqdf2, __nedf2);
diff --git a/gcc/config/soft-fp/eqsf2.c b/gcc/config/soft-fp/eqsf2.c
deleted file mode 100644 (file)
index 0a1180f..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-/* Software floating-point emulation.
-   Return 0 iff a == b, 1 otherwise
-   Copyright (C) 1997,1999,2006,2007 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "single.h"
-
-CMPtype __eqsf2(SFtype a, SFtype b)
-{
-  FP_DECL_EX;
-  FP_DECL_S(A); FP_DECL_S(B);
-  CMPtype r;
-
-  FP_UNPACK_RAW_S(A, a);
-  FP_UNPACK_RAW_S(B, b);
-  FP_CMP_EQ_S(r, A, B);
-  if (r && (FP_ISSIGNAN_S(A) || FP_ISSIGNAN_S(B)))
-    FP_SET_EXCEPTION(FP_EX_INVALID);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
-
-strong_alias(__eqsf2, __nesf2);
diff --git a/gcc/config/soft-fp/eqtf2.c b/gcc/config/soft-fp/eqtf2.c
deleted file mode 100644 (file)
index 46240b7..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-/* Software floating-point emulation.
-   Return 0 iff a == b, 1 otherwise
-   Copyright (C) 1997,1999,2006,2007 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "quad.h"
-
-CMPtype __eqtf2(TFtype a, TFtype b)
-{
-  FP_DECL_EX;
-  FP_DECL_Q(A); FP_DECL_Q(B);
-  CMPtype r;
-
-  FP_UNPACK_RAW_Q(A, a);
-  FP_UNPACK_RAW_Q(B, b);
-  FP_CMP_EQ_Q(r, A, B);
-  if (r && (FP_ISSIGNAN_Q(A) || FP_ISSIGNAN_Q(B)))
-    FP_SET_EXCEPTION(FP_EX_INVALID);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
-
-strong_alias(__eqtf2, __netf2);
diff --git a/gcc/config/soft-fp/extenddftf2.c b/gcc/config/soft-fp/extenddftf2.c
deleted file mode 100644 (file)
index 4101639..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/* Software floating-point emulation.
-   Return a converted to IEEE quad
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "double.h"
-#include "quad.h"
-
-TFtype __extenddftf2(DFtype a)
-{
-  FP_DECL_EX;
-  FP_DECL_D(A);
-  FP_DECL_Q(R);
-  TFtype r;
-
-  FP_INIT_ROUNDMODE;
-  FP_UNPACK_RAW_D(A, a);
-#if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
-  FP_EXTEND(Q,D,4,2,R,A);
-#else
-  FP_EXTEND(Q,D,2,1,R,A);
-#endif
-  FP_PACK_RAW_Q(r, R);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
diff --git a/gcc/config/soft-fp/extended.h b/gcc/config/soft-fp/extended.h
deleted file mode 100644 (file)
index e5f16de..0000000
+++ /dev/null
@@ -1,431 +0,0 @@
-/* Software floating-point emulation.
-   Definitions for IEEE Extended Precision.
-   Copyright (C) 1999,2006,2007 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#if _FP_W_TYPE_SIZE < 32
-#error "Here's a nickel, kid. Go buy yourself a real computer."
-#endif
-
-#if _FP_W_TYPE_SIZE < 64
-#define _FP_FRACTBITS_E         (4*_FP_W_TYPE_SIZE)
-#else
-#define _FP_FRACTBITS_E                (2*_FP_W_TYPE_SIZE)
-#endif
-
-#define _FP_FRACBITS_E         64
-#define _FP_FRACXBITS_E                (_FP_FRACTBITS_E - _FP_FRACBITS_E)
-#define _FP_WFRACBITS_E                (_FP_WORKBITS + _FP_FRACBITS_E)
-#define _FP_WFRACXBITS_E       (_FP_FRACTBITS_E - _FP_WFRACBITS_E)
-#define _FP_EXPBITS_E          15
-#define _FP_EXPBIAS_E          16383
-#define _FP_EXPMAX_E           32767
-
-#define _FP_QNANBIT_E          \
-       ((_FP_W_TYPE)1 << (_FP_FRACBITS_E-2) % _FP_W_TYPE_SIZE)
-#define _FP_QNANBIT_SH_E               \
-       ((_FP_W_TYPE)1 << (_FP_FRACBITS_E-2+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
-#define _FP_IMPLBIT_E          \
-       ((_FP_W_TYPE)1 << (_FP_FRACBITS_E-1) % _FP_W_TYPE_SIZE)
-#define _FP_IMPLBIT_SH_E               \
-       ((_FP_W_TYPE)1 << (_FP_FRACBITS_E-1+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
-#define _FP_OVERFLOW_E         \
-       ((_FP_W_TYPE)1 << (_FP_WFRACBITS_E % _FP_W_TYPE_SIZE))
-
-typedef float XFtype __attribute__((mode(XF)));
-
-#if _FP_W_TYPE_SIZE < 64
-
-union _FP_UNION_E
-{
-   XFtype flt;
-   struct 
-   {
-#if __BYTE_ORDER == __BIG_ENDIAN
-      unsigned long pad1 : _FP_W_TYPE_SIZE;
-      unsigned long pad2 : (_FP_W_TYPE_SIZE - 1 - _FP_EXPBITS_E);
-      unsigned long sign : 1;
-      unsigned long exp : _FP_EXPBITS_E;
-      unsigned long frac1 : _FP_W_TYPE_SIZE;
-      unsigned long frac0 : _FP_W_TYPE_SIZE;
-#else
-      unsigned long frac0 : _FP_W_TYPE_SIZE;
-      unsigned long frac1 : _FP_W_TYPE_SIZE;
-      unsigned exp : _FP_EXPBITS_E;
-      unsigned sign : 1;
-#endif /* not bigendian */
-   } bits __attribute__((packed));
-};
-
-
-#define FP_DECL_E(X)           _FP_DECL(4,X)
-
-#define FP_UNPACK_RAW_E(X, val)                                \
-  do {                                                 \
-    union _FP_UNION_E _flo; _flo.flt = (val);          \
-                                                       \
-    X##_f[2] = 0; X##_f[3] = 0;                                \
-    X##_f[0] = _flo.bits.frac0;                                \
-    X##_f[1] = _flo.bits.frac1;                                \
-    X##_e  = _flo.bits.exp;                            \
-    X##_s  = _flo.bits.sign;                           \
-  } while (0)
-
-#define FP_UNPACK_RAW_EP(X, val)                       \
-  do {                                                 \
-    union _FP_UNION_E *_flo =                          \
-    (union _FP_UNION_E *)(val);                                \
-                                                       \
-    X##_f[2] = 0; X##_f[3] = 0;                                \
-    X##_f[0] = _flo->bits.frac0;                       \
-    X##_f[1] = _flo->bits.frac1;                       \
-    X##_e  = _flo->bits.exp;                           \
-    X##_s  = _flo->bits.sign;                          \
-  } while (0)
-
-#define FP_PACK_RAW_E(val, X)                          \
-  do {                                                 \
-    union _FP_UNION_E _flo;                            \
-                                                       \
-    if (X##_e) X##_f[1] |= _FP_IMPLBIT_E;              \
-    else X##_f[1] &= ~(_FP_IMPLBIT_E);                 \
-    _flo.bits.frac0 = X##_f[0];                                \
-    _flo.bits.frac1 = X##_f[1];                                \
-    _flo.bits.exp   = X##_e;                           \
-    _flo.bits.sign  = X##_s;                           \
-                                                       \
-    (val) = _flo.flt;                                  \
-  } while (0)
-
-#define FP_PACK_RAW_EP(val, X)                         \
-  do {                                                 \
-    if (!FP_INHIBIT_RESULTS)                           \
-      {                                                        \
-       union _FP_UNION_E *_flo =                       \
-         (union _FP_UNION_E *)(val);                   \
-                                                       \
-       if (X##_e) X##_f[1] |= _FP_IMPLBIT_E;           \
-       else X##_f[1] &= ~(_FP_IMPLBIT_E);              \
-       _flo->bits.frac0 = X##_f[0];                    \
-       _flo->bits.frac1 = X##_f[1];                    \
-       _flo->bits.exp   = X##_e;                       \
-       _flo->bits.sign  = X##_s;                       \
-      }                                                        \
-  } while (0)
-
-#define FP_UNPACK_E(X,val)             \
-  do {                                 \
-    FP_UNPACK_RAW_E(X,val);            \
-    _FP_UNPACK_CANONICAL(E,4,X);       \
-  } while (0)
-
-#define FP_UNPACK_EP(X,val)            \
-  do {                                 \
-    FP_UNPACK_RAW_EP(X,val);           \
-    _FP_UNPACK_CANONICAL(E,4,X);       \
-  } while (0)
-
-#define FP_UNPACK_SEMIRAW_E(X,val)     \
-  do {                                 \
-    FP_UNPACK_RAW_E(X,val);            \
-    _FP_UNPACK_SEMIRAW(E,4,X);         \
-  } while (0)
-
-#define FP_UNPACK_SEMIRAW_EP(X,val)    \
-  do {                                 \
-    FP_UNPACK_RAW_EP(X,val);           \
-    _FP_UNPACK_SEMIRAW(E,4,X);         \
-  } while (0)
-
-#define FP_PACK_E(val,X)               \
-  do {                                 \
-    _FP_PACK_CANONICAL(E,4,X);         \
-    FP_PACK_RAW_E(val,X);              \
-  } while (0)
-
-#define FP_PACK_EP(val,X)              \
-  do {                                 \
-    _FP_PACK_CANONICAL(E,4,X);         \
-    FP_PACK_RAW_EP(val,X);             \
-  } while (0)
-
-#define FP_PACK_SEMIRAW_E(val,X)       \
-  do {                                 \
-    _FP_PACK_SEMIRAW(E,4,X);           \
-    FP_PACK_RAW_E(val,X);              \
-  } while (0)
-
-#define FP_PACK_SEMIRAW_EP(val,X)      \
-  do {                                 \
-    _FP_PACK_SEMIRAW(E,4,X);           \
-    FP_PACK_RAW_EP(val,X);             \
-  } while (0)
-
-#define FP_ISSIGNAN_E(X)       _FP_ISSIGNAN(E,4,X)
-#define FP_NEG_E(R,X)          _FP_NEG(E,4,R,X)
-#define FP_ADD_E(R,X,Y)                _FP_ADD(E,4,R,X,Y)
-#define FP_SUB_E(R,X,Y)                _FP_SUB(E,4,R,X,Y)
-#define FP_MUL_E(R,X,Y)                _FP_MUL(E,4,R,X,Y)
-#define FP_DIV_E(R,X,Y)                _FP_DIV(E,4,R,X,Y)
-#define FP_SQRT_E(R,X)         _FP_SQRT(E,4,R,X)
-
-/*
- * Square root algorithms:
- * We have just one right now, maybe Newton approximation
- * should be added for those machines where division is fast.
- * This has special _E version because standard _4 square
- * root would not work (it has to start normally with the
- * second word and not the first), but as we have to do it
- * anyway, we optimize it by doing most of the calculations
- * in two UWtype registers instead of four.
- */
-#define _FP_SQRT_MEAT_E(R, S, T, X, q)                 \
-  do {                                                 \
-    q = (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE - 1);                \
-    _FP_FRAC_SRL_4(X, (_FP_WORKBITS));                 \
-    while (q)                                          \
-      {                                                        \
-       T##_f[1] = S##_f[1] + q;                        \
-       if (T##_f[1] <= X##_f[1])                       \
-         {                                             \
-           S##_f[1] = T##_f[1] + q;                    \
-           X##_f[1] -= T##_f[1];                       \
-           R##_f[1] += q;                              \
-         }                                             \
-       _FP_FRAC_SLL_2(X, 1);                           \
-       q >>= 1;                                        \
-      }                                                        \
-    q = (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE - 1);                \
-    while (q)                                          \
-      {                                                        \
-       T##_f[0] = S##_f[0] + q;                        \
-       T##_f[1] = S##_f[1];                            \
-       if (T##_f[1] < X##_f[1] ||                      \
-           (T##_f[1] == X##_f[1] &&                    \
-            T##_f[0] <= X##_f[0]))                     \
-         {                                             \
-           S##_f[0] = T##_f[0] + q;                    \
-           S##_f[1] += (T##_f[0] > S##_f[0]);          \
-           _FP_FRAC_DEC_2(X, T);                       \
-           R##_f[0] += q;                              \
-         }                                             \
-       _FP_FRAC_SLL_2(X, 1);                           \
-       q >>= 1;                                        \
-      }                                                        \
-    _FP_FRAC_SLL_4(R, (_FP_WORKBITS));                 \
-    if (X##_f[0] | X##_f[1])                           \
-      {                                                        \
-       if (S##_f[1] < X##_f[1] ||                      \
-           (S##_f[1] == X##_f[1] &&                    \
-            S##_f[0] < X##_f[0]))                      \
-         R##_f[0] |= _FP_WORK_ROUND;                   \
-       R##_f[0] |= _FP_WORK_STICKY;                    \
-      }                                                        \
-  } while (0)
-
-#define FP_CMP_E(r,X,Y,un)     _FP_CMP(E,4,r,X,Y,un)
-#define FP_CMP_EQ_E(r,X,Y)     _FP_CMP_EQ(E,4,r,X,Y)
-#define FP_CMP_UNORD_E(r,X,Y)  _FP_CMP_UNORD(E,4,r,X,Y)
-
-#define FP_TO_INT_E(r,X,rsz,rsg)       _FP_TO_INT(E,4,r,X,rsz,rsg)
-#define FP_FROM_INT_E(X,r,rs,rt)       _FP_FROM_INT(E,4,X,r,rs,rt)
-
-#define _FP_FRAC_HIGH_E(X)     (X##_f[2])
-#define _FP_FRAC_HIGH_RAW_E(X) (X##_f[1])
-
-#else   /* not _FP_W_TYPE_SIZE < 64 */
-union _FP_UNION_E
-{
-  XFtype flt;
-  struct {
-#if __BYTE_ORDER == __BIG_ENDIAN
-    _FP_W_TYPE pad  : (_FP_W_TYPE_SIZE - 1 - _FP_EXPBITS_E);
-    unsigned sign   : 1;
-    unsigned exp    : _FP_EXPBITS_E;
-    _FP_W_TYPE frac : _FP_W_TYPE_SIZE;
-#else
-    _FP_W_TYPE frac : _FP_W_TYPE_SIZE;
-    unsigned exp    : _FP_EXPBITS_E;
-    unsigned sign   : 1;
-#endif
-  } bits;
-};
-
-#define FP_DECL_E(X)           _FP_DECL(2,X)
-
-#define FP_UNPACK_RAW_E(X, val)                                        \
-  do {                                                         \
-    union _FP_UNION_E _flo; _flo.flt = (val);                  \
-                                                               \
-    X##_f0 = _flo.bits.frac;                                   \
-    X##_f1 = 0;                                                        \
-    X##_e = _flo.bits.exp;                                     \
-    X##_s = _flo.bits.sign;                                    \
-  } while (0)
-
-#define FP_UNPACK_RAW_EP(X, val)                               \
-  do {                                                         \
-    union _FP_UNION_E *_flo =                                  \
-      (union _FP_UNION_E *)(val);                              \
-                                                               \
-    X##_f0 = _flo->bits.frac;                                  \
-    X##_f1 = 0;                                                        \
-    X##_e = _flo->bits.exp;                                    \
-    X##_s = _flo->bits.sign;                                   \
-  } while (0)
-
-#define FP_PACK_RAW_E(val, X)                                  \
-  do {                                                         \
-    union _FP_UNION_E _flo;                                    \
-                                                               \
-    if (X##_e) X##_f0 |= _FP_IMPLBIT_E;                                \
-    else X##_f0 &= ~(_FP_IMPLBIT_E);                           \
-    _flo.bits.frac = X##_f0;                                   \
-    _flo.bits.exp  = X##_e;                                    \
-    _flo.bits.sign = X##_s;                                    \
-                                                               \
-    (val) = _flo.flt;                                          \
-  } while (0)
-
-#define FP_PACK_RAW_EP(fs, val, X)                             \
-  do {                                                         \
-    if (!FP_INHIBIT_RESULTS)                                   \
-      {                                                                \
-       union _FP_UNION_E *_flo =                               \
-         (union _FP_UNION_E *)(val);                           \
-                                                               \
-       if (X##_e) X##_f0 |= _FP_IMPLBIT_E;                     \
-       else X##_f0 &= ~(_FP_IMPLBIT_E);                        \
-       _flo->bits.frac = X##_f0;                               \
-       _flo->bits.exp  = X##_e;                                \
-       _flo->bits.sign = X##_s;                                \
-      }                                                                \
-  } while (0)
-
-
-#define FP_UNPACK_E(X,val)             \
-  do {                                 \
-    FP_UNPACK_RAW_E(X,val);            \
-    _FP_UNPACK_CANONICAL(E,2,X);       \
-  } while (0)
-
-#define FP_UNPACK_EP(X,val)            \
-  do {                                 \
-    FP_UNPACK_RAW_EP(X,val);           \
-    _FP_UNPACK_CANONICAL(E,2,X);       \
-  } while (0)
-
-#define FP_UNPACK_SEMIRAW_E(X,val)     \
-  do {                                 \
-    FP_UNPACK_RAW_E(X,val);            \
-    _FP_UNPACK_SEMIRAW(E,2,X);         \
-  } while (0)
-
-#define FP_UNPACK_SEMIRAW_EP(X,val)    \
-  do {                                 \
-    FP_UNPACK_RAW_EP(X,val);           \
-    _FP_UNPACK_SEMIRAW(E,2,X);         \
-  } while (0)
-
-#define FP_PACK_E(val,X)               \
-  do {                                 \
-    _FP_PACK_CANONICAL(E,2,X);         \
-    FP_PACK_RAW_E(val,X);              \
-  } while (0)
-
-#define FP_PACK_EP(val,X)              \
-  do {                                 \
-    _FP_PACK_CANONICAL(E,2,X);         \
-    FP_PACK_RAW_EP(val,X);             \
-  } while (0)
-
-#define FP_PACK_SEMIRAW_E(val,X)       \
-  do {                                 \
-    _FP_PACK_SEMIRAW(E,2,X);           \
-    FP_PACK_RAW_E(val,X);              \
-  } while (0)
-
-#define FP_PACK_SEMIRAW_EP(val,X)      \
-  do {                                 \
-    _FP_PACK_SEMIRAW(E,2,X);           \
-    FP_PACK_RAW_EP(val,X);             \
-  } while (0)
-
-#define FP_ISSIGNAN_E(X)       _FP_ISSIGNAN(E,2,X)
-#define FP_NEG_E(R,X)          _FP_NEG(E,2,R,X)
-#define FP_ADD_E(R,X,Y)                _FP_ADD(E,2,R,X,Y)
-#define FP_SUB_E(R,X,Y)                _FP_SUB(E,2,R,X,Y)
-#define FP_MUL_E(R,X,Y)                _FP_MUL(E,2,R,X,Y)
-#define FP_DIV_E(R,X,Y)                _FP_DIV(E,2,R,X,Y)
-#define FP_SQRT_E(R,X)         _FP_SQRT(E,2,R,X)
-
-/*
- * Square root algorithms:
- * We have just one right now, maybe Newton approximation
- * should be added for those machines where division is fast.
- * We optimize it by doing most of the calculations
- * in one UWtype registers instead of two, although we don't
- * have to.
- */
-#define _FP_SQRT_MEAT_E(R, S, T, X, q)                 \
-  do {                                                 \
-    q = (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE - 1);                \
-    _FP_FRAC_SRL_2(X, (_FP_WORKBITS));                 \
-    while (q)                                          \
-      {                                                        \
-        T##_f0 = S##_f0 + q;                           \
-        if (T##_f0 <= X##_f0)                          \
-          {                                            \
-            S##_f0 = T##_f0 + q;                       \
-            X##_f0 -= T##_f0;                          \
-            R##_f0 += q;                               \
-          }                                            \
-        _FP_FRAC_SLL_1(X, 1);                          \
-        q >>= 1;                                       \
-      }                                                        \
-    _FP_FRAC_SLL_2(R, (_FP_WORKBITS));                 \
-    if (X##_f0)                                                \
-      {                                                        \
-       if (S##_f0 < X##_f0)                            \
-         R##_f0 |= _FP_WORK_ROUND;                     \
-       R##_f0 |= _FP_WORK_STICKY;                      \
-      }                                                        \
-  } while (0)
-#define FP_CMP_E(r,X,Y,un)     _FP_CMP(E,2,r,X,Y,un)
-#define FP_CMP_EQ_E(r,X,Y)     _FP_CMP_EQ(E,2,r,X,Y)
-#define FP_CMP_UNORD_E(r,X,Y)  _FP_CMP_UNORD(E,2,r,X,Y)
-
-#define FP_TO_INT_E(r,X,rsz,rsg)       _FP_TO_INT(E,2,r,X,rsz,rsg)
-#define FP_FROM_INT_E(X,r,rs,rt)       _FP_FROM_INT(E,2,X,r,rs,rt)
-
-#define _FP_FRAC_HIGH_E(X)     (X##_f1)
-#define _FP_FRAC_HIGH_RAW_E(X) (X##_f0)
-
-#endif /* not _FP_W_TYPE_SIZE < 64 */
diff --git a/gcc/config/soft-fp/extendsfdf2.c b/gcc/config/soft-fp/extendsfdf2.c
deleted file mode 100644 (file)
index fba22d5..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/* Software floating-point emulation.
-   Return a converted to IEEE double
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "single.h"
-#include "double.h"
-
-DFtype __extendsfdf2(SFtype a)
-{
-  FP_DECL_EX;
-  FP_DECL_S(A);
-  FP_DECL_D(R);
-  DFtype r;
-
-  FP_INIT_ROUNDMODE;
-  FP_UNPACK_RAW_S(A, a);
-#if _FP_W_TYPE_SIZE < _FP_FRACBITS_D
-  FP_EXTEND(D,S,2,1,R,A);
-#else
-  FP_EXTEND(D,S,1,1,R,A);
-#endif
-  FP_PACK_RAW_D(r, R);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
diff --git a/gcc/config/soft-fp/extendsftf2.c b/gcc/config/soft-fp/extendsftf2.c
deleted file mode 100644 (file)
index c43cf1e..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/* Software floating-point emulation.
-   Return a converted to IEEE quad
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "single.h"
-#include "quad.h"
-
-TFtype __extendsftf2(SFtype a)
-{
-  FP_DECL_EX;
-  FP_DECL_S(A);
-  FP_DECL_Q(R);
-  TFtype r;
-
-  FP_INIT_ROUNDMODE;
-  FP_UNPACK_RAW_S(A, a);
-#if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
-  FP_EXTEND(Q,S,4,1,R,A);
-#else
-  FP_EXTEND(Q,S,2,1,R,A);
-#endif
-  FP_PACK_RAW_Q(r, R);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
diff --git a/gcc/config/soft-fp/extendxftf2.c b/gcc/config/soft-fp/extendxftf2.c
deleted file mode 100644 (file)
index af29a2a..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/* Software floating-point emulation.
-   Return a converted to IEEE quad
-   Copyright (C) 2007 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Uros Bizjak (ubizjak@gmail.com).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "extended.h"
-#include "quad.h"
-
-TFtype __extendxftf2(XFtype a)
-{
-  FP_DECL_EX;
-  FP_DECL_E(A);
-  FP_DECL_Q(R);
-  TFtype r;
-
-  FP_INIT_ROUNDMODE;
-  FP_UNPACK_RAW_E(A, a);
-#if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
-  FP_EXTEND(Q,E,4,4,R,A);
-#else
-  FP_EXTEND(Q,E,2,2,R,A);
-#endif
-  FP_PACK_RAW_Q(r, R);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
diff --git a/gcc/config/soft-fp/fixdfdi.c b/gcc/config/soft-fp/fixdfdi.c
deleted file mode 100644 (file)
index fdfe35a..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Software floating-point emulation.
-   Convert a to 64bit signed integer
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "double.h"
-
-DItype __fixdfdi(DFtype a)
-{
-  FP_DECL_EX;
-  FP_DECL_D(A);
-  UDItype r;
-
-  FP_UNPACK_RAW_D(A, a);
-  FP_TO_INT_D(r, A, DI_BITS, 1);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
diff --git a/gcc/config/soft-fp/fixdfsi.c b/gcc/config/soft-fp/fixdfsi.c
deleted file mode 100644 (file)
index a05f3e3..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Software floating-point emulation.
-   Convert a to 32bit signed integer
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "double.h"
-
-SItype __fixdfsi(DFtype a)
-{
-  FP_DECL_EX;
-  FP_DECL_D(A);
-  USItype r;
-
-  FP_UNPACK_RAW_D(A, a);
-  FP_TO_INT_D(r, A, SI_BITS, 1);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
diff --git a/gcc/config/soft-fp/fixdfti.c b/gcc/config/soft-fp/fixdfti.c
deleted file mode 100644 (file)
index 4731657..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Software floating-point emulation.
-   Convert IEEE double to 128bit signed integer
-   Copyright (C) 2007, 2008 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Uros Bizjak (ubizjak@gmail.com).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "double.h"
-
-TItype __fixdfti(DFtype a)
-{
-  FP_DECL_EX;
-  FP_DECL_D(A);
-  UTItype r;
-
-  FP_UNPACK_RAW_D(A, a);
-  FP_TO_INT_D(r, A, TI_BITS, 1);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
diff --git a/gcc/config/soft-fp/fixsfdi.c b/gcc/config/soft-fp/fixsfdi.c
deleted file mode 100644 (file)
index 384d9bd..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Software floating-point emulation.
-   Convert a to 64bit signed integer
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "single.h"
-
-DItype __fixsfdi(SFtype a)
-{
-  FP_DECL_EX;
-  FP_DECL_S(A);
-  UDItype r;
-
-  FP_UNPACK_RAW_S(A, a);
-  FP_TO_INT_S(r, A, DI_BITS, 1);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
diff --git a/gcc/config/soft-fp/fixsfsi.c b/gcc/config/soft-fp/fixsfsi.c
deleted file mode 100644 (file)
index 1d40ed0..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Software floating-point emulation.
-   Convert a to 32bit signed integer
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "single.h"
-
-SItype __fixsfsi(SFtype a)
-{
-  FP_DECL_EX;
-  FP_DECL_S(A);
-  USItype r;
-
-  FP_UNPACK_RAW_S(A, a);
-  FP_TO_INT_S(r, A, SI_BITS, 1);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
diff --git a/gcc/config/soft-fp/fixsfti.c b/gcc/config/soft-fp/fixsfti.c
deleted file mode 100644 (file)
index 779628e..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Software floating-point emulation.
-   Convert IEEE single to 128bit signed integer
-   Copyright (C) 2007 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Uros Bizjak (ubizjak@gmail.com).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "single.h"
-
-TItype __fixsfti(SFtype a)
-{
-  FP_DECL_EX;
-  FP_DECL_S(A);
-  UTItype r;
-
-  FP_UNPACK_RAW_S(A, a);
-  FP_TO_INT_S(r, A, TI_BITS, 1);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
diff --git a/gcc/config/soft-fp/fixtfdi.c b/gcc/config/soft-fp/fixtfdi.c
deleted file mode 100644 (file)
index ea10ce2..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Software floating-point emulation.
-   Convert a to 64bit signed integer
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "quad.h"
-
-DItype __fixtfdi(TFtype a)
-{
-  FP_DECL_EX;
-  FP_DECL_Q(A);
-  UDItype r;
-
-  FP_UNPACK_RAW_Q(A, a);
-  FP_TO_INT_Q(r, A, DI_BITS, 1);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
diff --git a/gcc/config/soft-fp/fixtfsi.c b/gcc/config/soft-fp/fixtfsi.c
deleted file mode 100644 (file)
index eb71038..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Software floating-point emulation.
-   Convert a to 32bit signed integer
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "quad.h"
-
-SItype __fixtfsi(TFtype a)
-{
-  FP_DECL_EX;
-  FP_DECL_Q(A);
-  USItype r;
-
-  FP_UNPACK_RAW_Q(A, a);
-  FP_TO_INT_Q(r, A, SI_BITS, 1);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
diff --git a/gcc/config/soft-fp/fixtfti.c b/gcc/config/soft-fp/fixtfti.c
deleted file mode 100644 (file)
index 8311ea5..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Software floating-point emulation.
-   Convert IEEE quad to 128bit signed integer
-   Copyright (C) 2007 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Uros Bizjak (ubizjak@gmail.com).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "quad.h"
-
-TItype __fixtfti(TFtype a)
-{
-  FP_DECL_EX;
-  FP_DECL_Q(A);
-  UTItype r;
-
-  FP_UNPACK_RAW_Q(A, a);
-  FP_TO_INT_Q(r, A, TI_BITS, 1);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
diff --git a/gcc/config/soft-fp/fixunsdfdi.c b/gcc/config/soft-fp/fixunsdfdi.c
deleted file mode 100644 (file)
index d85198f..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Software floating-point emulation.
-   Convert a to 64bit unsigned integer
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "double.h"
-
-UDItype __fixunsdfdi(DFtype a)
-{
-  FP_DECL_EX;
-  FP_DECL_D(A);
-  UDItype r;
-
-  FP_UNPACK_RAW_D(A, a);
-  FP_TO_INT_D(r, A, DI_BITS, 0);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
diff --git a/gcc/config/soft-fp/fixunsdfsi.c b/gcc/config/soft-fp/fixunsdfsi.c
deleted file mode 100644 (file)
index 492ffde..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Software floating-point emulation.
-   Convert a to 32bit unsigned integer
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "double.h"
-
-USItype __fixunsdfsi(DFtype a)
-{
-  FP_DECL_EX;
-  FP_DECL_D(A);
-  USItype r;
-
-  FP_UNPACK_RAW_D(A, a);
-  FP_TO_INT_D(r, A, SI_BITS, 0);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
diff --git a/gcc/config/soft-fp/fixunsdfti.c b/gcc/config/soft-fp/fixunsdfti.c
deleted file mode 100644 (file)
index 48c41d4..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Software floating-point emulation.
-   Convert IEEE double to 128bit unsigned integer
-   Copyright (C) 2007 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Uros Bizjak (ubizjak@gmail.com).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "double.h"
-
-UTItype __fixunsdfti(DFtype a)
-{
-  FP_DECL_EX;
-  FP_DECL_D(A);
-  UTItype r;
-
-  FP_UNPACK_RAW_D(A, a);
-  FP_TO_INT_D(r, A, TI_BITS, 0);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
diff --git a/gcc/config/soft-fp/fixunssfdi.c b/gcc/config/soft-fp/fixunssfdi.c
deleted file mode 100644 (file)
index 5484153..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Software floating-point emulation.
-   Convert a to 64bit unsigned integer
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "single.h"
-
-UDItype __fixunssfdi(SFtype a)
-{
-  FP_DECL_EX;
-  FP_DECL_S(A);
-  UDItype r;
-
-  FP_UNPACK_RAW_S(A, a);
-  FP_TO_INT_S(r, A, DI_BITS, 0);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
diff --git a/gcc/config/soft-fp/fixunssfsi.c b/gcc/config/soft-fp/fixunssfsi.c
deleted file mode 100644 (file)
index ac9d4b9..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Software floating-point emulation.
-   Convert a to 32bit unsigned integer
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "single.h"
-
-USItype __fixunssfsi(SFtype a)
-{
-  FP_DECL_EX;
-  FP_DECL_S(A);
-  USItype r;
-
-  FP_UNPACK_RAW_S(A, a);
-  FP_TO_INT_S(r, A, SI_BITS, 0);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
diff --git a/gcc/config/soft-fp/fixunssfti.c b/gcc/config/soft-fp/fixunssfti.c
deleted file mode 100644 (file)
index 89bcedb..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Software floating-point emulation.
-   Convert IEEE single to 128bit unsigned integer
-   Copyright (C) 2007 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Uros Bizjak (ubizjak@gmail.com).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "single.h"
-
-UTItype __fixunssfti(SFtype a)
-{
-  FP_DECL_EX;
-  FP_DECL_S(A);
-  UTItype r;
-
-  FP_UNPACK_RAW_S(A, a);
-  FP_TO_INT_S(r, A, TI_BITS, 0);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
diff --git a/gcc/config/soft-fp/fixunstfdi.c b/gcc/config/soft-fp/fixunstfdi.c
deleted file mode 100644 (file)
index 86f1fc8..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Software floating-point emulation.
-   Convert a to 64bit unsigned integer
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "quad.h"
-
-UDItype __fixunstfdi(TFtype a)
-{
-  FP_DECL_EX;
-  FP_DECL_Q(A);
-  UDItype r;
-
-  FP_UNPACK_RAW_Q(A, a);
-  FP_TO_INT_Q(r, A, DI_BITS, 0);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
diff --git a/gcc/config/soft-fp/fixunstfsi.c b/gcc/config/soft-fp/fixunstfsi.c
deleted file mode 100644 (file)
index e0335da..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Software floating-point emulation.
-   Convert a to 32bit unsigned integer
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "quad.h"
-
-USItype __fixunstfsi(TFtype a)
-{
-  FP_DECL_EX;
-  FP_DECL_Q(A);
-  USItype r;
-
-  FP_UNPACK_RAW_Q(A, a);
-  FP_TO_INT_Q(r, A, SI_BITS, 0);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
diff --git a/gcc/config/soft-fp/fixunstfti.c b/gcc/config/soft-fp/fixunstfti.c
deleted file mode 100644 (file)
index f62bd50..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Software floating-point emulation.
-   Convert IEEE quad to 128bit unsigned integer
-   Copyright (C) 2007 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Uros Bizjak (ubizjak@gmail.com).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "quad.h"
-
-UTItype __fixunstfti(TFtype a)
-{
-  FP_DECL_EX;
-  FP_DECL_Q(A);
-  UTItype r;
-
-  FP_UNPACK_RAW_Q(A, a);
-  FP_TO_INT_Q(r, A, TI_BITS, 0);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
diff --git a/gcc/config/soft-fp/floatdidf.c b/gcc/config/soft-fp/floatdidf.c
deleted file mode 100644 (file)
index 21e9fb1..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Software floating-point emulation.
-   Convert a 64bit signed integer to IEEE double
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "double.h"
-
-DFtype __floatdidf(DItype i)
-{
-  FP_DECL_EX;
-  FP_DECL_D(A);
-  DFtype a;
-
-  FP_FROM_INT_D(A, i, DI_BITS, UDItype);
-  FP_PACK_RAW_D(a, A);
-  FP_HANDLE_EXCEPTIONS;
-
-  return a;
-}
diff --git a/gcc/config/soft-fp/floatdisf.c b/gcc/config/soft-fp/floatdisf.c
deleted file mode 100644 (file)
index ee57915..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Software floating-point emulation.
-   Convert a 64bit signed integer to IEEE single
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "single.h"
-
-SFtype __floatdisf(DItype i)
-{
-  FP_DECL_EX;
-  FP_DECL_S(A);
-  SFtype a;
-
-  FP_FROM_INT_S(A, i, DI_BITS, UDItype);
-  FP_PACK_RAW_S(a, A);
-  FP_HANDLE_EXCEPTIONS;
-
-  return a;
-}
diff --git a/gcc/config/soft-fp/floatditf.c b/gcc/config/soft-fp/floatditf.c
deleted file mode 100644 (file)
index 564800b..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Software floating-point emulation.
-   Convert a 64bit signed integer to IEEE quad
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "quad.h"
-
-TFtype __floatditf(DItype i)
-{
-  FP_DECL_EX;
-  FP_DECL_Q(A);
-  TFtype a;
-
-  FP_FROM_INT_Q(A, i, DI_BITS, UDItype);
-  FP_PACK_RAW_Q(a, A);
-  FP_HANDLE_EXCEPTIONS;
-
-  return a;
-}
diff --git a/gcc/config/soft-fp/floatsidf.c b/gcc/config/soft-fp/floatsidf.c
deleted file mode 100644 (file)
index b6d5f8d..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Software floating-point emulation.
-   Convert a 32bit signed integer to IEEE double
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "double.h"
-
-DFtype __floatsidf(SItype i)
-{
-  FP_DECL_EX;
-  FP_DECL_D(A);
-  DFtype a;
-
-  FP_FROM_INT_D(A, i, SI_BITS, USItype);
-  FP_PACK_RAW_D(a, A);
-  FP_HANDLE_EXCEPTIONS;
-
-  return a;
-}
diff --git a/gcc/config/soft-fp/floatsisf.c b/gcc/config/soft-fp/floatsisf.c
deleted file mode 100644 (file)
index 76217fe..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Software floating-point emulation.
-   Convert a 32bit signed integer to IEEE single
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "single.h"
-
-SFtype __floatsisf(SItype i)
-{
-  FP_DECL_EX;
-  FP_DECL_S(A);
-  SFtype a;
-
-  FP_FROM_INT_S(A, i, SI_BITS, USItype);
-  FP_PACK_RAW_S(a, A);
-  FP_HANDLE_EXCEPTIONS;
-
-  return a;
-}
diff --git a/gcc/config/soft-fp/floatsitf.c b/gcc/config/soft-fp/floatsitf.c
deleted file mode 100644 (file)
index 8c3d9cc..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Software floating-point emulation.
-   Convert a 32bit signed integer to IEEE quad
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "quad.h"
-
-TFtype __floatsitf(SItype i)
-{
-  FP_DECL_EX;
-  FP_DECL_Q(A);
-  TFtype a;
-
-  FP_FROM_INT_Q(A, i, SI_BITS, USItype);
-  FP_PACK_RAW_Q(a, A);
-  FP_HANDLE_EXCEPTIONS;
-
-  return a;
-}
diff --git a/gcc/config/soft-fp/floattidf.c b/gcc/config/soft-fp/floattidf.c
deleted file mode 100644 (file)
index 14b6ea3..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Software floating-point emulation.
-   Convert a 128bit signed integer to IEEE double
-   Copyright (C) 2007 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Uros Bizjak (ubizjak@gmail.com).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "double.h"
-
-DFtype __floattidf(TItype i)
-{
-  FP_DECL_EX;
-  FP_DECL_D(A);
-  DFtype a;
-
-  FP_FROM_INT_D(A, i, TI_BITS, UTItype);
-  FP_PACK_RAW_D(a, A);
-  FP_HANDLE_EXCEPTIONS;
-
-  return a;
-}
diff --git a/gcc/config/soft-fp/floattisf.c b/gcc/config/soft-fp/floattisf.c
deleted file mode 100644 (file)
index 475cafa..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Software floating-point emulation.
-   Convert a 128bit signed integer to IEEE single
-   Copyright (C) 2007 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Uros Bizjak (ubizjak@gmail.com).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "single.h"
-
-SFtype __floattisf(TItype i)
-{
-  FP_DECL_EX;
-  FP_DECL_S(A);
-  SFtype a;
-
-  FP_FROM_INT_S(A, i, TI_BITS, UTItype);
-  FP_PACK_RAW_S(a, A);
-  FP_HANDLE_EXCEPTIONS;
-
-  return a;
-}
diff --git a/gcc/config/soft-fp/floattitf.c b/gcc/config/soft-fp/floattitf.c
deleted file mode 100644 (file)
index 12bbb27..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Software floating-point emulation.
-   Convert a 128bit signed integer to IEEE quad
-   Copyright (C) 2007 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Uros Bizjak (ubizjak@gmail.com).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "quad.h"
-
-TFtype __floattitf(TItype i)
-{
-  FP_DECL_EX;
-  FP_DECL_Q(A);
-  TFtype a;
-
-  FP_FROM_INT_Q(A, i, TI_BITS, UTItype);
-  FP_PACK_RAW_Q(a, A);
-  FP_HANDLE_EXCEPTIONS;
-
-  return a;
-}
diff --git a/gcc/config/soft-fp/floatundidf.c b/gcc/config/soft-fp/floatundidf.c
deleted file mode 100644 (file)
index af8e4a5..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Software floating-point emulation.
-   Convert a 64bit unsigned integer to IEEE double
-   Copyright (C) 1997, 1999, 2006, 2007 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "double.h"
-
-DFtype __floatundidf(UDItype i)
-{
-  FP_DECL_EX;
-  FP_DECL_D(A);
-  DFtype a;
-
-  FP_FROM_INT_D(A, i, DI_BITS, UDItype);
-  FP_PACK_RAW_D(a, A);
-  FP_HANDLE_EXCEPTIONS;
-
-  return a;
-}
diff --git a/gcc/config/soft-fp/floatundisf.c b/gcc/config/soft-fp/floatundisf.c
deleted file mode 100644 (file)
index 977f7df..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Software floating-point emulation.
-   Convert a 64bit unsigned integer to IEEE single
-   Copyright (C) 1997, 1999, 2006, 2007 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "single.h"
-
-SFtype __floatundisf(UDItype i)
-{
-  FP_DECL_EX;
-  FP_DECL_S(A);
-  SFtype a;
-
-  FP_FROM_INT_S(A, i, DI_BITS, UDItype);
-  FP_PACK_RAW_S(a, A);
-  FP_HANDLE_EXCEPTIONS;
-
-  return a;
-}
diff --git a/gcc/config/soft-fp/floatunditf.c b/gcc/config/soft-fp/floatunditf.c
deleted file mode 100644 (file)
index ab357f0..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-/* Software floating-point emulation.
-   Convert a 64bit unsigned integer to IEEE quad
-   Copyright (C) 1997,1999, 2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "quad.h"
-
-TFtype
-__floatunditf(UDItype i)
-{
-  FP_DECL_EX;
-  FP_DECL_Q(A);
-  TFtype a;
-
-  FP_FROM_INT_Q(A, i, DI_BITS, UDItype);
-  FP_PACK_RAW_Q(a, A);
-  FP_HANDLE_EXCEPTIONS;
-
-  return a;
-}
diff --git a/gcc/config/soft-fp/floatunsidf.c b/gcc/config/soft-fp/floatunsidf.c
deleted file mode 100644 (file)
index 12d0f25..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Software floating-point emulation.
-   Convert a 32bit unsigned integer to IEEE double
-   Copyright (C) 1997, 1999, 2006, 2007 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "double.h"
-
-DFtype __floatunsidf(USItype i)
-{
-  FP_DECL_EX;
-  FP_DECL_D(A);
-  DFtype a;
-
-  FP_FROM_INT_D(A, i, SI_BITS, USItype);
-  FP_PACK_RAW_D(a, A);
-  FP_HANDLE_EXCEPTIONS;
-
-  return a;
-}
diff --git a/gcc/config/soft-fp/floatunsisf.c b/gcc/config/soft-fp/floatunsisf.c
deleted file mode 100644 (file)
index 80c5d3d..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Software floating-point emulation.
-   Convert a 32bit unsigned integer to IEEE single
-   Copyright (C) 1997, 1999, 2006, 2007 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "single.h"
-
-SFtype __floatunsisf(USItype i)
-{
-  FP_DECL_EX;
-  FP_DECL_S(A);
-  SFtype a;
-
-  FP_FROM_INT_S(A, i, SI_BITS, USItype);
-  FP_PACK_RAW_S(a, A);
-  FP_HANDLE_EXCEPTIONS;
-
-  return a;
-}
diff --git a/gcc/config/soft-fp/floatunsitf.c b/gcc/config/soft-fp/floatunsitf.c
deleted file mode 100644 (file)
index c993716..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-/* Software floating-point emulation.
-   Convert a 32bit unsigned integer to IEEE quad
-   Copyright (C) 1997,1999, 2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "quad.h"
-
-TFtype
-__floatunsitf(USItype i)
-{
-  FP_DECL_EX;
-  FP_DECL_Q(A);
-  TFtype a;
-
-  FP_FROM_INT_Q(A, i, SI_BITS, USItype);
-  FP_PACK_RAW_Q(a, A);
-  FP_HANDLE_EXCEPTIONS;
-
-  return a;
-}
diff --git a/gcc/config/soft-fp/floatuntidf.c b/gcc/config/soft-fp/floatuntidf.c
deleted file mode 100644 (file)
index db1fe1a..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Software floating-point emulation.
-   Convert a 128bit unsigned integer to IEEE double
-   Copyright (C) 1997,1999, 2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Uros Bizjak (ubizjak@gmail.com).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "double.h"
-
-DFtype __floatuntidf(UTItype i)
-{
-  FP_DECL_EX;
-  FP_DECL_D(A);
-  DFtype a;
-
-  FP_FROM_INT_D(A, i, TI_BITS, UTItype);
-  FP_PACK_RAW_D(a, A);
-  FP_HANDLE_EXCEPTIONS;
-
-  return a;
-}
diff --git a/gcc/config/soft-fp/floatuntisf.c b/gcc/config/soft-fp/floatuntisf.c
deleted file mode 100644 (file)
index 7391487..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Software floating-point emulation.
-   Convert a 128bit unsigned integer to IEEE single
-   Copyright (C) 2007, 2008 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Uros Bizjak (ubizjak@gmail.com).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "single.h"
-
-SFtype __floatuntisf(UTItype i)
-{
-  FP_DECL_EX;
-  FP_DECL_S(A);
-  SFtype a;
-
-  FP_FROM_INT_S(A, i, TI_BITS, UTItype);
-  FP_PACK_RAW_S(a, A);
-  FP_HANDLE_EXCEPTIONS;
-
-  return a;
-}
diff --git a/gcc/config/soft-fp/floatuntitf.c b/gcc/config/soft-fp/floatuntitf.c
deleted file mode 100644 (file)
index 8d66901..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Software floating-point emulation.
-   Convert a 128bit unsigned integer to IEEE quad
-   Copyright (C) 2007 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Uros Bizjak (ubizjak@gmail.com).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "quad.h"
-
-TFtype __floatuntitf(UTItype i)
-{
-  FP_DECL_EX;
-  FP_DECL_Q(A);
-  TFtype a;
-
-  FP_FROM_INT_Q(A, i, TI_BITS, UTItype);
-  FP_PACK_RAW_Q(a, A);
-  FP_HANDLE_EXCEPTIONS;
-
-  return a;
-}
diff --git a/gcc/config/soft-fp/gedf2.c b/gcc/config/soft-fp/gedf2.c
deleted file mode 100644 (file)
index 17a0453..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-/* Software floating-point emulation.
-   Return 0 iff a == b, 1 iff a > b, -2 iff a ? b, -1 iff a < b
-   Copyright (C) 1997,1999,2006,2007 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "double.h"
-
-CMPtype __gedf2(DFtype a, DFtype b)
-{
-  FP_DECL_EX;
-  FP_DECL_D(A); FP_DECL_D(B);
-  CMPtype r;
-
-  FP_UNPACK_RAW_D(A, a);
-  FP_UNPACK_RAW_D(B, b);
-  FP_CMP_D(r, A, B, -2);
-  if (r == -2 && (FP_ISSIGNAN_D(A) || FP_ISSIGNAN_D(B)))
-    FP_SET_EXCEPTION(FP_EX_INVALID);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
-
-strong_alias(__gedf2, __gtdf2);
diff --git a/gcc/config/soft-fp/gesf2.c b/gcc/config/soft-fp/gesf2.c
deleted file mode 100644 (file)
index 609a61f..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-/* Software floating-point emulation.
-   Return 0 iff a == b, 1 iff a > b, -2 iff a ? b, -1 iff a < b
-   Copyright (C) 1997,1999,2006,2007 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "single.h"
-
-CMPtype __gesf2(SFtype a, SFtype b)
-{
-  FP_DECL_EX;
-  FP_DECL_S(A); FP_DECL_S(B);
-  CMPtype r;
-
-  FP_UNPACK_RAW_S(A, a);
-  FP_UNPACK_RAW_S(B, b);
-  FP_CMP_S(r, A, B, -2);
-  if (r == -2 && (FP_ISSIGNAN_S(A) || FP_ISSIGNAN_S(B)))
-    FP_SET_EXCEPTION(FP_EX_INVALID);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
-
-strong_alias(__gesf2, __gtsf2);
diff --git a/gcc/config/soft-fp/getf2.c b/gcc/config/soft-fp/getf2.c
deleted file mode 100644 (file)
index eb52d05..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-/* Software floating-point emulation.
-   Return 0 iff a == b, 1 iff a > b, -2 iff a ? b, -1 iff a < b
-   Copyright (C) 1997,1999,2006,2007 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "quad.h"
-
-CMPtype __getf2(TFtype a, TFtype b)
-{
-  FP_DECL_EX;
-  FP_DECL_Q(A); FP_DECL_Q(B);
-  CMPtype r;
-
-  FP_UNPACK_RAW_Q(A, a);
-  FP_UNPACK_RAW_Q(B, b);
-  FP_CMP_Q(r, A, B, -2);
-  if (r == -2 && (FP_ISSIGNAN_Q(A) || FP_ISSIGNAN_Q(B)))
-    FP_SET_EXCEPTION(FP_EX_INVALID);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
-
-strong_alias(__getf2, __gttf2);
diff --git a/gcc/config/soft-fp/ledf2.c b/gcc/config/soft-fp/ledf2.c
deleted file mode 100644 (file)
index b8ba440..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-/* Software floating-point emulation.
-   Return 0 iff a == b, 1 iff a > b, 2 iff a ? b, -1 iff a < b
-   Copyright (C) 1997,1999,2006,2007 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "double.h"
-
-CMPtype __ledf2(DFtype a, DFtype b)
-{
-  FP_DECL_EX;
-  FP_DECL_D(A); FP_DECL_D(B);
-  CMPtype r;
-
-  FP_UNPACK_RAW_D(A, a);
-  FP_UNPACK_RAW_D(B, b);
-  FP_CMP_D(r, A, B, 2);
-  if (r == 2 && (FP_ISSIGNAN_D(A) || FP_ISSIGNAN_D(B)))
-    FP_SET_EXCEPTION(FP_EX_INVALID);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
-
-strong_alias(__ledf2, __ltdf2);
diff --git a/gcc/config/soft-fp/lesf2.c b/gcc/config/soft-fp/lesf2.c
deleted file mode 100644 (file)
index cb359c9..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-/* Software floating-point emulation.
-   Return 0 iff a == b, 1 iff a > b, 2 iff a ? b, -1 iff a < b
-   Copyright (C) 1997,1999,2006,2007 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "single.h"
-
-CMPtype __lesf2(SFtype a, SFtype b)
-{
-  FP_DECL_EX;
-  FP_DECL_S(A); FP_DECL_S(B);
-  CMPtype r;
-
-  FP_UNPACK_RAW_S(A, a);
-  FP_UNPACK_RAW_S(B, b);
-  FP_CMP_S(r, A, B, 2);
-  if (r == 2 && (FP_ISSIGNAN_S(A) || FP_ISSIGNAN_S(B)))
-    FP_SET_EXCEPTION(FP_EX_INVALID);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
-
-strong_alias(__lesf2, __ltsf2);
diff --git a/gcc/config/soft-fp/letf2.c b/gcc/config/soft-fp/letf2.c
deleted file mode 100644 (file)
index 01fd12b..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-/* Software floating-point emulation.
-   Return 0 iff a == b, 1 iff a > b, 2 iff a ? b, -1 iff a < b
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "quad.h"
-
-CMPtype __letf2(TFtype a, TFtype b)
-{
-  FP_DECL_EX;
-  FP_DECL_Q(A); FP_DECL_Q(B);
-  CMPtype r;
-
-  FP_UNPACK_RAW_Q(A, a);
-  FP_UNPACK_RAW_Q(B, b);
-  FP_CMP_Q(r, A, B, 2);
-  if (r == 2 && (FP_ISSIGNAN_Q(A) || FP_ISSIGNAN_Q(B)))
-    FP_SET_EXCEPTION(FP_EX_INVALID);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
-
-strong_alias(__letf2, __lttf2);
diff --git a/gcc/config/soft-fp/muldf3.c b/gcc/config/soft-fp/muldf3.c
deleted file mode 100644 (file)
index 7eb2015..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Software floating-point emulation.
-   Return a * b
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "double.h"
-
-DFtype __muldf3(DFtype a, DFtype b)
-{
-  FP_DECL_EX;
-  FP_DECL_D(A); FP_DECL_D(B); FP_DECL_D(R);
-  DFtype r;
-
-  FP_INIT_ROUNDMODE;
-  FP_UNPACK_D(A, a);
-  FP_UNPACK_D(B, b);
-  FP_MUL_D(R, A, B);
-  FP_PACK_D(r, R);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
diff --git a/gcc/config/soft-fp/mulsf3.c b/gcc/config/soft-fp/mulsf3.c
deleted file mode 100644 (file)
index 5df4406..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Software floating-point emulation.
-   Return a * b
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "single.h"
-
-SFtype __mulsf3(SFtype a, SFtype b)
-{
-  FP_DECL_EX;
-  FP_DECL_S(A); FP_DECL_S(B); FP_DECL_S(R);
-  SFtype r;
-
-  FP_INIT_ROUNDMODE;
-  FP_UNPACK_S(A, a);
-  FP_UNPACK_S(B, b);
-  FP_MUL_S(R, A, B);
-  FP_PACK_S(r, R);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
diff --git a/gcc/config/soft-fp/multf3.c b/gcc/config/soft-fp/multf3.c
deleted file mode 100644 (file)
index 0abab6d..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Software floating-point emulation.
-   Return a * b
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "quad.h"
-
-TFtype __multf3(TFtype a, TFtype b)
-{
-  FP_DECL_EX;
-  FP_DECL_Q(A); FP_DECL_Q(B); FP_DECL_Q(R);
-  TFtype r;
-
-  FP_INIT_ROUNDMODE;
-  FP_UNPACK_Q(A, a);
-  FP_UNPACK_Q(B, b);
-  FP_MUL_Q(R, A, B);
-  FP_PACK_Q(r, R);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
diff --git a/gcc/config/soft-fp/negdf2.c b/gcc/config/soft-fp/negdf2.c
deleted file mode 100644 (file)
index 54869e9..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-/* Software floating-point emulation.
-   Return -a
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "double.h"
-
-DFtype __negdf2(DFtype a)
-{
-  FP_DECL_EX;
-  FP_DECL_D(A); FP_DECL_D(R);
-  DFtype r;
-
-  FP_UNPACK_D(A, a);
-  FP_NEG_D(R, A);
-  FP_PACK_D(r, R);
-  FP_CLEAR_EXCEPTIONS;
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
diff --git a/gcc/config/soft-fp/negsf2.c b/gcc/config/soft-fp/negsf2.c
deleted file mode 100644 (file)
index bf5db7a..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-/* Software floating-point emulation.
-   Return -a
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "single.h"
-
-SFtype __negsf2(SFtype a)
-{
-  FP_DECL_EX;
-  FP_DECL_S(A); FP_DECL_S(R);
-  SFtype r;
-
-  FP_UNPACK_S(A, a);
-  FP_NEG_S(R, A);
-  FP_PACK_S(r, R);
-  FP_CLEAR_EXCEPTIONS;
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
diff --git a/gcc/config/soft-fp/negtf2.c b/gcc/config/soft-fp/negtf2.c
deleted file mode 100644 (file)
index 5524c82..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-/* Software floating-point emulation.
-   Return -a
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "quad.h"
-
-TFtype __negtf2(TFtype a)
-{
-  FP_DECL_EX;
-  FP_DECL_Q(A); FP_DECL_Q(R);
-  TFtype r;
-
-  FP_UNPACK_Q(A, a);
-  FP_NEG_Q(R, A);
-  FP_PACK_Q(r, R);
-  FP_CLEAR_EXCEPTIONS;
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
diff --git a/gcc/config/soft-fp/op-1.h b/gcc/config/soft-fp/op-1.h
deleted file mode 100644 (file)
index 35cd0ba..0000000
+++ /dev/null
@@ -1,302 +0,0 @@
-/* Software floating-point emulation.
-   Basic one-word fraction declaration and manipulation.
-   Copyright (C) 1997,1998,1999,2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com),
-                 Jakub Jelinek (jj@ultra.linux.cz),
-                 David S. Miller (davem@redhat.com) and
-                 Peter Maydell (pmaydell@chiark.greenend.org.uk).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#define _FP_FRAC_DECL_1(X)     _FP_W_TYPE X##_f
-#define _FP_FRAC_COPY_1(D,S)   (D##_f = S##_f)
-#define _FP_FRAC_SET_1(X,I)    (X##_f = I)
-#define _FP_FRAC_HIGH_1(X)     (X##_f)
-#define _FP_FRAC_LOW_1(X)      (X##_f)
-#define _FP_FRAC_WORD_1(X,w)   (X##_f)
-
-#define _FP_FRAC_ADDI_1(X,I)   (X##_f += I)
-#define _FP_FRAC_SLL_1(X,N)                    \
-  do {                                         \
-    if (__builtin_constant_p(N) && (N) == 1)   \
-      X##_f += X##_f;                          \
-    else                                       \
-      X##_f <<= (N);                           \
-  } while (0)
-#define _FP_FRAC_SRL_1(X,N)    (X##_f >>= N)
-
-/* Right shift with sticky-lsb.  */
-#define _FP_FRAC_SRST_1(X,S,N,sz)      __FP_FRAC_SRST_1(X##_f, S, N, sz)
-#define _FP_FRAC_SRS_1(X,N,sz) __FP_FRAC_SRS_1(X##_f, N, sz)
-
-#define __FP_FRAC_SRST_1(X,S,N,sz)                     \
-do {                                                   \
-  S = (__builtin_constant_p(N) && (N) == 1             \
-       ? X & 1 : (X << (_FP_W_TYPE_SIZE - (N))) != 0); \
-  X = X >> (N);                                                \
-} while (0)
-
-#define __FP_FRAC_SRS_1(X,N,sz)                                                \
-   (X = (X >> (N) | (__builtin_constant_p(N) && (N) == 1               \
-                    ? X & 1 : (X << (_FP_W_TYPE_SIZE - (N))) != 0)))
-
-#define _FP_FRAC_ADD_1(R,X,Y)  (R##_f = X##_f + Y##_f)
-#define _FP_FRAC_SUB_1(R,X,Y)  (R##_f = X##_f - Y##_f)
-#define _FP_FRAC_DEC_1(X,Y)    (X##_f -= Y##_f)
-#define _FP_FRAC_CLZ_1(z, X)   __FP_CLZ(z, X##_f)
-
-/* Predicates */
-#define _FP_FRAC_NEGP_1(X)     ((_FP_WS_TYPE)X##_f < 0)
-#define _FP_FRAC_ZEROP_1(X)    (X##_f == 0)
-#define _FP_FRAC_OVERP_1(fs,X) (X##_f & _FP_OVERFLOW_##fs)
-#define _FP_FRAC_CLEAR_OVERP_1(fs,X)   (X##_f &= ~_FP_OVERFLOW_##fs)
-#define _FP_FRAC_EQ_1(X, Y)    (X##_f == Y##_f)
-#define _FP_FRAC_GE_1(X, Y)    (X##_f >= Y##_f)
-#define _FP_FRAC_GT_1(X, Y)    (X##_f > Y##_f)
-
-#define _FP_ZEROFRAC_1         0
-#define _FP_MINFRAC_1          1
-#define _FP_MAXFRAC_1          (~(_FP_WS_TYPE)0)
-
-/*
- * Unpack the raw bits of a native fp value.  Do not classify or
- * normalize the data.
- */
-
-#define _FP_UNPACK_RAW_1(fs, X, val)                           \
-  do {                                                         \
-    union _FP_UNION_##fs _flo; _flo.flt = (val);               \
-                                                               \
-    X##_f = _flo.bits.frac;                                    \
-    X##_e = _flo.bits.exp;                                     \
-    X##_s = _flo.bits.sign;                                    \
-  } while (0)
-
-#define _FP_UNPACK_RAW_1_P(fs, X, val)                         \
-  do {                                                         \
-    union _FP_UNION_##fs *_flo =                               \
-      (union _FP_UNION_##fs *)(val);                           \
-                                                               \
-    X##_f = _flo->bits.frac;                                   \
-    X##_e = _flo->bits.exp;                                    \
-    X##_s = _flo->bits.sign;                                   \
-  } while (0)
-
-/*
- * Repack the raw bits of a native fp value.
- */
-
-#define _FP_PACK_RAW_1(fs, val, X)                             \
-  do {                                                         \
-    union _FP_UNION_##fs _flo;                                 \
-                                                               \
-    _flo.bits.frac = X##_f;                                    \
-    _flo.bits.exp  = X##_e;                                    \
-    _flo.bits.sign = X##_s;                                    \
-                                                               \
-    (val) = _flo.flt;                                          \
-  } while (0)
-
-#define _FP_PACK_RAW_1_P(fs, val, X)                           \
-  do {                                                         \
-    union _FP_UNION_##fs *_flo =                               \
-      (union _FP_UNION_##fs *)(val);                           \
-                                                               \
-    _flo->bits.frac = X##_f;                                   \
-    _flo->bits.exp  = X##_e;                                   \
-    _flo->bits.sign = X##_s;                                   \
-  } while (0)
-
-
-/*
- * Multiplication algorithms:
- */
-
-/* Basic.  Assuming the host word size is >= 2*FRACBITS, we can do the
-   multiplication immediately.  */
-
-#define _FP_MUL_MEAT_1_imm(wfracbits, R, X, Y)                         \
-  do {                                                                 \
-    R##_f = X##_f * Y##_f;                                             \
-    /* Normalize since we know where the msb of the multiplicands      \
-       were (bit B), we know that the msb of the of the product is     \
-       at either 2B or 2B-1.  */                                       \
-    _FP_FRAC_SRS_1(R, wfracbits-1, 2*wfracbits);                       \
-  } while (0)
-
-/* Given a 1W * 1W => 2W primitive, do the extended multiplication.  */
-
-#define _FP_MUL_MEAT_1_wide(wfracbits, R, X, Y, doit)                  \
-  do {                                                                 \
-    _FP_W_TYPE _Z_f0, _Z_f1;                                           \
-    doit(_Z_f1, _Z_f0, X##_f, Y##_f);                                  \
-    /* Normalize since we know where the msb of the multiplicands      \
-       were (bit B), we know that the msb of the of the product is     \
-       at either 2B or 2B-1.  */                                       \
-    _FP_FRAC_SRS_2(_Z, wfracbits-1, 2*wfracbits);                      \
-    R##_f = _Z_f0;                                                     \
-  } while (0)
-
-/* Finally, a simple widening multiply algorithm.  What fun!  */
-
-#define _FP_MUL_MEAT_1_hard(wfracbits, R, X, Y)                                \
-  do {                                                                 \
-    _FP_W_TYPE _xh, _xl, _yh, _yl, _z_f0, _z_f1, _a_f0, _a_f1;         \
-                                                                       \
-    /* split the words in half */                                      \
-    _xh = X##_f >> (_FP_W_TYPE_SIZE/2);                                        \
-    _xl = X##_f & (((_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE/2)) - 1);                \
-    _yh = Y##_f >> (_FP_W_TYPE_SIZE/2);                                        \
-    _yl = Y##_f & (((_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE/2)) - 1);                \
-                                                                       \
-    /* multiply the pieces */                                          \
-    _z_f0 = _xl * _yl;                                                 \
-    _a_f0 = _xh * _yl;                                                 \
-    _a_f1 = _xl * _yh;                                                 \
-    _z_f1 = _xh * _yh;                                                 \
-                                                                       \
-    /* reassemble into two full words */                               \
-    if ((_a_f0 += _a_f1) < _a_f1)                                      \
-      _z_f1 += (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE/2);                   \
-    _a_f1 = _a_f0 >> (_FP_W_TYPE_SIZE/2);                              \
-    _a_f0 = _a_f0 << (_FP_W_TYPE_SIZE/2);                              \
-    _FP_FRAC_ADD_2(_z, _z, _a);                                                \
-                                                                       \
-    /* normalize */                                                    \
-    _FP_FRAC_SRS_2(_z, wfracbits - 1, 2*wfracbits);                    \
-    R##_f = _z_f0;                                                     \
-  } while (0)
-
-
-/*
- * Division algorithms:
- */
-
-/* Basic.  Assuming the host word size is >= 2*FRACBITS, we can do the
-   division immediately.  Give this macro either _FP_DIV_HELP_imm for
-   C primitives or _FP_DIV_HELP_ldiv for the ISO function.  Which you
-   choose will depend on what the compiler does with divrem4.  */
-
-#define _FP_DIV_MEAT_1_imm(fs, R, X, Y, doit)          \
-  do {                                                 \
-    _FP_W_TYPE _q, _r;                                 \
-    X##_f <<= (X##_f < Y##_f                           \
-              ? R##_e--, _FP_WFRACBITS_##fs            \
-              : _FP_WFRACBITS_##fs - 1);               \
-    doit(_q, _r, X##_f, Y##_f);                                \
-    R##_f = _q | (_r != 0);                            \
-  } while (0)
-
-/* GCC's longlong.h defines a 2W / 1W => (1W,1W) primitive udiv_qrnnd
-   that may be useful in this situation.  This first is for a primitive
-   that requires normalization, the second for one that does not.  Look
-   for UDIV_NEEDS_NORMALIZATION to tell which your machine needs.  */
-
-#define _FP_DIV_MEAT_1_udiv_norm(fs, R, X, Y)                          \
-  do {                                                                 \
-    _FP_W_TYPE _nh, _nl, _q, _r, _y;                                   \
-                                                                       \
-    /* Normalize Y -- i.e. make the most significant bit set.  */      \
-    _y = Y##_f << _FP_WFRACXBITS_##fs;                                 \
-                                                                       \
-    /* Shift X op correspondingly high, that is, up one full word.  */ \
-    if (X##_f < Y##_f)                                                 \
-      {                                                                        \
-       R##_e--;                                                        \
-       _nl = 0;                                                        \
-       _nh = X##_f;                                                    \
-      }                                                                        \
-    else                                                               \
-      {                                                                        \
-       _nl = X##_f << (_FP_W_TYPE_SIZE - 1);                           \
-       _nh = X##_f >> 1;                                               \
-      }                                                                        \
-                                                                       \
-    udiv_qrnnd(_q, _r, _nh, _nl, _y);                                  \
-    R##_f = _q | (_r != 0);                                            \
-  } while (0)
-
-#define _FP_DIV_MEAT_1_udiv(fs, R, X, Y)               \
-  do {                                                 \
-    _FP_W_TYPE _nh, _nl, _q, _r;                       \
-    if (X##_f < Y##_f)                                 \
-      {                                                        \
-       R##_e--;                                        \
-       _nl = X##_f << _FP_WFRACBITS_##fs;              \
-       _nh = X##_f >> _FP_WFRACXBITS_##fs;             \
-      }                                                        \
-    else                                               \
-      {                                                        \
-       _nl = X##_f << (_FP_WFRACBITS_##fs - 1);        \
-       _nh = X##_f >> (_FP_WFRACXBITS_##fs + 1);       \
-      }                                                        \
-    udiv_qrnnd(_q, _r, _nh, _nl, Y##_f);               \
-    R##_f = _q | (_r != 0);                            \
-  } while (0)
-  
-  
-/*
- * Square root algorithms:
- * We have just one right now, maybe Newton approximation
- * should be added for those machines where division is fast.
- */
-#define _FP_SQRT_MEAT_1(R, S, T, X, q)                 \
-  do {                                                 \
-    while (q != _FP_WORK_ROUND)                                \
-      {                                                        \
-        T##_f = S##_f + q;                             \
-        if (T##_f <= X##_f)                            \
-          {                                            \
-            S##_f = T##_f + q;                         \
-            X##_f -= T##_f;                            \
-            R##_f += q;                                        \
-          }                                            \
-        _FP_FRAC_SLL_1(X, 1);                          \
-        q >>= 1;                                       \
-      }                                                        \
-    if (X##_f)                                         \
-      {                                                        \
-       if (S##_f < X##_f)                              \
-         R##_f |= _FP_WORK_ROUND;                      \
-       R##_f |= _FP_WORK_STICKY;                       \
-      }                                                        \
-  } while (0)
-
-/*
- * Assembly/disassembly for converting to/from integral types.  
- * No shifting or overflow handled here.
- */
-
-#define _FP_FRAC_ASSEMBLE_1(r, X, rsize)       (r = X##_f)
-#define _FP_FRAC_DISASSEMBLE_1(X, r, rsize)    (X##_f = r)
-
-
-/*
- * Convert FP values between word sizes
- */
-
-#define _FP_FRAC_COPY_1_1(D, S)                (D##_f = S##_f)
diff --git a/gcc/config/soft-fp/op-2.h b/gcc/config/soft-fp/op-2.h
deleted file mode 100644 (file)
index 3a3b3aa..0000000
+++ /dev/null
@@ -1,617 +0,0 @@
-/* Software floating-point emulation.
-   Basic two-word fraction declaration and manipulation.
-   Copyright (C) 1997,1998,1999,2006,2007 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com),
-                 Jakub Jelinek (jj@ultra.linux.cz),
-                 David S. Miller (davem@redhat.com) and
-                 Peter Maydell (pmaydell@chiark.greenend.org.uk).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#define _FP_FRAC_DECL_2(X)     _FP_W_TYPE X##_f0, X##_f1
-#define _FP_FRAC_COPY_2(D,S)   (D##_f0 = S##_f0, D##_f1 = S##_f1)
-#define _FP_FRAC_SET_2(X,I)    __FP_FRAC_SET_2(X, I)
-#define _FP_FRAC_HIGH_2(X)     (X##_f1)
-#define _FP_FRAC_LOW_2(X)      (X##_f0)
-#define _FP_FRAC_WORD_2(X,w)   (X##_f##w)
-
-#define _FP_FRAC_SLL_2(X,N)                                                \
-(void)(((N) < _FP_W_TYPE_SIZE)                                             \
-       ? ({                                                                \
-           if (__builtin_constant_p(N) && (N) == 1)                        \
-             {                                                             \
-               X##_f1 = X##_f1 + X##_f1 + (((_FP_WS_TYPE)(X##_f0)) < 0);   \
-               X##_f0 += X##_f0;                                           \
-             }                                                             \
-           else                                                            \
-             {                                                             \
-               X##_f1 = X##_f1 << (N) | X##_f0 >> (_FP_W_TYPE_SIZE - (N)); \
-               X##_f0 <<= (N);                                             \
-             }                                                             \
-           0;                                                              \
-         })                                                                \
-       : ({                                                                \
-           X##_f1 = X##_f0 << ((N) - _FP_W_TYPE_SIZE);                     \
-           X##_f0 = 0;                                                     \
-         }))
-
-
-#define _FP_FRAC_SRL_2(X,N)                                            \
-(void)(((N) < _FP_W_TYPE_SIZE)                                         \
-       ? ({                                                            \
-           X##_f0 = X##_f0 >> (N) | X##_f1 << (_FP_W_TYPE_SIZE - (N)); \
-           X##_f1 >>= (N);                                             \
-         })                                                            \
-       : ({                                                            \
-           X##_f0 = X##_f1 >> ((N) - _FP_W_TYPE_SIZE);                 \
-           X##_f1 = 0;                                                 \
-         }))
-
-/* Right shift with sticky-lsb.  */
-#define _FP_FRAC_SRST_2(X,S, N,sz)                                       \
-(void)(((N) < _FP_W_TYPE_SIZE)                                           \
-       ? ({                                                              \
-           S = (__builtin_constant_p(N) && (N) == 1                      \
-                ? X##_f0 & 1                                             \
-                : (X##_f0 << (_FP_W_TYPE_SIZE - (N))) != 0);             \
-           X##_f0 = (X##_f1 << (_FP_W_TYPE_SIZE - (N)) | X##_f0 >> (N)); \
-           X##_f1 >>= (N);                                               \
-         })                                                              \
-       : ({                                                              \
-           S = ((((N) == _FP_W_TYPE_SIZE                                 \
-                  ? 0                                                    \
-                  : (X##_f1 << (2*_FP_W_TYPE_SIZE - (N))))               \
-                 | X##_f0) != 0);                                        \
-           X##_f0 = (X##_f1 >> ((N) - _FP_W_TYPE_SIZE));                 \
-           X##_f1 = 0;                                                   \
-         }))
-
-#define _FP_FRAC_SRS_2(X,N,sz)                                           \
-(void)(((N) < _FP_W_TYPE_SIZE)                                           \
-       ? ({                                                              \
-           X##_f0 = (X##_f1 << (_FP_W_TYPE_SIZE - (N)) | X##_f0 >> (N) | \
-                     (__builtin_constant_p(N) && (N) == 1                \
-                      ? X##_f0 & 1                                       \
-                      : (X##_f0 << (_FP_W_TYPE_SIZE - (N))) != 0));      \
-           X##_f1 >>= (N);                                               \
-         })                                                              \
-       : ({                                                              \
-           X##_f0 = (X##_f1 >> ((N) - _FP_W_TYPE_SIZE) |                 \
-                     ((((N) == _FP_W_TYPE_SIZE                           \
-                        ? 0                                              \
-                        : (X##_f1 << (2*_FP_W_TYPE_SIZE - (N))))         \
-                       | X##_f0) != 0));                                 \
-           X##_f1 = 0;                                                   \
-         }))
-
-#define _FP_FRAC_ADDI_2(X,I)   \
-  __FP_FRAC_ADDI_2(X##_f1, X##_f0, I)
-
-#define _FP_FRAC_ADD_2(R,X,Y)  \
-  __FP_FRAC_ADD_2(R##_f1, R##_f0, X##_f1, X##_f0, Y##_f1, Y##_f0)
-
-#define _FP_FRAC_SUB_2(R,X,Y)  \
-  __FP_FRAC_SUB_2(R##_f1, R##_f0, X##_f1, X##_f0, Y##_f1, Y##_f0)
-
-#define _FP_FRAC_DEC_2(X,Y)    \
-  __FP_FRAC_DEC_2(X##_f1, X##_f0, Y##_f1, Y##_f0)
-
-#define _FP_FRAC_CLZ_2(R,X)    \
-  do {                         \
-    if (X##_f1)                        \
-      __FP_CLZ(R,X##_f1);      \
-    else                       \
-    {                          \
-      __FP_CLZ(R,X##_f0);      \
-      R += _FP_W_TYPE_SIZE;    \
-    }                          \
-  } while(0)
-
-/* Predicates */
-#define _FP_FRAC_NEGP_2(X)     ((_FP_WS_TYPE)X##_f1 < 0)
-#define _FP_FRAC_ZEROP_2(X)    ((X##_f1 | X##_f0) == 0)
-#define _FP_FRAC_OVERP_2(fs,X) (_FP_FRAC_HIGH_##fs(X) & _FP_OVERFLOW_##fs)
-#define _FP_FRAC_CLEAR_OVERP_2(fs,X)   (_FP_FRAC_HIGH_##fs(X) &= ~_FP_OVERFLOW_##fs)
-#define _FP_FRAC_EQ_2(X, Y)    (X##_f1 == Y##_f1 && X##_f0 == Y##_f0)
-#define _FP_FRAC_GT_2(X, Y)    \
-  (X##_f1 > Y##_f1 || (X##_f1 == Y##_f1 && X##_f0 > Y##_f0))
-#define _FP_FRAC_GE_2(X, Y)    \
-  (X##_f1 > Y##_f1 || (X##_f1 == Y##_f1 && X##_f0 >= Y##_f0))
-
-#define _FP_ZEROFRAC_2         0, 0
-#define _FP_MINFRAC_2          0, 1
-#define _FP_MAXFRAC_2          (~(_FP_WS_TYPE)0), (~(_FP_WS_TYPE)0)
-
-/*
- * Internals 
- */
-
-#define __FP_FRAC_SET_2(X,I1,I0)       (X##_f0 = I0, X##_f1 = I1)
-
-#define __FP_CLZ_2(R, xh, xl)  \
-  do {                         \
-    if (xh)                    \
-      __FP_CLZ(R,xh);          \
-    else                       \
-    {                          \
-      __FP_CLZ(R,xl);          \
-      R += _FP_W_TYPE_SIZE;    \
-    }                          \
-  } while(0)
-
-#if 0
-
-#ifndef __FP_FRAC_ADDI_2
-#define __FP_FRAC_ADDI_2(xh, xl, i)    \
-  (xh += ((xl += i) < i))
-#endif
-#ifndef __FP_FRAC_ADD_2
-#define __FP_FRAC_ADD_2(rh, rl, xh, xl, yh, yl)        \
-  (rh = xh + yh + ((rl = xl + yl) < xl))
-#endif
-#ifndef __FP_FRAC_SUB_2
-#define __FP_FRAC_SUB_2(rh, rl, xh, xl, yh, yl)        \
-  (rh = xh - yh - ((rl = xl - yl) > xl))
-#endif
-#ifndef __FP_FRAC_DEC_2
-#define __FP_FRAC_DEC_2(xh, xl, yh, yl)        \
-  do {                                 \
-    UWtype _t = xl;                    \
-    xh -= yh + ((xl -= yl) > _t);      \
-  } while (0)
-#endif
-
-#else
-
-#undef __FP_FRAC_ADDI_2
-#define __FP_FRAC_ADDI_2(xh, xl, i)    add_ssaaaa(xh, xl, xh, xl, 0, i)
-#undef __FP_FRAC_ADD_2
-#define __FP_FRAC_ADD_2                        add_ssaaaa
-#undef __FP_FRAC_SUB_2
-#define __FP_FRAC_SUB_2                        sub_ddmmss
-#undef __FP_FRAC_DEC_2
-#define __FP_FRAC_DEC_2(xh, xl, yh, yl)        sub_ddmmss(xh, xl, xh, xl, yh, yl)
-
-#endif
-
-/*
- * Unpack the raw bits of a native fp value.  Do not classify or
- * normalize the data.
- */
-
-#define _FP_UNPACK_RAW_2(fs, X, val)                   \
-  do {                                                 \
-    union _FP_UNION_##fs _flo; _flo.flt = (val);       \
-                                                       \
-    X##_f0 = _flo.bits.frac0;                          \
-    X##_f1 = _flo.bits.frac1;                          \
-    X##_e  = _flo.bits.exp;                            \
-    X##_s  = _flo.bits.sign;                           \
-  } while (0)
-
-#define _FP_UNPACK_RAW_2_P(fs, X, val)                 \
-  do {                                                 \
-    union _FP_UNION_##fs *_flo =                       \
-      (union _FP_UNION_##fs *)(val);                   \
-                                                       \
-    X##_f0 = _flo->bits.frac0;                         \
-    X##_f1 = _flo->bits.frac1;                         \
-    X##_e  = _flo->bits.exp;                           \
-    X##_s  = _flo->bits.sign;                          \
-  } while (0)
-
-
-/*
- * Repack the raw bits of a native fp value.
- */
-
-#define _FP_PACK_RAW_2(fs, val, X)                     \
-  do {                                                 \
-    union _FP_UNION_##fs _flo;                         \
-                                                       \
-    _flo.bits.frac0 = X##_f0;                          \
-    _flo.bits.frac1 = X##_f1;                          \
-    _flo.bits.exp   = X##_e;                           \
-    _flo.bits.sign  = X##_s;                           \
-                                                       \
-    (val) = _flo.flt;                                  \
-  } while (0)
-
-#define _FP_PACK_RAW_2_P(fs, val, X)                   \
-  do {                                                 \
-    union _FP_UNION_##fs *_flo =                       \
-      (union _FP_UNION_##fs *)(val);                   \
-                                                       \
-    _flo->bits.frac0 = X##_f0;                         \
-    _flo->bits.frac1 = X##_f1;                         \
-    _flo->bits.exp   = X##_e;                          \
-    _flo->bits.sign  = X##_s;                          \
-  } while (0)
-
-
-/*
- * Multiplication algorithms:
- */
-
-/* Given a 1W * 1W => 2W primitive, do the extended multiplication.  */
-
-#define _FP_MUL_MEAT_2_wide(wfracbits, R, X, Y, doit)                  \
-  do {                                                                 \
-    _FP_FRAC_DECL_4(_z); _FP_FRAC_DECL_2(_b); _FP_FRAC_DECL_2(_c);     \
-                                                                       \
-    doit(_FP_FRAC_WORD_4(_z,1), _FP_FRAC_WORD_4(_z,0), X##_f0, Y##_f0);        \
-    doit(_b_f1, _b_f0, X##_f0, Y##_f1);                                        \
-    doit(_c_f1, _c_f0, X##_f1, Y##_f0);                                        \
-    doit(_FP_FRAC_WORD_4(_z,3), _FP_FRAC_WORD_4(_z,2), X##_f1, Y##_f1);        \
-                                                                       \
-    __FP_FRAC_ADD_3(_FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2),       \
-                   _FP_FRAC_WORD_4(_z,1), 0, _b_f1, _b_f0,             \
-                   _FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2),        \
-                   _FP_FRAC_WORD_4(_z,1));                             \
-    __FP_FRAC_ADD_3(_FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2),       \
-                   _FP_FRAC_WORD_4(_z,1), 0, _c_f1, _c_f0,             \
-                   _FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2),        \
-                   _FP_FRAC_WORD_4(_z,1));                             \
-                                                                       \
-    /* Normalize since we know where the msb of the multiplicands      \
-       were (bit B), we know that the msb of the of the product is     \
-       at either 2B or 2B-1.  */                                       \
-    _FP_FRAC_SRS_4(_z, wfracbits-1, 2*wfracbits);                      \
-    R##_f0 = _FP_FRAC_WORD_4(_z,0);                                    \
-    R##_f1 = _FP_FRAC_WORD_4(_z,1);                                    \
-  } while (0)
-
-/* Given a 1W * 1W => 2W primitive, do the extended multiplication.
-   Do only 3 multiplications instead of four. This one is for machines
-   where multiplication is much more expensive than subtraction.  */
-
-#define _FP_MUL_MEAT_2_wide_3mul(wfracbits, R, X, Y, doit)             \
-  do {                                                                 \
-    _FP_FRAC_DECL_4(_z); _FP_FRAC_DECL_2(_b); _FP_FRAC_DECL_2(_c);     \
-    _FP_W_TYPE _d;                                                     \
-    int _c1, _c2;                                                      \
-                                                                       \
-    _b_f0 = X##_f0 + X##_f1;                                           \
-    _c1 = _b_f0 < X##_f0;                                              \
-    _b_f1 = Y##_f0 + Y##_f1;                                           \
-    _c2 = _b_f1 < Y##_f0;                                              \
-    doit(_d, _FP_FRAC_WORD_4(_z,0), X##_f0, Y##_f0);                   \
-    doit(_FP_FRAC_WORD_4(_z,2), _FP_FRAC_WORD_4(_z,1), _b_f0, _b_f1);  \
-    doit(_c_f1, _c_f0, X##_f1, Y##_f1);                                        \
-                                                                       \
-    _b_f0 &= -_c2;                                                     \
-    _b_f1 &= -_c1;                                                     \
-    __FP_FRAC_ADD_3(_FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2),       \
-                   _FP_FRAC_WORD_4(_z,1), (_c1 & _c2), 0, _d,          \
-                   0, _FP_FRAC_WORD_4(_z,2), _FP_FRAC_WORD_4(_z,1));   \
-    __FP_FRAC_ADDI_2(_FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2),      \
-                    _b_f0);                                            \
-    __FP_FRAC_ADDI_2(_FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2),      \
-                    _b_f1);                                            \
-    __FP_FRAC_DEC_3(_FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2),       \
-                   _FP_FRAC_WORD_4(_z,1),                              \
-                   0, _d, _FP_FRAC_WORD_4(_z,0));                      \
-    __FP_FRAC_DEC_3(_FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2),       \
-                   _FP_FRAC_WORD_4(_z,1), 0, _c_f1, _c_f0);            \
-    __FP_FRAC_ADD_2(_FP_FRAC_WORD_4(_z,3), _FP_FRAC_WORD_4(_z,2),      \
-                   _c_f1, _c_f0,                                       \
-                   _FP_FRAC_WORD_4(_z,3), _FP_FRAC_WORD_4(_z,2));      \
-                                                                       \
-    /* Normalize since we know where the msb of the multiplicands      \
-       were (bit B), we know that the msb of the of the product is     \
-       at either 2B or 2B-1.  */                                       \
-    _FP_FRAC_SRS_4(_z, wfracbits-1, 2*wfracbits);                      \
-    R##_f0 = _FP_FRAC_WORD_4(_z,0);                                    \
-    R##_f1 = _FP_FRAC_WORD_4(_z,1);                                    \
-  } while (0)
-
-#define _FP_MUL_MEAT_2_gmp(wfracbits, R, X, Y)                         \
-  do {                                                                 \
-    _FP_FRAC_DECL_4(_z);                                               \
-    _FP_W_TYPE _x[2], _y[2];                                           \
-    _x[0] = X##_f0; _x[1] = X##_f1;                                    \
-    _y[0] = Y##_f0; _y[1] = Y##_f1;                                    \
-                                                                       \
-    mpn_mul_n(_z_f, _x, _y, 2);                                                \
-                                                                       \
-    /* Normalize since we know where the msb of the multiplicands      \
-       were (bit B), we know that the msb of the of the product is     \
-       at either 2B or 2B-1.  */                                       \
-    _FP_FRAC_SRS_4(_z, wfracbits-1, 2*wfracbits);                      \
-    R##_f0 = _z_f[0];                                                  \
-    R##_f1 = _z_f[1];                                                  \
-  } while (0)
-
-/* Do at most 120x120=240 bits multiplication using double floating
-   point multiplication.  This is useful if floating point
-   multiplication has much bigger throughput than integer multiply.
-   It is supposed to work for _FP_W_TYPE_SIZE 64 and wfracbits
-   between 106 and 120 only.  
-   Caller guarantees that X and Y has (1LLL << (wfracbits - 1)) set.
-   SETFETZ is a macro which will disable all FPU exceptions and set rounding
-   towards zero,  RESETFE should optionally reset it back.  */
-
-#define _FP_MUL_MEAT_2_120_240_double(wfracbits, R, X, Y, setfetz, resetfe)    \
-  do {                                                                         \
-    static const double _const[] = {                                           \
-      /* 2^-24 */ 5.9604644775390625e-08,                                      \
-      /* 2^-48 */ 3.5527136788005009e-15,                                      \
-      /* 2^-72 */ 2.1175823681357508e-22,                                      \
-      /* 2^-96 */ 1.2621774483536189e-29,                                      \
-      /* 2^28 */ 2.68435456e+08,                                               \
-      /* 2^4 */ 1.600000e+01,                                                  \
-      /* 2^-20 */ 9.5367431640625e-07,                                         \
-      /* 2^-44 */ 5.6843418860808015e-14,                                      \
-      /* 2^-68 */ 3.3881317890172014e-21,                                      \
-      /* 2^-92 */ 2.0194839173657902e-28,                                      \
-      /* 2^-116 */ 1.2037062152420224e-35};                                    \
-    double _a240, _b240, _c240, _d240, _e240, _f240,                           \
-          _g240, _h240, _i240, _j240, _k240;                                   \
-    union { double d; UDItype i; } _l240, _m240, _n240, _o240,                 \
-                                  _p240, _q240, _r240, _s240;                  \
-    UDItype _t240, _u240, _v240, _w240, _x240, _y240 = 0;                      \
-                                                                               \
-    if (wfracbits < 106 || wfracbits > 120)                                    \
-      abort();                                                                 \
-                                                                               \
-    setfetz;                                                                   \
-                                                                               \
-    _e240 = (double)(long)(X##_f0 & 0xffffff);                                 \
-    _j240 = (double)(long)(Y##_f0 & 0xffffff);                                 \
-    _d240 = (double)(long)((X##_f0 >> 24) & 0xffffff);                         \
-    _i240 = (double)(long)((Y##_f0 >> 24) & 0xffffff);                         \
-    _c240 = (double)(long)(((X##_f1 << 16) & 0xffffff) | (X##_f0 >> 48));      \
-    _h240 = (double)(long)(((Y##_f1 << 16) & 0xffffff) | (Y##_f0 >> 48));      \
-    _b240 = (double)(long)((X##_f1 >> 8) & 0xffffff);                          \
-    _g240 = (double)(long)((Y##_f1 >> 8) & 0xffffff);                          \
-    _a240 = (double)(long)(X##_f1 >> 32);                                      \
-    _f240 = (double)(long)(Y##_f1 >> 32);                                      \
-    _e240 *= _const[3];                                                                \
-    _j240 *= _const[3];                                                                \
-    _d240 *= _const[2];                                                                \
-    _i240 *= _const[2];                                                                \
-    _c240 *= _const[1];                                                                \
-    _h240 *= _const[1];                                                                \
-    _b240 *= _const[0];                                                                \
-    _g240 *= _const[0];                                                                \
-    _s240.d =                                                        _e240*_j240;\
-    _r240.d =                                          _d240*_j240 + _e240*_i240;\
-    _q240.d =                            _c240*_j240 + _d240*_i240 + _e240*_h240;\
-    _p240.d =              _b240*_j240 + _c240*_i240 + _d240*_h240 + _e240*_g240;\
-    _o240.d = _a240*_j240 + _b240*_i240 + _c240*_h240 + _d240*_g240 + _e240*_f240;\
-    _n240.d = _a240*_i240 + _b240*_h240 + _c240*_g240 + _d240*_f240;           \
-    _m240.d = _a240*_h240 + _b240*_g240 + _c240*_f240;                         \
-    _l240.d = _a240*_g240 + _b240*_f240;                                       \
-    _k240 =   _a240*_f240;                                                     \
-    _r240.d += _s240.d;                                                                \
-    _q240.d += _r240.d;                                                                \
-    _p240.d += _q240.d;                                                                \
-    _o240.d += _p240.d;                                                                \
-    _n240.d += _o240.d;                                                                \
-    _m240.d += _n240.d;                                                                \
-    _l240.d += _m240.d;                                                                \
-    _k240 += _l240.d;                                                          \
-    _s240.d -= ((_const[10]+_s240.d)-_const[10]);                              \
-    _r240.d -= ((_const[9]+_r240.d)-_const[9]);                                        \
-    _q240.d -= ((_const[8]+_q240.d)-_const[8]);                                        \
-    _p240.d -= ((_const[7]+_p240.d)-_const[7]);                                        \
-    _o240.d += _const[7];                                                      \
-    _n240.d += _const[6];                                                      \
-    _m240.d += _const[5];                                                      \
-    _l240.d += _const[4];                                                      \
-    if (_s240.d != 0.0) _y240 = 1;                                             \
-    if (_r240.d != 0.0) _y240 = 1;                                             \
-    if (_q240.d != 0.0) _y240 = 1;                                             \
-    if (_p240.d != 0.0) _y240 = 1;                                             \
-    _t240 = (DItype)_k240;                                                     \
-    _u240 = _l240.i;                                                           \
-    _v240 = _m240.i;                                                           \
-    _w240 = _n240.i;                                                           \
-    _x240 = _o240.i;                                                           \
-    R##_f1 = (_t240 << (128 - (wfracbits - 1)))                                        \
-            | ((_u240 & 0xffffff) >> ((wfracbits - 1) - 104));                 \
-    R##_f0 = ((_u240 & 0xffffff) << (168 - (wfracbits - 1)))                   \
-            | ((_v240 & 0xffffff) << (144 - (wfracbits - 1)))                  \
-            | ((_w240 & 0xffffff) << (120 - (wfracbits - 1)))                  \
-            | ((_x240 & 0xffffff) >> ((wfracbits - 1) - 96))                   \
-            | _y240;                                                           \
-    resetfe;                                                                   \
-  } while (0)
-
-/*
- * Division algorithms:
- */
-
-#define _FP_DIV_MEAT_2_udiv(fs, R, X, Y)                               \
-  do {                                                                 \
-    _FP_W_TYPE _n_f2, _n_f1, _n_f0, _r_f1, _r_f0, _m_f1, _m_f0;                \
-    if (_FP_FRAC_GT_2(X, Y))                                           \
-      {                                                                        \
-       _n_f2 = X##_f1 >> 1;                                            \
-       _n_f1 = X##_f1 << (_FP_W_TYPE_SIZE - 1) | X##_f0 >> 1;          \
-       _n_f0 = X##_f0 << (_FP_W_TYPE_SIZE - 1);                        \
-      }                                                                        \
-    else                                                               \
-      {                                                                        \
-       R##_e--;                                                        \
-       _n_f2 = X##_f1;                                                 \
-       _n_f1 = X##_f0;                                                 \
-       _n_f0 = 0;                                                      \
-      }                                                                        \
-                                                                       \
-    /* Normalize, i.e. make the most significant bit of the            \
-       denominator set. */                                             \
-    _FP_FRAC_SLL_2(Y, _FP_WFRACXBITS_##fs);                            \
-                                                                       \
-    udiv_qrnnd(R##_f1, _r_f1, _n_f2, _n_f1, Y##_f1);                   \
-    umul_ppmm(_m_f1, _m_f0, R##_f1, Y##_f0);                           \
-    _r_f0 = _n_f0;                                                     \
-    if (_FP_FRAC_GT_2(_m, _r))                                         \
-      {                                                                        \
-       R##_f1--;                                                       \
-       _FP_FRAC_ADD_2(_r, Y, _r);                                      \
-       if (_FP_FRAC_GE_2(_r, Y) && _FP_FRAC_GT_2(_m, _r))              \
-         {                                                             \
-           R##_f1--;                                                   \
-           _FP_FRAC_ADD_2(_r, Y, _r);                                  \
-         }                                                             \
-      }                                                                        \
-    _FP_FRAC_DEC_2(_r, _m);                                            \
-                                                                       \
-    if (_r_f1 == Y##_f1)                                               \
-      {                                                                        \
-       /* This is a special case, not an optimization                  \
-          (_r/Y##_f1 would not fit into UWtype).                       \
-          As _r is guaranteed to be < Y,  R##_f0 can be either         \
-          (UWtype)-1 or (UWtype)-2.  But as we know what kind          \
-          of bits it is (sticky, guard, round),  we don't care.        \
-          We also don't care what the reminder is,  because the        \
-          guard bit will be set anyway.  -jj */                        \
-       R##_f0 = -1;                                                    \
-      }                                                                        \
-    else                                                               \
-      {                                                                        \
-       udiv_qrnnd(R##_f0, _r_f1, _r_f1, _r_f0, Y##_f1);                \
-       umul_ppmm(_m_f1, _m_f0, R##_f0, Y##_f0);                        \
-       _r_f0 = 0;                                                      \
-       if (_FP_FRAC_GT_2(_m, _r))                                      \
-         {                                                             \
-           R##_f0--;                                                   \
-           _FP_FRAC_ADD_2(_r, Y, _r);                                  \
-           if (_FP_FRAC_GE_2(_r, Y) && _FP_FRAC_GT_2(_m, _r))          \
-             {                                                         \
-               R##_f0--;                                               \
-               _FP_FRAC_ADD_2(_r, Y, _r);                              \
-             }                                                         \
-         }                                                             \
-       if (!_FP_FRAC_EQ_2(_r, _m))                                     \
-         R##_f0 |= _FP_WORK_STICKY;                                    \
-      }                                                                        \
-  } while (0)
-
-
-#define _FP_DIV_MEAT_2_gmp(fs, R, X, Y)                                        \
-  do {                                                                 \
-    _FP_W_TYPE _x[4], _y[2], _z[4];                                    \
-    _y[0] = Y##_f0; _y[1] = Y##_f1;                                    \
-    _x[0] = _x[3] = 0;                                                 \
-    if (_FP_FRAC_GT_2(X, Y))                                           \
-      {                                                                        \
-       R##_e++;                                                        \
-       _x[1] = (X##_f0 << (_FP_WFRACBITS_##fs-1 - _FP_W_TYPE_SIZE) |   \
-                X##_f1 >> (_FP_W_TYPE_SIZE -                           \
-                           (_FP_WFRACBITS_##fs-1 - _FP_W_TYPE_SIZE))); \
-       _x[2] = X##_f1 << (_FP_WFRACBITS_##fs-1 - _FP_W_TYPE_SIZE);     \
-      }                                                                        \
-    else                                                               \
-      {                                                                        \
-       _x[1] = (X##_f0 << (_FP_WFRACBITS_##fs - _FP_W_TYPE_SIZE) |     \
-                X##_f1 >> (_FP_W_TYPE_SIZE -                           \
-                           (_FP_WFRACBITS_##fs - _FP_W_TYPE_SIZE)));   \
-       _x[2] = X##_f1 << (_FP_WFRACBITS_##fs - _FP_W_TYPE_SIZE);       \
-      }                                                                        \
-                                                                       \
-    (void) mpn_divrem (_z, 0, _x, 4, _y, 2);                           \
-    R##_f1 = _z[1];                                                    \
-    R##_f0 = _z[0] | ((_x[0] | _x[1]) != 0);                           \
-  } while (0)
-
-
-/*
- * Square root algorithms:
- * We have just one right now, maybe Newton approximation
- * should be added for those machines where division is fast.
- */
-#define _FP_SQRT_MEAT_2(R, S, T, X, q)                 \
-  do {                                                 \
-    while (q)                                          \
-      {                                                        \
-       T##_f1 = S##_f1 + q;                            \
-       if (T##_f1 <= X##_f1)                           \
-         {                                             \
-           S##_f1 = T##_f1 + q;                        \
-           X##_f1 -= T##_f1;                           \
-           R##_f1 += q;                                \
-         }                                             \
-       _FP_FRAC_SLL_2(X, 1);                           \
-       q >>= 1;                                        \
-      }                                                        \
-    q = (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE - 1);                \
-    while (q != _FP_WORK_ROUND)                                \
-      {                                                        \
-       T##_f0 = S##_f0 + q;                            \
-       T##_f1 = S##_f1;                                \
-       if (T##_f1 < X##_f1 ||                          \
-           (T##_f1 == X##_f1 && T##_f0 <= X##_f0))     \
-         {                                             \
-           S##_f0 = T##_f0 + q;                        \
-           S##_f1 += (T##_f0 > S##_f0);                \
-           _FP_FRAC_DEC_2(X, T);                       \
-           R##_f0 += q;                                \
-         }                                             \
-       _FP_FRAC_SLL_2(X, 1);                           \
-       q >>= 1;                                        \
-      }                                                        \
-    if (X##_f0 | X##_f1)                               \
-      {                                                        \
-       if (S##_f1 < X##_f1 ||                          \
-           (S##_f1 == X##_f1 && S##_f0 < X##_f0))      \
-         R##_f0 |= _FP_WORK_ROUND;                     \
-       R##_f0 |= _FP_WORK_STICKY;                      \
-      }                                                        \
-  } while (0)
-
-
-/*
- * Assembly/disassembly for converting to/from integral types.  
- * No shifting or overflow handled here.
- */
-
-#define _FP_FRAC_ASSEMBLE_2(r, X, rsize)       \
-(void)((rsize <= _FP_W_TYPE_SIZE)              \
-       ? ({ r = X##_f0; })                     \
-       : ({                                    \
-           r = X##_f1;                         \
-           r <<= _FP_W_TYPE_SIZE;              \
-           r += X##_f0;                        \
-         }))
-
-#define _FP_FRAC_DISASSEMBLE_2(X, r, rsize)                            \
-  do {                                                                 \
-    X##_f0 = r;                                                                \
-    X##_f1 = (rsize <= _FP_W_TYPE_SIZE ? 0 : r >> _FP_W_TYPE_SIZE);    \
-  } while (0)
-
-/*
- * Convert FP values between word sizes
- */
-
-#define _FP_FRAC_COPY_1_2(D, S)                (D##_f = S##_f0)
-
-#define _FP_FRAC_COPY_2_1(D, S)                ((D##_f0 = S##_f), (D##_f1 = 0))
-
-#define _FP_FRAC_COPY_2_2(D,S)         _FP_FRAC_COPY_2(D,S)
diff --git a/gcc/config/soft-fp/op-4.h b/gcc/config/soft-fp/op-4.h
deleted file mode 100644 (file)
index 70b9faf..0000000
+++ /dev/null
@@ -1,688 +0,0 @@
-/* Software floating-point emulation.
-   Basic four-word fraction declaration and manipulation.
-   Copyright (C) 1997,1998,1999,2006,2007 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com),
-                 Jakub Jelinek (jj@ultra.linux.cz),
-                 David S. Miller (davem@redhat.com) and
-                 Peter Maydell (pmaydell@chiark.greenend.org.uk).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#define _FP_FRAC_DECL_4(X)     _FP_W_TYPE X##_f[4]
-#define _FP_FRAC_COPY_4(D,S)                   \
-  (D##_f[0] = S##_f[0], D##_f[1] = S##_f[1],   \
-   D##_f[2] = S##_f[2], D##_f[3] = S##_f[3])
-#define _FP_FRAC_SET_4(X,I)    __FP_FRAC_SET_4(X, I)
-#define _FP_FRAC_HIGH_4(X)     (X##_f[3])
-#define _FP_FRAC_LOW_4(X)      (X##_f[0])
-#define _FP_FRAC_WORD_4(X,w)   (X##_f[w])
-
-#define _FP_FRAC_SLL_4(X,N)                                            \
-  do {                                                                 \
-    _FP_I_TYPE _up, _down, _skip, _i;                                  \
-    _skip = (N) / _FP_W_TYPE_SIZE;                                     \
-    _up = (N) % _FP_W_TYPE_SIZE;                                       \
-    _down = _FP_W_TYPE_SIZE - _up;                                     \
-    if (!_up)                                                          \
-      for (_i = 3; _i >= _skip; --_i)                                  \
-       X##_f[_i] = X##_f[_i-_skip];                                    \
-    else                                                               \
-      {                                                                        \
-       for (_i = 3; _i > _skip; --_i)                                  \
-         X##_f[_i] = X##_f[_i-_skip] << _up                            \
-                     | X##_f[_i-_skip-1] >> _down;                     \
-       X##_f[_i--] = X##_f[0] << _up;                                  \
-      }                                                                        \
-    for (; _i >= 0; --_i)                                              \
-      X##_f[_i] = 0;                                                   \
-  } while (0)
-
-/* This one was broken too */
-#define _FP_FRAC_SRL_4(X,N)                                            \
-  do {                                                                 \
-    _FP_I_TYPE _up, _down, _skip, _i;                                  \
-    _skip = (N) / _FP_W_TYPE_SIZE;                                     \
-    _down = (N) % _FP_W_TYPE_SIZE;                                     \
-    _up = _FP_W_TYPE_SIZE - _down;                                     \
-    if (!_down)                                                                \
-      for (_i = 0; _i <= 3-_skip; ++_i)                                        \
-       X##_f[_i] = X##_f[_i+_skip];                                    \
-    else                                                               \
-      {                                                                        \
-       for (_i = 0; _i < 3-_skip; ++_i)                                \
-         X##_f[_i] = X##_f[_i+_skip] >> _down                          \
-                     | X##_f[_i+_skip+1] << _up;                       \
-       X##_f[_i++] = X##_f[3] >> _down;                                \
-      }                                                                        \
-    for (; _i < 4; ++_i)                                               \
-      X##_f[_i] = 0;                                                   \
-  } while (0)
-
-
-/* Right shift with sticky-lsb. 
- * What this actually means is that we do a standard right-shift,
- * but that if any of the bits that fall off the right hand side
- * were one then we always set the LSbit.
- */
-#define _FP_FRAC_SRST_4(X,S,N,size)                    \
-  do {                                                 \
-    _FP_I_TYPE _up, _down, _skip, _i;                  \
-    _FP_W_TYPE _s;                                     \
-    _skip = (N) / _FP_W_TYPE_SIZE;                     \
-    _down = (N) % _FP_W_TYPE_SIZE;                     \
-    _up = _FP_W_TYPE_SIZE - _down;                     \
-    for (_s = _i = 0; _i < _skip; ++_i)                        \
-      _s |= X##_f[_i];                                 \
-    if (!_down)                                                \
-      for (_i = 0; _i <= 3-_skip; ++_i)                        \
-       X##_f[_i] = X##_f[_i+_skip];                    \
-    else                                               \
-      {                                                        \
-       _s |= X##_f[_i] << _up;                         \
-       for (_i = 0; _i < 3-_skip; ++_i)                \
-         X##_f[_i] = X##_f[_i+_skip] >> _down          \
-                     | X##_f[_i+_skip+1] << _up;       \
-       X##_f[_i++] = X##_f[3] >> _down;                \
-      }                                                        \
-    for (; _i < 4; ++_i)                               \
-      X##_f[_i] = 0;                                   \
-    S = (_s != 0);                                     \
-  } while (0)
-
-#define _FP_FRAC_SRS_4(X,N,size)               \
-  do {                                         \
-    int _sticky;                               \
-    _FP_FRAC_SRST_4(X, _sticky, N, size);      \
-    X##_f[0] |= _sticky;                       \
-  } while (0)
-
-#define _FP_FRAC_ADD_4(R,X,Y)                                          \
-  __FP_FRAC_ADD_4(R##_f[3], R##_f[2], R##_f[1], R##_f[0],              \
-                 X##_f[3], X##_f[2], X##_f[1], X##_f[0],               \
-                 Y##_f[3], Y##_f[2], Y##_f[1], Y##_f[0])
-
-#define _FP_FRAC_SUB_4(R,X,Y)                                          \
-  __FP_FRAC_SUB_4(R##_f[3], R##_f[2], R##_f[1], R##_f[0],              \
-                 X##_f[3], X##_f[2], X##_f[1], X##_f[0],               \
-                 Y##_f[3], Y##_f[2], Y##_f[1], Y##_f[0])
-
-#define _FP_FRAC_DEC_4(X,Y)                                            \
-  __FP_FRAC_DEC_4(X##_f[3], X##_f[2], X##_f[1], X##_f[0],              \
-                 Y##_f[3], Y##_f[2], Y##_f[1], Y##_f[0])
-
-#define _FP_FRAC_ADDI_4(X,I)                                           \
-  __FP_FRAC_ADDI_4(X##_f[3], X##_f[2], X##_f[1], X##_f[0], I)
-
-#define _FP_ZEROFRAC_4  0,0,0,0
-#define _FP_MINFRAC_4   0,0,0,1
-#define _FP_MAXFRAC_4  (~(_FP_WS_TYPE)0), (~(_FP_WS_TYPE)0), (~(_FP_WS_TYPE)0), (~(_FP_WS_TYPE)0)
-
-#define _FP_FRAC_ZEROP_4(X)     ((X##_f[0] | X##_f[1] | X##_f[2] | X##_f[3]) == 0)
-#define _FP_FRAC_NEGP_4(X)      ((_FP_WS_TYPE)X##_f[3] < 0)
-#define _FP_FRAC_OVERP_4(fs,X)  (_FP_FRAC_HIGH_##fs(X) & _FP_OVERFLOW_##fs)
-#define _FP_FRAC_CLEAR_OVERP_4(fs,X)  (_FP_FRAC_HIGH_##fs(X) &= ~_FP_OVERFLOW_##fs)
-
-#define _FP_FRAC_EQ_4(X,Y)                             \
- (X##_f[0] == Y##_f[0] && X##_f[1] == Y##_f[1]         \
-  && X##_f[2] == Y##_f[2] && X##_f[3] == Y##_f[3])
-
-#define _FP_FRAC_GT_4(X,Y)                             \
- (X##_f[3] > Y##_f[3] ||                               \
-  (X##_f[3] == Y##_f[3] && (X##_f[2] > Y##_f[2] ||     \
-   (X##_f[2] == Y##_f[2] && (X##_f[1] > Y##_f[1] ||    \
-    (X##_f[1] == Y##_f[1] && X##_f[0] > Y##_f[0])      \
-   ))                                                  \
-  ))                                                   \
- )
-
-#define _FP_FRAC_GE_4(X,Y)                             \
- (X##_f[3] > Y##_f[3] ||                               \
-  (X##_f[3] == Y##_f[3] && (X##_f[2] > Y##_f[2] ||     \
-   (X##_f[2] == Y##_f[2] && (X##_f[1] > Y##_f[1] ||    \
-    (X##_f[1] == Y##_f[1] && X##_f[0] >= Y##_f[0])     \
-   ))                                                  \
-  ))                                                   \
- )
-
-
-#define _FP_FRAC_CLZ_4(R,X)            \
-  do {                                 \
-    if (X##_f[3])                      \
-    {                                  \
-       __FP_CLZ(R,X##_f[3]);           \
-    }                                  \
-    else if (X##_f[2])                 \
-    {                                  \
-       __FP_CLZ(R,X##_f[2]);           \
-       R += _FP_W_TYPE_SIZE;           \
-    }                                  \
-    else if (X##_f[1])                 \
-    {                                  \
-       __FP_CLZ(R,X##_f[1]);           \
-       R += _FP_W_TYPE_SIZE*2;         \
-    }                                  \
-    else                               \
-    {                                  \
-       __FP_CLZ(R,X##_f[0]);           \
-       R += _FP_W_TYPE_SIZE*3;         \
-    }                                  \
-  } while(0)
-
-
-#define _FP_UNPACK_RAW_4(fs, X, val)                           \
-  do {                                                         \
-    union _FP_UNION_##fs _flo; _flo.flt = (val);               \
-    X##_f[0] = _flo.bits.frac0;                                        \
-    X##_f[1] = _flo.bits.frac1;                                        \
-    X##_f[2] = _flo.bits.frac2;                                        \
-    X##_f[3] = _flo.bits.frac3;                                        \
-    X##_e  = _flo.bits.exp;                                    \
-    X##_s  = _flo.bits.sign;                                   \
-  } while (0)
-
-#define _FP_UNPACK_RAW_4_P(fs, X, val)                         \
-  do {                                                         \
-    union _FP_UNION_##fs *_flo =                               \
-      (union _FP_UNION_##fs *)(val);                           \
-                                                               \
-    X##_f[0] = _flo->bits.frac0;                               \
-    X##_f[1] = _flo->bits.frac1;                               \
-    X##_f[2] = _flo->bits.frac2;                               \
-    X##_f[3] = _flo->bits.frac3;                               \
-    X##_e  = _flo->bits.exp;                                   \
-    X##_s  = _flo->bits.sign;                                  \
-  } while (0)
-
-#define _FP_PACK_RAW_4(fs, val, X)                             \
-  do {                                                         \
-    union _FP_UNION_##fs _flo;                                 \
-    _flo.bits.frac0 = X##_f[0];                                        \
-    _flo.bits.frac1 = X##_f[1];                                        \
-    _flo.bits.frac2 = X##_f[2];                                        \
-    _flo.bits.frac3 = X##_f[3];                                        \
-    _flo.bits.exp   = X##_e;                                   \
-    _flo.bits.sign  = X##_s;                                   \
-    (val) = _flo.flt;                                          \
-  } while (0)
-
-#define _FP_PACK_RAW_4_P(fs, val, X)                           \
-  do {                                                         \
-    union _FP_UNION_##fs *_flo =                               \
-      (union _FP_UNION_##fs *)(val);                           \
-                                                               \
-    _flo->bits.frac0 = X##_f[0];                               \
-    _flo->bits.frac1 = X##_f[1];                               \
-    _flo->bits.frac2 = X##_f[2];                               \
-    _flo->bits.frac3 = X##_f[3];                               \
-    _flo->bits.exp   = X##_e;                                  \
-    _flo->bits.sign  = X##_s;                                  \
-  } while (0)
-
-/*
- * Multiplication algorithms:
- */
-
-/* Given a 1W * 1W => 2W primitive, do the extended multiplication.  */
-
-#define _FP_MUL_MEAT_4_wide(wfracbits, R, X, Y, doit)                      \
-  do {                                                                     \
-    _FP_FRAC_DECL_8(_z); _FP_FRAC_DECL_2(_b); _FP_FRAC_DECL_2(_c);         \
-    _FP_FRAC_DECL_2(_d); _FP_FRAC_DECL_2(_e); _FP_FRAC_DECL_2(_f);         \
-                                                                           \
-    doit(_FP_FRAC_WORD_8(_z,1), _FP_FRAC_WORD_8(_z,0), X##_f[0], Y##_f[0]); \
-    doit(_b_f1, _b_f0, X##_f[0], Y##_f[1]);                                \
-    doit(_c_f1, _c_f0, X##_f[1], Y##_f[0]);                                \
-    doit(_d_f1, _d_f0, X##_f[1], Y##_f[1]);                                \
-    doit(_e_f1, _e_f0, X##_f[0], Y##_f[2]);                                \
-    doit(_f_f1, _f_f0, X##_f[2], Y##_f[0]);                                \
-    __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,3),_FP_FRAC_WORD_8(_z,2),           \
-                   _FP_FRAC_WORD_8(_z,1), 0,_b_f1,_b_f0,                   \
-                   0,0,_FP_FRAC_WORD_8(_z,1));                             \
-    __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,3),_FP_FRAC_WORD_8(_z,2),           \
-                   _FP_FRAC_WORD_8(_z,1), 0,_c_f1,_c_f0,                   \
-                   _FP_FRAC_WORD_8(_z,3),_FP_FRAC_WORD_8(_z,2),            \
-                   _FP_FRAC_WORD_8(_z,1));                                 \
-    __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,4),_FP_FRAC_WORD_8(_z,3),           \
-                   _FP_FRAC_WORD_8(_z,2), 0,_d_f1,_d_f0,                   \
-                   0,_FP_FRAC_WORD_8(_z,3),_FP_FRAC_WORD_8(_z,2));         \
-    __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,4),_FP_FRAC_WORD_8(_z,3),           \
-                   _FP_FRAC_WORD_8(_z,2), 0,_e_f1,_e_f0,                   \
-                   _FP_FRAC_WORD_8(_z,4),_FP_FRAC_WORD_8(_z,3),            \
-                   _FP_FRAC_WORD_8(_z,2));                                 \
-    __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,4),_FP_FRAC_WORD_8(_z,3),           \
-                   _FP_FRAC_WORD_8(_z,2), 0,_f_f1,_f_f0,                   \
-                   _FP_FRAC_WORD_8(_z,4),_FP_FRAC_WORD_8(_z,3),            \
-                   _FP_FRAC_WORD_8(_z,2));                                 \
-    doit(_b_f1, _b_f0, X##_f[0], Y##_f[3]);                                \
-    doit(_c_f1, _c_f0, X##_f[3], Y##_f[0]);                                \
-    doit(_d_f1, _d_f0, X##_f[1], Y##_f[2]);                                \
-    doit(_e_f1, _e_f0, X##_f[2], Y##_f[1]);                                \
-    __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,5),_FP_FRAC_WORD_8(_z,4),           \
-                   _FP_FRAC_WORD_8(_z,3), 0,_b_f1,_b_f0,                   \
-                   0,_FP_FRAC_WORD_8(_z,4),_FP_FRAC_WORD_8(_z,3));         \
-    __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,5),_FP_FRAC_WORD_8(_z,4),           \
-                   _FP_FRAC_WORD_8(_z,3), 0,_c_f1,_c_f0,                   \
-                   _FP_FRAC_WORD_8(_z,5),_FP_FRAC_WORD_8(_z,4),            \
-                   _FP_FRAC_WORD_8(_z,3));                                 \
-    __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,5),_FP_FRAC_WORD_8(_z,4),           \
-                   _FP_FRAC_WORD_8(_z,3), 0,_d_f1,_d_f0,                   \
-                   _FP_FRAC_WORD_8(_z,5),_FP_FRAC_WORD_8(_z,4),            \
-                   _FP_FRAC_WORD_8(_z,3));                                 \
-    __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,5),_FP_FRAC_WORD_8(_z,4),           \
-                   _FP_FRAC_WORD_8(_z,3), 0,_e_f1,_e_f0,                   \
-                   _FP_FRAC_WORD_8(_z,5),_FP_FRAC_WORD_8(_z,4),            \
-                   _FP_FRAC_WORD_8(_z,3));                                 \
-    doit(_b_f1, _b_f0, X##_f[2], Y##_f[2]);                                \
-    doit(_c_f1, _c_f0, X##_f[1], Y##_f[3]);                                \
-    doit(_d_f1, _d_f0, X##_f[3], Y##_f[1]);                                \
-    doit(_e_f1, _e_f0, X##_f[2], Y##_f[3]);                                \
-    doit(_f_f1, _f_f0, X##_f[3], Y##_f[2]);                                \
-    __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,6),_FP_FRAC_WORD_8(_z,5),           \
-                   _FP_FRAC_WORD_8(_z,4), 0,_b_f1,_b_f0,                   \
-                   0,_FP_FRAC_WORD_8(_z,5),_FP_FRAC_WORD_8(_z,4));         \
-    __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,6),_FP_FRAC_WORD_8(_z,5),           \
-                   _FP_FRAC_WORD_8(_z,4), 0,_c_f1,_c_f0,                   \
-                   _FP_FRAC_WORD_8(_z,6),_FP_FRAC_WORD_8(_z,5),            \
-                   _FP_FRAC_WORD_8(_z,4));                                 \
-    __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,6),_FP_FRAC_WORD_8(_z,5),           \
-                   _FP_FRAC_WORD_8(_z,4), 0,_d_f1,_d_f0,                   \
-                   _FP_FRAC_WORD_8(_z,6),_FP_FRAC_WORD_8(_z,5),            \
-                   _FP_FRAC_WORD_8(_z,4));                                 \
-    __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,7),_FP_FRAC_WORD_8(_z,6),           \
-                   _FP_FRAC_WORD_8(_z,5), 0,_e_f1,_e_f0,                   \
-                   0,_FP_FRAC_WORD_8(_z,6),_FP_FRAC_WORD_8(_z,5));         \
-    __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,7),_FP_FRAC_WORD_8(_z,6),           \
-                   _FP_FRAC_WORD_8(_z,5), 0,_f_f1,_f_f0,                   \
-                   _FP_FRAC_WORD_8(_z,7),_FP_FRAC_WORD_8(_z,6),            \
-                   _FP_FRAC_WORD_8(_z,5));                                 \
-    doit(_b_f1, _b_f0, X##_f[3], Y##_f[3]);                                \
-    __FP_FRAC_ADD_2(_FP_FRAC_WORD_8(_z,7),_FP_FRAC_WORD_8(_z,6),           \
-                   _b_f1,_b_f0,                                            \
-                   _FP_FRAC_WORD_8(_z,7),_FP_FRAC_WORD_8(_z,6));           \
-                                                                           \
-    /* Normalize since we know where the msb of the multiplicands          \
-       were (bit B), we know that the msb of the of the product is         \
-       at either 2B or 2B-1.  */                                           \
-    _FP_FRAC_SRS_8(_z, wfracbits-1, 2*wfracbits);                          \
-    __FP_FRAC_SET_4(R, _FP_FRAC_WORD_8(_z,3), _FP_FRAC_WORD_8(_z,2),       \
-                   _FP_FRAC_WORD_8(_z,1), _FP_FRAC_WORD_8(_z,0));          \
-  } while (0)
-
-#define _FP_MUL_MEAT_4_gmp(wfracbits, R, X, Y)                             \
-  do {                                                                     \
-    _FP_FRAC_DECL_8(_z);                                                   \
-                                                                           \
-    mpn_mul_n(_z_f, _x_f, _y_f, 4);                                        \
-                                                                           \
-    /* Normalize since we know where the msb of the multiplicands          \
-       were (bit B), we know that the msb of the of the product is         \
-       at either 2B or 2B-1.  */                                           \
-    _FP_FRAC_SRS_8(_z, wfracbits-1, 2*wfracbits);                          \
-    __FP_FRAC_SET_4(R, _FP_FRAC_WORD_8(_z,3), _FP_FRAC_WORD_8(_z,2),       \
-                   _FP_FRAC_WORD_8(_z,1), _FP_FRAC_WORD_8(_z,0));          \
-  } while (0)
-
-/*
- * Helper utility for _FP_DIV_MEAT_4_udiv:
- * pppp = m * nnn
- */
-#define umul_ppppmnnn(p3,p2,p1,p0,m,n2,n1,n0)                              \
-  do {                                                                     \
-    UWtype _t;                                                             \
-    umul_ppmm(p1,p0,m,n0);                                                 \
-    umul_ppmm(p2,_t,m,n1);                                                 \
-    __FP_FRAC_ADDI_2(p2,p1,_t);                                                    \
-    umul_ppmm(p3,_t,m,n2);                                                 \
-    __FP_FRAC_ADDI_2(p3,p2,_t);                                                    \
-  } while (0)
-
-/*
- * Division algorithms:
- */
-
-#define _FP_DIV_MEAT_4_udiv(fs, R, X, Y)                                   \
-  do {                                                                     \
-    int _i;                                                                \
-    _FP_FRAC_DECL_4(_n); _FP_FRAC_DECL_4(_m);                              \
-    _FP_FRAC_SET_4(_n, _FP_ZEROFRAC_4);                                            \
-    if (_FP_FRAC_GT_4(X, Y))                                               \
-      {                                                                            \
-       _n_f[3] = X##_f[0] << (_FP_W_TYPE_SIZE - 1);                        \
-       _FP_FRAC_SRL_4(X, 1);                                               \
-      }                                                                            \
-    else                                                                   \
-      R##_e--;                                                             \
-                                                                           \
-    /* Normalize, i.e. make the most significant bit of the                \
-       denominator set. */                                                 \
-    _FP_FRAC_SLL_4(Y, _FP_WFRACXBITS_##fs);                                \
-                                                                           \
-    for (_i = 3; ; _i--)                                                   \
-      {                                                                            \
-        if (X##_f[3] == Y##_f[3])                                          \
-          {                                                                \
-            /* This is a special case, not an optimization                 \
-               (X##_f[3]/Y##_f[3] would not fit into UWtype).              \
-               As X## is guaranteed to be < Y,  R##_f[_i] can be either            \
-               (UWtype)-1 or (UWtype)-2.  */                               \
-            R##_f[_i] = -1;                                                \
-            if (!_i)                                                       \
-             break;                                                        \
-            __FP_FRAC_SUB_4(X##_f[3], X##_f[2], X##_f[1], X##_f[0],        \
-                           Y##_f[2], Y##_f[1], Y##_f[0], 0,                \
-                           X##_f[2], X##_f[1], X##_f[0], _n_f[_i]);        \
-            _FP_FRAC_SUB_4(X, Y, X);                                       \
-            if (X##_f[3] > Y##_f[3])                                       \
-              {                                                                    \
-                R##_f[_i] = -2;                                                    \
-                _FP_FRAC_ADD_4(X, Y, X);                                   \
-              }                                                                    \
-          }                                                                \
-        else                                                               \
-          {                                                                \
-            udiv_qrnnd(R##_f[_i], X##_f[3], X##_f[3], X##_f[2], Y##_f[3]);  \
-            umul_ppppmnnn(_m_f[3], _m_f[2], _m_f[1], _m_f[0],              \
-                         R##_f[_i], Y##_f[2], Y##_f[1], Y##_f[0]);         \
-            X##_f[2] = X##_f[1];                                           \
-            X##_f[1] = X##_f[0];                                           \
-            X##_f[0] = _n_f[_i];                                           \
-            if (_FP_FRAC_GT_4(_m, X))                                      \
-              {                                                                    \
-                R##_f[_i]--;                                               \
-                _FP_FRAC_ADD_4(X, Y, X);                                   \
-                if (_FP_FRAC_GE_4(X, Y) && _FP_FRAC_GT_4(_m, X))           \
-                  {                                                        \
-                   R##_f[_i]--;                                            \
-                   _FP_FRAC_ADD_4(X, Y, X);                                \
-                  }                                                        \
-              }                                                                    \
-            _FP_FRAC_DEC_4(X, _m);                                         \
-            if (!_i)                                                       \
-             {                                                             \
-               if (!_FP_FRAC_EQ_4(X, _m))                                  \
-                 R##_f[0] |= _FP_WORK_STICKY;                              \
-               break;                                                      \
-             }                                                             \
-          }                                                                \
-      }                                                                            \
-  } while (0)
-
-
-/*
- * Square root algorithms:
- * We have just one right now, maybe Newton approximation
- * should be added for those machines where division is fast.
- */
-#define _FP_SQRT_MEAT_4(R, S, T, X, q)                         \
-  do {                                                         \
-    while (q)                                                  \
-      {                                                                \
-       T##_f[3] = S##_f[3] + q;                                \
-       if (T##_f[3] <= X##_f[3])                               \
-         {                                                     \
-           S##_f[3] = T##_f[3] + q;                            \
-           X##_f[3] -= T##_f[3];                               \
-           R##_f[3] += q;                                      \
-         }                                                     \
-       _FP_FRAC_SLL_4(X, 1);                                   \
-       q >>= 1;                                                \
-      }                                                                \
-    q = (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE - 1);                        \
-    while (q)                                                  \
-      {                                                                \
-       T##_f[2] = S##_f[2] + q;                                \
-       T##_f[3] = S##_f[3];                                    \
-       if (T##_f[3] < X##_f[3] ||                              \
-           (T##_f[3] == X##_f[3] && T##_f[2] <= X##_f[2]))     \
-         {                                                     \
-           S##_f[2] = T##_f[2] + q;                            \
-           S##_f[3] += (T##_f[2] > S##_f[2]);                  \
-           __FP_FRAC_DEC_2(X##_f[3], X##_f[2],                 \
-                           T##_f[3], T##_f[2]);                \
-           R##_f[2] += q;                                      \
-         }                                                     \
-       _FP_FRAC_SLL_4(X, 1);                                   \
-       q >>= 1;                                                \
-      }                                                                \
-    q = (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE - 1);                        \
-    while (q)                                                  \
-      {                                                                \
-       T##_f[1] = S##_f[1] + q;                                \
-       T##_f[2] = S##_f[2];                                    \
-       T##_f[3] = S##_f[3];                                    \
-       if (T##_f[3] < X##_f[3] ||                              \
-           (T##_f[3] == X##_f[3] && (T##_f[2] < X##_f[2] ||    \
-            (T##_f[2] == X##_f[2] && T##_f[1] <= X##_f[1]))))  \
-         {                                                     \
-           S##_f[1] = T##_f[1] + q;                            \
-           S##_f[2] += (T##_f[1] > S##_f[1]);                  \
-           S##_f[3] += (T##_f[2] > S##_f[2]);                  \
-           __FP_FRAC_DEC_3(X##_f[3], X##_f[2], X##_f[1],       \
-                           T##_f[3], T##_f[2], T##_f[1]);      \
-           R##_f[1] += q;                                      \
-         }                                                     \
-       _FP_FRAC_SLL_4(X, 1);                                   \
-       q >>= 1;                                                \
-      }                                                                \
-    q = (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE - 1);                        \
-    while (q != _FP_WORK_ROUND)                                        \
-      {                                                                \
-       T##_f[0] = S##_f[0] + q;                                \
-       T##_f[1] = S##_f[1];                                    \
-       T##_f[2] = S##_f[2];                                    \
-       T##_f[3] = S##_f[3];                                    \
-       if (_FP_FRAC_GE_4(X,T))                                 \
-         {                                                     \
-           S##_f[0] = T##_f[0] + q;                            \
-           S##_f[1] += (T##_f[0] > S##_f[0]);                  \
-           S##_f[2] += (T##_f[1] > S##_f[1]);                  \
-           S##_f[3] += (T##_f[2] > S##_f[2]);                  \
-           _FP_FRAC_DEC_4(X, T);                               \
-           R##_f[0] += q;                                      \
-         }                                                     \
-       _FP_FRAC_SLL_4(X, 1);                                   \
-       q >>= 1;                                                \
-      }                                                                \
-    if (!_FP_FRAC_ZEROP_4(X))                                  \
-      {                                                                \
-       if (_FP_FRAC_GT_4(X,S))                                 \
-         R##_f[0] |= _FP_WORK_ROUND;                           \
-       R##_f[0] |= _FP_WORK_STICKY;                            \
-      }                                                                \
-  } while (0)
-
-
-/*
- * Internals 
- */
-
-#define __FP_FRAC_SET_4(X,I3,I2,I1,I0)                                 \
-  (X##_f[3] = I3, X##_f[2] = I2, X##_f[1] = I1, X##_f[0] = I0)
-
-#ifndef __FP_FRAC_ADD_3
-#define __FP_FRAC_ADD_3(r2,r1,r0,x2,x1,x0,y2,y1,y0)            \
-  do {                                                         \
-    _FP_W_TYPE _c1, _c2;                                       \
-    r0 = x0 + y0;                                              \
-    _c1 = r0 < x0;                                             \
-    r1 = x1 + y1;                                              \
-    _c2 = r1 < x1;                                             \
-    r1 += _c1;                                                 \
-    _c2 |= r1 < _c1;                                           \
-    r2 = x2 + y2 + _c2;                                                \
-  } while (0)
-#endif
-
-#ifndef __FP_FRAC_ADD_4
-#define __FP_FRAC_ADD_4(r3,r2,r1,r0,x3,x2,x1,x0,y3,y2,y1,y0)   \
-  do {                                                         \
-    _FP_W_TYPE _c1, _c2, _c3;                                  \
-    r0 = x0 + y0;                                              \
-    _c1 = r0 < x0;                                             \
-    r1 = x1 + y1;                                              \
-    _c2 = r1 < x1;                                             \
-    r1 += _c1;                                                 \
-    _c2 |= r1 < _c1;                                           \
-    r2 = x2 + y2;                                              \
-    _c3 = r2 < x2;                                             \
-    r2 += _c2;                                                 \
-    _c3 |= r2 < _c2;                                           \
-    r3 = x3 + y3 + _c3;                                                \
-  } while (0)
-#endif
-
-#ifndef __FP_FRAC_SUB_3
-#define __FP_FRAC_SUB_3(r2,r1,r0,x2,x1,x0,y2,y1,y0)            \
-  do {                                                         \
-    _FP_W_TYPE _c1, _c2;                                       \
-    r0 = x0 - y0;                                              \
-    _c1 = r0 > x0;                                             \
-    r1 = x1 - y1;                                              \
-    _c2 = r1 > x1;                                             \
-    r1 -= _c1;                                                 \
-    _c2 |= _c1 && (y1 == x1);                                  \
-    r2 = x2 - y2 - _c2;                                                \
-  } while (0)
-#endif
-
-#ifndef __FP_FRAC_SUB_4
-#define __FP_FRAC_SUB_4(r3,r2,r1,r0,x3,x2,x1,x0,y3,y2,y1,y0)   \
-  do {                                                         \
-    _FP_W_TYPE _c1, _c2, _c3;                                  \
-    r0 = x0 - y0;                                              \
-    _c1 = r0 > x0;                                             \
-    r1 = x1 - y1;                                              \
-    _c2 = r1 > x1;                                             \
-    r1 -= _c1;                                                 \
-    _c2 |= _c1 && (y1 == x1);                                  \
-    r2 = x2 - y2;                                              \
-    _c3 = r2 > x2;                                             \
-    r2 -= _c2;                                                 \
-    _c3 |= _c2 && (y2 == x2);                                  \
-    r3 = x3 - y3 - _c3;                                                \
-  } while (0)
-#endif
-
-#ifndef __FP_FRAC_DEC_3
-#define __FP_FRAC_DEC_3(x2,x1,x0,y2,y1,y0)                             \
-  do {                                                                 \
-    UWtype _t0, _t1, _t2;                                              \
-    _t0 = x0, _t1 = x1, _t2 = x2;                                      \
-    __FP_FRAC_SUB_3 (x2, x1, x0, _t2, _t1, _t0, y2, y1, y0);           \
-  } while (0)
-#endif
-
-#ifndef __FP_FRAC_DEC_4
-#define __FP_FRAC_DEC_4(x3,x2,x1,x0,y3,y2,y1,y0)                       \
-  do {                                                                 \
-    UWtype _t0, _t1, _t2, _t3;                                         \
-    _t0 = x0, _t1 = x1, _t2 = x2, _t3 = x3;                            \
-    __FP_FRAC_SUB_4 (x3,x2,x1,x0,_t3,_t2,_t1,_t0, y3,y2,y1,y0);                \
-  } while (0)
-#endif
-
-#ifndef __FP_FRAC_ADDI_4
-#define __FP_FRAC_ADDI_4(x3,x2,x1,x0,i)                                        \
-  do {                                                                 \
-    UWtype _t;                                                         \
-    _t = ((x0 += i) < i);                                              \
-    x1 += _t; _t = (x1 < _t);                                          \
-    x2 += _t; _t = (x2 < _t);                                          \
-    x3 += _t;                                                          \
-  } while (0)
-#endif
-
-/* Convert FP values between word sizes. This appears to be more
- * complicated than I'd have expected it to be, so these might be
- * wrong... These macros are in any case somewhat bogus because they
- * use information about what various FRAC_n variables look like 
- * internally [eg, that 2 word vars are X_f0 and x_f1]. But so do
- * the ones in op-2.h and op-1.h. 
- */
-#define _FP_FRAC_COPY_1_4(D, S)                (D##_f = S##_f[0])
-
-#define _FP_FRAC_COPY_2_4(D, S)                        \
-do {                                           \
-  D##_f0 = S##_f[0];                           \
-  D##_f1 = S##_f[1];                           \
-} while (0)
-
-/* Assembly/disassembly for converting to/from integral types.  
- * No shifting or overflow handled here.
- */
-/* Put the FP value X into r, which is an integer of size rsize. */
-#define _FP_FRAC_ASSEMBLE_4(r, X, rsize)                               \
-  do {                                                                 \
-    if (rsize <= _FP_W_TYPE_SIZE)                                      \
-      r = X##_f[0];                                                    \
-    else if (rsize <= 2*_FP_W_TYPE_SIZE)                               \
-    {                                                                  \
-      r = X##_f[1];                                                    \
-      r <<= _FP_W_TYPE_SIZE;                                           \
-      r += X##_f[0];                                                   \
-    }                                                                  \
-    else                                                               \
-    {                                                                  \
-      /* I'm feeling lazy so we deal with int == 3words (implausible)*/        \
-      /* and int == 4words as a single case.                    */     \
-      r = X##_f[3];                                                    \
-      r <<= _FP_W_TYPE_SIZE;                                           \
-      r += X##_f[2];                                                   \
-      r <<= _FP_W_TYPE_SIZE;                                           \
-      r += X##_f[1];                                                   \
-      r <<= _FP_W_TYPE_SIZE;                                           \
-      r += X##_f[0];                                                   \
-    }                                                                  \
-  } while (0)
-
-/* "No disassemble Number Five!" */
-/* move an integer of size rsize into X's fractional part. We rely on
- * the _f[] array consisting of words of size _FP_W_TYPE_SIZE to avoid
- * having to mask the values we store into it.
- */
-#define _FP_FRAC_DISASSEMBLE_4(X, r, rsize)                            \
-  do {                                                                 \
-    X##_f[0] = r;                                                      \
-    X##_f[1] = (rsize <= _FP_W_TYPE_SIZE ? 0 : r >> _FP_W_TYPE_SIZE);  \
-    X##_f[2] = (rsize <= 2*_FP_W_TYPE_SIZE ? 0 : r >> 2*_FP_W_TYPE_SIZE); \
-    X##_f[3] = (rsize <= 3*_FP_W_TYPE_SIZE ? 0 : r >> 3*_FP_W_TYPE_SIZE); \
-  } while (0);
-
-#define _FP_FRAC_COPY_4_1(D, S)                        \
-do {                                           \
-  D##_f[0] = S##_f;                            \
-  D##_f[1] = D##_f[2] = D##_f[3] = 0;          \
-} while (0)
-
-#define _FP_FRAC_COPY_4_2(D, S)                        \
-do {                                           \
-  D##_f[0] = S##_f0;                           \
-  D##_f[1] = S##_f1;                           \
-  D##_f[2] = D##_f[3] = 0;                     \
-} while (0)
-
-#define _FP_FRAC_COPY_4_4(D,S) _FP_FRAC_COPY_4(D,S)
diff --git a/gcc/config/soft-fp/op-8.h b/gcc/config/soft-fp/op-8.h
deleted file mode 100644 (file)
index e0612a5..0000000
+++ /dev/null
@@ -1,111 +0,0 @@
-/* Software floating-point emulation.
-   Basic eight-word fraction declaration and manipulation.
-   Copyright (C) 1997,1998,1999,2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com),
-                 Jakub Jelinek (jj@ultra.linux.cz) and
-                 Peter Maydell (pmaydell@chiark.greenend.org.uk).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-/* We need just a few things from here for op-4, if we ever need some
-   other macros, they can be added. */
-#define _FP_FRAC_DECL_8(X)     _FP_W_TYPE X##_f[8]
-#define _FP_FRAC_HIGH_8(X)     (X##_f[7])
-#define _FP_FRAC_LOW_8(X)      (X##_f[0])
-#define _FP_FRAC_WORD_8(X,w)   (X##_f[w])
-
-#define _FP_FRAC_SLL_8(X,N)                                            \
-  do {                                                                 \
-    _FP_I_TYPE _up, _down, _skip, _i;                                  \
-    _skip = (N) / _FP_W_TYPE_SIZE;                                     \
-    _up = (N) % _FP_W_TYPE_SIZE;                                       \
-    _down = _FP_W_TYPE_SIZE - _up;                                     \
-    if (!_up)                                                          \
-      for (_i = 7; _i >= _skip; --_i)                                  \
-       X##_f[_i] = X##_f[_i-_skip];                                    \
-    else                                                               \
-      {                                                                        \
-       for (_i = 7; _i > _skip; --_i)                                  \
-         X##_f[_i] = X##_f[_i-_skip] << _up                            \
-                     | X##_f[_i-_skip-1] >> _down;                     \
-       X##_f[_i--] = X##_f[0] << _up;                                  \
-      }                                                                        \
-    for (; _i >= 0; --_i)                                              \
-      X##_f[_i] = 0;                                                   \
-  } while (0)
-
-#define _FP_FRAC_SRL_8(X,N)                                            \
-  do {                                                                 \
-    _FP_I_TYPE _up, _down, _skip, _i;                                  \
-    _skip = (N) / _FP_W_TYPE_SIZE;                                     \
-    _down = (N) % _FP_W_TYPE_SIZE;                                     \
-    _up = _FP_W_TYPE_SIZE - _down;                                     \
-    if (!_down)                                                                \
-      for (_i = 0; _i <= 7-_skip; ++_i)                                        \
-       X##_f[_i] = X##_f[_i+_skip];                                    \
-    else                                                               \
-      {                                                                        \
-       for (_i = 0; _i < 7-_skip; ++_i)                                \
-         X##_f[_i] = X##_f[_i+_skip] >> _down                          \
-                     | X##_f[_i+_skip+1] << _up;                       \
-       X##_f[_i++] = X##_f[7] >> _down;                                \
-      }                                                                        \
-    for (; _i < 8; ++_i)                                               \
-      X##_f[_i] = 0;                                                   \
-  } while (0)
-
-
-/* Right shift with sticky-lsb. 
- * What this actually means is that we do a standard right-shift,
- * but that if any of the bits that fall off the right hand side
- * were one then we always set the LSbit.
- */
-#define _FP_FRAC_SRS_8(X,N,size)                                       \
-  do {                                                                 \
-    _FP_I_TYPE _up, _down, _skip, _i;                                  \
-    _FP_W_TYPE _s;                                                     \
-    _skip = (N) / _FP_W_TYPE_SIZE;                                     \
-    _down = (N) % _FP_W_TYPE_SIZE;                                     \
-    _up = _FP_W_TYPE_SIZE - _down;                                     \
-    for (_s = _i = 0; _i < _skip; ++_i)                                        \
-      _s |= X##_f[_i];                                                 \
-    if (!_down)                                                                \
-      for (_i = 0; _i <= 7-_skip; ++_i)                                        \
-       X##_f[_i] = X##_f[_i+_skip];                                    \
-    else                                                               \
-      {                                                                        \
-       _s |= X##_f[_i] << _up;                                         \
-       for (_i = 0; _i < 7-_skip; ++_i)                                \
-         X##_f[_i] = X##_f[_i+_skip] >> _down                          \
-                     | X##_f[_i+_skip+1] << _up;                       \
-       X##_f[_i++] = X##_f[7] >> _down;                                \
-      }                                                                        \
-    for (; _i < 8; ++_i)                                               \
-      X##_f[_i] = 0;                                                   \
-    /* don't fix the LSB until the very end when we're sure f[0] is stable */  \
-    X##_f[0] |= (_s != 0);                                             \
-  } while (0)
-
diff --git a/gcc/config/soft-fp/op-common.h b/gcc/config/soft-fp/op-common.h
deleted file mode 100644 (file)
index ef11b52..0000000
+++ /dev/null
@@ -1,1359 +0,0 @@
-/* Software floating-point emulation. Common operations.
-   Copyright (C) 1997,1998,1999,2006,2007 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com),
-                 Jakub Jelinek (jj@ultra.linux.cz),
-                 David S. Miller (davem@redhat.com) and
-                 Peter Maydell (pmaydell@chiark.greenend.org.uk).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#define _FP_DECL(wc, X)                                                \
-  _FP_I_TYPE X##_c __attribute__((unused)), X##_s, X##_e;      \
-  _FP_FRAC_DECL_##wc(X)
-
-/*
- * Finish truely unpacking a native fp value by classifying the kind
- * of fp value and normalizing both the exponent and the fraction.
- */
-
-#define _FP_UNPACK_CANONICAL(fs, wc, X)                                        \
-do {                                                                   \
-  switch (X##_e)                                                       \
-  {                                                                    \
-  default:                                                             \
-    _FP_FRAC_HIGH_RAW_##fs(X) |= _FP_IMPLBIT_##fs;                     \
-    _FP_FRAC_SLL_##wc(X, _FP_WORKBITS);                                        \
-    X##_e -= _FP_EXPBIAS_##fs;                                         \
-    X##_c = FP_CLS_NORMAL;                                             \
-    break;                                                             \
-                                                                       \
-  case 0:                                                              \
-    if (_FP_FRAC_ZEROP_##wc(X))                                                \
-      X##_c = FP_CLS_ZERO;                                             \
-    else                                                               \
-      {                                                                        \
-       /* a denormalized number */                                     \
-       _FP_I_TYPE _shift;                                              \
-       _FP_FRAC_CLZ_##wc(_shift, X);                                   \
-       _shift -= _FP_FRACXBITS_##fs;                                   \
-       _FP_FRAC_SLL_##wc(X, (_shift+_FP_WORKBITS));                    \
-       X##_e -= _FP_EXPBIAS_##fs - 1 + _shift;                         \
-       X##_c = FP_CLS_NORMAL;                                          \
-       FP_SET_EXCEPTION(FP_EX_DENORM);                                 \
-      }                                                                        \
-    break;                                                             \
-                                                                       \
-  case _FP_EXPMAX_##fs:                                                        \
-    if (_FP_FRAC_ZEROP_##wc(X))                                                \
-      X##_c = FP_CLS_INF;                                              \
-    else                                                               \
-      {                                                                        \
-       X##_c = FP_CLS_NAN;                                             \
-       /* Check for signaling NaN */                                   \
-       if (!(_FP_FRAC_HIGH_RAW_##fs(X) & _FP_QNANBIT_##fs))            \
-         FP_SET_EXCEPTION(FP_EX_INVALID);                              \
-      }                                                                        \
-    break;                                                             \
-  }                                                                    \
-} while (0)
-
-/* Finish unpacking an fp value in semi-raw mode: the mantissa is
-   shifted by _FP_WORKBITS but the implicit MSB is not inserted and
-   other classification is not done.  */
-#define _FP_UNPACK_SEMIRAW(fs, wc, X)  _FP_FRAC_SLL_##wc(X, _FP_WORKBITS)
-
-/* A semi-raw value has overflowed to infinity.  Adjust the mantissa
-   and exponent appropriately.  */
-#define _FP_OVERFLOW_SEMIRAW(fs, wc, X)                        \
-do {                                                   \
-  if (FP_ROUNDMODE == FP_RND_NEAREST                   \
-      || (FP_ROUNDMODE == FP_RND_PINF && !X##_s)       \
-      || (FP_ROUNDMODE == FP_RND_MINF && X##_s))       \
-    {                                                  \
-      X##_e = _FP_EXPMAX_##fs;                         \
-      _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc);         \
-    }                                                  \
-  else                                                 \
-    {                                                  \
-      X##_e = _FP_EXPMAX_##fs - 1;                     \
-      _FP_FRAC_SET_##wc(X, _FP_MAXFRAC_##wc);          \
-    }                                                  \
-    FP_SET_EXCEPTION(FP_EX_INEXACT);                   \
-    FP_SET_EXCEPTION(FP_EX_OVERFLOW);                  \
-} while (0)
-
-/* Check for a semi-raw value being a signaling NaN and raise the
-   invalid exception if so.  */
-#define _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, X)                    \
-do {                                                           \
-  if (X##_e == _FP_EXPMAX_##fs                                 \
-      && !_FP_FRAC_ZEROP_##wc(X)                               \
-      && !(_FP_FRAC_HIGH_##fs(X) & _FP_QNANBIT_SH_##fs))       \
-    FP_SET_EXCEPTION(FP_EX_INVALID);                           \
-} while (0)
-
-/* Choose a NaN result from an operation on two semi-raw NaN
-   values.  */
-#define _FP_CHOOSENAN_SEMIRAW(fs, wc, R, X, Y, OP)                     \
-do {                                                                   \
-  /* _FP_CHOOSENAN expects raw values, so shift as required.  */       \
-  _FP_FRAC_SRL_##wc(X, _FP_WORKBITS);                                  \
-  _FP_FRAC_SRL_##wc(Y, _FP_WORKBITS);                                  \
-  _FP_CHOOSENAN(fs, wc, R, X, Y, OP);                                  \
-  _FP_FRAC_SLL_##wc(R, _FP_WORKBITS);                                  \
-} while (0)
-
-/* Test whether a biased exponent is normal (not zero or maximum).  */
-#define _FP_EXP_NORMAL(fs, wc, X)      (((X##_e + 1) & _FP_EXPMAX_##fs) > 1)
-
-/* Prepare to pack an fp value in semi-raw mode: the mantissa is
-   rounded and shifted right, with the rounding possibly increasing
-   the exponent (including changing a finite value to infinity).  */
-#define _FP_PACK_SEMIRAW(fs, wc, X)                            \
-do {                                                           \
-  _FP_ROUND(wc, X);                                            \
-  if (_FP_FRAC_HIGH_##fs(X)                                    \
-      & (_FP_OVERFLOW_##fs >> 1))                              \
-    {                                                          \
-      _FP_FRAC_HIGH_##fs(X) &= ~(_FP_OVERFLOW_##fs >> 1);      \
-      X##_e++;                                                 \
-      if (X##_e == _FP_EXPMAX_##fs)                            \
-       _FP_OVERFLOW_SEMIRAW(fs, wc, X);                        \
-    }                                                          \
-  _FP_FRAC_SRL_##wc(X, _FP_WORKBITS);                          \
-  if (!_FP_EXP_NORMAL(fs, wc, X) && !_FP_FRAC_ZEROP_##wc(X))   \
-    {                                                          \
-      if (X##_e == 0)                                          \
-       FP_SET_EXCEPTION(FP_EX_UNDERFLOW);                      \
-      else                                                     \
-       {                                                       \
-         if (!_FP_KEEPNANFRACP)                                \
-           {                                                   \
-             _FP_FRAC_SET_##wc(X, _FP_NANFRAC_##fs);           \
-             X##_s = _FP_NANSIGN_##fs;                         \
-           }                                                   \
-         else                                                  \
-           _FP_FRAC_HIGH_RAW_##fs(X) |= _FP_QNANBIT_##fs;      \
-       }                                                       \
-    }                                                          \
-} while (0)
-
-/*
- * Before packing the bits back into the native fp result, take care
- * of such mundane things as rounding and overflow.  Also, for some
- * kinds of fp values, the original parts may not have been fully
- * extracted -- but that is ok, we can regenerate them now.
- */
-
-#define _FP_PACK_CANONICAL(fs, wc, X)                          \
-do {                                                           \
-  switch (X##_c)                                               \
-  {                                                            \
-  case FP_CLS_NORMAL:                                          \
-    X##_e += _FP_EXPBIAS_##fs;                                 \
-    if (X##_e > 0)                                             \
-      {                                                                \
-       _FP_ROUND(wc, X);                                       \
-       if (_FP_FRAC_OVERP_##wc(fs, X))                         \
-         {                                                     \
-           _FP_FRAC_CLEAR_OVERP_##wc(fs, X);                   \
-           X##_e++;                                            \
-         }                                                     \
-       _FP_FRAC_SRL_##wc(X, _FP_WORKBITS);                     \
-       if (X##_e >= _FP_EXPMAX_##fs)                           \
-         {                                                     \
-           /* overflow */                                      \
-           switch (FP_ROUNDMODE)                               \
-             {                                                 \
-             case FP_RND_NEAREST:                              \
-               X##_c = FP_CLS_INF;                             \
-               break;                                          \
-             case FP_RND_PINF:                                 \
-               if (!X##_s) X##_c = FP_CLS_INF;                 \
-               break;                                          \
-             case FP_RND_MINF:                                 \
-               if (X##_s) X##_c = FP_CLS_INF;                  \
-               break;                                          \
-             }                                                 \
-           if (X##_c == FP_CLS_INF)                            \
-             {                                                 \
-               /* Overflow to infinity */                      \
-               X##_e = _FP_EXPMAX_##fs;                        \
-               _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc);        \
-             }                                                 \
-           else                                                \
-             {                                                 \
-               /* Overflow to maximum normal */                \
-               X##_e = _FP_EXPMAX_##fs - 1;                    \
-               _FP_FRAC_SET_##wc(X, _FP_MAXFRAC_##wc);         \
-             }                                                 \
-           FP_SET_EXCEPTION(FP_EX_OVERFLOW);                   \
-            FP_SET_EXCEPTION(FP_EX_INEXACT);                   \
-         }                                                     \
-      }                                                                \
-    else                                                       \
-      {                                                                \
-       /* we've got a denormalized number */                   \
-       X##_e = -X##_e + 1;                                     \
-       if (X##_e <= _FP_WFRACBITS_##fs)                        \
-         {                                                     \
-           _FP_FRAC_SRS_##wc(X, X##_e, _FP_WFRACBITS_##fs);    \
-           _FP_ROUND(wc, X);                                   \
-           if (_FP_FRAC_HIGH_##fs(X)                           \
-               & (_FP_OVERFLOW_##fs >> 1))                     \
-             {                                                 \
-               X##_e = 1;                                      \
-               _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc);        \
-             }                                                 \
-           else                                                \
-             {                                                 \
-               X##_e = 0;                                      \
-               _FP_FRAC_SRL_##wc(X, _FP_WORKBITS);             \
-               FP_SET_EXCEPTION(FP_EX_UNDERFLOW);              \
-             }                                                 \
-         }                                                     \
-       else                                                    \
-         {                                                     \
-           /* underflow to zero */                             \
-           X##_e = 0;                                          \
-           if (!_FP_FRAC_ZEROP_##wc(X))                        \
-             {                                                 \
-               _FP_FRAC_SET_##wc(X, _FP_MINFRAC_##wc);         \
-               _FP_ROUND(wc, X);                               \
-               _FP_FRAC_LOW_##wc(X) >>= (_FP_WORKBITS);        \
-             }                                                 \
-           FP_SET_EXCEPTION(FP_EX_UNDERFLOW);                  \
-         }                                                     \
-      }                                                                \
-    break;                                                     \
-                                                               \
-  case FP_CLS_ZERO:                                            \
-    X##_e = 0;                                                 \
-    _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc);                   \
-    break;                                                     \
-                                                               \
-  case FP_CLS_INF:                                             \
-    X##_e = _FP_EXPMAX_##fs;                                   \
-    _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc);                   \
-    break;                                                     \
-                                                               \
-  case FP_CLS_NAN:                                             \
-    X##_e = _FP_EXPMAX_##fs;                                   \
-    if (!_FP_KEEPNANFRACP)                                     \
-      {                                                                \
-       _FP_FRAC_SET_##wc(X, _FP_NANFRAC_##fs);                 \
-       X##_s = _FP_NANSIGN_##fs;                               \
-      }                                                                \
-    else                                                       \
-      _FP_FRAC_HIGH_RAW_##fs(X) |= _FP_QNANBIT_##fs;           \
-    break;                                                     \
-  }                                                            \
-} while (0)
-
-/* This one accepts raw argument and not cooked,  returns
- * 1 if X is a signaling NaN.
- */
-#define _FP_ISSIGNAN(fs, wc, X)                                        \
-({                                                             \
-  int __ret = 0;                                               \
-  if (X##_e == _FP_EXPMAX_##fs)                                        \
-    {                                                          \
-      if (!_FP_FRAC_ZEROP_##wc(X)                              \
-         && !(_FP_FRAC_HIGH_RAW_##fs(X) & _FP_QNANBIT_##fs))   \
-       __ret = 1;                                              \
-    }                                                          \
-  __ret;                                                       \
-})
-
-
-
-
-
-/* Addition on semi-raw values.  */
-#define _FP_ADD_INTERNAL(fs, wc, R, X, Y, OP)                           \
-do {                                                                    \
-  if (X##_s == Y##_s)                                                   \
-    {                                                                   \
-      /* Addition.  */                                                  \
-      R##_s = X##_s;                                                    \
-      int ediff = X##_e - Y##_e;                                        \
-      if (ediff > 0)                                                    \
-       {                                                                \
-         R##_e = X##_e;                                                 \
-         if (Y##_e == 0)                                                \
-           {                                                            \
-             /* Y is zero or denormalized.  */                          \
-             if (_FP_FRAC_ZEROP_##wc(Y))                                \
-               {                                                        \
-                 _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, X);                   \
-                 _FP_FRAC_COPY_##wc(R, X);                              \
-                 goto add_done;                                         \
-               }                                                        \
-             else                                                       \
-               {                                                        \
-                 FP_SET_EXCEPTION(FP_EX_DENORM);                        \
-                 ediff--;                                               \
-                 if (ediff == 0)                                        \
-                   {                                                    \
-                     _FP_FRAC_ADD_##wc(R, X, Y);                        \
-                     goto add3;                                         \
-                   }                                                    \
-                 if (X##_e == _FP_EXPMAX_##fs)                          \
-                   {                                                    \
-                     _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, X);               \
-                     _FP_FRAC_COPY_##wc(R, X);                          \
-                     goto add_done;                                     \
-                   }                                                    \
-                 goto add1;                                             \
-               }                                                        \
-           }                                                            \
-         else if (X##_e == _FP_EXPMAX_##fs)                             \
-           {                                                            \
-             /* X is NaN or Inf, Y is normal.  */                       \
-             _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, X);                       \
-             _FP_FRAC_COPY_##wc(R, X);                                  \
-             goto add_done;                                             \
-           }                                                            \
-                                                                        \
-         /* Insert implicit MSB of Y.  */                               \
-         _FP_FRAC_HIGH_##fs(Y) |= _FP_IMPLBIT_SH_##fs;                  \
-                                                                        \
-       add1:                                                            \
-         /* Shift the mantissa of Y to the right EDIFF steps;           \
-            remember to account later for the implicit MSB of X.  */    \
-         if (ediff <= _FP_WFRACBITS_##fs)                               \
-           _FP_FRAC_SRS_##wc(Y, ediff, _FP_WFRACBITS_##fs);             \
-         else if (!_FP_FRAC_ZEROP_##wc(Y))                              \
-           _FP_FRAC_SET_##wc(Y, _FP_MINFRAC_##wc);                      \
-         _FP_FRAC_ADD_##wc(R, X, Y);                                    \
-       }                                                                \
-      else if (ediff < 0)                                               \
-       {                                                                \
-         ediff = -ediff;                                                \
-         R##_e = Y##_e;                                                 \
-         if (X##_e == 0)                                                \
-           {                                                            \
-             /* X is zero or denormalized.  */                          \
-             if (_FP_FRAC_ZEROP_##wc(X))                                \
-               {                                                        \
-                 _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, Y);                   \
-                 _FP_FRAC_COPY_##wc(R, Y);                              \
-                 goto add_done;                                         \
-               }                                                        \
-             else                                                       \
-               {                                                        \
-                 FP_SET_EXCEPTION(FP_EX_DENORM);                        \
-                 ediff--;                                               \
-                 if (ediff == 0)                                        \
-                   {                                                    \
-                     _FP_FRAC_ADD_##wc(R, Y, X);                        \
-                     goto add3;                                         \
-                   }                                                    \
-                 if (Y##_e == _FP_EXPMAX_##fs)                          \
-                   {                                                    \
-                     _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, Y);               \
-                     _FP_FRAC_COPY_##wc(R, Y);                          \
-                     goto add_done;                                     \
-                   }                                                    \
-                 goto add2;                                             \
-               }                                                        \
-           }                                                            \
-         else if (Y##_e == _FP_EXPMAX_##fs)                             \
-           {                                                            \
-             /* Y is NaN or Inf, X is normal.  */                       \
-             _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, Y);                       \
-             _FP_FRAC_COPY_##wc(R, Y);                                  \
-             goto add_done;                                             \
-           }                                                            \
-                                                                        \
-         /* Insert implicit MSB of X.  */                               \
-         _FP_FRAC_HIGH_##fs(X) |= _FP_IMPLBIT_SH_##fs;                  \
-                                                                        \
-       add2:                                                            \
-         /* Shift the mantissa of X to the right EDIFF steps;           \
-            remember to account later for the implicit MSB of Y.  */    \
-         if (ediff <= _FP_WFRACBITS_##fs)                               \
-           _FP_FRAC_SRS_##wc(X, ediff, _FP_WFRACBITS_##fs);             \
-         else if (!_FP_FRAC_ZEROP_##wc(X))                              \
-           _FP_FRAC_SET_##wc(X, _FP_MINFRAC_##wc);                      \
-         _FP_FRAC_ADD_##wc(R, Y, X);                                    \
-       }                                                                \
-      else                                                              \
-       {                                                                \
-         /* ediff == 0.  */                                             \
-         if (!_FP_EXP_NORMAL(fs, wc, X))                                \
-           {                                                            \
-             if (X##_e == 0)                                            \
-               {                                                        \
-                 /* X and Y are zero or denormalized.  */               \
-                 R##_e = 0;                                             \
-                 if (_FP_FRAC_ZEROP_##wc(X))                            \
-                   {                                                    \
-                     if (!_FP_FRAC_ZEROP_##wc(Y))                       \
-                       FP_SET_EXCEPTION(FP_EX_DENORM);                  \
-                     _FP_FRAC_COPY_##wc(R, Y);                          \
-                     goto add_done;                                     \
-                   }                                                    \
-                 else if (_FP_FRAC_ZEROP_##wc(Y))                       \
-                   {                                                    \
-                     FP_SET_EXCEPTION(FP_EX_DENORM);                    \
-                     _FP_FRAC_COPY_##wc(R, X);                          \
-                     goto add_done;                                     \
-                   }                                                    \
-                 else                                                   \
-                   {                                                    \
-                     FP_SET_EXCEPTION(FP_EX_DENORM);                    \
-                     _FP_FRAC_ADD_##wc(R, X, Y);                        \
-                     if (_FP_FRAC_HIGH_##fs(R) & _FP_IMPLBIT_SH_##fs)   \
-                       {                                                \
-                         /* Normalized result.  */                      \
-                         _FP_FRAC_HIGH_##fs(R)                          \
-                           &= ~(_FP_W_TYPE)_FP_IMPLBIT_SH_##fs;         \
-                         R##_e = 1;                                     \
-                       }                                                \
-                     goto add_done;                                     \
-                   }                                                    \
-               }                                                        \
-             else                                                       \
-               {                                                        \
-                 /* X and Y are NaN or Inf.  */                         \
-                 _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, X);                   \
-                 _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, Y);                   \
-                 R##_e = _FP_EXPMAX_##fs;                               \
-                 if (_FP_FRAC_ZEROP_##wc(X))                            \
-                   _FP_FRAC_COPY_##wc(R, Y);                            \
-                 else if (_FP_FRAC_ZEROP_##wc(Y))                       \
-                   _FP_FRAC_COPY_##wc(R, X);                            \
-                 else                                                   \
-                   _FP_CHOOSENAN_SEMIRAW(fs, wc, R, X, Y, OP);          \
-                 goto add_done;                                         \
-               }                                                        \
-           }                                                            \
-         /* The exponents of X and Y, both normal, are equal.  The      \
-            implicit MSBs will always add to increase the               \
-            exponent.  */                                               \
-         _FP_FRAC_ADD_##wc(R, X, Y);                                    \
-         R##_e = X##_e + 1;                                             \
-         _FP_FRAC_SRS_##wc(R, 1, _FP_WFRACBITS_##fs);                   \
-         if (R##_e == _FP_EXPMAX_##fs)                                  \
-           /* Overflow to infinity (depending on rounding mode).  */    \
-           _FP_OVERFLOW_SEMIRAW(fs, wc, R);                             \
-         goto add_done;                                                 \
-       }                                                                \
-    add3:                                                               \
-      if (_FP_FRAC_HIGH_##fs(R) & _FP_IMPLBIT_SH_##fs)                  \
-       {                                                                \
-         /* Overflow.  */                                               \
-         _FP_FRAC_HIGH_##fs(R) &= ~(_FP_W_TYPE)_FP_IMPLBIT_SH_##fs;     \
-         R##_e++;                                                       \
-         _FP_FRAC_SRS_##wc(R, 1, _FP_WFRACBITS_##fs);                   \
-         if (R##_e == _FP_EXPMAX_##fs)                                  \
-           /* Overflow to infinity (depending on rounding mode).  */    \
-           _FP_OVERFLOW_SEMIRAW(fs, wc, R);                             \
-       }                                                                \
-    add_done: ;                                                                 \
-    }                                                                   \
-  else                                                                  \
-    {                                                                   \
-      /* Subtraction.  */                                               \
-      int ediff = X##_e - Y##_e;                                        \
-      if (ediff > 0)                                                    \
-       {                                                                \
-         R##_e = X##_e;                                                 \
-         R##_s = X##_s;                                                 \
-         if (Y##_e == 0)                                                \
-           {                                                            \
-             /* Y is zero or denormalized.  */                          \
-             if (_FP_FRAC_ZEROP_##wc(Y))                                \
-               {                                                        \
-                 _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, X);                   \
-                 _FP_FRAC_COPY_##wc(R, X);                              \
-                 goto sub_done;                                         \
-               }                                                        \
-             else                                                       \
-               {                                                        \
-                 FP_SET_EXCEPTION(FP_EX_DENORM);                        \
-                 ediff--;                                               \
-                 if (ediff == 0)                                        \
-                   {                                                    \
-                     _FP_FRAC_SUB_##wc(R, X, Y);                        \
-                     goto sub3;                                         \
-                   }                                                    \
-                 if (X##_e == _FP_EXPMAX_##fs)                          \
-                   {                                                    \
-                     _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, X);               \
-                     _FP_FRAC_COPY_##wc(R, X);                          \
-                     goto sub_done;                                     \
-                   }                                                    \
-                 goto sub1;                                             \
-               }                                                        \
-           }                                                            \
-         else if (X##_e == _FP_EXPMAX_##fs)                             \
-           {                                                            \
-             /* X is NaN or Inf, Y is normal.  */                       \
-             _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, X);                       \
-             _FP_FRAC_COPY_##wc(R, X);                                  \
-             goto sub_done;                                             \
-           }                                                            \
-                                                                        \
-         /* Insert implicit MSB of Y.  */                               \
-         _FP_FRAC_HIGH_##fs(Y) |= _FP_IMPLBIT_SH_##fs;                  \
-                                                                        \
-       sub1:                                                            \
-         /* Shift the mantissa of Y to the right EDIFF steps;           \
-            remember to account later for the implicit MSB of X.  */    \
-         if (ediff <= _FP_WFRACBITS_##fs)                               \
-           _FP_FRAC_SRS_##wc(Y, ediff, _FP_WFRACBITS_##fs);             \
-         else if (!_FP_FRAC_ZEROP_##wc(Y))                              \
-           _FP_FRAC_SET_##wc(Y, _FP_MINFRAC_##wc);                      \
-         _FP_FRAC_SUB_##wc(R, X, Y);                                    \
-       }                                                                \
-      else if (ediff < 0)                                               \
-       {                                                                \
-         ediff = -ediff;                                                \
-         R##_e = Y##_e;                                                 \
-         R##_s = Y##_s;                                                 \
-         if (X##_e == 0)                                                \
-           {                                                            \
-             /* X is zero or denormalized.  */                          \
-             if (_FP_FRAC_ZEROP_##wc(X))                                \
-               {                                                        \
-                 _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, Y);                   \
-                 _FP_FRAC_COPY_##wc(R, Y);                              \
-                 goto sub_done;                                         \
-               }                                                        \
-             else                                                       \
-               {                                                        \
-                 FP_SET_EXCEPTION(FP_EX_DENORM);                        \
-                 ediff--;                                               \
-                 if (ediff == 0)                                        \
-                   {                                                    \
-                     _FP_FRAC_SUB_##wc(R, Y, X);                        \
-                     goto sub3;                                         \
-                   }                                                    \
-                 if (Y##_e == _FP_EXPMAX_##fs)                          \
-                   {                                                    \
-                     _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, Y);               \
-                     _FP_FRAC_COPY_##wc(R, Y);                          \
-                     goto sub_done;                                     \
-                   }                                                    \
-                 goto sub2;                                             \
-               }                                                        \
-           }                                                            \
-         else if (Y##_e == _FP_EXPMAX_##fs)                             \
-           {                                                            \
-             /* Y is NaN or Inf, X is normal.  */                       \
-             _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, Y);                       \
-             _FP_FRAC_COPY_##wc(R, Y);                                  \
-             goto sub_done;                                             \
-           }                                                            \
-                                                                        \
-         /* Insert implicit MSB of X.  */                               \
-         _FP_FRAC_HIGH_##fs(X) |= _FP_IMPLBIT_SH_##fs;                  \
-                                                                        \
-       sub2:                                                            \
-         /* Shift the mantissa of X to the right EDIFF steps;           \
-            remember to account later for the implicit MSB of Y.  */    \
-         if (ediff <= _FP_WFRACBITS_##fs)                               \
-           _FP_FRAC_SRS_##wc(X, ediff, _FP_WFRACBITS_##fs);             \
-         else if (!_FP_FRAC_ZEROP_##wc(X))                              \
-           _FP_FRAC_SET_##wc(X, _FP_MINFRAC_##wc);                      \
-         _FP_FRAC_SUB_##wc(R, Y, X);                                    \
-       }                                                                \
-      else                                                              \
-       {                                                                \
-         /* ediff == 0.  */                                             \
-         if (!_FP_EXP_NORMAL(fs, wc, X))                                \
-           {                                                            \
-             if (X##_e == 0)                                            \
-               {                                                        \
-                 /* X and Y are zero or denormalized.  */               \
-                 R##_e = 0;                                             \
-                 if (_FP_FRAC_ZEROP_##wc(X))                            \
-                   {                                                    \
-                     _FP_FRAC_COPY_##wc(R, Y);                          \
-                     if (_FP_FRAC_ZEROP_##wc(Y))                        \
-                       R##_s = (FP_ROUNDMODE == FP_RND_MINF);           \
-                     else                                               \
-                       {                                                \
-                         FP_SET_EXCEPTION(FP_EX_DENORM);                \
-                         R##_s = Y##_s;                                 \
-                       }                                                \
-                     goto sub_done;                                     \
-                   }                                                    \
-                 else if (_FP_FRAC_ZEROP_##wc(Y))                       \
-                   {                                                    \
-                     FP_SET_EXCEPTION(FP_EX_DENORM);                    \
-                     _FP_FRAC_COPY_##wc(R, X);                          \
-                     R##_s = X##_s;                                     \
-                     goto sub_done;                                     \
-                   }                                                    \
-                 else                                                   \
-                   {                                                    \
-                     FP_SET_EXCEPTION(FP_EX_DENORM);                    \
-                     _FP_FRAC_SUB_##wc(R, X, Y);                        \
-                     R##_s = X##_s;                                     \
-                     if (_FP_FRAC_HIGH_##fs(R) & _FP_IMPLBIT_SH_##fs)   \
-                       {                                                \
-                         /* |X| < |Y|, negate result.  */               \
-                         _FP_FRAC_SUB_##wc(R, Y, X);                    \
-                         R##_s = Y##_s;                                 \
-                       }                                                \
-                     else if (_FP_FRAC_ZEROP_##wc(R))                   \
-                       R##_s = (FP_ROUNDMODE == FP_RND_MINF);           \
-                     goto sub_done;                                     \
-                   }                                                    \
-               }                                                        \
-             else                                                       \
-               {                                                        \
-                 /* X and Y are NaN or Inf, of opposite signs.  */      \
-                 _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, X);                   \
-                 _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, Y);                   \
-                 R##_e = _FP_EXPMAX_##fs;                               \
-                 if (_FP_FRAC_ZEROP_##wc(X))                            \
-                   {                                                    \
-                     if (_FP_FRAC_ZEROP_##wc(Y))                        \
-                       {                                                \
-                         /* Inf - Inf.  */                              \
-                         R##_s = _FP_NANSIGN_##fs;                      \
-                         _FP_FRAC_SET_##wc(R, _FP_NANFRAC_##fs);        \
-                         _FP_FRAC_SLL_##wc(R, _FP_WORKBITS);            \
-                         FP_SET_EXCEPTION(FP_EX_INVALID);               \
-                       }                                                \
-                     else                                               \
-                       {                                                \
-                         /* Inf - NaN.  */                              \
-                         R##_s = Y##_s;                                 \
-                         _FP_FRAC_COPY_##wc(R, Y);                      \
-                       }                                                \
-                   }                                                    \
-                 else                                                   \
-                   {                                                    \
-                     if (_FP_FRAC_ZEROP_##wc(Y))                        \
-                       {                                                \
-                         /* NaN - Inf.  */                              \
-                         R##_s = X##_s;                                 \
-                         _FP_FRAC_COPY_##wc(R, X);                      \
-                       }                                                \
-                     else                                               \
-                       {                                                \
-                         /* NaN - NaN.  */                              \
-                         _FP_CHOOSENAN_SEMIRAW(fs, wc, R, X, Y, OP);    \
-                       }                                                \
-                   }                                                    \
-                 goto sub_done;                                         \
-               }                                                        \
-           }                                                            \
-         /* The exponents of X and Y, both normal, are equal.  The      \
-            implicit MSBs cancel.  */                                   \
-         R##_e = X##_e;                                                 \
-         _FP_FRAC_SUB_##wc(R, X, Y);                                    \
-         R##_s = X##_s;                                                 \
-         if (_FP_FRAC_HIGH_##fs(R) & _FP_IMPLBIT_SH_##fs)               \
-           {                                                            \
-             /* |X| < |Y|, negate result.  */                           \
-             _FP_FRAC_SUB_##wc(R, Y, X);                                \
-             R##_s = Y##_s;                                             \
-           }                                                            \
-         else if (_FP_FRAC_ZEROP_##wc(R))                               \
-           {                                                            \
-             R##_e = 0;                                                 \
-             R##_s = (FP_ROUNDMODE == FP_RND_MINF);                     \
-             goto sub_done;                                             \
-           }                                                            \
-         goto norm;                                                     \
-       }                                                                \
-    sub3:                                                               \
-      if (_FP_FRAC_HIGH_##fs(R) & _FP_IMPLBIT_SH_##fs)                  \
-       {                                                                \
-         int diff;                                                      \
-         /* Carry into most significant bit of larger one of X and Y,   \
-            canceling it; renormalize.  */                              \
-         _FP_FRAC_HIGH_##fs(R) &= _FP_IMPLBIT_SH_##fs - 1;              \
-       norm:                                                            \
-         _FP_FRAC_CLZ_##wc(diff, R);                                    \
-         diff -= _FP_WFRACXBITS_##fs;                                   \
-         _FP_FRAC_SLL_##wc(R, diff);                                    \
-         if (R##_e <= diff)                                             \
-           {                                                            \
-             /* R is denormalized.  */                                  \
-             diff = diff - R##_e + 1;                                   \
-             _FP_FRAC_SRS_##wc(R, diff, _FP_WFRACBITS_##fs);            \
-             R##_e = 0;                                                 \
-           }                                                            \
-         else                                                           \
-           {                                                            \
-             R##_e -= diff;                                             \
-             _FP_FRAC_HIGH_##fs(R) &= ~(_FP_W_TYPE)_FP_IMPLBIT_SH_##fs; \
-           }                                                            \
-       }                                                                \
-    sub_done: ;                                                                 \
-    }                                                                   \
-} while (0)
-
-#define _FP_ADD(fs, wc, R, X, Y) _FP_ADD_INTERNAL(fs, wc, R, X, Y, '+')
-#define _FP_SUB(fs, wc, R, X, Y)                                           \
-  do {                                                                     \
-    if (!(Y##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(Y))) Y##_s ^= 1; \
-    _FP_ADD_INTERNAL(fs, wc, R, X, Y, '-');                                \
-  } while (0)
-
-
-/*
- * Main negation routine.  FIXME -- when we care about setting exception
- * bits reliably, this will not do.  We should examine all of the fp classes.
- */
-
-#define _FP_NEG(fs, wc, R, X)          \
-  do {                                 \
-    _FP_FRAC_COPY_##wc(R, X);          \
-    R##_c = X##_c;                     \
-    R##_e = X##_e;                     \
-    R##_s = 1 ^ X##_s;                 \
-  } while (0)
-
-
-/*
- * Main multiplication routine.  The input values should be cooked.
- */
-
-#define _FP_MUL(fs, wc, R, X, Y)                       \
-do {                                                   \
-  R##_s = X##_s ^ Y##_s;                               \
-  switch (_FP_CLS_COMBINE(X##_c, Y##_c))               \
-  {                                                    \
-  case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_NORMAL):   \
-    R##_c = FP_CLS_NORMAL;                             \
-    R##_e = X##_e + Y##_e + 1;                         \
-                                                       \
-    _FP_MUL_MEAT_##fs(R,X,Y);                          \
-                                                       \
-    if (_FP_FRAC_OVERP_##wc(fs, R))                    \
-      _FP_FRAC_SRS_##wc(R, 1, _FP_WFRACBITS_##fs);     \
-    else                                               \
-      R##_e--;                                         \
-    break;                                             \
-                                                       \
-  case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_NAN):         \
-    _FP_CHOOSENAN(fs, wc, R, X, Y, '*');               \
-    break;                                             \
-                                                       \
-  case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_NORMAL):      \
-  case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_INF):         \
-  case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_ZERO):                \
-    R##_s = X##_s;                                     \
-                                                       \
-  case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_INF):         \
-  case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_NORMAL):      \
-  case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_NORMAL):     \
-  case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_ZERO):       \
-    _FP_FRAC_COPY_##wc(R, X);                          \
-    R##_c = X##_c;                                     \
-    break;                                             \
-                                                       \
-  case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_NAN):      \
-  case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_NAN):         \
-  case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_NAN):                \
-    R##_s = Y##_s;                                     \
-                                                       \
-  case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_INF):      \
-  case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_ZERO):     \
-    _FP_FRAC_COPY_##wc(R, Y);                          \
-    R##_c = Y##_c;                                     \
-    break;                                             \
-                                                       \
-  case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_ZERO):                \
-  case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_INF):                \
-    R##_s = _FP_NANSIGN_##fs;                          \
-    R##_c = FP_CLS_NAN;                                        \
-    _FP_FRAC_SET_##wc(R, _FP_NANFRAC_##fs);            \
-    FP_SET_EXCEPTION(FP_EX_INVALID);                   \
-    break;                                             \
-                                                       \
-  default:                                             \
-    abort();                                           \
-  }                                                    \
-} while (0)
-
-
-/*
- * Main division routine.  The input values should be cooked.
- */
-
-#define _FP_DIV(fs, wc, R, X, Y)                       \
-do {                                                   \
-  R##_s = X##_s ^ Y##_s;                               \
-  switch (_FP_CLS_COMBINE(X##_c, Y##_c))               \
-  {                                                    \
-  case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_NORMAL):   \
-    R##_c = FP_CLS_NORMAL;                             \
-    R##_e = X##_e - Y##_e;                             \
-                                                       \
-    _FP_DIV_MEAT_##fs(R,X,Y);                          \
-    break;                                             \
-                                                       \
-  case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_NAN):         \
-    _FP_CHOOSENAN(fs, wc, R, X, Y, '/');               \
-    break;                                             \
-                                                       \
-  case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_NORMAL):      \
-  case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_INF):         \
-  case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_ZERO):                \
-    R##_s = X##_s;                                     \
-    _FP_FRAC_COPY_##wc(R, X);                          \
-    R##_c = X##_c;                                     \
-    break;                                             \
-                                                       \
-  case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_NAN):      \
-  case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_NAN):         \
-  case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_NAN):                \
-    R##_s = Y##_s;                                     \
-    _FP_FRAC_COPY_##wc(R, Y);                          \
-    R##_c = Y##_c;                                     \
-    break;                                             \
-                                                       \
-  case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_INF):      \
-  case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_INF):                \
-  case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_NORMAL):     \
-    R##_c = FP_CLS_ZERO;                               \
-    break;                                             \
-                                                       \
-  case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_ZERO):     \
-    FP_SET_EXCEPTION(FP_EX_DIVZERO);                   \
-  case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_ZERO):                \
-  case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_NORMAL):      \
-    R##_c = FP_CLS_INF;                                        \
-    break;                                             \
-                                                       \
-  case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_INF):         \
-  case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_ZERO):       \
-    R##_s = _FP_NANSIGN_##fs;                          \
-    R##_c = FP_CLS_NAN;                                        \
-    _FP_FRAC_SET_##wc(R, _FP_NANFRAC_##fs);            \
-    FP_SET_EXCEPTION(FP_EX_INVALID);                   \
-    break;                                             \
-                                                       \
-  default:                                             \
-    abort();                                           \
-  }                                                    \
-} while (0)
-
-
-/*
- * Main differential comparison routine.  The inputs should be raw not
- * cooked.  The return is -1,0,1 for normal values, 2 otherwise.
- */
-
-#define _FP_CMP(fs, wc, ret, X, Y, un)                                 \
-  do {                                                                 \
-    /* NANs are unordered */                                           \
-    if ((X##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(X))          \
-       || (Y##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(Y)))       \
-      {                                                                        \
-       ret = un;                                                       \
-      }                                                                        \
-    else                                                               \
-      {                                                                        \
-       int __is_zero_x;                                                \
-       int __is_zero_y;                                                \
-                                                                       \
-       __is_zero_x = (!X##_e && _FP_FRAC_ZEROP_##wc(X)) ? 1 : 0;       \
-       __is_zero_y = (!Y##_e && _FP_FRAC_ZEROP_##wc(Y)) ? 1 : 0;       \
-                                                                       \
-       if (__is_zero_x && __is_zero_y)                                 \
-               ret = 0;                                                \
-       else if (__is_zero_x)                                           \
-               ret = Y##_s ? 1 : -1;                                   \
-       else if (__is_zero_y)                                           \
-               ret = X##_s ? -1 : 1;                                   \
-       else if (X##_s != Y##_s)                                        \
-         ret = X##_s ? -1 : 1;                                         \
-       else if (X##_e > Y##_e)                                         \
-         ret = X##_s ? -1 : 1;                                         \
-       else if (X##_e < Y##_e)                                         \
-         ret = X##_s ? 1 : -1;                                         \
-       else if (_FP_FRAC_GT_##wc(X, Y))                                \
-         ret = X##_s ? -1 : 1;                                         \
-       else if (_FP_FRAC_GT_##wc(Y, X))                                \
-         ret = X##_s ? 1 : -1;                                         \
-       else                                                            \
-         ret = 0;                                                      \
-      }                                                                        \
-  } while (0)
-
-
-/* Simplification for strict equality.  */
-
-#define _FP_CMP_EQ(fs, wc, ret, X, Y)                                      \
-  do {                                                                     \
-    /* NANs are unordered */                                               \
-    if ((X##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(X))              \
-       || (Y##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(Y)))           \
-      {                                                                            \
-       ret = 1;                                                            \
-      }                                                                            \
-    else                                                                   \
-      {                                                                            \
-       ret = !(X##_e == Y##_e                                              \
-               && _FP_FRAC_EQ_##wc(X, Y)                                   \
-               && (X##_s == Y##_s || (!X##_e && _FP_FRAC_ZEROP_##wc(X)))); \
-      }                                                                            \
-  } while (0)
-
-/* Version to test unordered.  */
-
-#define _FP_CMP_UNORD(fs, wc, ret, X, Y)                               \
-  do {                                                                 \
-    ret = ((X##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(X))       \
-          || (Y##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(Y)));   \
-  } while (0)
-
-/*
- * Main square root routine.  The input value should be cooked.
- */
-
-#define _FP_SQRT(fs, wc, R, X)                                         \
-do {                                                                   \
-    _FP_FRAC_DECL_##wc(T); _FP_FRAC_DECL_##wc(S);                      \
-    _FP_W_TYPE q;                                                      \
-    switch (X##_c)                                                     \
-    {                                                                  \
-    case FP_CLS_NAN:                                                   \
-       _FP_FRAC_COPY_##wc(R, X);                                       \
-       R##_s = X##_s;                                                  \
-       R##_c = FP_CLS_NAN;                                             \
-       break;                                                          \
-    case FP_CLS_INF:                                                   \
-       if (X##_s)                                                      \
-         {                                                             \
-           R##_s = _FP_NANSIGN_##fs;                                   \
-           R##_c = FP_CLS_NAN; /* NAN */                               \
-           _FP_FRAC_SET_##wc(R, _FP_NANFRAC_##fs);                     \
-           FP_SET_EXCEPTION(FP_EX_INVALID);                            \
-         }                                                             \
-       else                                                            \
-         {                                                             \
-           R##_s = 0;                                                  \
-           R##_c = FP_CLS_INF; /* sqrt(+inf) = +inf */                 \
-         }                                                             \
-       break;                                                          \
-    case FP_CLS_ZERO:                                                  \
-       R##_s = X##_s;                                                  \
-       R##_c = FP_CLS_ZERO; /* sqrt(+-0) = +-0 */                      \
-       break;                                                          \
-    case FP_CLS_NORMAL:                                                        \
-       R##_s = 0;                                                      \
-        if (X##_s)                                                     \
-          {                                                            \
-           R##_c = FP_CLS_NAN; /* sNAN */                              \
-           R##_s = _FP_NANSIGN_##fs;                                   \
-           _FP_FRAC_SET_##wc(R, _FP_NANFRAC_##fs);                     \
-           FP_SET_EXCEPTION(FP_EX_INVALID);                            \
-           break;                                                      \
-          }                                                            \
-       R##_c = FP_CLS_NORMAL;                                          \
-        if (X##_e & 1)                                                 \
-          _FP_FRAC_SLL_##wc(X, 1);                                     \
-        R##_e = X##_e >> 1;                                            \
-        _FP_FRAC_SET_##wc(S, _FP_ZEROFRAC_##wc);                       \
-        _FP_FRAC_SET_##wc(R, _FP_ZEROFRAC_##wc);                       \
-        q = _FP_OVERFLOW_##fs >> 1;                                    \
-        _FP_SQRT_MEAT_##wc(R, S, T, X, q);                             \
-    }                                                                  \
-  } while (0)
-
-/*
- * Convert from FP to integer.  Input is raw.
- */
-
-/* RSIGNED can have following values:
- * 0:  the number is required to be 0..(2^rsize)-1, if not, NV is set plus
- *     the result is either 0 or (2^rsize)-1 depending on the sign in such
- *     case.
- * 1:  the number is required to be -(2^(rsize-1))..(2^(rsize-1))-1, if not,
- *     NV is set plus the result is either -(2^(rsize-1)) or (2^(rsize-1))-1
- *     depending on the sign in such case.
- * -1: the number is required to be -(2^(rsize-1))..(2^rsize)-1, if not, NV is
- *     set plus the result is either -(2^(rsize-1)) or (2^(rsize-1))-1
- *     depending on the sign in such case.
- */
-#define _FP_TO_INT(fs, wc, r, X, rsize, rsigned)                       \
-do {                                                                   \
-  if (X##_e < _FP_EXPBIAS_##fs)                                                \
-    {                                                                  \
-      r = 0;                                                           \
-      if (X##_e == 0)                                                  \
-       {                                                               \
-         if (!_FP_FRAC_ZEROP_##wc(X))                                  \
-           {                                                           \
-             FP_SET_EXCEPTION(FP_EX_INEXACT);                          \
-             FP_SET_EXCEPTION(FP_EX_DENORM);                           \
-           }                                                           \
-       }                                                               \
-      else                                                             \
-       FP_SET_EXCEPTION(FP_EX_INEXACT);                                \
-    }                                                                  \
-  else if (X##_e >= _FP_EXPBIAS_##fs + rsize - (rsigned > 0 || X##_s)  \
-          || (!rsigned && X##_s))                                      \
-    {                                                                  \
-      /* Overflow or converting to the most negative integer.  */      \
-      if (rsigned)                                                     \
-       {                                                               \
-         r = 1;                                                        \
-         r <<= rsize - 1;                                              \
-         r -= 1 - X##_s;                                               \
-       } else {                                                        \
-         r = 0;                                                        \
-         if (X##_s)                                                    \
-           r = ~r;                                                     \
-       }                                                               \
-                                                                       \
-      if (rsigned && X##_s && X##_e == _FP_EXPBIAS_##fs + rsize - 1)   \
-       {                                                               \
-         /* Possibly converting to most negative integer; check the    \
-            mantissa.  */                                              \
-         int inexact = 0;                                              \
-         (void)((_FP_FRACBITS_##fs > rsize)                            \
-                ? ({ _FP_FRAC_SRST_##wc(X, inexact,                    \
-                                        _FP_FRACBITS_##fs - rsize,     \
-                                        _FP_FRACBITS_##fs); 0; })      \
-                : 0);                                                  \
-         if (!_FP_FRAC_ZEROP_##wc(X))                                  \
-           FP_SET_EXCEPTION(FP_EX_INVALID);                            \
-         else if (inexact)                                             \
-           FP_SET_EXCEPTION(FP_EX_INEXACT);                            \
-       }                                                               \
-      else                                                             \
-       FP_SET_EXCEPTION(FP_EX_INVALID);                                \
-    }                                                                  \
-  else                                                                 \
-    {                                                                  \
-      _FP_FRAC_HIGH_RAW_##fs(X) |= _FP_IMPLBIT_##fs;                   \
-      if (X##_e >= _FP_EXPBIAS_##fs + _FP_FRACBITS_##fs - 1)           \
-       {                                                               \
-         _FP_FRAC_ASSEMBLE_##wc(r, X, rsize);                          \
-         r <<= X##_e - _FP_EXPBIAS_##fs - _FP_FRACBITS_##fs + 1;       \
-       }                                                               \
-      else                                                             \
-       {                                                               \
-         int inexact;                                                  \
-         _FP_FRAC_SRST_##wc(X, inexact,                                \
-                           (_FP_FRACBITS_##fs + _FP_EXPBIAS_##fs - 1   \
-                            - X##_e),                                  \
-                           _FP_FRACBITS_##fs);                         \
-         if (inexact)                                                  \
-           FP_SET_EXCEPTION(FP_EX_INEXACT);                            \
-         _FP_FRAC_ASSEMBLE_##wc(r, X, rsize);                          \
-       }                                                               \
-      if (rsigned && X##_s)                                            \
-       r = -r;                                                         \
-    }                                                                  \
-} while (0)
-
-/* Convert integer to fp.  Output is raw.  RTYPE is unsigned even if
-   input is signed.  */
-#define _FP_FROM_INT(fs, wc, X, r, rsize, rtype)                            \
-  do {                                                                      \
-    if (r)                                                                  \
-      {                                                                             \
-       rtype ur_;                                                           \
-                                                                            \
-       if ((X##_s = (r < 0)))                                               \
-         r = -(rtype)r;                                                     \
-                                                                            \
-       ur_ = (rtype) r;                                                     \
-       (void)((rsize <= _FP_W_TYPE_SIZE)                                    \
-              ? ({                                                          \
-                   int lz_;                                                 \
-                   __FP_CLZ(lz_, (_FP_W_TYPE)ur_);                          \
-                   X##_e = _FP_EXPBIAS_##fs + _FP_W_TYPE_SIZE - 1 - lz_;    \
-                 })                                                         \
-              : ((rsize <= 2 * _FP_W_TYPE_SIZE)                             \
-                 ? ({                                                       \
-                      int lz_;                                              \
-                      __FP_CLZ_2(lz_, (_FP_W_TYPE)(ur_ >> _FP_W_TYPE_SIZE), \
-                                 (_FP_W_TYPE)ur_);                          \
-                      X##_e = (_FP_EXPBIAS_##fs + 2 * _FP_W_TYPE_SIZE - 1   \
-                               - lz_);                                      \
-                    })                                                      \
-                 : (abort(), 0)));                                          \
-                                                                            \
-       if (rsize - 1 + _FP_EXPBIAS_##fs >= _FP_EXPMAX_##fs                  \
-           && X##_e >= _FP_EXPMAX_##fs)                                     \
-         {                                                                  \
-           /* Exponent too big; overflow to infinity.  (May also            \
-              happen after rounding below.)  */                             \
-           _FP_OVERFLOW_SEMIRAW(fs, wc, X);                                 \
-           goto pack_semiraw;                                               \
-         }                                                                  \
-                                                                            \
-       if (rsize <= _FP_FRACBITS_##fs                                       \
-           || X##_e < _FP_EXPBIAS_##fs + _FP_FRACBITS_##fs)                 \
-         {                                                                  \
-           /* Exactly representable; shift left.  */                        \
-           _FP_FRAC_DISASSEMBLE_##wc(X, ur_, rsize);                        \
-           _FP_FRAC_SLL_##wc(X, (_FP_EXPBIAS_##fs                           \
-                                 + _FP_FRACBITS_##fs - 1 - X##_e));         \
-         }                                                                  \
-       else                                                                 \
-         {                                                                  \
-           /* More bits in integer than in floating type; need to           \
-              round.  */                                                    \
-           if (_FP_EXPBIAS_##fs + _FP_WFRACBITS_##fs - 1 < X##_e)           \
-             ur_ = ((ur_ >> (X##_e - _FP_EXPBIAS_##fs                       \
-                             - _FP_WFRACBITS_##fs + 1))                     \
-                    | ((ur_ << (rsize - (X##_e - _FP_EXPBIAS_##fs           \
-                                         - _FP_WFRACBITS_##fs + 1)))        \
-                       != 0));                                              \
-           _FP_FRAC_DISASSEMBLE_##wc(X, ur_, rsize);                        \
-           if ((_FP_EXPBIAS_##fs + _FP_WFRACBITS_##fs - 1 - X##_e) > 0)     \
-             _FP_FRAC_SLL_##wc(X, (_FP_EXPBIAS_##fs                         \
-                                   + _FP_WFRACBITS_##fs - 1 - X##_e));      \
-           _FP_FRAC_HIGH_##fs(X) &= ~(_FP_W_TYPE)_FP_IMPLBIT_SH_##fs;       \
-         pack_semiraw:                                                      \
-           _FP_PACK_SEMIRAW(fs, wc, X);                                     \
-         }                                                                  \
-      }                                                                             \
-    else                                                                    \
-      {                                                                             \
-       X##_s = 0;                                                           \
-       X##_e = 0;                                                           \
-       _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc);                             \
-      }                                                                             \
-  } while (0)
-
-
-/* Extend from a narrower floating-point format to a wider one.  Input
-   and output are raw.  */
-#define FP_EXTEND(dfs,sfs,dwc,swc,D,S)                                  \
-do {                                                                    \
-  if (_FP_FRACBITS_##dfs < _FP_FRACBITS_##sfs                           \
-      || (_FP_EXPMAX_##dfs - _FP_EXPBIAS_##dfs                          \
-         < _FP_EXPMAX_##sfs - _FP_EXPBIAS_##sfs)                        \
-      || (_FP_EXPBIAS_##dfs < _FP_EXPBIAS_##sfs + _FP_FRACBITS_##sfs - 1 \
-         && _FP_EXPBIAS_##dfs != _FP_EXPBIAS_##sfs))                    \
-    abort();                                                            \
-  D##_s = S##_s;                                                        \
-  _FP_FRAC_COPY_##dwc##_##swc(D, S);                                    \
-  if (_FP_EXP_NORMAL(sfs, swc, S))                                      \
-    {                                                                   \
-      D##_e = S##_e + _FP_EXPBIAS_##dfs - _FP_EXPBIAS_##sfs;            \
-      _FP_FRAC_SLL_##dwc(D, (_FP_FRACBITS_##dfs - _FP_FRACBITS_##sfs));         \
-    }                                                                   \
-  else                                                                  \
-    {                                                                   \
-      if (S##_e == 0)                                                   \
-       {                                                                \
-         if (_FP_FRAC_ZEROP_##swc(S))                                   \
-           D##_e = 0;                                                   \
-         else if (_FP_EXPBIAS_##dfs                                     \
-                  < _FP_EXPBIAS_##sfs + _FP_FRACBITS_##sfs - 1)         \
-           {                                                            \
-             FP_SET_EXCEPTION(FP_EX_DENORM);                            \
-             _FP_FRAC_SLL_##dwc(D, (_FP_FRACBITS_##dfs                  \
-                                    - _FP_FRACBITS_##sfs));             \
-             D##_e = 0;                                                 \
-           }                                                            \
-         else                                                           \
-           {                                                            \
-             int _lz;                                                   \
-             FP_SET_EXCEPTION(FP_EX_DENORM);                            \
-             _FP_FRAC_CLZ_##swc(_lz, S);                                \
-             _FP_FRAC_SLL_##dwc(D,                                      \
-                                _lz + _FP_FRACBITS_##dfs                \
-                                - _FP_FRACTBITS_##sfs);                 \
-             D##_e = (_FP_EXPBIAS_##dfs - _FP_EXPBIAS_##sfs + 1         \
-                      + _FP_FRACXBITS_##sfs - _lz);                     \
-           }                                                            \
-       }                                                                \
-      else                                                              \
-       {                                                                \
-         D##_e = _FP_EXPMAX_##dfs;                                      \
-         if (!_FP_FRAC_ZEROP_##swc(S))                                  \
-           {                                                            \
-             if (!(_FP_FRAC_HIGH_RAW_##sfs(S) & _FP_QNANBIT_##sfs))     \
-               FP_SET_EXCEPTION(FP_EX_INVALID);                         \
-             _FP_FRAC_SLL_##dwc(D, (_FP_FRACBITS_##dfs                  \
-                                    - _FP_FRACBITS_##sfs));             \
-           }                                                            \
-       }                                                                \
-    }                                                                   \
-} while (0)
-
-/* Truncate from a wider floating-point format to a narrower one.
-   Input and output are semi-raw.  */
-#define FP_TRUNC(dfs,sfs,dwc,swc,D,S)                                       \
-do {                                                                        \
-  if (_FP_FRACBITS_##sfs < _FP_FRACBITS_##dfs                               \
-      || (_FP_EXPBIAS_##sfs < _FP_EXPBIAS_##dfs + _FP_FRACBITS_##dfs - 1     \
-         && _FP_EXPBIAS_##sfs != _FP_EXPBIAS_##dfs))                        \
-    abort();                                                                \
-  D##_s = S##_s;                                                            \
-  if (_FP_EXP_NORMAL(sfs, swc, S))                                          \
-    {                                                                       \
-      D##_e = S##_e + _FP_EXPBIAS_##dfs - _FP_EXPBIAS_##sfs;                \
-      if (D##_e >= _FP_EXPMAX_##dfs)                                        \
-       _FP_OVERFLOW_SEMIRAW(dfs, dwc, D);                                   \
-      else                                                                  \
-       {                                                                    \
-         if (D##_e <= 0)                                                    \
-           {                                                                \
-             if (D##_e < 1 - _FP_FRACBITS_##dfs)                            \
-               {                                                            \
-                 _FP_FRAC_SET_##swc(S, _FP_ZEROFRAC_##swc);                 \
-                 _FP_FRAC_LOW_##swc(S) |= 1;                                \
-               }                                                            \
-             else                                                           \
-               {                                                            \
-                 _FP_FRAC_HIGH_##sfs(S) |= _FP_IMPLBIT_SH_##sfs;            \
-                 _FP_FRAC_SRS_##swc(S, (_FP_WFRACBITS_##sfs                 \
-                                        - _FP_WFRACBITS_##dfs + 1 - D##_e), \
-                                    _FP_WFRACBITS_##sfs);                   \
-               }                                                            \
-             D##_e = 0;                                                     \
-           }                                                                \
-         else                                                               \
-           _FP_FRAC_SRS_##swc(S, (_FP_WFRACBITS_##sfs                       \
-                                  - _FP_WFRACBITS_##dfs),                   \
-                              _FP_WFRACBITS_##sfs);                         \
-         _FP_FRAC_COPY_##dwc##_##swc(D, S);                                 \
-       }                                                                    \
-    }                                                                       \
-  else                                                                      \
-    {                                                                       \
-      if (S##_e == 0)                                                       \
-       {                                                                    \
-         D##_e = 0;                                                         \
-         if (_FP_FRAC_ZEROP_##swc(S))                                       \
-           _FP_FRAC_SET_##dwc(D, _FP_ZEROFRAC_##dwc);                       \
-         else                                                               \
-           {                                                                \
-             FP_SET_EXCEPTION(FP_EX_DENORM);                                \
-             if (_FP_EXPBIAS_##sfs                                          \
-                 < _FP_EXPBIAS_##dfs + _FP_FRACBITS_##dfs - 1)              \
-               {                                                            \
-                 _FP_FRAC_SRS_##swc(S, (_FP_WFRACBITS_##sfs                 \
-                                        - _FP_WFRACBITS_##dfs),             \
-                                    _FP_WFRACBITS_##sfs);                   \
-                 _FP_FRAC_COPY_##dwc##_##swc(D, S);                         \
-               }                                                            \
-             else                                                           \
-               {                                                            \
-                 _FP_FRAC_SET_##dwc(D, _FP_ZEROFRAC_##dwc);                 \
-                 _FP_FRAC_LOW_##dwc(D) |= 1;                                \
-               }                                                            \
-           }                                                                \
-       }                                                                    \
-      else                                                                  \
-       {                                                                    \
-         D##_e = _FP_EXPMAX_##dfs;                                          \
-         if (_FP_FRAC_ZEROP_##swc(S))                                       \
-           _FP_FRAC_SET_##dwc(D, _FP_ZEROFRAC_##dwc);                       \
-         else                                                               \
-           {                                                                \
-             _FP_CHECK_SIGNAN_SEMIRAW(sfs, swc, S);                         \
-             _FP_FRAC_SRL_##swc(S, (_FP_WFRACBITS_##sfs                     \
-                                    - _FP_WFRACBITS_##dfs));                \
-             _FP_FRAC_COPY_##dwc##_##swc(D, S);                             \
-             /* Semi-raw NaN must have all workbits cleared.  */            \
-             _FP_FRAC_LOW_##dwc(D)                                          \
-               &= ~(_FP_W_TYPE) ((1 << _FP_WORKBITS) - 1);                  \
-             _FP_FRAC_HIGH_##dfs(D) |= _FP_QNANBIT_SH_##dfs;                \
-           }                                                                \
-       }                                                                    \
-    }                                                                       \
-} while (0)
-
-/*
- * Helper primitives.
- */
-
-/* Count leading zeros in a word.  */
-
-#ifndef __FP_CLZ
-/* GCC 3.4 and later provide the builtins for us.  */
-#define __FP_CLZ(r, x)                                                       \
-  do {                                                                       \
-    if (sizeof (_FP_W_TYPE) == sizeof (unsigned int))                        \
-      r = __builtin_clz (x);                                                 \
-    else if (sizeof (_FP_W_TYPE) == sizeof (unsigned long))                  \
-      r = __builtin_clzl (x);                                                \
-    else if (sizeof (_FP_W_TYPE) == sizeof (unsigned long long))             \
-      r = __builtin_clzll (x);                                               \
-    else                                                                     \
-      abort ();                                                                      \
-  } while (0)
-#endif /* ndef __FP_CLZ */
-
-#define _FP_DIV_HELP_imm(q, r, n, d)           \
-  do {                                         \
-    q = n / d, r = n % d;                      \
-  } while (0)
-
-
-/* A restoring bit-by-bit division primitive.  */
-
-#define _FP_DIV_MEAT_N_loop(fs, wc, R, X, Y)                           \
-  do {                                                                 \
-    int count = _FP_WFRACBITS_##fs;                                    \
-    _FP_FRAC_DECL_##wc (u);                                            \
-    _FP_FRAC_DECL_##wc (v);                                            \
-    _FP_FRAC_COPY_##wc (u, X);                                         \
-    _FP_FRAC_COPY_##wc (v, Y);                                         \
-    _FP_FRAC_SET_##wc (R, _FP_ZEROFRAC_##wc);                          \
-    /* Normalize U and V.  */                                          \
-    _FP_FRAC_SLL_##wc (u, _FP_WFRACXBITS_##fs);                                \
-    _FP_FRAC_SLL_##wc (v, _FP_WFRACXBITS_##fs);                                \
-    /* First round.  Since the operands are normalized, either the     \
-       first or second bit will be set in the fraction.  Produce a     \
-       normalized result by checking which and adjusting the loop      \
-       count and exponent accordingly.  */                             \
-    if (_FP_FRAC_GE_1 (u, v))                                          \
-      {                                                                        \
-       _FP_FRAC_SUB_##wc (u, u, v);                                    \
-       _FP_FRAC_LOW_##wc (R) |= 1;                                     \
-       count--;                                                        \
-      }                                                                        \
-    else                                                               \
-      R##_e--;                                                         \
-    /* Subsequent rounds.  */                                          \
-    do {                                                               \
-      int msb = (_FP_WS_TYPE) _FP_FRAC_HIGH_##wc (u) < 0;              \
-      _FP_FRAC_SLL_##wc (u, 1);                                                \
-      _FP_FRAC_SLL_##wc (R, 1);                                                \
-      if (msb || _FP_FRAC_GE_1 (u, v))                                 \
-       {                                                               \
-         _FP_FRAC_SUB_##wc (u, u, v);                                  \
-         _FP_FRAC_LOW_##wc (R) |= 1;                                   \
-       }                                                               \
-    } while (--count > 0);                                             \
-    /* If there's anything left in U, the result is inexact.  */       \
-    _FP_FRAC_LOW_##wc (R) |= !_FP_FRAC_ZEROP_##wc (u);                 \
-  } while (0)
-
-#define _FP_DIV_MEAT_1_loop(fs, R, X, Y)  _FP_DIV_MEAT_N_loop (fs, 1, R, X, Y)
-#define _FP_DIV_MEAT_2_loop(fs, R, X, Y)  _FP_DIV_MEAT_N_loop (fs, 2, R, X, Y)
-#define _FP_DIV_MEAT_4_loop(fs, R, X, Y)  _FP_DIV_MEAT_N_loop (fs, 4, R, X, Y)
diff --git a/gcc/config/soft-fp/quad.h b/gcc/config/soft-fp/quad.h
deleted file mode 100644 (file)
index c22e944..0000000
+++ /dev/null
@@ -1,271 +0,0 @@
-/* Software floating-point emulation.
-   Definitions for IEEE Quad Precision.
-   Copyright (C) 1997,1998,1999,2006,2007 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com),
-                 Jakub Jelinek (jj@ultra.linux.cz),
-                 David S. Miller (davem@redhat.com) and
-                 Peter Maydell (pmaydell@chiark.greenend.org.uk).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#if _FP_W_TYPE_SIZE < 32
-#error "Here's a nickel, kid. Go buy yourself a real computer."
-#endif
-
-#if _FP_W_TYPE_SIZE < 64
-#define _FP_FRACTBITS_Q         (4*_FP_W_TYPE_SIZE)
-#else
-#define _FP_FRACTBITS_Q                (2*_FP_W_TYPE_SIZE)
-#endif
-
-#define _FP_FRACBITS_Q         113
-#define _FP_FRACXBITS_Q                (_FP_FRACTBITS_Q - _FP_FRACBITS_Q)
-#define _FP_WFRACBITS_Q                (_FP_WORKBITS + _FP_FRACBITS_Q)
-#define _FP_WFRACXBITS_Q       (_FP_FRACTBITS_Q - _FP_WFRACBITS_Q)
-#define _FP_EXPBITS_Q          15
-#define _FP_EXPBIAS_Q          16383
-#define _FP_EXPMAX_Q           32767
-
-#define _FP_QNANBIT_Q          \
-       ((_FP_W_TYPE)1 << (_FP_FRACBITS_Q-2) % _FP_W_TYPE_SIZE)
-#define _FP_QNANBIT_SH_Q               \
-       ((_FP_W_TYPE)1 << (_FP_FRACBITS_Q-2+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
-#define _FP_IMPLBIT_Q          \
-       ((_FP_W_TYPE)1 << (_FP_FRACBITS_Q-1) % _FP_W_TYPE_SIZE)
-#define _FP_IMPLBIT_SH_Q               \
-       ((_FP_W_TYPE)1 << (_FP_FRACBITS_Q-1+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
-#define _FP_OVERFLOW_Q         \
-       ((_FP_W_TYPE)1 << (_FP_WFRACBITS_Q % _FP_W_TYPE_SIZE))
-
-typedef float TFtype __attribute__((mode(TF)));
-
-#if _FP_W_TYPE_SIZE < 64
-
-union _FP_UNION_Q
-{
-   TFtype flt;
-   struct 
-   {
-#if __BYTE_ORDER == __BIG_ENDIAN
-      unsigned sign : 1;
-      unsigned exp : _FP_EXPBITS_Q;
-      unsigned long frac3 : _FP_FRACBITS_Q - (_FP_IMPLBIT_Q != 0)-(_FP_W_TYPE_SIZE * 3);
-      unsigned long frac2 : _FP_W_TYPE_SIZE;
-      unsigned long frac1 : _FP_W_TYPE_SIZE;
-      unsigned long frac0 : _FP_W_TYPE_SIZE;
-#else
-      unsigned long frac0 : _FP_W_TYPE_SIZE;
-      unsigned long frac1 : _FP_W_TYPE_SIZE;
-      unsigned long frac2 : _FP_W_TYPE_SIZE;
-      unsigned long frac3 : _FP_FRACBITS_Q - (_FP_IMPLBIT_Q != 0)-(_FP_W_TYPE_SIZE * 3);
-      unsigned exp : _FP_EXPBITS_Q;
-      unsigned sign : 1;
-#endif /* not bigendian */
-   } bits __attribute__((packed));
-};
-
-
-#define FP_DECL_Q(X)           _FP_DECL(4,X)
-#define FP_UNPACK_RAW_Q(X,val) _FP_UNPACK_RAW_4(Q,X,val)
-#define FP_UNPACK_RAW_QP(X,val)        _FP_UNPACK_RAW_4_P(Q,X,val)
-#define FP_PACK_RAW_Q(val,X)   _FP_PACK_RAW_4(Q,val,X)
-#define FP_PACK_RAW_QP(val,X)          \
-  do {                                 \
-    if (!FP_INHIBIT_RESULTS)           \
-      _FP_PACK_RAW_4_P(Q,val,X);       \
-  } while (0)
-
-#define FP_UNPACK_Q(X,val)             \
-  do {                                 \
-    _FP_UNPACK_RAW_4(Q,X,val);         \
-    _FP_UNPACK_CANONICAL(Q,4,X);       \
-  } while (0)
-
-#define FP_UNPACK_QP(X,val)            \
-  do {                                 \
-    _FP_UNPACK_RAW_4_P(Q,X,val);       \
-    _FP_UNPACK_CANONICAL(Q,4,X);       \
-  } while (0)
-
-#define FP_UNPACK_SEMIRAW_Q(X,val)     \
-  do {                                 \
-    _FP_UNPACK_RAW_4(Q,X,val);         \
-    _FP_UNPACK_SEMIRAW(Q,4,X);         \
-  } while (0)
-
-#define FP_UNPACK_SEMIRAW_QP(X,val)    \
-  do {                                 \
-    _FP_UNPACK_RAW_4_P(Q,X,val);       \
-    _FP_UNPACK_SEMIRAW(Q,4,X);         \
-  } while (0)
-
-#define FP_PACK_Q(val,X)               \
-  do {                                 \
-    _FP_PACK_CANONICAL(Q,4,X);         \
-    _FP_PACK_RAW_4(Q,val,X);           \
-  } while (0)
-
-#define FP_PACK_QP(val,X)              \
-  do {                                 \
-    _FP_PACK_CANONICAL(Q,4,X);         \
-    if (!FP_INHIBIT_RESULTS)           \
-      _FP_PACK_RAW_4_P(Q,val,X);       \
-  } while (0)
-
-#define FP_PACK_SEMIRAW_Q(val,X)       \
-  do {                                 \
-    _FP_PACK_SEMIRAW(Q,4,X);           \
-    _FP_PACK_RAW_4(Q,val,X);           \
-  } while (0)
-
-#define FP_PACK_SEMIRAW_QP(val,X)      \
-  do {                                 \
-    _FP_PACK_SEMIRAW(Q,4,X);           \
-    if (!FP_INHIBIT_RESULTS)           \
-      _FP_PACK_RAW_4_P(Q,val,X);       \
-  } while (0)
-
-#define FP_ISSIGNAN_Q(X)               _FP_ISSIGNAN(Q,4,X)
-#define FP_NEG_Q(R,X)                  _FP_NEG(Q,4,R,X)
-#define FP_ADD_Q(R,X,Y)                        _FP_ADD(Q,4,R,X,Y)
-#define FP_SUB_Q(R,X,Y)                        _FP_SUB(Q,4,R,X,Y)
-#define FP_MUL_Q(R,X,Y)                        _FP_MUL(Q,4,R,X,Y)
-#define FP_DIV_Q(R,X,Y)                        _FP_DIV(Q,4,R,X,Y)
-#define FP_SQRT_Q(R,X)                 _FP_SQRT(Q,4,R,X)
-#define _FP_SQRT_MEAT_Q(R,S,T,X,Q)     _FP_SQRT_MEAT_4(R,S,T,X,Q)
-
-#define FP_CMP_Q(r,X,Y,un)     _FP_CMP(Q,4,r,X,Y,un)
-#define FP_CMP_EQ_Q(r,X,Y)     _FP_CMP_EQ(Q,4,r,X,Y)
-#define FP_CMP_UNORD_Q(r,X,Y)  _FP_CMP_UNORD(Q,4,r,X,Y)
-
-#define FP_TO_INT_Q(r,X,rsz,rsg)       _FP_TO_INT(Q,4,r,X,rsz,rsg)
-#define FP_FROM_INT_Q(X,r,rs,rt)       _FP_FROM_INT(Q,4,X,r,rs,rt)
-
-#define _FP_FRAC_HIGH_Q(X)     _FP_FRAC_HIGH_4(X)
-#define _FP_FRAC_HIGH_RAW_Q(X) _FP_FRAC_HIGH_4(X)
-
-#else   /* not _FP_W_TYPE_SIZE < 64 */
-union _FP_UNION_Q
-{
-  TFtype flt /* __attribute__((mode(TF))) */ ;
-  struct {
-    _FP_W_TYPE a, b;
-  } longs;
-  struct {
-#if __BYTE_ORDER == __BIG_ENDIAN
-    unsigned sign    : 1;
-    unsigned exp     : _FP_EXPBITS_Q;
-    _FP_W_TYPE frac1 : _FP_FRACBITS_Q - (_FP_IMPLBIT_Q != 0) - _FP_W_TYPE_SIZE;
-    _FP_W_TYPE frac0 : _FP_W_TYPE_SIZE;
-#else
-    _FP_W_TYPE frac0 : _FP_W_TYPE_SIZE;
-    _FP_W_TYPE frac1 : _FP_FRACBITS_Q - (_FP_IMPLBIT_Q != 0) - _FP_W_TYPE_SIZE;
-    unsigned exp     : _FP_EXPBITS_Q;
-    unsigned sign    : 1;
-#endif
-  } bits;
-};
-
-#define FP_DECL_Q(X)           _FP_DECL(2,X)
-#define FP_UNPACK_RAW_Q(X,val) _FP_UNPACK_RAW_2(Q,X,val)
-#define FP_UNPACK_RAW_QP(X,val)        _FP_UNPACK_RAW_2_P(Q,X,val)
-#define FP_PACK_RAW_Q(val,X)   _FP_PACK_RAW_2(Q,val,X)
-#define FP_PACK_RAW_QP(val,X)          \
-  do {                                 \
-    if (!FP_INHIBIT_RESULTS)           \
-      _FP_PACK_RAW_2_P(Q,val,X);       \
-  } while (0)
-
-#define FP_UNPACK_Q(X,val)             \
-  do {                                 \
-    _FP_UNPACK_RAW_2(Q,X,val);         \
-    _FP_UNPACK_CANONICAL(Q,2,X);       \
-  } while (0)
-
-#define FP_UNPACK_QP(X,val)            \
-  do {                                 \
-    _FP_UNPACK_RAW_2_P(Q,X,val);       \
-    _FP_UNPACK_CANONICAL(Q,2,X);       \
-  } while (0)
-
-#define FP_UNPACK_SEMIRAW_Q(X,val)     \
-  do {                                 \
-    _FP_UNPACK_RAW_2(Q,X,val);         \
-    _FP_UNPACK_SEMIRAW(Q,2,X);         \
-  } while (0)
-
-#define FP_UNPACK_SEMIRAW_QP(X,val)    \
-  do {                                 \
-    _FP_UNPACK_RAW_2_P(Q,X,val);       \
-    _FP_UNPACK_SEMIRAW(Q,2,X);         \
-  } while (0)
-
-#define FP_PACK_Q(val,X)               \
-  do {                                 \
-    _FP_PACK_CANONICAL(Q,2,X);         \
-    _FP_PACK_RAW_2(Q,val,X);           \
-  } while (0)
-
-#define FP_PACK_QP(val,X)              \
-  do {                                 \
-    _FP_PACK_CANONICAL(Q,2,X);         \
-    if (!FP_INHIBIT_RESULTS)           \
-      _FP_PACK_RAW_2_P(Q,val,X);       \
-  } while (0)
-
-#define FP_PACK_SEMIRAW_Q(val,X)       \
-  do {                                 \
-    _FP_PACK_SEMIRAW(Q,2,X);           \
-    _FP_PACK_RAW_2(Q,val,X);           \
-  } while (0)
-
-#define FP_PACK_SEMIRAW_QP(val,X)      \
-  do {                                 \
-    _FP_PACK_SEMIRAW(Q,2,X);           \
-    if (!FP_INHIBIT_RESULTS)           \
-      _FP_PACK_RAW_2_P(Q,val,X);       \
-  } while (0)
-
-#define FP_ISSIGNAN_Q(X)               _FP_ISSIGNAN(Q,2,X)
-#define FP_NEG_Q(R,X)                  _FP_NEG(Q,2,R,X)
-#define FP_ADD_Q(R,X,Y)                        _FP_ADD(Q,2,R,X,Y)
-#define FP_SUB_Q(R,X,Y)                        _FP_SUB(Q,2,R,X,Y)
-#define FP_MUL_Q(R,X,Y)                        _FP_MUL(Q,2,R,X,Y)
-#define FP_DIV_Q(R,X,Y)                        _FP_DIV(Q,2,R,X,Y)
-#define FP_SQRT_Q(R,X)                 _FP_SQRT(Q,2,R,X)
-#define _FP_SQRT_MEAT_Q(R,S,T,X,Q)     _FP_SQRT_MEAT_2(R,S,T,X,Q)
-
-#define FP_CMP_Q(r,X,Y,un)     _FP_CMP(Q,2,r,X,Y,un)
-#define FP_CMP_EQ_Q(r,X,Y)     _FP_CMP_EQ(Q,2,r,X,Y)
-#define FP_CMP_UNORD_Q(r,X,Y)  _FP_CMP_UNORD(Q,2,r,X,Y)
-
-#define FP_TO_INT_Q(r,X,rsz,rsg)       _FP_TO_INT(Q,2,r,X,rsz,rsg)
-#define FP_FROM_INT_Q(X,r,rs,rt)       _FP_FROM_INT(Q,2,X,r,rs,rt)
-
-#define _FP_FRAC_HIGH_Q(X)     _FP_FRAC_HIGH_2(X)
-#define _FP_FRAC_HIGH_RAW_Q(X) _FP_FRAC_HIGH_2(X)
-
-#endif /* not _FP_W_TYPE_SIZE < 64 */
diff --git a/gcc/config/soft-fp/single.h b/gcc/config/soft-fp/single.h
deleted file mode 100644 (file)
index 9c3734a..0000000
+++ /dev/null
@@ -1,151 +0,0 @@
-/* Software floating-point emulation.
-   Definitions for IEEE Single Precision.
-   Copyright (C) 1997,1998,1999,2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com),
-                 Jakub Jelinek (jj@ultra.linux.cz),
-                 David S. Miller (davem@redhat.com) and
-                 Peter Maydell (pmaydell@chiark.greenend.org.uk).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#if _FP_W_TYPE_SIZE < 32
-#error "Here's a nickel kid.  Go buy yourself a real computer."
-#endif
-
-#define _FP_FRACTBITS_S                _FP_W_TYPE_SIZE
-
-#define _FP_FRACBITS_S         24
-#define _FP_FRACXBITS_S                (_FP_FRACTBITS_S - _FP_FRACBITS_S)
-#define _FP_WFRACBITS_S                (_FP_WORKBITS + _FP_FRACBITS_S)
-#define _FP_WFRACXBITS_S       (_FP_FRACTBITS_S - _FP_WFRACBITS_S)
-#define _FP_EXPBITS_S          8
-#define _FP_EXPBIAS_S          127
-#define _FP_EXPMAX_S           255
-#define _FP_QNANBIT_S          ((_FP_W_TYPE)1 << (_FP_FRACBITS_S-2))
-#define _FP_QNANBIT_SH_S       ((_FP_W_TYPE)1 << (_FP_FRACBITS_S-2+_FP_WORKBITS))
-#define _FP_IMPLBIT_S          ((_FP_W_TYPE)1 << (_FP_FRACBITS_S-1))
-#define _FP_IMPLBIT_SH_S       ((_FP_W_TYPE)1 << (_FP_FRACBITS_S-1+_FP_WORKBITS))
-#define _FP_OVERFLOW_S         ((_FP_W_TYPE)1 << (_FP_WFRACBITS_S))
-
-/* The implementation of _FP_MUL_MEAT_S and _FP_DIV_MEAT_S should be
-   chosen by the target machine.  */
-
-typedef float SFtype __attribute__((mode(SF)));
-
-union _FP_UNION_S
-{
-  SFtype flt;
-  struct {
-#if __BYTE_ORDER == __BIG_ENDIAN
-    unsigned sign : 1;
-    unsigned exp  : _FP_EXPBITS_S;
-    unsigned frac : _FP_FRACBITS_S - (_FP_IMPLBIT_S != 0);
-#else
-    unsigned frac : _FP_FRACBITS_S - (_FP_IMPLBIT_S != 0);
-    unsigned exp  : _FP_EXPBITS_S;
-    unsigned sign : 1;
-#endif
-  } bits __attribute__((packed));
-};
-
-#define FP_DECL_S(X)           _FP_DECL(1,X)
-#define FP_UNPACK_RAW_S(X,val) _FP_UNPACK_RAW_1(S,X,val)
-#define FP_UNPACK_RAW_SP(X,val)        _FP_UNPACK_RAW_1_P(S,X,val)
-#define FP_PACK_RAW_S(val,X)   _FP_PACK_RAW_1(S,val,X)
-#define FP_PACK_RAW_SP(val,X)          \
-  do {                                 \
-    if (!FP_INHIBIT_RESULTS)           \
-      _FP_PACK_RAW_1_P(S,val,X);       \
-  } while (0)
-
-#define FP_UNPACK_S(X,val)             \
-  do {                                 \
-    _FP_UNPACK_RAW_1(S,X,val);         \
-    _FP_UNPACK_CANONICAL(S,1,X);       \
-  } while (0)
-
-#define FP_UNPACK_SP(X,val)            \
-  do {                                 \
-    _FP_UNPACK_RAW_1_P(S,X,val);       \
-    _FP_UNPACK_CANONICAL(S,1,X);       \
-  } while (0)
-
-#define FP_UNPACK_SEMIRAW_S(X,val)     \
-  do {                                 \
-    _FP_UNPACK_RAW_1(S,X,val);         \
-    _FP_UNPACK_SEMIRAW(S,1,X);         \
-  } while (0)
-
-#define FP_UNPACK_SEMIRAW_SP(X,val)    \
-  do {                                 \
-    _FP_UNPACK_RAW_1_P(S,X,val);       \
-    _FP_UNPACK_SEMIRAW(S,1,X);         \
-  } while (0)
-
-#define FP_PACK_S(val,X)               \
-  do {                                 \
-    _FP_PACK_CANONICAL(S,1,X);         \
-    _FP_PACK_RAW_1(S,val,X);           \
-  } while (0)
-
-#define FP_PACK_SP(val,X)              \
-  do {                                 \
-    _FP_PACK_CANONICAL(S,1,X);         \
-    if (!FP_INHIBIT_RESULTS)           \
-      _FP_PACK_RAW_1_P(S,val,X);       \
-  } while (0)
-
-#define FP_PACK_SEMIRAW_S(val,X)       \
-  do {                                 \
-    _FP_PACK_SEMIRAW(S,1,X);           \
-    _FP_PACK_RAW_1(S,val,X);           \
-  } while (0)
-
-#define FP_PACK_SEMIRAW_SP(val,X)      \
-  do {                                 \
-    _FP_PACK_SEMIRAW(S,1,X);           \
-    if (!FP_INHIBIT_RESULTS)           \
-      _FP_PACK_RAW_1_P(S,val,X);       \
-  } while (0)
-
-#define FP_ISSIGNAN_S(X)               _FP_ISSIGNAN(S,1,X)
-#define FP_NEG_S(R,X)                  _FP_NEG(S,1,R,X)
-#define FP_ADD_S(R,X,Y)                        _FP_ADD(S,1,R,X,Y)
-#define FP_SUB_S(R,X,Y)                        _FP_SUB(S,1,R,X,Y)
-#define FP_MUL_S(R,X,Y)                        _FP_MUL(S,1,R,X,Y)
-#define FP_DIV_S(R,X,Y)                        _FP_DIV(S,1,R,X,Y)
-#define FP_SQRT_S(R,X)                 _FP_SQRT(S,1,R,X)
-#define _FP_SQRT_MEAT_S(R,S,T,X,Q)     _FP_SQRT_MEAT_1(R,S,T,X,Q)
-
-#define FP_CMP_S(r,X,Y,un)     _FP_CMP(S,1,r,X,Y,un)
-#define FP_CMP_EQ_S(r,X,Y)     _FP_CMP_EQ(S,1,r,X,Y)
-#define FP_CMP_UNORD_S(r,X,Y)  _FP_CMP_UNORD(S,1,r,X,Y)
-
-#define FP_TO_INT_S(r,X,rsz,rsg)       _FP_TO_INT(S,1,r,X,rsz,rsg)
-#define FP_FROM_INT_S(X,r,rs,rt)       _FP_FROM_INT(S,1,X,r,rs,rt)
-
-#define _FP_FRAC_HIGH_S(X)     _FP_FRAC_HIGH_1(X)
-#define _FP_FRAC_HIGH_RAW_S(X) _FP_FRAC_HIGH_1(X)
diff --git a/gcc/config/soft-fp/soft-fp.h b/gcc/config/soft-fp/soft-fp.h
deleted file mode 100644 (file)
index 2307357..0000000
+++ /dev/null
@@ -1,213 +0,0 @@
-/* Software floating-point emulation.
-   Copyright (C) 1997,1998,1999,2000,2002,2003,2005,2006
-       Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com),
-                 Jakub Jelinek (jj@ultra.linux.cz),
-                 David S. Miller (davem@redhat.com) and
-                 Peter Maydell (pmaydell@chiark.greenend.org.uk).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#ifndef SOFT_FP_H
-#define SOFT_FP_H
-
-#ifdef _LIBC
-#include <sfp-machine.h>
-#else
-#include "sfp-machine.h"
-#endif
-
-/* Allow sfp-machine to have its own byte order definitions. */
-#ifndef __BYTE_ORDER
-#ifdef _LIBC
-#include <endian.h>
-#else
-#error "endianness not defined by sfp-machine.h"
-#endif
-#endif
-
-#define _FP_WORKBITS           3
-#define _FP_WORK_LSB           ((_FP_W_TYPE)1 << 3)
-#define _FP_WORK_ROUND         ((_FP_W_TYPE)1 << 2)
-#define _FP_WORK_GUARD         ((_FP_W_TYPE)1 << 1)
-#define _FP_WORK_STICKY                ((_FP_W_TYPE)1 << 0)
-
-#ifndef FP_RND_NEAREST
-# define FP_RND_NEAREST                0
-# define FP_RND_ZERO           1
-# define FP_RND_PINF           2
-# define FP_RND_MINF           3
-#endif
-#ifndef FP_ROUNDMODE
-# define FP_ROUNDMODE          FP_RND_NEAREST
-#endif
-
-/* By default don't care about exceptions. */
-#ifndef FP_EX_INVALID
-#define FP_EX_INVALID          0
-#endif
-#ifndef FP_EX_OVERFLOW
-#define FP_EX_OVERFLOW         0
-#endif
-#ifndef FP_EX_UNDERFLOW
-#define FP_EX_UNDERFLOW                0
-#endif
-#ifndef FP_EX_DIVZERO
-#define FP_EX_DIVZERO          0
-#endif
-#ifndef FP_EX_INEXACT
-#define FP_EX_INEXACT          0
-#endif
-#ifndef FP_EX_DENORM
-#define FP_EX_DENORM           0
-#endif
-
-#ifdef _FP_DECL_EX
-#define FP_DECL_EX                                     \
-  int _fex = 0;                                                \
-  _FP_DECL_EX
-#else
-#define FP_DECL_EX int _fex = 0
-#endif
-
-#ifndef FP_INIT_ROUNDMODE
-#define FP_INIT_ROUNDMODE do {} while (0)
-#endif
-
-#ifndef FP_HANDLE_EXCEPTIONS
-#define FP_HANDLE_EXCEPTIONS do {} while (0)
-#endif
-
-#ifndef FP_INHIBIT_RESULTS
-/* By default we write the results always.
- * sfp-machine may override this and e.g.
- * check if some exceptions are unmasked
- * and inhibit it in such a case.
- */
-#define FP_INHIBIT_RESULTS 0
-#endif
-
-#define FP_SET_EXCEPTION(ex)                           \
-  _fex |= (ex)
-
-#define FP_UNSET_EXCEPTION(ex)                         \
-  _fex &= ~(ex)
-
-#define FP_CLEAR_EXCEPTIONS                            \
-  _fex = 0
-
-#define _FP_ROUND_NEAREST(wc, X)                       \
-do {                                                   \
-    if ((_FP_FRAC_LOW_##wc(X) & 15) != _FP_WORK_ROUND) \
-      _FP_FRAC_ADDI_##wc(X, _FP_WORK_ROUND);           \
-} while (0)
-
-#define _FP_ROUND_ZERO(wc, X)          (void)0
-
-#define _FP_ROUND_PINF(wc, X)                          \
-do {                                                   \
-    if (!X##_s && (_FP_FRAC_LOW_##wc(X) & 7))          \
-      _FP_FRAC_ADDI_##wc(X, _FP_WORK_LSB);             \
-} while (0)
-
-#define _FP_ROUND_MINF(wc, X)                          \
-do {                                                   \
-    if (X##_s && (_FP_FRAC_LOW_##wc(X) & 7))           \
-      _FP_FRAC_ADDI_##wc(X, _FP_WORK_LSB);             \
-} while (0)
-
-#define _FP_ROUND(wc, X)                       \
-do {                                           \
-       if (_FP_FRAC_LOW_##wc(X) & 7)           \
-         FP_SET_EXCEPTION(FP_EX_INEXACT);      \
-       switch (FP_ROUNDMODE)                   \
-       {                                       \
-         case FP_RND_NEAREST:                  \
-           _FP_ROUND_NEAREST(wc,X);            \
-           break;                              \
-         case FP_RND_ZERO:                     \
-           _FP_ROUND_ZERO(wc,X);               \
-           break;                              \
-         case FP_RND_PINF:                     \
-           _FP_ROUND_PINF(wc,X);               \
-           break;                              \
-         case FP_RND_MINF:                     \
-           _FP_ROUND_MINF(wc,X);               \
-           break;                              \
-       }                                       \
-} while (0)
-
-#define FP_CLS_NORMAL          0
-#define FP_CLS_ZERO            1
-#define FP_CLS_INF             2
-#define FP_CLS_NAN             3
-
-#define _FP_CLS_COMBINE(x,y)   (((x) << 2) | (y))
-
-#include "op-1.h"
-#include "op-2.h"
-#include "op-4.h"
-#include "op-8.h"
-#include "op-common.h"
-
-/* Sigh.  Silly things longlong.h needs.  */
-#define UWtype         _FP_W_TYPE
-#define W_TYPE_SIZE    _FP_W_TYPE_SIZE
-
-typedef int QItype __attribute__((mode(QI)));
-typedef int SItype __attribute__((mode(SI)));
-typedef int DItype __attribute__((mode(DI)));
-typedef unsigned int UQItype __attribute__((mode(QI)));
-typedef unsigned int USItype __attribute__((mode(SI)));
-typedef unsigned int UDItype __attribute__((mode(DI)));
-#if _FP_W_TYPE_SIZE == 32
-typedef unsigned int UHWtype __attribute__((mode(HI)));
-#elif _FP_W_TYPE_SIZE == 64
-typedef USItype UHWtype;
-#endif
-
-#ifndef CMPtype
-#define CMPtype                int
-#endif
-
-#define SI_BITS                (__CHAR_BIT__ * (int)sizeof(SItype))
-#define DI_BITS                (__CHAR_BIT__ * (int)sizeof(DItype))
-
-#ifndef umul_ppmm
-#ifdef _LIBC
-#include <stdlib/longlong.h>
-#else
-#include "longlong.h"
-#endif
-#endif
-
-#ifdef _LIBC
-#include <stdlib.h>
-#else
-extern void abort (void);
-#endif
-
-#endif
diff --git a/gcc/config/soft-fp/subdf3.c b/gcc/config/soft-fp/subdf3.c
deleted file mode 100644 (file)
index 3978b52..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Software floating-point emulation.
-   Return a - b
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "double.h"
-
-DFtype __subdf3(DFtype a, DFtype b)
-{
-  FP_DECL_EX;
-  FP_DECL_D(A); FP_DECL_D(B); FP_DECL_D(R);
-  DFtype r;
-
-  FP_INIT_ROUNDMODE;
-  FP_UNPACK_SEMIRAW_D(A, a);
-  FP_UNPACK_SEMIRAW_D(B, b);
-  FP_SUB_D(R, A, B);
-  FP_PACK_SEMIRAW_D(r, R);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
diff --git a/gcc/config/soft-fp/subsf3.c b/gcc/config/soft-fp/subsf3.c
deleted file mode 100644 (file)
index f1cbdd1..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Software floating-point emulation.
-   Return a - b
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "single.h"
-
-SFtype __subsf3(SFtype a, SFtype b)
-{
-  FP_DECL_EX;
-  FP_DECL_S(A); FP_DECL_S(B); FP_DECL_S(R);
-  SFtype r;
-
-  FP_INIT_ROUNDMODE;
-  FP_UNPACK_SEMIRAW_S(A, a);
-  FP_UNPACK_SEMIRAW_S(B, b);
-  FP_SUB_S(R, A, B);
-  FP_PACK_SEMIRAW_S(r, R);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
diff --git a/gcc/config/soft-fp/subtf3.c b/gcc/config/soft-fp/subtf3.c
deleted file mode 100644 (file)
index 7ba4c8c..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Software floating-point emulation.
-   Return a - b
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "quad.h"
-
-TFtype __subtf3(TFtype a, TFtype b)
-{
-  FP_DECL_EX;
-  FP_DECL_Q(A); FP_DECL_Q(B); FP_DECL_Q(R);
-  TFtype r;
-
-  FP_INIT_ROUNDMODE;
-  FP_UNPACK_SEMIRAW_Q(A, a);
-  FP_UNPACK_SEMIRAW_Q(B, b);
-  FP_SUB_Q(R, A, B);
-  FP_PACK_SEMIRAW_Q(r, R);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
diff --git a/gcc/config/soft-fp/t-softfp b/gcc/config/soft-fp/t-softfp
deleted file mode 100644 (file)
index b595907..0000000
+++ /dev/null
@@ -1,107 +0,0 @@
-# Copyright (C) 2006, 2007 Free Software Foundation, Inc.
-
-# This file is part of GCC.
-
-# GCC is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-
-# GCC is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with GCC; see the file COPYING3.  If not see
-# <http://www.gnu.org/licenses/>.
-
-# Targets using soft-fp should define the following variables:
-#
-# softfp_float_modes: a list of soft-float floating-point modes,
-#                     e.g. sf df
-# softfp_int_modes: a list of integer modes for which to define conversions,
-#                   e.g. si di
-# softfp_extensions: a list of extensions between floating-point modes,
-#                    e.g. sfdf
-# softfp_truncations: a list of truncations between floating-point modes,
-#                     e.g. dfsf
-# softfp_machine_header: the target sfp-machine.h file (relative to config/),
-#                        e.g. rs6000/sfp-machine.h
-#
-# Extensions and truncations should include those where only one mode
-# is a soft-float mode; for example, sftf where sf is hard-float and
-# tf is soft-float.
-#
-# If the libgcc2.c functions should not be replaced, also define:
-#
-# softfp_exclude_libgcc2 := y
-#
-# Avoiding replacing the libgcc2.c functions is a temporary measure
-# for targets with both hard-float and soft-float multilibs, since
-# these variables apply for all multilibs.  With toplevel libgcc,
-# soft-fp can be used conditionally on the multilib instead.
-#
-# If the code should not be compiled at all for some multilibs, define:
-#
-# softfp_wrap_start: text to put at the start of wrapper source files,
-#                    output with echo
-#                    e.g. '#ifndef __powerpc64__'
-# softfp_wrap_end: text to put at the end of wrapper source files,
-#                  e.g. '#endif'
-#
-# This is another temporary measure.
-
-softfp_float_funcs = add$(m)3 div$(m)3 eq$(m)2 ge$(m)2 le$(m)2 mul$(m)3 \
-  neg$(m)2 sub$(m)3 unord$(m)2
-softfp_floatint_funcs = fix$(m)$(i) fixuns$(m)$(i) \
-  float$(i)$(m) floatun$(i)$(m)
-
-softfp_func_list := \
-  $(foreach m,$(softfp_float_modes), \
-              $(softfp_float_funcs) \
-              $(foreach i,$(softfp_int_modes), \
-                          $(softfp_floatint_funcs))) \
-  $(foreach e,$(softfp_extensions),extend$(e)2) \
-  $(foreach t,$(softfp_truncations),trunc$(t)2)
-
-ifeq ($(softfp_exclude_libgcc2),y)
-# This list is taken from mklibgcc.in and doesn't presently allow for
-# 64-bit targets where si should become di and di should become ti.
-softfp_func_list := $(filter-out floatdidf floatdisf fixunsdfsi fixunssfsi \
-  fixunsdfdi fixdfdi fixunssfdi fixsfdi fixxfdi fixunsxfdi \
-  floatdixf fixunsxfsi fixtfdi fixunstfdi floatditf \
-  floatundidf floatundisf floatundixf floatunditf,$(softfp_func_list))
-endif
-
-ifeq ($(softfp_wrap_start),)
-softfp_file_list := \
-  $(addsuffix .c,$(addprefix $(srcdir)/config/soft-fp/,$(softfp_func_list)))
-else
-softfp_file_list := $(addsuffix .c,$(softfp_func_list))
-
-$(softfp_file_list):
-       echo $(softfp_wrap_start) > $@
-       echo '#include "config/soft-fp/$@"' >> $@
-       echo $(softfp_wrap_end) >> $@
-endif
-
-LIB2FUNCS_EXTRA += $(softfp_file_list)
-
-ifneq ($(softfp_exclude_libgcc2),y)
-# Functions in libgcc2.c are excluded for each soft-float mode (a
-# target may have both soft-float and hard-float modes), for the fixed
-# list of integer modes (si and di) for which libgcc2.c defines any
-# such functions.  Depending on the target, the si and di symbols may
-# in fact define di and ti functions.
-
-LIB2FUNCS_EXCLUDE += \
-  $(addprefix _,$(foreach m,$(softfp_float_modes), \
-                            $(foreach i,si di, \
-                                        $(softfp_floatint_funcs))))
-endif
-
-SFP_MACHINE := sfp-machine.h
-
-$(SFP_MACHINE): $(srcdir)/config/$(softfp_machine_header)
-       cp $(srcdir)/config/$(softfp_machine_header) $(SFP_MACHINE)
diff --git a/gcc/config/soft-fp/truncdfsf2.c b/gcc/config/soft-fp/truncdfsf2.c
deleted file mode 100644 (file)
index bd95391..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/* Software floating-point emulation.
-   Truncate IEEE double into IEEE single
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "single.h"
-#include "double.h"
-
-SFtype __truncdfsf2(DFtype a)
-{
-  FP_DECL_EX;
-  FP_DECL_D(A);
-  FP_DECL_S(R);
-  SFtype r;
-
-  FP_INIT_ROUNDMODE;
-  FP_UNPACK_SEMIRAW_D(A, a);
-#if _FP_W_TYPE_SIZE < _FP_FRACBITS_D
-  FP_TRUNC(S,D,1,2,R,A);
-#else
-  FP_TRUNC(S,D,1,1,R,A);
-#endif
-  FP_PACK_SEMIRAW_S(r, R);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
diff --git a/gcc/config/soft-fp/trunctfdf2.c b/gcc/config/soft-fp/trunctfdf2.c
deleted file mode 100644 (file)
index c3827b0..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/* Software floating-point emulation.
-   Truncate IEEE quad into IEEE double
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "double.h"
-#include "quad.h"
-
-DFtype __trunctfdf2(TFtype a)
-{
-  FP_DECL_EX;
-  FP_DECL_Q(A);
-  FP_DECL_D(R);
-  DFtype r;
-
-  FP_INIT_ROUNDMODE;
-  FP_UNPACK_SEMIRAW_Q(A, a);
-#if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
-  FP_TRUNC(D,Q,2,4,R,A);
-#else
-  FP_TRUNC(D,Q,1,2,R,A);
-#endif
-  FP_PACK_SEMIRAW_D(r, R);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
diff --git a/gcc/config/soft-fp/trunctfsf2.c b/gcc/config/soft-fp/trunctfsf2.c
deleted file mode 100644 (file)
index 676c937..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/* Software floating-point emulation.
-   Truncate IEEE quad into IEEE single
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com) and
-                 Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "single.h"
-#include "quad.h"
-
-SFtype __trunctfsf2(TFtype a)
-{
-  FP_DECL_EX;
-  FP_DECL_Q(A);
-  FP_DECL_S(R);
-  SFtype r;
-
-  FP_INIT_ROUNDMODE;
-  FP_UNPACK_SEMIRAW_Q(A, a);
-#if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
-  FP_TRUNC(S,Q,1,4,R,A);
-#else
-  FP_TRUNC(S,Q,1,2,R,A);
-#endif
-  FP_PACK_SEMIRAW_S(r, R);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
diff --git a/gcc/config/soft-fp/trunctfxf2.c b/gcc/config/soft-fp/trunctfxf2.c
deleted file mode 100644 (file)
index 50d60bc..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/* Software floating-point emulation.
-   Truncate IEEE quad into IEEE extended
-   Copyright (C) 2007 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Uros Bizjak (ubizjak@gmail.com).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "extended.h"
-#include "quad.h"
-
-XFtype __trunctfxf2(TFtype a)
-{
-  FP_DECL_EX;
-  FP_DECL_Q(A);
-  FP_DECL_E(R);
-  XFtype r;
-
-  FP_INIT_ROUNDMODE;
-  FP_UNPACK_SEMIRAW_Q(A, a);
-#if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
-  FP_TRUNC(E,Q,4,4,R,A);
-#else
-  FP_TRUNC(E,Q,2,2,R,A);
-#endif
-  FP_PACK_SEMIRAW_E(r, R);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
diff --git a/gcc/config/soft-fp/unorddf2.c b/gcc/config/soft-fp/unorddf2.c
deleted file mode 100644 (file)
index 5ea63e2..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Software floating-point emulation.
-   Return 1 iff a or b is a NaN, 0 otherwise.
-   Copyright (C) 2006,2007 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Joseph Myers (joseph@codesourcery.com).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "double.h"
-
-CMPtype __unorddf2(DFtype a, DFtype b)
-{
-  FP_DECL_D(A); FP_DECL_D(B);
-  CMPtype r;
-
-  FP_UNPACK_RAW_D(A, a);
-  FP_UNPACK_RAW_D(B, b);
-  FP_CMP_UNORD_D(r, A, B);
-
-  return r;
-}
diff --git a/gcc/config/soft-fp/unordsf2.c b/gcc/config/soft-fp/unordsf2.c
deleted file mode 100644 (file)
index 6d0afe8..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Software floating-point emulation.
-   Return 1 iff a or b is a NaN, 0 otherwise.
-   Copyright (C) 2006,2007 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Joseph Myers (joseph@codesourcery.com).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "single.h"
-
-CMPtype __unordsf2(SFtype a, SFtype b)
-{
-  FP_DECL_S(A);
-  FP_DECL_S(B);
-  CMPtype r;
-
-  FP_UNPACK_RAW_S(A, a);
-  FP_UNPACK_RAW_S(B, b);
-  FP_CMP_UNORD_S(r, A, B);
-
-  return r;
-}
diff --git a/gcc/config/soft-fp/unordtf2.c b/gcc/config/soft-fp/unordtf2.c
deleted file mode 100644 (file)
index 9d1bd91..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Software floating-point emulation.
-   Return 1 iff a or b is a NaN, 0 otherwise.
-   Copyright (C) 2006,2007 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Joseph Myers (joseph@codesourcery.com).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "soft-fp.h"
-#include "quad.h"
-
-CMPtype __unordtf2(TFtype a, TFtype b)
-{
-  FP_DECL_Q(A);
-  FP_DECL_Q(B);
-  CMPtype r;
-
-  FP_UNPACK_RAW_Q(A, a);
-  FP_UNPACK_RAW_Q(B, b);
-  FP_CMP_UNORD_Q(r, A, B);
-
-  return r;
-}
index 00c4fa63b7b841089d652eb219b13b4a7f229ec4..b26254f20d636347568078779268eb0fc5bb7d24 100644 (file)
@@ -1,3 +1,101 @@
+2011-08-05  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+
+       * config/t-softfp: Remove.
+       * soft-fp: Moved from ../gcc/config.
+       * soft-fp/README: Remove t-softfp reference.
+       * soft-fp/t-softfp: Move to config/t-softfp.
+       (softfp_machine_header): Remove.
+       (softfp_file_list): Remove config subdir.
+       (soft-fp-objects): New variable.
+       ($(soft-fp-objects)): Set INTERNAL_CFLAGS.
+       (LIB2FUNCS_EXTRA): Add to LIB2ADD instead.
+       (SFP_MACHINE, $(SFP_MACHINE)): Remove.
+       * config/t-softfp-excl: New file.
+       * config/t-softfp-sfdf: New file.
+       * config/t-softfp-tf: New file.
+       * config/no-sfp-machine.h: New file.
+       * config/arm/sfp-machine.h: New file.
+       * config/arm/t-softfp: New file.
+       * config/c6x/sfp-machine.h: New file.
+       * config/i386/32/t-fprules-softfp: Rename to ...
+       * config/i386/32/t-softfp: ... this.
+       (tifunctions, LIB2ADD): Remove.
+       (softfp_int_modes): Override.
+       * config/i386/64/t-softfp-compat (tf-functions): Remove config
+       subdir.
+       * config/i386/64/eqtf2.c: Likewise.
+       * config/i386/64/getf2.c: Likewise.
+       * config/i386/64/letf2.c: Likewise.
+       * config/ia64/sft-machine.h: New file.
+       * config/ia64/t-fprules-softfp: Rename to ...
+       * config/ia64/t-softfp: ... this.
+       * config/lm32/sfp-machine.h: New file.
+       * config/moxie/t-moxie-softfp: Remove.
+       * config/rs6000/ibm-ldouble-format: New file.
+       * config/rs6000/ibm-ldouble.c: New file.
+       * config/rs6000/libgcc-ppc-glibc.ver: New file
+       * config/rs6000/libgcc-ppc64.ver: New file
+       * config/rs6000/sfp-machine.h: New file.
+       * config/rs6000/t-freebsd: New file.
+       * config/rs6000/t-ibm-ldouble: New file.
+       * config/rs6000/t-ldbl128: Use $(srcdir) to refer to
+       libgcc-ppc-glibc.ver.
+       * config/rs6000/t-linux64: New file.
+       * config/rs6000/t-ppccomm (LIB2ADD): Add
+       $(srcdir)/config/rs6000/ibm-ldouble.c.
+       * config/rs6000/t-ppccomm-ldbl: New file.
+       * config/score/sfp-machine.h: New file.
+       * config.host (sfp_machine_header): Explain.
+       (arm*-*-linux*): Add t-softfp-sfdf, t-softfp-excl, arm/t-softfp,
+       t-softfp to tmake_file.
+       (arm*-*-uclinux*): Likewise.
+       (arm*-*-ecos-elf): Likewise.
+       (arm*-*-eabi*, arm*-*-symbianelf*): Likewise.
+       (arm*-*-rtems*): Likewise.
+       (arm*-*-elf): Likewise.
+       (ia64*-*-linux*): Replace ia64/t-fprules-softfp by ia64/t-softfp
+       in tmake_file.
+       Add t-softfp-tf, t-softfp-excl, t-softfp to tmake_file.
+       (lm32-*-elf*, lm32-*-rtems*): Add t-softfp-sfdf, t-softfp to tmake_file.
+       (lm32-*-uclinux*): Likewise.
+       (moxie-*-*): Replace moxie/t-moxie-softfp by t-softfp-sfdf,
+       t-softfp-excl, t-softfp.
+       (powerpc-*-darwin*): Add rs6000/t-ibm-ldouble to tmake_file.
+       (powerpc64-*-darwin*): Likewise.
+       (powerpc-*-freebsd*): Add t-softfp-sfdf, t-softfp-excl, t-softfp
+       to tmake_file.
+       (powerpc-*-eabisimaltivec*): Add rs6000/t-ppccomm-ldbl to
+       tmake_file.
+       (powerpc-*-eabisim*): Likewise.
+       (powerpc-*-elf*): Likewise.
+       (powerpc-*-eabialtivec*): Likewise.
+       (powerpc-xilinx-eabi*): Likewise.
+       (powerpc-*-rtems*): Likewise.
+       (powerpc-*-linux*, powerpc64-*-linux*): Add t-softfp-sfdf,
+       t-softfp-excl, t-softfp to tmake_file.
+       (powerpc-wrs-vxworks, powerpc-wrs-vxworksae): Add
+       rs6000/t-ppccomm-ldbl to tmake_file.
+       (powerpcle-*-elf*): Likewise.
+       (powerpcle-*-eabisim*): Likewise.
+       (powerpcle-*-eabi*): Likewise.
+       (rs6000-ibm-aix4.[3456789]*, powerpc-ibm-aix4.[3456789]*): Add
+       rs6000/t-ibm-ldouble to tmake_file.
+       (rs6000-ibm-aix5.1.*, powerpc-ibm-aix5.1.*): Likewise.
+       (rs6000-ibm-aix[56789].*, powerpc-ibm-aix[56789].*): Likewise.
+       (score-*-elf): Add t-softfp-sfdf, t-softfp-excl, t-softfp to tmake_file.
+       (tic6x-*-*): Likewise.
+       (i[34567]86-*-darwin*, x86_64-*-darwin*,
+       i[34567]86-*-kfreebsd*-gnu, x86_64-*-kfreebsd*-gnu,
+       i[34567]86-*-linux*, x86_64-*-linux*, i[34567]86-*-gnu*,
+       i[34567]86-*-solaris2*, x86_64-*-solaris2.1[0-9]*,
+       i[34567]86-*-cygwin*, i[34567]86-*-mingw*, x86_64-*-mingw*,
+       i[34567]86-*-freebsd*, x86_64-*-freebsd*): Add t-softfp-tf,
+       t-softfp to tmake_file.
+       * configure.ac (sfp_machine_header): Provide default if unset.
+       Substitute.
+       Link sfp-machine.h to config/$sfp_machine_header.
+       * configure: Regenerate.
+
 2011-08-05  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
        * Makefile.in (double_type_size, long_double_type_size): Set.
index cd4f054336b4875864fd51b419ffd1870b2c2bc0..be6d720ac289f9763cc610b85f3bbc68ef94da3c 100644 (file)
@@ -54,6 +54,9 @@
 #                      subdirectory will be ignored.
 #  md_unwind_header    The name of a header file defining
 #                      MD_FALLBACK_FRAME_STATE_FOR.
+#  sfp_machine_header  The name of a sfp-machine.h header file for soft-fp.
+#                      Defaults to "$cpu_type/sfp-machine.h" if it exists,
+#                      no-sfp-machine.h otherwise.
 #  tmake_file          A list of machine-description-specific
 #                      makefile-fragments, if different from
 #                      "$cpu_type/t-$cpu_type".
@@ -282,6 +285,7 @@ arm*-*-linux*)                      # ARM GNU/Linux with ELF
          unwind_header=config/arm/unwind-arm.h
          ;;
        esac
+       tmake_file="$tmake_file t-softfp-sfdf t-softfp-excl arm/t-softfp t-softfp"
        ;;
 arm*-*-uclinux*)               # ARM ucLinux
        tmake_file="${tmake_file} t-fixedpoint-gnu-prefix"
@@ -291,8 +295,10 @@ arm*-*-uclinux*)           # ARM ucLinux
          unwind_header=config/arm/unwind-arm.h
          ;;
        esac
+       tmake_file="$tmake_file t-softfp-sfdf t-softfp-excl arm/t-softfp t-softfp"
        ;;
 arm*-*-ecos-elf)
+       tmake_file="$tmake_file t-softfp-sfdf t-softfp-excl arm/t-softfp t-softfp"
        ;;
 arm*-*-eabi* | arm*-*-symbianelf* )
        tmake_file="${tmake_file} t-fixedpoint-gnu-prefix"
@@ -304,11 +310,14 @@ arm*-*-eabi* | arm*-*-symbianelf* )
          tmake_file="${tmake_file} arm/t-symbian"
          ;;
        esac
+       tmake_file="$tmake_file t-softfp-sfdf t-softfp-excl arm/t-softfp t-softfp"
        unwind_header=config/arm/unwind-arm.h
        ;;
 arm*-*-rtems*)
+       tmake_file="$tmake_file t-softfp-sfdf t-softfp-excl arm/t-softfp t-softfp"
        ;;
 arm*-*-elf)
+       tmake_file="$tmake_file t-softfp-sfdf t-softfp-excl arm/t-softfp t-softfp"
        ;;
 arm*-wince-pe*)
        ;;
@@ -318,7 +327,6 @@ avr-*-rtems*)
 avr-*-*)
        # Make HImode functions for AVR
        tmake_file="${cpu_type}/t-avr t-fpbit"
-
        ;;
 bfin*-elf*)
        tmke_file=t-fdpbit
@@ -464,7 +472,7 @@ ia64*-*-freebsd*)
        ;;
 ia64*-*-linux*)
        extra_parts="crtbegin.o crtend.o crtbeginS.o crtendS.o crtfastmath.o"
-       tmake_file="ia64/t-ia64 t-crtfm t-softfp ia64/t-fprules-softfp ia64/t-softfp-compat ia64/t-glibc ia64/t-eh-ia64 t-libunwind"
+       tmake_file="ia64/t-ia64 t-crtfm t-softfp-tf ia64/t-softfp t-softfp ia64/t-softfp-compat ia64/t-glibc ia64/t-eh-ia64 t-libunwind"
        if test x$with_system_libunwind != xyes ; then
                tmake_file="${tmake_file} t-libunwind-elf ia64/t-glibc-libunwind"
        fi
@@ -482,11 +490,11 @@ iq2000*-*-elf*)
         ;;
 lm32-*-elf*|lm32-*-rtems*)
         extra_parts="crtbegin.o crtend.o crti.o crtn.o"
-        tmake_file="lm32/t-lm32 lm32/t-elf t-softfp"
+        tmake_file="lm32/t-lm32 lm32/t-elf t-softfp-sfdf t-softfp"
        ;;
 lm32-*-uclinux*)
         extra_parts="crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o"
-        tmake_file="lm32/t-lm32 lm32/t-uclinux t-softfp"
+        tmake_file="lm32/t-lm32 lm32/t-uclinux t-softfp-sfdf t-softfp"
        ;;      
 m32r-*-elf*|m32r-*-rtems*)
        tmake_file=t-fdpbit
@@ -587,7 +595,7 @@ mn10300-*-*)
        tmake_file=t-fdpbit
        ;;
 moxie-*-*)
-       tmake_file="moxie/t-moxie moxie/t-moxie-softfp"
+       tmake_file="moxie/t-moxie t-softfp-sfdf t-softfp-excl t-softfp"
        extra_parts="crtbegin.o crtend.o crti.o crtn.o"
        ;;
 pdp11-*-*)
@@ -606,13 +614,15 @@ powerpc-*-darwin*)
          md_unwind_header=rs6000/darwin-unwind.h
          ;;
        esac
+       tmake_file="$tmake_file rs6000/t-ibm-ldouble"
        extra_parts="$extra_parts crt2.o"
        ;;
 powerpc64-*-darwin*)
+       tmake_file="$tmake_file rs6000/t-ibm-ldouble"
        extra_parts="$extra_parts crt2.o"
        ;;
 powerpc-*-freebsd*)
-       tmake_file="${tmake_file} rs6000/t-ppccomm rs6000/t-freebsd t-softfp"
+       tmake_file="${tmake_file} rs6000/t-ppccomm rs6000/t-freebsd t-softfp-sfdf t-softfp-excl t-softfp"
        ;;
 powerpc-*-netbsd*)
        ;;
@@ -620,56 +630,56 @@ powerpc-*-eabispe*)
        tmake_file="${tmake_file} rs6000/t-ppccomm"
        ;;
 powerpc-*-eabisimaltivec*)
-       tmake_file=t-fdpbit
+       tmake_file="rs6000/t-ppccomm-ldbl t-fdpbit"
        ;;
 powerpc-*-eabisim*)
-       tmake_file=t-fdpbit
+       tmake_file="rs6000/t-ppccomm-ldbl t-fdpbit"
        ;;
 powerpc-*-elf*)
-       tmake_file=t-fdpbit
+       tmake_file="rs6000/t-ppccomm-ldbl t-fdpbit"
        ;;
 powerpc-*-eabialtivec*)
-       tmake_file=t-fdpbit
+       tmake_file="rs6000/t-ppccomm-ldbl t-fdpbit"
        ;;
 powerpc-xilinx-eabi*)
-       tmake_file=t-fdpbit
+       tmake_file="rs6000/t-ppccomm-ldbl t-fdpbit"
        ;;
 powerpc-*-eabi*)
        tmake_file="${tmake_file} rs6000/t-ppccomm t-fdpbit"
        ;;
 powerpc-*-rtems*)
-       tmake_file=t-fdpbit
+       tmake_file="rs6000/t-ppccomm-ldbl t-fdpbit"
        ;;
 powerpc-*-linux* | powerpc64-*-linux*)
-       tmake_file="${tmake_file} rs6000/t-ppccomm rs6000/t-ldbl128 t-softfp t-dfprules rs6000/t-ppc64-fp"
+       tmake_file="${tmake_file} rs6000/t-ppccomm rs6000/t-ldbl128 t-softfp-sfdf t-softfp-excl t-dfprules rs6000/t-ppc64-fp t-softfp"
        md_unwind_header=rs6000/linux-unwind.h
        ;;
 powerpc-wrs-vxworks|powerpc-wrs-vxworksae)
-       tmake_file=t-fdpbit
+       tmake_file="rs6000/t-ppccomm-ldbl t-fdpbit"
        ;;
 powerpc-*-lynxos*)
        tmake_file=t-fdpbit
        ;;
 powerpcle-*-elf*)
-       tmake_file=t-fdpbit
+       tmake_file="rs6000/t-ppccomm-ldbl t-fdpbit"
        ;;
 powerpcle-*-eabisim*)
-       tmake_file=t-fdpbit
+       tmake_file="rs6000/t-ppccomm-ldbl t-fdpbit"
        ;;
 powerpcle-*-eabi*)
-       tmake_file=t-fdpbit
+       tmake_file="rs6000/t-ppccomm-ldbl t-fdpbit"
        ;;
 rs6000-ibm-aix4.[3456789]* | powerpc-ibm-aix4.[3456789]*)
        md_unwind_header=rs6000/aix-unwind.h
-       tmake_file="t-fdpbit rs6000/t-ppc64-fp"
+       tmake_file="t-fdpbit rs6000/t-ppc64-fp rs6000/t-ibm-ldouble"
        ;;
 rs6000-ibm-aix5.1.* | powerpc-ibm-aix5.1.*)
        md_unwind_header=rs6000/aix-unwind.h
-       tmake_file="t-fdpbit rs6000/t-ppc64-fp"
+       tmake_file="t-fdpbit rs6000/t-ppc64-fp rs6000/t-ibm-ldouble"
        ;;
 rs6000-ibm-aix[56789].* | powerpc-ibm-aix[56789].*)
        md_unwind_header=rs6000/aix-unwind.h
-       tmake_file="t-fdpbit rs6000/t-ppc64-fp"
+       tmake_file="t-fdpbit rs6000/t-ppc64-fp rs6000/t-ibm-ldouble"
        ;;
 rx-*-elf)
        extra_parts="crtbegin.o crtend.o"
@@ -688,6 +698,7 @@ s390x-ibm-tpf*)
        md_unwind_header=s390/tpf-unwind.h
        ;;
 score-*-elf)
+       tmake_file="${tmake_file} t-softfp-sfdf t-softfp-excl t-softfp"
         ;;
 sh-*-elf* | sh[12346l]*-*-elf* | \
   sh-*-linux* | sh[2346lbe]*-*-linux* | \
@@ -774,7 +785,7 @@ spu-*-elf*)
        tmake_file="t-fdpbit spu/t-elf"
        ;;
 tic6x-*-*)
-       tmake_file="${tmake_file} t-gnu-prefix"
+       tmake_file="${tmake_file} t-softfp-sfdf t-softfp-excl t-softfp t-gnu-prefix"
        ;;
 v850*-*-*)
        tmake_file=t-fdpbit
@@ -829,9 +840,11 @@ i[34567]86-*-darwin* | x86_64-*-darwin* | \
   i[34567]86-*-solaris2* | x86_64-*-solaris2.1[0-9]* | \
   i[34567]86-*-cygwin* | i[34567]86-*-mingw* | x86_64-*-mingw* | \
   i[34567]86-*-freebsd* | x86_64-*-freebsd*)
+       tmake_file="${tmake_file} t-softfp-tf"
        if test "${host_address}" = 32; then
-               tmake_file="${tmake_file} t-softfp i386/${host_address}/t-fprules-softfp"
+               tmake_file="${tmake_file} i386/${host_address}/t-softfp"
        fi
+       tmake_file="${tmake_file} t-softfp"
        ;;
 esac
 
diff --git a/libgcc/config/arm/sfp-machine.h b/libgcc/config/arm/sfp-machine.h
new file mode 100644 (file)
index 0000000..a89d05a
--- /dev/null
@@ -0,0 +1,105 @@
+#define _FP_W_TYPE_SIZE                32
+#define _FP_W_TYPE             unsigned long
+#define _FP_WS_TYPE            signed long
+#define _FP_I_TYPE             long
+
+/* 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_S(R,X,Y)                          \
+  _FP_MUL_MEAT_1_wide(_FP_WFRACBITS_S,R,X,Y,umul_ppmm)
+#define _FP_MUL_MEAT_D(R,X,Y)                          \
+  _FP_MUL_MEAT_2_wide(_FP_WFRACBITS_D,R,X,Y,umul_ppmm)
+#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_loop(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_H          ((_FP_QNANBIT_H << 1) - 1)
+#define _FP_NANFRAC_S          ((_FP_QNANBIT_S << 1) - 1)
+#define _FP_NANFRAC_D          ((_FP_QNANBIT_D << 1) - 1), -1
+#define _FP_NANFRAC_Q          ((_FP_QNANBIT_Q << 1) - 1), -1, -1, -1
+#define _FP_NANSIGN_H          0
+#define _FP_NANSIGN_S          0
+#define _FP_NANSIGN_D          0
+#define _FP_NANSIGN_Q          0
+
+#define _FP_KEEPNANFRACP 1
+
+/* Someone please check this.  */
+#define _FP_CHOOSENAN(fs, wc, R, X, Y, OP)                     \
+  do {                                                         \
+    if ((_FP_FRAC_HIGH_RAW_##fs(X) & _FP_QNANBIT_##fs)         \
+       && !(_FP_FRAC_HIGH_RAW_##fs(Y) & _FP_QNANBIT_##fs))     \
+      {                                                                \
+       R##_s = Y##_s;                                          \
+       _FP_FRAC_COPY_##wc(R,Y);                                \
+      }                                                                \
+    else                                                       \
+      {                                                                \
+       R##_s = X##_s;                                          \
+       _FP_FRAC_COPY_##wc(R,X);                                \
+      }                                                                \
+    R##_c = FP_CLS_NAN;                                                \
+  } while (0)
+
+#define        __LITTLE_ENDIAN 1234
+#define        __BIG_ENDIAN    4321
+
+#if defined __ARMEB__
+# define __BYTE_ORDER __BIG_ENDIAN
+#else
+# define __BYTE_ORDER __LITTLE_ENDIAN
+#endif
+
+
+/* Define ALIASNAME as a strong alias for NAME.  */
+# define strong_alias(name, aliasname) _strong_alias(name, aliasname)
+# define _strong_alias(name, aliasname) \
+  extern __typeof (name) aliasname __attribute__ ((alias (#name)));
+
+#ifdef __ARM_EABI__
+/* Rename functions to their EABI names.  */
+/* The comparison functions need wrappers for EABI semantics, so
+   leave them unmolested.  */
+#define __negsf2       __aeabi_fneg
+#define __subsf3       __aeabi_fsub
+#define __addsf3       __aeabi_fadd
+#define __floatunsisf  __aeabi_ui2f
+#define __floatsisf    __aeabi_i2f
+#define __floatundisf  __aeabi_ul2f
+#define __floatdisf    __aeabi_l2f
+#define __mulsf3       __aeabi_fmul
+#define __divsf3       __aeabi_fdiv
+#define __unordsf2     __aeabi_fcmpun
+#define __fixsfsi      __aeabi_f2iz
+#define __fixunssfsi   __aeabi_f2uiz
+#define __fixsfdi      __aeabi_f2lz
+#define __fixunssfdi   __aeabi_f2ulz
+#define __floatdisf    __aeabi_l2f
+
+#define __negdf2       __aeabi_dneg
+#define __subdf3       __aeabi_dsub
+#define __adddf3       __aeabi_dadd
+#define __floatunsidf  __aeabi_ui2d
+#define __floatsidf    __aeabi_i2d
+#define __extendsfdf2  __aeabi_f2d
+#define __truncdfsf2   __aeabi_d2f
+#define __floatundidf  __aeabi_ul2d
+#define __floatdidf    __aeabi_l2d
+#define __muldf3       __aeabi_dmul
+#define __divdf3       __aeabi_ddiv
+#define __unorddf2     __aeabi_dcmpun
+#define __fixdfsi      __aeabi_d2iz
+#define __fixunsdfsi   __aeabi_d2uiz
+#define __fixdfdi      __aeabi_d2lz
+#define __fixunsdfdi   __aeabi_d2ulz
+#define __floatdidf    __aeabi_l2d
+#define __extendhfsf2  __gnu_h2f_ieee
+#define __truncsfhf2   __gnu_f2h_ieee
+
+#endif /* __ARM_EABI__ */
diff --git a/libgcc/config/arm/t-softfp b/libgcc/config/arm/t-softfp
new file mode 100644 (file)
index 0000000..4ede438
--- /dev/null
@@ -0,0 +1,2 @@
+softfp_wrap_start := '\#ifdef __ARM_ARCH_6M__'
+softfp_wrap_end := '\#endif'
diff --git a/libgcc/config/c6x/sfp-machine.h b/libgcc/config/c6x/sfp-machine.h
new file mode 100644 (file)
index 0000000..2c90e58
--- /dev/null
@@ -0,0 +1,120 @@
+/* Soft-FP definitions for TI C6X.
+   Copyright (C) 2010, 2011 Free Software Foundation, Inc.
+
+   This files is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with GCC; see the file COPYING.LIB.  If not see
+   <http://www.gnu.org/licenses/>.  */
+
+#define _FP_W_TYPE_SIZE                32
+#define _FP_W_TYPE             unsigned long
+#define _FP_WS_TYPE            signed long
+#define _FP_I_TYPE             long
+
+#define _FP_MUL_MEAT_S(R,X,Y)                          \
+  _FP_MUL_MEAT_1_wide(_FP_WFRACBITS_S,R,X,Y,umul_ppmm)
+#define _FP_MUL_MEAT_D(R,X,Y)                          \
+  _FP_MUL_MEAT_2_wide(_FP_WFRACBITS_D,R,X,Y,umul_ppmm)
+#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_loop(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_H          ((_FP_QNANBIT_H << 1) - 1)
+#define _FP_NANFRAC_S          ((_FP_QNANBIT_S << 1) - 1)
+#define _FP_NANFRAC_D          ((_FP_QNANBIT_D << 1) - 1), -1
+#define _FP_NANFRAC_Q          ((_FP_QNANBIT_Q << 1) - 1), -1, -1, -1
+#define _FP_NANSIGN_H          0
+#define _FP_NANSIGN_S          0
+#define _FP_NANSIGN_D          0
+#define _FP_NANSIGN_Q          0
+
+#define _FP_KEEPNANFRACP 1
+
+/* Someone please check this.  */
+#define _FP_CHOOSENAN(fs, wc, R, X, Y, OP)                     \
+  do {                                                         \
+    if ((_FP_FRAC_HIGH_RAW_##fs(X) & _FP_QNANBIT_##fs)         \
+       && !(_FP_FRAC_HIGH_RAW_##fs(Y) & _FP_QNANBIT_##fs))     \
+      {                                                                \
+       R##_s = Y##_s;                                          \
+       _FP_FRAC_COPY_##wc(R,Y);                                \
+      }                                                                \
+    else                                                       \
+      {                                                                \
+       R##_s = X##_s;                                          \
+       _FP_FRAC_COPY_##wc(R,X);                                \
+      }                                                                \
+    R##_c = FP_CLS_NAN;                                                \
+  } while (0)
+
+#define        __LITTLE_ENDIAN 1234
+#define        __BIG_ENDIAN    4321
+
+#if defined _BIG_ENDIAN
+# define __BYTE_ORDER __BIG_ENDIAN
+#else
+# define __BYTE_ORDER __LITTLE_ENDIAN
+#endif
+
+
+/* Define ALIASNAME as a strong alias for NAME.  */
+# define strong_alias(name, aliasname) _strong_alias(name, aliasname)
+# define _strong_alias(name, aliasname) \
+  extern __typeof (name) aliasname __attribute__ ((alias (#name)));
+
+/* Rename helper functions to the names specified in the C6000 ELF ABI.  */
+#define __fixdfsi     __c6xabi_fixdi
+#define __fixsfsi     __c6xabi_fixfi
+#define __floatsidf   __c6xabi_fltid
+#define __floatunsidf __c6xabi_fltud
+#define __floatsisf   __c6xabi_fltif
+#define __floatunsisf __c6xabi_fltuf
+#define __truncdfsf2  __c6xabi_cvtdf
+#define __extendsfdf2 __c6xabi_cvtfd
+#define __adddf3      __c6xabi_addd
+#define __subdf3      __c6xabi_subd
+#define __muldf3      __c6xabi_mpyd
+#define __divdf3      __c6xabi_divd
+#define __negdf2      __c6xabi_negd
+#define __absdf2      __c6xabi_absd
+#define __addsf3      __c6xabi_addf
+#define __subsf3      __c6xabi_subf
+#define __mulsf3      __c6xabi_mpyf
+#define __divsf3      __c6xabi_divf
+#define __negsf2      __c6xabi_negf
+#define __abssf2      __c6xabi_absf
+#define __lesf2       __c6xabi_cmpf
+#define __ledf2       __c6xabi_cmpd
+#define __ltsf2       __gnu_ltsf2
+#define __ltdf2       __gnu_ltdf2
+#define __gesf2       __gnu_gesf2
+#define __gedf2       __gnu_gedf2
+#define __gtsf2       __gnu_gtsf2
+#define __gtdf2       __gnu_gtdf2
+#define __eqsf2       __gnu_eqsf2
+#define __eqdf2       __gnu_eqdf2
+#define __nesf2       __c6xabi_neqf
+#define __nedf2       __c6xabi_neqd
+#define __unordsf2    __c6xabi_unordf
+#define __unorddf2    __c6xabi_unordd
diff --git a/libgcc/config/i386/32/t-fprules-softfp b/libgcc/config/i386/32/t-fprules-softfp
deleted file mode 100644 (file)
index 8e7f323..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-# 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))
-
-# Provide fallbacks for __builtin_copysignq and __builtin_fabsq.
-LIB2ADD += $(srcdir)/config/i386/32/tf-signs.c
diff --git a/libgcc/config/i386/32/t-softfp b/libgcc/config/i386/32/t-softfp
new file mode 100644 (file)
index 0000000..a48a5b3
--- /dev/null
@@ -0,0 +1,5 @@
+# Omit TImode functions
+softfp_int_modes := si di
+
+# Provide fallbacks for __builtin_copysignq and __builtin_fabsq.
+LIB2ADD += $(srcdir)/config/i386/32/tf-signs.c
index 785c42ad5c632f55ec39520f7793f60f50e7db4d..23982fb9e6ff7a74a52d0331df3ec6590d1220b0 100644 (file)
@@ -2,7 +2,7 @@
 #define __netf2 __netf2_shared
 #endif
 
-#include "config/soft-fp/eqtf2.c"
+#include "soft-fp/eqtf2.c"
 
 #ifdef SHARED
 #undef __netf2
index 280447c1e832b90aa89ac1e2a193b31e824437a8..e2c41649059ca10fe9921e21d2764bf0cc9bcf13 100644 (file)
@@ -2,7 +2,7 @@
 #define __gttf2 __gttf2_shared
 #endif
 
-#include "config/soft-fp/getf2.c"
+#include "soft-fp/getf2.c"
 
 #ifdef SHARED
 #undef __gttf2
index 81e0881c8448be4d1815896524a5bebe800f73d1..784337fff6794daa0fe8424832c594e480e46567 100644 (file)
@@ -2,7 +2,7 @@
 #define __lttf2 __lttf2_shared
 #endif
 
-#include "config/soft-fp/letf2.c"
+#include "soft-fp/letf2.c"
 
 #ifdef SHARED
 #undef __lttf2
index afaa526ae2971865770e24eea22ecbd35585f0a1..0978695c3a435f5dc42b324c5d811f159ea4b2ed 100644 (file)
@@ -4,7 +4,7 @@
 
 # Filter out the following TFmode functions.
 tf-compats = getf2.c letf2.c eqtf2.c
-tf-functions := $(addprefix $(gcc_srcdir)/config/soft-fp/, $(tf-compats))
+tf-functions := $(addprefix $(srcdir)/soft-fp/, $(tf-compats))
 LIB2ADD := $(filter-out $(tf-functions), $(LIB2ADD))
 LIB2ADD += $(addprefix $(srcdir)/config/i386/64/, $(tf-compats))
 
diff --git a/libgcc/config/i386/sfp-machine.h b/libgcc/config/i386/sfp-machine.h
new file mode 100644 (file)
index 0000000..f2df869
--- /dev/null
@@ -0,0 +1,5 @@
+#ifdef __x86_64__
+#include "config/i386/64/sfp-machine.h"
+#else
+#include "config/i386/32/sfp-machine.h"
+#endif
diff --git a/libgcc/config/ia64/sfp-machine.h b/libgcc/config/ia64/sfp-machine.h
new file mode 100644 (file)
index 0000000..bdcce77
--- /dev/null
@@ -0,0 +1,116 @@
+#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
+
+#define FP_HANDLE_EXCEPTIONS                                           \
+  do {                                                                 \
+    double tmp, dummy;                                                 \
+    if (_fex & FP_EX_INVALID)                                          \
+      {                                                                        \
+       tmp = 0.0;                                                      \
+       __asm__ __volatile__ ("frcpa.s0 %0,p1=f0,f0"                    \
+                             : "=f" (tmp) : : "p1" );                  \
+      }                                                                        \
+    if (_fex & FP_EX_DIVZERO)                                          \
+      {                                                                        \
+       __asm__ __volatile__ ("frcpa.s0 %0,p1=f1,f0"                    \
+                             : "=f" (tmp) : : "p1" );                  \
+      }                                                                        \
+    if (_fex & FP_EX_OVERFLOW)                                         \
+      {                                                                        \
+       dummy = __DBL_MAX__;                                            \
+       __asm__ __volatile__ ("fadd.d.s0 %0=%1,%1"                      \
+                             : "=f" (dummy) : "0" (dummy));            \
+      }                                                                        \
+    if (_fex & FP_EX_UNDERFLOW)                                                \
+      {                                                                        \
+       dummy = __DBL_MIN__;                                            \
+       __asm__ __volatile__ ("fnma.d.s0 %0=%1,%1,f0"                   \
+                             : "=f" (tmp) : "f" (dummy));              \
+      }                                                                        \
+    if (_fex & FP_EX_INEXACT)                                          \
+      {                                                                        \
+       dummy = __DBL_MAX__;                                            \
+       __asm__ __volatile__ ("fsub.d.s0 %0=%1,f1"                      \
+                             : "=f" (dummy) : "0" (dummy));            \
+      }                                                                        \
+  } while (0)
+
+#define FP_RND_NEAREST         0
+#define FP_RND_ZERO            0xc00L
+#define FP_RND_PINF            0x800L
+#define FP_RND_MINF            0x400L
+
+#define _FP_DECL_EX \
+  unsigned long int _fpsr __attribute__ ((unused)) = FP_RND_NEAREST
+
+#define FP_INIT_ROUNDMODE                      \
+  do {                                         \
+    __asm__ __volatile__ ("mov.m %0=ar.fpsr"   \
+                         : "=r" (_fpsr));      \
+  } while (0)
+
+#define FP_ROUNDMODE           (_fpsr & 0xc00L)
+
+#define        __LITTLE_ENDIAN 1234
+#define        __BIG_ENDIAN    4321
+
+#define __BYTE_ORDER __LITTLE_ENDIAN
+
+/* Define ALIASNAME as a strong alias for NAME.  */
+#define strong_alias(name, aliasname) _strong_alias(name, aliasname)
+#define _strong_alias(name, aliasname) \
+  extern __typeof (name) aliasname __attribute__ ((alias (#name)));
diff --git a/libgcc/config/ia64/t-fprules-softfp b/libgcc/config/ia64/t-fprules-softfp
deleted file mode 100644 (file)
index 90acc37..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-# Provide fallbacks for __builtin_copysignq and __builtin_fabsq.
-LIB2ADD += $(srcdir)/config/ia64/tf-signs.c
diff --git a/libgcc/config/ia64/t-softfp b/libgcc/config/ia64/t-softfp
new file mode 100644 (file)
index 0000000..90acc37
--- /dev/null
@@ -0,0 +1,2 @@
+# Provide fallbacks for __builtin_copysignq and __builtin_fabsq.
+LIB2ADD += $(srcdir)/config/ia64/tf-signs.c
diff --git a/libgcc/config/lm32/sfp-machine.h b/libgcc/config/lm32/sfp-machine.h
new file mode 100644 (file)
index 0000000..1903848
--- /dev/null
@@ -0,0 +1,51 @@
+#define _FP_W_TYPE_SIZE                32
+#define _FP_W_TYPE             unsigned long
+#define _FP_WS_TYPE            signed long
+#define _FP_I_TYPE             long
+
+#define _FP_MUL_MEAT_S(R,X,Y)                          \
+  _FP_MUL_MEAT_1_wide(_FP_WFRACBITS_S,R,X,Y,umul_ppmm)
+#define _FP_MUL_MEAT_D(R,X,Y)                          \
+  _FP_MUL_MEAT_2_wide(_FP_WFRACBITS_D,R,X,Y,umul_ppmm)
+#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_loop(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 << 1) - 1)
+#define _FP_NANFRAC_D          ((_FP_QNANBIT_D << 1) - 1), -1
+#define _FP_NANFRAC_Q          ((_FP_QNANBIT_Q << 1) - 1), -1, -1, -1
+#define _FP_NANSIGN_S          0
+#define _FP_NANSIGN_D          0
+#define _FP_NANSIGN_Q          0
+
+#define _FP_KEEPNANFRACP 1
+
+/* Someone please check this.  */
+#define _FP_CHOOSENAN(fs, wc, R, X, Y, OP)                     \
+  do {                                                         \
+    if ((_FP_FRAC_HIGH_RAW_##fs(X) & _FP_QNANBIT_##fs)         \
+       && !(_FP_FRAC_HIGH_RAW_##fs(Y) & _FP_QNANBIT_##fs))     \
+      {                                                                \
+       R##_s = Y##_s;                                          \
+       _FP_FRAC_COPY_##wc(R,Y);                                \
+      }                                                                \
+    else                                                       \
+      {                                                                \
+       R##_s = X##_s;                                          \
+       _FP_FRAC_COPY_##wc(R,X);                                \
+      }                                                                \
+    R##_c = FP_CLS_NAN;                                                \
+  } while (0)
+
+#define        __LITTLE_ENDIAN 1234
+#define        __BIG_ENDIAN    4321
+
+#define __BYTE_ORDER __BIG_ENDIAN
+
+/* Define ALIASNAME as a strong alias for NAME.  */
+# define strong_alias(name, aliasname) _strong_alias(name, aliasname)
+# define _strong_alias(name, aliasname) \
+  extern __typeof (name) aliasname __attribute__ ((alias (#name)));
diff --git a/libgcc/config/moxie/t-moxie-softfp b/libgcc/config/moxie/t-moxie-softfp
deleted file mode 100644 (file)
index 61c5751..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-softfp_float_modes := sf df
-softfp_int_modes := si di
-softfp_extensions := sfdf
-softfp_truncations := dfsf
-softfp_machine_header := moxie/sfp-machine.h
-softfp_exclude_libgcc2 := y
-
-# softfp seems to be missing a whole bunch of prototypes.
-TARGET_LIBGCC2_CFLAGS += -Wno-missing-prototypes
diff --git a/libgcc/config/no-sfp-machine.h b/libgcc/config/no-sfp-machine.h
new file mode 100644 (file)
index 0000000..8f7341d
--- /dev/null
@@ -0,0 +1 @@
+/* Dummy sfp-machine.h header for targets that don't need one.  */
diff --git a/libgcc/config/rs6000/ibm-ldouble-format b/libgcc/config/rs6000/ibm-ldouble-format
new file mode 100644 (file)
index 0000000..3d1a06a
--- /dev/null
@@ -0,0 +1,91 @@
+Long double format
+==================
+
+  Each long double is made up of two IEEE doubles.  The value of the
+long double is the sum of the values of the two parts (except for
+-0.0).  The most significant part is required to be the value of the
+long double rounded to the nearest double, as specified by IEEE.  For
+Inf values, the least significant part is required to be one of +0.0
+or -0.0.  No other requirements are made; so, for example, 1.0 may be
+represented as (1.0, +0.0) or (1.0, -0.0), and the low part of a NaN
+is don't-care.
+
+Classification
+--------------
+
+A long double can represent any value of the form
+  s * 2^e * sum(k=0...105: f_k * 2^(-k))
+where 's' is +1 or -1, 'e' is between 1022 and -968 inclusive, f_0 is
+1, and f_k for k>0 is 0 or 1.  These are the 'normal' long doubles.
+
+A long double can also represent any value of the form
+  s * 2^-968 * sum(k=0...105: f_k * 2^(-k))
+where 's' is +1 or -1, f_0 is 0, and f_k for k>0 is 0 or 1.  These are
+the 'subnormal' long doubles.
+
+There are four long doubles that represent zero, two that represent
++0.0 and two that represent -0.0.  The sign of the high part is the
+sign of the long double, and the sign of the low part is ignored.
+
+Likewise, there are four long doubles that represent infinities, two
+for +Inf and two for -Inf.
+
+Each NaN, quiet or signalling, that can be represented as a 'double'
+can be represented as a 'long double'.  In fact, there are 2^64
+equivalent representations for each one.
+
+There are certain other valid long doubles where both parts are
+nonzero but the low part represents a value which has a bit set below
+2^(e-105).  These, together with the subnormal long doubles, make up
+the denormal long doubles.
+
+Many possible long double bit patterns are not valid long doubles.
+These do not represent any value.
+
+Limits
+------
+
+The maximum representable long double is 2^1024-2^918.  The smallest
+*normal* positive long double is 2^-968.  The smallest denormalised
+positive long double is 2^-1074 (this is the same as for 'double').
+
+Conversions
+-----------
+
+A double can be converted to a long double by adding a zero low part.
+
+A long double can be converted to a double by removing the low part.
+
+Comparisons
+-----------
+
+Two long doubles can be compared by comparing the high parts, and if
+those compare equal, comparing the low parts.
+
+Arithmetic
+----------
+
+The unary negate operation operates by negating the low and high parts.
+
+An absolute or absolute-negate operation must be done by comparing
+against zero and negating if necessary.
+
+Addition and subtraction are performed using library routines.  They
+are not at present performed perfectly accurately, the result produced
+will be within 1ulp of the range generated by adding or subtracting
+1ulp from the input values, where a 'ulp' is 2^(e-106) given the
+exponent 'e'.  In the presence of cancellation, this may be
+arbitrarily inaccurate.  Subtraction is done by negation and addition.
+
+Multiplication is also performed using a library routine.  Its result
+will be within 2ulp of the correct result.
+
+Division is also performed using a library routine.  Its result will
+be within 3ulp of the correct result.
+
+\f
+Copyright (C) 2004 Free Software Foundation, Inc.
+
+Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved.
diff --git a/libgcc/config/rs6000/ibm-ldouble.c b/libgcc/config/rs6000/ibm-ldouble.c
new file mode 100644 (file)
index 0000000..b0b8037
--- /dev/null
@@ -0,0 +1,438 @@
+/* 128-bit long double support routines for Darwin.
+   Copyright (C) 1993, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2011
+   Free Software Foundation, Inc.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 3, or (at your option) any later
+version.
+
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+Under Section 7 of GPL version 3, you are granted additional
+permissions described in the GCC Runtime Library Exception, version
+3.1, as published by the Free Software Foundation.
+
+You should have received a copy of the GNU General Public License and
+a copy of the GCC Runtime Library Exception along with this program;
+see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+<http://www.gnu.org/licenses/>.  */
+
+
+/* Implementations of floating-point long double basic arithmetic
+   functions called by the IBM C compiler when generating code for
+   PowerPC platforms.  In particular, the following functions are
+   implemented: __gcc_qadd, __gcc_qsub, __gcc_qmul, and __gcc_qdiv.
+   Double-double algorithms are based on the paper "Doubled-Precision
+   IEEE Standard 754 Floating-Point Arithmetic" by W. Kahan, February 26,
+   1987.  An alternative published reference is "Software for
+   Doubled-Precision Floating-Point Computations", by Seppo Linnainmaa,
+   ACM TOMS vol 7 no 3, September 1981, pages 272-283.  */
+
+/* Each long double is made up of two IEEE doubles.  The value of the
+   long double is the sum of the values of the two parts.  The most
+   significant part is required to be the value of the long double
+   rounded to the nearest double, as specified by IEEE.  For Inf
+   values, the least significant part is required to be one of +0.0 or
+   -0.0.  No other requirements are made; so, for example, 1.0 may be
+   represented as (1.0, +0.0) or (1.0, -0.0), and the low part of a
+   NaN is don't-care.
+
+   This code currently assumes big-endian.  */
+
+#if (!defined (__LITTLE_ENDIAN__) \
+     && (defined (__MACH__) || defined (__powerpc__) || defined (_AIX)))
+
+#define fabs(x) __builtin_fabs(x)
+#define isless(x, y) __builtin_isless (x, y)
+#define inf() __builtin_inf()
+
+#define unlikely(x) __builtin_expect ((x), 0)
+
+#define nonfinite(a) unlikely (! isless (fabs (a), inf ()))
+
+/* Define ALIASNAME as a strong alias for NAME.  */
+# define strong_alias(name, aliasname) _strong_alias(name, aliasname)
+# define _strong_alias(name, aliasname) \
+  extern __typeof (name) aliasname __attribute__ ((alias (#name)));
+
+/* All these routines actually take two long doubles as parameters,
+   but GCC currently generates poor code when a union is used to turn
+   a long double into a pair of doubles.  */
+
+long double __gcc_qadd (double, double, double, double);
+long double __gcc_qsub (double, double, double, double);
+long double __gcc_qmul (double, double, double, double);
+long double __gcc_qdiv (double, double, double, double);
+
+#if defined __ELF__ && defined SHARED \
+    && (defined __powerpc64__ || !(defined __linux__ || defined __gnu_hurd__))
+/* Provide definitions of the old symbol names to satisfy apps and
+   shared libs built against an older libgcc.  To access the _xlq
+   symbols an explicit version reference is needed, so these won't
+   satisfy an unadorned reference like _xlqadd.  If dot symbols are
+   not needed, the assembler will remove the aliases from the symbol
+   table.  */
+__asm__ (".symver __gcc_qadd,_xlqadd@GCC_3.4\n\t"
+        ".symver __gcc_qsub,_xlqsub@GCC_3.4\n\t"
+        ".symver __gcc_qmul,_xlqmul@GCC_3.4\n\t"
+        ".symver __gcc_qdiv,_xlqdiv@GCC_3.4\n\t"
+        ".symver .__gcc_qadd,._xlqadd@GCC_3.4\n\t"
+        ".symver .__gcc_qsub,._xlqsub@GCC_3.4\n\t"
+        ".symver .__gcc_qmul,._xlqmul@GCC_3.4\n\t"
+        ".symver .__gcc_qdiv,._xlqdiv@GCC_3.4");
+#endif
+
+typedef union
+{
+  long double ldval;
+  double dval[2];
+} longDblUnion;
+
+/* Add two 'long double' values and return the result. */
+long double
+__gcc_qadd (double a, double aa, double c, double cc)
+{
+  longDblUnion x;
+  double z, q, zz, xh;
+
+  z = a + c;
+
+  if (nonfinite (z))
+    {
+      z = cc + aa + c + a;
+      if (nonfinite (z))
+       return z;
+      x.dval[0] = z;  /* Will always be DBL_MAX.  */
+      zz = aa + cc;
+      if (fabs(a) > fabs(c))
+       x.dval[1] = a - z + c + zz;
+      else
+       x.dval[1] = c - z + a + zz;
+    }
+  else
+    {
+      q = a - z;
+      zz = q + c + (a - (q + z)) + aa + cc;
+
+      /* Keep -0 result.  */
+      if (zz == 0.0)
+       return z;
+
+      xh = z + zz;
+      if (nonfinite (xh))
+       return xh;
+
+      x.dval[0] = xh;
+      x.dval[1] = z - xh + zz;
+    }
+  return x.ldval;
+}
+
+long double
+__gcc_qsub (double a, double b, double c, double d)
+{
+  return __gcc_qadd (a, b, -c, -d);
+}
+
+#ifdef __NO_FPRS__
+static double fmsub (double, double, double);
+#endif
+
+long double
+__gcc_qmul (double a, double b, double c, double d)
+{
+  longDblUnion z;
+  double t, tau, u, v, w;
+  
+  t = a * c;                   /* Highest order double term.  */
+
+  if (unlikely (t == 0)                /* Preserve -0.  */
+      || nonfinite (t))
+    return t;
+
+  /* Sum terms of two highest orders. */
+  
+  /* Use fused multiply-add to get low part of a * c.  */
+#ifndef __NO_FPRS__
+  asm ("fmsub %0,%1,%2,%3" : "=f"(tau) : "f"(a), "f"(c), "f"(t));
+#else
+  tau = fmsub (a, c, t);
+#endif
+  v = a*d;
+  w = b*c;
+  tau += v + w;            /* Add in other second-order terms.  */
+  u = t + tau;
+
+  /* Construct long double result.  */
+  if (nonfinite (u))
+    return u;
+  z.dval[0] = u;
+  z.dval[1] = (t - u) + tau;
+  return z.ldval;
+}
+
+long double
+__gcc_qdiv (double a, double b, double c, double d)
+{
+  longDblUnion z;
+  double s, sigma, t, tau, u, v, w;
+  
+  t = a / c;                    /* highest order double term */
+  
+  if (unlikely (t == 0)                /* Preserve -0.  */
+      || nonfinite (t))
+    return t;
+
+  /* Finite nonzero result requires corrections to the highest order term.  */
+
+  s = c * t;                    /* (s,sigma) = c*t exactly.  */
+  w = -(-b + d * t);   /* Written to get fnmsub for speed, but not
+                          numerically necessary.  */
+  
+  /* Use fused multiply-add to get low part of c * t.   */
+#ifndef __NO_FPRS__
+  asm ("fmsub %0,%1,%2,%3" : "=f"(sigma) : "f"(c), "f"(t), "f"(s));
+#else
+  sigma = fmsub (c, t, s);
+#endif
+  v = a - s;
+  
+  tau = ((v-sigma)+w)/c;   /* Correction to t.  */
+  u = t + tau;
+
+  /* Construct long double result.  */
+  if (nonfinite (u))
+    return u;
+  z.dval[0] = u;
+  z.dval[1] = (t - u) + tau;
+  return z.ldval;
+}
+
+#if defined (_SOFT_DOUBLE) && defined (__LONG_DOUBLE_128__)
+
+long double __gcc_qneg (double, double);
+int __gcc_qeq (double, double, double, double);
+int __gcc_qne (double, double, double, double);
+int __gcc_qge (double, double, double, double);
+int __gcc_qle (double, double, double, double);
+long double __gcc_stoq (float);
+long double __gcc_dtoq (double);
+float __gcc_qtos (double, double);
+double __gcc_qtod (double, double);
+int __gcc_qtoi (double, double);
+unsigned int __gcc_qtou (double, double);
+long double __gcc_itoq (int);
+long double __gcc_utoq (unsigned int);
+
+extern int __eqdf2 (double, double);
+extern int __ledf2 (double, double);
+extern int __gedf2 (double, double);
+
+/* Negate 'long double' value and return the result.   */
+long double
+__gcc_qneg (double a, double aa)
+{
+  longDblUnion x;
+
+  x.dval[0] = -a;
+  x.dval[1] = -aa;
+  return x.ldval;
+}
+
+/* Compare two 'long double' values for equality.  */
+int
+__gcc_qeq (double a, double aa, double c, double cc)
+{
+  if (__eqdf2 (a, c) == 0)
+    return __eqdf2 (aa, cc);
+  return 1;
+}
+
+strong_alias (__gcc_qeq, __gcc_qne);
+
+/* Compare two 'long double' values for less than or equal.  */
+int
+__gcc_qle (double a, double aa, double c, double cc)
+{
+  if (__eqdf2 (a, c) == 0)
+    return __ledf2 (aa, cc);
+  return __ledf2 (a, c);
+}
+
+strong_alias (__gcc_qle, __gcc_qlt);
+
+/* Compare two 'long double' values for greater than or equal.  */
+int
+__gcc_qge (double a, double aa, double c, double cc)
+{
+  if (__eqdf2 (a, c) == 0)
+    return __gedf2 (aa, cc);
+  return __gedf2 (a, c);
+}
+
+strong_alias (__gcc_qge, __gcc_qgt);
+
+/* Convert single to long double.  */
+long double
+__gcc_stoq (float a)
+{
+  longDblUnion x;
+
+  x.dval[0] = (double) a;
+  x.dval[1] = 0.0;
+
+  return x.ldval;
+}
+
+/* Convert double to long double.  */
+long double
+__gcc_dtoq (double a)
+{
+  longDblUnion x;
+
+  x.dval[0] = a;
+  x.dval[1] = 0.0;
+
+  return x.ldval;
+}
+
+/* Convert long double to single.  */
+float
+__gcc_qtos (double a, double aa __attribute__ ((__unused__)))
+{
+  return (float) a;
+}
+
+/* Convert long double to double.  */
+double
+__gcc_qtod (double a, double aa __attribute__ ((__unused__)))
+{
+  return a;
+}
+
+/* Convert long double to int.  */
+int
+__gcc_qtoi (double a, double aa)
+{
+  double z = a + aa;
+  return (int) z;
+}
+
+/* Convert long double to unsigned int.  */
+unsigned int
+__gcc_qtou (double a, double aa)
+{
+  double z = a + aa;
+  return (unsigned int) z;
+}
+
+/* Convert int to long double.  */
+long double
+__gcc_itoq (int a)
+{
+  return __gcc_dtoq ((double) a);
+}
+
+/* Convert unsigned int to long double.  */
+long double
+__gcc_utoq (unsigned int a)
+{
+  return __gcc_dtoq ((double) a);
+}
+
+#endif
+
+#ifdef __NO_FPRS__
+
+int __gcc_qunord (double, double, double, double);
+
+extern int __eqdf2 (double, double);
+extern int __unorddf2 (double, double);
+
+/* Compare two 'long double' values for unordered.  */
+int
+__gcc_qunord (double a, double aa, double c, double cc)
+{
+  if (__eqdf2 (a, c) == 0)
+    return __unorddf2 (aa, cc);
+  return __unorddf2 (a, c);
+}
+
+#include "soft-fp/soft-fp.h"
+#include "soft-fp/double.h"
+#include "soft-fp/quad.h"
+
+/* Compute floating point multiply-subtract with higher (quad) precision.  */
+static double
+fmsub (double a, double b, double c)
+{
+    FP_DECL_EX;
+    FP_DECL_D(A);
+    FP_DECL_D(B);
+    FP_DECL_D(C);
+    FP_DECL_Q(X);
+    FP_DECL_Q(Y);
+    FP_DECL_Q(Z);
+    FP_DECL_Q(U);
+    FP_DECL_Q(V);
+    FP_DECL_D(R);
+    double r;
+    long double u, x, y, z;
+
+    FP_INIT_ROUNDMODE;
+    FP_UNPACK_RAW_D (A, a);
+    FP_UNPACK_RAW_D (B, b);
+    FP_UNPACK_RAW_D (C, c);
+
+    /* Extend double to quad.  */
+#if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
+    FP_EXTEND(Q,D,4,2,X,A);
+    FP_EXTEND(Q,D,4,2,Y,B);
+    FP_EXTEND(Q,D,4,2,Z,C);
+#else
+    FP_EXTEND(Q,D,2,1,X,A);
+    FP_EXTEND(Q,D,2,1,Y,B);
+    FP_EXTEND(Q,D,2,1,Z,C);
+#endif
+    FP_PACK_RAW_Q(x,X);
+    FP_PACK_RAW_Q(y,Y);
+    FP_PACK_RAW_Q(z,Z);
+    FP_HANDLE_EXCEPTIONS;
+
+    /* Multiply.  */
+    FP_INIT_ROUNDMODE;
+    FP_UNPACK_Q(X,x);
+    FP_UNPACK_Q(Y,y);
+    FP_MUL_Q(U,X,Y);
+    FP_PACK_Q(u,U);
+    FP_HANDLE_EXCEPTIONS;
+
+    /* Subtract.  */
+    FP_INIT_ROUNDMODE;
+    FP_UNPACK_SEMIRAW_Q(U,u);
+    FP_UNPACK_SEMIRAW_Q(Z,z);
+    FP_SUB_Q(V,U,Z);
+
+    /* Truncate quad to double.  */
+#if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
+    V_f[3] &= 0x0007ffff;
+    FP_TRUNC(D,Q,2,4,R,V);
+#else
+    V_f1 &= 0x0007ffffffffffffL;
+    FP_TRUNC(D,Q,1,2,R,V);
+#endif
+    FP_PACK_SEMIRAW_D(r,R);
+    FP_HANDLE_EXCEPTIONS;
+
+    return r;
+}
+
+#endif
+
+#endif
diff --git a/libgcc/config/rs6000/libgcc-ppc-glibc.ver b/libgcc/config/rs6000/libgcc-ppc-glibc.ver
new file mode 100644 (file)
index 0000000..8862c14
--- /dev/null
@@ -0,0 +1,73 @@
+# Copyright (C) 2006, 2007 Free Software Foundation, Inc.
+#
+# This file is part of GCC.
+#
+# GCC is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# GCC is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3.  If not see
+# <http://www.gnu.org/licenses/>.
+
+%ifndef _SOFT_FLOAT
+%ifndef __powerpc64__
+%exclude {
+  __multc3
+  __divtc3
+  __powitf2
+  __fixtfdi
+  __fixunstfdi
+  __floatditf
+}
+
+GCC_4.1.0 {
+  # long double support
+  __multc3
+  __divtc3
+  __powitf2
+  __fixtfdi
+  __fixunstfdi
+  __floatditf
+
+%else
+GCC_3.4.4 {
+%endif
+%else
+GCC_4.2.0 {
+%endif
+
+  # long double support
+  __gcc_qadd
+  __gcc_qsub
+  __gcc_qmul
+  __gcc_qdiv
+
+%ifdef _SOFT_DOUBLE
+  __gcc_qneg
+  __gcc_qeq
+  __gcc_qne
+  __gcc_qgt
+  __gcc_qge
+  __gcc_qlt
+  __gcc_qle
+  __gcc_stoq
+  __gcc_dtoq
+  __gcc_qtos
+  __gcc_qtod
+  __gcc_qtoi
+  __gcc_qtou
+  __gcc_itoq
+  __gcc_utoq
+%endif
+
+%ifdef __NO_FPRS__
+  __gcc_qunord
+%endif
+}
diff --git a/libgcc/config/rs6000/libgcc-ppc64.ver b/libgcc/config/rs6000/libgcc-ppc64.ver
new file mode 100644 (file)
index 0000000..b27b4b4
--- /dev/null
@@ -0,0 +1,7 @@
+GCC_3.4.4 {
+  # long double support
+  __gcc_qadd
+  __gcc_qsub
+  __gcc_qmul
+  __gcc_qdiv
+}
diff --git a/libgcc/config/rs6000/sfp-machine.h b/libgcc/config/rs6000/sfp-machine.h
new file mode 100644 (file)
index 0000000..a0d1631
--- /dev/null
@@ -0,0 +1,68 @@
+#define _FP_W_TYPE_SIZE                32
+#define _FP_W_TYPE             unsigned long
+#define _FP_WS_TYPE            signed long
+#define _FP_I_TYPE             long
+
+/* 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_S(R,X,Y)                          \
+  _FP_MUL_MEAT_1_wide(_FP_WFRACBITS_S,R,X,Y,umul_ppmm)
+#define _FP_MUL_MEAT_D(R,X,Y)                          \
+  _FP_MUL_MEAT_2_wide(_FP_WFRACBITS_D,R,X,Y,umul_ppmm)
+#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_loop(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 << 1) - 1)
+#define _FP_NANFRAC_D          ((_FP_QNANBIT_D << 1) - 1), -1
+#define _FP_NANFRAC_Q          ((_FP_QNANBIT_Q << 1) - 1), -1, -1, -1
+#define _FP_NANSIGN_S          0
+#define _FP_NANSIGN_D          0
+#define _FP_NANSIGN_Q          0
+
+#define _FP_KEEPNANFRACP 1
+
+/* Someone please check this.  */
+#define _FP_CHOOSENAN(fs, wc, R, X, Y, OP)                     \
+  do {                                                         \
+    if ((_FP_FRAC_HIGH_RAW_##fs(X) & _FP_QNANBIT_##fs)         \
+       && !(_FP_FRAC_HIGH_RAW_##fs(Y) & _FP_QNANBIT_##fs))     \
+      {                                                                \
+       R##_s = Y##_s;                                          \
+       _FP_FRAC_COPY_##wc(R,Y);                                \
+      }                                                                \
+    else                                                       \
+      {                                                                \
+       R##_s = X##_s;                                          \
+       _FP_FRAC_COPY_##wc(R,X);                                \
+      }                                                                \
+    R##_c = FP_CLS_NAN;                                                \
+  } while (0)
+
+#define        __LITTLE_ENDIAN 1234
+#define        __BIG_ENDIAN    4321
+
+#if defined __BIG_ENDIAN__ || defined _BIG_ENDIAN
+# if defined __LITTLE_ENDIAN__ || defined _LITTLE_ENDIAN
+#  error "Both BIG_ENDIAN and LITTLE_ENDIAN defined!"
+# endif
+# define __BYTE_ORDER __BIG_ENDIAN
+#else
+# if defined __LITTLE_ENDIAN__ || defined _LITTLE_ENDIAN
+#  define __BYTE_ORDER __LITTLE_ENDIAN
+# else
+#  error "Cannot determine current byte order"
+# endif
+#endif
+
+
+/* Define ALIASNAME as a strong alias for NAME.  */
+# define strong_alias(name, aliasname) _strong_alias(name, aliasname)
+# define _strong_alias(name, aliasname) \
+  extern __typeof (name) aliasname __attribute__ ((alias (#name)));
diff --git a/libgcc/config/rs6000/t-freebsd b/libgcc/config/rs6000/t-freebsd
new file mode 100644 (file)
index 0000000..4234999
--- /dev/null
@@ -0,0 +1,22 @@
+# Overrides for FreeBSD PowerPC 
+#
+# Copyright (C) 2011 Free Software Foundation, Inc.
+#
+# This file is part of GCC.
+#
+# GCC is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# GCC is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3.  If not see
+# <http://www.gnu.org/licenses/>.
+
+# We do not want to build ibm-ldouble.c.
+LIB2ADD := $(filter-out ibm-ldouble.c, $(LIB2ADD))
diff --git a/libgcc/config/rs6000/t-ibm-ldouble b/libgcc/config/rs6000/t-ibm-ldouble
new file mode 100644 (file)
index 0000000..3f7a2d8
--- /dev/null
@@ -0,0 +1,6 @@
+# GCC 128-bit long double support routines.
+LIB2ADD += $(srcdir)/config/rs6000/ibm-ldouble.c
+
+HOST_LIBGCC2_CFLAGS += -mlong-double-128
+
+SHLIB_MAPFILES += $(srcdir)/config/rs6000/libgcc-ppc64.ver
index bdd62f3cdee6e21c1a55226b036417910b26b702..ecc3581b1a0ffbcd4ae0e28c2dcc83d173c0d955 100644 (file)
@@ -1,3 +1,3 @@
-SHLIB_MAPFILES += $(gcc_srcdir)/config/rs6000/libgcc-ppc-glibc.ver
+SHLIB_MAPFILES += $(srcdir)/config/rs6000/libgcc-ppc-glibc.ver
 
 HOST_LIBGCC2_CFLAGS += -mlong-double-128
diff --git a/libgcc/config/rs6000/t-linux64 b/libgcc/config/rs6000/t-linux64
new file mode 100644 (file)
index 0000000..7b08315
--- /dev/null
@@ -0,0 +1,2 @@
+softfp_wrap_start := '\#ifndef __powerpc64__'
+softfp_wrap_end := '\#endif'
index 4548cd76c17e0d77ea41c057c0889bd00bcf1952..f75bee22737bc6442a4858ae97a10caf7e3b0263 100644 (file)
@@ -1,3 +1,5 @@
+LIB2ADD += $(srcdir)/config/rs6000/ibm-ldouble.c
+
 LIB2ADD_ST += crtsavfpr.S crtresfpr.S \
   crtsavgpr.S crtresgpr.S \
   crtresxfpr.S crtresxgpr.S \
diff --git a/libgcc/config/rs6000/t-ppccomm-ldbl b/libgcc/config/rs6000/t-ppccomm-ldbl
new file mode 100644 (file)
index 0000000..f1d5360
--- /dev/null
@@ -0,0 +1 @@
+LIB2ADD += $(srcdir)/config/rs6000/ibm-ldouble.c
diff --git a/libgcc/config/score/sfp-machine.h b/libgcc/config/score/sfp-machine.h
new file mode 100644 (file)
index 0000000..98f9f1b
--- /dev/null
@@ -0,0 +1,57 @@
+#define _FP_W_TYPE_SIZE                32
+#define _FP_W_TYPE             unsigned long
+#define _FP_WS_TYPE            signed long
+#define _FP_I_TYPE             long
+
+/* 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_S(R,X,Y)                          \
+  _FP_MUL_MEAT_1_wide(_FP_WFRACBITS_S,R,X,Y,umul_ppmm)
+#define _FP_MUL_MEAT_D(R,X,Y)                          \
+  _FP_MUL_MEAT_2_wide(_FP_WFRACBITS_D,R,X,Y,umul_ppmm)
+#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_loop(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 << 1) - 1)
+#define _FP_NANFRAC_D          ((_FP_QNANBIT_D << 1) - 1), -1
+#define _FP_NANFRAC_Q          ((_FP_QNANBIT_Q << 1) - 1), -1, -1, -1
+#define _FP_NANSIGN_S          0
+#define _FP_NANSIGN_D          0
+#define _FP_NANSIGN_Q          0
+
+#define _FP_KEEPNANFRACP 1
+
+/* Someone please check this.  */
+#define _FP_CHOOSENAN(fs, wc, R, X, Y, OP)                     \
+  do {                                                         \
+    if ((_FP_FRAC_HIGH_RAW_##fs(X) & _FP_QNANBIT_##fs)         \
+       && !(_FP_FRAC_HIGH_RAW_##fs(Y) & _FP_QNANBIT_##fs))     \
+      {                                                                \
+       R##_s = Y##_s;                                          \
+       _FP_FRAC_COPY_##wc(R,Y);                                \
+      }                                                                \
+    else                                                       \
+      {                                                                \
+       R##_s = X##_s;                                          \
+       _FP_FRAC_COPY_##wc(R,X);                                \
+      }                                                                \
+    R##_c = FP_CLS_NAN;                                                \
+  } while (0)
+
+#define        __LITTLE_ENDIAN 1234
+#define        __BIG_ENDIAN    4321
+
+# define __BYTE_ORDER __BIG_ENDIAN
+
+/* Define ALIASNAME as a strong alias for NAME.  */
+# define strong_alias(name, aliasname) _strong_alias(name, aliasname)
+# define _strong_alias(name, aliasname) \
+  extern __typeof (name) aliasname __attribute__ ((alias (#name)));
+
index 5d67da01780a0f2e4af1a3f2b09345e37132a428..35cfac094aaf85d1550bf49239b2aadefd4667fa 100644 (file)
+# Copyright (C) 2006, 2007, 2011 Free Software Foundation, Inc.
+
+# This file is part of GCC.
+
+# GCC is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+
+# GCC is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3.  If not see
+# <http://www.gnu.org/licenses/>.
+
+# Targets using soft-fp should define the following variables:
+#
+# softfp_float_modes: a list of soft-float floating-point modes,
+#                     e.g. sf df
+# softfp_int_modes: a list of integer modes for which to define conversions,
+#                   e.g. si di
+# softfp_extensions: a list of extensions between floating-point modes,
+#                    e.g. sfdf
+# softfp_truncations: a list of truncations between floating-point modes,
+#                     e.g. dfsf
+#
+# Extensions and truncations should include those where only one mode
+# is a soft-float mode; for example, sftf where sf is hard-float and
+# tf is soft-float.
+#
+# If the libgcc2.c functions should not be replaced, also define:
+#
+# softfp_exclude_libgcc2 := y
+#
+# Avoiding replacing the libgcc2.c functions is a temporary measure
+# for targets with both hard-float and soft-float multilibs, since
+# these variables apply for all multilibs.  With toplevel libgcc,
+# soft-fp can be used conditionally on the multilib instead.
+#
+# If the code should not be compiled at all for some multilibs, define:
+#
+# softfp_wrap_start: text to put at the start of wrapper source files,
+#                    output with echo
+#                    e.g. '#ifndef __powerpc64__'
+# softfp_wrap_end: text to put at the end of wrapper source files,
+#                  e.g. '#endif'
+#
+# This is another temporary measure.
+
+softfp_float_funcs = add$(m)3 div$(m)3 eq$(m)2 ge$(m)2 le$(m)2 mul$(m)3 \
+  neg$(m)2 sub$(m)3 unord$(m)2
+softfp_floatint_funcs = fix$(m)$(i) fixuns$(m)$(i) \
+  float$(i)$(m) floatun$(i)$(m)
+
+softfp_func_list := \
+  $(foreach m,$(softfp_float_modes), \
+              $(softfp_float_funcs) \
+              $(foreach i,$(softfp_int_modes), \
+                          $(softfp_floatint_funcs))) \
+  $(foreach e,$(softfp_extensions),extend$(e)2) \
+  $(foreach t,$(softfp_truncations),trunc$(t)2)
+
+ifeq ($(softfp_exclude_libgcc2),y)
+# This list is taken from mklibgcc.in and doesn't presently allow for
+# 64-bit targets where si should become di and di should become ti.
+softfp_func_list := $(filter-out floatdidf floatdisf fixunsdfsi fixunssfsi \
+  fixunsdfdi fixdfdi fixunssfdi fixsfdi fixxfdi fixunsxfdi \
+  floatdixf fixunsxfsi fixtfdi fixunstfdi floatditf \
+  floatundidf floatundisf floatundixf floatunditf,$(softfp_func_list))
+endif
+
+ifeq ($(softfp_wrap_start),)
+softfp_file_list := \
+  $(addsuffix .c,$(addprefix $(srcdir)/soft-fp/,$(softfp_func_list)))
+else
+softfp_file_list := $(addsuffix .c,$(softfp_func_list))
+
+$(softfp_file_list):
+       echo $(softfp_wrap_start) > $@
+       echo '#include "soft-fp/$@"' >> $@
+       echo $(softfp_wrap_end) >> $@
+endif
+
 # Disable missing prototype and type limit warnings.  The prototypes
 # for the functions in the soft-fp files have not been brought across
 # from glibc.
 
-# cfr. srcdirify in gcc/Makefile.in
-soft-fp-files = $(filter $(gcc_srcdir)/config/soft-fp/%, $(LIB2ADD)) \
-       $(filter $(gcc_objdir)/config/soft-fp/%, $(LIB2ADD))
+soft-fp-objects = $(addsuffix $(objext), $(softfp_file_list)) \
+  $(addsuffix _s$(objext), $(softfp_file_list))
 
-soft-fp-objects-base = $(basename $(notdir $(soft-fp-files)))
+$(soft-fp-objects) : INTERNAL_CFLAGS += -Wno-missing-prototypes -Wno-type-limits
 
-soft-fp-objects = $(addsuffix $(objext), $(soft-fp-objects-base)) \
-  $(addsuffix _s$(objext), $(soft-fp-objects-base))
+LIB2ADD += $(softfp_file_list)
 
-$(soft-fp-objects) : INTERNAL_CFLAGS += -Wno-missing-prototypes -Wno-type-limits
+ifneq ($(softfp_exclude_libgcc2),y)
+# Functions in libgcc2.c are excluded for each soft-float mode (a
+# target may have both soft-float and hard-float modes), for the fixed
+# list of integer modes (si and di) for which libgcc2.c defines any
+# such functions.  Depending on the target, the si and di symbols may
+# in fact define di and ti functions.
+
+LIB2FUNCS_EXCLUDE += \
+  $(addprefix _,$(foreach m,$(softfp_float_modes), \
+                            $(foreach i,si di, \
+                                        $(softfp_floatint_funcs))))
+endif
diff --git a/libgcc/config/t-softfp-excl b/libgcc/config/t-softfp-excl
new file mode 100644 (file)
index 0000000..9d9786b
--- /dev/null
@@ -0,0 +1 @@
+softfp_exclude_libgcc2 := y
diff --git a/libgcc/config/t-softfp-sfdf b/libgcc/config/t-softfp-sfdf
new file mode 100644 (file)
index 0000000..2fbc63d
--- /dev/null
@@ -0,0 +1,5 @@
+softfp_float_modes := sf df
+softfp_int_modes := si di
+softfp_extensions := sfdf
+softfp_truncations := dfsf
+softfp_exclude_libgcc2 := n
diff --git a/libgcc/config/t-softfp-tf b/libgcc/config/t-softfp-tf
new file mode 100644 (file)
index 0000000..f567629
--- /dev/null
@@ -0,0 +1,5 @@
+softfp_float_modes := tf
+softfp_int_modes := si di ti
+softfp_extensions := sftf dftf xftf
+softfp_truncations := tfsf tfdf tfxf
+softfp_exclude_libgcc2 := n
index 0ead080691d522cff6ff66272eeb14d2687ba990..80bb61c80afc69c4121e5bfdbe653d90ffd8f87a 100644 (file)
@@ -594,6 +594,7 @@ asm_hidden_op
 extra_parts
 cpu_type
 tmake_file
+sfp_machine_header
 set_use_emutls
 set_have_cc_tls
 vis_hide
@@ -4608,6 +4609,17 @@ if test "$enable_tls $gcc_cv_use_emutls" = "yes yes"; then
 fi
 
 
+# Conditionalize the sfp-machine.h header for this target machine.
+if test -z "${sfp_machine_header}"; then
+       sfp_machine_header=$cpu_type/sfp-machine.h
+       if test -f ${srcdir}/config/${sfp_machine_header}; then
+               :
+       else
+               sfp_machine_header=no-sfp-machine.h
+       fi
+fi
+
+
 # Conditionalize the makefile for this target machine.
 tmake_file_=
 for f in ${tmake_file}
@@ -4630,6 +4642,8 @@ ac_config_links="$ac_config_links unwind.h:$unwind_header"
 
 ac_config_links="$ac_config_links md-unwind-support.h:config/$md_unwind_header"
 
+ac_config_links="$ac_config_links sfp-machine.h:config/$sfp_machine_header"
+
 
 # We need multilib support.
 ac_config_files="$ac_config_files Makefile"
@@ -5358,6 +5372,7 @@ do
     "enable-execute-stack.c") CONFIG_LINKS="$CONFIG_LINKS enable-execute-stack.c:$enable_execute_stack" ;;
     "unwind.h") CONFIG_LINKS="$CONFIG_LINKS unwind.h:$unwind_header" ;;
     "md-unwind-support.h") CONFIG_LINKS="$CONFIG_LINKS md-unwind-support.h:config/$md_unwind_header" ;;
+    "sfp-machine.h") CONFIG_LINKS="$CONFIG_LINKS sfp-machine.h:config/$sfp_machine_header" ;;
     "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
     "default") CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;;
 
index 8e2d1accd9de35ed07ea7c64bbf3d0fa645be812..c1a3dce0f5ba7d17dd57ce218597e118701b7073 100644 (file)
@@ -273,6 +273,17 @@ if test "$enable_tls $gcc_cv_use_emutls" = "yes yes"; then
 fi
 AC_SUBST(set_use_emutls)
 
+# Conditionalize the sfp-machine.h header for this target machine.
+if test -z "${sfp_machine_header}"; then
+       sfp_machine_header=$cpu_type/sfp-machine.h
+       if test -f ${srcdir}/config/${sfp_machine_header}; then
+               :
+       else
+               sfp_machine_header=no-sfp-machine.h
+       fi
+fi
+AC_SUBST(sfp_machine_header)
+
 # Conditionalize the makefile for this target machine.
 tmake_file_=
 for f in ${tmake_file}
@@ -292,6 +303,7 @@ AC_SUBST(asm_hidden_op)
 AC_CONFIG_LINKS([enable-execute-stack.c:$enable_execute_stack])
 AC_CONFIG_LINKS([unwind.h:$unwind_header])
 AC_CONFIG_LINKS([md-unwind-support.h:config/$md_unwind_header])
+AC_CONFIG_LINKS([sfp-machine.h:config/$sfp_machine_header])
 
 # We need multilib support.
 AC_CONFIG_FILES([Makefile])
diff --git a/libgcc/soft-fp/README b/libgcc/soft-fp/README
new file mode 100644 (file)
index 0000000..361386d
--- /dev/null
@@ -0,0 +1,5 @@
+Except for conversions involving TImode and conversions involving
+XFmode, the files in this directory are part of the GNU C Library, not part
+of GCC.  As described at <http://gcc.gnu.org/codingconventions.html>, changes
+should be made to the GNU C Library and the changed files then imported
+into GCC.
diff --git a/libgcc/soft-fp/adddf3.c b/libgcc/soft-fp/adddf3.c
new file mode 100644 (file)
index 0000000..24c03db
--- /dev/null
@@ -0,0 +1,49 @@
+/* Software floating-point emulation.
+   Return a + b
+   Copyright (C) 1997,1999, 2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "double.h"
+
+DFtype __adddf3(DFtype a, DFtype b)
+{
+  FP_DECL_EX;
+  FP_DECL_D(A); FP_DECL_D(B); FP_DECL_D(R);
+  DFtype r;
+
+  FP_INIT_ROUNDMODE;
+  FP_UNPACK_SEMIRAW_D(A, a);
+  FP_UNPACK_SEMIRAW_D(B, b);
+  FP_ADD_D(R, A, B);
+  FP_PACK_SEMIRAW_D(r, R);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
diff --git a/libgcc/soft-fp/addsf3.c b/libgcc/soft-fp/addsf3.c
new file mode 100644 (file)
index 0000000..b86991e
--- /dev/null
@@ -0,0 +1,50 @@
+/* Software floating-point emulation.
+   Return a + b
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "single.h"
+
+SFtype __addsf3(SFtype a, SFtype b)
+{
+  FP_DECL_EX;
+  FP_DECL_S(A); FP_DECL_S(B); FP_DECL_S(R);
+  SFtype r;
+
+  FP_INIT_ROUNDMODE;
+  FP_UNPACK_SEMIRAW_S(A, a);
+  FP_UNPACK_SEMIRAW_S(B, b);
+  FP_ADD_S(R, A, B);
+  FP_PACK_SEMIRAW_S(r, R);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
+
diff --git a/libgcc/soft-fp/addtf3.c b/libgcc/soft-fp/addtf3.c
new file mode 100644 (file)
index 0000000..49b67f0
--- /dev/null
@@ -0,0 +1,49 @@
+/* Software floating-point emulation.
+   Return a + b
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "quad.h"
+
+TFtype __addtf3(TFtype a, TFtype b)
+{
+  FP_DECL_EX;
+  FP_DECL_Q(A); FP_DECL_Q(B); FP_DECL_Q(R);
+  TFtype r;
+
+  FP_INIT_ROUNDMODE;
+  FP_UNPACK_SEMIRAW_Q(A, a);
+  FP_UNPACK_SEMIRAW_Q(B, b);
+  FP_ADD_Q(R, A, B);
+  FP_PACK_SEMIRAW_Q(r, R);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
diff --git a/libgcc/soft-fp/divdf3.c b/libgcc/soft-fp/divdf3.c
new file mode 100644 (file)
index 0000000..c3bb0d2
--- /dev/null
@@ -0,0 +1,49 @@
+/* Software floating-point emulation.
+   Return a / b
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "double.h"
+
+DFtype __divdf3(DFtype a, DFtype b)
+{
+  FP_DECL_EX;
+  FP_DECL_D(A); FP_DECL_D(B); FP_DECL_D(R);
+  DFtype r;
+
+  FP_INIT_ROUNDMODE;
+  FP_UNPACK_D(A, a);
+  FP_UNPACK_D(B, b);
+  FP_DIV_D(R, A, B);
+  FP_PACK_D(r, R);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
diff --git a/libgcc/soft-fp/divsf3.c b/libgcc/soft-fp/divsf3.c
new file mode 100644 (file)
index 0000000..176bb3c
--- /dev/null
@@ -0,0 +1,49 @@
+/* Software floating-point emulation.
+   Return a / b
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "single.h"
+
+SFtype __divsf3(SFtype a, SFtype b)
+{
+  FP_DECL_EX;
+  FP_DECL_S(A); FP_DECL_S(B); FP_DECL_S(R);
+  SFtype r;
+
+  FP_INIT_ROUNDMODE;
+  FP_UNPACK_S(A, a);
+  FP_UNPACK_S(B, b);
+  FP_DIV_S(R, A, B);
+  FP_PACK_S(r, R);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
diff --git a/libgcc/soft-fp/divtf3.c b/libgcc/soft-fp/divtf3.c
new file mode 100644 (file)
index 0000000..916fbfe
--- /dev/null
@@ -0,0 +1,49 @@
+/* Software floating-point emulation.
+   Return a / b
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "quad.h"
+
+TFtype __divtf3(TFtype a, TFtype b)
+{
+  FP_DECL_EX;
+  FP_DECL_Q(A); FP_DECL_Q(B); FP_DECL_Q(R);
+  TFtype r;
+
+  FP_INIT_ROUNDMODE;
+  FP_UNPACK_Q(A, a);
+  FP_UNPACK_Q(B, b);
+  FP_DIV_Q(R, A, B);
+  FP_PACK_Q(r, R);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
diff --git a/libgcc/soft-fp/double.h b/libgcc/soft-fp/double.h
new file mode 100644 (file)
index 0000000..1cde330
--- /dev/null
@@ -0,0 +1,265 @@
+/* Software floating-point emulation.
+   Definitions for IEEE Double Precision
+   Copyright (C) 1997, 1998, 1999, 2006, 2007, 2008, 2009
+   Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com),
+                 Jakub Jelinek (jj@ultra.linux.cz),
+                 David S. Miller (davem@redhat.com) and
+                 Peter Maydell (pmaydell@chiark.greenend.org.uk).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#if _FP_W_TYPE_SIZE < 32
+#error "Here's a nickel kid.  Go buy yourself a real computer."
+#endif
+
+#if _FP_W_TYPE_SIZE < 64
+#define _FP_FRACTBITS_D                (2 * _FP_W_TYPE_SIZE)
+#else
+#define _FP_FRACTBITS_D                _FP_W_TYPE_SIZE
+#endif
+
+#define _FP_FRACBITS_D         53
+#define _FP_FRACXBITS_D                (_FP_FRACTBITS_D - _FP_FRACBITS_D)
+#define _FP_WFRACBITS_D                (_FP_WORKBITS + _FP_FRACBITS_D)
+#define _FP_WFRACXBITS_D       (_FP_FRACTBITS_D - _FP_WFRACBITS_D)
+#define _FP_EXPBITS_D          11
+#define _FP_EXPBIAS_D          1023
+#define _FP_EXPMAX_D           2047
+
+#define _FP_QNANBIT_D          \
+       ((_FP_W_TYPE)1 << (_FP_FRACBITS_D-2) % _FP_W_TYPE_SIZE)
+#define _FP_QNANBIT_SH_D               \
+       ((_FP_W_TYPE)1 << (_FP_FRACBITS_D-2+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
+#define _FP_IMPLBIT_D          \
+       ((_FP_W_TYPE)1 << (_FP_FRACBITS_D-1) % _FP_W_TYPE_SIZE)
+#define _FP_IMPLBIT_SH_D               \
+       ((_FP_W_TYPE)1 << (_FP_FRACBITS_D-1+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
+#define _FP_OVERFLOW_D         \
+       ((_FP_W_TYPE)1 << _FP_WFRACBITS_D % _FP_W_TYPE_SIZE)
+
+typedef float DFtype __attribute__((mode(DF)));
+
+#if _FP_W_TYPE_SIZE < 64
+
+union _FP_UNION_D
+{
+  DFtype flt;
+  struct {
+#if __BYTE_ORDER == __BIG_ENDIAN
+    unsigned sign  : 1;
+    unsigned exp   : _FP_EXPBITS_D;
+    unsigned frac1 : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0) - _FP_W_TYPE_SIZE;
+    unsigned frac0 : _FP_W_TYPE_SIZE;
+#else
+    unsigned frac0 : _FP_W_TYPE_SIZE;
+    unsigned frac1 : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0) - _FP_W_TYPE_SIZE;
+    unsigned exp   : _FP_EXPBITS_D;
+    unsigned sign  : 1;
+#endif
+  } bits __attribute__((packed));
+};
+
+#define FP_DECL_D(X)           _FP_DECL(2,X)
+#define FP_UNPACK_RAW_D(X,val) _FP_UNPACK_RAW_2(D,X,val)
+#define FP_UNPACK_RAW_DP(X,val)        _FP_UNPACK_RAW_2_P(D,X,val)
+#define FP_PACK_RAW_D(val,X)   _FP_PACK_RAW_2(D,val,X)
+#define FP_PACK_RAW_DP(val,X)          \
+  do {                                 \
+    if (!FP_INHIBIT_RESULTS)           \
+      _FP_PACK_RAW_2_P(D,val,X);       \
+  } while (0)
+
+#define FP_UNPACK_D(X,val)             \
+  do {                                 \
+    _FP_UNPACK_RAW_2(D,X,val);         \
+    _FP_UNPACK_CANONICAL(D,2,X);       \
+  } while (0)
+
+#define FP_UNPACK_DP(X,val)            \
+  do {                                 \
+    _FP_UNPACK_RAW_2_P(D,X,val);       \
+    _FP_UNPACK_CANONICAL(D,2,X);       \
+  } while (0)
+
+#define FP_UNPACK_SEMIRAW_D(X,val)     \
+  do {                                 \
+    _FP_UNPACK_RAW_2(D,X,val);         \
+    _FP_UNPACK_SEMIRAW(D,2,X);         \
+  } while (0)
+
+#define FP_UNPACK_SEMIRAW_DP(X,val)    \
+  do {                                 \
+    _FP_UNPACK_RAW_2_P(D,X,val);       \
+    _FP_UNPACK_SEMIRAW(D,2,X);         \
+  } while (0)
+
+#define FP_PACK_D(val,X)               \
+  do {                                 \
+    _FP_PACK_CANONICAL(D,2,X);         \
+    _FP_PACK_RAW_2(D,val,X);           \
+  } while (0)
+
+#define FP_PACK_DP(val,X)              \
+  do {                                 \
+    _FP_PACK_CANONICAL(D,2,X);         \
+    if (!FP_INHIBIT_RESULTS)           \
+      _FP_PACK_RAW_2_P(D,val,X);       \
+  } while (0)
+
+#define FP_PACK_SEMIRAW_D(val,X)       \
+  do {                                 \
+    _FP_PACK_SEMIRAW(D,2,X);           \
+    _FP_PACK_RAW_2(D,val,X);           \
+  } while (0)
+
+#define FP_PACK_SEMIRAW_DP(val,X)      \
+  do {                                 \
+    _FP_PACK_SEMIRAW(D,2,X);           \
+    if (!FP_INHIBIT_RESULTS)           \
+      _FP_PACK_RAW_2_P(D,val,X);       \
+  } while (0)
+
+#define FP_ISSIGNAN_D(X)               _FP_ISSIGNAN(D,2,X)
+#define FP_NEG_D(R,X)                  _FP_NEG(D,2,R,X)
+#define FP_ADD_D(R,X,Y)                        _FP_ADD(D,2,R,X,Y)
+#define FP_SUB_D(R,X,Y)                        _FP_SUB(D,2,R,X,Y)
+#define FP_MUL_D(R,X,Y)                        _FP_MUL(D,2,R,X,Y)
+#define FP_DIV_D(R,X,Y)                        _FP_DIV(D,2,R,X,Y)
+#define FP_SQRT_D(R,X)                 _FP_SQRT(D,2,R,X)
+#define _FP_SQRT_MEAT_D(R,S,T,X,Q)     _FP_SQRT_MEAT_2(R,S,T,X,Q)
+
+#define FP_CMP_D(r,X,Y,un)     _FP_CMP(D,2,r,X,Y,un)
+#define FP_CMP_EQ_D(r,X,Y)     _FP_CMP_EQ(D,2,r,X,Y)
+#define FP_CMP_UNORD_D(r,X,Y)  _FP_CMP_UNORD(D,2,r,X,Y)
+
+#define FP_TO_INT_D(r,X,rsz,rsg)       _FP_TO_INT(D,2,r,X,rsz,rsg)
+#define FP_FROM_INT_D(X,r,rs,rt)       _FP_FROM_INT(D,2,X,r,rs,rt)
+
+#define _FP_FRAC_HIGH_D(X)     _FP_FRAC_HIGH_2(X)
+#define _FP_FRAC_HIGH_RAW_D(X) _FP_FRAC_HIGH_2(X)
+
+#else
+
+union _FP_UNION_D
+{
+  DFtype flt;
+  struct {
+#if __BYTE_ORDER == __BIG_ENDIAN
+    unsigned sign   : 1;
+    unsigned exp    : _FP_EXPBITS_D;
+    _FP_W_TYPE frac : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0);
+#else
+    _FP_W_TYPE frac : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0);
+    unsigned exp    : _FP_EXPBITS_D;
+    unsigned sign   : 1;
+#endif
+  } bits __attribute__((packed));
+};
+
+#define FP_DECL_D(X)           _FP_DECL(1,X)
+#define FP_UNPACK_RAW_D(X,val) _FP_UNPACK_RAW_1(D,X,val)
+#define FP_UNPACK_RAW_DP(X,val)        _FP_UNPACK_RAW_1_P(D,X,val)
+#define FP_PACK_RAW_D(val,X)   _FP_PACK_RAW_1(D,val,X)
+#define FP_PACK_RAW_DP(val,X)          \
+  do {                                 \
+    if (!FP_INHIBIT_RESULTS)           \
+      _FP_PACK_RAW_1_P(D,val,X);       \
+  } while (0)
+
+#define FP_UNPACK_D(X,val)             \
+  do {                                 \
+    _FP_UNPACK_RAW_1(D,X,val);         \
+    _FP_UNPACK_CANONICAL(D,1,X);       \
+  } while (0)
+
+#define FP_UNPACK_DP(X,val)            \
+  do {                                 \
+    _FP_UNPACK_RAW_1_P(D,X,val);       \
+    _FP_UNPACK_CANONICAL(D,1,X);       \
+  } while (0)
+
+#define FP_UNPACK_SEMIRAW_D(X,val)     \
+  do {                                 \
+    _FP_UNPACK_RAW_1(D,X,val);         \
+    _FP_UNPACK_SEMIRAW(D,1,X);         \
+  } while (0)
+
+#define FP_UNPACK_SEMIRAW_DP(X,val)    \
+  do {                                 \
+    _FP_UNPACK_RAW_1_P(D,X,val);       \
+    _FP_UNPACK_SEMIRAW(D,1,X);         \
+  } while (0)
+
+#define FP_PACK_D(val,X)               \
+  do {                                 \
+    _FP_PACK_CANONICAL(D,1,X);         \
+    _FP_PACK_RAW_1(D,val,X);           \
+  } while (0)
+
+#define FP_PACK_DP(val,X)              \
+  do {                                 \
+    _FP_PACK_CANONICAL(D,1,X);         \
+    if (!FP_INHIBIT_RESULTS)           \
+      _FP_PACK_RAW_1_P(D,val,X);       \
+  } while (0)
+
+#define FP_PACK_SEMIRAW_D(val,X)       \
+  do {                                 \
+    _FP_PACK_SEMIRAW(D,1,X);           \
+    _FP_PACK_RAW_1(D,val,X);           \
+  } while (0)
+
+#define FP_PACK_SEMIRAW_DP(val,X)      \
+  do {                                 \
+    _FP_PACK_SEMIRAW(D,1,X);           \
+    if (!FP_INHIBIT_RESULTS)           \
+      _FP_PACK_RAW_1_P(D,val,X);       \
+  } while (0)
+
+#define FP_ISSIGNAN_D(X)               _FP_ISSIGNAN(D,1,X)
+#define FP_NEG_D(R,X)                  _FP_NEG(D,1,R,X)
+#define FP_ADD_D(R,X,Y)                        _FP_ADD(D,1,R,X,Y)
+#define FP_SUB_D(R,X,Y)                        _FP_SUB(D,1,R,X,Y)
+#define FP_MUL_D(R,X,Y)                        _FP_MUL(D,1,R,X,Y)
+#define FP_DIV_D(R,X,Y)                        _FP_DIV(D,1,R,X,Y)
+#define FP_SQRT_D(R,X)                 _FP_SQRT(D,1,R,X)
+#define _FP_SQRT_MEAT_D(R,S,T,X,Q)     _FP_SQRT_MEAT_1(R,S,T,X,Q)
+
+/* The implementation of _FP_MUL_D and _FP_DIV_D should be chosen by
+   the target machine.  */
+
+#define FP_CMP_D(r,X,Y,un)     _FP_CMP(D,1,r,X,Y,un)
+#define FP_CMP_EQ_D(r,X,Y)     _FP_CMP_EQ(D,1,r,X,Y)
+#define FP_CMP_UNORD_D(r,X,Y)  _FP_CMP_UNORD(D,1,r,X,Y)
+
+#define FP_TO_INT_D(r,X,rsz,rsg)       _FP_TO_INT(D,1,r,X,rsz,rsg)
+#define FP_FROM_INT_D(X,r,rs,rt)       _FP_FROM_INT(D,1,X,r,rs,rt)
+
+#define _FP_FRAC_HIGH_D(X)     _FP_FRAC_HIGH_1(X)
+#define _FP_FRAC_HIGH_RAW_D(X) _FP_FRAC_HIGH_1(X)
+
+#endif /* W_TYPE_SIZE < 64 */
diff --git a/libgcc/soft-fp/eqdf2.c b/libgcc/soft-fp/eqdf2.c
new file mode 100644 (file)
index 0000000..82a8858
--- /dev/null
@@ -0,0 +1,51 @@
+/* Software floating-point emulation.
+   Return 0 iff a == b, 1 otherwise
+   Copyright (C) 1997,1999,2006,2007 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "double.h"
+
+CMPtype __eqdf2(DFtype a, DFtype b)
+{
+  FP_DECL_EX;
+  FP_DECL_D(A); FP_DECL_D(B);
+  CMPtype r;
+
+  FP_UNPACK_RAW_D(A, a);
+  FP_UNPACK_RAW_D(B, b);
+  FP_CMP_EQ_D(r, A, B);
+  if (r && (FP_ISSIGNAN_D(A) || FP_ISSIGNAN_D(B)))
+    FP_SET_EXCEPTION(FP_EX_INVALID);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
+
+strong_alias(__eqdf2, __nedf2);
diff --git a/libgcc/soft-fp/eqsf2.c b/libgcc/soft-fp/eqsf2.c
new file mode 100644 (file)
index 0000000..0a1180f
--- /dev/null
@@ -0,0 +1,51 @@
+/* Software floating-point emulation.
+   Return 0 iff a == b, 1 otherwise
+   Copyright (C) 1997,1999,2006,2007 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "single.h"
+
+CMPtype __eqsf2(SFtype a, SFtype b)
+{
+  FP_DECL_EX;
+  FP_DECL_S(A); FP_DECL_S(B);
+  CMPtype r;
+
+  FP_UNPACK_RAW_S(A, a);
+  FP_UNPACK_RAW_S(B, b);
+  FP_CMP_EQ_S(r, A, B);
+  if (r && (FP_ISSIGNAN_S(A) || FP_ISSIGNAN_S(B)))
+    FP_SET_EXCEPTION(FP_EX_INVALID);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
+
+strong_alias(__eqsf2, __nesf2);
diff --git a/libgcc/soft-fp/eqtf2.c b/libgcc/soft-fp/eqtf2.c
new file mode 100644 (file)
index 0000000..46240b7
--- /dev/null
@@ -0,0 +1,51 @@
+/* Software floating-point emulation.
+   Return 0 iff a == b, 1 otherwise
+   Copyright (C) 1997,1999,2006,2007 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "quad.h"
+
+CMPtype __eqtf2(TFtype a, TFtype b)
+{
+  FP_DECL_EX;
+  FP_DECL_Q(A); FP_DECL_Q(B);
+  CMPtype r;
+
+  FP_UNPACK_RAW_Q(A, a);
+  FP_UNPACK_RAW_Q(B, b);
+  FP_CMP_EQ_Q(r, A, B);
+  if (r && (FP_ISSIGNAN_Q(A) || FP_ISSIGNAN_Q(B)))
+    FP_SET_EXCEPTION(FP_EX_INVALID);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
+
+strong_alias(__eqtf2, __netf2);
diff --git a/libgcc/soft-fp/extenddftf2.c b/libgcc/soft-fp/extenddftf2.c
new file mode 100644 (file)
index 0000000..4101639
--- /dev/null
@@ -0,0 +1,54 @@
+/* Software floating-point emulation.
+   Return a converted to IEEE quad
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "double.h"
+#include "quad.h"
+
+TFtype __extenddftf2(DFtype a)
+{
+  FP_DECL_EX;
+  FP_DECL_D(A);
+  FP_DECL_Q(R);
+  TFtype r;
+
+  FP_INIT_ROUNDMODE;
+  FP_UNPACK_RAW_D(A, a);
+#if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
+  FP_EXTEND(Q,D,4,2,R,A);
+#else
+  FP_EXTEND(Q,D,2,1,R,A);
+#endif
+  FP_PACK_RAW_Q(r, R);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
diff --git a/libgcc/soft-fp/extended.h b/libgcc/soft-fp/extended.h
new file mode 100644 (file)
index 0000000..e5f16de
--- /dev/null
@@ -0,0 +1,431 @@
+/* Software floating-point emulation.
+   Definitions for IEEE Extended Precision.
+   Copyright (C) 1999,2006,2007 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#if _FP_W_TYPE_SIZE < 32
+#error "Here's a nickel, kid. Go buy yourself a real computer."
+#endif
+
+#if _FP_W_TYPE_SIZE < 64
+#define _FP_FRACTBITS_E         (4*_FP_W_TYPE_SIZE)
+#else
+#define _FP_FRACTBITS_E                (2*_FP_W_TYPE_SIZE)
+#endif
+
+#define _FP_FRACBITS_E         64
+#define _FP_FRACXBITS_E                (_FP_FRACTBITS_E - _FP_FRACBITS_E)
+#define _FP_WFRACBITS_E                (_FP_WORKBITS + _FP_FRACBITS_E)
+#define _FP_WFRACXBITS_E       (_FP_FRACTBITS_E - _FP_WFRACBITS_E)
+#define _FP_EXPBITS_E          15
+#define _FP_EXPBIAS_E          16383
+#define _FP_EXPMAX_E           32767
+
+#define _FP_QNANBIT_E          \
+       ((_FP_W_TYPE)1 << (_FP_FRACBITS_E-2) % _FP_W_TYPE_SIZE)
+#define _FP_QNANBIT_SH_E               \
+       ((_FP_W_TYPE)1 << (_FP_FRACBITS_E-2+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
+#define _FP_IMPLBIT_E          \
+       ((_FP_W_TYPE)1 << (_FP_FRACBITS_E-1) % _FP_W_TYPE_SIZE)
+#define _FP_IMPLBIT_SH_E               \
+       ((_FP_W_TYPE)1 << (_FP_FRACBITS_E-1+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
+#define _FP_OVERFLOW_E         \
+       ((_FP_W_TYPE)1 << (_FP_WFRACBITS_E % _FP_W_TYPE_SIZE))
+
+typedef float XFtype __attribute__((mode(XF)));
+
+#if _FP_W_TYPE_SIZE < 64
+
+union _FP_UNION_E
+{
+   XFtype flt;
+   struct 
+   {
+#if __BYTE_ORDER == __BIG_ENDIAN
+      unsigned long pad1 : _FP_W_TYPE_SIZE;
+      unsigned long pad2 : (_FP_W_TYPE_SIZE - 1 - _FP_EXPBITS_E);
+      unsigned long sign : 1;
+      unsigned long exp : _FP_EXPBITS_E;
+      unsigned long frac1 : _FP_W_TYPE_SIZE;
+      unsigned long frac0 : _FP_W_TYPE_SIZE;
+#else
+      unsigned long frac0 : _FP_W_TYPE_SIZE;
+      unsigned long frac1 : _FP_W_TYPE_SIZE;
+      unsigned exp : _FP_EXPBITS_E;
+      unsigned sign : 1;
+#endif /* not bigendian */
+   } bits __attribute__((packed));
+};
+
+
+#define FP_DECL_E(X)           _FP_DECL(4,X)
+
+#define FP_UNPACK_RAW_E(X, val)                                \
+  do {                                                 \
+    union _FP_UNION_E _flo; _flo.flt = (val);          \
+                                                       \
+    X##_f[2] = 0; X##_f[3] = 0;                                \
+    X##_f[0] = _flo.bits.frac0;                                \
+    X##_f[1] = _flo.bits.frac1;                                \
+    X##_e  = _flo.bits.exp;                            \
+    X##_s  = _flo.bits.sign;                           \
+  } while (0)
+
+#define FP_UNPACK_RAW_EP(X, val)                       \
+  do {                                                 \
+    union _FP_UNION_E *_flo =                          \
+    (union _FP_UNION_E *)(val);                                \
+                                                       \
+    X##_f[2] = 0; X##_f[3] = 0;                                \
+    X##_f[0] = _flo->bits.frac0;                       \
+    X##_f[1] = _flo->bits.frac1;                       \
+    X##_e  = _flo->bits.exp;                           \
+    X##_s  = _flo->bits.sign;                          \
+  } while (0)
+
+#define FP_PACK_RAW_E(val, X)                          \
+  do {                                                 \
+    union _FP_UNION_E _flo;                            \
+                                                       \
+    if (X##_e) X##_f[1] |= _FP_IMPLBIT_E;              \
+    else X##_f[1] &= ~(_FP_IMPLBIT_E);                 \
+    _flo.bits.frac0 = X##_f[0];                                \
+    _flo.bits.frac1 = X##_f[1];                                \
+    _flo.bits.exp   = X##_e;                           \
+    _flo.bits.sign  = X##_s;                           \
+                                                       \
+    (val) = _flo.flt;                                  \
+  } while (0)
+
+#define FP_PACK_RAW_EP(val, X)                         \
+  do {                                                 \
+    if (!FP_INHIBIT_RESULTS)                           \
+      {                                                        \
+       union _FP_UNION_E *_flo =                       \
+         (union _FP_UNION_E *)(val);                   \
+                                                       \
+       if (X##_e) X##_f[1] |= _FP_IMPLBIT_E;           \
+       else X##_f[1] &= ~(_FP_IMPLBIT_E);              \
+       _flo->bits.frac0 = X##_f[0];                    \
+       _flo->bits.frac1 = X##_f[1];                    \
+       _flo->bits.exp   = X##_e;                       \
+       _flo->bits.sign  = X##_s;                       \
+      }                                                        \
+  } while (0)
+
+#define FP_UNPACK_E(X,val)             \
+  do {                                 \
+    FP_UNPACK_RAW_E(X,val);            \
+    _FP_UNPACK_CANONICAL(E,4,X);       \
+  } while (0)
+
+#define FP_UNPACK_EP(X,val)            \
+  do {                                 \
+    FP_UNPACK_RAW_EP(X,val);           \
+    _FP_UNPACK_CANONICAL(E,4,X);       \
+  } while (0)
+
+#define FP_UNPACK_SEMIRAW_E(X,val)     \
+  do {                                 \
+    FP_UNPACK_RAW_E(X,val);            \
+    _FP_UNPACK_SEMIRAW(E,4,X);         \
+  } while (0)
+
+#define FP_UNPACK_SEMIRAW_EP(X,val)    \
+  do {                                 \
+    FP_UNPACK_RAW_EP(X,val);           \
+    _FP_UNPACK_SEMIRAW(E,4,X);         \
+  } while (0)
+
+#define FP_PACK_E(val,X)               \
+  do {                                 \
+    _FP_PACK_CANONICAL(E,4,X);         \
+    FP_PACK_RAW_E(val,X);              \
+  } while (0)
+
+#define FP_PACK_EP(val,X)              \
+  do {                                 \
+    _FP_PACK_CANONICAL(E,4,X);         \
+    FP_PACK_RAW_EP(val,X);             \
+  } while (0)
+
+#define FP_PACK_SEMIRAW_E(val,X)       \
+  do {                                 \
+    _FP_PACK_SEMIRAW(E,4,X);           \
+    FP_PACK_RAW_E(val,X);              \
+  } while (0)
+
+#define FP_PACK_SEMIRAW_EP(val,X)      \
+  do {                                 \
+    _FP_PACK_SEMIRAW(E,4,X);           \
+    FP_PACK_RAW_EP(val,X);             \
+  } while (0)
+
+#define FP_ISSIGNAN_E(X)       _FP_ISSIGNAN(E,4,X)
+#define FP_NEG_E(R,X)          _FP_NEG(E,4,R,X)
+#define FP_ADD_E(R,X,Y)                _FP_ADD(E,4,R,X,Y)
+#define FP_SUB_E(R,X,Y)                _FP_SUB(E,4,R,X,Y)
+#define FP_MUL_E(R,X,Y)                _FP_MUL(E,4,R,X,Y)
+#define FP_DIV_E(R,X,Y)                _FP_DIV(E,4,R,X,Y)
+#define FP_SQRT_E(R,X)         _FP_SQRT(E,4,R,X)
+
+/*
+ * Square root algorithms:
+ * We have just one right now, maybe Newton approximation
+ * should be added for those machines where division is fast.
+ * This has special _E version because standard _4 square
+ * root would not work (it has to start normally with the
+ * second word and not the first), but as we have to do it
+ * anyway, we optimize it by doing most of the calculations
+ * in two UWtype registers instead of four.
+ */
+#define _FP_SQRT_MEAT_E(R, S, T, X, q)                 \
+  do {                                                 \
+    q = (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE - 1);                \
+    _FP_FRAC_SRL_4(X, (_FP_WORKBITS));                 \
+    while (q)                                          \
+      {                                                        \
+       T##_f[1] = S##_f[1] + q;                        \
+       if (T##_f[1] <= X##_f[1])                       \
+         {                                             \
+           S##_f[1] = T##_f[1] + q;                    \
+           X##_f[1] -= T##_f[1];                       \
+           R##_f[1] += q;                              \
+         }                                             \
+       _FP_FRAC_SLL_2(X, 1);                           \
+       q >>= 1;                                        \
+      }                                                        \
+    q = (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE - 1);                \
+    while (q)                                          \
+      {                                                        \
+       T##_f[0] = S##_f[0] + q;                        \
+       T##_f[1] = S##_f[1];                            \
+       if (T##_f[1] < X##_f[1] ||                      \
+           (T##_f[1] == X##_f[1] &&                    \
+            T##_f[0] <= X##_f[0]))                     \
+         {                                             \
+           S##_f[0] = T##_f[0] + q;                    \
+           S##_f[1] += (T##_f[0] > S##_f[0]);          \
+           _FP_FRAC_DEC_2(X, T);                       \
+           R##_f[0] += q;                              \
+         }                                             \
+       _FP_FRAC_SLL_2(X, 1);                           \
+       q >>= 1;                                        \
+      }                                                        \
+    _FP_FRAC_SLL_4(R, (_FP_WORKBITS));                 \
+    if (X##_f[0] | X##_f[1])                           \
+      {                                                        \
+       if (S##_f[1] < X##_f[1] ||                      \
+           (S##_f[1] == X##_f[1] &&                    \
+            S##_f[0] < X##_f[0]))                      \
+         R##_f[0] |= _FP_WORK_ROUND;                   \
+       R##_f[0] |= _FP_WORK_STICKY;                    \
+      }                                                        \
+  } while (0)
+
+#define FP_CMP_E(r,X,Y,un)     _FP_CMP(E,4,r,X,Y,un)
+#define FP_CMP_EQ_E(r,X,Y)     _FP_CMP_EQ(E,4,r,X,Y)
+#define FP_CMP_UNORD_E(r,X,Y)  _FP_CMP_UNORD(E,4,r,X,Y)
+
+#define FP_TO_INT_E(r,X,rsz,rsg)       _FP_TO_INT(E,4,r,X,rsz,rsg)
+#define FP_FROM_INT_E(X,r,rs,rt)       _FP_FROM_INT(E,4,X,r,rs,rt)
+
+#define _FP_FRAC_HIGH_E(X)     (X##_f[2])
+#define _FP_FRAC_HIGH_RAW_E(X) (X##_f[1])
+
+#else   /* not _FP_W_TYPE_SIZE < 64 */
+union _FP_UNION_E
+{
+  XFtype flt;
+  struct {
+#if __BYTE_ORDER == __BIG_ENDIAN
+    _FP_W_TYPE pad  : (_FP_W_TYPE_SIZE - 1 - _FP_EXPBITS_E);
+    unsigned sign   : 1;
+    unsigned exp    : _FP_EXPBITS_E;
+    _FP_W_TYPE frac : _FP_W_TYPE_SIZE;
+#else
+    _FP_W_TYPE frac : _FP_W_TYPE_SIZE;
+    unsigned exp    : _FP_EXPBITS_E;
+    unsigned sign   : 1;
+#endif
+  } bits;
+};
+
+#define FP_DECL_E(X)           _FP_DECL(2,X)
+
+#define FP_UNPACK_RAW_E(X, val)                                        \
+  do {                                                         \
+    union _FP_UNION_E _flo; _flo.flt = (val);                  \
+                                                               \
+    X##_f0 = _flo.bits.frac;                                   \
+    X##_f1 = 0;                                                        \
+    X##_e = _flo.bits.exp;                                     \
+    X##_s = _flo.bits.sign;                                    \
+  } while (0)
+
+#define FP_UNPACK_RAW_EP(X, val)                               \
+  do {                                                         \
+    union _FP_UNION_E *_flo =                                  \
+      (union _FP_UNION_E *)(val);                              \
+                                                               \
+    X##_f0 = _flo->bits.frac;                                  \
+    X##_f1 = 0;                                                        \
+    X##_e = _flo->bits.exp;                                    \
+    X##_s = _flo->bits.sign;                                   \
+  } while (0)
+
+#define FP_PACK_RAW_E(val, X)                                  \
+  do {                                                         \
+    union _FP_UNION_E _flo;                                    \
+                                                               \
+    if (X##_e) X##_f0 |= _FP_IMPLBIT_E;                                \
+    else X##_f0 &= ~(_FP_IMPLBIT_E);                           \
+    _flo.bits.frac = X##_f0;                                   \
+    _flo.bits.exp  = X##_e;                                    \
+    _flo.bits.sign = X##_s;                                    \
+                                                               \
+    (val) = _flo.flt;                                          \
+  } while (0)
+
+#define FP_PACK_RAW_EP(fs, val, X)                             \
+  do {                                                         \
+    if (!FP_INHIBIT_RESULTS)                                   \
+      {                                                                \
+       union _FP_UNION_E *_flo =                               \
+         (union _FP_UNION_E *)(val);                           \
+                                                               \
+       if (X##_e) X##_f0 |= _FP_IMPLBIT_E;                     \
+       else X##_f0 &= ~(_FP_IMPLBIT_E);                        \
+       _flo->bits.frac = X##_f0;                               \
+       _flo->bits.exp  = X##_e;                                \
+       _flo->bits.sign = X##_s;                                \
+      }                                                                \
+  } while (0)
+
+
+#define FP_UNPACK_E(X,val)             \
+  do {                                 \
+    FP_UNPACK_RAW_E(X,val);            \
+    _FP_UNPACK_CANONICAL(E,2,X);       \
+  } while (0)
+
+#define FP_UNPACK_EP(X,val)            \
+  do {                                 \
+    FP_UNPACK_RAW_EP(X,val);           \
+    _FP_UNPACK_CANONICAL(E,2,X);       \
+  } while (0)
+
+#define FP_UNPACK_SEMIRAW_E(X,val)     \
+  do {                                 \
+    FP_UNPACK_RAW_E(X,val);            \
+    _FP_UNPACK_SEMIRAW(E,2,X);         \
+  } while (0)
+
+#define FP_UNPACK_SEMIRAW_EP(X,val)    \
+  do {                                 \
+    FP_UNPACK_RAW_EP(X,val);           \
+    _FP_UNPACK_SEMIRAW(E,2,X);         \
+  } while (0)
+
+#define FP_PACK_E(val,X)               \
+  do {                                 \
+    _FP_PACK_CANONICAL(E,2,X);         \
+    FP_PACK_RAW_E(val,X);              \
+  } while (0)
+
+#define FP_PACK_EP(val,X)              \
+  do {                                 \
+    _FP_PACK_CANONICAL(E,2,X);         \
+    FP_PACK_RAW_EP(val,X);             \
+  } while (0)
+
+#define FP_PACK_SEMIRAW_E(val,X)       \
+  do {                                 \
+    _FP_PACK_SEMIRAW(E,2,X);           \
+    FP_PACK_RAW_E(val,X);              \
+  } while (0)
+
+#define FP_PACK_SEMIRAW_EP(val,X)      \
+  do {                                 \
+    _FP_PACK_SEMIRAW(E,2,X);           \
+    FP_PACK_RAW_EP(val,X);             \
+  } while (0)
+
+#define FP_ISSIGNAN_E(X)       _FP_ISSIGNAN(E,2,X)
+#define FP_NEG_E(R,X)          _FP_NEG(E,2,R,X)
+#define FP_ADD_E(R,X,Y)                _FP_ADD(E,2,R,X,Y)
+#define FP_SUB_E(R,X,Y)                _FP_SUB(E,2,R,X,Y)
+#define FP_MUL_E(R,X,Y)                _FP_MUL(E,2,R,X,Y)
+#define FP_DIV_E(R,X,Y)                _FP_DIV(E,2,R,X,Y)
+#define FP_SQRT_E(R,X)         _FP_SQRT(E,2,R,X)
+
+/*
+ * Square root algorithms:
+ * We have just one right now, maybe Newton approximation
+ * should be added for those machines where division is fast.
+ * We optimize it by doing most of the calculations
+ * in one UWtype registers instead of two, although we don't
+ * have to.
+ */
+#define _FP_SQRT_MEAT_E(R, S, T, X, q)                 \
+  do {                                                 \
+    q = (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE - 1);                \
+    _FP_FRAC_SRL_2(X, (_FP_WORKBITS));                 \
+    while (q)                                          \
+      {                                                        \
+        T##_f0 = S##_f0 + q;                           \
+        if (T##_f0 <= X##_f0)                          \
+          {                                            \
+            S##_f0 = T##_f0 + q;                       \
+            X##_f0 -= T##_f0;                          \
+            R##_f0 += q;                               \
+          }                                            \
+        _FP_FRAC_SLL_1(X, 1);                          \
+        q >>= 1;                                       \
+      }                                                        \
+    _FP_FRAC_SLL_2(R, (_FP_WORKBITS));                 \
+    if (X##_f0)                                                \
+      {                                                        \
+       if (S##_f0 < X##_f0)                            \
+         R##_f0 |= _FP_WORK_ROUND;                     \
+       R##_f0 |= _FP_WORK_STICKY;                      \
+      }                                                        \
+  } while (0)
+#define FP_CMP_E(r,X,Y,un)     _FP_CMP(E,2,r,X,Y,un)
+#define FP_CMP_EQ_E(r,X,Y)     _FP_CMP_EQ(E,2,r,X,Y)
+#define FP_CMP_UNORD_E(r,X,Y)  _FP_CMP_UNORD(E,2,r,X,Y)
+
+#define FP_TO_INT_E(r,X,rsz,rsg)       _FP_TO_INT(E,2,r,X,rsz,rsg)
+#define FP_FROM_INT_E(X,r,rs,rt)       _FP_FROM_INT(E,2,X,r,rs,rt)
+
+#define _FP_FRAC_HIGH_E(X)     (X##_f1)
+#define _FP_FRAC_HIGH_RAW_E(X) (X##_f0)
+
+#endif /* not _FP_W_TYPE_SIZE < 64 */
diff --git a/libgcc/soft-fp/extendsfdf2.c b/libgcc/soft-fp/extendsfdf2.c
new file mode 100644 (file)
index 0000000..fba22d5
--- /dev/null
@@ -0,0 +1,54 @@
+/* Software floating-point emulation.
+   Return a converted to IEEE double
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "single.h"
+#include "double.h"
+
+DFtype __extendsfdf2(SFtype a)
+{
+  FP_DECL_EX;
+  FP_DECL_S(A);
+  FP_DECL_D(R);
+  DFtype r;
+
+  FP_INIT_ROUNDMODE;
+  FP_UNPACK_RAW_S(A, a);
+#if _FP_W_TYPE_SIZE < _FP_FRACBITS_D
+  FP_EXTEND(D,S,2,1,R,A);
+#else
+  FP_EXTEND(D,S,1,1,R,A);
+#endif
+  FP_PACK_RAW_D(r, R);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
diff --git a/libgcc/soft-fp/extendsftf2.c b/libgcc/soft-fp/extendsftf2.c
new file mode 100644 (file)
index 0000000..c43cf1e
--- /dev/null
@@ -0,0 +1,54 @@
+/* Software floating-point emulation.
+   Return a converted to IEEE quad
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "single.h"
+#include "quad.h"
+
+TFtype __extendsftf2(SFtype a)
+{
+  FP_DECL_EX;
+  FP_DECL_S(A);
+  FP_DECL_Q(R);
+  TFtype r;
+
+  FP_INIT_ROUNDMODE;
+  FP_UNPACK_RAW_S(A, a);
+#if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
+  FP_EXTEND(Q,S,4,1,R,A);
+#else
+  FP_EXTEND(Q,S,2,1,R,A);
+#endif
+  FP_PACK_RAW_Q(r, R);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
diff --git a/libgcc/soft-fp/extendxftf2.c b/libgcc/soft-fp/extendxftf2.c
new file mode 100644 (file)
index 0000000..af29a2a
--- /dev/null
@@ -0,0 +1,53 @@
+/* Software floating-point emulation.
+   Return a converted to IEEE quad
+   Copyright (C) 2007 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Uros Bizjak (ubizjak@gmail.com).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "extended.h"
+#include "quad.h"
+
+TFtype __extendxftf2(XFtype a)
+{
+  FP_DECL_EX;
+  FP_DECL_E(A);
+  FP_DECL_Q(R);
+  TFtype r;
+
+  FP_INIT_ROUNDMODE;
+  FP_UNPACK_RAW_E(A, a);
+#if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
+  FP_EXTEND(Q,E,4,4,R,A);
+#else
+  FP_EXTEND(Q,E,2,2,R,A);
+#endif
+  FP_PACK_RAW_Q(r, R);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
diff --git a/libgcc/soft-fp/fixdfdi.c b/libgcc/soft-fp/fixdfdi.c
new file mode 100644 (file)
index 0000000..fdfe35a
--- /dev/null
@@ -0,0 +1,46 @@
+/* Software floating-point emulation.
+   Convert a to 64bit signed integer
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "double.h"
+
+DItype __fixdfdi(DFtype a)
+{
+  FP_DECL_EX;
+  FP_DECL_D(A);
+  UDItype r;
+
+  FP_UNPACK_RAW_D(A, a);
+  FP_TO_INT_D(r, A, DI_BITS, 1);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
diff --git a/libgcc/soft-fp/fixdfsi.c b/libgcc/soft-fp/fixdfsi.c
new file mode 100644 (file)
index 0000000..a05f3e3
--- /dev/null
@@ -0,0 +1,46 @@
+/* Software floating-point emulation.
+   Convert a to 32bit signed integer
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "double.h"
+
+SItype __fixdfsi(DFtype a)
+{
+  FP_DECL_EX;
+  FP_DECL_D(A);
+  USItype r;
+
+  FP_UNPACK_RAW_D(A, a);
+  FP_TO_INT_D(r, A, SI_BITS, 1);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
diff --git a/libgcc/soft-fp/fixdfti.c b/libgcc/soft-fp/fixdfti.c
new file mode 100644 (file)
index 0000000..4731657
--- /dev/null
@@ -0,0 +1,45 @@
+/* Software floating-point emulation.
+   Convert IEEE double to 128bit signed integer
+   Copyright (C) 2007, 2008 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Uros Bizjak (ubizjak@gmail.com).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "double.h"
+
+TItype __fixdfti(DFtype a)
+{
+  FP_DECL_EX;
+  FP_DECL_D(A);
+  UTItype r;
+
+  FP_UNPACK_RAW_D(A, a);
+  FP_TO_INT_D(r, A, TI_BITS, 1);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
diff --git a/libgcc/soft-fp/fixsfdi.c b/libgcc/soft-fp/fixsfdi.c
new file mode 100644 (file)
index 0000000..384d9bd
--- /dev/null
@@ -0,0 +1,46 @@
+/* Software floating-point emulation.
+   Convert a to 64bit signed integer
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "single.h"
+
+DItype __fixsfdi(SFtype a)
+{
+  FP_DECL_EX;
+  FP_DECL_S(A);
+  UDItype r;
+
+  FP_UNPACK_RAW_S(A, a);
+  FP_TO_INT_S(r, A, DI_BITS, 1);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
diff --git a/libgcc/soft-fp/fixsfsi.c b/libgcc/soft-fp/fixsfsi.c
new file mode 100644 (file)
index 0000000..1d40ed0
--- /dev/null
@@ -0,0 +1,46 @@
+/* Software floating-point emulation.
+   Convert a to 32bit signed integer
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "single.h"
+
+SItype __fixsfsi(SFtype a)
+{
+  FP_DECL_EX;
+  FP_DECL_S(A);
+  USItype r;
+
+  FP_UNPACK_RAW_S(A, a);
+  FP_TO_INT_S(r, A, SI_BITS, 1);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
diff --git a/libgcc/soft-fp/fixsfti.c b/libgcc/soft-fp/fixsfti.c
new file mode 100644 (file)
index 0000000..779628e
--- /dev/null
@@ -0,0 +1,45 @@
+/* Software floating-point emulation.
+   Convert IEEE single to 128bit signed integer
+   Copyright (C) 2007 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Uros Bizjak (ubizjak@gmail.com).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "single.h"
+
+TItype __fixsfti(SFtype a)
+{
+  FP_DECL_EX;
+  FP_DECL_S(A);
+  UTItype r;
+
+  FP_UNPACK_RAW_S(A, a);
+  FP_TO_INT_S(r, A, TI_BITS, 1);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
diff --git a/libgcc/soft-fp/fixtfdi.c b/libgcc/soft-fp/fixtfdi.c
new file mode 100644 (file)
index 0000000..ea10ce2
--- /dev/null
@@ -0,0 +1,46 @@
+/* Software floating-point emulation.
+   Convert a to 64bit signed integer
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "quad.h"
+
+DItype __fixtfdi(TFtype a)
+{
+  FP_DECL_EX;
+  FP_DECL_Q(A);
+  UDItype r;
+
+  FP_UNPACK_RAW_Q(A, a);
+  FP_TO_INT_Q(r, A, DI_BITS, 1);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
diff --git a/libgcc/soft-fp/fixtfsi.c b/libgcc/soft-fp/fixtfsi.c
new file mode 100644 (file)
index 0000000..eb71038
--- /dev/null
@@ -0,0 +1,46 @@
+/* Software floating-point emulation.
+   Convert a to 32bit signed integer
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "quad.h"
+
+SItype __fixtfsi(TFtype a)
+{
+  FP_DECL_EX;
+  FP_DECL_Q(A);
+  USItype r;
+
+  FP_UNPACK_RAW_Q(A, a);
+  FP_TO_INT_Q(r, A, SI_BITS, 1);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
diff --git a/libgcc/soft-fp/fixtfti.c b/libgcc/soft-fp/fixtfti.c
new file mode 100644 (file)
index 0000000..8311ea5
--- /dev/null
@@ -0,0 +1,45 @@
+/* Software floating-point emulation.
+   Convert IEEE quad to 128bit signed integer
+   Copyright (C) 2007 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Uros Bizjak (ubizjak@gmail.com).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "quad.h"
+
+TItype __fixtfti(TFtype a)
+{
+  FP_DECL_EX;
+  FP_DECL_Q(A);
+  UTItype r;
+
+  FP_UNPACK_RAW_Q(A, a);
+  FP_TO_INT_Q(r, A, TI_BITS, 1);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
diff --git a/libgcc/soft-fp/fixunsdfdi.c b/libgcc/soft-fp/fixunsdfdi.c
new file mode 100644 (file)
index 0000000..d85198f
--- /dev/null
@@ -0,0 +1,46 @@
+/* Software floating-point emulation.
+   Convert a to 64bit unsigned integer
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "double.h"
+
+UDItype __fixunsdfdi(DFtype a)
+{
+  FP_DECL_EX;
+  FP_DECL_D(A);
+  UDItype r;
+
+  FP_UNPACK_RAW_D(A, a);
+  FP_TO_INT_D(r, A, DI_BITS, 0);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
diff --git a/libgcc/soft-fp/fixunsdfsi.c b/libgcc/soft-fp/fixunsdfsi.c
new file mode 100644 (file)
index 0000000..492ffde
--- /dev/null
@@ -0,0 +1,46 @@
+/* Software floating-point emulation.
+   Convert a to 32bit unsigned integer
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "double.h"
+
+USItype __fixunsdfsi(DFtype a)
+{
+  FP_DECL_EX;
+  FP_DECL_D(A);
+  USItype r;
+
+  FP_UNPACK_RAW_D(A, a);
+  FP_TO_INT_D(r, A, SI_BITS, 0);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
diff --git a/libgcc/soft-fp/fixunsdfti.c b/libgcc/soft-fp/fixunsdfti.c
new file mode 100644 (file)
index 0000000..48c41d4
--- /dev/null
@@ -0,0 +1,45 @@
+/* Software floating-point emulation.
+   Convert IEEE double to 128bit unsigned integer
+   Copyright (C) 2007 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Uros Bizjak (ubizjak@gmail.com).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "double.h"
+
+UTItype __fixunsdfti(DFtype a)
+{
+  FP_DECL_EX;
+  FP_DECL_D(A);
+  UTItype r;
+
+  FP_UNPACK_RAW_D(A, a);
+  FP_TO_INT_D(r, A, TI_BITS, 0);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
diff --git a/libgcc/soft-fp/fixunssfdi.c b/libgcc/soft-fp/fixunssfdi.c
new file mode 100644 (file)
index 0000000..5484153
--- /dev/null
@@ -0,0 +1,46 @@
+/* Software floating-point emulation.
+   Convert a to 64bit unsigned integer
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "single.h"
+
+UDItype __fixunssfdi(SFtype a)
+{
+  FP_DECL_EX;
+  FP_DECL_S(A);
+  UDItype r;
+
+  FP_UNPACK_RAW_S(A, a);
+  FP_TO_INT_S(r, A, DI_BITS, 0);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
diff --git a/libgcc/soft-fp/fixunssfsi.c b/libgcc/soft-fp/fixunssfsi.c
new file mode 100644 (file)
index 0000000..ac9d4b9
--- /dev/null
@@ -0,0 +1,46 @@
+/* Software floating-point emulation.
+   Convert a to 32bit unsigned integer
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "single.h"
+
+USItype __fixunssfsi(SFtype a)
+{
+  FP_DECL_EX;
+  FP_DECL_S(A);
+  USItype r;
+
+  FP_UNPACK_RAW_S(A, a);
+  FP_TO_INT_S(r, A, SI_BITS, 0);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
diff --git a/libgcc/soft-fp/fixunssfti.c b/libgcc/soft-fp/fixunssfti.c
new file mode 100644 (file)
index 0000000..89bcedb
--- /dev/null
@@ -0,0 +1,45 @@
+/* Software floating-point emulation.
+   Convert IEEE single to 128bit unsigned integer
+   Copyright (C) 2007 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Uros Bizjak (ubizjak@gmail.com).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "single.h"
+
+UTItype __fixunssfti(SFtype a)
+{
+  FP_DECL_EX;
+  FP_DECL_S(A);
+  UTItype r;
+
+  FP_UNPACK_RAW_S(A, a);
+  FP_TO_INT_S(r, A, TI_BITS, 0);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
diff --git a/libgcc/soft-fp/fixunstfdi.c b/libgcc/soft-fp/fixunstfdi.c
new file mode 100644 (file)
index 0000000..86f1fc8
--- /dev/null
@@ -0,0 +1,46 @@
+/* Software floating-point emulation.
+   Convert a to 64bit unsigned integer
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "quad.h"
+
+UDItype __fixunstfdi(TFtype a)
+{
+  FP_DECL_EX;
+  FP_DECL_Q(A);
+  UDItype r;
+
+  FP_UNPACK_RAW_Q(A, a);
+  FP_TO_INT_Q(r, A, DI_BITS, 0);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
diff --git a/libgcc/soft-fp/fixunstfsi.c b/libgcc/soft-fp/fixunstfsi.c
new file mode 100644 (file)
index 0000000..e0335da
--- /dev/null
@@ -0,0 +1,46 @@
+/* Software floating-point emulation.
+   Convert a to 32bit unsigned integer
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "quad.h"
+
+USItype __fixunstfsi(TFtype a)
+{
+  FP_DECL_EX;
+  FP_DECL_Q(A);
+  USItype r;
+
+  FP_UNPACK_RAW_Q(A, a);
+  FP_TO_INT_Q(r, A, SI_BITS, 0);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
diff --git a/libgcc/soft-fp/fixunstfti.c b/libgcc/soft-fp/fixunstfti.c
new file mode 100644 (file)
index 0000000..f62bd50
--- /dev/null
@@ -0,0 +1,45 @@
+/* Software floating-point emulation.
+   Convert IEEE quad to 128bit unsigned integer
+   Copyright (C) 2007 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Uros Bizjak (ubizjak@gmail.com).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "quad.h"
+
+UTItype __fixunstfti(TFtype a)
+{
+  FP_DECL_EX;
+  FP_DECL_Q(A);
+  UTItype r;
+
+  FP_UNPACK_RAW_Q(A, a);
+  FP_TO_INT_Q(r, A, TI_BITS, 0);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
diff --git a/libgcc/soft-fp/floatdidf.c b/libgcc/soft-fp/floatdidf.c
new file mode 100644 (file)
index 0000000..21e9fb1
--- /dev/null
@@ -0,0 +1,46 @@
+/* Software floating-point emulation.
+   Convert a 64bit signed integer to IEEE double
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "double.h"
+
+DFtype __floatdidf(DItype i)
+{
+  FP_DECL_EX;
+  FP_DECL_D(A);
+  DFtype a;
+
+  FP_FROM_INT_D(A, i, DI_BITS, UDItype);
+  FP_PACK_RAW_D(a, A);
+  FP_HANDLE_EXCEPTIONS;
+
+  return a;
+}
diff --git a/libgcc/soft-fp/floatdisf.c b/libgcc/soft-fp/floatdisf.c
new file mode 100644 (file)
index 0000000..ee57915
--- /dev/null
@@ -0,0 +1,46 @@
+/* Software floating-point emulation.
+   Convert a 64bit signed integer to IEEE single
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "single.h"
+
+SFtype __floatdisf(DItype i)
+{
+  FP_DECL_EX;
+  FP_DECL_S(A);
+  SFtype a;
+
+  FP_FROM_INT_S(A, i, DI_BITS, UDItype);
+  FP_PACK_RAW_S(a, A);
+  FP_HANDLE_EXCEPTIONS;
+
+  return a;
+}
diff --git a/libgcc/soft-fp/floatditf.c b/libgcc/soft-fp/floatditf.c
new file mode 100644 (file)
index 0000000..564800b
--- /dev/null
@@ -0,0 +1,46 @@
+/* Software floating-point emulation.
+   Convert a 64bit signed integer to IEEE quad
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "quad.h"
+
+TFtype __floatditf(DItype i)
+{
+  FP_DECL_EX;
+  FP_DECL_Q(A);
+  TFtype a;
+
+  FP_FROM_INT_Q(A, i, DI_BITS, UDItype);
+  FP_PACK_RAW_Q(a, A);
+  FP_HANDLE_EXCEPTIONS;
+
+  return a;
+}
diff --git a/libgcc/soft-fp/floatsidf.c b/libgcc/soft-fp/floatsidf.c
new file mode 100644 (file)
index 0000000..b6d5f8d
--- /dev/null
@@ -0,0 +1,46 @@
+/* Software floating-point emulation.
+   Convert a 32bit signed integer to IEEE double
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "double.h"
+
+DFtype __floatsidf(SItype i)
+{
+  FP_DECL_EX;
+  FP_DECL_D(A);
+  DFtype a;
+
+  FP_FROM_INT_D(A, i, SI_BITS, USItype);
+  FP_PACK_RAW_D(a, A);
+  FP_HANDLE_EXCEPTIONS;
+
+  return a;
+}
diff --git a/libgcc/soft-fp/floatsisf.c b/libgcc/soft-fp/floatsisf.c
new file mode 100644 (file)
index 0000000..76217fe
--- /dev/null
@@ -0,0 +1,46 @@
+/* Software floating-point emulation.
+   Convert a 32bit signed integer to IEEE single
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "single.h"
+
+SFtype __floatsisf(SItype i)
+{
+  FP_DECL_EX;
+  FP_DECL_S(A);
+  SFtype a;
+
+  FP_FROM_INT_S(A, i, SI_BITS, USItype);
+  FP_PACK_RAW_S(a, A);
+  FP_HANDLE_EXCEPTIONS;
+
+  return a;
+}
diff --git a/libgcc/soft-fp/floatsitf.c b/libgcc/soft-fp/floatsitf.c
new file mode 100644 (file)
index 0000000..8c3d9cc
--- /dev/null
@@ -0,0 +1,46 @@
+/* Software floating-point emulation.
+   Convert a 32bit signed integer to IEEE quad
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "quad.h"
+
+TFtype __floatsitf(SItype i)
+{
+  FP_DECL_EX;
+  FP_DECL_Q(A);
+  TFtype a;
+
+  FP_FROM_INT_Q(A, i, SI_BITS, USItype);
+  FP_PACK_RAW_Q(a, A);
+  FP_HANDLE_EXCEPTIONS;
+
+  return a;
+}
diff --git a/libgcc/soft-fp/floattidf.c b/libgcc/soft-fp/floattidf.c
new file mode 100644 (file)
index 0000000..14b6ea3
--- /dev/null
@@ -0,0 +1,45 @@
+/* Software floating-point emulation.
+   Convert a 128bit signed integer to IEEE double
+   Copyright (C) 2007 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Uros Bizjak (ubizjak@gmail.com).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "double.h"
+
+DFtype __floattidf(TItype i)
+{
+  FP_DECL_EX;
+  FP_DECL_D(A);
+  DFtype a;
+
+  FP_FROM_INT_D(A, i, TI_BITS, UTItype);
+  FP_PACK_RAW_D(a, A);
+  FP_HANDLE_EXCEPTIONS;
+
+  return a;
+}
diff --git a/libgcc/soft-fp/floattisf.c b/libgcc/soft-fp/floattisf.c
new file mode 100644 (file)
index 0000000..475cafa
--- /dev/null
@@ -0,0 +1,45 @@
+/* Software floating-point emulation.
+   Convert a 128bit signed integer to IEEE single
+   Copyright (C) 2007 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Uros Bizjak (ubizjak@gmail.com).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "single.h"
+
+SFtype __floattisf(TItype i)
+{
+  FP_DECL_EX;
+  FP_DECL_S(A);
+  SFtype a;
+
+  FP_FROM_INT_S(A, i, TI_BITS, UTItype);
+  FP_PACK_RAW_S(a, A);
+  FP_HANDLE_EXCEPTIONS;
+
+  return a;
+}
diff --git a/libgcc/soft-fp/floattitf.c b/libgcc/soft-fp/floattitf.c
new file mode 100644 (file)
index 0000000..12bbb27
--- /dev/null
@@ -0,0 +1,45 @@
+/* Software floating-point emulation.
+   Convert a 128bit signed integer to IEEE quad
+   Copyright (C) 2007 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Uros Bizjak (ubizjak@gmail.com).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "quad.h"
+
+TFtype __floattitf(TItype i)
+{
+  FP_DECL_EX;
+  FP_DECL_Q(A);
+  TFtype a;
+
+  FP_FROM_INT_Q(A, i, TI_BITS, UTItype);
+  FP_PACK_RAW_Q(a, A);
+  FP_HANDLE_EXCEPTIONS;
+
+  return a;
+}
diff --git a/libgcc/soft-fp/floatundidf.c b/libgcc/soft-fp/floatundidf.c
new file mode 100644 (file)
index 0000000..af8e4a5
--- /dev/null
@@ -0,0 +1,46 @@
+/* Software floating-point emulation.
+   Convert a 64bit unsigned integer to IEEE double
+   Copyright (C) 1997, 1999, 2006, 2007 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "double.h"
+
+DFtype __floatundidf(UDItype i)
+{
+  FP_DECL_EX;
+  FP_DECL_D(A);
+  DFtype a;
+
+  FP_FROM_INT_D(A, i, DI_BITS, UDItype);
+  FP_PACK_RAW_D(a, A);
+  FP_HANDLE_EXCEPTIONS;
+
+  return a;
+}
diff --git a/libgcc/soft-fp/floatundisf.c b/libgcc/soft-fp/floatundisf.c
new file mode 100644 (file)
index 0000000..977f7df
--- /dev/null
@@ -0,0 +1,46 @@
+/* Software floating-point emulation.
+   Convert a 64bit unsigned integer to IEEE single
+   Copyright (C) 1997, 1999, 2006, 2007 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "single.h"
+
+SFtype __floatundisf(UDItype i)
+{
+  FP_DECL_EX;
+  FP_DECL_S(A);
+  SFtype a;
+
+  FP_FROM_INT_S(A, i, DI_BITS, UDItype);
+  FP_PACK_RAW_S(a, A);
+  FP_HANDLE_EXCEPTIONS;
+
+  return a;
+}
diff --git a/libgcc/soft-fp/floatunditf.c b/libgcc/soft-fp/floatunditf.c
new file mode 100644 (file)
index 0000000..ab357f0
--- /dev/null
@@ -0,0 +1,47 @@
+/* Software floating-point emulation.
+   Convert a 64bit unsigned integer to IEEE quad
+   Copyright (C) 1997,1999, 2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "quad.h"
+
+TFtype
+__floatunditf(UDItype i)
+{
+  FP_DECL_EX;
+  FP_DECL_Q(A);
+  TFtype a;
+
+  FP_FROM_INT_Q(A, i, DI_BITS, UDItype);
+  FP_PACK_RAW_Q(a, A);
+  FP_HANDLE_EXCEPTIONS;
+
+  return a;
+}
diff --git a/libgcc/soft-fp/floatunsidf.c b/libgcc/soft-fp/floatunsidf.c
new file mode 100644 (file)
index 0000000..12d0f25
--- /dev/null
@@ -0,0 +1,46 @@
+/* Software floating-point emulation.
+   Convert a 32bit unsigned integer to IEEE double
+   Copyright (C) 1997, 1999, 2006, 2007 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "double.h"
+
+DFtype __floatunsidf(USItype i)
+{
+  FP_DECL_EX;
+  FP_DECL_D(A);
+  DFtype a;
+
+  FP_FROM_INT_D(A, i, SI_BITS, USItype);
+  FP_PACK_RAW_D(a, A);
+  FP_HANDLE_EXCEPTIONS;
+
+  return a;
+}
diff --git a/libgcc/soft-fp/floatunsisf.c b/libgcc/soft-fp/floatunsisf.c
new file mode 100644 (file)
index 0000000..80c5d3d
--- /dev/null
@@ -0,0 +1,46 @@
+/* Software floating-point emulation.
+   Convert a 32bit unsigned integer to IEEE single
+   Copyright (C) 1997, 1999, 2006, 2007 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "single.h"
+
+SFtype __floatunsisf(USItype i)
+{
+  FP_DECL_EX;
+  FP_DECL_S(A);
+  SFtype a;
+
+  FP_FROM_INT_S(A, i, SI_BITS, USItype);
+  FP_PACK_RAW_S(a, A);
+  FP_HANDLE_EXCEPTIONS;
+
+  return a;
+}
diff --git a/libgcc/soft-fp/floatunsitf.c b/libgcc/soft-fp/floatunsitf.c
new file mode 100644 (file)
index 0000000..c993716
--- /dev/null
@@ -0,0 +1,47 @@
+/* Software floating-point emulation.
+   Convert a 32bit unsigned integer to IEEE quad
+   Copyright (C) 1997,1999, 2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "quad.h"
+
+TFtype
+__floatunsitf(USItype i)
+{
+  FP_DECL_EX;
+  FP_DECL_Q(A);
+  TFtype a;
+
+  FP_FROM_INT_Q(A, i, SI_BITS, USItype);
+  FP_PACK_RAW_Q(a, A);
+  FP_HANDLE_EXCEPTIONS;
+
+  return a;
+}
diff --git a/libgcc/soft-fp/floatuntidf.c b/libgcc/soft-fp/floatuntidf.c
new file mode 100644 (file)
index 0000000..db1fe1a
--- /dev/null
@@ -0,0 +1,45 @@
+/* Software floating-point emulation.
+   Convert a 128bit unsigned integer to IEEE double
+   Copyright (C) 1997,1999, 2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Uros Bizjak (ubizjak@gmail.com).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "double.h"
+
+DFtype __floatuntidf(UTItype i)
+{
+  FP_DECL_EX;
+  FP_DECL_D(A);
+  DFtype a;
+
+  FP_FROM_INT_D(A, i, TI_BITS, UTItype);
+  FP_PACK_RAW_D(a, A);
+  FP_HANDLE_EXCEPTIONS;
+
+  return a;
+}
diff --git a/libgcc/soft-fp/floatuntisf.c b/libgcc/soft-fp/floatuntisf.c
new file mode 100644 (file)
index 0000000..7391487
--- /dev/null
@@ -0,0 +1,45 @@
+/* Software floating-point emulation.
+   Convert a 128bit unsigned integer to IEEE single
+   Copyright (C) 2007, 2008 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Uros Bizjak (ubizjak@gmail.com).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "single.h"
+
+SFtype __floatuntisf(UTItype i)
+{
+  FP_DECL_EX;
+  FP_DECL_S(A);
+  SFtype a;
+
+  FP_FROM_INT_S(A, i, TI_BITS, UTItype);
+  FP_PACK_RAW_S(a, A);
+  FP_HANDLE_EXCEPTIONS;
+
+  return a;
+}
diff --git a/libgcc/soft-fp/floatuntitf.c b/libgcc/soft-fp/floatuntitf.c
new file mode 100644 (file)
index 0000000..8d66901
--- /dev/null
@@ -0,0 +1,45 @@
+/* Software floating-point emulation.
+   Convert a 128bit unsigned integer to IEEE quad
+   Copyright (C) 2007 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Uros Bizjak (ubizjak@gmail.com).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "quad.h"
+
+TFtype __floatuntitf(UTItype i)
+{
+  FP_DECL_EX;
+  FP_DECL_Q(A);
+  TFtype a;
+
+  FP_FROM_INT_Q(A, i, TI_BITS, UTItype);
+  FP_PACK_RAW_Q(a, A);
+  FP_HANDLE_EXCEPTIONS;
+
+  return a;
+}
diff --git a/libgcc/soft-fp/gedf2.c b/libgcc/soft-fp/gedf2.c
new file mode 100644 (file)
index 0000000..17a0453
--- /dev/null
@@ -0,0 +1,51 @@
+/* Software floating-point emulation.
+   Return 0 iff a == b, 1 iff a > b, -2 iff a ? b, -1 iff a < b
+   Copyright (C) 1997,1999,2006,2007 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "double.h"
+
+CMPtype __gedf2(DFtype a, DFtype b)
+{
+  FP_DECL_EX;
+  FP_DECL_D(A); FP_DECL_D(B);
+  CMPtype r;
+
+  FP_UNPACK_RAW_D(A, a);
+  FP_UNPACK_RAW_D(B, b);
+  FP_CMP_D(r, A, B, -2);
+  if (r == -2 && (FP_ISSIGNAN_D(A) || FP_ISSIGNAN_D(B)))
+    FP_SET_EXCEPTION(FP_EX_INVALID);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
+
+strong_alias(__gedf2, __gtdf2);
diff --git a/libgcc/soft-fp/gesf2.c b/libgcc/soft-fp/gesf2.c
new file mode 100644 (file)
index 0000000..609a61f
--- /dev/null
@@ -0,0 +1,51 @@
+/* Software floating-point emulation.
+   Return 0 iff a == b, 1 iff a > b, -2 iff a ? b, -1 iff a < b
+   Copyright (C) 1997,1999,2006,2007 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "single.h"
+
+CMPtype __gesf2(SFtype a, SFtype b)
+{
+  FP_DECL_EX;
+  FP_DECL_S(A); FP_DECL_S(B);
+  CMPtype r;
+
+  FP_UNPACK_RAW_S(A, a);
+  FP_UNPACK_RAW_S(B, b);
+  FP_CMP_S(r, A, B, -2);
+  if (r == -2 && (FP_ISSIGNAN_S(A) || FP_ISSIGNAN_S(B)))
+    FP_SET_EXCEPTION(FP_EX_INVALID);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
+
+strong_alias(__gesf2, __gtsf2);
diff --git a/libgcc/soft-fp/getf2.c b/libgcc/soft-fp/getf2.c
new file mode 100644 (file)
index 0000000..eb52d05
--- /dev/null
@@ -0,0 +1,51 @@
+/* Software floating-point emulation.
+   Return 0 iff a == b, 1 iff a > b, -2 iff a ? b, -1 iff a < b
+   Copyright (C) 1997,1999,2006,2007 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "quad.h"
+
+CMPtype __getf2(TFtype a, TFtype b)
+{
+  FP_DECL_EX;
+  FP_DECL_Q(A); FP_DECL_Q(B);
+  CMPtype r;
+
+  FP_UNPACK_RAW_Q(A, a);
+  FP_UNPACK_RAW_Q(B, b);
+  FP_CMP_Q(r, A, B, -2);
+  if (r == -2 && (FP_ISSIGNAN_Q(A) || FP_ISSIGNAN_Q(B)))
+    FP_SET_EXCEPTION(FP_EX_INVALID);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
+
+strong_alias(__getf2, __gttf2);
diff --git a/libgcc/soft-fp/ledf2.c b/libgcc/soft-fp/ledf2.c
new file mode 100644 (file)
index 0000000..b8ba440
--- /dev/null
@@ -0,0 +1,51 @@
+/* Software floating-point emulation.
+   Return 0 iff a == b, 1 iff a > b, 2 iff a ? b, -1 iff a < b
+   Copyright (C) 1997,1999,2006,2007 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "double.h"
+
+CMPtype __ledf2(DFtype a, DFtype b)
+{
+  FP_DECL_EX;
+  FP_DECL_D(A); FP_DECL_D(B);
+  CMPtype r;
+
+  FP_UNPACK_RAW_D(A, a);
+  FP_UNPACK_RAW_D(B, b);
+  FP_CMP_D(r, A, B, 2);
+  if (r == 2 && (FP_ISSIGNAN_D(A) || FP_ISSIGNAN_D(B)))
+    FP_SET_EXCEPTION(FP_EX_INVALID);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
+
+strong_alias(__ledf2, __ltdf2);
diff --git a/libgcc/soft-fp/lesf2.c b/libgcc/soft-fp/lesf2.c
new file mode 100644 (file)
index 0000000..cb359c9
--- /dev/null
@@ -0,0 +1,51 @@
+/* Software floating-point emulation.
+   Return 0 iff a == b, 1 iff a > b, 2 iff a ? b, -1 iff a < b
+   Copyright (C) 1997,1999,2006,2007 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "single.h"
+
+CMPtype __lesf2(SFtype a, SFtype b)
+{
+  FP_DECL_EX;
+  FP_DECL_S(A); FP_DECL_S(B);
+  CMPtype r;
+
+  FP_UNPACK_RAW_S(A, a);
+  FP_UNPACK_RAW_S(B, b);
+  FP_CMP_S(r, A, B, 2);
+  if (r == 2 && (FP_ISSIGNAN_S(A) || FP_ISSIGNAN_S(B)))
+    FP_SET_EXCEPTION(FP_EX_INVALID);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
+
+strong_alias(__lesf2, __ltsf2);
diff --git a/libgcc/soft-fp/letf2.c b/libgcc/soft-fp/letf2.c
new file mode 100644 (file)
index 0000000..01fd12b
--- /dev/null
@@ -0,0 +1,51 @@
+/* Software floating-point emulation.
+   Return 0 iff a == b, 1 iff a > b, 2 iff a ? b, -1 iff a < b
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "quad.h"
+
+CMPtype __letf2(TFtype a, TFtype b)
+{
+  FP_DECL_EX;
+  FP_DECL_Q(A); FP_DECL_Q(B);
+  CMPtype r;
+
+  FP_UNPACK_RAW_Q(A, a);
+  FP_UNPACK_RAW_Q(B, b);
+  FP_CMP_Q(r, A, B, 2);
+  if (r == 2 && (FP_ISSIGNAN_Q(A) || FP_ISSIGNAN_Q(B)))
+    FP_SET_EXCEPTION(FP_EX_INVALID);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
+
+strong_alias(__letf2, __lttf2);
diff --git a/libgcc/soft-fp/muldf3.c b/libgcc/soft-fp/muldf3.c
new file mode 100644 (file)
index 0000000..7eb2015
--- /dev/null
@@ -0,0 +1,49 @@
+/* Software floating-point emulation.
+   Return a * b
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "double.h"
+
+DFtype __muldf3(DFtype a, DFtype b)
+{
+  FP_DECL_EX;
+  FP_DECL_D(A); FP_DECL_D(B); FP_DECL_D(R);
+  DFtype r;
+
+  FP_INIT_ROUNDMODE;
+  FP_UNPACK_D(A, a);
+  FP_UNPACK_D(B, b);
+  FP_MUL_D(R, A, B);
+  FP_PACK_D(r, R);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
diff --git a/libgcc/soft-fp/mulsf3.c b/libgcc/soft-fp/mulsf3.c
new file mode 100644 (file)
index 0000000..5df4406
--- /dev/null
@@ -0,0 +1,49 @@
+/* Software floating-point emulation.
+   Return a * b
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "single.h"
+
+SFtype __mulsf3(SFtype a, SFtype b)
+{
+  FP_DECL_EX;
+  FP_DECL_S(A); FP_DECL_S(B); FP_DECL_S(R);
+  SFtype r;
+
+  FP_INIT_ROUNDMODE;
+  FP_UNPACK_S(A, a);
+  FP_UNPACK_S(B, b);
+  FP_MUL_S(R, A, B);
+  FP_PACK_S(r, R);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
diff --git a/libgcc/soft-fp/multf3.c b/libgcc/soft-fp/multf3.c
new file mode 100644 (file)
index 0000000..0abab6d
--- /dev/null
@@ -0,0 +1,49 @@
+/* Software floating-point emulation.
+   Return a * b
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "quad.h"
+
+TFtype __multf3(TFtype a, TFtype b)
+{
+  FP_DECL_EX;
+  FP_DECL_Q(A); FP_DECL_Q(B); FP_DECL_Q(R);
+  TFtype r;
+
+  FP_INIT_ROUNDMODE;
+  FP_UNPACK_Q(A, a);
+  FP_UNPACK_Q(B, b);
+  FP_MUL_Q(R, A, B);
+  FP_PACK_Q(r, R);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
diff --git a/libgcc/soft-fp/negdf2.c b/libgcc/soft-fp/negdf2.c
new file mode 100644 (file)
index 0000000..54869e9
--- /dev/null
@@ -0,0 +1,48 @@
+/* Software floating-point emulation.
+   Return -a
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "double.h"
+
+DFtype __negdf2(DFtype a)
+{
+  FP_DECL_EX;
+  FP_DECL_D(A); FP_DECL_D(R);
+  DFtype r;
+
+  FP_UNPACK_D(A, a);
+  FP_NEG_D(R, A);
+  FP_PACK_D(r, R);
+  FP_CLEAR_EXCEPTIONS;
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
diff --git a/libgcc/soft-fp/negsf2.c b/libgcc/soft-fp/negsf2.c
new file mode 100644 (file)
index 0000000..bf5db7a
--- /dev/null
@@ -0,0 +1,48 @@
+/* Software floating-point emulation.
+   Return -a
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "single.h"
+
+SFtype __negsf2(SFtype a)
+{
+  FP_DECL_EX;
+  FP_DECL_S(A); FP_DECL_S(R);
+  SFtype r;
+
+  FP_UNPACK_S(A, a);
+  FP_NEG_S(R, A);
+  FP_PACK_S(r, R);
+  FP_CLEAR_EXCEPTIONS;
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
diff --git a/libgcc/soft-fp/negtf2.c b/libgcc/soft-fp/negtf2.c
new file mode 100644 (file)
index 0000000..5524c82
--- /dev/null
@@ -0,0 +1,48 @@
+/* Software floating-point emulation.
+   Return -a
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "quad.h"
+
+TFtype __negtf2(TFtype a)
+{
+  FP_DECL_EX;
+  FP_DECL_Q(A); FP_DECL_Q(R);
+  TFtype r;
+
+  FP_UNPACK_Q(A, a);
+  FP_NEG_Q(R, A);
+  FP_PACK_Q(r, R);
+  FP_CLEAR_EXCEPTIONS;
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
diff --git a/libgcc/soft-fp/op-1.h b/libgcc/soft-fp/op-1.h
new file mode 100644 (file)
index 0000000..35cd0ba
--- /dev/null
@@ -0,0 +1,302 @@
+/* Software floating-point emulation.
+   Basic one-word fraction declaration and manipulation.
+   Copyright (C) 1997,1998,1999,2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com),
+                 Jakub Jelinek (jj@ultra.linux.cz),
+                 David S. Miller (davem@redhat.com) and
+                 Peter Maydell (pmaydell@chiark.greenend.org.uk).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#define _FP_FRAC_DECL_1(X)     _FP_W_TYPE X##_f
+#define _FP_FRAC_COPY_1(D,S)   (D##_f = S##_f)
+#define _FP_FRAC_SET_1(X,I)    (X##_f = I)
+#define _FP_FRAC_HIGH_1(X)     (X##_f)
+#define _FP_FRAC_LOW_1(X)      (X##_f)
+#define _FP_FRAC_WORD_1(X,w)   (X##_f)
+
+#define _FP_FRAC_ADDI_1(X,I)   (X##_f += I)
+#define _FP_FRAC_SLL_1(X,N)                    \
+  do {                                         \
+    if (__builtin_constant_p(N) && (N) == 1)   \
+      X##_f += X##_f;                          \
+    else                                       \
+      X##_f <<= (N);                           \
+  } while (0)
+#define _FP_FRAC_SRL_1(X,N)    (X##_f >>= N)
+
+/* Right shift with sticky-lsb.  */
+#define _FP_FRAC_SRST_1(X,S,N,sz)      __FP_FRAC_SRST_1(X##_f, S, N, sz)
+#define _FP_FRAC_SRS_1(X,N,sz) __FP_FRAC_SRS_1(X##_f, N, sz)
+
+#define __FP_FRAC_SRST_1(X,S,N,sz)                     \
+do {                                                   \
+  S = (__builtin_constant_p(N) && (N) == 1             \
+       ? X & 1 : (X << (_FP_W_TYPE_SIZE - (N))) != 0); \
+  X = X >> (N);                                                \
+} while (0)
+
+#define __FP_FRAC_SRS_1(X,N,sz)                                                \
+   (X = (X >> (N) | (__builtin_constant_p(N) && (N) == 1               \
+                    ? X & 1 : (X << (_FP_W_TYPE_SIZE - (N))) != 0)))
+
+#define _FP_FRAC_ADD_1(R,X,Y)  (R##_f = X##_f + Y##_f)
+#define _FP_FRAC_SUB_1(R,X,Y)  (R##_f = X##_f - Y##_f)
+#define _FP_FRAC_DEC_1(X,Y)    (X##_f -= Y##_f)
+#define _FP_FRAC_CLZ_1(z, X)   __FP_CLZ(z, X##_f)
+
+/* Predicates */
+#define _FP_FRAC_NEGP_1(X)     ((_FP_WS_TYPE)X##_f < 0)
+#define _FP_FRAC_ZEROP_1(X)    (X##_f == 0)
+#define _FP_FRAC_OVERP_1(fs,X) (X##_f & _FP_OVERFLOW_##fs)
+#define _FP_FRAC_CLEAR_OVERP_1(fs,X)   (X##_f &= ~_FP_OVERFLOW_##fs)
+#define _FP_FRAC_EQ_1(X, Y)    (X##_f == Y##_f)
+#define _FP_FRAC_GE_1(X, Y)    (X##_f >= Y##_f)
+#define _FP_FRAC_GT_1(X, Y)    (X##_f > Y##_f)
+
+#define _FP_ZEROFRAC_1         0
+#define _FP_MINFRAC_1          1
+#define _FP_MAXFRAC_1          (~(_FP_WS_TYPE)0)
+
+/*
+ * Unpack the raw bits of a native fp value.  Do not classify or
+ * normalize the data.
+ */
+
+#define _FP_UNPACK_RAW_1(fs, X, val)                           \
+  do {                                                         \
+    union _FP_UNION_##fs _flo; _flo.flt = (val);               \
+                                                               \
+    X##_f = _flo.bits.frac;                                    \
+    X##_e = _flo.bits.exp;                                     \
+    X##_s = _flo.bits.sign;                                    \
+  } while (0)
+
+#define _FP_UNPACK_RAW_1_P(fs, X, val)                         \
+  do {                                                         \
+    union _FP_UNION_##fs *_flo =                               \
+      (union _FP_UNION_##fs *)(val);                           \
+                                                               \
+    X##_f = _flo->bits.frac;                                   \
+    X##_e = _flo->bits.exp;                                    \
+    X##_s = _flo->bits.sign;                                   \
+  } while (0)
+
+/*
+ * Repack the raw bits of a native fp value.
+ */
+
+#define _FP_PACK_RAW_1(fs, val, X)                             \
+  do {                                                         \
+    union _FP_UNION_##fs _flo;                                 \
+                                                               \
+    _flo.bits.frac = X##_f;                                    \
+    _flo.bits.exp  = X##_e;                                    \
+    _flo.bits.sign = X##_s;                                    \
+                                                               \
+    (val) = _flo.flt;                                          \
+  } while (0)
+
+#define _FP_PACK_RAW_1_P(fs, val, X)                           \
+  do {                                                         \
+    union _FP_UNION_##fs *_flo =                               \
+      (union _FP_UNION_##fs *)(val);                           \
+                                                               \
+    _flo->bits.frac = X##_f;                                   \
+    _flo->bits.exp  = X##_e;                                   \
+    _flo->bits.sign = X##_s;                                   \
+  } while (0)
+
+
+/*
+ * Multiplication algorithms:
+ */
+
+/* Basic.  Assuming the host word size is >= 2*FRACBITS, we can do the
+   multiplication immediately.  */
+
+#define _FP_MUL_MEAT_1_imm(wfracbits, R, X, Y)                         \
+  do {                                                                 \
+    R##_f = X##_f * Y##_f;                                             \
+    /* Normalize since we know where the msb of the multiplicands      \
+       were (bit B), we know that the msb of the of the product is     \
+       at either 2B or 2B-1.  */                                       \
+    _FP_FRAC_SRS_1(R, wfracbits-1, 2*wfracbits);                       \
+  } while (0)
+
+/* Given a 1W * 1W => 2W primitive, do the extended multiplication.  */
+
+#define _FP_MUL_MEAT_1_wide(wfracbits, R, X, Y, doit)                  \
+  do {                                                                 \
+    _FP_W_TYPE _Z_f0, _Z_f1;                                           \
+    doit(_Z_f1, _Z_f0, X##_f, Y##_f);                                  \
+    /* Normalize since we know where the msb of the multiplicands      \
+       were (bit B), we know that the msb of the of the product is     \
+       at either 2B or 2B-1.  */                                       \
+    _FP_FRAC_SRS_2(_Z, wfracbits-1, 2*wfracbits);                      \
+    R##_f = _Z_f0;                                                     \
+  } while (0)
+
+/* Finally, a simple widening multiply algorithm.  What fun!  */
+
+#define _FP_MUL_MEAT_1_hard(wfracbits, R, X, Y)                                \
+  do {                                                                 \
+    _FP_W_TYPE _xh, _xl, _yh, _yl, _z_f0, _z_f1, _a_f0, _a_f1;         \
+                                                                       \
+    /* split the words in half */                                      \
+    _xh = X##_f >> (_FP_W_TYPE_SIZE/2);                                        \
+    _xl = X##_f & (((_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE/2)) - 1);                \
+    _yh = Y##_f >> (_FP_W_TYPE_SIZE/2);                                        \
+    _yl = Y##_f & (((_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE/2)) - 1);                \
+                                                                       \
+    /* multiply the pieces */                                          \
+    _z_f0 = _xl * _yl;                                                 \
+    _a_f0 = _xh * _yl;                                                 \
+    _a_f1 = _xl * _yh;                                                 \
+    _z_f1 = _xh * _yh;                                                 \
+                                                                       \
+    /* reassemble into two full words */                               \
+    if ((_a_f0 += _a_f1) < _a_f1)                                      \
+      _z_f1 += (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE/2);                   \
+    _a_f1 = _a_f0 >> (_FP_W_TYPE_SIZE/2);                              \
+    _a_f0 = _a_f0 << (_FP_W_TYPE_SIZE/2);                              \
+    _FP_FRAC_ADD_2(_z, _z, _a);                                                \
+                                                                       \
+    /* normalize */                                                    \
+    _FP_FRAC_SRS_2(_z, wfracbits - 1, 2*wfracbits);                    \
+    R##_f = _z_f0;                                                     \
+  } while (0)
+
+
+/*
+ * Division algorithms:
+ */
+
+/* Basic.  Assuming the host word size is >= 2*FRACBITS, we can do the
+   division immediately.  Give this macro either _FP_DIV_HELP_imm for
+   C primitives or _FP_DIV_HELP_ldiv for the ISO function.  Which you
+   choose will depend on what the compiler does with divrem4.  */
+
+#define _FP_DIV_MEAT_1_imm(fs, R, X, Y, doit)          \
+  do {                                                 \
+    _FP_W_TYPE _q, _r;                                 \
+    X##_f <<= (X##_f < Y##_f                           \
+              ? R##_e--, _FP_WFRACBITS_##fs            \
+              : _FP_WFRACBITS_##fs - 1);               \
+    doit(_q, _r, X##_f, Y##_f);                                \
+    R##_f = _q | (_r != 0);                            \
+  } while (0)
+
+/* GCC's longlong.h defines a 2W / 1W => (1W,1W) primitive udiv_qrnnd
+   that may be useful in this situation.  This first is for a primitive
+   that requires normalization, the second for one that does not.  Look
+   for UDIV_NEEDS_NORMALIZATION to tell which your machine needs.  */
+
+#define _FP_DIV_MEAT_1_udiv_norm(fs, R, X, Y)                          \
+  do {                                                                 \
+    _FP_W_TYPE _nh, _nl, _q, _r, _y;                                   \
+                                                                       \
+    /* Normalize Y -- i.e. make the most significant bit set.  */      \
+    _y = Y##_f << _FP_WFRACXBITS_##fs;                                 \
+                                                                       \
+    /* Shift X op correspondingly high, that is, up one full word.  */ \
+    if (X##_f < Y##_f)                                                 \
+      {                                                                        \
+       R##_e--;                                                        \
+       _nl = 0;                                                        \
+       _nh = X##_f;                                                    \
+      }                                                                        \
+    else                                                               \
+      {                                                                        \
+       _nl = X##_f << (_FP_W_TYPE_SIZE - 1);                           \
+       _nh = X##_f >> 1;                                               \
+      }                                                                        \
+                                                                       \
+    udiv_qrnnd(_q, _r, _nh, _nl, _y);                                  \
+    R##_f = _q | (_r != 0);                                            \
+  } while (0)
+
+#define _FP_DIV_MEAT_1_udiv(fs, R, X, Y)               \
+  do {                                                 \
+    _FP_W_TYPE _nh, _nl, _q, _r;                       \
+    if (X##_f < Y##_f)                                 \
+      {                                                        \
+       R##_e--;                                        \
+       _nl = X##_f << _FP_WFRACBITS_##fs;              \
+       _nh = X##_f >> _FP_WFRACXBITS_##fs;             \
+      }                                                        \
+    else                                               \
+      {                                                        \
+       _nl = X##_f << (_FP_WFRACBITS_##fs - 1);        \
+       _nh = X##_f >> (_FP_WFRACXBITS_##fs + 1);       \
+      }                                                        \
+    udiv_qrnnd(_q, _r, _nh, _nl, Y##_f);               \
+    R##_f = _q | (_r != 0);                            \
+  } while (0)
+  
+  
+/*
+ * Square root algorithms:
+ * We have just one right now, maybe Newton approximation
+ * should be added for those machines where division is fast.
+ */
+#define _FP_SQRT_MEAT_1(R, S, T, X, q)                 \
+  do {                                                 \
+    while (q != _FP_WORK_ROUND)                                \
+      {                                                        \
+        T##_f = S##_f + q;                             \
+        if (T##_f <= X##_f)                            \
+          {                                            \
+            S##_f = T##_f + q;                         \
+            X##_f -= T##_f;                            \
+            R##_f += q;                                        \
+          }                                            \
+        _FP_FRAC_SLL_1(X, 1);                          \
+        q >>= 1;                                       \
+      }                                                        \
+    if (X##_f)                                         \
+      {                                                        \
+       if (S##_f < X##_f)                              \
+         R##_f |= _FP_WORK_ROUND;                      \
+       R##_f |= _FP_WORK_STICKY;                       \
+      }                                                        \
+  } while (0)
+
+/*
+ * Assembly/disassembly for converting to/from integral types.  
+ * No shifting or overflow handled here.
+ */
+
+#define _FP_FRAC_ASSEMBLE_1(r, X, rsize)       (r = X##_f)
+#define _FP_FRAC_DISASSEMBLE_1(X, r, rsize)    (X##_f = r)
+
+
+/*
+ * Convert FP values between word sizes
+ */
+
+#define _FP_FRAC_COPY_1_1(D, S)                (D##_f = S##_f)
diff --git a/libgcc/soft-fp/op-2.h b/libgcc/soft-fp/op-2.h
new file mode 100644 (file)
index 0000000..3a3b3aa
--- /dev/null
@@ -0,0 +1,617 @@
+/* Software floating-point emulation.
+   Basic two-word fraction declaration and manipulation.
+   Copyright (C) 1997,1998,1999,2006,2007 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com),
+                 Jakub Jelinek (jj@ultra.linux.cz),
+                 David S. Miller (davem@redhat.com) and
+                 Peter Maydell (pmaydell@chiark.greenend.org.uk).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#define _FP_FRAC_DECL_2(X)     _FP_W_TYPE X##_f0, X##_f1
+#define _FP_FRAC_COPY_2(D,S)   (D##_f0 = S##_f0, D##_f1 = S##_f1)
+#define _FP_FRAC_SET_2(X,I)    __FP_FRAC_SET_2(X, I)
+#define _FP_FRAC_HIGH_2(X)     (X##_f1)
+#define _FP_FRAC_LOW_2(X)      (X##_f0)
+#define _FP_FRAC_WORD_2(X,w)   (X##_f##w)
+
+#define _FP_FRAC_SLL_2(X,N)                                                \
+(void)(((N) < _FP_W_TYPE_SIZE)                                             \
+       ? ({                                                                \
+           if (__builtin_constant_p(N) && (N) == 1)                        \
+             {                                                             \
+               X##_f1 = X##_f1 + X##_f1 + (((_FP_WS_TYPE)(X##_f0)) < 0);   \
+               X##_f0 += X##_f0;                                           \
+             }                                                             \
+           else                                                            \
+             {                                                             \
+               X##_f1 = X##_f1 << (N) | X##_f0 >> (_FP_W_TYPE_SIZE - (N)); \
+               X##_f0 <<= (N);                                             \
+             }                                                             \
+           0;                                                              \
+         })                                                                \
+       : ({                                                                \
+           X##_f1 = X##_f0 << ((N) - _FP_W_TYPE_SIZE);                     \
+           X##_f0 = 0;                                                     \
+         }))
+
+
+#define _FP_FRAC_SRL_2(X,N)                                            \
+(void)(((N) < _FP_W_TYPE_SIZE)                                         \
+       ? ({                                                            \
+           X##_f0 = X##_f0 >> (N) | X##_f1 << (_FP_W_TYPE_SIZE - (N)); \
+           X##_f1 >>= (N);                                             \
+         })                                                            \
+       : ({                                                            \
+           X##_f0 = X##_f1 >> ((N) - _FP_W_TYPE_SIZE);                 \
+           X##_f1 = 0;                                                 \
+         }))
+
+/* Right shift with sticky-lsb.  */
+#define _FP_FRAC_SRST_2(X,S, N,sz)                                       \
+(void)(((N) < _FP_W_TYPE_SIZE)                                           \
+       ? ({                                                              \
+           S = (__builtin_constant_p(N) && (N) == 1                      \
+                ? X##_f0 & 1                                             \
+                : (X##_f0 << (_FP_W_TYPE_SIZE - (N))) != 0);             \
+           X##_f0 = (X##_f1 << (_FP_W_TYPE_SIZE - (N)) | X##_f0 >> (N)); \
+           X##_f1 >>= (N);                                               \
+         })                                                              \
+       : ({                                                              \
+           S = ((((N) == _FP_W_TYPE_SIZE                                 \
+                  ? 0                                                    \
+                  : (X##_f1 << (2*_FP_W_TYPE_SIZE - (N))))               \
+                 | X##_f0) != 0);                                        \
+           X##_f0 = (X##_f1 >> ((N) - _FP_W_TYPE_SIZE));                 \
+           X##_f1 = 0;                                                   \
+         }))
+
+#define _FP_FRAC_SRS_2(X,N,sz)                                           \
+(void)(((N) < _FP_W_TYPE_SIZE)                                           \
+       ? ({                                                              \
+           X##_f0 = (X##_f1 << (_FP_W_TYPE_SIZE - (N)) | X##_f0 >> (N) | \
+                     (__builtin_constant_p(N) && (N) == 1                \
+                      ? X##_f0 & 1                                       \
+                      : (X##_f0 << (_FP_W_TYPE_SIZE - (N))) != 0));      \
+           X##_f1 >>= (N);                                               \
+         })                                                              \
+       : ({                                                              \
+           X##_f0 = (X##_f1 >> ((N) - _FP_W_TYPE_SIZE) |                 \
+                     ((((N) == _FP_W_TYPE_SIZE                           \
+                        ? 0                                              \
+                        : (X##_f1 << (2*_FP_W_TYPE_SIZE - (N))))         \
+                       | X##_f0) != 0));                                 \
+           X##_f1 = 0;                                                   \
+         }))
+
+#define _FP_FRAC_ADDI_2(X,I)   \
+  __FP_FRAC_ADDI_2(X##_f1, X##_f0, I)
+
+#define _FP_FRAC_ADD_2(R,X,Y)  \
+  __FP_FRAC_ADD_2(R##_f1, R##_f0, X##_f1, X##_f0, Y##_f1, Y##_f0)
+
+#define _FP_FRAC_SUB_2(R,X,Y)  \
+  __FP_FRAC_SUB_2(R##_f1, R##_f0, X##_f1, X##_f0, Y##_f1, Y##_f0)
+
+#define _FP_FRAC_DEC_2(X,Y)    \
+  __FP_FRAC_DEC_2(X##_f1, X##_f0, Y##_f1, Y##_f0)
+
+#define _FP_FRAC_CLZ_2(R,X)    \
+  do {                         \
+    if (X##_f1)                        \
+      __FP_CLZ(R,X##_f1);      \
+    else                       \
+    {                          \
+      __FP_CLZ(R,X##_f0);      \
+      R += _FP_W_TYPE_SIZE;    \
+    }                          \
+  } while(0)
+
+/* Predicates */
+#define _FP_FRAC_NEGP_2(X)     ((_FP_WS_TYPE)X##_f1 < 0)
+#define _FP_FRAC_ZEROP_2(X)    ((X##_f1 | X##_f0) == 0)
+#define _FP_FRAC_OVERP_2(fs,X) (_FP_FRAC_HIGH_##fs(X) & _FP_OVERFLOW_##fs)
+#define _FP_FRAC_CLEAR_OVERP_2(fs,X)   (_FP_FRAC_HIGH_##fs(X) &= ~_FP_OVERFLOW_##fs)
+#define _FP_FRAC_EQ_2(X, Y)    (X##_f1 == Y##_f1 && X##_f0 == Y##_f0)
+#define _FP_FRAC_GT_2(X, Y)    \
+  (X##_f1 > Y##_f1 || (X##_f1 == Y##_f1 && X##_f0 > Y##_f0))
+#define _FP_FRAC_GE_2(X, Y)    \
+  (X##_f1 > Y##_f1 || (X##_f1 == Y##_f1 && X##_f0 >= Y##_f0))
+
+#define _FP_ZEROFRAC_2         0, 0
+#define _FP_MINFRAC_2          0, 1
+#define _FP_MAXFRAC_2          (~(_FP_WS_TYPE)0), (~(_FP_WS_TYPE)0)
+
+/*
+ * Internals 
+ */
+
+#define __FP_FRAC_SET_2(X,I1,I0)       (X##_f0 = I0, X##_f1 = I1)
+
+#define __FP_CLZ_2(R, xh, xl)  \
+  do {                         \
+    if (xh)                    \
+      __FP_CLZ(R,xh);          \
+    else                       \
+    {                          \
+      __FP_CLZ(R,xl);          \
+      R += _FP_W_TYPE_SIZE;    \
+    }                          \
+  } while(0)
+
+#if 0
+
+#ifndef __FP_FRAC_ADDI_2
+#define __FP_FRAC_ADDI_2(xh, xl, i)    \
+  (xh += ((xl += i) < i))
+#endif
+#ifndef __FP_FRAC_ADD_2
+#define __FP_FRAC_ADD_2(rh, rl, xh, xl, yh, yl)        \
+  (rh = xh + yh + ((rl = xl + yl) < xl))
+#endif
+#ifndef __FP_FRAC_SUB_2
+#define __FP_FRAC_SUB_2(rh, rl, xh, xl, yh, yl)        \
+  (rh = xh - yh - ((rl = xl - yl) > xl))
+#endif
+#ifndef __FP_FRAC_DEC_2
+#define __FP_FRAC_DEC_2(xh, xl, yh, yl)        \
+  do {                                 \
+    UWtype _t = xl;                    \
+    xh -= yh + ((xl -= yl) > _t);      \
+  } while (0)
+#endif
+
+#else
+
+#undef __FP_FRAC_ADDI_2
+#define __FP_FRAC_ADDI_2(xh, xl, i)    add_ssaaaa(xh, xl, xh, xl, 0, i)
+#undef __FP_FRAC_ADD_2
+#define __FP_FRAC_ADD_2                        add_ssaaaa
+#undef __FP_FRAC_SUB_2
+#define __FP_FRAC_SUB_2                        sub_ddmmss
+#undef __FP_FRAC_DEC_2
+#define __FP_FRAC_DEC_2(xh, xl, yh, yl)        sub_ddmmss(xh, xl, xh, xl, yh, yl)
+
+#endif
+
+/*
+ * Unpack the raw bits of a native fp value.  Do not classify or
+ * normalize the data.
+ */
+
+#define _FP_UNPACK_RAW_2(fs, X, val)                   \
+  do {                                                 \
+    union _FP_UNION_##fs _flo; _flo.flt = (val);       \
+                                                       \
+    X##_f0 = _flo.bits.frac0;                          \
+    X##_f1 = _flo.bits.frac1;                          \
+    X##_e  = _flo.bits.exp;                            \
+    X##_s  = _flo.bits.sign;                           \
+  } while (0)
+
+#define _FP_UNPACK_RAW_2_P(fs, X, val)                 \
+  do {                                                 \
+    union _FP_UNION_##fs *_flo =                       \
+      (union _FP_UNION_##fs *)(val);                   \
+                                                       \
+    X##_f0 = _flo->bits.frac0;                         \
+    X##_f1 = _flo->bits.frac1;                         \
+    X##_e  = _flo->bits.exp;                           \
+    X##_s  = _flo->bits.sign;                          \
+  } while (0)
+
+
+/*
+ * Repack the raw bits of a native fp value.
+ */
+
+#define _FP_PACK_RAW_2(fs, val, X)                     \
+  do {                                                 \
+    union _FP_UNION_##fs _flo;                         \
+                                                       \
+    _flo.bits.frac0 = X##_f0;                          \
+    _flo.bits.frac1 = X##_f1;                          \
+    _flo.bits.exp   = X##_e;                           \
+    _flo.bits.sign  = X##_s;                           \
+                                                       \
+    (val) = _flo.flt;                                  \
+  } while (0)
+
+#define _FP_PACK_RAW_2_P(fs, val, X)                   \
+  do {                                                 \
+    union _FP_UNION_##fs *_flo =                       \
+      (union _FP_UNION_##fs *)(val);                   \
+                                                       \
+    _flo->bits.frac0 = X##_f0;                         \
+    _flo->bits.frac1 = X##_f1;                         \
+    _flo->bits.exp   = X##_e;                          \
+    _flo->bits.sign  = X##_s;                          \
+  } while (0)
+
+
+/*
+ * Multiplication algorithms:
+ */
+
+/* Given a 1W * 1W => 2W primitive, do the extended multiplication.  */
+
+#define _FP_MUL_MEAT_2_wide(wfracbits, R, X, Y, doit)                  \
+  do {                                                                 \
+    _FP_FRAC_DECL_4(_z); _FP_FRAC_DECL_2(_b); _FP_FRAC_DECL_2(_c);     \
+                                                                       \
+    doit(_FP_FRAC_WORD_4(_z,1), _FP_FRAC_WORD_4(_z,0), X##_f0, Y##_f0);        \
+    doit(_b_f1, _b_f0, X##_f0, Y##_f1);                                        \
+    doit(_c_f1, _c_f0, X##_f1, Y##_f0);                                        \
+    doit(_FP_FRAC_WORD_4(_z,3), _FP_FRAC_WORD_4(_z,2), X##_f1, Y##_f1);        \
+                                                                       \
+    __FP_FRAC_ADD_3(_FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2),       \
+                   _FP_FRAC_WORD_4(_z,1), 0, _b_f1, _b_f0,             \
+                   _FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2),        \
+                   _FP_FRAC_WORD_4(_z,1));                             \
+    __FP_FRAC_ADD_3(_FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2),       \
+                   _FP_FRAC_WORD_4(_z,1), 0, _c_f1, _c_f0,             \
+                   _FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2),        \
+                   _FP_FRAC_WORD_4(_z,1));                             \
+                                                                       \
+    /* Normalize since we know where the msb of the multiplicands      \
+       were (bit B), we know that the msb of the of the product is     \
+       at either 2B or 2B-1.  */                                       \
+    _FP_FRAC_SRS_4(_z, wfracbits-1, 2*wfracbits);                      \
+    R##_f0 = _FP_FRAC_WORD_4(_z,0);                                    \
+    R##_f1 = _FP_FRAC_WORD_4(_z,1);                                    \
+  } while (0)
+
+/* Given a 1W * 1W => 2W primitive, do the extended multiplication.
+   Do only 3 multiplications instead of four. This one is for machines
+   where multiplication is much more expensive than subtraction.  */
+
+#define _FP_MUL_MEAT_2_wide_3mul(wfracbits, R, X, Y, doit)             \
+  do {                                                                 \
+    _FP_FRAC_DECL_4(_z); _FP_FRAC_DECL_2(_b); _FP_FRAC_DECL_2(_c);     \
+    _FP_W_TYPE _d;                                                     \
+    int _c1, _c2;                                                      \
+                                                                       \
+    _b_f0 = X##_f0 + X##_f1;                                           \
+    _c1 = _b_f0 < X##_f0;                                              \
+    _b_f1 = Y##_f0 + Y##_f1;                                           \
+    _c2 = _b_f1 < Y##_f0;                                              \
+    doit(_d, _FP_FRAC_WORD_4(_z,0), X##_f0, Y##_f0);                   \
+    doit(_FP_FRAC_WORD_4(_z,2), _FP_FRAC_WORD_4(_z,1), _b_f0, _b_f1);  \
+    doit(_c_f1, _c_f0, X##_f1, Y##_f1);                                        \
+                                                                       \
+    _b_f0 &= -_c2;                                                     \
+    _b_f1 &= -_c1;                                                     \
+    __FP_FRAC_ADD_3(_FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2),       \
+                   _FP_FRAC_WORD_4(_z,1), (_c1 & _c2), 0, _d,          \
+                   0, _FP_FRAC_WORD_4(_z,2), _FP_FRAC_WORD_4(_z,1));   \
+    __FP_FRAC_ADDI_2(_FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2),      \
+                    _b_f0);                                            \
+    __FP_FRAC_ADDI_2(_FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2),      \
+                    _b_f1);                                            \
+    __FP_FRAC_DEC_3(_FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2),       \
+                   _FP_FRAC_WORD_4(_z,1),                              \
+                   0, _d, _FP_FRAC_WORD_4(_z,0));                      \
+    __FP_FRAC_DEC_3(_FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2),       \
+                   _FP_FRAC_WORD_4(_z,1), 0, _c_f1, _c_f0);            \
+    __FP_FRAC_ADD_2(_FP_FRAC_WORD_4(_z,3), _FP_FRAC_WORD_4(_z,2),      \
+                   _c_f1, _c_f0,                                       \
+                   _FP_FRAC_WORD_4(_z,3), _FP_FRAC_WORD_4(_z,2));      \
+                                                                       \
+    /* Normalize since we know where the msb of the multiplicands      \
+       were (bit B), we know that the msb of the of the product is     \
+       at either 2B or 2B-1.  */                                       \
+    _FP_FRAC_SRS_4(_z, wfracbits-1, 2*wfracbits);                      \
+    R##_f0 = _FP_FRAC_WORD_4(_z,0);                                    \
+    R##_f1 = _FP_FRAC_WORD_4(_z,1);                                    \
+  } while (0)
+
+#define _FP_MUL_MEAT_2_gmp(wfracbits, R, X, Y)                         \
+  do {                                                                 \
+    _FP_FRAC_DECL_4(_z);                                               \
+    _FP_W_TYPE _x[2], _y[2];                                           \
+    _x[0] = X##_f0; _x[1] = X##_f1;                                    \
+    _y[0] = Y##_f0; _y[1] = Y##_f1;                                    \
+                                                                       \
+    mpn_mul_n(_z_f, _x, _y, 2);                                                \
+                                                                       \
+    /* Normalize since we know where the msb of the multiplicands      \
+       were (bit B), we know that the msb of the of the product is     \
+       at either 2B or 2B-1.  */                                       \
+    _FP_FRAC_SRS_4(_z, wfracbits-1, 2*wfracbits);                      \
+    R##_f0 = _z_f[0];                                                  \
+    R##_f1 = _z_f[1];                                                  \
+  } while (0)
+
+/* Do at most 120x120=240 bits multiplication using double floating
+   point multiplication.  This is useful if floating point
+   multiplication has much bigger throughput than integer multiply.
+   It is supposed to work for _FP_W_TYPE_SIZE 64 and wfracbits
+   between 106 and 120 only.  
+   Caller guarantees that X and Y has (1LLL << (wfracbits - 1)) set.
+   SETFETZ is a macro which will disable all FPU exceptions and set rounding
+   towards zero,  RESETFE should optionally reset it back.  */
+
+#define _FP_MUL_MEAT_2_120_240_double(wfracbits, R, X, Y, setfetz, resetfe)    \
+  do {                                                                         \
+    static const double _const[] = {                                           \
+      /* 2^-24 */ 5.9604644775390625e-08,                                      \
+      /* 2^-48 */ 3.5527136788005009e-15,                                      \
+      /* 2^-72 */ 2.1175823681357508e-22,                                      \
+      /* 2^-96 */ 1.2621774483536189e-29,                                      \
+      /* 2^28 */ 2.68435456e+08,                                               \
+      /* 2^4 */ 1.600000e+01,                                                  \
+      /* 2^-20 */ 9.5367431640625e-07,                                         \
+      /* 2^-44 */ 5.6843418860808015e-14,                                      \
+      /* 2^-68 */ 3.3881317890172014e-21,                                      \
+      /* 2^-92 */ 2.0194839173657902e-28,                                      \
+      /* 2^-116 */ 1.2037062152420224e-35};                                    \
+    double _a240, _b240, _c240, _d240, _e240, _f240,                           \
+          _g240, _h240, _i240, _j240, _k240;                                   \
+    union { double d; UDItype i; } _l240, _m240, _n240, _o240,                 \
+                                  _p240, _q240, _r240, _s240;                  \
+    UDItype _t240, _u240, _v240, _w240, _x240, _y240 = 0;                      \
+                                                                               \
+    if (wfracbits < 106 || wfracbits > 120)                                    \
+      abort();                                                                 \
+                                                                               \
+    setfetz;                                                                   \
+                                                                               \
+    _e240 = (double)(long)(X##_f0 & 0xffffff);                                 \
+    _j240 = (double)(long)(Y##_f0 & 0xffffff);                                 \
+    _d240 = (double)(long)((X##_f0 >> 24) & 0xffffff);                         \
+    _i240 = (double)(long)((Y##_f0 >> 24) & 0xffffff);                         \
+    _c240 = (double)(long)(((X##_f1 << 16) & 0xffffff) | (X##_f0 >> 48));      \
+    _h240 = (double)(long)(((Y##_f1 << 16) & 0xffffff) | (Y##_f0 >> 48));      \
+    _b240 = (double)(long)((X##_f1 >> 8) & 0xffffff);                          \
+    _g240 = (double)(long)((Y##_f1 >> 8) & 0xffffff);                          \
+    _a240 = (double)(long)(X##_f1 >> 32);                                      \
+    _f240 = (double)(long)(Y##_f1 >> 32);                                      \
+    _e240 *= _const[3];                                                                \
+    _j240 *= _const[3];                                                                \
+    _d240 *= _const[2];                                                                \
+    _i240 *= _const[2];                                                                \
+    _c240 *= _const[1];                                                                \
+    _h240 *= _const[1];                                                                \
+    _b240 *= _const[0];                                                                \
+    _g240 *= _const[0];                                                                \
+    _s240.d =                                                        _e240*_j240;\
+    _r240.d =                                          _d240*_j240 + _e240*_i240;\
+    _q240.d =                            _c240*_j240 + _d240*_i240 + _e240*_h240;\
+    _p240.d =              _b240*_j240 + _c240*_i240 + _d240*_h240 + _e240*_g240;\
+    _o240.d = _a240*_j240 + _b240*_i240 + _c240*_h240 + _d240*_g240 + _e240*_f240;\
+    _n240.d = _a240*_i240 + _b240*_h240 + _c240*_g240 + _d240*_f240;           \
+    _m240.d = _a240*_h240 + _b240*_g240 + _c240*_f240;                         \
+    _l240.d = _a240*_g240 + _b240*_f240;                                       \
+    _k240 =   _a240*_f240;                                                     \
+    _r240.d += _s240.d;                                                                \
+    _q240.d += _r240.d;                                                                \
+    _p240.d += _q240.d;                                                                \
+    _o240.d += _p240.d;                                                                \
+    _n240.d += _o240.d;                                                                \
+    _m240.d += _n240.d;                                                                \
+    _l240.d += _m240.d;                                                                \
+    _k240 += _l240.d;                                                          \
+    _s240.d -= ((_const[10]+_s240.d)-_const[10]);                              \
+    _r240.d -= ((_const[9]+_r240.d)-_const[9]);                                        \
+    _q240.d -= ((_const[8]+_q240.d)-_const[8]);                                        \
+    _p240.d -= ((_const[7]+_p240.d)-_const[7]);                                        \
+    _o240.d += _const[7];                                                      \
+    _n240.d += _const[6];                                                      \
+    _m240.d += _const[5];                                                      \
+    _l240.d += _const[4];                                                      \
+    if (_s240.d != 0.0) _y240 = 1;                                             \
+    if (_r240.d != 0.0) _y240 = 1;                                             \
+    if (_q240.d != 0.0) _y240 = 1;                                             \
+    if (_p240.d != 0.0) _y240 = 1;                                             \
+    _t240 = (DItype)_k240;                                                     \
+    _u240 = _l240.i;                                                           \
+    _v240 = _m240.i;                                                           \
+    _w240 = _n240.i;                                                           \
+    _x240 = _o240.i;                                                           \
+    R##_f1 = (_t240 << (128 - (wfracbits - 1)))                                        \
+            | ((_u240 & 0xffffff) >> ((wfracbits - 1) - 104));                 \
+    R##_f0 = ((_u240 & 0xffffff) << (168 - (wfracbits - 1)))                   \
+            | ((_v240 & 0xffffff) << (144 - (wfracbits - 1)))                  \
+            | ((_w240 & 0xffffff) << (120 - (wfracbits - 1)))                  \
+            | ((_x240 & 0xffffff) >> ((wfracbits - 1) - 96))                   \
+            | _y240;                                                           \
+    resetfe;                                                                   \
+  } while (0)
+
+/*
+ * Division algorithms:
+ */
+
+#define _FP_DIV_MEAT_2_udiv(fs, R, X, Y)                               \
+  do {                                                                 \
+    _FP_W_TYPE _n_f2, _n_f1, _n_f0, _r_f1, _r_f0, _m_f1, _m_f0;                \
+    if (_FP_FRAC_GT_2(X, Y))                                           \
+      {                                                                        \
+       _n_f2 = X##_f1 >> 1;                                            \
+       _n_f1 = X##_f1 << (_FP_W_TYPE_SIZE - 1) | X##_f0 >> 1;          \
+       _n_f0 = X##_f0 << (_FP_W_TYPE_SIZE - 1);                        \
+      }                                                                        \
+    else                                                               \
+      {                                                                        \
+       R##_e--;                                                        \
+       _n_f2 = X##_f1;                                                 \
+       _n_f1 = X##_f0;                                                 \
+       _n_f0 = 0;                                                      \
+      }                                                                        \
+                                                                       \
+    /* Normalize, i.e. make the most significant bit of the            \
+       denominator set. */                                             \
+    _FP_FRAC_SLL_2(Y, _FP_WFRACXBITS_##fs);                            \
+                                                                       \
+    udiv_qrnnd(R##_f1, _r_f1, _n_f2, _n_f1, Y##_f1);                   \
+    umul_ppmm(_m_f1, _m_f0, R##_f1, Y##_f0);                           \
+    _r_f0 = _n_f0;                                                     \
+    if (_FP_FRAC_GT_2(_m, _r))                                         \
+      {                                                                        \
+       R##_f1--;                                                       \
+       _FP_FRAC_ADD_2(_r, Y, _r);                                      \
+       if (_FP_FRAC_GE_2(_r, Y) && _FP_FRAC_GT_2(_m, _r))              \
+         {                                                             \
+           R##_f1--;                                                   \
+           _FP_FRAC_ADD_2(_r, Y, _r);                                  \
+         }                                                             \
+      }                                                                        \
+    _FP_FRAC_DEC_2(_r, _m);                                            \
+                                                                       \
+    if (_r_f1 == Y##_f1)                                               \
+      {                                                                        \
+       /* This is a special case, not an optimization                  \
+          (_r/Y##_f1 would not fit into UWtype).                       \
+          As _r is guaranteed to be < Y,  R##_f0 can be either         \
+          (UWtype)-1 or (UWtype)-2.  But as we know what kind          \
+          of bits it is (sticky, guard, round),  we don't care.        \
+          We also don't care what the reminder is,  because the        \
+          guard bit will be set anyway.  -jj */                        \
+       R##_f0 = -1;                                                    \
+      }                                                                        \
+    else                                                               \
+      {                                                                        \
+       udiv_qrnnd(R##_f0, _r_f1, _r_f1, _r_f0, Y##_f1);                \
+       umul_ppmm(_m_f1, _m_f0, R##_f0, Y##_f0);                        \
+       _r_f0 = 0;                                                      \
+       if (_FP_FRAC_GT_2(_m, _r))                                      \
+         {                                                             \
+           R##_f0--;                                                   \
+           _FP_FRAC_ADD_2(_r, Y, _r);                                  \
+           if (_FP_FRAC_GE_2(_r, Y) && _FP_FRAC_GT_2(_m, _r))          \
+             {                                                         \
+               R##_f0--;                                               \
+               _FP_FRAC_ADD_2(_r, Y, _r);                              \
+             }                                                         \
+         }                                                             \
+       if (!_FP_FRAC_EQ_2(_r, _m))                                     \
+         R##_f0 |= _FP_WORK_STICKY;                                    \
+      }                                                                        \
+  } while (0)
+
+
+#define _FP_DIV_MEAT_2_gmp(fs, R, X, Y)                                        \
+  do {                                                                 \
+    _FP_W_TYPE _x[4], _y[2], _z[4];                                    \
+    _y[0] = Y##_f0; _y[1] = Y##_f1;                                    \
+    _x[0] = _x[3] = 0;                                                 \
+    if (_FP_FRAC_GT_2(X, Y))                                           \
+      {                                                                        \
+       R##_e++;                                                        \
+       _x[1] = (X##_f0 << (_FP_WFRACBITS_##fs-1 - _FP_W_TYPE_SIZE) |   \
+                X##_f1 >> (_FP_W_TYPE_SIZE -                           \
+                           (_FP_WFRACBITS_##fs-1 - _FP_W_TYPE_SIZE))); \
+       _x[2] = X##_f1 << (_FP_WFRACBITS_##fs-1 - _FP_W_TYPE_SIZE);     \
+      }                                                                        \
+    else                                                               \
+      {                                                                        \
+       _x[1] = (X##_f0 << (_FP_WFRACBITS_##fs - _FP_W_TYPE_SIZE) |     \
+                X##_f1 >> (_FP_W_TYPE_SIZE -                           \
+                           (_FP_WFRACBITS_##fs - _FP_W_TYPE_SIZE)));   \
+       _x[2] = X##_f1 << (_FP_WFRACBITS_##fs - _FP_W_TYPE_SIZE);       \
+      }                                                                        \
+                                                                       \
+    (void) mpn_divrem (_z, 0, _x, 4, _y, 2);                           \
+    R##_f1 = _z[1];                                                    \
+    R##_f0 = _z[0] | ((_x[0] | _x[1]) != 0);                           \
+  } while (0)
+
+
+/*
+ * Square root algorithms:
+ * We have just one right now, maybe Newton approximation
+ * should be added for those machines where division is fast.
+ */
+#define _FP_SQRT_MEAT_2(R, S, T, X, q)                 \
+  do {                                                 \
+    while (q)                                          \
+      {                                                        \
+       T##_f1 = S##_f1 + q;                            \
+       if (T##_f1 <= X##_f1)                           \
+         {                                             \
+           S##_f1 = T##_f1 + q;                        \
+           X##_f1 -= T##_f1;                           \
+           R##_f1 += q;                                \
+         }                                             \
+       _FP_FRAC_SLL_2(X, 1);                           \
+       q >>= 1;                                        \
+      }                                                        \
+    q = (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE - 1);                \
+    while (q != _FP_WORK_ROUND)                                \
+      {                                                        \
+       T##_f0 = S##_f0 + q;                            \
+       T##_f1 = S##_f1;                                \
+       if (T##_f1 < X##_f1 ||                          \
+           (T##_f1 == X##_f1 && T##_f0 <= X##_f0))     \
+         {                                             \
+           S##_f0 = T##_f0 + q;                        \
+           S##_f1 += (T##_f0 > S##_f0);                \
+           _FP_FRAC_DEC_2(X, T);                       \
+           R##_f0 += q;                                \
+         }                                             \
+       _FP_FRAC_SLL_2(X, 1);                           \
+       q >>= 1;                                        \
+      }                                                        \
+    if (X##_f0 | X##_f1)                               \
+      {                                                        \
+       if (S##_f1 < X##_f1 ||                          \
+           (S##_f1 == X##_f1 && S##_f0 < X##_f0))      \
+         R##_f0 |= _FP_WORK_ROUND;                     \
+       R##_f0 |= _FP_WORK_STICKY;                      \
+      }                                                        \
+  } while (0)
+
+
+/*
+ * Assembly/disassembly for converting to/from integral types.  
+ * No shifting or overflow handled here.
+ */
+
+#define _FP_FRAC_ASSEMBLE_2(r, X, rsize)       \
+(void)((rsize <= _FP_W_TYPE_SIZE)              \
+       ? ({ r = X##_f0; })                     \
+       : ({                                    \
+           r = X##_f1;                         \
+           r <<= _FP_W_TYPE_SIZE;              \
+           r += X##_f0;                        \
+         }))
+
+#define _FP_FRAC_DISASSEMBLE_2(X, r, rsize)                            \
+  do {                                                                 \
+    X##_f0 = r;                                                                \
+    X##_f1 = (rsize <= _FP_W_TYPE_SIZE ? 0 : r >> _FP_W_TYPE_SIZE);    \
+  } while (0)
+
+/*
+ * Convert FP values between word sizes
+ */
+
+#define _FP_FRAC_COPY_1_2(D, S)                (D##_f = S##_f0)
+
+#define _FP_FRAC_COPY_2_1(D, S)                ((D##_f0 = S##_f), (D##_f1 = 0))
+
+#define _FP_FRAC_COPY_2_2(D,S)         _FP_FRAC_COPY_2(D,S)
diff --git a/libgcc/soft-fp/op-4.h b/libgcc/soft-fp/op-4.h
new file mode 100644 (file)
index 0000000..70b9faf
--- /dev/null
@@ -0,0 +1,688 @@
+/* Software floating-point emulation.
+   Basic four-word fraction declaration and manipulation.
+   Copyright (C) 1997,1998,1999,2006,2007 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com),
+                 Jakub Jelinek (jj@ultra.linux.cz),
+                 David S. Miller (davem@redhat.com) and
+                 Peter Maydell (pmaydell@chiark.greenend.org.uk).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#define _FP_FRAC_DECL_4(X)     _FP_W_TYPE X##_f[4]
+#define _FP_FRAC_COPY_4(D,S)                   \
+  (D##_f[0] = S##_f[0], D##_f[1] = S##_f[1],   \
+   D##_f[2] = S##_f[2], D##_f[3] = S##_f[3])
+#define _FP_FRAC_SET_4(X,I)    __FP_FRAC_SET_4(X, I)
+#define _FP_FRAC_HIGH_4(X)     (X##_f[3])
+#define _FP_FRAC_LOW_4(X)      (X##_f[0])
+#define _FP_FRAC_WORD_4(X,w)   (X##_f[w])
+
+#define _FP_FRAC_SLL_4(X,N)                                            \
+  do {                                                                 \
+    _FP_I_TYPE _up, _down, _skip, _i;                                  \
+    _skip = (N) / _FP_W_TYPE_SIZE;                                     \
+    _up = (N) % _FP_W_TYPE_SIZE;                                       \
+    _down = _FP_W_TYPE_SIZE - _up;                                     \
+    if (!_up)                                                          \
+      for (_i = 3; _i >= _skip; --_i)                                  \
+       X##_f[_i] = X##_f[_i-_skip];                                    \
+    else                                                               \
+      {                                                                        \
+       for (_i = 3; _i > _skip; --_i)                                  \
+         X##_f[_i] = X##_f[_i-_skip] << _up                            \
+                     | X##_f[_i-_skip-1] >> _down;                     \
+       X##_f[_i--] = X##_f[0] << _up;                                  \
+      }                                                                        \
+    for (; _i >= 0; --_i)                                              \
+      X##_f[_i] = 0;                                                   \
+  } while (0)
+
+/* This one was broken too */
+#define _FP_FRAC_SRL_4(X,N)                                            \
+  do {                                                                 \
+    _FP_I_TYPE _up, _down, _skip, _i;                                  \
+    _skip = (N) / _FP_W_TYPE_SIZE;                                     \
+    _down = (N) % _FP_W_TYPE_SIZE;                                     \
+    _up = _FP_W_TYPE_SIZE - _down;                                     \
+    if (!_down)                                                                \
+      for (_i = 0; _i <= 3-_skip; ++_i)                                        \
+       X##_f[_i] = X##_f[_i+_skip];                                    \
+    else                                                               \
+      {                                                                        \
+       for (_i = 0; _i < 3-_skip; ++_i)                                \
+         X##_f[_i] = X##_f[_i+_skip] >> _down                          \
+                     | X##_f[_i+_skip+1] << _up;                       \
+       X##_f[_i++] = X##_f[3] >> _down;                                \
+      }                                                                        \
+    for (; _i < 4; ++_i)                                               \
+      X##_f[_i] = 0;                                                   \
+  } while (0)
+
+
+/* Right shift with sticky-lsb. 
+ * What this actually means is that we do a standard right-shift,
+ * but that if any of the bits that fall off the right hand side
+ * were one then we always set the LSbit.
+ */
+#define _FP_FRAC_SRST_4(X,S,N,size)                    \
+  do {                                                 \
+    _FP_I_TYPE _up, _down, _skip, _i;                  \
+    _FP_W_TYPE _s;                                     \
+    _skip = (N) / _FP_W_TYPE_SIZE;                     \
+    _down = (N) % _FP_W_TYPE_SIZE;                     \
+    _up = _FP_W_TYPE_SIZE - _down;                     \
+    for (_s = _i = 0; _i < _skip; ++_i)                        \
+      _s |= X##_f[_i];                                 \
+    if (!_down)                                                \
+      for (_i = 0; _i <= 3-_skip; ++_i)                        \
+       X##_f[_i] = X##_f[_i+_skip];                    \
+    else                                               \
+      {                                                        \
+       _s |= X##_f[_i] << _up;                         \
+       for (_i = 0; _i < 3-_skip; ++_i)                \
+         X##_f[_i] = X##_f[_i+_skip] >> _down          \
+                     | X##_f[_i+_skip+1] << _up;       \
+       X##_f[_i++] = X##_f[3] >> _down;                \
+      }                                                        \
+    for (; _i < 4; ++_i)                               \
+      X##_f[_i] = 0;                                   \
+    S = (_s != 0);                                     \
+  } while (0)
+
+#define _FP_FRAC_SRS_4(X,N,size)               \
+  do {                                         \
+    int _sticky;                               \
+    _FP_FRAC_SRST_4(X, _sticky, N, size);      \
+    X##_f[0] |= _sticky;                       \
+  } while (0)
+
+#define _FP_FRAC_ADD_4(R,X,Y)                                          \
+  __FP_FRAC_ADD_4(R##_f[3], R##_f[2], R##_f[1], R##_f[0],              \
+                 X##_f[3], X##_f[2], X##_f[1], X##_f[0],               \
+                 Y##_f[3], Y##_f[2], Y##_f[1], Y##_f[0])
+
+#define _FP_FRAC_SUB_4(R,X,Y)                                          \
+  __FP_FRAC_SUB_4(R##_f[3], R##_f[2], R##_f[1], R##_f[0],              \
+                 X##_f[3], X##_f[2], X##_f[1], X##_f[0],               \
+                 Y##_f[3], Y##_f[2], Y##_f[1], Y##_f[0])
+
+#define _FP_FRAC_DEC_4(X,Y)                                            \
+  __FP_FRAC_DEC_4(X##_f[3], X##_f[2], X##_f[1], X##_f[0],              \
+                 Y##_f[3], Y##_f[2], Y##_f[1], Y##_f[0])
+
+#define _FP_FRAC_ADDI_4(X,I)                                           \
+  __FP_FRAC_ADDI_4(X##_f[3], X##_f[2], X##_f[1], X##_f[0], I)
+
+#define _FP_ZEROFRAC_4  0,0,0,0
+#define _FP_MINFRAC_4   0,0,0,1
+#define _FP_MAXFRAC_4  (~(_FP_WS_TYPE)0), (~(_FP_WS_TYPE)0), (~(_FP_WS_TYPE)0), (~(_FP_WS_TYPE)0)
+
+#define _FP_FRAC_ZEROP_4(X)     ((X##_f[0] | X##_f[1] | X##_f[2] | X##_f[3]) == 0)
+#define _FP_FRAC_NEGP_4(X)      ((_FP_WS_TYPE)X##_f[3] < 0)
+#define _FP_FRAC_OVERP_4(fs,X)  (_FP_FRAC_HIGH_##fs(X) & _FP_OVERFLOW_##fs)
+#define _FP_FRAC_CLEAR_OVERP_4(fs,X)  (_FP_FRAC_HIGH_##fs(X) &= ~_FP_OVERFLOW_##fs)
+
+#define _FP_FRAC_EQ_4(X,Y)                             \
+ (X##_f[0] == Y##_f[0] && X##_f[1] == Y##_f[1]         \
+  && X##_f[2] == Y##_f[2] && X##_f[3] == Y##_f[3])
+
+#define _FP_FRAC_GT_4(X,Y)                             \
+ (X##_f[3] > Y##_f[3] ||                               \
+  (X##_f[3] == Y##_f[3] && (X##_f[2] > Y##_f[2] ||     \
+   (X##_f[2] == Y##_f[2] && (X##_f[1] > Y##_f[1] ||    \
+    (X##_f[1] == Y##_f[1] && X##_f[0] > Y##_f[0])      \
+   ))                                                  \
+  ))                                                   \
+ )
+
+#define _FP_FRAC_GE_4(X,Y)                             \
+ (X##_f[3] > Y##_f[3] ||                               \
+  (X##_f[3] == Y##_f[3] && (X##_f[2] > Y##_f[2] ||     \
+   (X##_f[2] == Y##_f[2] && (X##_f[1] > Y##_f[1] ||    \
+    (X##_f[1] == Y##_f[1] && X##_f[0] >= Y##_f[0])     \
+   ))                                                  \
+  ))                                                   \
+ )
+
+
+#define _FP_FRAC_CLZ_4(R,X)            \
+  do {                                 \
+    if (X##_f[3])                      \
+    {                                  \
+       __FP_CLZ(R,X##_f[3]);           \
+    }                                  \
+    else if (X##_f[2])                 \
+    {                                  \
+       __FP_CLZ(R,X##_f[2]);           \
+       R += _FP_W_TYPE_SIZE;           \
+    }                                  \
+    else if (X##_f[1])                 \
+    {                                  \
+       __FP_CLZ(R,X##_f[1]);           \
+       R += _FP_W_TYPE_SIZE*2;         \
+    }                                  \
+    else                               \
+    {                                  \
+       __FP_CLZ(R,X##_f[0]);           \
+       R += _FP_W_TYPE_SIZE*3;         \
+    }                                  \
+  } while(0)
+
+
+#define _FP_UNPACK_RAW_4(fs, X, val)                           \
+  do {                                                         \
+    union _FP_UNION_##fs _flo; _flo.flt = (val);               \
+    X##_f[0] = _flo.bits.frac0;                                        \
+    X##_f[1] = _flo.bits.frac1;                                        \
+    X##_f[2] = _flo.bits.frac2;                                        \
+    X##_f[3] = _flo.bits.frac3;                                        \
+    X##_e  = _flo.bits.exp;                                    \
+    X##_s  = _flo.bits.sign;                                   \
+  } while (0)
+
+#define _FP_UNPACK_RAW_4_P(fs, X, val)                         \
+  do {                                                         \
+    union _FP_UNION_##fs *_flo =                               \
+      (union _FP_UNION_##fs *)(val);                           \
+                                                               \
+    X##_f[0] = _flo->bits.frac0;                               \
+    X##_f[1] = _flo->bits.frac1;                               \
+    X##_f[2] = _flo->bits.frac2;                               \
+    X##_f[3] = _flo->bits.frac3;                               \
+    X##_e  = _flo->bits.exp;                                   \
+    X##_s  = _flo->bits.sign;                                  \
+  } while (0)
+
+#define _FP_PACK_RAW_4(fs, val, X)                             \
+  do {                                                         \
+    union _FP_UNION_##fs _flo;                                 \
+    _flo.bits.frac0 = X##_f[0];                                        \
+    _flo.bits.frac1 = X##_f[1];                                        \
+    _flo.bits.frac2 = X##_f[2];                                        \
+    _flo.bits.frac3 = X##_f[3];                                        \
+    _flo.bits.exp   = X##_e;                                   \
+    _flo.bits.sign  = X##_s;                                   \
+    (val) = _flo.flt;                                          \
+  } while (0)
+
+#define _FP_PACK_RAW_4_P(fs, val, X)                           \
+  do {                                                         \
+    union _FP_UNION_##fs *_flo =                               \
+      (union _FP_UNION_##fs *)(val);                           \
+                                                               \
+    _flo->bits.frac0 = X##_f[0];                               \
+    _flo->bits.frac1 = X##_f[1];                               \
+    _flo->bits.frac2 = X##_f[2];                               \
+    _flo->bits.frac3 = X##_f[3];                               \
+    _flo->bits.exp   = X##_e;                                  \
+    _flo->bits.sign  = X##_s;                                  \
+  } while (0)
+
+/*
+ * Multiplication algorithms:
+ */
+
+/* Given a 1W * 1W => 2W primitive, do the extended multiplication.  */
+
+#define _FP_MUL_MEAT_4_wide(wfracbits, R, X, Y, doit)                      \
+  do {                                                                     \
+    _FP_FRAC_DECL_8(_z); _FP_FRAC_DECL_2(_b); _FP_FRAC_DECL_2(_c);         \
+    _FP_FRAC_DECL_2(_d); _FP_FRAC_DECL_2(_e); _FP_FRAC_DECL_2(_f);         \
+                                                                           \
+    doit(_FP_FRAC_WORD_8(_z,1), _FP_FRAC_WORD_8(_z,0), X##_f[0], Y##_f[0]); \
+    doit(_b_f1, _b_f0, X##_f[0], Y##_f[1]);                                \
+    doit(_c_f1, _c_f0, X##_f[1], Y##_f[0]);                                \
+    doit(_d_f1, _d_f0, X##_f[1], Y##_f[1]);                                \
+    doit(_e_f1, _e_f0, X##_f[0], Y##_f[2]);                                \
+    doit(_f_f1, _f_f0, X##_f[2], Y##_f[0]);                                \
+    __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,3),_FP_FRAC_WORD_8(_z,2),           \
+                   _FP_FRAC_WORD_8(_z,1), 0,_b_f1,_b_f0,                   \
+                   0,0,_FP_FRAC_WORD_8(_z,1));                             \
+    __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,3),_FP_FRAC_WORD_8(_z,2),           \
+                   _FP_FRAC_WORD_8(_z,1), 0,_c_f1,_c_f0,                   \
+                   _FP_FRAC_WORD_8(_z,3),_FP_FRAC_WORD_8(_z,2),            \
+                   _FP_FRAC_WORD_8(_z,1));                                 \
+    __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,4),_FP_FRAC_WORD_8(_z,3),           \
+                   _FP_FRAC_WORD_8(_z,2), 0,_d_f1,_d_f0,                   \
+                   0,_FP_FRAC_WORD_8(_z,3),_FP_FRAC_WORD_8(_z,2));         \
+    __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,4),_FP_FRAC_WORD_8(_z,3),           \
+                   _FP_FRAC_WORD_8(_z,2), 0,_e_f1,_e_f0,                   \
+                   _FP_FRAC_WORD_8(_z,4),_FP_FRAC_WORD_8(_z,3),            \
+                   _FP_FRAC_WORD_8(_z,2));                                 \
+    __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,4),_FP_FRAC_WORD_8(_z,3),           \
+                   _FP_FRAC_WORD_8(_z,2), 0,_f_f1,_f_f0,                   \
+                   _FP_FRAC_WORD_8(_z,4),_FP_FRAC_WORD_8(_z,3),            \
+                   _FP_FRAC_WORD_8(_z,2));                                 \
+    doit(_b_f1, _b_f0, X##_f[0], Y##_f[3]);                                \
+    doit(_c_f1, _c_f0, X##_f[3], Y##_f[0]);                                \
+    doit(_d_f1, _d_f0, X##_f[1], Y##_f[2]);                                \
+    doit(_e_f1, _e_f0, X##_f[2], Y##_f[1]);                                \
+    __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,5),_FP_FRAC_WORD_8(_z,4),           \
+                   _FP_FRAC_WORD_8(_z,3), 0,_b_f1,_b_f0,                   \
+                   0,_FP_FRAC_WORD_8(_z,4),_FP_FRAC_WORD_8(_z,3));         \
+    __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,5),_FP_FRAC_WORD_8(_z,4),           \
+                   _FP_FRAC_WORD_8(_z,3), 0,_c_f1,_c_f0,                   \
+                   _FP_FRAC_WORD_8(_z,5),_FP_FRAC_WORD_8(_z,4),            \
+                   _FP_FRAC_WORD_8(_z,3));                                 \
+    __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,5),_FP_FRAC_WORD_8(_z,4),           \
+                   _FP_FRAC_WORD_8(_z,3), 0,_d_f1,_d_f0,                   \
+                   _FP_FRAC_WORD_8(_z,5),_FP_FRAC_WORD_8(_z,4),            \
+                   _FP_FRAC_WORD_8(_z,3));                                 \
+    __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,5),_FP_FRAC_WORD_8(_z,4),           \
+                   _FP_FRAC_WORD_8(_z,3), 0,_e_f1,_e_f0,                   \
+                   _FP_FRAC_WORD_8(_z,5),_FP_FRAC_WORD_8(_z,4),            \
+                   _FP_FRAC_WORD_8(_z,3));                                 \
+    doit(_b_f1, _b_f0, X##_f[2], Y##_f[2]);                                \
+    doit(_c_f1, _c_f0, X##_f[1], Y##_f[3]);                                \
+    doit(_d_f1, _d_f0, X##_f[3], Y##_f[1]);                                \
+    doit(_e_f1, _e_f0, X##_f[2], Y##_f[3]);                                \
+    doit(_f_f1, _f_f0, X##_f[3], Y##_f[2]);                                \
+    __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,6),_FP_FRAC_WORD_8(_z,5),           \
+                   _FP_FRAC_WORD_8(_z,4), 0,_b_f1,_b_f0,                   \
+                   0,_FP_FRAC_WORD_8(_z,5),_FP_FRAC_WORD_8(_z,4));         \
+    __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,6),_FP_FRAC_WORD_8(_z,5),           \
+                   _FP_FRAC_WORD_8(_z,4), 0,_c_f1,_c_f0,                   \
+                   _FP_FRAC_WORD_8(_z,6),_FP_FRAC_WORD_8(_z,5),            \
+                   _FP_FRAC_WORD_8(_z,4));                                 \
+    __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,6),_FP_FRAC_WORD_8(_z,5),           \
+                   _FP_FRAC_WORD_8(_z,4), 0,_d_f1,_d_f0,                   \
+                   _FP_FRAC_WORD_8(_z,6),_FP_FRAC_WORD_8(_z,5),            \
+                   _FP_FRAC_WORD_8(_z,4));                                 \
+    __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,7),_FP_FRAC_WORD_8(_z,6),           \
+                   _FP_FRAC_WORD_8(_z,5), 0,_e_f1,_e_f0,                   \
+                   0,_FP_FRAC_WORD_8(_z,6),_FP_FRAC_WORD_8(_z,5));         \
+    __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,7),_FP_FRAC_WORD_8(_z,6),           \
+                   _FP_FRAC_WORD_8(_z,5), 0,_f_f1,_f_f0,                   \
+                   _FP_FRAC_WORD_8(_z,7),_FP_FRAC_WORD_8(_z,6),            \
+                   _FP_FRAC_WORD_8(_z,5));                                 \
+    doit(_b_f1, _b_f0, X##_f[3], Y##_f[3]);                                \
+    __FP_FRAC_ADD_2(_FP_FRAC_WORD_8(_z,7),_FP_FRAC_WORD_8(_z,6),           \
+                   _b_f1,_b_f0,                                            \
+                   _FP_FRAC_WORD_8(_z,7),_FP_FRAC_WORD_8(_z,6));           \
+                                                                           \
+    /* Normalize since we know where the msb of the multiplicands          \
+       were (bit B), we know that the msb of the of the product is         \
+       at either 2B or 2B-1.  */                                           \
+    _FP_FRAC_SRS_8(_z, wfracbits-1, 2*wfracbits);                          \
+    __FP_FRAC_SET_4(R, _FP_FRAC_WORD_8(_z,3), _FP_FRAC_WORD_8(_z,2),       \
+                   _FP_FRAC_WORD_8(_z,1), _FP_FRAC_WORD_8(_z,0));          \
+  } while (0)
+
+#define _FP_MUL_MEAT_4_gmp(wfracbits, R, X, Y)                             \
+  do {                                                                     \
+    _FP_FRAC_DECL_8(_z);                                                   \
+                                                                           \
+    mpn_mul_n(_z_f, _x_f, _y_f, 4);                                        \
+                                                                           \
+    /* Normalize since we know where the msb of the multiplicands          \
+       were (bit B), we know that the msb of the of the product is         \
+       at either 2B or 2B-1.  */                                           \
+    _FP_FRAC_SRS_8(_z, wfracbits-1, 2*wfracbits);                          \
+    __FP_FRAC_SET_4(R, _FP_FRAC_WORD_8(_z,3), _FP_FRAC_WORD_8(_z,2),       \
+                   _FP_FRAC_WORD_8(_z,1), _FP_FRAC_WORD_8(_z,0));          \
+  } while (0)
+
+/*
+ * Helper utility for _FP_DIV_MEAT_4_udiv:
+ * pppp = m * nnn
+ */
+#define umul_ppppmnnn(p3,p2,p1,p0,m,n2,n1,n0)                              \
+  do {                                                                     \
+    UWtype _t;                                                             \
+    umul_ppmm(p1,p0,m,n0);                                                 \
+    umul_ppmm(p2,_t,m,n1);                                                 \
+    __FP_FRAC_ADDI_2(p2,p1,_t);                                                    \
+    umul_ppmm(p3,_t,m,n2);                                                 \
+    __FP_FRAC_ADDI_2(p3,p2,_t);                                                    \
+  } while (0)
+
+/*
+ * Division algorithms:
+ */
+
+#define _FP_DIV_MEAT_4_udiv(fs, R, X, Y)                                   \
+  do {                                                                     \
+    int _i;                                                                \
+    _FP_FRAC_DECL_4(_n); _FP_FRAC_DECL_4(_m);                              \
+    _FP_FRAC_SET_4(_n, _FP_ZEROFRAC_4);                                            \
+    if (_FP_FRAC_GT_4(X, Y))                                               \
+      {                                                                            \
+       _n_f[3] = X##_f[0] << (_FP_W_TYPE_SIZE - 1);                        \
+       _FP_FRAC_SRL_4(X, 1);                                               \
+      }                                                                            \
+    else                                                                   \
+      R##_e--;                                                             \
+                                                                           \
+    /* Normalize, i.e. make the most significant bit of the                \
+       denominator set. */                                                 \
+    _FP_FRAC_SLL_4(Y, _FP_WFRACXBITS_##fs);                                \
+                                                                           \
+    for (_i = 3; ; _i--)                                                   \
+      {                                                                            \
+        if (X##_f[3] == Y##_f[3])                                          \
+          {                                                                \
+            /* This is a special case, not an optimization                 \
+               (X##_f[3]/Y##_f[3] would not fit into UWtype).              \
+               As X## is guaranteed to be < Y,  R##_f[_i] can be either            \
+               (UWtype)-1 or (UWtype)-2.  */                               \
+            R##_f[_i] = -1;                                                \
+            if (!_i)                                                       \
+             break;                                                        \
+            __FP_FRAC_SUB_4(X##_f[3], X##_f[2], X##_f[1], X##_f[0],        \
+                           Y##_f[2], Y##_f[1], Y##_f[0], 0,                \
+                           X##_f[2], X##_f[1], X##_f[0], _n_f[_i]);        \
+            _FP_FRAC_SUB_4(X, Y, X);                                       \
+            if (X##_f[3] > Y##_f[3])                                       \
+              {                                                                    \
+                R##_f[_i] = -2;                                                    \
+                _FP_FRAC_ADD_4(X, Y, X);                                   \
+              }                                                                    \
+          }                                                                \
+        else                                                               \
+          {                                                                \
+            udiv_qrnnd(R##_f[_i], X##_f[3], X##_f[3], X##_f[2], Y##_f[3]);  \
+            umul_ppppmnnn(_m_f[3], _m_f[2], _m_f[1], _m_f[0],              \
+                         R##_f[_i], Y##_f[2], Y##_f[1], Y##_f[0]);         \
+            X##_f[2] = X##_f[1];                                           \
+            X##_f[1] = X##_f[0];                                           \
+            X##_f[0] = _n_f[_i];                                           \
+            if (_FP_FRAC_GT_4(_m, X))                                      \
+              {                                                                    \
+                R##_f[_i]--;                                               \
+                _FP_FRAC_ADD_4(X, Y, X);                                   \
+                if (_FP_FRAC_GE_4(X, Y) && _FP_FRAC_GT_4(_m, X))           \
+                  {                                                        \
+                   R##_f[_i]--;                                            \
+                   _FP_FRAC_ADD_4(X, Y, X);                                \
+                  }                                                        \
+              }                                                                    \
+            _FP_FRAC_DEC_4(X, _m);                                         \
+            if (!_i)                                                       \
+             {                                                             \
+               if (!_FP_FRAC_EQ_4(X, _m))                                  \
+                 R##_f[0] |= _FP_WORK_STICKY;                              \
+               break;                                                      \
+             }                                                             \
+          }                                                                \
+      }                                                                            \
+  } while (0)
+
+
+/*
+ * Square root algorithms:
+ * We have just one right now, maybe Newton approximation
+ * should be added for those machines where division is fast.
+ */
+#define _FP_SQRT_MEAT_4(R, S, T, X, q)                         \
+  do {                                                         \
+    while (q)                                                  \
+      {                                                                \
+       T##_f[3] = S##_f[3] + q;                                \
+       if (T##_f[3] <= X##_f[3])                               \
+         {                                                     \
+           S##_f[3] = T##_f[3] + q;                            \
+           X##_f[3] -= T##_f[3];                               \
+           R##_f[3] += q;                                      \
+         }                                                     \
+       _FP_FRAC_SLL_4(X, 1);                                   \
+       q >>= 1;                                                \
+      }                                                                \
+    q = (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE - 1);                        \
+    while (q)                                                  \
+      {                                                                \
+       T##_f[2] = S##_f[2] + q;                                \
+       T##_f[3] = S##_f[3];                                    \
+       if (T##_f[3] < X##_f[3] ||                              \
+           (T##_f[3] == X##_f[3] && T##_f[2] <= X##_f[2]))     \
+         {                                                     \
+           S##_f[2] = T##_f[2] + q;                            \
+           S##_f[3] += (T##_f[2] > S##_f[2]);                  \
+           __FP_FRAC_DEC_2(X##_f[3], X##_f[2],                 \
+                           T##_f[3], T##_f[2]);                \
+           R##_f[2] += q;                                      \
+         }                                                     \
+       _FP_FRAC_SLL_4(X, 1);                                   \
+       q >>= 1;                                                \
+      }                                                                \
+    q = (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE - 1);                        \
+    while (q)                                                  \
+      {                                                                \
+       T##_f[1] = S##_f[1] + q;                                \
+       T##_f[2] = S##_f[2];                                    \
+       T##_f[3] = S##_f[3];                                    \
+       if (T##_f[3] < X##_f[3] ||                              \
+           (T##_f[3] == X##_f[3] && (T##_f[2] < X##_f[2] ||    \
+            (T##_f[2] == X##_f[2] && T##_f[1] <= X##_f[1]))))  \
+         {                                                     \
+           S##_f[1] = T##_f[1] + q;                            \
+           S##_f[2] += (T##_f[1] > S##_f[1]);                  \
+           S##_f[3] += (T##_f[2] > S##_f[2]);                  \
+           __FP_FRAC_DEC_3(X##_f[3], X##_f[2], X##_f[1],       \
+                           T##_f[3], T##_f[2], T##_f[1]);      \
+           R##_f[1] += q;                                      \
+         }                                                     \
+       _FP_FRAC_SLL_4(X, 1);                                   \
+       q >>= 1;                                                \
+      }                                                                \
+    q = (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE - 1);                        \
+    while (q != _FP_WORK_ROUND)                                        \
+      {                                                                \
+       T##_f[0] = S##_f[0] + q;                                \
+       T##_f[1] = S##_f[1];                                    \
+       T##_f[2] = S##_f[2];                                    \
+       T##_f[3] = S##_f[3];                                    \
+       if (_FP_FRAC_GE_4(X,T))                                 \
+         {                                                     \
+           S##_f[0] = T##_f[0] + q;                            \
+           S##_f[1] += (T##_f[0] > S##_f[0]);                  \
+           S##_f[2] += (T##_f[1] > S##_f[1]);                  \
+           S##_f[3] += (T##_f[2] > S##_f[2]);                  \
+           _FP_FRAC_DEC_4(X, T);                               \
+           R##_f[0] += q;                                      \
+         }                                                     \
+       _FP_FRAC_SLL_4(X, 1);                                   \
+       q >>= 1;                                                \
+      }                                                                \
+    if (!_FP_FRAC_ZEROP_4(X))                                  \
+      {                                                                \
+       if (_FP_FRAC_GT_4(X,S))                                 \
+         R##_f[0] |= _FP_WORK_ROUND;                           \
+       R##_f[0] |= _FP_WORK_STICKY;                            \
+      }                                                                \
+  } while (0)
+
+
+/*
+ * Internals 
+ */
+
+#define __FP_FRAC_SET_4(X,I3,I2,I1,I0)                                 \
+  (X##_f[3] = I3, X##_f[2] = I2, X##_f[1] = I1, X##_f[0] = I0)
+
+#ifndef __FP_FRAC_ADD_3
+#define __FP_FRAC_ADD_3(r2,r1,r0,x2,x1,x0,y2,y1,y0)            \
+  do {                                                         \
+    _FP_W_TYPE _c1, _c2;                                       \
+    r0 = x0 + y0;                                              \
+    _c1 = r0 < x0;                                             \
+    r1 = x1 + y1;                                              \
+    _c2 = r1 < x1;                                             \
+    r1 += _c1;                                                 \
+    _c2 |= r1 < _c1;                                           \
+    r2 = x2 + y2 + _c2;                                                \
+  } while (0)
+#endif
+
+#ifndef __FP_FRAC_ADD_4
+#define __FP_FRAC_ADD_4(r3,r2,r1,r0,x3,x2,x1,x0,y3,y2,y1,y0)   \
+  do {                                                         \
+    _FP_W_TYPE _c1, _c2, _c3;                                  \
+    r0 = x0 + y0;                                              \
+    _c1 = r0 < x0;                                             \
+    r1 = x1 + y1;                                              \
+    _c2 = r1 < x1;                                             \
+    r1 += _c1;                                                 \
+    _c2 |= r1 < _c1;                                           \
+    r2 = x2 + y2;                                              \
+    _c3 = r2 < x2;                                             \
+    r2 += _c2;                                                 \
+    _c3 |= r2 < _c2;                                           \
+    r3 = x3 + y3 + _c3;                                                \
+  } while (0)
+#endif
+
+#ifndef __FP_FRAC_SUB_3
+#define __FP_FRAC_SUB_3(r2,r1,r0,x2,x1,x0,y2,y1,y0)            \
+  do {                                                         \
+    _FP_W_TYPE _c1, _c2;                                       \
+    r0 = x0 - y0;                                              \
+    _c1 = r0 > x0;                                             \
+    r1 = x1 - y1;                                              \
+    _c2 = r1 > x1;                                             \
+    r1 -= _c1;                                                 \
+    _c2 |= _c1 && (y1 == x1);                                  \
+    r2 = x2 - y2 - _c2;                                                \
+  } while (0)
+#endif
+
+#ifndef __FP_FRAC_SUB_4
+#define __FP_FRAC_SUB_4(r3,r2,r1,r0,x3,x2,x1,x0,y3,y2,y1,y0)   \
+  do {                                                         \
+    _FP_W_TYPE _c1, _c2, _c3;                                  \
+    r0 = x0 - y0;                                              \
+    _c1 = r0 > x0;                                             \
+    r1 = x1 - y1;                                              \
+    _c2 = r1 > x1;                                             \
+    r1 -= _c1;                                                 \
+    _c2 |= _c1 && (y1 == x1);                                  \
+    r2 = x2 - y2;                                              \
+    _c3 = r2 > x2;                                             \
+    r2 -= _c2;                                                 \
+    _c3 |= _c2 && (y2 == x2);                                  \
+    r3 = x3 - y3 - _c3;                                                \
+  } while (0)
+#endif
+
+#ifndef __FP_FRAC_DEC_3
+#define __FP_FRAC_DEC_3(x2,x1,x0,y2,y1,y0)                             \
+  do {                                                                 \
+    UWtype _t0, _t1, _t2;                                              \
+    _t0 = x0, _t1 = x1, _t2 = x2;                                      \
+    __FP_FRAC_SUB_3 (x2, x1, x0, _t2, _t1, _t0, y2, y1, y0);           \
+  } while (0)
+#endif
+
+#ifndef __FP_FRAC_DEC_4
+#define __FP_FRAC_DEC_4(x3,x2,x1,x0,y3,y2,y1,y0)                       \
+  do {                                                                 \
+    UWtype _t0, _t1, _t2, _t3;                                         \
+    _t0 = x0, _t1 = x1, _t2 = x2, _t3 = x3;                            \
+    __FP_FRAC_SUB_4 (x3,x2,x1,x0,_t3,_t2,_t1,_t0, y3,y2,y1,y0);                \
+  } while (0)
+#endif
+
+#ifndef __FP_FRAC_ADDI_4
+#define __FP_FRAC_ADDI_4(x3,x2,x1,x0,i)                                        \
+  do {                                                                 \
+    UWtype _t;                                                         \
+    _t = ((x0 += i) < i);                                              \
+    x1 += _t; _t = (x1 < _t);                                          \
+    x2 += _t; _t = (x2 < _t);                                          \
+    x3 += _t;                                                          \
+  } while (0)
+#endif
+
+/* Convert FP values between word sizes. This appears to be more
+ * complicated than I'd have expected it to be, so these might be
+ * wrong... These macros are in any case somewhat bogus because they
+ * use information about what various FRAC_n variables look like 
+ * internally [eg, that 2 word vars are X_f0 and x_f1]. But so do
+ * the ones in op-2.h and op-1.h. 
+ */
+#define _FP_FRAC_COPY_1_4(D, S)                (D##_f = S##_f[0])
+
+#define _FP_FRAC_COPY_2_4(D, S)                        \
+do {                                           \
+  D##_f0 = S##_f[0];                           \
+  D##_f1 = S##_f[1];                           \
+} while (0)
+
+/* Assembly/disassembly for converting to/from integral types.  
+ * No shifting or overflow handled here.
+ */
+/* Put the FP value X into r, which is an integer of size rsize. */
+#define _FP_FRAC_ASSEMBLE_4(r, X, rsize)                               \
+  do {                                                                 \
+    if (rsize <= _FP_W_TYPE_SIZE)                                      \
+      r = X##_f[0];                                                    \
+    else if (rsize <= 2*_FP_W_TYPE_SIZE)                               \
+    {                                                                  \
+      r = X##_f[1];                                                    \
+      r <<= _FP_W_TYPE_SIZE;                                           \
+      r += X##_f[0];                                                   \
+    }                                                                  \
+    else                                                               \
+    {                                                                  \
+      /* I'm feeling lazy so we deal with int == 3words (implausible)*/        \
+      /* and int == 4words as a single case.                    */     \
+      r = X##_f[3];                                                    \
+      r <<= _FP_W_TYPE_SIZE;                                           \
+      r += X##_f[2];                                                   \
+      r <<= _FP_W_TYPE_SIZE;                                           \
+      r += X##_f[1];                                                   \
+      r <<= _FP_W_TYPE_SIZE;                                           \
+      r += X##_f[0];                                                   \
+    }                                                                  \
+  } while (0)
+
+/* "No disassemble Number Five!" */
+/* move an integer of size rsize into X's fractional part. We rely on
+ * the _f[] array consisting of words of size _FP_W_TYPE_SIZE to avoid
+ * having to mask the values we store into it.
+ */
+#define _FP_FRAC_DISASSEMBLE_4(X, r, rsize)                            \
+  do {                                                                 \
+    X##_f[0] = r;                                                      \
+    X##_f[1] = (rsize <= _FP_W_TYPE_SIZE ? 0 : r >> _FP_W_TYPE_SIZE);  \
+    X##_f[2] = (rsize <= 2*_FP_W_TYPE_SIZE ? 0 : r >> 2*_FP_W_TYPE_SIZE); \
+    X##_f[3] = (rsize <= 3*_FP_W_TYPE_SIZE ? 0 : r >> 3*_FP_W_TYPE_SIZE); \
+  } while (0);
+
+#define _FP_FRAC_COPY_4_1(D, S)                        \
+do {                                           \
+  D##_f[0] = S##_f;                            \
+  D##_f[1] = D##_f[2] = D##_f[3] = 0;          \
+} while (0)
+
+#define _FP_FRAC_COPY_4_2(D, S)                        \
+do {                                           \
+  D##_f[0] = S##_f0;                           \
+  D##_f[1] = S##_f1;                           \
+  D##_f[2] = D##_f[3] = 0;                     \
+} while (0)
+
+#define _FP_FRAC_COPY_4_4(D,S) _FP_FRAC_COPY_4(D,S)
diff --git a/libgcc/soft-fp/op-8.h b/libgcc/soft-fp/op-8.h
new file mode 100644 (file)
index 0000000..e0612a5
--- /dev/null
@@ -0,0 +1,111 @@
+/* Software floating-point emulation.
+   Basic eight-word fraction declaration and manipulation.
+   Copyright (C) 1997,1998,1999,2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com),
+                 Jakub Jelinek (jj@ultra.linux.cz) and
+                 Peter Maydell (pmaydell@chiark.greenend.org.uk).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+/* We need just a few things from here for op-4, if we ever need some
+   other macros, they can be added. */
+#define _FP_FRAC_DECL_8(X)     _FP_W_TYPE X##_f[8]
+#define _FP_FRAC_HIGH_8(X)     (X##_f[7])
+#define _FP_FRAC_LOW_8(X)      (X##_f[0])
+#define _FP_FRAC_WORD_8(X,w)   (X##_f[w])
+
+#define _FP_FRAC_SLL_8(X,N)                                            \
+  do {                                                                 \
+    _FP_I_TYPE _up, _down, _skip, _i;                                  \
+    _skip = (N) / _FP_W_TYPE_SIZE;                                     \
+    _up = (N) % _FP_W_TYPE_SIZE;                                       \
+    _down = _FP_W_TYPE_SIZE - _up;                                     \
+    if (!_up)                                                          \
+      for (_i = 7; _i >= _skip; --_i)                                  \
+       X##_f[_i] = X##_f[_i-_skip];                                    \
+    else                                                               \
+      {                                                                        \
+       for (_i = 7; _i > _skip; --_i)                                  \
+         X##_f[_i] = X##_f[_i-_skip] << _up                            \
+                     | X##_f[_i-_skip-1] >> _down;                     \
+       X##_f[_i--] = X##_f[0] << _up;                                  \
+      }                                                                        \
+    for (; _i >= 0; --_i)                                              \
+      X##_f[_i] = 0;                                                   \
+  } while (0)
+
+#define _FP_FRAC_SRL_8(X,N)                                            \
+  do {                                                                 \
+    _FP_I_TYPE _up, _down, _skip, _i;                                  \
+    _skip = (N) / _FP_W_TYPE_SIZE;                                     \
+    _down = (N) % _FP_W_TYPE_SIZE;                                     \
+    _up = _FP_W_TYPE_SIZE - _down;                                     \
+    if (!_down)                                                                \
+      for (_i = 0; _i <= 7-_skip; ++_i)                                        \
+       X##_f[_i] = X##_f[_i+_skip];                                    \
+    else                                                               \
+      {                                                                        \
+       for (_i = 0; _i < 7-_skip; ++_i)                                \
+         X##_f[_i] = X##_f[_i+_skip] >> _down                          \
+                     | X##_f[_i+_skip+1] << _up;                       \
+       X##_f[_i++] = X##_f[7] >> _down;                                \
+      }                                                                        \
+    for (; _i < 8; ++_i)                                               \
+      X##_f[_i] = 0;                                                   \
+  } while (0)
+
+
+/* Right shift with sticky-lsb. 
+ * What this actually means is that we do a standard right-shift,
+ * but that if any of the bits that fall off the right hand side
+ * were one then we always set the LSbit.
+ */
+#define _FP_FRAC_SRS_8(X,N,size)                                       \
+  do {                                                                 \
+    _FP_I_TYPE _up, _down, _skip, _i;                                  \
+    _FP_W_TYPE _s;                                                     \
+    _skip = (N) / _FP_W_TYPE_SIZE;                                     \
+    _down = (N) % _FP_W_TYPE_SIZE;                                     \
+    _up = _FP_W_TYPE_SIZE - _down;                                     \
+    for (_s = _i = 0; _i < _skip; ++_i)                                        \
+      _s |= X##_f[_i];                                                 \
+    if (!_down)                                                                \
+      for (_i = 0; _i <= 7-_skip; ++_i)                                        \
+       X##_f[_i] = X##_f[_i+_skip];                                    \
+    else                                                               \
+      {                                                                        \
+       _s |= X##_f[_i] << _up;                                         \
+       for (_i = 0; _i < 7-_skip; ++_i)                                \
+         X##_f[_i] = X##_f[_i+_skip] >> _down                          \
+                     | X##_f[_i+_skip+1] << _up;                       \
+       X##_f[_i++] = X##_f[7] >> _down;                                \
+      }                                                                        \
+    for (; _i < 8; ++_i)                                               \
+      X##_f[_i] = 0;                                                   \
+    /* don't fix the LSB until the very end when we're sure f[0] is stable */  \
+    X##_f[0] |= (_s != 0);                                             \
+  } while (0)
+
diff --git a/libgcc/soft-fp/op-common.h b/libgcc/soft-fp/op-common.h
new file mode 100644 (file)
index 0000000..ef11b52
--- /dev/null
@@ -0,0 +1,1359 @@
+/* Software floating-point emulation. Common operations.
+   Copyright (C) 1997,1998,1999,2006,2007 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com),
+                 Jakub Jelinek (jj@ultra.linux.cz),
+                 David S. Miller (davem@redhat.com) and
+                 Peter Maydell (pmaydell@chiark.greenend.org.uk).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#define _FP_DECL(wc, X)                                                \
+  _FP_I_TYPE X##_c __attribute__((unused)), X##_s, X##_e;      \
+  _FP_FRAC_DECL_##wc(X)
+
+/*
+ * Finish truely unpacking a native fp value by classifying the kind
+ * of fp value and normalizing both the exponent and the fraction.
+ */
+
+#define _FP_UNPACK_CANONICAL(fs, wc, X)                                        \
+do {                                                                   \
+  switch (X##_e)                                                       \
+  {                                                                    \
+  default:                                                             \
+    _FP_FRAC_HIGH_RAW_##fs(X) |= _FP_IMPLBIT_##fs;                     \
+    _FP_FRAC_SLL_##wc(X, _FP_WORKBITS);                                        \
+    X##_e -= _FP_EXPBIAS_##fs;                                         \
+    X##_c = FP_CLS_NORMAL;                                             \
+    break;                                                             \
+                                                                       \
+  case 0:                                                              \
+    if (_FP_FRAC_ZEROP_##wc(X))                                                \
+      X##_c = FP_CLS_ZERO;                                             \
+    else                                                               \
+      {                                                                        \
+       /* a denormalized number */                                     \
+       _FP_I_TYPE _shift;                                              \
+       _FP_FRAC_CLZ_##wc(_shift, X);                                   \
+       _shift -= _FP_FRACXBITS_##fs;                                   \
+       _FP_FRAC_SLL_##wc(X, (_shift+_FP_WORKBITS));                    \
+       X##_e -= _FP_EXPBIAS_##fs - 1 + _shift;                         \
+       X##_c = FP_CLS_NORMAL;                                          \
+       FP_SET_EXCEPTION(FP_EX_DENORM);                                 \
+      }                                                                        \
+    break;                                                             \
+                                                                       \
+  case _FP_EXPMAX_##fs:                                                        \
+    if (_FP_FRAC_ZEROP_##wc(X))                                                \
+      X##_c = FP_CLS_INF;                                              \
+    else                                                               \
+      {                                                                        \
+       X##_c = FP_CLS_NAN;                                             \
+       /* Check for signaling NaN */                                   \
+       if (!(_FP_FRAC_HIGH_RAW_##fs(X) & _FP_QNANBIT_##fs))            \
+         FP_SET_EXCEPTION(FP_EX_INVALID);                              \
+      }                                                                        \
+    break;                                                             \
+  }                                                                    \
+} while (0)
+
+/* Finish unpacking an fp value in semi-raw mode: the mantissa is
+   shifted by _FP_WORKBITS but the implicit MSB is not inserted and
+   other classification is not done.  */
+#define _FP_UNPACK_SEMIRAW(fs, wc, X)  _FP_FRAC_SLL_##wc(X, _FP_WORKBITS)
+
+/* A semi-raw value has overflowed to infinity.  Adjust the mantissa
+   and exponent appropriately.  */
+#define _FP_OVERFLOW_SEMIRAW(fs, wc, X)                        \
+do {                                                   \
+  if (FP_ROUNDMODE == FP_RND_NEAREST                   \
+      || (FP_ROUNDMODE == FP_RND_PINF && !X##_s)       \
+      || (FP_ROUNDMODE == FP_RND_MINF && X##_s))       \
+    {                                                  \
+      X##_e = _FP_EXPMAX_##fs;                         \
+      _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc);         \
+    }                                                  \
+  else                                                 \
+    {                                                  \
+      X##_e = _FP_EXPMAX_##fs - 1;                     \
+      _FP_FRAC_SET_##wc(X, _FP_MAXFRAC_##wc);          \
+    }                                                  \
+    FP_SET_EXCEPTION(FP_EX_INEXACT);                   \
+    FP_SET_EXCEPTION(FP_EX_OVERFLOW);                  \
+} while (0)
+
+/* Check for a semi-raw value being a signaling NaN and raise the
+   invalid exception if so.  */
+#define _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, X)                    \
+do {                                                           \
+  if (X##_e == _FP_EXPMAX_##fs                                 \
+      && !_FP_FRAC_ZEROP_##wc(X)                               \
+      && !(_FP_FRAC_HIGH_##fs(X) & _FP_QNANBIT_SH_##fs))       \
+    FP_SET_EXCEPTION(FP_EX_INVALID);                           \
+} while (0)
+
+/* Choose a NaN result from an operation on two semi-raw NaN
+   values.  */
+#define _FP_CHOOSENAN_SEMIRAW(fs, wc, R, X, Y, OP)                     \
+do {                                                                   \
+  /* _FP_CHOOSENAN expects raw values, so shift as required.  */       \
+  _FP_FRAC_SRL_##wc(X, _FP_WORKBITS);                                  \
+  _FP_FRAC_SRL_##wc(Y, _FP_WORKBITS);                                  \
+  _FP_CHOOSENAN(fs, wc, R, X, Y, OP);                                  \
+  _FP_FRAC_SLL_##wc(R, _FP_WORKBITS);                                  \
+} while (0)
+
+/* Test whether a biased exponent is normal (not zero or maximum).  */
+#define _FP_EXP_NORMAL(fs, wc, X)      (((X##_e + 1) & _FP_EXPMAX_##fs) > 1)
+
+/* Prepare to pack an fp value in semi-raw mode: the mantissa is
+   rounded and shifted right, with the rounding possibly increasing
+   the exponent (including changing a finite value to infinity).  */
+#define _FP_PACK_SEMIRAW(fs, wc, X)                            \
+do {                                                           \
+  _FP_ROUND(wc, X);                                            \
+  if (_FP_FRAC_HIGH_##fs(X)                                    \
+      & (_FP_OVERFLOW_##fs >> 1))                              \
+    {                                                          \
+      _FP_FRAC_HIGH_##fs(X) &= ~(_FP_OVERFLOW_##fs >> 1);      \
+      X##_e++;                                                 \
+      if (X##_e == _FP_EXPMAX_##fs)                            \
+       _FP_OVERFLOW_SEMIRAW(fs, wc, X);                        \
+    }                                                          \
+  _FP_FRAC_SRL_##wc(X, _FP_WORKBITS);                          \
+  if (!_FP_EXP_NORMAL(fs, wc, X) && !_FP_FRAC_ZEROP_##wc(X))   \
+    {                                                          \
+      if (X##_e == 0)                                          \
+       FP_SET_EXCEPTION(FP_EX_UNDERFLOW);                      \
+      else                                                     \
+       {                                                       \
+         if (!_FP_KEEPNANFRACP)                                \
+           {                                                   \
+             _FP_FRAC_SET_##wc(X, _FP_NANFRAC_##fs);           \
+             X##_s = _FP_NANSIGN_##fs;                         \
+           }                                                   \
+         else                                                  \
+           _FP_FRAC_HIGH_RAW_##fs(X) |= _FP_QNANBIT_##fs;      \
+       }                                                       \
+    }                                                          \
+} while (0)
+
+/*
+ * Before packing the bits back into the native fp result, take care
+ * of such mundane things as rounding and overflow.  Also, for some
+ * kinds of fp values, the original parts may not have been fully
+ * extracted -- but that is ok, we can regenerate them now.
+ */
+
+#define _FP_PACK_CANONICAL(fs, wc, X)                          \
+do {                                                           \
+  switch (X##_c)                                               \
+  {                                                            \
+  case FP_CLS_NORMAL:                                          \
+    X##_e += _FP_EXPBIAS_##fs;                                 \
+    if (X##_e > 0)                                             \
+      {                                                                \
+       _FP_ROUND(wc, X);                                       \
+       if (_FP_FRAC_OVERP_##wc(fs, X))                         \
+         {                                                     \
+           _FP_FRAC_CLEAR_OVERP_##wc(fs, X);                   \
+           X##_e++;                                            \
+         }                                                     \
+       _FP_FRAC_SRL_##wc(X, _FP_WORKBITS);                     \
+       if (X##_e >= _FP_EXPMAX_##fs)                           \
+         {                                                     \
+           /* overflow */                                      \
+           switch (FP_ROUNDMODE)                               \
+             {                                                 \
+             case FP_RND_NEAREST:                              \
+               X##_c = FP_CLS_INF;                             \
+               break;                                          \
+             case FP_RND_PINF:                                 \
+               if (!X##_s) X##_c = FP_CLS_INF;                 \
+               break;                                          \
+             case FP_RND_MINF:                                 \
+               if (X##_s) X##_c = FP_CLS_INF;                  \
+               break;                                          \
+             }                                                 \
+           if (X##_c == FP_CLS_INF)                            \
+             {                                                 \
+               /* Overflow to infinity */                      \
+               X##_e = _FP_EXPMAX_##fs;                        \
+               _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc);        \
+             }                                                 \
+           else                                                \
+             {                                                 \
+               /* Overflow to maximum normal */                \
+               X##_e = _FP_EXPMAX_##fs - 1;                    \
+               _FP_FRAC_SET_##wc(X, _FP_MAXFRAC_##wc);         \
+             }                                                 \
+           FP_SET_EXCEPTION(FP_EX_OVERFLOW);                   \
+            FP_SET_EXCEPTION(FP_EX_INEXACT);                   \
+         }                                                     \
+      }                                                                \
+    else                                                       \
+      {                                                                \
+       /* we've got a denormalized number */                   \
+       X##_e = -X##_e + 1;                                     \
+       if (X##_e <= _FP_WFRACBITS_##fs)                        \
+         {                                                     \
+           _FP_FRAC_SRS_##wc(X, X##_e, _FP_WFRACBITS_##fs);    \
+           _FP_ROUND(wc, X);                                   \
+           if (_FP_FRAC_HIGH_##fs(X)                           \
+               & (_FP_OVERFLOW_##fs >> 1))                     \
+             {                                                 \
+               X##_e = 1;                                      \
+               _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc);        \
+             }                                                 \
+           else                                                \
+             {                                                 \
+               X##_e = 0;                                      \
+               _FP_FRAC_SRL_##wc(X, _FP_WORKBITS);             \
+               FP_SET_EXCEPTION(FP_EX_UNDERFLOW);              \
+             }                                                 \
+         }                                                     \
+       else                                                    \
+         {                                                     \
+           /* underflow to zero */                             \
+           X##_e = 0;                                          \
+           if (!_FP_FRAC_ZEROP_##wc(X))                        \
+             {                                                 \
+               _FP_FRAC_SET_##wc(X, _FP_MINFRAC_##wc);         \
+               _FP_ROUND(wc, X);                               \
+               _FP_FRAC_LOW_##wc(X) >>= (_FP_WORKBITS);        \
+             }                                                 \
+           FP_SET_EXCEPTION(FP_EX_UNDERFLOW);                  \
+         }                                                     \
+      }                                                                \
+    break;                                                     \
+                                                               \
+  case FP_CLS_ZERO:                                            \
+    X##_e = 0;                                                 \
+    _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc);                   \
+    break;                                                     \
+                                                               \
+  case FP_CLS_INF:                                             \
+    X##_e = _FP_EXPMAX_##fs;                                   \
+    _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc);                   \
+    break;                                                     \
+                                                               \
+  case FP_CLS_NAN:                                             \
+    X##_e = _FP_EXPMAX_##fs;                                   \
+    if (!_FP_KEEPNANFRACP)                                     \
+      {                                                                \
+       _FP_FRAC_SET_##wc(X, _FP_NANFRAC_##fs);                 \
+       X##_s = _FP_NANSIGN_##fs;                               \
+      }                                                                \
+    else                                                       \
+      _FP_FRAC_HIGH_RAW_##fs(X) |= _FP_QNANBIT_##fs;           \
+    break;                                                     \
+  }                                                            \
+} while (0)
+
+/* This one accepts raw argument and not cooked,  returns
+ * 1 if X is a signaling NaN.
+ */
+#define _FP_ISSIGNAN(fs, wc, X)                                        \
+({                                                             \
+  int __ret = 0;                                               \
+  if (X##_e == _FP_EXPMAX_##fs)                                        \
+    {                                                          \
+      if (!_FP_FRAC_ZEROP_##wc(X)                              \
+         && !(_FP_FRAC_HIGH_RAW_##fs(X) & _FP_QNANBIT_##fs))   \
+       __ret = 1;                                              \
+    }                                                          \
+  __ret;                                                       \
+})
+
+
+
+
+
+/* Addition on semi-raw values.  */
+#define _FP_ADD_INTERNAL(fs, wc, R, X, Y, OP)                           \
+do {                                                                    \
+  if (X##_s == Y##_s)                                                   \
+    {                                                                   \
+      /* Addition.  */                                                  \
+      R##_s = X##_s;                                                    \
+      int ediff = X##_e - Y##_e;                                        \
+      if (ediff > 0)                                                    \
+       {                                                                \
+         R##_e = X##_e;                                                 \
+         if (Y##_e == 0)                                                \
+           {                                                            \
+             /* Y is zero or denormalized.  */                          \
+             if (_FP_FRAC_ZEROP_##wc(Y))                                \
+               {                                                        \
+                 _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, X);                   \
+                 _FP_FRAC_COPY_##wc(R, X);                              \
+                 goto add_done;                                         \
+               }                                                        \
+             else                                                       \
+               {                                                        \
+                 FP_SET_EXCEPTION(FP_EX_DENORM);                        \
+                 ediff--;                                               \
+                 if (ediff == 0)                                        \
+                   {                                                    \
+                     _FP_FRAC_ADD_##wc(R, X, Y);                        \
+                     goto add3;                                         \
+                   }                                                    \
+                 if (X##_e == _FP_EXPMAX_##fs)                          \
+                   {                                                    \
+                     _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, X);               \
+                     _FP_FRAC_COPY_##wc(R, X);                          \
+                     goto add_done;                                     \
+                   }                                                    \
+                 goto add1;                                             \
+               }                                                        \
+           }                                                            \
+         else if (X##_e == _FP_EXPMAX_##fs)                             \
+           {                                                            \
+             /* X is NaN or Inf, Y is normal.  */                       \
+             _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, X);                       \
+             _FP_FRAC_COPY_##wc(R, X);                                  \
+             goto add_done;                                             \
+           }                                                            \
+                                                                        \
+         /* Insert implicit MSB of Y.  */                               \
+         _FP_FRAC_HIGH_##fs(Y) |= _FP_IMPLBIT_SH_##fs;                  \
+                                                                        \
+       add1:                                                            \
+         /* Shift the mantissa of Y to the right EDIFF steps;           \
+            remember to account later for the implicit MSB of X.  */    \
+         if (ediff <= _FP_WFRACBITS_##fs)                               \
+           _FP_FRAC_SRS_##wc(Y, ediff, _FP_WFRACBITS_##fs);             \
+         else if (!_FP_FRAC_ZEROP_##wc(Y))                              \
+           _FP_FRAC_SET_##wc(Y, _FP_MINFRAC_##wc);                      \
+         _FP_FRAC_ADD_##wc(R, X, Y);                                    \
+       }                                                                \
+      else if (ediff < 0)                                               \
+       {                                                                \
+         ediff = -ediff;                                                \
+         R##_e = Y##_e;                                                 \
+         if (X##_e == 0)                                                \
+           {                                                            \
+             /* X is zero or denormalized.  */                          \
+             if (_FP_FRAC_ZEROP_##wc(X))                                \
+               {                                                        \
+                 _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, Y);                   \
+                 _FP_FRAC_COPY_##wc(R, Y);                              \
+                 goto add_done;                                         \
+               }                                                        \
+             else                                                       \
+               {                                                        \
+                 FP_SET_EXCEPTION(FP_EX_DENORM);                        \
+                 ediff--;                                               \
+                 if (ediff == 0)                                        \
+                   {                                                    \
+                     _FP_FRAC_ADD_##wc(R, Y, X);                        \
+                     goto add3;                                         \
+                   }                                                    \
+                 if (Y##_e == _FP_EXPMAX_##fs)                          \
+                   {                                                    \
+                     _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, Y);               \
+                     _FP_FRAC_COPY_##wc(R, Y);                          \
+                     goto add_done;                                     \
+                   }                                                    \
+                 goto add2;                                             \
+               }                                                        \
+           }                                                            \
+         else if (Y##_e == _FP_EXPMAX_##fs)                             \
+           {                                                            \
+             /* Y is NaN or Inf, X is normal.  */                       \
+             _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, Y);                       \
+             _FP_FRAC_COPY_##wc(R, Y);                                  \
+             goto add_done;                                             \
+           }                                                            \
+                                                                        \
+         /* Insert implicit MSB of X.  */                               \
+         _FP_FRAC_HIGH_##fs(X) |= _FP_IMPLBIT_SH_##fs;                  \
+                                                                        \
+       add2:                                                            \
+         /* Shift the mantissa of X to the right EDIFF steps;           \
+            remember to account later for the implicit MSB of Y.  */    \
+         if (ediff <= _FP_WFRACBITS_##fs)                               \
+           _FP_FRAC_SRS_##wc(X, ediff, _FP_WFRACBITS_##fs);             \
+         else if (!_FP_FRAC_ZEROP_##wc(X))                              \
+           _FP_FRAC_SET_##wc(X, _FP_MINFRAC_##wc);                      \
+         _FP_FRAC_ADD_##wc(R, Y, X);                                    \
+       }                                                                \
+      else                                                              \
+       {                                                                \
+         /* ediff == 0.  */                                             \
+         if (!_FP_EXP_NORMAL(fs, wc, X))                                \
+           {                                                            \
+             if (X##_e == 0)                                            \
+               {                                                        \
+                 /* X and Y are zero or denormalized.  */               \
+                 R##_e = 0;                                             \
+                 if (_FP_FRAC_ZEROP_##wc(X))                            \
+                   {                                                    \
+                     if (!_FP_FRAC_ZEROP_##wc(Y))                       \
+                       FP_SET_EXCEPTION(FP_EX_DENORM);                  \
+                     _FP_FRAC_COPY_##wc(R, Y);                          \
+                     goto add_done;                                     \
+                   }                                                    \
+                 else if (_FP_FRAC_ZEROP_##wc(Y))                       \
+                   {                                                    \
+                     FP_SET_EXCEPTION(FP_EX_DENORM);                    \
+                     _FP_FRAC_COPY_##wc(R, X);                          \
+                     goto add_done;                                     \
+                   }                                                    \
+                 else                                                   \
+                   {                                                    \
+                     FP_SET_EXCEPTION(FP_EX_DENORM);                    \
+                     _FP_FRAC_ADD_##wc(R, X, Y);                        \
+                     if (_FP_FRAC_HIGH_##fs(R) & _FP_IMPLBIT_SH_##fs)   \
+                       {                                                \
+                         /* Normalized result.  */                      \
+                         _FP_FRAC_HIGH_##fs(R)                          \
+                           &= ~(_FP_W_TYPE)_FP_IMPLBIT_SH_##fs;         \
+                         R##_e = 1;                                     \
+                       }                                                \
+                     goto add_done;                                     \
+                   }                                                    \
+               }                                                        \
+             else                                                       \
+               {                                                        \
+                 /* X and Y are NaN or Inf.  */                         \
+                 _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, X);                   \
+                 _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, Y);                   \
+                 R##_e = _FP_EXPMAX_##fs;                               \
+                 if (_FP_FRAC_ZEROP_##wc(X))                            \
+                   _FP_FRAC_COPY_##wc(R, Y);                            \
+                 else if (_FP_FRAC_ZEROP_##wc(Y))                       \
+                   _FP_FRAC_COPY_##wc(R, X);                            \
+                 else                                                   \
+                   _FP_CHOOSENAN_SEMIRAW(fs, wc, R, X, Y, OP);          \
+                 goto add_done;                                         \
+               }                                                        \
+           }                                                            \
+         /* The exponents of X and Y, both normal, are equal.  The      \
+            implicit MSBs will always add to increase the               \
+            exponent.  */                                               \
+         _FP_FRAC_ADD_##wc(R, X, Y);                                    \
+         R##_e = X##_e + 1;                                             \
+         _FP_FRAC_SRS_##wc(R, 1, _FP_WFRACBITS_##fs);                   \
+         if (R##_e == _FP_EXPMAX_##fs)                                  \
+           /* Overflow to infinity (depending on rounding mode).  */    \
+           _FP_OVERFLOW_SEMIRAW(fs, wc, R);                             \
+         goto add_done;                                                 \
+       }                                                                \
+    add3:                                                               \
+      if (_FP_FRAC_HIGH_##fs(R) & _FP_IMPLBIT_SH_##fs)                  \
+       {                                                                \
+         /* Overflow.  */                                               \
+         _FP_FRAC_HIGH_##fs(R) &= ~(_FP_W_TYPE)_FP_IMPLBIT_SH_##fs;     \
+         R##_e++;                                                       \
+         _FP_FRAC_SRS_##wc(R, 1, _FP_WFRACBITS_##fs);                   \
+         if (R##_e == _FP_EXPMAX_##fs)                                  \
+           /* Overflow to infinity (depending on rounding mode).  */    \
+           _FP_OVERFLOW_SEMIRAW(fs, wc, R);                             \
+       }                                                                \
+    add_done: ;                                                                 \
+    }                                                                   \
+  else                                                                  \
+    {                                                                   \
+      /* Subtraction.  */                                               \
+      int ediff = X##_e - Y##_e;                                        \
+      if (ediff > 0)                                                    \
+       {                                                                \
+         R##_e = X##_e;                                                 \
+         R##_s = X##_s;                                                 \
+         if (Y##_e == 0)                                                \
+           {                                                            \
+             /* Y is zero or denormalized.  */                          \
+             if (_FP_FRAC_ZEROP_##wc(Y))                                \
+               {                                                        \
+                 _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, X);                   \
+                 _FP_FRAC_COPY_##wc(R, X);                              \
+                 goto sub_done;                                         \
+               }                                                        \
+             else                                                       \
+               {                                                        \
+                 FP_SET_EXCEPTION(FP_EX_DENORM);                        \
+                 ediff--;                                               \
+                 if (ediff == 0)                                        \
+                   {                                                    \
+                     _FP_FRAC_SUB_##wc(R, X, Y);                        \
+                     goto sub3;                                         \
+                   }                                                    \
+                 if (X##_e == _FP_EXPMAX_##fs)                          \
+                   {                                                    \
+                     _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, X);               \
+                     _FP_FRAC_COPY_##wc(R, X);                          \
+                     goto sub_done;                                     \
+                   }                                                    \
+                 goto sub1;                                             \
+               }                                                        \
+           }                                                            \
+         else if (X##_e == _FP_EXPMAX_##fs)                             \
+           {                                                            \
+             /* X is NaN or Inf, Y is normal.  */                       \
+             _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, X);                       \
+             _FP_FRAC_COPY_##wc(R, X);                                  \
+             goto sub_done;                                             \
+           }                                                            \
+                                                                        \
+         /* Insert implicit MSB of Y.  */                               \
+         _FP_FRAC_HIGH_##fs(Y) |= _FP_IMPLBIT_SH_##fs;                  \
+                                                                        \
+       sub1:                                                            \
+         /* Shift the mantissa of Y to the right EDIFF steps;           \
+            remember to account later for the implicit MSB of X.  */    \
+         if (ediff <= _FP_WFRACBITS_##fs)                               \
+           _FP_FRAC_SRS_##wc(Y, ediff, _FP_WFRACBITS_##fs);             \
+         else if (!_FP_FRAC_ZEROP_##wc(Y))                              \
+           _FP_FRAC_SET_##wc(Y, _FP_MINFRAC_##wc);                      \
+         _FP_FRAC_SUB_##wc(R, X, Y);                                    \
+       }                                                                \
+      else if (ediff < 0)                                               \
+       {                                                                \
+         ediff = -ediff;                                                \
+         R##_e = Y##_e;                                                 \
+         R##_s = Y##_s;                                                 \
+         if (X##_e == 0)                                                \
+           {                                                            \
+             /* X is zero or denormalized.  */                          \
+             if (_FP_FRAC_ZEROP_##wc(X))                                \
+               {                                                        \
+                 _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, Y);                   \
+                 _FP_FRAC_COPY_##wc(R, Y);                              \
+                 goto sub_done;                                         \
+               }                                                        \
+             else                                                       \
+               {                                                        \
+                 FP_SET_EXCEPTION(FP_EX_DENORM);                        \
+                 ediff--;                                               \
+                 if (ediff == 0)                                        \
+                   {                                                    \
+                     _FP_FRAC_SUB_##wc(R, Y, X);                        \
+                     goto sub3;                                         \
+                   }                                                    \
+                 if (Y##_e == _FP_EXPMAX_##fs)                          \
+                   {                                                    \
+                     _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, Y);               \
+                     _FP_FRAC_COPY_##wc(R, Y);                          \
+                     goto sub_done;                                     \
+                   }                                                    \
+                 goto sub2;                                             \
+               }                                                        \
+           }                                                            \
+         else if (Y##_e == _FP_EXPMAX_##fs)                             \
+           {                                                            \
+             /* Y is NaN or Inf, X is normal.  */                       \
+             _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, Y);                       \
+             _FP_FRAC_COPY_##wc(R, Y);                                  \
+             goto sub_done;                                             \
+           }                                                            \
+                                                                        \
+         /* Insert implicit MSB of X.  */                               \
+         _FP_FRAC_HIGH_##fs(X) |= _FP_IMPLBIT_SH_##fs;                  \
+                                                                        \
+       sub2:                                                            \
+         /* Shift the mantissa of X to the right EDIFF steps;           \
+            remember to account later for the implicit MSB of Y.  */    \
+         if (ediff <= _FP_WFRACBITS_##fs)                               \
+           _FP_FRAC_SRS_##wc(X, ediff, _FP_WFRACBITS_##fs);             \
+         else if (!_FP_FRAC_ZEROP_##wc(X))                              \
+           _FP_FRAC_SET_##wc(X, _FP_MINFRAC_##wc);                      \
+         _FP_FRAC_SUB_##wc(R, Y, X);                                    \
+       }                                                                \
+      else                                                              \
+       {                                                                \
+         /* ediff == 0.  */                                             \
+         if (!_FP_EXP_NORMAL(fs, wc, X))                                \
+           {                                                            \
+             if (X##_e == 0)                                            \
+               {                                                        \
+                 /* X and Y are zero or denormalized.  */               \
+                 R##_e = 0;                                             \
+                 if (_FP_FRAC_ZEROP_##wc(X))                            \
+                   {                                                    \
+                     _FP_FRAC_COPY_##wc(R, Y);                          \
+                     if (_FP_FRAC_ZEROP_##wc(Y))                        \
+                       R##_s = (FP_ROUNDMODE == FP_RND_MINF);           \
+                     else                                               \
+                       {                                                \
+                         FP_SET_EXCEPTION(FP_EX_DENORM);                \
+                         R##_s = Y##_s;                                 \
+                       }                                                \
+                     goto sub_done;                                     \
+                   }                                                    \
+                 else if (_FP_FRAC_ZEROP_##wc(Y))                       \
+                   {                                                    \
+                     FP_SET_EXCEPTION(FP_EX_DENORM);                    \
+                     _FP_FRAC_COPY_##wc(R, X);                          \
+                     R##_s = X##_s;                                     \
+                     goto sub_done;                                     \
+                   }                                                    \
+                 else                                                   \
+                   {                                                    \
+                     FP_SET_EXCEPTION(FP_EX_DENORM);                    \
+                     _FP_FRAC_SUB_##wc(R, X, Y);                        \
+                     R##_s = X##_s;                                     \
+                     if (_FP_FRAC_HIGH_##fs(R) & _FP_IMPLBIT_SH_##fs)   \
+                       {                                                \
+                         /* |X| < |Y|, negate result.  */               \
+                         _FP_FRAC_SUB_##wc(R, Y, X);                    \
+                         R##_s = Y##_s;                                 \
+                       }                                                \
+                     else if (_FP_FRAC_ZEROP_##wc(R))                   \
+                       R##_s = (FP_ROUNDMODE == FP_RND_MINF);           \
+                     goto sub_done;                                     \
+                   }                                                    \
+               }                                                        \
+             else                                                       \
+               {                                                        \
+                 /* X and Y are NaN or Inf, of opposite signs.  */      \
+                 _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, X);                   \
+                 _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, Y);                   \
+                 R##_e = _FP_EXPMAX_##fs;                               \
+                 if (_FP_FRAC_ZEROP_##wc(X))                            \
+                   {                                                    \
+                     if (_FP_FRAC_ZEROP_##wc(Y))                        \
+                       {                                                \
+                         /* Inf - Inf.  */                              \
+                         R##_s = _FP_NANSIGN_##fs;                      \
+                         _FP_FRAC_SET_##wc(R, _FP_NANFRAC_##fs);        \
+                         _FP_FRAC_SLL_##wc(R, _FP_WORKBITS);            \
+                         FP_SET_EXCEPTION(FP_EX_INVALID);               \
+                       }                                                \
+                     else                                               \
+                       {                                                \
+                         /* Inf - NaN.  */                              \
+                         R##_s = Y##_s;                                 \
+                         _FP_FRAC_COPY_##wc(R, Y);                      \
+                       }                                                \
+                   }                                                    \
+                 else                                                   \
+                   {                                                    \
+                     if (_FP_FRAC_ZEROP_##wc(Y))                        \
+                       {                                                \
+                         /* NaN - Inf.  */                              \
+                         R##_s = X##_s;                                 \
+                         _FP_FRAC_COPY_##wc(R, X);                      \
+                       }                                                \
+                     else                                               \
+                       {                                                \
+                         /* NaN - NaN.  */                              \
+                         _FP_CHOOSENAN_SEMIRAW(fs, wc, R, X, Y, OP);    \
+                       }                                                \
+                   }                                                    \
+                 goto sub_done;                                         \
+               }                                                        \
+           }                                                            \
+         /* The exponents of X and Y, both normal, are equal.  The      \
+            implicit MSBs cancel.  */                                   \
+         R##_e = X##_e;                                                 \
+         _FP_FRAC_SUB_##wc(R, X, Y);                                    \
+         R##_s = X##_s;                                                 \
+         if (_FP_FRAC_HIGH_##fs(R) & _FP_IMPLBIT_SH_##fs)               \
+           {                                                            \
+             /* |X| < |Y|, negate result.  */                           \
+             _FP_FRAC_SUB_##wc(R, Y, X);                                \
+             R##_s = Y##_s;                                             \
+           }                                                            \
+         else if (_FP_FRAC_ZEROP_##wc(R))                               \
+           {                                                            \
+             R##_e = 0;                                                 \
+             R##_s = (FP_ROUNDMODE == FP_RND_MINF);                     \
+             goto sub_done;                                             \
+           }                                                            \
+         goto norm;                                                     \
+       }                                                                \
+    sub3:                                                               \
+      if (_FP_FRAC_HIGH_##fs(R) & _FP_IMPLBIT_SH_##fs)                  \
+       {                                                                \
+         int diff;                                                      \
+         /* Carry into most significant bit of larger one of X and Y,   \
+            canceling it; renormalize.  */                              \
+         _FP_FRAC_HIGH_##fs(R) &= _FP_IMPLBIT_SH_##fs - 1;              \
+       norm:                                                            \
+         _FP_FRAC_CLZ_##wc(diff, R);                                    \
+         diff -= _FP_WFRACXBITS_##fs;                                   \
+         _FP_FRAC_SLL_##wc(R, diff);                                    \
+         if (R##_e <= diff)                                             \
+           {                                                            \
+             /* R is denormalized.  */                                  \
+             diff = diff - R##_e + 1;                                   \
+             _FP_FRAC_SRS_##wc(R, diff, _FP_WFRACBITS_##fs);            \
+             R##_e = 0;                                                 \
+           }                                                            \
+         else                                                           \
+           {                                                            \
+             R##_e -= diff;                                             \
+             _FP_FRAC_HIGH_##fs(R) &= ~(_FP_W_TYPE)_FP_IMPLBIT_SH_##fs; \
+           }                                                            \
+       }                                                                \
+    sub_done: ;                                                                 \
+    }                                                                   \
+} while (0)
+
+#define _FP_ADD(fs, wc, R, X, Y) _FP_ADD_INTERNAL(fs, wc, R, X, Y, '+')
+#define _FP_SUB(fs, wc, R, X, Y)                                           \
+  do {                                                                     \
+    if (!(Y##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(Y))) Y##_s ^= 1; \
+    _FP_ADD_INTERNAL(fs, wc, R, X, Y, '-');                                \
+  } while (0)
+
+
+/*
+ * Main negation routine.  FIXME -- when we care about setting exception
+ * bits reliably, this will not do.  We should examine all of the fp classes.
+ */
+
+#define _FP_NEG(fs, wc, R, X)          \
+  do {                                 \
+    _FP_FRAC_COPY_##wc(R, X);          \
+    R##_c = X##_c;                     \
+    R##_e = X##_e;                     \
+    R##_s = 1 ^ X##_s;                 \
+  } while (0)
+
+
+/*
+ * Main multiplication routine.  The input values should be cooked.
+ */
+
+#define _FP_MUL(fs, wc, R, X, Y)                       \
+do {                                                   \
+  R##_s = X##_s ^ Y##_s;                               \
+  switch (_FP_CLS_COMBINE(X##_c, Y##_c))               \
+  {                                                    \
+  case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_NORMAL):   \
+    R##_c = FP_CLS_NORMAL;                             \
+    R##_e = X##_e + Y##_e + 1;                         \
+                                                       \
+    _FP_MUL_MEAT_##fs(R,X,Y);                          \
+                                                       \
+    if (_FP_FRAC_OVERP_##wc(fs, R))                    \
+      _FP_FRAC_SRS_##wc(R, 1, _FP_WFRACBITS_##fs);     \
+    else                                               \
+      R##_e--;                                         \
+    break;                                             \
+                                                       \
+  case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_NAN):         \
+    _FP_CHOOSENAN(fs, wc, R, X, Y, '*');               \
+    break;                                             \
+                                                       \
+  case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_NORMAL):      \
+  case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_INF):         \
+  case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_ZERO):                \
+    R##_s = X##_s;                                     \
+                                                       \
+  case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_INF):         \
+  case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_NORMAL):      \
+  case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_NORMAL):     \
+  case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_ZERO):       \
+    _FP_FRAC_COPY_##wc(R, X);                          \
+    R##_c = X##_c;                                     \
+    break;                                             \
+                                                       \
+  case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_NAN):      \
+  case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_NAN):         \
+  case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_NAN):                \
+    R##_s = Y##_s;                                     \
+                                                       \
+  case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_INF):      \
+  case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_ZERO):     \
+    _FP_FRAC_COPY_##wc(R, Y);                          \
+    R##_c = Y##_c;                                     \
+    break;                                             \
+                                                       \
+  case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_ZERO):                \
+  case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_INF):                \
+    R##_s = _FP_NANSIGN_##fs;                          \
+    R##_c = FP_CLS_NAN;                                        \
+    _FP_FRAC_SET_##wc(R, _FP_NANFRAC_##fs);            \
+    FP_SET_EXCEPTION(FP_EX_INVALID);                   \
+    break;                                             \
+                                                       \
+  default:                                             \
+    abort();                                           \
+  }                                                    \
+} while (0)
+
+
+/*
+ * Main division routine.  The input values should be cooked.
+ */
+
+#define _FP_DIV(fs, wc, R, X, Y)                       \
+do {                                                   \
+  R##_s = X##_s ^ Y##_s;                               \
+  switch (_FP_CLS_COMBINE(X##_c, Y##_c))               \
+  {                                                    \
+  case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_NORMAL):   \
+    R##_c = FP_CLS_NORMAL;                             \
+    R##_e = X##_e - Y##_e;                             \
+                                                       \
+    _FP_DIV_MEAT_##fs(R,X,Y);                          \
+    break;                                             \
+                                                       \
+  case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_NAN):         \
+    _FP_CHOOSENAN(fs, wc, R, X, Y, '/');               \
+    break;                                             \
+                                                       \
+  case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_NORMAL):      \
+  case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_INF):         \
+  case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_ZERO):                \
+    R##_s = X##_s;                                     \
+    _FP_FRAC_COPY_##wc(R, X);                          \
+    R##_c = X##_c;                                     \
+    break;                                             \
+                                                       \
+  case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_NAN):      \
+  case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_NAN):         \
+  case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_NAN):                \
+    R##_s = Y##_s;                                     \
+    _FP_FRAC_COPY_##wc(R, Y);                          \
+    R##_c = Y##_c;                                     \
+    break;                                             \
+                                                       \
+  case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_INF):      \
+  case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_INF):                \
+  case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_NORMAL):     \
+    R##_c = FP_CLS_ZERO;                               \
+    break;                                             \
+                                                       \
+  case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_ZERO):     \
+    FP_SET_EXCEPTION(FP_EX_DIVZERO);                   \
+  case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_ZERO):                \
+  case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_NORMAL):      \
+    R##_c = FP_CLS_INF;                                        \
+    break;                                             \
+                                                       \
+  case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_INF):         \
+  case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_ZERO):       \
+    R##_s = _FP_NANSIGN_##fs;                          \
+    R##_c = FP_CLS_NAN;                                        \
+    _FP_FRAC_SET_##wc(R, _FP_NANFRAC_##fs);            \
+    FP_SET_EXCEPTION(FP_EX_INVALID);                   \
+    break;                                             \
+                                                       \
+  default:                                             \
+    abort();                                           \
+  }                                                    \
+} while (0)
+
+
+/*
+ * Main differential comparison routine.  The inputs should be raw not
+ * cooked.  The return is -1,0,1 for normal values, 2 otherwise.
+ */
+
+#define _FP_CMP(fs, wc, ret, X, Y, un)                                 \
+  do {                                                                 \
+    /* NANs are unordered */                                           \
+    if ((X##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(X))          \
+       || (Y##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(Y)))       \
+      {                                                                        \
+       ret = un;                                                       \
+      }                                                                        \
+    else                                                               \
+      {                                                                        \
+       int __is_zero_x;                                                \
+       int __is_zero_y;                                                \
+                                                                       \
+       __is_zero_x = (!X##_e && _FP_FRAC_ZEROP_##wc(X)) ? 1 : 0;       \
+       __is_zero_y = (!Y##_e && _FP_FRAC_ZEROP_##wc(Y)) ? 1 : 0;       \
+                                                                       \
+       if (__is_zero_x && __is_zero_y)                                 \
+               ret = 0;                                                \
+       else if (__is_zero_x)                                           \
+               ret = Y##_s ? 1 : -1;                                   \
+       else if (__is_zero_y)                                           \
+               ret = X##_s ? -1 : 1;                                   \
+       else if (X##_s != Y##_s)                                        \
+         ret = X##_s ? -1 : 1;                                         \
+       else if (X##_e > Y##_e)                                         \
+         ret = X##_s ? -1 : 1;                                         \
+       else if (X##_e < Y##_e)                                         \
+         ret = X##_s ? 1 : -1;                                         \
+       else if (_FP_FRAC_GT_##wc(X, Y))                                \
+         ret = X##_s ? -1 : 1;                                         \
+       else if (_FP_FRAC_GT_##wc(Y, X))                                \
+         ret = X##_s ? 1 : -1;                                         \
+       else                                                            \
+         ret = 0;                                                      \
+      }                                                                        \
+  } while (0)
+
+
+/* Simplification for strict equality.  */
+
+#define _FP_CMP_EQ(fs, wc, ret, X, Y)                                      \
+  do {                                                                     \
+    /* NANs are unordered */                                               \
+    if ((X##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(X))              \
+       || (Y##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(Y)))           \
+      {                                                                            \
+       ret = 1;                                                            \
+      }                                                                            \
+    else                                                                   \
+      {                                                                            \
+       ret = !(X##_e == Y##_e                                              \
+               && _FP_FRAC_EQ_##wc(X, Y)                                   \
+               && (X##_s == Y##_s || (!X##_e && _FP_FRAC_ZEROP_##wc(X)))); \
+      }                                                                            \
+  } while (0)
+
+/* Version to test unordered.  */
+
+#define _FP_CMP_UNORD(fs, wc, ret, X, Y)                               \
+  do {                                                                 \
+    ret = ((X##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(X))       \
+          || (Y##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(Y)));   \
+  } while (0)
+
+/*
+ * Main square root routine.  The input value should be cooked.
+ */
+
+#define _FP_SQRT(fs, wc, R, X)                                         \
+do {                                                                   \
+    _FP_FRAC_DECL_##wc(T); _FP_FRAC_DECL_##wc(S);                      \
+    _FP_W_TYPE q;                                                      \
+    switch (X##_c)                                                     \
+    {                                                                  \
+    case FP_CLS_NAN:                                                   \
+       _FP_FRAC_COPY_##wc(R, X);                                       \
+       R##_s = X##_s;                                                  \
+       R##_c = FP_CLS_NAN;                                             \
+       break;                                                          \
+    case FP_CLS_INF:                                                   \
+       if (X##_s)                                                      \
+         {                                                             \
+           R##_s = _FP_NANSIGN_##fs;                                   \
+           R##_c = FP_CLS_NAN; /* NAN */                               \
+           _FP_FRAC_SET_##wc(R, _FP_NANFRAC_##fs);                     \
+           FP_SET_EXCEPTION(FP_EX_INVALID);                            \
+         }                                                             \
+       else                                                            \
+         {                                                             \
+           R##_s = 0;                                                  \
+           R##_c = FP_CLS_INF; /* sqrt(+inf) = +inf */                 \
+         }                                                             \
+       break;                                                          \
+    case FP_CLS_ZERO:                                                  \
+       R##_s = X##_s;                                                  \
+       R##_c = FP_CLS_ZERO; /* sqrt(+-0) = +-0 */                      \
+       break;                                                          \
+    case FP_CLS_NORMAL:                                                        \
+       R##_s = 0;                                                      \
+        if (X##_s)                                                     \
+          {                                                            \
+           R##_c = FP_CLS_NAN; /* sNAN */                              \
+           R##_s = _FP_NANSIGN_##fs;                                   \
+           _FP_FRAC_SET_##wc(R, _FP_NANFRAC_##fs);                     \
+           FP_SET_EXCEPTION(FP_EX_INVALID);                            \
+           break;                                                      \
+          }                                                            \
+       R##_c = FP_CLS_NORMAL;                                          \
+        if (X##_e & 1)                                                 \
+          _FP_FRAC_SLL_##wc(X, 1);                                     \
+        R##_e = X##_e >> 1;                                            \
+        _FP_FRAC_SET_##wc(S, _FP_ZEROFRAC_##wc);                       \
+        _FP_FRAC_SET_##wc(R, _FP_ZEROFRAC_##wc);                       \
+        q = _FP_OVERFLOW_##fs >> 1;                                    \
+        _FP_SQRT_MEAT_##wc(R, S, T, X, q);                             \
+    }                                                                  \
+  } while (0)
+
+/*
+ * Convert from FP to integer.  Input is raw.
+ */
+
+/* RSIGNED can have following values:
+ * 0:  the number is required to be 0..(2^rsize)-1, if not, NV is set plus
+ *     the result is either 0 or (2^rsize)-1 depending on the sign in such
+ *     case.
+ * 1:  the number is required to be -(2^(rsize-1))..(2^(rsize-1))-1, if not,
+ *     NV is set plus the result is either -(2^(rsize-1)) or (2^(rsize-1))-1
+ *     depending on the sign in such case.
+ * -1: the number is required to be -(2^(rsize-1))..(2^rsize)-1, if not, NV is
+ *     set plus the result is either -(2^(rsize-1)) or (2^(rsize-1))-1
+ *     depending on the sign in such case.
+ */
+#define _FP_TO_INT(fs, wc, r, X, rsize, rsigned)                       \
+do {                                                                   \
+  if (X##_e < _FP_EXPBIAS_##fs)                                                \
+    {                                                                  \
+      r = 0;                                                           \
+      if (X##_e == 0)                                                  \
+       {                                                               \
+         if (!_FP_FRAC_ZEROP_##wc(X))                                  \
+           {                                                           \
+             FP_SET_EXCEPTION(FP_EX_INEXACT);                          \
+             FP_SET_EXCEPTION(FP_EX_DENORM);                           \
+           }                                                           \
+       }                                                               \
+      else                                                             \
+       FP_SET_EXCEPTION(FP_EX_INEXACT);                                \
+    }                                                                  \
+  else if (X##_e >= _FP_EXPBIAS_##fs + rsize - (rsigned > 0 || X##_s)  \
+          || (!rsigned && X##_s))                                      \
+    {                                                                  \
+      /* Overflow or converting to the most negative integer.  */      \
+      if (rsigned)                                                     \
+       {                                                               \
+         r = 1;                                                        \
+         r <<= rsize - 1;                                              \
+         r -= 1 - X##_s;                                               \
+       } else {                                                        \
+         r = 0;                                                        \
+         if (X##_s)                                                    \
+           r = ~r;                                                     \
+       }                                                               \
+                                                                       \
+      if (rsigned && X##_s && X##_e == _FP_EXPBIAS_##fs + rsize - 1)   \
+       {                                                               \
+         /* Possibly converting to most negative integer; check the    \
+            mantissa.  */                                              \
+         int inexact = 0;                                              \
+         (void)((_FP_FRACBITS_##fs > rsize)                            \
+                ? ({ _FP_FRAC_SRST_##wc(X, inexact,                    \
+                                        _FP_FRACBITS_##fs - rsize,     \
+                                        _FP_FRACBITS_##fs); 0; })      \
+                : 0);                                                  \
+         if (!_FP_FRAC_ZEROP_##wc(X))                                  \
+           FP_SET_EXCEPTION(FP_EX_INVALID);                            \
+         else if (inexact)                                             \
+           FP_SET_EXCEPTION(FP_EX_INEXACT);                            \
+       }                                                               \
+      else                                                             \
+       FP_SET_EXCEPTION(FP_EX_INVALID);                                \
+    }                                                                  \
+  else                                                                 \
+    {                                                                  \
+      _FP_FRAC_HIGH_RAW_##fs(X) |= _FP_IMPLBIT_##fs;                   \
+      if (X##_e >= _FP_EXPBIAS_##fs + _FP_FRACBITS_##fs - 1)           \
+       {                                                               \
+         _FP_FRAC_ASSEMBLE_##wc(r, X, rsize);                          \
+         r <<= X##_e - _FP_EXPBIAS_##fs - _FP_FRACBITS_##fs + 1;       \
+       }                                                               \
+      else                                                             \
+       {                                                               \
+         int inexact;                                                  \
+         _FP_FRAC_SRST_##wc(X, inexact,                                \
+                           (_FP_FRACBITS_##fs + _FP_EXPBIAS_##fs - 1   \
+                            - X##_e),                                  \
+                           _FP_FRACBITS_##fs);                         \
+         if (inexact)                                                  \
+           FP_SET_EXCEPTION(FP_EX_INEXACT);                            \
+         _FP_FRAC_ASSEMBLE_##wc(r, X, rsize);                          \
+       }                                                               \
+      if (rsigned && X##_s)                                            \
+       r = -r;                                                         \
+    }                                                                  \
+} while (0)
+
+/* Convert integer to fp.  Output is raw.  RTYPE is unsigned even if
+   input is signed.  */
+#define _FP_FROM_INT(fs, wc, X, r, rsize, rtype)                            \
+  do {                                                                      \
+    if (r)                                                                  \
+      {                                                                             \
+       rtype ur_;                                                           \
+                                                                            \
+       if ((X##_s = (r < 0)))                                               \
+         r = -(rtype)r;                                                     \
+                                                                            \
+       ur_ = (rtype) r;                                                     \
+       (void)((rsize <= _FP_W_TYPE_SIZE)                                    \
+              ? ({                                                          \
+                   int lz_;                                                 \
+                   __FP_CLZ(lz_, (_FP_W_TYPE)ur_);                          \
+                   X##_e = _FP_EXPBIAS_##fs + _FP_W_TYPE_SIZE - 1 - lz_;    \
+                 })                                                         \
+              : ((rsize <= 2 * _FP_W_TYPE_SIZE)                             \
+                 ? ({                                                       \
+                      int lz_;                                              \
+                      __FP_CLZ_2(lz_, (_FP_W_TYPE)(ur_ >> _FP_W_TYPE_SIZE), \
+                                 (_FP_W_TYPE)ur_);                          \
+                      X##_e = (_FP_EXPBIAS_##fs + 2 * _FP_W_TYPE_SIZE - 1   \
+                               - lz_);                                      \
+                    })                                                      \
+                 : (abort(), 0)));                                          \
+                                                                            \
+       if (rsize - 1 + _FP_EXPBIAS_##fs >= _FP_EXPMAX_##fs                  \
+           && X##_e >= _FP_EXPMAX_##fs)                                     \
+         {                                                                  \
+           /* Exponent too big; overflow to infinity.  (May also            \
+              happen after rounding below.)  */                             \
+           _FP_OVERFLOW_SEMIRAW(fs, wc, X);                                 \
+           goto pack_semiraw;                                               \
+         }                                                                  \
+                                                                            \
+       if (rsize <= _FP_FRACBITS_##fs                                       \
+           || X##_e < _FP_EXPBIAS_##fs + _FP_FRACBITS_##fs)                 \
+         {                                                                  \
+           /* Exactly representable; shift left.  */                        \
+           _FP_FRAC_DISASSEMBLE_##wc(X, ur_, rsize);                        \
+           _FP_FRAC_SLL_##wc(X, (_FP_EXPBIAS_##fs                           \
+                                 + _FP_FRACBITS_##fs - 1 - X##_e));         \
+         }                                                                  \
+       else                                                                 \
+         {                                                                  \
+           /* More bits in integer than in floating type; need to           \
+              round.  */                                                    \
+           if (_FP_EXPBIAS_##fs + _FP_WFRACBITS_##fs - 1 < X##_e)           \
+             ur_ = ((ur_ >> (X##_e - _FP_EXPBIAS_##fs                       \
+                             - _FP_WFRACBITS_##fs + 1))                     \
+                    | ((ur_ << (rsize - (X##_e - _FP_EXPBIAS_##fs           \
+                                         - _FP_WFRACBITS_##fs + 1)))        \
+                       != 0));                                              \
+           _FP_FRAC_DISASSEMBLE_##wc(X, ur_, rsize);                        \
+           if ((_FP_EXPBIAS_##fs + _FP_WFRACBITS_##fs - 1 - X##_e) > 0)     \
+             _FP_FRAC_SLL_##wc(X, (_FP_EXPBIAS_##fs                         \
+                                   + _FP_WFRACBITS_##fs - 1 - X##_e));      \
+           _FP_FRAC_HIGH_##fs(X) &= ~(_FP_W_TYPE)_FP_IMPLBIT_SH_##fs;       \
+         pack_semiraw:                                                      \
+           _FP_PACK_SEMIRAW(fs, wc, X);                                     \
+         }                                                                  \
+      }                                                                             \
+    else                                                                    \
+      {                                                                             \
+       X##_s = 0;                                                           \
+       X##_e = 0;                                                           \
+       _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc);                             \
+      }                                                                             \
+  } while (0)
+
+
+/* Extend from a narrower floating-point format to a wider one.  Input
+   and output are raw.  */
+#define FP_EXTEND(dfs,sfs,dwc,swc,D,S)                                  \
+do {                                                                    \
+  if (_FP_FRACBITS_##dfs < _FP_FRACBITS_##sfs                           \
+      || (_FP_EXPMAX_##dfs - _FP_EXPBIAS_##dfs                          \
+         < _FP_EXPMAX_##sfs - _FP_EXPBIAS_##sfs)                        \
+      || (_FP_EXPBIAS_##dfs < _FP_EXPBIAS_##sfs + _FP_FRACBITS_##sfs - 1 \
+         && _FP_EXPBIAS_##dfs != _FP_EXPBIAS_##sfs))                    \
+    abort();                                                            \
+  D##_s = S##_s;                                                        \
+  _FP_FRAC_COPY_##dwc##_##swc(D, S);                                    \
+  if (_FP_EXP_NORMAL(sfs, swc, S))                                      \
+    {                                                                   \
+      D##_e = S##_e + _FP_EXPBIAS_##dfs - _FP_EXPBIAS_##sfs;            \
+      _FP_FRAC_SLL_##dwc(D, (_FP_FRACBITS_##dfs - _FP_FRACBITS_##sfs));         \
+    }                                                                   \
+  else                                                                  \
+    {                                                                   \
+      if (S##_e == 0)                                                   \
+       {                                                                \
+         if (_FP_FRAC_ZEROP_##swc(S))                                   \
+           D##_e = 0;                                                   \
+         else if (_FP_EXPBIAS_##dfs                                     \
+                  < _FP_EXPBIAS_##sfs + _FP_FRACBITS_##sfs - 1)         \
+           {                                                            \
+             FP_SET_EXCEPTION(FP_EX_DENORM);                            \
+             _FP_FRAC_SLL_##dwc(D, (_FP_FRACBITS_##dfs                  \
+                                    - _FP_FRACBITS_##sfs));             \
+             D##_e = 0;                                                 \
+           }                                                            \
+         else                                                           \
+           {                                                            \
+             int _lz;                                                   \
+             FP_SET_EXCEPTION(FP_EX_DENORM);                            \
+             _FP_FRAC_CLZ_##swc(_lz, S);                                \
+             _FP_FRAC_SLL_##dwc(D,                                      \
+                                _lz + _FP_FRACBITS_##dfs                \
+                                - _FP_FRACTBITS_##sfs);                 \
+             D##_e = (_FP_EXPBIAS_##dfs - _FP_EXPBIAS_##sfs + 1         \
+                      + _FP_FRACXBITS_##sfs - _lz);                     \
+           }                                                            \
+       }                                                                \
+      else                                                              \
+       {                                                                \
+         D##_e = _FP_EXPMAX_##dfs;                                      \
+         if (!_FP_FRAC_ZEROP_##swc(S))                                  \
+           {                                                            \
+             if (!(_FP_FRAC_HIGH_RAW_##sfs(S) & _FP_QNANBIT_##sfs))     \
+               FP_SET_EXCEPTION(FP_EX_INVALID);                         \
+             _FP_FRAC_SLL_##dwc(D, (_FP_FRACBITS_##dfs                  \
+                                    - _FP_FRACBITS_##sfs));             \
+           }                                                            \
+       }                                                                \
+    }                                                                   \
+} while (0)
+
+/* Truncate from a wider floating-point format to a narrower one.
+   Input and output are semi-raw.  */
+#define FP_TRUNC(dfs,sfs,dwc,swc,D,S)                                       \
+do {                                                                        \
+  if (_FP_FRACBITS_##sfs < _FP_FRACBITS_##dfs                               \
+      || (_FP_EXPBIAS_##sfs < _FP_EXPBIAS_##dfs + _FP_FRACBITS_##dfs - 1     \
+         && _FP_EXPBIAS_##sfs != _FP_EXPBIAS_##dfs))                        \
+    abort();                                                                \
+  D##_s = S##_s;                                                            \
+  if (_FP_EXP_NORMAL(sfs, swc, S))                                          \
+    {                                                                       \
+      D##_e = S##_e + _FP_EXPBIAS_##dfs - _FP_EXPBIAS_##sfs;                \
+      if (D##_e >= _FP_EXPMAX_##dfs)                                        \
+       _FP_OVERFLOW_SEMIRAW(dfs, dwc, D);                                   \
+      else                                                                  \
+       {                                                                    \
+         if (D##_e <= 0)                                                    \
+           {                                                                \
+             if (D##_e < 1 - _FP_FRACBITS_##dfs)                            \
+               {                                                            \
+                 _FP_FRAC_SET_##swc(S, _FP_ZEROFRAC_##swc);                 \
+                 _FP_FRAC_LOW_##swc(S) |= 1;                                \
+               }                                                            \
+             else                                                           \
+               {                                                            \
+                 _FP_FRAC_HIGH_##sfs(S) |= _FP_IMPLBIT_SH_##sfs;            \
+                 _FP_FRAC_SRS_##swc(S, (_FP_WFRACBITS_##sfs                 \
+                                        - _FP_WFRACBITS_##dfs + 1 - D##_e), \
+                                    _FP_WFRACBITS_##sfs);                   \
+               }                                                            \
+             D##_e = 0;                                                     \
+           }                                                                \
+         else                                                               \
+           _FP_FRAC_SRS_##swc(S, (_FP_WFRACBITS_##sfs                       \
+                                  - _FP_WFRACBITS_##dfs),                   \
+                              _FP_WFRACBITS_##sfs);                         \
+         _FP_FRAC_COPY_##dwc##_##swc(D, S);                                 \
+       }                                                                    \
+    }                                                                       \
+  else                                                                      \
+    {                                                                       \
+      if (S##_e == 0)                                                       \
+       {                                                                    \
+         D##_e = 0;                                                         \
+         if (_FP_FRAC_ZEROP_##swc(S))                                       \
+           _FP_FRAC_SET_##dwc(D, _FP_ZEROFRAC_##dwc);                       \
+         else                                                               \
+           {                                                                \
+             FP_SET_EXCEPTION(FP_EX_DENORM);                                \
+             if (_FP_EXPBIAS_##sfs                                          \
+                 < _FP_EXPBIAS_##dfs + _FP_FRACBITS_##dfs - 1)              \
+               {                                                            \
+                 _FP_FRAC_SRS_##swc(S, (_FP_WFRACBITS_##sfs                 \
+                                        - _FP_WFRACBITS_##dfs),             \
+                                    _FP_WFRACBITS_##sfs);                   \
+                 _FP_FRAC_COPY_##dwc##_##swc(D, S);                         \
+               }                                                            \
+             else                                                           \
+               {                                                            \
+                 _FP_FRAC_SET_##dwc(D, _FP_ZEROFRAC_##dwc);                 \
+                 _FP_FRAC_LOW_##dwc(D) |= 1;                                \
+               }                                                            \
+           }                                                                \
+       }                                                                    \
+      else                                                                  \
+       {                                                                    \
+         D##_e = _FP_EXPMAX_##dfs;                                          \
+         if (_FP_FRAC_ZEROP_##swc(S))                                       \
+           _FP_FRAC_SET_##dwc(D, _FP_ZEROFRAC_##dwc);                       \
+         else                                                               \
+           {                                                                \
+             _FP_CHECK_SIGNAN_SEMIRAW(sfs, swc, S);                         \
+             _FP_FRAC_SRL_##swc(S, (_FP_WFRACBITS_##sfs                     \
+                                    - _FP_WFRACBITS_##dfs));                \
+             _FP_FRAC_COPY_##dwc##_##swc(D, S);                             \
+             /* Semi-raw NaN must have all workbits cleared.  */            \
+             _FP_FRAC_LOW_##dwc(D)                                          \
+               &= ~(_FP_W_TYPE) ((1 << _FP_WORKBITS) - 1);                  \
+             _FP_FRAC_HIGH_##dfs(D) |= _FP_QNANBIT_SH_##dfs;                \
+           }                                                                \
+       }                                                                    \
+    }                                                                       \
+} while (0)
+
+/*
+ * Helper primitives.
+ */
+
+/* Count leading zeros in a word.  */
+
+#ifndef __FP_CLZ
+/* GCC 3.4 and later provide the builtins for us.  */
+#define __FP_CLZ(r, x)                                                       \
+  do {                                                                       \
+    if (sizeof (_FP_W_TYPE) == sizeof (unsigned int))                        \
+      r = __builtin_clz (x);                                                 \
+    else if (sizeof (_FP_W_TYPE) == sizeof (unsigned long))                  \
+      r = __builtin_clzl (x);                                                \
+    else if (sizeof (_FP_W_TYPE) == sizeof (unsigned long long))             \
+      r = __builtin_clzll (x);                                               \
+    else                                                                     \
+      abort ();                                                                      \
+  } while (0)
+#endif /* ndef __FP_CLZ */
+
+#define _FP_DIV_HELP_imm(q, r, n, d)           \
+  do {                                         \
+    q = n / d, r = n % d;                      \
+  } while (0)
+
+
+/* A restoring bit-by-bit division primitive.  */
+
+#define _FP_DIV_MEAT_N_loop(fs, wc, R, X, Y)                           \
+  do {                                                                 \
+    int count = _FP_WFRACBITS_##fs;                                    \
+    _FP_FRAC_DECL_##wc (u);                                            \
+    _FP_FRAC_DECL_##wc (v);                                            \
+    _FP_FRAC_COPY_##wc (u, X);                                         \
+    _FP_FRAC_COPY_##wc (v, Y);                                         \
+    _FP_FRAC_SET_##wc (R, _FP_ZEROFRAC_##wc);                          \
+    /* Normalize U and V.  */                                          \
+    _FP_FRAC_SLL_##wc (u, _FP_WFRACXBITS_##fs);                                \
+    _FP_FRAC_SLL_##wc (v, _FP_WFRACXBITS_##fs);                                \
+    /* First round.  Since the operands are normalized, either the     \
+       first or second bit will be set in the fraction.  Produce a     \
+       normalized result by checking which and adjusting the loop      \
+       count and exponent accordingly.  */                             \
+    if (_FP_FRAC_GE_1 (u, v))                                          \
+      {                                                                        \
+       _FP_FRAC_SUB_##wc (u, u, v);                                    \
+       _FP_FRAC_LOW_##wc (R) |= 1;                                     \
+       count--;                                                        \
+      }                                                                        \
+    else                                                               \
+      R##_e--;                                                         \
+    /* Subsequent rounds.  */                                          \
+    do {                                                               \
+      int msb = (_FP_WS_TYPE) _FP_FRAC_HIGH_##wc (u) < 0;              \
+      _FP_FRAC_SLL_##wc (u, 1);                                                \
+      _FP_FRAC_SLL_##wc (R, 1);                                                \
+      if (msb || _FP_FRAC_GE_1 (u, v))                                 \
+       {                                                               \
+         _FP_FRAC_SUB_##wc (u, u, v);                                  \
+         _FP_FRAC_LOW_##wc (R) |= 1;                                   \
+       }                                                               \
+    } while (--count > 0);                                             \
+    /* If there's anything left in U, the result is inexact.  */       \
+    _FP_FRAC_LOW_##wc (R) |= !_FP_FRAC_ZEROP_##wc (u);                 \
+  } while (0)
+
+#define _FP_DIV_MEAT_1_loop(fs, R, X, Y)  _FP_DIV_MEAT_N_loop (fs, 1, R, X, Y)
+#define _FP_DIV_MEAT_2_loop(fs, R, X, Y)  _FP_DIV_MEAT_N_loop (fs, 2, R, X, Y)
+#define _FP_DIV_MEAT_4_loop(fs, R, X, Y)  _FP_DIV_MEAT_N_loop (fs, 4, R, X, Y)
diff --git a/libgcc/soft-fp/quad.h b/libgcc/soft-fp/quad.h
new file mode 100644 (file)
index 0000000..c22e944
--- /dev/null
@@ -0,0 +1,271 @@
+/* Software floating-point emulation.
+   Definitions for IEEE Quad Precision.
+   Copyright (C) 1997,1998,1999,2006,2007 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com),
+                 Jakub Jelinek (jj@ultra.linux.cz),
+                 David S. Miller (davem@redhat.com) and
+                 Peter Maydell (pmaydell@chiark.greenend.org.uk).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#if _FP_W_TYPE_SIZE < 32
+#error "Here's a nickel, kid. Go buy yourself a real computer."
+#endif
+
+#if _FP_W_TYPE_SIZE < 64
+#define _FP_FRACTBITS_Q         (4*_FP_W_TYPE_SIZE)
+#else
+#define _FP_FRACTBITS_Q                (2*_FP_W_TYPE_SIZE)
+#endif
+
+#define _FP_FRACBITS_Q         113
+#define _FP_FRACXBITS_Q                (_FP_FRACTBITS_Q - _FP_FRACBITS_Q)
+#define _FP_WFRACBITS_Q                (_FP_WORKBITS + _FP_FRACBITS_Q)
+#define _FP_WFRACXBITS_Q       (_FP_FRACTBITS_Q - _FP_WFRACBITS_Q)
+#define _FP_EXPBITS_Q          15
+#define _FP_EXPBIAS_Q          16383
+#define _FP_EXPMAX_Q           32767
+
+#define _FP_QNANBIT_Q          \
+       ((_FP_W_TYPE)1 << (_FP_FRACBITS_Q-2) % _FP_W_TYPE_SIZE)
+#define _FP_QNANBIT_SH_Q               \
+       ((_FP_W_TYPE)1 << (_FP_FRACBITS_Q-2+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
+#define _FP_IMPLBIT_Q          \
+       ((_FP_W_TYPE)1 << (_FP_FRACBITS_Q-1) % _FP_W_TYPE_SIZE)
+#define _FP_IMPLBIT_SH_Q               \
+       ((_FP_W_TYPE)1 << (_FP_FRACBITS_Q-1+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
+#define _FP_OVERFLOW_Q         \
+       ((_FP_W_TYPE)1 << (_FP_WFRACBITS_Q % _FP_W_TYPE_SIZE))
+
+typedef float TFtype __attribute__((mode(TF)));
+
+#if _FP_W_TYPE_SIZE < 64
+
+union _FP_UNION_Q
+{
+   TFtype flt;
+   struct 
+   {
+#if __BYTE_ORDER == __BIG_ENDIAN
+      unsigned sign : 1;
+      unsigned exp : _FP_EXPBITS_Q;
+      unsigned long frac3 : _FP_FRACBITS_Q - (_FP_IMPLBIT_Q != 0)-(_FP_W_TYPE_SIZE * 3);
+      unsigned long frac2 : _FP_W_TYPE_SIZE;
+      unsigned long frac1 : _FP_W_TYPE_SIZE;
+      unsigned long frac0 : _FP_W_TYPE_SIZE;
+#else
+      unsigned long frac0 : _FP_W_TYPE_SIZE;
+      unsigned long frac1 : _FP_W_TYPE_SIZE;
+      unsigned long frac2 : _FP_W_TYPE_SIZE;
+      unsigned long frac3 : _FP_FRACBITS_Q - (_FP_IMPLBIT_Q != 0)-(_FP_W_TYPE_SIZE * 3);
+      unsigned exp : _FP_EXPBITS_Q;
+      unsigned sign : 1;
+#endif /* not bigendian */
+   } bits __attribute__((packed));
+};
+
+
+#define FP_DECL_Q(X)           _FP_DECL(4,X)
+#define FP_UNPACK_RAW_Q(X,val) _FP_UNPACK_RAW_4(Q,X,val)
+#define FP_UNPACK_RAW_QP(X,val)        _FP_UNPACK_RAW_4_P(Q,X,val)
+#define FP_PACK_RAW_Q(val,X)   _FP_PACK_RAW_4(Q,val,X)
+#define FP_PACK_RAW_QP(val,X)          \
+  do {                                 \
+    if (!FP_INHIBIT_RESULTS)           \
+      _FP_PACK_RAW_4_P(Q,val,X);       \
+  } while (0)
+
+#define FP_UNPACK_Q(X,val)             \
+  do {                                 \
+    _FP_UNPACK_RAW_4(Q,X,val);         \
+    _FP_UNPACK_CANONICAL(Q,4,X);       \
+  } while (0)
+
+#define FP_UNPACK_QP(X,val)            \
+  do {                                 \
+    _FP_UNPACK_RAW_4_P(Q,X,val);       \
+    _FP_UNPACK_CANONICAL(Q,4,X);       \
+  } while (0)
+
+#define FP_UNPACK_SEMIRAW_Q(X,val)     \
+  do {                                 \
+    _FP_UNPACK_RAW_4(Q,X,val);         \
+    _FP_UNPACK_SEMIRAW(Q,4,X);         \
+  } while (0)
+
+#define FP_UNPACK_SEMIRAW_QP(X,val)    \
+  do {                                 \
+    _FP_UNPACK_RAW_4_P(Q,X,val);       \
+    _FP_UNPACK_SEMIRAW(Q,4,X);         \
+  } while (0)
+
+#define FP_PACK_Q(val,X)               \
+  do {                                 \
+    _FP_PACK_CANONICAL(Q,4,X);         \
+    _FP_PACK_RAW_4(Q,val,X);           \
+  } while (0)
+
+#define FP_PACK_QP(val,X)              \
+  do {                                 \
+    _FP_PACK_CANONICAL(Q,4,X);         \
+    if (!FP_INHIBIT_RESULTS)           \
+      _FP_PACK_RAW_4_P(Q,val,X);       \
+  } while (0)
+
+#define FP_PACK_SEMIRAW_Q(val,X)       \
+  do {                                 \
+    _FP_PACK_SEMIRAW(Q,4,X);           \
+    _FP_PACK_RAW_4(Q,val,X);           \
+  } while (0)
+
+#define FP_PACK_SEMIRAW_QP(val,X)      \
+  do {                                 \
+    _FP_PACK_SEMIRAW(Q,4,X);           \
+    if (!FP_INHIBIT_RESULTS)           \
+      _FP_PACK_RAW_4_P(Q,val,X);       \
+  } while (0)
+
+#define FP_ISSIGNAN_Q(X)               _FP_ISSIGNAN(Q,4,X)
+#define FP_NEG_Q(R,X)                  _FP_NEG(Q,4,R,X)
+#define FP_ADD_Q(R,X,Y)                        _FP_ADD(Q,4,R,X,Y)
+#define FP_SUB_Q(R,X,Y)                        _FP_SUB(Q,4,R,X,Y)
+#define FP_MUL_Q(R,X,Y)                        _FP_MUL(Q,4,R,X,Y)
+#define FP_DIV_Q(R,X,Y)                        _FP_DIV(Q,4,R,X,Y)
+#define FP_SQRT_Q(R,X)                 _FP_SQRT(Q,4,R,X)
+#define _FP_SQRT_MEAT_Q(R,S,T,X,Q)     _FP_SQRT_MEAT_4(R,S,T,X,Q)
+
+#define FP_CMP_Q(r,X,Y,un)     _FP_CMP(Q,4,r,X,Y,un)
+#define FP_CMP_EQ_Q(r,X,Y)     _FP_CMP_EQ(Q,4,r,X,Y)
+#define FP_CMP_UNORD_Q(r,X,Y)  _FP_CMP_UNORD(Q,4,r,X,Y)
+
+#define FP_TO_INT_Q(r,X,rsz,rsg)       _FP_TO_INT(Q,4,r,X,rsz,rsg)
+#define FP_FROM_INT_Q(X,r,rs,rt)       _FP_FROM_INT(Q,4,X,r,rs,rt)
+
+#define _FP_FRAC_HIGH_Q(X)     _FP_FRAC_HIGH_4(X)
+#define _FP_FRAC_HIGH_RAW_Q(X) _FP_FRAC_HIGH_4(X)
+
+#else   /* not _FP_W_TYPE_SIZE < 64 */
+union _FP_UNION_Q
+{
+  TFtype flt /* __attribute__((mode(TF))) */ ;
+  struct {
+    _FP_W_TYPE a, b;
+  } longs;
+  struct {
+#if __BYTE_ORDER == __BIG_ENDIAN
+    unsigned sign    : 1;
+    unsigned exp     : _FP_EXPBITS_Q;
+    _FP_W_TYPE frac1 : _FP_FRACBITS_Q - (_FP_IMPLBIT_Q != 0) - _FP_W_TYPE_SIZE;
+    _FP_W_TYPE frac0 : _FP_W_TYPE_SIZE;
+#else
+    _FP_W_TYPE frac0 : _FP_W_TYPE_SIZE;
+    _FP_W_TYPE frac1 : _FP_FRACBITS_Q - (_FP_IMPLBIT_Q != 0) - _FP_W_TYPE_SIZE;
+    unsigned exp     : _FP_EXPBITS_Q;
+    unsigned sign    : 1;
+#endif
+  } bits;
+};
+
+#define FP_DECL_Q(X)           _FP_DECL(2,X)
+#define FP_UNPACK_RAW_Q(X,val) _FP_UNPACK_RAW_2(Q,X,val)
+#define FP_UNPACK_RAW_QP(X,val)        _FP_UNPACK_RAW_2_P(Q,X,val)
+#define FP_PACK_RAW_Q(val,X)   _FP_PACK_RAW_2(Q,val,X)
+#define FP_PACK_RAW_QP(val,X)          \
+  do {                                 \
+    if (!FP_INHIBIT_RESULTS)           \
+      _FP_PACK_RAW_2_P(Q,val,X);       \
+  } while (0)
+
+#define FP_UNPACK_Q(X,val)             \
+  do {                                 \
+    _FP_UNPACK_RAW_2(Q,X,val);         \
+    _FP_UNPACK_CANONICAL(Q,2,X);       \
+  } while (0)
+
+#define FP_UNPACK_QP(X,val)            \
+  do {                                 \
+    _FP_UNPACK_RAW_2_P(Q,X,val);       \
+    _FP_UNPACK_CANONICAL(Q,2,X);       \
+  } while (0)
+
+#define FP_UNPACK_SEMIRAW_Q(X,val)     \
+  do {                                 \
+    _FP_UNPACK_RAW_2(Q,X,val);         \
+    _FP_UNPACK_SEMIRAW(Q,2,X);         \
+  } while (0)
+
+#define FP_UNPACK_SEMIRAW_QP(X,val)    \
+  do {                                 \
+    _FP_UNPACK_RAW_2_P(Q,X,val);       \
+    _FP_UNPACK_SEMIRAW(Q,2,X);         \
+  } while (0)
+
+#define FP_PACK_Q(val,X)               \
+  do {                                 \
+    _FP_PACK_CANONICAL(Q,2,X);         \
+    _FP_PACK_RAW_2(Q,val,X);           \
+  } while (0)
+
+#define FP_PACK_QP(val,X)              \
+  do {                                 \
+    _FP_PACK_CANONICAL(Q,2,X);         \
+    if (!FP_INHIBIT_RESULTS)           \
+      _FP_PACK_RAW_2_P(Q,val,X);       \
+  } while (0)
+
+#define FP_PACK_SEMIRAW_Q(val,X)       \
+  do {                                 \
+    _FP_PACK_SEMIRAW(Q,2,X);           \
+    _FP_PACK_RAW_2(Q,val,X);           \
+  } while (0)
+
+#define FP_PACK_SEMIRAW_QP(val,X)      \
+  do {                                 \
+    _FP_PACK_SEMIRAW(Q,2,X);           \
+    if (!FP_INHIBIT_RESULTS)           \
+      _FP_PACK_RAW_2_P(Q,val,X);       \
+  } while (0)
+
+#define FP_ISSIGNAN_Q(X)               _FP_ISSIGNAN(Q,2,X)
+#define FP_NEG_Q(R,X)                  _FP_NEG(Q,2,R,X)
+#define FP_ADD_Q(R,X,Y)                        _FP_ADD(Q,2,R,X,Y)
+#define FP_SUB_Q(R,X,Y)                        _FP_SUB(Q,2,R,X,Y)
+#define FP_MUL_Q(R,X,Y)                        _FP_MUL(Q,2,R,X,Y)
+#define FP_DIV_Q(R,X,Y)                        _FP_DIV(Q,2,R,X,Y)
+#define FP_SQRT_Q(R,X)                 _FP_SQRT(Q,2,R,X)
+#define _FP_SQRT_MEAT_Q(R,S,T,X,Q)     _FP_SQRT_MEAT_2(R,S,T,X,Q)
+
+#define FP_CMP_Q(r,X,Y,un)     _FP_CMP(Q,2,r,X,Y,un)
+#define FP_CMP_EQ_Q(r,X,Y)     _FP_CMP_EQ(Q,2,r,X,Y)
+#define FP_CMP_UNORD_Q(r,X,Y)  _FP_CMP_UNORD(Q,2,r,X,Y)
+
+#define FP_TO_INT_Q(r,X,rsz,rsg)       _FP_TO_INT(Q,2,r,X,rsz,rsg)
+#define FP_FROM_INT_Q(X,r,rs,rt)       _FP_FROM_INT(Q,2,X,r,rs,rt)
+
+#define _FP_FRAC_HIGH_Q(X)     _FP_FRAC_HIGH_2(X)
+#define _FP_FRAC_HIGH_RAW_Q(X) _FP_FRAC_HIGH_2(X)
+
+#endif /* not _FP_W_TYPE_SIZE < 64 */
diff --git a/libgcc/soft-fp/single.h b/libgcc/soft-fp/single.h
new file mode 100644 (file)
index 0000000..9c3734a
--- /dev/null
@@ -0,0 +1,151 @@
+/* Software floating-point emulation.
+   Definitions for IEEE Single Precision.
+   Copyright (C) 1997,1998,1999,2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com),
+                 Jakub Jelinek (jj@ultra.linux.cz),
+                 David S. Miller (davem@redhat.com) and
+                 Peter Maydell (pmaydell@chiark.greenend.org.uk).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#if _FP_W_TYPE_SIZE < 32
+#error "Here's a nickel kid.  Go buy yourself a real computer."
+#endif
+
+#define _FP_FRACTBITS_S                _FP_W_TYPE_SIZE
+
+#define _FP_FRACBITS_S         24
+#define _FP_FRACXBITS_S                (_FP_FRACTBITS_S - _FP_FRACBITS_S)
+#define _FP_WFRACBITS_S                (_FP_WORKBITS + _FP_FRACBITS_S)
+#define _FP_WFRACXBITS_S       (_FP_FRACTBITS_S - _FP_WFRACBITS_S)
+#define _FP_EXPBITS_S          8
+#define _FP_EXPBIAS_S          127
+#define _FP_EXPMAX_S           255
+#define _FP_QNANBIT_S          ((_FP_W_TYPE)1 << (_FP_FRACBITS_S-2))
+#define _FP_QNANBIT_SH_S       ((_FP_W_TYPE)1 << (_FP_FRACBITS_S-2+_FP_WORKBITS))
+#define _FP_IMPLBIT_S          ((_FP_W_TYPE)1 << (_FP_FRACBITS_S-1))
+#define _FP_IMPLBIT_SH_S       ((_FP_W_TYPE)1 << (_FP_FRACBITS_S-1+_FP_WORKBITS))
+#define _FP_OVERFLOW_S         ((_FP_W_TYPE)1 << (_FP_WFRACBITS_S))
+
+/* The implementation of _FP_MUL_MEAT_S and _FP_DIV_MEAT_S should be
+   chosen by the target machine.  */
+
+typedef float SFtype __attribute__((mode(SF)));
+
+union _FP_UNION_S
+{
+  SFtype flt;
+  struct {
+#if __BYTE_ORDER == __BIG_ENDIAN
+    unsigned sign : 1;
+    unsigned exp  : _FP_EXPBITS_S;
+    unsigned frac : _FP_FRACBITS_S - (_FP_IMPLBIT_S != 0);
+#else
+    unsigned frac : _FP_FRACBITS_S - (_FP_IMPLBIT_S != 0);
+    unsigned exp  : _FP_EXPBITS_S;
+    unsigned sign : 1;
+#endif
+  } bits __attribute__((packed));
+};
+
+#define FP_DECL_S(X)           _FP_DECL(1,X)
+#define FP_UNPACK_RAW_S(X,val) _FP_UNPACK_RAW_1(S,X,val)
+#define FP_UNPACK_RAW_SP(X,val)        _FP_UNPACK_RAW_1_P(S,X,val)
+#define FP_PACK_RAW_S(val,X)   _FP_PACK_RAW_1(S,val,X)
+#define FP_PACK_RAW_SP(val,X)          \
+  do {                                 \
+    if (!FP_INHIBIT_RESULTS)           \
+      _FP_PACK_RAW_1_P(S,val,X);       \
+  } while (0)
+
+#define FP_UNPACK_S(X,val)             \
+  do {                                 \
+    _FP_UNPACK_RAW_1(S,X,val);         \
+    _FP_UNPACK_CANONICAL(S,1,X);       \
+  } while (0)
+
+#define FP_UNPACK_SP(X,val)            \
+  do {                                 \
+    _FP_UNPACK_RAW_1_P(S,X,val);       \
+    _FP_UNPACK_CANONICAL(S,1,X);       \
+  } while (0)
+
+#define FP_UNPACK_SEMIRAW_S(X,val)     \
+  do {                                 \
+    _FP_UNPACK_RAW_1(S,X,val);         \
+    _FP_UNPACK_SEMIRAW(S,1,X);         \
+  } while (0)
+
+#define FP_UNPACK_SEMIRAW_SP(X,val)    \
+  do {                                 \
+    _FP_UNPACK_RAW_1_P(S,X,val);       \
+    _FP_UNPACK_SEMIRAW(S,1,X);         \
+  } while (0)
+
+#define FP_PACK_S(val,X)               \
+  do {                                 \
+    _FP_PACK_CANONICAL(S,1,X);         \
+    _FP_PACK_RAW_1(S,val,X);           \
+  } while (0)
+
+#define FP_PACK_SP(val,X)              \
+  do {                                 \
+    _FP_PACK_CANONICAL(S,1,X);         \
+    if (!FP_INHIBIT_RESULTS)           \
+      _FP_PACK_RAW_1_P(S,val,X);       \
+  } while (0)
+
+#define FP_PACK_SEMIRAW_S(val,X)       \
+  do {                                 \
+    _FP_PACK_SEMIRAW(S,1,X);           \
+    _FP_PACK_RAW_1(S,val,X);           \
+  } while (0)
+
+#define FP_PACK_SEMIRAW_SP(val,X)      \
+  do {                                 \
+    _FP_PACK_SEMIRAW(S,1,X);           \
+    if (!FP_INHIBIT_RESULTS)           \
+      _FP_PACK_RAW_1_P(S,val,X);       \
+  } while (0)
+
+#define FP_ISSIGNAN_S(X)               _FP_ISSIGNAN(S,1,X)
+#define FP_NEG_S(R,X)                  _FP_NEG(S,1,R,X)
+#define FP_ADD_S(R,X,Y)                        _FP_ADD(S,1,R,X,Y)
+#define FP_SUB_S(R,X,Y)                        _FP_SUB(S,1,R,X,Y)
+#define FP_MUL_S(R,X,Y)                        _FP_MUL(S,1,R,X,Y)
+#define FP_DIV_S(R,X,Y)                        _FP_DIV(S,1,R,X,Y)
+#define FP_SQRT_S(R,X)                 _FP_SQRT(S,1,R,X)
+#define _FP_SQRT_MEAT_S(R,S,T,X,Q)     _FP_SQRT_MEAT_1(R,S,T,X,Q)
+
+#define FP_CMP_S(r,X,Y,un)     _FP_CMP(S,1,r,X,Y,un)
+#define FP_CMP_EQ_S(r,X,Y)     _FP_CMP_EQ(S,1,r,X,Y)
+#define FP_CMP_UNORD_S(r,X,Y)  _FP_CMP_UNORD(S,1,r,X,Y)
+
+#define FP_TO_INT_S(r,X,rsz,rsg)       _FP_TO_INT(S,1,r,X,rsz,rsg)
+#define FP_FROM_INT_S(X,r,rs,rt)       _FP_FROM_INT(S,1,X,r,rs,rt)
+
+#define _FP_FRAC_HIGH_S(X)     _FP_FRAC_HIGH_1(X)
+#define _FP_FRAC_HIGH_RAW_S(X) _FP_FRAC_HIGH_1(X)
diff --git a/libgcc/soft-fp/soft-fp.h b/libgcc/soft-fp/soft-fp.h
new file mode 100644 (file)
index 0000000..2307357
--- /dev/null
@@ -0,0 +1,213 @@
+/* Software floating-point emulation.
+   Copyright (C) 1997,1998,1999,2000,2002,2003,2005,2006
+       Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com),
+                 Jakub Jelinek (jj@ultra.linux.cz),
+                 David S. Miller (davem@redhat.com) and
+                 Peter Maydell (pmaydell@chiark.greenend.org.uk).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#ifndef SOFT_FP_H
+#define SOFT_FP_H
+
+#ifdef _LIBC
+#include <sfp-machine.h>
+#else
+#include "sfp-machine.h"
+#endif
+
+/* Allow sfp-machine to have its own byte order definitions. */
+#ifndef __BYTE_ORDER
+#ifdef _LIBC
+#include <endian.h>
+#else
+#error "endianness not defined by sfp-machine.h"
+#endif
+#endif
+
+#define _FP_WORKBITS           3
+#define _FP_WORK_LSB           ((_FP_W_TYPE)1 << 3)
+#define _FP_WORK_ROUND         ((_FP_W_TYPE)1 << 2)
+#define _FP_WORK_GUARD         ((_FP_W_TYPE)1 << 1)
+#define _FP_WORK_STICKY                ((_FP_W_TYPE)1 << 0)
+
+#ifndef FP_RND_NEAREST
+# define FP_RND_NEAREST                0
+# define FP_RND_ZERO           1
+# define FP_RND_PINF           2
+# define FP_RND_MINF           3
+#endif
+#ifndef FP_ROUNDMODE
+# define FP_ROUNDMODE          FP_RND_NEAREST
+#endif
+
+/* By default don't care about exceptions. */
+#ifndef FP_EX_INVALID
+#define FP_EX_INVALID          0
+#endif
+#ifndef FP_EX_OVERFLOW
+#define FP_EX_OVERFLOW         0
+#endif
+#ifndef FP_EX_UNDERFLOW
+#define FP_EX_UNDERFLOW                0
+#endif
+#ifndef FP_EX_DIVZERO
+#define FP_EX_DIVZERO          0
+#endif
+#ifndef FP_EX_INEXACT
+#define FP_EX_INEXACT          0
+#endif
+#ifndef FP_EX_DENORM
+#define FP_EX_DENORM           0
+#endif
+
+#ifdef _FP_DECL_EX
+#define FP_DECL_EX                                     \
+  int _fex = 0;                                                \
+  _FP_DECL_EX
+#else
+#define FP_DECL_EX int _fex = 0
+#endif
+
+#ifndef FP_INIT_ROUNDMODE
+#define FP_INIT_ROUNDMODE do {} while (0)
+#endif
+
+#ifndef FP_HANDLE_EXCEPTIONS
+#define FP_HANDLE_EXCEPTIONS do {} while (0)
+#endif
+
+#ifndef FP_INHIBIT_RESULTS
+/* By default we write the results always.
+ * sfp-machine may override this and e.g.
+ * check if some exceptions are unmasked
+ * and inhibit it in such a case.
+ */
+#define FP_INHIBIT_RESULTS 0
+#endif
+
+#define FP_SET_EXCEPTION(ex)                           \
+  _fex |= (ex)
+
+#define FP_UNSET_EXCEPTION(ex)                         \
+  _fex &= ~(ex)
+
+#define FP_CLEAR_EXCEPTIONS                            \
+  _fex = 0
+
+#define _FP_ROUND_NEAREST(wc, X)                       \
+do {                                                   \
+    if ((_FP_FRAC_LOW_##wc(X) & 15) != _FP_WORK_ROUND) \
+      _FP_FRAC_ADDI_##wc(X, _FP_WORK_ROUND);           \
+} while (0)
+
+#define _FP_ROUND_ZERO(wc, X)          (void)0
+
+#define _FP_ROUND_PINF(wc, X)                          \
+do {                                                   \
+    if (!X##_s && (_FP_FRAC_LOW_##wc(X) & 7))          \
+      _FP_FRAC_ADDI_##wc(X, _FP_WORK_LSB);             \
+} while (0)
+
+#define _FP_ROUND_MINF(wc, X)                          \
+do {                                                   \
+    if (X##_s && (_FP_FRAC_LOW_##wc(X) & 7))           \
+      _FP_FRAC_ADDI_##wc(X, _FP_WORK_LSB);             \
+} while (0)
+
+#define _FP_ROUND(wc, X)                       \
+do {                                           \
+       if (_FP_FRAC_LOW_##wc(X) & 7)           \
+         FP_SET_EXCEPTION(FP_EX_INEXACT);      \
+       switch (FP_ROUNDMODE)                   \
+       {                                       \
+         case FP_RND_NEAREST:                  \
+           _FP_ROUND_NEAREST(wc,X);            \
+           break;                              \
+         case FP_RND_ZERO:                     \
+           _FP_ROUND_ZERO(wc,X);               \
+           break;                              \
+         case FP_RND_PINF:                     \
+           _FP_ROUND_PINF(wc,X);               \
+           break;                              \
+         case FP_RND_MINF:                     \
+           _FP_ROUND_MINF(wc,X);               \
+           break;                              \
+       }                                       \
+} while (0)
+
+#define FP_CLS_NORMAL          0
+#define FP_CLS_ZERO            1
+#define FP_CLS_INF             2
+#define FP_CLS_NAN             3
+
+#define _FP_CLS_COMBINE(x,y)   (((x) << 2) | (y))
+
+#include "op-1.h"
+#include "op-2.h"
+#include "op-4.h"
+#include "op-8.h"
+#include "op-common.h"
+
+/* Sigh.  Silly things longlong.h needs.  */
+#define UWtype         _FP_W_TYPE
+#define W_TYPE_SIZE    _FP_W_TYPE_SIZE
+
+typedef int QItype __attribute__((mode(QI)));
+typedef int SItype __attribute__((mode(SI)));
+typedef int DItype __attribute__((mode(DI)));
+typedef unsigned int UQItype __attribute__((mode(QI)));
+typedef unsigned int USItype __attribute__((mode(SI)));
+typedef unsigned int UDItype __attribute__((mode(DI)));
+#if _FP_W_TYPE_SIZE == 32
+typedef unsigned int UHWtype __attribute__((mode(HI)));
+#elif _FP_W_TYPE_SIZE == 64
+typedef USItype UHWtype;
+#endif
+
+#ifndef CMPtype
+#define CMPtype                int
+#endif
+
+#define SI_BITS                (__CHAR_BIT__ * (int)sizeof(SItype))
+#define DI_BITS                (__CHAR_BIT__ * (int)sizeof(DItype))
+
+#ifndef umul_ppmm
+#ifdef _LIBC
+#include <stdlib/longlong.h>
+#else
+#include "longlong.h"
+#endif
+#endif
+
+#ifdef _LIBC
+#include <stdlib.h>
+#else
+extern void abort (void);
+#endif
+
+#endif
diff --git a/libgcc/soft-fp/subdf3.c b/libgcc/soft-fp/subdf3.c
new file mode 100644 (file)
index 0000000..3978b52
--- /dev/null
@@ -0,0 +1,49 @@
+/* Software floating-point emulation.
+   Return a - b
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "double.h"
+
+DFtype __subdf3(DFtype a, DFtype b)
+{
+  FP_DECL_EX;
+  FP_DECL_D(A); FP_DECL_D(B); FP_DECL_D(R);
+  DFtype r;
+
+  FP_INIT_ROUNDMODE;
+  FP_UNPACK_SEMIRAW_D(A, a);
+  FP_UNPACK_SEMIRAW_D(B, b);
+  FP_SUB_D(R, A, B);
+  FP_PACK_SEMIRAW_D(r, R);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
diff --git a/libgcc/soft-fp/subsf3.c b/libgcc/soft-fp/subsf3.c
new file mode 100644 (file)
index 0000000..f1cbdd1
--- /dev/null
@@ -0,0 +1,49 @@
+/* Software floating-point emulation.
+   Return a - b
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "single.h"
+
+SFtype __subsf3(SFtype a, SFtype b)
+{
+  FP_DECL_EX;
+  FP_DECL_S(A); FP_DECL_S(B); FP_DECL_S(R);
+  SFtype r;
+
+  FP_INIT_ROUNDMODE;
+  FP_UNPACK_SEMIRAW_S(A, a);
+  FP_UNPACK_SEMIRAW_S(B, b);
+  FP_SUB_S(R, A, B);
+  FP_PACK_SEMIRAW_S(r, R);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
diff --git a/libgcc/soft-fp/subtf3.c b/libgcc/soft-fp/subtf3.c
new file mode 100644 (file)
index 0000000..7ba4c8c
--- /dev/null
@@ -0,0 +1,49 @@
+/* Software floating-point emulation.
+   Return a - b
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "quad.h"
+
+TFtype __subtf3(TFtype a, TFtype b)
+{
+  FP_DECL_EX;
+  FP_DECL_Q(A); FP_DECL_Q(B); FP_DECL_Q(R);
+  TFtype r;
+
+  FP_INIT_ROUNDMODE;
+  FP_UNPACK_SEMIRAW_Q(A, a);
+  FP_UNPACK_SEMIRAW_Q(B, b);
+  FP_SUB_Q(R, A, B);
+  FP_PACK_SEMIRAW_Q(r, R);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
diff --git a/libgcc/soft-fp/truncdfsf2.c b/libgcc/soft-fp/truncdfsf2.c
new file mode 100644 (file)
index 0000000..bd95391
--- /dev/null
@@ -0,0 +1,54 @@
+/* Software floating-point emulation.
+   Truncate IEEE double into IEEE single
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "single.h"
+#include "double.h"
+
+SFtype __truncdfsf2(DFtype a)
+{
+  FP_DECL_EX;
+  FP_DECL_D(A);
+  FP_DECL_S(R);
+  SFtype r;
+
+  FP_INIT_ROUNDMODE;
+  FP_UNPACK_SEMIRAW_D(A, a);
+#if _FP_W_TYPE_SIZE < _FP_FRACBITS_D
+  FP_TRUNC(S,D,1,2,R,A);
+#else
+  FP_TRUNC(S,D,1,1,R,A);
+#endif
+  FP_PACK_SEMIRAW_S(r, R);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
diff --git a/libgcc/soft-fp/trunctfdf2.c b/libgcc/soft-fp/trunctfdf2.c
new file mode 100644 (file)
index 0000000..c3827b0
--- /dev/null
@@ -0,0 +1,54 @@
+/* Software floating-point emulation.
+   Truncate IEEE quad into IEEE double
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "double.h"
+#include "quad.h"
+
+DFtype __trunctfdf2(TFtype a)
+{
+  FP_DECL_EX;
+  FP_DECL_Q(A);
+  FP_DECL_D(R);
+  DFtype r;
+
+  FP_INIT_ROUNDMODE;
+  FP_UNPACK_SEMIRAW_Q(A, a);
+#if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
+  FP_TRUNC(D,Q,2,4,R,A);
+#else
+  FP_TRUNC(D,Q,1,2,R,A);
+#endif
+  FP_PACK_SEMIRAW_D(r, R);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
diff --git a/libgcc/soft-fp/trunctfsf2.c b/libgcc/soft-fp/trunctfsf2.c
new file mode 100644 (file)
index 0000000..676c937
--- /dev/null
@@ -0,0 +1,54 @@
+/* Software floating-point emulation.
+   Truncate IEEE quad into IEEE single
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com) and
+                 Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "single.h"
+#include "quad.h"
+
+SFtype __trunctfsf2(TFtype a)
+{
+  FP_DECL_EX;
+  FP_DECL_Q(A);
+  FP_DECL_S(R);
+  SFtype r;
+
+  FP_INIT_ROUNDMODE;
+  FP_UNPACK_SEMIRAW_Q(A, a);
+#if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
+  FP_TRUNC(S,Q,1,4,R,A);
+#else
+  FP_TRUNC(S,Q,1,2,R,A);
+#endif
+  FP_PACK_SEMIRAW_S(r, R);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
diff --git a/libgcc/soft-fp/trunctfxf2.c b/libgcc/soft-fp/trunctfxf2.c
new file mode 100644 (file)
index 0000000..50d60bc
--- /dev/null
@@ -0,0 +1,53 @@
+/* Software floating-point emulation.
+   Truncate IEEE quad into IEEE extended
+   Copyright (C) 2007 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Uros Bizjak (ubizjak@gmail.com).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "extended.h"
+#include "quad.h"
+
+XFtype __trunctfxf2(TFtype a)
+{
+  FP_DECL_EX;
+  FP_DECL_Q(A);
+  FP_DECL_E(R);
+  XFtype r;
+
+  FP_INIT_ROUNDMODE;
+  FP_UNPACK_SEMIRAW_Q(A, a);
+#if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
+  FP_TRUNC(E,Q,4,4,R,A);
+#else
+  FP_TRUNC(E,Q,2,2,R,A);
+#endif
+  FP_PACK_SEMIRAW_E(r, R);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
diff --git a/libgcc/soft-fp/unorddf2.c b/libgcc/soft-fp/unorddf2.c
new file mode 100644 (file)
index 0000000..5ea63e2
--- /dev/null
@@ -0,0 +1,44 @@
+/* Software floating-point emulation.
+   Return 1 iff a or b is a NaN, 0 otherwise.
+   Copyright (C) 2006,2007 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Joseph Myers (joseph@codesourcery.com).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "double.h"
+
+CMPtype __unorddf2(DFtype a, DFtype b)
+{
+  FP_DECL_D(A); FP_DECL_D(B);
+  CMPtype r;
+
+  FP_UNPACK_RAW_D(A, a);
+  FP_UNPACK_RAW_D(B, b);
+  FP_CMP_UNORD_D(r, A, B);
+
+  return r;
+}
diff --git a/libgcc/soft-fp/unordsf2.c b/libgcc/soft-fp/unordsf2.c
new file mode 100644 (file)
index 0000000..6d0afe8
--- /dev/null
@@ -0,0 +1,45 @@
+/* Software floating-point emulation.
+   Return 1 iff a or b is a NaN, 0 otherwise.
+   Copyright (C) 2006,2007 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Joseph Myers (joseph@codesourcery.com).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "single.h"
+
+CMPtype __unordsf2(SFtype a, SFtype b)
+{
+  FP_DECL_S(A);
+  FP_DECL_S(B);
+  CMPtype r;
+
+  FP_UNPACK_RAW_S(A, a);
+  FP_UNPACK_RAW_S(B, b);
+  FP_CMP_UNORD_S(r, A, B);
+
+  return r;
+}
diff --git a/libgcc/soft-fp/unordtf2.c b/libgcc/soft-fp/unordtf2.c
new file mode 100644 (file)
index 0000000..9d1bd91
--- /dev/null
@@ -0,0 +1,45 @@
+/* Software floating-point emulation.
+   Return 1 iff a or b is a NaN, 0 otherwise.
+   Copyright (C) 2006,2007 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Joseph Myers (joseph@codesourcery.com).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "soft-fp.h"
+#include "quad.h"
+
+CMPtype __unordtf2(TFtype a, TFtype b)
+{
+  FP_DECL_Q(A);
+  FP_DECL_Q(B);
+  CMPtype r;
+
+  FP_UNPACK_RAW_Q(A, a);
+  FP_UNPACK_RAW_Q(B, b);
+  FP_CMP_UNORD_Q(r, A, B);
+
+  return r;
+}