diff options
Diffstat (limited to 'rts/gmp/mpz')
123 files changed, 0 insertions, 11451 deletions
diff --git a/rts/gmp/mpz/Makefile.am b/rts/gmp/mpz/Makefile.am deleted file mode 100644 index cd6fec4e21..0000000000 --- a/rts/gmp/mpz/Makefile.am +++ /dev/null @@ -1,58 +0,0 @@ -## Process this file with automake to generate Makefile.in - -# Copyright (C) 1996, 1998, 1999, 2000 Free Software Foundation, Inc. -# -# This file is part of the GNU MP Library. -# -# The GNU MP 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. -# -# The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -# the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -# MA 02111-1307, USA. - - -AUTOMAKE_OPTIONS = gnu no-dependencies - -SUBDIRS = tests - -INCLUDES = -I$(top_srcdir) -DOPERATION_$* - -noinst_LTLIBRARIES = libmpz.la -libmpz_la_SOURCES = \ - abs.c add.c add_ui.c addmul_ui.c and.c array_init.c \ - bin_ui.c bin_uiui.c cdiv_q.c \ - cdiv_q_ui.c cdiv_qr.c cdiv_qr_ui.c cdiv_r.c cdiv_r_ui.c cdiv_ui.c \ - clear.c clrbit.c cmp.c cmp_si.c cmp_ui.c cmpabs.c cmpabs_ui.c com.c \ - divexact.c dump.c fac_ui.c fdiv_q.c fdiv_q_2exp.c fdiv_q_ui.c \ - fdiv_qr.c fdiv_qr_ui.c fdiv_r.c fdiv_r_2exp.c fdiv_r_ui.c fdiv_ui.c \ - fib_ui.c fits_sint_p.c fits_slong_p.c fits_sshort_p.c fits_uint_p.c \ - fits_ulong_p.c fits_ushort_p.c gcd.c gcd_ui.c gcdext.c get_d.c get_si.c \ - get_str.c get_ui.c getlimbn.c hamdist.c init.c inp_raw.c inp_str.c \ - invert.c ior.c iset.c iset_d.c iset_si.c iset_str.c iset_ui.c \ - jacobi.c kronsz.c kronuz.c kronzs.c kronzu.c \ - lcm.c legendre.c mod.c mul.c mul_2exp.c neg.c nextprime.c \ - out_raw.c out_str.c perfpow.c perfsqr.c popcount.c pow_ui.c powm.c \ - powm_ui.c pprime_p.c random.c random2.c realloc.c remove.c root.c rrandomb.c \ - scan0.c scan1.c set.c set_d.c set_f.c set_q.c set_si.c set_str.c \ - set_ui.c setbit.c size.c sizeinbase.c sqrt.c sqrtrem.c sub.c \ - sub_ui.c swap.c tdiv_ui.c tdiv_q.c tdiv_q_2exp.c tdiv_q_ui.c tdiv_qr.c \ - tdiv_qr_ui.c tdiv_r.c tdiv_r_2exp.c tdiv_r_ui.c tstbit.c ui_pow_ui.c \ - urandomb.c urandomm.c xor.c - -EXTRA_DIST = mul_siui.c -nodist_libmpz_la_SOURCES = mul_si.c mul_ui.c -CLEANFILES = $(nodist_libmpz_la_SOURCES) - -mul_si.c: $(srcdir)/mul_siui.c - cp $(srcdir)/mul_siui.c mul_si.c -mul_ui.c: $(srcdir)/mul_siui.c - cp $(srcdir)/mul_siui.c mul_ui.c diff --git a/rts/gmp/mpz/Makefile.in b/rts/gmp/mpz/Makefile.in deleted file mode 100644 index e0f2cdc133..0000000000 --- a/rts/gmp/mpz/Makefile.in +++ /dev/null @@ -1,457 +0,0 @@ -# Makefile.in generated automatically by automake 1.4a from Makefile.am - -# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -SHELL = @SHELL@ - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -prefix = @prefix@ -exec_prefix = @exec_prefix@ - -bindir = @bindir@ -sbindir = @sbindir@ -libexecdir = @libexecdir@ -datadir = @datadir@ -sysconfdir = @sysconfdir@ -sharedstatedir = @sharedstatedir@ -localstatedir = @localstatedir@ -libdir = @libdir@ -infodir = @infodir@ -mandir = @mandir@ -includedir = @includedir@ -oldincludedir = /usr/include - -DESTDIR = - -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ - -top_builddir = .. - -ACLOCAL = @ACLOCAL@ -AUTOCONF = @AUTOCONF@ -AUTOMAKE = @AUTOMAKE@ -AUTOHEADER = @AUTOHEADER@ - -INSTALL = @INSTALL@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_FLAG = -transform = @program_transform_name@ - -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : - -@SET_MAKE@ -build_alias = @build_alias@ -build_triplet = @build@ -host_alias = @host_alias@ -host_triplet = @host@ -target_alias = @target_alias@ -target_triplet = @target@ -AMDEP = @AMDEP@ -AMTAR = @AMTAR@ -AR = @AR@ -AS = @AS@ -AWK = @AWK@ -CALLING_CONVENTIONS_OBJS = @CALLING_CONVENTIONS_OBJS@ -CC = @CC@ -CCAS = @CCAS@ -CPP = @CPP@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ -EXEEXT = @EXEEXT@ -LIBTOOL = @LIBTOOL@ -LN_S = @LN_S@ -M4 = @M4@ -MAINT = @MAINT@ -MAKEINFO = @MAKEINFO@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -RANLIB = @RANLIB@ -SPEED_CYCLECOUNTER_OBJS = @SPEED_CYCLECOUNTER_OBJS@ -STRIP = @STRIP@ -U = @U@ -VERSION = @VERSION@ -gmp_srclinks = @gmp_srclinks@ -install_sh = @install_sh@ -mpn_objects = @mpn_objects@ -mpn_objs_in_libgmp = @mpn_objs_in_libgmp@ - -# Copyright (C) 1996, 1998, 1999, 2000 Free Software Foundation, Inc. -# -# This file is part of the GNU MP Library. -# -# The GNU MP 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. -# -# The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -# the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -# MA 02111-1307, USA. - - -AUTOMAKE_OPTIONS = gnu no-dependencies - -SUBDIRS = - -INCLUDES = -I$(top_srcdir) -DOPERATION_$* - -noinst_LTLIBRARIES = libmpz.la -libmpz_la_SOURCES = \ - abs.c add.c add_ui.c addmul_ui.c and.c array_init.c \ - bin_ui.c bin_uiui.c cdiv_q.c \ - cdiv_q_ui.c cdiv_qr.c cdiv_qr_ui.c cdiv_r.c cdiv_r_ui.c cdiv_ui.c \ - clear.c clrbit.c cmp.c cmp_si.c cmp_ui.c cmpabs.c cmpabs_ui.c com.c \ - divexact.c dump.c fac_ui.c fdiv_q.c fdiv_q_2exp.c fdiv_q_ui.c \ - fdiv_qr.c fdiv_qr_ui.c fdiv_r.c fdiv_r_2exp.c fdiv_r_ui.c fdiv_ui.c \ - fib_ui.c fits_sint_p.c fits_slong_p.c fits_sshort_p.c fits_uint_p.c \ - fits_ulong_p.c fits_ushort_p.c gcd.c gcd_ui.c gcdext.c get_d.c get_si.c \ - get_str.c get_ui.c getlimbn.c hamdist.c init.c inp_raw.c inp_str.c \ - invert.c ior.c iset.c iset_d.c iset_si.c iset_str.c iset_ui.c \ - jacobi.c kronsz.c kronuz.c kronzs.c kronzu.c \ - lcm.c legendre.c mod.c mul.c mul_2exp.c neg.c nextprime.c \ - out_raw.c out_str.c perfpow.c perfsqr.c popcount.c pow_ui.c powm.c \ - powm_ui.c pprime_p.c random.c random2.c realloc.c remove.c root.c rrandomb.c \ - scan0.c scan1.c set.c set_d.c set_f.c set_q.c set_si.c set_str.c \ - set_ui.c setbit.c size.c sizeinbase.c sqrt.c sqrtrem.c sub.c \ - sub_ui.c swap.c tdiv_ui.c tdiv_q.c tdiv_q_2exp.c tdiv_q_ui.c tdiv_qr.c \ - tdiv_qr_ui.c tdiv_r.c tdiv_r_2exp.c tdiv_r_ui.c tstbit.c ui_pow_ui.c \ - urandomb.c urandomm.c xor.c - - -EXTRA_DIST = mul_siui.c -nodist_libmpz_la_SOURCES = mul_si.c mul_ui.c -CLEANFILES = $(nodist_libmpz_la_SOURCES) -subdir = mpz -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs -CONFIG_HEADER = ../config.h -CONFIG_CLEAN_FILES = -LTLIBRARIES = $(noinst_LTLIBRARIES) - - -DEFS = @DEFS@ -I. -I$(srcdir) -I.. -CPPFLAGS = @CPPFLAGS@ -LDFLAGS = @LDFLAGS@ -LIBS = @LIBS@ -libmpz_la_LDFLAGS = -libmpz_la_LIBADD = -am_libmpz_la_OBJECTS = abs.lo add.lo add_ui.lo addmul_ui.lo and.lo \ -array_init.lo bin_ui.lo bin_uiui.lo cdiv_q.lo cdiv_q_ui.lo cdiv_qr.lo \ -cdiv_qr_ui.lo cdiv_r.lo cdiv_r_ui.lo cdiv_ui.lo clear.lo clrbit.lo \ -cmp.lo cmp_si.lo cmp_ui.lo cmpabs.lo cmpabs_ui.lo com.lo divexact.lo \ -dump.lo fac_ui.lo fdiv_q.lo fdiv_q_2exp.lo fdiv_q_ui.lo fdiv_qr.lo \ -fdiv_qr_ui.lo fdiv_r.lo fdiv_r_2exp.lo fdiv_r_ui.lo fdiv_ui.lo \ -fib_ui.lo fits_sint_p.lo fits_slong_p.lo fits_sshort_p.lo \ -fits_uint_p.lo fits_ulong_p.lo fits_ushort_p.lo gcd.lo gcd_ui.lo \ -gcdext.lo get_d.lo get_si.lo get_str.lo get_ui.lo getlimbn.lo \ -hamdist.lo init.lo inp_raw.lo inp_str.lo invert.lo ior.lo iset.lo \ -iset_d.lo iset_si.lo iset_str.lo iset_ui.lo jacobi.lo kronsz.lo \ -kronuz.lo kronzs.lo kronzu.lo lcm.lo legendre.lo mod.lo mul.lo \ -mul_2exp.lo neg.lo nextprime.lo out_raw.lo out_str.lo perfpow.lo \ -perfsqr.lo popcount.lo pow_ui.lo powm.lo powm_ui.lo pprime_p.lo \ -random.lo random2.lo realloc.lo remove.lo root.lo rrandomb.lo scan0.lo \ -scan1.lo set.lo set_d.lo set_f.lo set_q.lo set_si.lo set_str.lo \ -set_ui.lo setbit.lo size.lo sizeinbase.lo sqrt.lo sqrtrem.lo sub.lo \ -sub_ui.lo swap.lo tdiv_ui.lo tdiv_q.lo tdiv_q_2exp.lo tdiv_q_ui.lo \ -tdiv_qr.lo tdiv_qr_ui.lo tdiv_r.lo tdiv_r_2exp.lo tdiv_r_ui.lo \ -tstbit.lo ui_pow_ui.lo urandomb.lo urandomm.lo xor.lo -nodist_libmpz_la_OBJECTS = mul_si.lo mul_ui.lo -libmpz_la_OBJECTS = $(am_libmpz_la_OBJECTS) $(nodist_libmpz_la_OBJECTS) -COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -CFLAGS = @CFLAGS@ -CCLD = $(CC) -LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ -DIST_SOURCES = $(libmpz_la_SOURCES) -DIST_COMMON = README Makefile.am Makefile.in - - -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) - -GZIP_ENV = --best -depcomp = -SOURCES = $(libmpz_la_SOURCES) $(nodist_libmpz_la_SOURCES) -OBJECTS = $(am_libmpz_la_OBJECTS) $(nodist_libmpz_la_OBJECTS) - -all: all-redirect -.SUFFIXES: -.SUFFIXES: .c .lo .o .obj -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) - cd $(top_srcdir) && $(AUTOMAKE) --gnu mpz/Makefile - -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - cd $(top_builddir) \ - && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status - - -mostlyclean-noinstLTLIBRARIES: - -clean-noinstLTLIBRARIES: - -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) - -distclean-noinstLTLIBRARIES: - -maintainer-clean-noinstLTLIBRARIES: - -mostlyclean-compile: - -rm -f *.o core *.core - -rm -f *.$(OBJEXT) - -clean-compile: - -distclean-compile: - -rm -f *.tab.c - -maintainer-clean-compile: - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -maintainer-clean-libtool: - -libmpz.la: $(libmpz_la_OBJECTS) $(libmpz_la_DEPENDENCIES) - $(LINK) $(libmpz_la_LDFLAGS) $(libmpz_la_OBJECTS) $(libmpz_la_LIBADD) $(LIBS) -.c.o: - $(COMPILE) -c $< -.c.obj: - $(COMPILE) -c `cygpath -w $<` -.c.lo: - $(LTCOMPILE) -c -o $@ $< - -# This directory's subdirectories are mostly independent; you can cd -# into them and run `make' without going through this Makefile. -# To change the values of `make' variables: instead of editing Makefiles, -# (1) if the variable is set in `config.status', edit `config.status' -# (which will cause the Makefiles to be regenerated when you run `make'); -# (2) otherwise, pass the desired values on the `make' command line. - -all-recursive install-data-recursive install-exec-recursive \ -installdirs-recursive install-recursive uninstall-recursive \ -check-recursive installcheck-recursive info-recursive dvi-recursive: - @set fnord $(MAKEFLAGS); amf=$$2; \ - dot_seen=no; \ - target=`echo $@ | sed s/-recursive//`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - dot_seen=yes; \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ - done; \ - if test "$$dot_seen" = "no"; then \ - $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ - fi; test -z "$$fail" - -mostlyclean-recursive clean-recursive distclean-recursive \ -maintainer-clean-recursive: - @set fnord $(MAKEFLAGS); amf=$$2; \ - dot_seen=no; \ - rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \ - rev="$$subdir $$rev"; \ - if test "$$subdir" = "."; then dot_seen=yes; else :; fi; \ - done; \ - test "$$dot_seen" = "no" && rev=". $$rev"; \ - target=`echo $@ | sed s/-recursive//`; \ - for subdir in $$rev; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ - done && test -z "$$fail" -tags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ - done - -tags: TAGS - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - mkid -f$$here/ID $$unique $(LISP) - -TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \ - fi; \ - done; \ - list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ - || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) - -mostlyclean-tags: - -clean-tags: - -distclean-tags: - -rm -f TAGS ID - -maintainer-clean-tags: - -distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) - -distdir: $(DISTFILES) - @for file in $(DISTFILES); do \ - d=$(srcdir); \ - if test -d $$d/$$file; then \ - cp -pR $$d/$$file $(distdir); \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file || :; \ - fi; \ - done - for subdir in $(SUBDIRS); do \ - if test "$$subdir" = .; then :; else \ - test -d $(distdir)/$$subdir \ - || mkdir $(distdir)/$$subdir \ - || exit 1; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(top_distdir) distdir=../$(distdir)/$$subdir distdir) \ - || exit 1; \ - fi; \ - done -info-am: -info: info-recursive -dvi-am: -dvi: dvi-recursive -check-am: all-am -check: check-recursive -installcheck-am: -installcheck: installcheck-recursive -install-exec-am: -install-exec: install-exec-recursive - -install-data-am: -install-data: install-data-recursive - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am -install: install-recursive -uninstall-am: -uninstall: uninstall-recursive -all-am: Makefile $(LTLIBRARIES) -all-redirect: all-recursive -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_STRIP_FLAG=-s install -installdirs: installdirs-recursive -installdirs-am: - - -mostlyclean-generic: - -clean-generic: - -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) - -distclean-generic: - -rm -f Makefile $(CONFIG_CLEAN_FILES) - -rm -f config.cache config.log stamp-h stamp-h[0-9]* - -maintainer-clean-generic: - -rm -f Makefile.in -mostlyclean-am: mostlyclean-noinstLTLIBRARIES mostlyclean-compile \ - mostlyclean-libtool mostlyclean-tags \ - mostlyclean-generic - -mostlyclean: mostlyclean-recursive - -clean-am: clean-noinstLTLIBRARIES clean-compile clean-libtool \ - clean-tags clean-generic mostlyclean-am - -clean: clean-recursive - -distclean-am: distclean-noinstLTLIBRARIES distclean-compile \ - distclean-libtool distclean-tags distclean-generic \ - clean-am - -rm -f libtool - -distclean: distclean-recursive - -maintainer-clean-am: maintainer-clean-noinstLTLIBRARIES \ - maintainer-clean-compile maintainer-clean-libtool \ - maintainer-clean-tags maintainer-clean-generic \ - distclean-am - @echo "This command is intended for maintainers to use;" - @echo "it deletes files that may require special tools to rebuild." - -maintainer-clean: maintainer-clean-recursive - -.PHONY: mostlyclean-noinstLTLIBRARIES distclean-noinstLTLIBRARIES \ -clean-noinstLTLIBRARIES maintainer-clean-noinstLTLIBRARIES \ -mostlyclean-compile distclean-compile clean-compile \ -maintainer-clean-compile mostlyclean-libtool distclean-libtool \ -clean-libtool maintainer-clean-libtool install-recursive \ -uninstall-recursive install-data-recursive uninstall-data-recursive \ -install-exec-recursive uninstall-exec-recursive installdirs-recursive \ -uninstalldirs-recursive all-recursive check-recursive \ -installcheck-recursive info-recursive dvi-recursive \ -mostlyclean-recursive distclean-recursive clean-recursive \ -maintainer-clean-recursive tags tags-recursive mostlyclean-tags \ -distclean-tags clean-tags maintainer-clean-tags distdir info-am info \ -dvi-am dvi check check-am installcheck-am installcheck install-exec-am \ -install-exec install-data-am install-data install-am install \ -uninstall-am uninstall all-redirect all-am all install-strip \ -installdirs-am installdirs mostlyclean-generic distclean-generic \ -clean-generic maintainer-clean-generic clean mostlyclean distclean \ -maintainer-clean - - -mul_si.c: $(srcdir)/mul_siui.c - cp $(srcdir)/mul_siui.c mul_si.c -mul_ui.c: $(srcdir)/mul_siui.c - cp $(srcdir)/mul_siui.c mul_ui.c - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/rts/gmp/mpz/README b/rts/gmp/mpz/README deleted file mode 100644 index 06b481d770..0000000000 --- a/rts/gmp/mpz/README +++ /dev/null @@ -1,23 +0,0 @@ -This directory contains functions for GMP's integer function layer. - -In this version of GMP, integers are represented like in the figure below. -(Please note that the format might change between every version, and that -depending on the internal format in any way is a bad idea.) - - most least -significant significant - limb limb - - _mp_d - / - / - \/ - ____ ____ ____ ____ ____ - |____|____|____|____|____| - - <------- _mp_size -------> - - -The most significant limb will be non-zero. The _mp_size field's sign -reflects the sign of the number. Its absolute value is the count of limbs -in the number. diff --git a/rts/gmp/mpz/abs.c b/rts/gmp/mpz/abs.c deleted file mode 100644 index 0b5eab1ce6..0000000000 --- a/rts/gmp/mpz/abs.c +++ /dev/null @@ -1,51 +0,0 @@ -/* mpz_abs(dst, src) -- Assign the absolute value of SRC to DST. - -Copyright (C) 1991, 1993, 1994, 1995 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -void -#if __STDC__ -mpz_abs (mpz_ptr w, mpz_srcptr u) -#else -mpz_abs (w, u) - mpz_ptr w; - mpz_srcptr u; -#endif -{ - mp_ptr wp, up; - mp_size_t size; - - size = ABS (u->_mp_size); - - if (u != w) - { - if (w->_mp_alloc < size) - _mpz_realloc (w, size); - - wp = w->_mp_d; - up = u->_mp_d; - - MPN_COPY (wp, up, size); - } - - w->_mp_size = size; -} diff --git a/rts/gmp/mpz/add.c b/rts/gmp/mpz/add.c deleted file mode 100644 index a22c3778fb..0000000000 --- a/rts/gmp/mpz/add.c +++ /dev/null @@ -1,123 +0,0 @@ -/* mpz_add -- Add two integers. - -Copyright (C) 1991, 1993, 1994, 1996, 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" -#ifdef BERKELEY_MP -#include "mp.h" -#endif - -#ifndef BERKELEY_MP -void -#if __STDC__ -mpz_add (mpz_ptr w, mpz_srcptr u, mpz_srcptr v) -#else -mpz_add (w, u, v) - mpz_ptr w; - mpz_srcptr u; - mpz_srcptr v; -#endif -#else /* BERKELEY_MP */ -void -#if __STDC__ -madd (mpz_srcptr u, mpz_srcptr v, mpz_ptr w) -#else -madd (u, v, w) - mpz_srcptr u; - mpz_srcptr v; - mpz_ptr w; -#endif -#endif /* BERKELEY_MP */ -{ - mp_srcptr up, vp; - mp_ptr wp; - mp_size_t usize, vsize, wsize; - mp_size_t abs_usize; - mp_size_t abs_vsize; - - usize = u->_mp_size; - vsize = v->_mp_size; - abs_usize = ABS (usize); - abs_vsize = ABS (vsize); - - if (abs_usize < abs_vsize) - { - /* Swap U and V. */ - MPZ_SRCPTR_SWAP (u, v); - MP_SIZE_T_SWAP (usize, vsize); - MP_SIZE_T_SWAP (abs_usize, abs_vsize); - } - - /* True: ABS_USIZE >= ABS_VSIZE. */ - - /* If not space for w (and possible carry), increase space. */ - wsize = abs_usize + 1; - if (w->_mp_alloc < wsize) - _mpz_realloc (w, wsize); - - /* These must be after realloc (u or v may be the same as w). */ - up = u->_mp_d; - vp = v->_mp_d; - wp = w->_mp_d; - - if ((usize ^ vsize) < 0) - { - /* U and V have different sign. Need to compare them to determine - which operand to subtract from which. */ - - /* This test is right since ABS_USIZE >= ABS_VSIZE. */ - if (abs_usize != abs_vsize) - { - mpn_sub (wp, up, abs_usize, vp, abs_vsize); - wsize = abs_usize; - MPN_NORMALIZE (wp, wsize); - if (usize < 0) - wsize = -wsize; - } - else if (mpn_cmp (up, vp, abs_usize) < 0) - { - mpn_sub_n (wp, vp, up, abs_usize); - wsize = abs_usize; - MPN_NORMALIZE (wp, wsize); - if (usize >= 0) - wsize = -wsize; - } - else - { - mpn_sub_n (wp, up, vp, abs_usize); - wsize = abs_usize; - MPN_NORMALIZE (wp, wsize); - if (usize < 0) - wsize = -wsize; - } - } - else - { - /* U and V have same sign. Add them. */ - mp_limb_t cy_limb = mpn_add (wp, up, abs_usize, vp, abs_vsize); - wp[abs_usize] = cy_limb; - wsize = abs_usize + cy_limb; - if (usize < 0) - wsize = -wsize; - } - - w->_mp_size = wsize; -} diff --git a/rts/gmp/mpz/add_ui.c b/rts/gmp/mpz/add_ui.c deleted file mode 100644 index 28dbd71f45..0000000000 --- a/rts/gmp/mpz/add_ui.c +++ /dev/null @@ -1,84 +0,0 @@ -/* mpz_add_ui -- Add an mpz_t and an unsigned one-word integer. - -Copyright (C) 1991, 1993, 1994, 1996, 1999 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -void -#if __STDC__ -mpz_add_ui (mpz_ptr w, mpz_srcptr u, unsigned long int v) -#else -mpz_add_ui (w, u, v) - mpz_ptr w; - mpz_srcptr u; - unsigned long int v; -#endif -{ - mp_srcptr up; - mp_ptr wp; - mp_size_t usize, wsize; - mp_size_t abs_usize; - - usize = u->_mp_size; - abs_usize = ABS (usize); - - /* If not space for W (and possible carry), increase space. */ - wsize = abs_usize + 1; - if (w->_mp_alloc < wsize) - _mpz_realloc (w, wsize); - - /* These must be after realloc (U may be the same as W). */ - up = u->_mp_d; - wp = w->_mp_d; - - if (abs_usize == 0) - { - wp[0] = v; - w->_mp_size = v != 0; - return; - } - - if (usize >= 0) - { - mp_limb_t cy; - cy = mpn_add_1 (wp, up, abs_usize, (mp_limb_t) v); - wp[abs_usize] = cy; - wsize = abs_usize + cy; - } - else - { - /* The signs are different. Need exact comparison to determine - which operand to subtract from which. */ - if (abs_usize == 1 && up[0] < v) - { - wp[0] = v - up[0]; - wsize = 1; - } - else - { - mpn_sub_1 (wp, up, abs_usize, (mp_limb_t) v); - /* Size can decrease with at most one limb. */ - wsize = -(abs_usize - (wp[abs_usize - 1] == 0)); - } - } - - w->_mp_size = wsize; -} diff --git a/rts/gmp/mpz/addmul_ui.c b/rts/gmp/mpz/addmul_ui.c deleted file mode 100644 index 7b38d3624d..0000000000 --- a/rts/gmp/mpz/addmul_ui.c +++ /dev/null @@ -1,214 +0,0 @@ -/* mpz_addmul_ui(prodsum, multiplier, small_multiplicand) -- - Add MULTIPLICATOR times SMALL_MULTIPLICAND to PRODSUM. - -Copyright (C) 1997, 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -static mp_limb_t mpn_neg1 _PROTO ((mp_ptr, mp_size_t)); - -#if 0 -#undef MPN_NORMALIZE -#define MPN_NORMALIZE(DST, NLIMBS) \ - do { \ - while (--(NLIMBS) >= 0 && (DST)[NLIMBS] == 0) \ - ; \ - (NLIMBS)++; \ - } while (0) -#undef MPN_NORMALIZE_NOT_ZERO -#define MPN_NORMALIZE_NOT_ZERO(DST, NLIMBS) \ - do { \ - while ((DST)[--(NLIMBS)] == 0) \ - ; \ - (NLIMBS)++; \ - } while (0) -#endif - -void -#if __STDC__ -mpz_addmul_ui (mpz_ptr rz, mpz_srcptr az, unsigned long int bu) -#else -mpz_addmul_ui (rz, az, bu) - mpz_ptr rz; - mpz_srcptr az; - unsigned long int bu; -#endif -{ - mp_size_t rn, an; - mp_ptr rp, ap; - - an = SIZ (az); - - /* If either multiplier is zero, result is unaffected. */ - if (bu == 0 || an == 0) - return; - - rn = SIZ (rz); - - if (rn == 0) - { - mp_limb_t cy; - - an = ABS (an); - if (ALLOC (rz) <= an) - _mpz_realloc (rz, an + 1); - rp = PTR (rz); - ap = PTR (az); - cy = mpn_mul_1 (rp, ap, an, (mp_limb_t) bu); - rp[an] = cy; - an += cy != 0; - SIZ (rz) = SIZ (az) >= 0 ? an : -an; - return; - } - - if ((an ^ rn) >= 0) - { - /* Sign of operands are the same--really add. */ - an = ABS (an); - rn = ABS (rn); - if (rn > an) - { - mp_limb_t cy; - if (ALLOC (rz) <= rn) - _mpz_realloc (rz, rn + 1); - rp = PTR (rz); - ap = PTR (az); - cy = mpn_addmul_1 (rp, ap, an, (mp_limb_t) bu); - cy = mpn_add_1 (rp + an, rp + an, rn - an, cy); - rp[rn] = cy; - rn += cy != 0; - SIZ (rz) = SIZ (rz) >= 0 ? rn : -rn; - return; - } - else - { - mp_limb_t cy; - if (ALLOC (rz) <= an) - _mpz_realloc (rz, an + 1); - rp = PTR (rz); - ap = PTR (az); - cy = mpn_addmul_1 (rp, ap, rn, (mp_limb_t) bu); - if (an != rn) - { - mp_limb_t cy2; - cy2 = mpn_mul_1 (rp + rn, ap + rn, an - rn, (mp_limb_t) bu); - cy = cy2 + mpn_add_1 (rp + rn, rp + rn, an - rn, cy); - } - rn = an; - rp[rn] = cy; - rn += cy != 0; - SIZ (rz) = SIZ (rz) >= 0 ? rn : -rn; - return; - } - } - else - { - /* Sign of operands are different--actually subtract. */ - an = ABS (an); - rn = ABS (rn); - if (rn > an) - { - mp_limb_t cy; - rp = PTR (rz); - ap = PTR (az); - cy = mpn_submul_1 (rp, ap, an, (mp_limb_t) bu); - cy = mpn_sub_1 (rp + an, rp + an, rn - an, cy); - if (cy != 0) - { - mpn_neg1 (rp, rn); - MPN_NORMALIZE_NOT_ZERO (rp, rn); - } - else - { - MPN_NORMALIZE (rp, rn); - rn = -rn; - } - - SIZ (rz) = SIZ (rz) >= 0 ? -rn : rn; - return; - } - else - { - /* Tricky case. We need to subtract an operand that might be larger - than the minuend. To avoid allocating temporary space, we compute - a*b-r instead of r-a*b and then negate. */ - mp_limb_t cy; - if (ALLOC (rz) <= an) - _mpz_realloc (rz, an + 1); - rp = PTR (rz); - ap = PTR (az); - cy = mpn_submul_1 (rp, ap, rn, (mp_limb_t) bu); - if (an != rn) - { - mp_limb_t cy2; - cy -= mpn_neg1 (rp, rn); - cy2 = mpn_mul_1 (rp + rn, ap + rn, an - rn, (mp_limb_t) bu); - if (cy == ~(mp_limb_t) 0) - cy = cy2 - mpn_sub_1 (rp + rn, rp + rn, an - rn, (mp_limb_t) 1); - else - cy = cy2 + mpn_add_1 (rp + rn, rp + rn, an - rn, cy); - rp[an] = cy; - rn = an + (cy != 0); - rn -= rp[rn - 1] == 0; - } - else if (cy != 0) - { - cy -= mpn_neg1 (rp, rn); - rp[an] = cy; - rn = an + 1; - MPN_NORMALIZE_NOT_ZERO (rp, rn); - } - else - { - rn = an; - MPN_NORMALIZE (rp, rn); - rn = -rn; - } - - SIZ (rz) = SIZ (rz) >= 0 ? -rn : rn; - return; - } - } -} - -static mp_limb_t -#if __STDC__ -mpn_neg1 (mp_ptr rp, mp_size_t rn) -#else -mpn_neg1 (rp, rn) - mp_ptr rp; - mp_size_t rn; -#endif -{ - mp_size_t i; - - while (rn != 0 && rp[0] == 0) - rp++, rn--; - - if (rn != 0) - { - rp[0] = -rp[0]; - for (i = 1; i < rn; i++) - rp[i] = ~rp[i]; - return 1; - } - return 0; -} diff --git a/rts/gmp/mpz/and.c b/rts/gmp/mpz/and.c deleted file mode 100644 index 354e9455bf..0000000000 --- a/rts/gmp/mpz/and.c +++ /dev/null @@ -1,278 +0,0 @@ -/* mpz_and -- Logical and. - -Copyright (C) 1991, 1993, 1994, 1996, 1997, 2000 Free Software Foundation, -Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -void -#if __STDC__ -mpz_and (mpz_ptr res, mpz_srcptr op1, mpz_srcptr op2) -#else -mpz_and (res, op1, op2) - mpz_ptr res; - mpz_srcptr op1; - mpz_srcptr op2; -#endif -{ - mp_srcptr op1_ptr, op2_ptr; - mp_size_t op1_size, op2_size; - mp_ptr res_ptr; - mp_size_t res_size; - mp_size_t i; - TMP_DECL (marker); - - TMP_MARK (marker); - op1_size = op1->_mp_size; - op2_size = op2->_mp_size; - - op1_ptr = op1->_mp_d; - op2_ptr = op2->_mp_d; - res_ptr = res->_mp_d; - - if (op1_size >= 0) - { - if (op2_size >= 0) - { - res_size = MIN (op1_size, op2_size); - /* First loop finds the size of the result. */ - for (i = res_size - 1; i >= 0; i--) - if ((op1_ptr[i] & op2_ptr[i]) != 0) - break; - res_size = i + 1; - - /* Handle allocation, now then we know exactly how much space is - needed for the result. */ - if (res->_mp_alloc < res_size) - { - _mpz_realloc (res, res_size); - op1_ptr = op1->_mp_d; - op2_ptr = op2->_mp_d; - res_ptr = res->_mp_d; - } - - /* Second loop computes the real result. */ - for (i = res_size - 1; i >= 0; i--) - res_ptr[i] = op1_ptr[i] & op2_ptr[i]; - - res->_mp_size = res_size; - return; - } - else /* op2_size < 0 */ - { - /* Fall through to the code at the end of the function. */ - } - } - else - { - if (op2_size < 0) - { - mp_ptr opx; - mp_limb_t cy; - mp_size_t res_alloc; - - /* Both operands are negative, so will be the result. - -((-OP1) & (-OP2)) = -(~(OP1 - 1) & ~(OP2 - 1)) = - = ~(~(OP1 - 1) & ~(OP2 - 1)) + 1 = - = ((OP1 - 1) | (OP2 - 1)) + 1 */ - - /* It might seem as we could end up with an (invalid) result with - a leading zero-limb here when one of the operands is of the - type 1,,0,,..,,.0. But some analysis shows that we surely - would get carry into the zero-limb in this situation... */ - - op1_size = -op1_size; - op2_size = -op2_size; - - res_alloc = 1 + MAX (op1_size, op2_size); - - opx = (mp_ptr) TMP_ALLOC (op1_size * BYTES_PER_MP_LIMB); - mpn_sub_1 (opx, op1_ptr, op1_size, (mp_limb_t) 1); - op1_ptr = opx; - - opx = (mp_ptr) TMP_ALLOC (op2_size * BYTES_PER_MP_LIMB); - mpn_sub_1 (opx, op2_ptr, op2_size, (mp_limb_t) 1); - op2_ptr = opx; - - if (res->_mp_alloc < res_alloc) - { - _mpz_realloc (res, res_alloc); - res_ptr = res->_mp_d; - /* Don't re-read OP1_PTR and OP2_PTR. They point to - temporary space--never to the space RES->_mp_d used - to point to before reallocation. */ - } - - if (op1_size >= op2_size) - { - MPN_COPY (res_ptr + op2_size, op1_ptr + op2_size, - op1_size - op2_size); - for (i = op2_size - 1; i >= 0; i--) - res_ptr[i] = op1_ptr[i] | op2_ptr[i]; - res_size = op1_size; - } - else - { - MPN_COPY (res_ptr + op1_size, op2_ptr + op1_size, - op2_size - op1_size); - for (i = op1_size - 1; i >= 0; i--) - res_ptr[i] = op1_ptr[i] | op2_ptr[i]; - res_size = op2_size; - } - - cy = mpn_add_1 (res_ptr, res_ptr, res_size, (mp_limb_t) 1); - if (cy) - { - res_ptr[res_size] = cy; - res_size++; - } - - res->_mp_size = -res_size; - TMP_FREE (marker); - return; - } - else - { - /* We should compute -OP1 & OP2. Swap OP1 and OP2 and fall - through to the code that handles OP1 & -OP2. */ - MPZ_SRCPTR_SWAP (op1, op2); - MPN_SRCPTR_SWAP (op1_ptr,op1_size, op2_ptr,op2_size); - } - - } - - { -#if ANDNEW - mp_size_t op2_lim; - mp_size_t count; - - /* OP2 must be negated as with infinite precision. - - Scan from the low end for a non-zero limb. The first non-zero - limb is simply negated (two's complement). Any subsequent - limbs are one's complemented. Of course, we don't need to - handle more limbs than there are limbs in the other, positive - operand as the result for those limbs is going to become zero - anyway. */ - - /* Scan for the least significant non-zero OP2 limb, and zero the - result meanwhile for those limb positions. (We will surely - find a non-zero limb, so we can write the loop with one - termination condition only.) */ - for (i = 0; op2_ptr[i] == 0; i++) - res_ptr[i] = 0; - op2_lim = i; - - op2_size = -op2_size; - - if (op1_size <= op2_size) - { - /* The ones-extended OP2 is >= than the zero-extended OP1. - RES_SIZE <= OP1_SIZE. Find the exact size. */ - for (i = op1_size - 1; i > op2_lim; i--) - if ((op1_ptr[i] & ~op2_ptr[i]) != 0) - break; - res_size = i + 1; - for (i = res_size - 1; i > op2_lim; i--) - res_ptr[i] = op1_ptr[i] & ~op2_ptr[i]; - res_ptr[op2_lim] = op1_ptr[op2_lim] & -op2_ptr[op2_lim]; - /* Yes, this *can* happen! */ - MPN_NORMALIZE (res_ptr, res_size); - } - else - { - /* The ones-extended OP2 is < than the zero-extended OP1. - RES_SIZE == OP1_SIZE, since OP1 is normalized. */ - res_size = op1_size; - MPN_COPY (res_ptr + op2_size, op1_ptr + op2_size, op1_size - op2_size); - for (i = op2_size - 1; i > op2_lim; i--) - res_ptr[i] = op1_ptr[i] & ~op2_ptr[i]; - res_ptr[op2_lim] = op1_ptr[op2_lim] & -op2_ptr[op2_lim]; - } - - res->_mp_size = res_size; -#else - - /* OP1 is positive and zero-extended, - OP2 is negative and ones-extended. - The result will be positive. - OP1 & -OP2 = OP1 & ~(OP2 - 1). */ - - mp_ptr opx; - - op2_size = -op2_size; - opx = (mp_ptr) TMP_ALLOC (op2_size * BYTES_PER_MP_LIMB); - mpn_sub_1 (opx, op2_ptr, op2_size, (mp_limb_t) 1); - op2_ptr = opx; - - if (op1_size > op2_size) - { - /* The result has the same size as OP1, since OP1 is normalized - and longer than the ones-extended OP2. */ - res_size = op1_size; - - /* Handle allocation, now then we know exactly how much space is - needed for the result. */ - if (res->_mp_alloc < res_size) - { - _mpz_realloc (res, res_size); - res_ptr = res->_mp_d; - op1_ptr = op1->_mp_d; - /* Don't re-read OP2_PTR. It points to temporary space--never - to the space RES->_mp_d used to point to before reallocation. */ - } - - MPN_COPY (res_ptr + op2_size, op1_ptr + op2_size, - res_size - op2_size); - for (i = op2_size - 1; i >= 0; i--) - res_ptr[i] = op1_ptr[i] & ~op2_ptr[i]; - - res->_mp_size = res_size; - } - else - { - /* Find out the exact result size. Ignore the high limbs of OP2, - OP1 is zero-extended and would make the result zero. */ - for (i = op1_size - 1; i >= 0; i--) - if ((op1_ptr[i] & ~op2_ptr[i]) != 0) - break; - res_size = i + 1; - - /* Handle allocation, now then we know exactly how much space is - needed for the result. */ - if (res->_mp_alloc < res_size) - { - _mpz_realloc (res, res_size); - res_ptr = res->_mp_d; - op1_ptr = op1->_mp_d; - /* Don't re-read OP2_PTR. It points to temporary space--never - to the space RES->_mp_d used to point to before reallocation. */ - } - - for (i = res_size - 1; i >= 0; i--) - res_ptr[i] = op1_ptr[i] & ~op2_ptr[i]; - - res->_mp_size = res_size; - } -#endif - } - TMP_FREE (marker); -} diff --git a/rts/gmp/mpz/array_init.c b/rts/gmp/mpz/array_init.c deleted file mode 100644 index 1c22046986..0000000000 --- a/rts/gmp/mpz/array_init.c +++ /dev/null @@ -1,48 +0,0 @@ -/* mpz_array_init (array, array_size, size_per_elem) -- - -Copyright (C) 1991, 1993, 1994, 1995 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -void -#if __STDC__ -mpz_array_init (mpz_ptr arr, mp_size_t arr_size, mp_size_t nbits) -#else -mpz_array_init (arr, arr_size, nbits) - mpz_ptr arr; - mp_size_t arr_size; - mp_size_t nbits; -#endif -{ - register mp_ptr p; - register size_t i; - mp_size_t nlimbs; - - nlimbs = (nbits + BITS_PER_MP_LIMB - 1) / BITS_PER_MP_LIMB; - p = (mp_ptr) (*_mp_allocate_func) (arr_size * nlimbs * BYTES_PER_MP_LIMB); - - for (i = 0; i < arr_size; i++) - { - arr[i]._mp_alloc = nlimbs + 1; /* Yes, lie a little... */ - arr[i]._mp_size = 0; - arr[i]._mp_d = p + i * nlimbs; - } -} diff --git a/rts/gmp/mpz/bin_ui.c b/rts/gmp/mpz/bin_ui.c deleted file mode 100644 index a7a6c98218..0000000000 --- a/rts/gmp/mpz/bin_ui.c +++ /dev/null @@ -1,141 +0,0 @@ -/* mpz_bin_uiui - compute n over k. - -Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" -#include "longlong.h" - - -/* This is a poor implementation. Look at bin_uiui.c for improvement ideas. - In fact consider calling mpz_bin_uiui() when the arguments fit, leaving - the code here only for big n. - - The identity bin(n,k) = (-1)^k * bin(-n+k-1,k) can be found in Knuth vol - 1 section 1.2.6 part G. */ - - -/* Enhancement: use mpn_divexact_1 when it exists */ -#define DIVIDE() \ - ASSERT (SIZ(r) > 0); \ - ASSERT_NOCARRY (mpn_divrem_1 (PTR(r), (mp_size_t) 0, \ - PTR(r), SIZ(r), kacc)); \ - SIZ(r) -= (PTR(r)[SIZ(r)-1] == 0); - -void -#if __STDC__ -mpz_bin_ui (mpz_ptr r, mpz_srcptr n, unsigned long int k) -#else -mpz_bin_ui (r, n, k) - mpz_ptr r; - mpz_srcptr n; - unsigned long int k; -#endif -{ - mpz_t ni; - mp_limb_t i; - mpz_t nacc; - mp_limb_t kacc; - mp_size_t negate; - - if (mpz_sgn (n) < 0) - { - /* bin(n,k) = (-1)^k * bin(-n+k-1,k), and set ni = -n+k-1 - k = -n-1 */ - mpz_init (ni); - mpz_neg (ni, n); - mpz_sub_ui (ni, ni, 1L); - negate = (k & 1); /* (-1)^k */ - } - else - { - /* bin(n,k) == 0 if k>n - (no test for this under the n<0 case, since -n+k-1 >= k there) */ - if (mpz_cmp_ui (n, k) < 0) - { - mpz_set_ui (r, 0L); - return; - } - - /* set ni = n-k */ - mpz_init (ni); - mpz_sub_ui (ni, n, k); - negate = 0; - } - - /* Now wanting bin(ni+k,k), with ni positive, and "negate" is the sign (0 - for positive, 1 for negative). */ - mpz_set_ui (r, 1L); - - /* Rewrite bin(n,k) as bin(n,n-k) if that is smaller. In this case it's - whether ni+k-k < k meaning ni<k, and if so change to denominator ni+k-k - = ni, and new ni of ni+k-ni = k. */ - if (mpz_cmp_ui (ni, k) < 0) - { - unsigned long tmp; - tmp = k; - k = mpz_get_ui (ni); - mpz_set_ui (ni, tmp); - } - - kacc = 1; - mpz_init_set_ui (nacc, 1); - - for (i = 1; i <= k; i++) - { - mp_limb_t k1, k0; - -#if 0 - mp_limb_t nacclow; - int c; - - nacclow = PTR(nacc)[0]; - for (c = 0; (((kacc | nacclow) & 1) == 0); c++) - { - kacc >>= 1; - nacclow >>= 1; - } - mpz_div_2exp (nacc, nacc, c); -#endif - - mpz_add_ui (ni, ni, 1); - mpz_mul (nacc, nacc, ni); - umul_ppmm (k1, k0, kacc, i); - if (k1 != 0) - { - /* Accumulator overflow. Perform bignum step. */ - mpz_mul (r, r, nacc); - mpz_set_ui (nacc, 1); - DIVIDE (); - kacc = i; - } - else - { - /* Save new products in accumulators to keep accumulating. */ - kacc = k0; - } - } - - mpz_mul (r, r, nacc); - DIVIDE (); - SIZ(r) = (SIZ(r) ^ -negate) + negate; - - mpz_clear (nacc); - mpz_clear (ni); -} diff --git a/rts/gmp/mpz/bin_uiui.c b/rts/gmp/mpz/bin_uiui.c deleted file mode 100644 index b37541ba54..0000000000 --- a/rts/gmp/mpz/bin_uiui.c +++ /dev/null @@ -1,120 +0,0 @@ -/* mpz_bin_uiui - compute n over k. - -Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" -#include "longlong.h" - - -/* Avoid reallocs by rounding up any new size */ -#define ROUNDUP_MASK 15 - -/* Enhancement: use mpn_divexact_1 when it exists */ -#define MULDIV() \ - MPZ_REALLOC (r, (SIZ(r)+1)|ROUNDUP_MASK); \ - PTR(r)[SIZ(r)] = mpn_mul_1 (PTR(r), PTR(r), SIZ(r), nacc); \ - ASSERT_NOCARRY (mpn_divrem_1 (PTR(r), (mp_size_t) 0, \ - PTR(r), SIZ(r)+1, kacc)); \ - SIZ(r) += (PTR(r)[SIZ(r)] != 0); - -void -#if __STDC__ -mpz_bin_uiui (mpz_ptr r, unsigned long int n, unsigned long int k) -#else -mpz_bin_uiui (r, n, k) - mpz_ptr r; - unsigned long int n; - unsigned long int k; -#endif -{ - unsigned long int i, j; - mp_limb_t nacc, kacc; - unsigned long int cnt; - - /* bin(n,k) = 0 if k>n. */ - if (n < k) - { - mpz_set_ui (r, 0); - return; - } - - /* Rewrite bin(n,k) as bin(n,n-k) if that is smaller. */ - k = MIN (k, n-k); - - /* bin(n,0) = 1 */ - if (k == 0) - { - mpz_set_ui (r, 1); - return; - } - - j = n - k + 1; - mpz_set_ui (r, j); - - /* Initialize accumulators. */ - nacc = 1; - kacc = 1; - - cnt = 0; - for (i = 2; i <= k; i++) - { - mp_limb_t n1, n0, k1, k0; - - j++; -#if 0 - /* Remove common multiples of 2. This will allow us to accumulate - more in nacc and kacc before we need a bignum step. It would make - sense to cancel factors of 3, 5, etc too, but this would be best - handled by sieving out factors. Alternatively, we could perform a - gcd of the accumulators just as they have overflown, and keep - accumulating until the gcd doesn't remove a significant factor. */ - while (((nacc | kacc) & 1) == 0) - { - nacc >>= 1; - kacc >>= 1; - } -#else - cnt = ((nacc | kacc) & 1) ^ 1; - nacc >>= cnt; - kacc >>= cnt; -#endif - /* Accumulate next multiples. */ - umul_ppmm (n1, n0, nacc, j); - umul_ppmm (k1, k0, kacc, i); - if (n1 != 0) - { - /* Accumulator overflow. Perform bignum step. */ - MULDIV (); - nacc = j; - kacc = i; - } - else - { - if (k1 != 0) abort (); - /* Save new products in accumulators to keep accumulating. */ - nacc = n0; - kacc = k0; - } - } - - /* Take care of whatever is left in accumulators. */ - MULDIV (); -} diff --git a/rts/gmp/mpz/cdiv_q.c b/rts/gmp/mpz/cdiv_q.c deleted file mode 100644 index b15ba8aaa9..0000000000 --- a/rts/gmp/mpz/cdiv_q.c +++ /dev/null @@ -1,51 +0,0 @@ -/* mpz_cdiv_q -- Division rounding the quotient towards +infinity. The - remainder gets the opposite sign as the denominator. - -Copyright (C) 1994, 1995, 1996, 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -void -#if __STDC__ -mpz_cdiv_q (mpz_ptr quot, mpz_srcptr dividend, mpz_srcptr divisor) -#else -mpz_cdiv_q (quot, dividend, divisor) - mpz_ptr quot; - mpz_srcptr dividend; - mpz_srcptr divisor; -#endif -{ - mp_size_t dividend_size = dividend->_mp_size; - mp_size_t divisor_size = divisor->_mp_size; - mpz_t rem; - TMP_DECL (marker); - - TMP_MARK (marker); - - MPZ_TMP_INIT (rem, ABS (divisor_size)); - - mpz_tdiv_qr (quot, rem, dividend, divisor); - - if ((divisor_size ^ dividend_size) >= 0 && rem->_mp_size != 0) - mpz_add_ui (quot, quot, 1L); - - TMP_FREE (marker); -} diff --git a/rts/gmp/mpz/cdiv_q_ui.c b/rts/gmp/mpz/cdiv_q_ui.c deleted file mode 100644 index 74f3a90b83..0000000000 --- a/rts/gmp/mpz/cdiv_q_ui.c +++ /dev/null @@ -1,67 +0,0 @@ -/* mpz_cdiv_q_ui -- Division rounding the quotient towards +infinity. The - remainder gets the opposite sign as the denominator. In order to make it - always fit into the return type, the negative of the true remainder is - returned. - -Copyright (C) 1994, 1996, 1999 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -unsigned long int -#if __STDC__ -mpz_cdiv_q_ui (mpz_ptr quot, mpz_srcptr dividend, unsigned long int divisor) -#else -mpz_cdiv_q_ui (quot, dividend, divisor) - mpz_ptr quot; - mpz_srcptr dividend; - unsigned long int divisor; -#endif -{ - mp_size_t dividend_size; - mp_size_t size; - mp_ptr quot_ptr; - mp_limb_t remainder_limb; - - if (divisor == 0) - DIVIDE_BY_ZERO; - - dividend_size = dividend->_mp_size; - size = ABS (dividend_size); - - if (quot->_mp_alloc < size) - _mpz_realloc (quot, size); - - quot_ptr = quot->_mp_d; - - remainder_limb = mpn_divmod_1 (quot_ptr, dividend->_mp_d, size, - (mp_limb_t) divisor); - - if (remainder_limb != 0 && dividend_size >= 0) - { - mpn_incr_u (quot_ptr, (mp_limb_t) 1); - remainder_limb = divisor - remainder_limb; - } - - size -= size != 0 && quot_ptr[size - 1] == 0; - quot->_mp_size = dividend_size >= 0 ? size : -size; - - return remainder_limb; -} diff --git a/rts/gmp/mpz/cdiv_qr.c b/rts/gmp/mpz/cdiv_qr.c deleted file mode 100644 index 29c7c41a4e..0000000000 --- a/rts/gmp/mpz/cdiv_qr.c +++ /dev/null @@ -1,64 +0,0 @@ -/* mpz_cdiv_qr -- Division rounding the quotient towards +infinity. The - remainder gets the opposite sign as the denominator. - -Copyright (C) 1994, 1995, 1996, 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -void -#if __STDC__ -mpz_cdiv_qr (mpz_ptr quot, mpz_ptr rem, mpz_srcptr dividend, mpz_srcptr divisor) -#else -mpz_cdiv_qr (quot, rem, dividend, divisor) - mpz_ptr quot; - mpz_ptr rem; - mpz_srcptr dividend; - mpz_srcptr divisor; -#endif -{ - mp_size_t divisor_size = divisor->_mp_size; - mp_size_t xsize; - mpz_t temp_divisor; /* N.B.: lives until function returns! */ - TMP_DECL (marker); - - TMP_MARK (marker); - - /* We need the original value of the divisor after the quotient and - remainder have been preliminary calculated. We have to copy it to - temporary space if it's the same variable as either QUOT or REM. */ - if (quot == divisor || rem == divisor) - { - MPZ_TMP_INIT (temp_divisor, ABS (divisor_size)); - mpz_set (temp_divisor, divisor); - divisor = temp_divisor; - } - - xsize = dividend->_mp_size ^ divisor_size;; - mpz_tdiv_qr (quot, rem, dividend, divisor); - - if (xsize >= 0 && rem->_mp_size != 0) - { - mpz_add_ui (quot, quot, 1L); - mpz_sub (rem, rem, divisor); - } - - TMP_FREE (marker); -} diff --git a/rts/gmp/mpz/cdiv_qr_ui.c b/rts/gmp/mpz/cdiv_qr_ui.c deleted file mode 100644 index a7873c6e20..0000000000 --- a/rts/gmp/mpz/cdiv_qr_ui.c +++ /dev/null @@ -1,71 +0,0 @@ -/* mpz_cdiv_qr_ui -- Division rounding the quotient towards +infinity. The - remainder gets the opposite sign as the denominator. In order to make it - always fit into the return type, the negative of the true remainder is - returned. - -Copyright (C) 1994, 1995, 1996, 1999 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -unsigned long int -#if __STDC__ -mpz_cdiv_qr_ui (mpz_ptr quot, mpz_ptr rem, mpz_srcptr dividend, unsigned long int divisor) -#else -mpz_cdiv_qr_ui (quot, rem, dividend, divisor) - mpz_ptr quot; - mpz_ptr rem; - mpz_srcptr dividend; - unsigned long int divisor; -#endif -{ - mp_size_t dividend_size; - mp_size_t size; - mp_ptr quot_ptr; - mp_limb_t remainder_limb; - - if (divisor == 0) - DIVIDE_BY_ZERO; - - dividend_size = dividend->_mp_size; - size = ABS (dividend_size); - - if (quot->_mp_alloc < size) - _mpz_realloc (quot, size); - - quot_ptr = quot->_mp_d; - - remainder_limb = mpn_divmod_1 (quot_ptr, dividend->_mp_d, size, - (mp_limb_t) divisor); - - if (remainder_limb != 0 && dividend_size >= 0) - { - mpn_incr_u (quot_ptr, (mp_limb_t) 1); - remainder_limb = divisor - remainder_limb; - } - - size -= size != 0 && quot_ptr[size - 1] == 0; - quot->_mp_size = dividend_size >= 0 ? size : -size; - - rem->_mp_d[0] = remainder_limb; - rem->_mp_size = -(remainder_limb != 0); - - return remainder_limb; -} diff --git a/rts/gmp/mpz/cdiv_r.c b/rts/gmp/mpz/cdiv_r.c deleted file mode 100644 index e96ce7e677..0000000000 --- a/rts/gmp/mpz/cdiv_r.c +++ /dev/null @@ -1,59 +0,0 @@ -/* mpz_cdiv_r -- Division rounding the quotient towards +infinity. The - remainder gets the opposite sign as the denominator. - -Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -void -#if __STDC__ -mpz_cdiv_r (mpz_ptr rem, mpz_srcptr dividend, mpz_srcptr divisor) -#else -mpz_cdiv_r (rem, dividend, divisor) - mpz_ptr rem; - mpz_srcptr dividend; - mpz_srcptr divisor; -#endif -{ - mp_size_t divisor_size = divisor->_mp_size; - mpz_t temp_divisor; /* N.B.: lives until function returns! */ - TMP_DECL (marker); - - TMP_MARK (marker); - - /* We need the original value of the divisor after the remainder has been - preliminary calculated. We have to copy it to temporary space if it's - the same variable as REM. */ - if (rem == divisor) - { - - MPZ_TMP_INIT (temp_divisor, ABS (divisor_size)); - mpz_set (temp_divisor, divisor); - divisor = temp_divisor; - } - - mpz_tdiv_r (rem, dividend, divisor); - - if ((divisor_size ^ dividend->_mp_size) >= 0 && rem->_mp_size != 0) - mpz_sub (rem, rem, divisor); - - TMP_FREE (marker); -} diff --git a/rts/gmp/mpz/cdiv_r_ui.c b/rts/gmp/mpz/cdiv_r_ui.c deleted file mode 100644 index e17e2381c0..0000000000 --- a/rts/gmp/mpz/cdiv_r_ui.c +++ /dev/null @@ -1,57 +0,0 @@ -/* mpz_cdiv_r_ui -- Division rounding the quotient towards +infinity. The - remainder gets the opposite sign as the denominator. In order to make it - always fit into the return type, the negative of the true remainder is - returned. - -Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -unsigned long int -#if __STDC__ -mpz_cdiv_r_ui (mpz_ptr rem, mpz_srcptr dividend, unsigned long int divisor) -#else -mpz_cdiv_r_ui (rem, dividend, divisor) - mpz_ptr rem; - mpz_srcptr dividend; - unsigned long int divisor; -#endif -{ - mp_size_t dividend_size; - mp_size_t size; - mp_limb_t remainder_limb; - - if (divisor == 0) - DIVIDE_BY_ZERO; - - dividend_size = dividend->_mp_size; - size = ABS (dividend_size); - - remainder_limb = mpn_mod_1 (dividend->_mp_d, size, (mp_limb_t) divisor); - - if (remainder_limb != 0 && dividend_size >= 0) - remainder_limb = divisor - remainder_limb; - - rem->_mp_d[0] = remainder_limb; - rem->_mp_size = -(remainder_limb != 0); - - return remainder_limb; -} diff --git a/rts/gmp/mpz/cdiv_ui.c b/rts/gmp/mpz/cdiv_ui.c deleted file mode 100644 index 63547a78c0..0000000000 --- a/rts/gmp/mpz/cdiv_ui.c +++ /dev/null @@ -1,50 +0,0 @@ -/* mpz_cdiv_ui -- Division rounding the quotient towards +infinity. The - remainder gets the opposite sign as the denominator. In order to make it - always fit into the return type, the negative of the true remainder is - returned. - -Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -unsigned long int -#if __STDC__ -mpz_cdiv_ui (mpz_srcptr dividend, unsigned long int divisor) -#else -mpz_cdiv_ui (dividend, divisor) - mpz_srcptr dividend; - unsigned long int divisor; -#endif -{ - mp_size_t dividend_size; - mp_size_t size; - mp_limb_t remainder_limb; - - dividend_size = dividend->_mp_size; - size = ABS (dividend_size); - - remainder_limb = mpn_mod_1 (dividend->_mp_d, size, (mp_limb_t) divisor); - - if (remainder_limb != 0 && dividend_size >= 0) - remainder_limb = divisor - remainder_limb; - - return remainder_limb; -} diff --git a/rts/gmp/mpz/clear.c b/rts/gmp/mpz/clear.c deleted file mode 100644 index 5224553f9e..0000000000 --- a/rts/gmp/mpz/clear.c +++ /dev/null @@ -1,35 +0,0 @@ -/* mpz_clear -- de-allocate the space occupied by the dynamic digit space of - an integer. - -Copyright (C) 1991, 1993, 1994, 1995 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -void -#if __STDC__ -mpz_clear (mpz_ptr m) -#else -mpz_clear (m) - mpz_ptr m; -#endif -{ - (*_mp_free_func) (m->_mp_d, m->_mp_alloc * BYTES_PER_MP_LIMB); -} diff --git a/rts/gmp/mpz/clrbit.c b/rts/gmp/mpz/clrbit.c deleted file mode 100644 index 865d84902f..0000000000 --- a/rts/gmp/mpz/clrbit.c +++ /dev/null @@ -1,114 +0,0 @@ -/* mpz_clrbit -- clear a specified bit. - -Copyright (C) 1991, 1993, 1994, 1995 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -void -#if __STDC__ -mpz_clrbit (mpz_ptr d, unsigned long int bit_index) -#else -mpz_clrbit (d, bit_index) - mpz_ptr d; - unsigned long int bit_index; -#endif -{ - mp_size_t dsize = d->_mp_size; - mp_ptr dp = d->_mp_d; - mp_size_t limb_index; - - limb_index = bit_index / BITS_PER_MP_LIMB; - if (dsize >= 0) - { - if (limb_index < dsize) - { - dp[limb_index] &= ~((mp_limb_t) 1 << (bit_index % BITS_PER_MP_LIMB)); - MPN_NORMALIZE (dp, dsize); - d->_mp_size = dsize; - } - else - ; - } - else - { - mp_size_t zero_bound; - - /* Simulate two's complement arithmetic, i.e. simulate - 1. Set OP = ~(OP - 1) [with infinitely many leading ones]. - 2. clear the bit. - 3. Set OP = ~OP + 1. */ - - dsize = -dsize; - - /* No upper bound on this loop, we're sure there's a non-zero limb - sooner ot later. */ - for (zero_bound = 0; ; zero_bound++) - if (dp[zero_bound] != 0) - break; - - if (limb_index > zero_bound) - { - if (limb_index < dsize) - dp[limb_index] |= (mp_limb_t) 1 << (bit_index % BITS_PER_MP_LIMB); - else - { - /* Ugh. The bit should be cleared outside of the end of the - number. We have to increase the size of the number. */ - if (d->_mp_alloc < limb_index + 1) - { - _mpz_realloc (d, limb_index + 1); - dp = d->_mp_d; - } - MPN_ZERO (dp + dsize, limb_index - dsize); - dp[limb_index] = (mp_limb_t) 1 << (bit_index % BITS_PER_MP_LIMB); - d->_mp_size = -(limb_index + 1); - } - } - else if (limb_index == zero_bound) - { - dp[limb_index] = ((dp[limb_index] - 1) - | ((mp_limb_t) 1 << (bit_index % BITS_PER_MP_LIMB))) + 1; - if (dp[limb_index] == 0) - { - mp_size_t i; - for (i = limb_index + 1; i < dsize; i++) - { - dp[i] += 1; - if (dp[i] != 0) - goto fin; - } - /* We got carry all way out beyond the end of D. Increase - its size (and allocation if necessary). */ - dsize++; - if (d->_mp_alloc < dsize) - { - _mpz_realloc (d, dsize); - dp = d->_mp_d; - } - dp[i] = 1; - d->_mp_size = -dsize; - fin:; - } - } - else - ; - } -} diff --git a/rts/gmp/mpz/cmp.c b/rts/gmp/mpz/cmp.c deleted file mode 100644 index 60628348e5..0000000000 --- a/rts/gmp/mpz/cmp.c +++ /dev/null @@ -1,75 +0,0 @@ -/* mpz_cmp(u,v) -- Compare U, V. Return postive, zero, or negative - based on if U > V, U == V, or U < V. - -Copyright (C) 1991, 1993, 1994, 1996 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#ifdef BERKELEY_MP -#include "mp.h" -#endif -#include "gmp.h" -#include "gmp-impl.h" - -#ifndef BERKELEY_MP -int -#if __STDC__ -mpz_cmp (mpz_srcptr u, mpz_srcptr v) -#else -mpz_cmp (u, v) - mpz_srcptr u; - mpz_srcptr v; -#endif -#else /* BERKELEY_MP */ -int -#if __STDC__ -mcmp (mpz_srcptr u, mpz_srcptr v) -#else -mcmp (u, v) - mpz_srcptr u; - mpz_srcptr v; -#endif -#endif /* BERKELEY_MP */ -{ - mp_size_t usize = u->_mp_size; - mp_size_t vsize = v->_mp_size; - mp_size_t size; - mp_srcptr up, vp; - int cmp; - - if (usize != vsize) - return usize - vsize; - - if (usize == 0) - return 0; - - size = ABS (usize); - - up = u->_mp_d; - vp = v->_mp_d; - - cmp = mpn_cmp (up, vp, size); - - if (cmp == 0) - return 0; - - if ((cmp < 0) == (usize < 0)) - return 1; - else - return -1; -} diff --git a/rts/gmp/mpz/cmp_si.c b/rts/gmp/mpz/cmp_si.c deleted file mode 100644 index 0c2212fbe9..0000000000 --- a/rts/gmp/mpz/cmp_si.c +++ /dev/null @@ -1,64 +0,0 @@ -/* mpz_cmp_si(u,v) -- Compare an integer U with a single-word int V. - Return positive, zero, or negative based on if U > V, U == V, or U < V. - -Copyright (C) 1991, 1993, 1994, 1995, 1996, 2000 Free Software Foundation, -Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -int -#if __STDC__ -_mpz_cmp_si (mpz_srcptr u, signed long int v_digit) -#else -_mpz_cmp_si (u, v_digit) - mpz_srcptr u; - signed long int v_digit; -#endif -{ - mp_size_t usize = u->_mp_size; - mp_size_t vsize; - mp_limb_t u_digit; - - vsize = 0; - if (v_digit > 0) - vsize = 1; - else if (v_digit < 0) - { - vsize = -1; - v_digit = -v_digit; - } - - if (usize != vsize) - return usize - vsize; - - if (usize == 0) - return 0; - - u_digit = u->_mp_d[0]; - - if (u_digit == (mp_limb_t) (unsigned long) v_digit) - return 0; - - if (u_digit > (mp_limb_t) (unsigned long) v_digit) - return usize; - else - return -usize; -} diff --git a/rts/gmp/mpz/cmp_ui.c b/rts/gmp/mpz/cmp_ui.c deleted file mode 100644 index fd84f301c1..0000000000 --- a/rts/gmp/mpz/cmp_ui.c +++ /dev/null @@ -1,53 +0,0 @@ -/* mpz_cmp_ui.c -- Compare a mpz_t a with an mp_limb_t b. Return positive, - zero, or negative based on if a > b, a == b, or a < b. - -Copyright (C) 1991, 1993, 1994, 1995, 1996 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -int -#if __STDC__ -_mpz_cmp_ui (mpz_srcptr u, unsigned long int v_digit) -#else -_mpz_cmp_ui (u, v_digit) - mpz_srcptr u; - unsigned long int v_digit; -#endif -{ - mp_size_t usize = u->_mp_size; - - if (usize == 0) - return -(v_digit != 0); - - if (usize == 1) - { - mp_limb_t u_digit; - - u_digit = u->_mp_d[0]; - if (u_digit > v_digit) - return 1; - if (u_digit < v_digit) - return -1; - return 0; - } - - return (usize > 0) ? 1 : -1; -} diff --git a/rts/gmp/mpz/cmpabs.c b/rts/gmp/mpz/cmpabs.c deleted file mode 100644 index 037d7a9145..0000000000 --- a/rts/gmp/mpz/cmpabs.c +++ /dev/null @@ -1,57 +0,0 @@ -/* mpz_cmpabs(u,v) -- Compare U, V. Return postive, zero, or negative - based on if U > V, U == V, or U < V. - -Copyright (C) 1991, 1993, 1994, 1996, 1997, 2000 Free Software Foundation, -Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -int -#if __STDC__ -mpz_cmpabs (mpz_srcptr u, mpz_srcptr v) -#else -mpz_cmpabs (u, v) - mpz_srcptr u; - mpz_srcptr v; -#endif -{ - mp_size_t usize = u->_mp_size; - mp_size_t vsize = v->_mp_size; - mp_size_t size; - mp_srcptr up, vp; - int cmp; - - usize = ABS (usize); - vsize = ABS (vsize); - - if (usize != vsize) - return usize - vsize; - - if (usize == 0) - return 0; - - up = u->_mp_d; - vp = v->_mp_d; - - cmp = mpn_cmp (up, vp, usize); - - return cmp; -} diff --git a/rts/gmp/mpz/cmpabs_ui.c b/rts/gmp/mpz/cmpabs_ui.c deleted file mode 100644 index db816b5820..0000000000 --- a/rts/gmp/mpz/cmpabs_ui.c +++ /dev/null @@ -1,56 +0,0 @@ -/* mpz_cmpabs_ui.c -- Compare a mpz_t a with an mp_limb_t b. Return positive, - zero, or negative based on if a > b, a == b, or a < b. - -Copyright (C) 1991, 1993, 1994, 1995, 1997, 2000 Free Software Foundation, -Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -int -#if __STDC__ -mpz_cmpabs_ui (mpz_srcptr u, unsigned long int v_digit) -#else -mpz_cmpabs_ui (u, v_digit) - mpz_srcptr u; - unsigned long int v_digit; -#endif -{ - mp_size_t usize = u->_mp_size; - - if (usize == 0) - return -(v_digit != 0); - - usize = ABS (usize); - - if (usize == 1) - { - mp_limb_t u_digit; - - u_digit = u->_mp_d[0]; - if (u_digit > v_digit) - return 1; - if (u_digit < v_digit) - return -1; - return 0; - } - - return 1; -} diff --git a/rts/gmp/mpz/com.c b/rts/gmp/mpz/com.c deleted file mode 100644 index 18d6427779..0000000000 --- a/rts/gmp/mpz/com.c +++ /dev/null @@ -1,93 +0,0 @@ -/* mpz_com(mpz_ptr dst, mpz_ptr src) -- Assign the bit-complemented value of - SRC to DST. - -Copyright (C) 1991, 1993, 1994, 1996 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -void -#if __STDC__ -mpz_com (mpz_ptr dst, mpz_srcptr src) -#else -mpz_com (dst, src) - mpz_ptr dst; - mpz_srcptr src; -#endif -{ - mp_size_t size = src->_mp_size; - mp_srcptr src_ptr; - mp_ptr dst_ptr; - - if (size >= 0) - { - /* As with infinite precision: one's complement, two's complement. - But this can be simplified using the identity -x = ~x + 1. - So we're going to compute (~~x) + 1 = x + 1! */ - - if (dst->_mp_alloc < size + 1) - _mpz_realloc (dst, size + 1); - - src_ptr = src->_mp_d; - dst_ptr = dst->_mp_d; - - if (size == 0) - { - /* Special case, as mpn_add wants the first arg's size >= the - second arg's size. */ - dst_ptr[0] = 1; - dst->_mp_size = -1; - return; - } - - { - mp_limb_t cy; - - cy = mpn_add_1 (dst_ptr, src_ptr, size, (mp_limb_t) 1); - if (cy) - { - dst_ptr[size] = cy; - size++; - } - } - - /* Store a negative size, to indicate ones-extension. */ - dst->_mp_size = -size; - } - else - { - /* As with infinite precision: two's complement, then one's complement. - But that can be simplified using the identity -x = ~(x - 1). - So we're going to compute ~~(x - 1) = x - 1! */ - size = -size; - - if (dst->_mp_alloc < size) - _mpz_realloc (dst, size); - - src_ptr = src->_mp_d; - dst_ptr = dst->_mp_d; - - mpn_sub_1 (dst_ptr, src_ptr, size, (mp_limb_t) 1); - size -= dst_ptr[size - 1] == 0; - - /* Store a positive size, to indicate zero-extension. */ - dst->_mp_size = size; - } -} diff --git a/rts/gmp/mpz/divexact.c b/rts/gmp/mpz/divexact.c deleted file mode 100644 index c2970454fd..0000000000 --- a/rts/gmp/mpz/divexact.c +++ /dev/null @@ -1,125 +0,0 @@ -/* mpz_divexact -- finds quotient when known that quot * den == num && den != 0. - -Copyright (C) 1991, 1993, 1994, 1995, 1996, 1997, 1998, 2000 Free Software -Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -/* Ken Weber (kweber@mat.ufrgs.br, kweber@mcs.kent.edu) - - Funding for this work has been partially provided by Conselho Nacional - de Desenvolvimento Cienti'fico e Tecnolo'gico (CNPq) do Brazil, Grant - 301314194-2, and was done while I was a visiting reseacher in the Instituto - de Matema'tica at Universidade Federal do Rio Grande do Sul (UFRGS). - - References: - T. Jebelean, An algorithm for exact division, Journal of Symbolic - Computation, v. 15, 1993, pp. 169-180. */ - -#include "gmp.h" -#include "gmp-impl.h" -#include "longlong.h" - -void -#if __STDC__ -mpz_divexact (mpz_ptr quot, mpz_srcptr num, mpz_srcptr den) -#else -mpz_divexact (quot, num, den) - mpz_ptr quot; - mpz_srcptr num; - mpz_srcptr den; -#endif -{ - mp_ptr qp, tp; - mp_size_t qsize, tsize; - mp_srcptr np, dp; - mp_size_t nsize, dsize; - TMP_DECL (marker); - - nsize = ABS (num->_mp_size); - dsize = ABS (den->_mp_size); - - qsize = nsize - dsize + 1; - if (quot->_mp_alloc < qsize) - _mpz_realloc (quot, qsize); - - np = num->_mp_d; - dp = den->_mp_d; - qp = quot->_mp_d; - - if (nsize == 0) - { - if (dsize == 0) - DIVIDE_BY_ZERO; - quot->_mp_size = 0; - return; - } - - if (dsize <= 1) - { - if (dsize == 1) - { - mpn_divmod_1 (qp, np, nsize, dp[0]); - qsize -= qp[qsize - 1] == 0; - quot->_mp_size = (num->_mp_size ^ den->_mp_size) >= 0 ? qsize : -qsize; - return; - } - - /* Generate divide-by-zero error since dsize == 0. */ - DIVIDE_BY_ZERO; - } - - TMP_MARK (marker); - - /* QUOT <-- NUM/2^r, T <-- DEN/2^r where = r number of twos in DEN. */ - while (dp[0] == 0) - np += 1, nsize -= 1, dp += 1, dsize -= 1; - tsize = MIN (qsize, dsize); - if ((dp[0] & 1) != 0) - { - if (quot == den) /* QUOT and DEN overlap. */ - { - tp = (mp_ptr) TMP_ALLOC (tsize * BYTES_PER_MP_LIMB); - MPN_COPY (tp, dp, tsize); - } - else - tp = (mp_ptr) dp; - if (qp != np) - MPN_COPY_INCR (qp, np, qsize); - } - else - { - unsigned int r; - tp = (mp_ptr) TMP_ALLOC (tsize * BYTES_PER_MP_LIMB); - count_trailing_zeros (r, dp[0]); - mpn_rshift (tp, dp, tsize, r); - if (dsize > tsize) - tp[tsize - 1] |= dp[tsize] << (BITS_PER_MP_LIMB - r); - mpn_rshift (qp, np, qsize, r); - if (nsize > qsize) - qp[qsize - 1] |= np[qsize] << (BITS_PER_MP_LIMB - r); - } - - /* Now QUOT <-- QUOT/T. */ - mpn_bdivmod (qp, qp, qsize, tp, tsize, qsize * BITS_PER_MP_LIMB); - MPN_NORMALIZE (qp, qsize); - - quot->_mp_size = (num->_mp_size ^ den->_mp_size) >= 0 ? qsize : -qsize; - - TMP_FREE (marker); -} diff --git a/rts/gmp/mpz/dump.c b/rts/gmp/mpz/dump.c deleted file mode 100644 index dc318ac8cf..0000000000 --- a/rts/gmp/mpz/dump.c +++ /dev/null @@ -1,44 +0,0 @@ -/* mpz_dump - Dump an integer to stdout. - - THIS IS AN INTERNAL FUNCTION WITH A MUTABLE INTERFACE. IT IS NOT SAFE TO - CALL THIS FUNCTION DIRECTLY. IN FACT, IT IS ALMOST GUARANTEED THAT THIS - FUNCTION WILL CHANGE OR DISAPPEAR IN A FUTURE GNU MP RELEASE. - - -Copyright (C) 1999, 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include <stdio.h> -#include "gmp.h" -#include "gmp-impl.h" - -void -#if __STDC__ -mpz_dump (mpz_srcptr u) -#else -mpz_dump (u) - mpz_srcptr u; -#endif -{ - char *str; - - str = mpz_get_str (0, 10, u); - printf ("%s\n", str); - (*_mp_free_func) (str, 0);/* ??? broken alloc interface, pass what size ??? */ -} diff --git a/rts/gmp/mpz/fac_ui.c b/rts/gmp/mpz/fac_ui.c deleted file mode 100644 index 85f40f271c..0000000000 --- a/rts/gmp/mpz/fac_ui.c +++ /dev/null @@ -1,157 +0,0 @@ -/* mpz_fac_ui(result, n) -- Set RESULT to N!. - -Copyright (C) 1991, 1993, 1994, 1995 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#ifdef DBG -#include <stdio.h> -#endif - -#include "gmp.h" -#include "gmp-impl.h" -#include "longlong.h" - -void -#if __STDC__ -mpz_fac_ui (mpz_ptr result, unsigned long int n) -#else -mpz_fac_ui (result, n) - mpz_ptr result; - unsigned long int n; -#endif -{ -#if SIMPLE_FAC - - /* Be silly. Just multiply the numbers in ascending order. O(n**2). */ - - unsigned long int k; - - mpz_set_ui (result, 1L); - - for (k = 2; k <= n; k++) - mpz_mul_ui (result, result, k); -#else - - /* Be smarter. Multiply groups of numbers in ascending order until the - product doesn't fit in a limb. Multiply these partial product in a - balanced binary tree fashion, to make the operand have as equal sizes - as possible. When the operands have about the same size, mpn_mul - becomes faster. */ - - unsigned long int p, k; - mp_limb_t p1, p0; - - /* Stack of partial products, used to make the computation balanced - (i.e. make the sizes of the multiplication operands equal). The - topmost position of MP_STACK will contain a one-limb partial product, - the second topmost will contain a two-limb partial product, and so - on. MP_STACK[0] will contain a partial product with 2**t limbs. - To compute n! MP_STACK needs to be less than - log(n)**2/log(BITS_PER_MP_LIMB), so 30 is surely enough. */ -#define MP_STACK_SIZE 30 - mpz_t mp_stack[MP_STACK_SIZE]; - - /* TOP is an index into MP_STACK, giving the topmost element. - TOP_LIMIT_SO_FAR is the largets value it has taken so far. */ - int top, top_limit_so_far; - - /* Count of the total number of limbs put on MP_STACK so far. This - variable plays an essential role in making the compututation balanced. - See below. */ - unsigned int tree_cnt; - - top = top_limit_so_far = -1; - tree_cnt = 0; - p = 1; - for (k = 2; k <= n; k++) - { - /* Multiply the partial product in P with K. */ - umul_ppmm (p1, p0, (mp_limb_t) p, (mp_limb_t) k); - - /* Did we get overflow into the high limb, i.e. is the partial - product now more than one limb? */ - if (p1 != 0) - { - tree_cnt++; - - if (tree_cnt % 2 == 0) - { - mp_size_t i; - - /* TREE_CNT is even (i.e. we have generated an even number of - one-limb partial products), which means that we have a - single-limb product on the top of MP_STACK. */ - - mpz_mul_ui (mp_stack[top], mp_stack[top], p); - - /* If TREE_CNT is divisable by 4, 8,..., we have two - similar-sized partial products with 2, 4,... limbs at - the topmost two positions of MP_STACK. Multiply them - to form a new partial product with 4, 8,... limbs. */ - for (i = 4; (tree_cnt & (i - 1)) == 0; i <<= 1) - { - mpz_mul (mp_stack[top - 1], - mp_stack[top], mp_stack[top - 1]); - top--; - } - } - else - { - /* Put the single-limb partial product in P on the stack. - (The next time we get a single-limb product, we will - multiply the two together.) */ - top++; - if (top > top_limit_so_far) - { - if (top > MP_STACK_SIZE) - abort(); - /* The stack is now bigger than ever, initialize the top - element. */ - mpz_init_set_ui (mp_stack[top], p); - top_limit_so_far++; - } - else - mpz_set_ui (mp_stack[top], p); - } - - /* We ignored the last result from umul_ppmm. Put K in P as the - first component of the next single-limb partial product. */ - p = k; - } - else - /* We didn't get overflow in umul_ppmm. Put p0 in P and try - with one more value of K. */ - p = p0; /* bogus if long != mp_limb_t */ - } - - /* We have partial products in mp_stack[0..top], in descending order. - We also have a small partial product in p. - Their product is the final result. */ - if (top < 0) - mpz_set_ui (result, p); - else - mpz_mul_ui (result, mp_stack[top--], p); - while (top >= 0) - mpz_mul (result, result, mp_stack[top--]); - - /* Free the storage allocated for MP_STACK. */ - for (top = top_limit_so_far; top >= 0; top--) - mpz_clear (mp_stack[top]); -#endif -} diff --git a/rts/gmp/mpz/fdiv_q.c b/rts/gmp/mpz/fdiv_q.c deleted file mode 100644 index 9d75ca33d2..0000000000 --- a/rts/gmp/mpz/fdiv_q.c +++ /dev/null @@ -1,51 +0,0 @@ -/* mpz_fdiv_q -- Division rounding the quotient towards -infinity. - The remainder gets the same sign as the denominator. - -Copyright (C) 1994, 1995, 1996, 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -void -#if __STDC__ -mpz_fdiv_q (mpz_ptr quot, mpz_srcptr dividend, mpz_srcptr divisor) -#else -mpz_fdiv_q (quot, dividend, divisor) - mpz_ptr quot; - mpz_srcptr dividend; - mpz_srcptr divisor; -#endif -{ - mp_size_t dividend_size = dividend->_mp_size; - mp_size_t divisor_size = divisor->_mp_size; - mpz_t rem; - TMP_DECL (marker); - - TMP_MARK (marker); - - MPZ_TMP_INIT (rem, ABS (divisor_size)); - - mpz_tdiv_qr (quot, rem, dividend, divisor); - - if ((divisor_size ^ dividend_size) < 0 && rem->_mp_size != 0) - mpz_sub_ui (quot, quot, 1L); - - TMP_FREE (marker); -} diff --git a/rts/gmp/mpz/fdiv_q_2exp.c b/rts/gmp/mpz/fdiv_q_2exp.c deleted file mode 100644 index 8e02180ecc..0000000000 --- a/rts/gmp/mpz/fdiv_q_2exp.c +++ /dev/null @@ -1,104 +0,0 @@ -/* mpz_fdiv_q_2exp -- Divide an integer by 2**CNT. Round the quotient - towards -infinity. - -Copyright (C) 1991, 1993, 1994, 1996, 1998, 1999 Free Software Foundation, -Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -void -#if __STDC__ -mpz_fdiv_q_2exp (mpz_ptr w, mpz_srcptr u, unsigned long int cnt) -#else -mpz_fdiv_q_2exp (w, u, cnt) - mpz_ptr w; - mpz_srcptr u; - unsigned long int cnt; -#endif -{ - mp_size_t usize = u->_mp_size; - mp_size_t wsize; - mp_size_t abs_usize = ABS (usize); - mp_size_t limb_cnt; - mp_ptr wp; - mp_limb_t round = 0; - - limb_cnt = cnt / BITS_PER_MP_LIMB; - wsize = abs_usize - limb_cnt; - if (wsize <= 0) - { - wp = w->_mp_d; - wsize = 0; - /* Set ROUND since we know we skip some non-zero words in this case. - Well, if U is zero, we don't, but then this will be taken care of - below, since rounding only really takes place for negative U. */ - round = 1; - wp[0] = 1; - w->_mp_size = -(usize < 0); - return; - } - else - { - mp_size_t i; - mp_ptr up; - - /* Make sure there is enough space. We make an extra limb - here to account for possible rounding at the end. */ - if (w->_mp_alloc < wsize + 1) - _mpz_realloc (w, wsize + 1); - - wp = w->_mp_d; - up = u->_mp_d; - - /* Set ROUND if we are about skip some non-zero limbs. */ - for (i = 0; i < limb_cnt && round == 0; i++) - round = up[i]; - - cnt %= BITS_PER_MP_LIMB; - if (cnt != 0) - { - round |= mpn_rshift (wp, up + limb_cnt, wsize, cnt); - wsize -= wp[wsize - 1] == 0; - } - else - { - MPN_COPY_INCR (wp, up + limb_cnt, wsize); - } - } - - if (usize < 0 && round != 0) - { - mp_limb_t cy; - if (wsize != 0) - { - cy = mpn_add_1 (wp, wp, wsize, (mp_limb_t) 1); - wp[wsize] = cy; - wsize += cy; - } - else - { - /* We shifted something negative to zero. The result is -1. */ - wp[0] = 1; - wsize = 1; - } - } - w->_mp_size = usize >= 0 ? wsize : -wsize; -} diff --git a/rts/gmp/mpz/fdiv_q_ui.c b/rts/gmp/mpz/fdiv_q_ui.c deleted file mode 100644 index 55d2498693..0000000000 --- a/rts/gmp/mpz/fdiv_q_ui.c +++ /dev/null @@ -1,65 +0,0 @@ -/* mpz_fdiv_q_ui -- Division rounding the quotient towards -infinity. - The remainder gets the same sign as the denominator. - -Copyright (C) 1994, 1995, 1996, 1999 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -unsigned long int -#if __STDC__ -mpz_fdiv_q_ui (mpz_ptr quot, mpz_srcptr dividend, unsigned long int divisor) -#else -mpz_fdiv_q_ui (quot, dividend, divisor) - mpz_ptr quot; - mpz_srcptr dividend; - unsigned long int divisor; -#endif -{ - mp_size_t dividend_size; - mp_size_t size; - mp_ptr quot_ptr; - mp_limb_t remainder_limb; - - if (divisor == 0) - DIVIDE_BY_ZERO; - - dividend_size = dividend->_mp_size; - size = ABS (dividend_size); - - if (quot->_mp_alloc < size) - _mpz_realloc (quot, size); - - quot_ptr = quot->_mp_d; - - remainder_limb = mpn_divmod_1 (quot_ptr, dividend->_mp_d, size, - (mp_limb_t) divisor); - - if (remainder_limb != 0 && dividend_size < 0) - { - mpn_incr_u (quot_ptr, (mp_limb_t) 1); - remainder_limb = divisor - remainder_limb; - } - - size -= size != 0 && quot_ptr[size - 1] == 0; - quot->_mp_size = dividend_size >= 0 ? size : -size; - - return remainder_limb; -} diff --git a/rts/gmp/mpz/fdiv_qr.c b/rts/gmp/mpz/fdiv_qr.c deleted file mode 100644 index 06ce50607b..0000000000 --- a/rts/gmp/mpz/fdiv_qr.c +++ /dev/null @@ -1,64 +0,0 @@ -/* mpz_fdiv_qr -- Division rounding the quotient towards -infinity. - The remainder gets the same sign as the denominator. - -Copyright (C) 1994, 1995, 1996, 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -void -#if __STDC__ -mpz_fdiv_qr (mpz_ptr quot, mpz_ptr rem, mpz_srcptr dividend, mpz_srcptr divisor) -#else -mpz_fdiv_qr (quot, rem, dividend, divisor) - mpz_ptr quot; - mpz_ptr rem; - mpz_srcptr dividend; - mpz_srcptr divisor; -#endif -{ - mp_size_t divisor_size = divisor->_mp_size; - mp_size_t xsize; - mpz_t temp_divisor; /* N.B.: lives until function returns! */ - TMP_DECL (marker); - - TMP_MARK (marker); - - /* We need the original value of the divisor after the quotient and - remainder have been preliminary calculated. We have to copy it to - temporary space if it's the same variable as either QUOT or REM. */ - if (quot == divisor || rem == divisor) - { - MPZ_TMP_INIT (temp_divisor, ABS (divisor_size)); - mpz_set (temp_divisor, divisor); - divisor = temp_divisor; - } - - xsize = dividend->_mp_size ^ divisor_size;; - mpz_tdiv_qr (quot, rem, dividend, divisor); - - if (xsize < 0 && rem->_mp_size != 0) - { - mpz_sub_ui (quot, quot, 1L); - mpz_add (rem, rem, divisor); - } - - TMP_FREE (marker); -} diff --git a/rts/gmp/mpz/fdiv_qr_ui.c b/rts/gmp/mpz/fdiv_qr_ui.c deleted file mode 100644 index 600c0dacfc..0000000000 --- a/rts/gmp/mpz/fdiv_qr_ui.c +++ /dev/null @@ -1,69 +0,0 @@ -/* mpz_fdiv_qr_ui -- Division rounding the quotient towards -infinity. - The remainder gets the same sign as the denominator. - -Copyright (C) 1994, 1995, 1996, 1999 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -unsigned long int -#if __STDC__ -mpz_fdiv_qr_ui (mpz_ptr quot, mpz_ptr rem, mpz_srcptr dividend, unsigned long int divisor) -#else -mpz_fdiv_qr_ui (quot, rem, dividend, divisor) - mpz_ptr quot; - mpz_ptr rem; - mpz_srcptr dividend; - unsigned long int divisor; -#endif -{ - mp_size_t dividend_size; - mp_size_t size; - mp_ptr quot_ptr; - mp_limb_t remainder_limb; - - if (divisor == 0) - DIVIDE_BY_ZERO; - - dividend_size = dividend->_mp_size; - size = ABS (dividend_size); - - if (quot->_mp_alloc < size) - _mpz_realloc (quot, size); - - quot_ptr = quot->_mp_d; - - remainder_limb = mpn_divmod_1 (quot_ptr, dividend->_mp_d, size, - (mp_limb_t) divisor); - - if (remainder_limb != 0 && dividend_size < 0) - { - mpn_incr_u (quot_ptr, (mp_limb_t) 1); - remainder_limb = divisor - remainder_limb; - } - - size -= size != 0 && quot_ptr[size - 1] == 0; - quot->_mp_size = dividend_size >= 0 ? size : -size; - - rem->_mp_d[0] = remainder_limb; - rem->_mp_size = remainder_limb != 0; - - return remainder_limb; -} diff --git a/rts/gmp/mpz/fdiv_r.c b/rts/gmp/mpz/fdiv_r.c deleted file mode 100644 index a3652838d2..0000000000 --- a/rts/gmp/mpz/fdiv_r.c +++ /dev/null @@ -1,58 +0,0 @@ -/* mpz_fdiv_r -- Division rounding the quotient towards -infinity. - The remainder gets the same sign as the denominator. - -Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -void -#if __STDC__ -mpz_fdiv_r (mpz_ptr rem, mpz_srcptr dividend, mpz_srcptr divisor) -#else -mpz_fdiv_r (rem, dividend, divisor) - mpz_ptr rem; - mpz_srcptr dividend; - mpz_srcptr divisor; -#endif -{ - mp_size_t divisor_size = divisor->_mp_size; - mpz_t temp_divisor; /* N.B.: lives until function returns! */ - TMP_DECL (marker); - - TMP_MARK (marker); - - /* We need the original value of the divisor after the remainder has been - preliminary calculated. We have to copy it to temporary space if it's - the same variable as REM. */ - if (rem == divisor) - { - MPZ_TMP_INIT (temp_divisor, ABS (divisor_size)); - mpz_set (temp_divisor, divisor); - divisor = temp_divisor; - } - - mpz_tdiv_r (rem, dividend, divisor); - - if ((divisor_size ^ dividend->_mp_size) < 0 && rem->_mp_size != 0) - mpz_add (rem, rem, divisor); - - TMP_FREE (marker); -} diff --git a/rts/gmp/mpz/fdiv_r_2exp.c b/rts/gmp/mpz/fdiv_r_2exp.c deleted file mode 100644 index 081ce19203..0000000000 --- a/rts/gmp/mpz/fdiv_r_2exp.c +++ /dev/null @@ -1,156 +0,0 @@ -/* mpz_fdiv_r_2exp -- Divide a integer by 2**CNT and produce a remainder. - -Copyright (C) 1991, 1993, 1994, 1995, 1998, 1999, 2000 Free Software -Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -void -#if __STDC__ -mpz_fdiv_r_2exp (mpz_ptr res, mpz_srcptr in, unsigned long int cnt) -#else -mpz_fdiv_r_2exp (res, in, cnt) - mpz_ptr res; - mpz_srcptr in; - unsigned long int cnt; -#endif -{ - mp_size_t in_size = ABS (in->_mp_size); - mp_size_t res_size; - mp_size_t limb_cnt = cnt / BITS_PER_MP_LIMB; - mp_srcptr in_ptr = in->_mp_d; - - if (in_size > limb_cnt) - { - /* The input operand is (probably) greater than 2**CNT. */ - mp_limb_t x; - - x = in_ptr[limb_cnt] & (((mp_limb_t) 1 << cnt % BITS_PER_MP_LIMB) - 1); - if (x != 0) - { - res_size = limb_cnt + 1; - if (res->_mp_alloc < res_size) - _mpz_realloc (res, res_size); - - res->_mp_d[limb_cnt] = x; - } - else - { - res_size = limb_cnt; - MPN_NORMALIZE (in_ptr, res_size); - - if (res->_mp_alloc < res_size) - _mpz_realloc (res, res_size); - - limb_cnt = res_size; - } - } - else - { - /* The input operand is smaller than 2**CNT. We perform a no-op, - apart from that we might need to copy IN to RES, and may need - to round the result. */ - res_size = in_size; - if (res->_mp_alloc < res_size) - _mpz_realloc (res, res_size); - - limb_cnt = res_size; - } - - if (res != in) - MPN_COPY (res->_mp_d, in->_mp_d, limb_cnt); - in_size = in->_mp_size; - res->_mp_size = res_size; - if (in_size < 0 && res_size != 0) - { - /* Result should be 2^CNT - RES */ - mpz_t tmp; - TMP_DECL (marker); - TMP_MARK (marker); - MPZ_TMP_INIT (tmp, cnt/BITS_PER_MP_LIMB + 2); - mpz_set_ui (tmp, 1L); - mpz_mul_2exp (tmp, tmp, cnt); - mpz_sub (res, tmp, res); - TMP_FREE (marker); - } -} - -/* This is an alternative ending of the above function using just low-level - functions. Tested, but perhaps excessive? */ -#if 0 - if (in->_mp_size < 0 && res_size != 0) - { - /* Result should be 2^CNT - RES */ - - mp_ptr rp; - - limb_cnt = cnt / BITS_PER_MP_LIMB; - - if (res->_mp_alloc <= limb_cnt) - _mpz_realloc (res, limb_cnt + 1); - rp = PTR(res); - if (res_size > limb_cnt) - { - mpn_nz_neg (rp, rp, res_size); - rp[limb_cnt] &= ~(~(mp_limb_t) 0 << cnt % BITS_PER_MP_LIMB); - MPN_NORMALIZE_NOT_ZERO (rp, res_size); - } - else - { - mp_size_t i; - mpn_nz_neg (rp, rp, res_size); - for (i = res_size; i < limb_cnt; i++) - rp[i] = ~ (mp_limb_t) 0; - res_size = limb_cnt; - if (cnt % BITS_PER_MP_LIMB != 0) - { - rp[res_size] = ((mp_limb_t) 1 << (cnt % BITS_PER_MP_LIMB)) - 1; - res_size++; - } - else - MPN_NORMALIZE_NOT_ZERO (rp, res_size); - } - } - SIZ(res) = res_size; -} - -static void -mpn_nz_neg (rp, sp, n) - mp_ptr rp, sp; - mp_size_t n; -{ - mp_size_t i; - mp_limb_t x; - - x = sp[0]; - rp[0] = -x; - for (i = 1; x == 0; i++) - { - x = sp[i]; - rp[i] = -x; - } - - for (; i < n; i++) - { - rp[i] = ~sp[i]; - } -} -#endif diff --git a/rts/gmp/mpz/fdiv_r_ui.c b/rts/gmp/mpz/fdiv_r_ui.c deleted file mode 100644 index dd5c743d27..0000000000 --- a/rts/gmp/mpz/fdiv_r_ui.c +++ /dev/null @@ -1,55 +0,0 @@ -/* mpz_fdiv_r_ui -- Division rounding the quotient towards -infinity. - The remainder gets the same sign as the denominator. - -Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -unsigned long int -#if __STDC__ -mpz_fdiv_r_ui (mpz_ptr rem, mpz_srcptr dividend, unsigned long int divisor) -#else -mpz_fdiv_r_ui (rem, dividend, divisor) - mpz_ptr rem; - mpz_srcptr dividend; - unsigned long int divisor; -#endif -{ - mp_size_t dividend_size; - mp_size_t size; - mp_limb_t remainder_limb; - - if (divisor == 0) - DIVIDE_BY_ZERO; - - dividend_size = dividend->_mp_size; - size = ABS (dividend_size); - - remainder_limb = mpn_mod_1 (dividend->_mp_d, size, (mp_limb_t) divisor); - - if (remainder_limb != 0 && dividend_size < 0) - remainder_limb = divisor - remainder_limb; - - rem->_mp_d[0] = remainder_limb; - rem->_mp_size = remainder_limb != 0; - - return remainder_limb; -} diff --git a/rts/gmp/mpz/fdiv_ui.c b/rts/gmp/mpz/fdiv_ui.c deleted file mode 100644 index f937b5f6d0..0000000000 --- a/rts/gmp/mpz/fdiv_ui.c +++ /dev/null @@ -1,48 +0,0 @@ -/* mpz_fdiv_ui -- Division rounding the quotient towards -infinity. - The remainder gets the same sign as the denominator. - -Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -unsigned long int -#if __STDC__ -mpz_fdiv_ui (mpz_srcptr dividend, unsigned long int divisor) -#else -mpz_fdiv_ui (dividend, divisor) - mpz_srcptr dividend; - unsigned long int divisor; -#endif -{ - mp_size_t dividend_size; - mp_size_t size; - mp_limb_t remainder_limb; - - dividend_size = dividend->_mp_size; - size = ABS (dividend_size); - - remainder_limb = mpn_mod_1 (dividend->_mp_d, size, (mp_limb_t) divisor); - - if (remainder_limb != 0 && dividend_size < 0) - remainder_limb = divisor - remainder_limb; - - return remainder_limb; -} diff --git a/rts/gmp/mpz/fib_ui.c b/rts/gmp/mpz/fib_ui.c deleted file mode 100644 index 4bebb80d94..0000000000 --- a/rts/gmp/mpz/fib_ui.c +++ /dev/null @@ -1,165 +0,0 @@ -/* mpz_fib_ui(result, n) -- Set RESULT to the Nth Fibonacci number. - -Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -/* This is fast, but could be made somewhat faster and neater. - The timing is somewhat fluctuating for even/odd sizes because - of the extra hair used to save variables and operations. Here - are a few things one might want to address: - 1. Avoid using 4 intermediate variables in mpz_fib_bigcase. - 2. Call mpn functions directly. Straightforward for these functions. - 3. Merge the three functions into one. - -Said by Kevin: - Consider using the Lucas numbers L[n] as an auxiliary sequence, making - it possible to do the "doubling" operation in mpz_fib_bigcase with two - squares rather than two multiplies. The formulas are a little more - complicated, something like the following (untested). - - F[2n] = ((F[n]+L[n])^2 - 6*F[n]^2 - 4*(-1)^n) / 2 - L[2n] = 5*F[n]^2 + 2*(-1)^n - - F[2n+1] = (F[2n] + L[2n]) / 2 - L[2n+1] = (5*F[2n] + L[2n]) / 2 - - The Lucas number that comes for free here could even be returned. - - Maybe there's formulas with two squares using just F[n], but I don't - know of any. -*/ - -/* Determine the needed storage for Fib(n). */ -#define FIB_SIZE(n) (((mp_size_t) ((n)*0.695)) / BITS_PER_MP_LIMB + 2) - -static void mpz_fib_bigcase _PROTO ((mpz_t, mpz_t, unsigned long int)); -static void mpz_fib_basecase _PROTO ((mpz_t, mpz_t, unsigned long int)); - - -#ifndef FIB_THRESHOLD -#define FIB_THRESHOLD 60 -#endif - -void -#if __STDC__ -mpz_fib_ui (mpz_t r, unsigned long int n) -#else -mpz_fib_ui (r, n) - mpz_t r; - unsigned long int n; -#endif -{ - if (n == 0) - mpz_set_ui (r, 0); - else - { - mpz_t t1; - mpz_init (t1); - if (n < FIB_THRESHOLD) - mpz_fib_basecase (t1, r, n); - else - mpz_fib_bigcase (t1, r, n); - mpz_clear (t1); - } -} - -static void -#if __STDC__ -mpz_fib_basecase (mpz_t t1, mpz_t t2, unsigned long int n) -#else -mpz_fib_basecase (t1, t2, n) - mpz_t t1; - mpz_t t2; - unsigned long int n; -#endif -{ - unsigned long int m, i; - - mpz_set_ui (t1, 0); - mpz_set_ui (t2, 1); - m = n/2; - for (i = 0; i < m; i++) - { - mpz_add (t1, t1, t2); - mpz_add (t2, t1, t2); - } - if ((n & 1) == 0) - { - mpz_sub (t1, t2, t1); - mpz_sub (t2, t2, t1); /* trick: recover t1 value just overwritten */ - } -} - -static void -#if __STDC__ -mpz_fib_bigcase (mpz_t t1, mpz_t t2, unsigned long int n) -#else -mpz_fib_bigcase (t1, t2, n) - mpz_t t1; - mpz_t t2; - unsigned long int n; -#endif -{ - unsigned long int n2; - int ni, i; - mpz_t x1, x2, u1, u2; - - ni = 0; - for (n2 = n; n2 >= FIB_THRESHOLD; n2 /= 2) - ni++; - - mpz_fib_basecase (t1, t2, n2); - - mpz_init (x1); - mpz_init (x2); - mpz_init (u1); - mpz_init (u2); - - for (i = ni - 1; i >= 0; i--) - { - mpz_mul_2exp (x1, t1, 1); - mpz_mul_2exp (x2, t2, 1); - - mpz_add (x1, x1, t2); - mpz_sub (x2, x2, t1); - - mpz_mul (u1, t2, x1); - mpz_mul (u2, t1, x2); - - if (((n >> i) & 1) == 0) - { - mpz_sub (t1, u1, u2); - mpz_set (t2, u1); - } - else - { - mpz_set (t1, u1); - mpz_mul_2exp (t2, u1, 1); - mpz_sub (t2, t2, u2); - } - } - - mpz_clear (x1); - mpz_clear (x2); - mpz_clear (u1); - mpz_clear (u2); -} diff --git a/rts/gmp/mpz/fits_sint_p.c b/rts/gmp/mpz/fits_sint_p.c deleted file mode 100644 index 82e32a24d5..0000000000 --- a/rts/gmp/mpz/fits_sint_p.c +++ /dev/null @@ -1,50 +0,0 @@ -/* int mpz_fits_X_p (mpz_t src) -- Return whether src fits the C type X. - -Copyright (C) 1997, 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -int -#if __STDC__ -mpz_fits_sint_p (mpz_srcptr src) -#else -mpz_fits_sint_p (src) - mpz_srcptr src; -#endif -{ - mp_size_t size; - mp_limb_t mpl; - - mpl = PTR(src)[0]; - size = SIZ(src); - if (size > 0) - { - if (size > 1) - return 0; - return mpl < ~((~(unsigned int) 0) >> 1); - } - else - { - if (size < -1) - return 0; - return mpl <= ~((~(unsigned int) 0) >> 1); - } -} diff --git a/rts/gmp/mpz/fits_slong_p.c b/rts/gmp/mpz/fits_slong_p.c deleted file mode 100644 index e0669b5aaa..0000000000 --- a/rts/gmp/mpz/fits_slong_p.c +++ /dev/null @@ -1,50 +0,0 @@ -/* int mpz_fits_X_p (mpz_t src) -- Return whether src fits the C type X. - -Copyright (C) 1997, 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -int -#if __STDC__ -mpz_fits_slong_p (mpz_srcptr src) -#else -mpz_fits_slong_p (src) - mpz_srcptr src; -#endif -{ - mp_size_t size; - mp_limb_t mpl; - - mpl = PTR(src)[0]; - size = SIZ(src); - if (size > 0) - { - if (size > 1) - return 0; - return mpl < ~((~(unsigned long int) 0) >> 1); - } - else - { - if (size < -1) - return 0; - return mpl <= ~((~(unsigned long int) 0) >> 1); - } -} diff --git a/rts/gmp/mpz/fits_sshort_p.c b/rts/gmp/mpz/fits_sshort_p.c deleted file mode 100644 index 5b8e31afae..0000000000 --- a/rts/gmp/mpz/fits_sshort_p.c +++ /dev/null @@ -1,50 +0,0 @@ -/* int mpz_fits_X_p (mpz_t src) -- Return whether src fits the C type X. - -Copyright (C) 1997, 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -int -#if __STDC__ -mpz_fits_sshort_p (mpz_srcptr src) -#else -mpz_fits_sshort_p (src) - mpz_srcptr src; -#endif -{ - mp_size_t size; - mp_limb_t mpl; - - mpl = PTR(src)[0]; - size = SIZ(src); - if (size > 0) - { - if (size > 1) - return 0; - return mpl <= (((unsigned short int) ~(unsigned int) 0) >> 1); - } - else - { - if (size < -1) - return 0; - return mpl <= (((unsigned short int) ~(unsigned int) 0) >> 1) + 1; - } -} diff --git a/rts/gmp/mpz/fits_uint_p.c b/rts/gmp/mpz/fits_uint_p.c deleted file mode 100644 index 72f62fa723..0000000000 --- a/rts/gmp/mpz/fits_uint_p.c +++ /dev/null @@ -1,41 +0,0 @@ -/* int mpz_fits_X_p (mpz_t src) -- Return whether src fits the C type X. - -Copyright (C) 1997, 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -int -#if __STDC__ -mpz_fits_uint_p (mpz_srcptr src) -#else -mpz_fits_uint_p (src) - mpz_srcptr src; -#endif -{ - mp_size_t size; - mp_limb_t mpl; - - mpl = PTR(src)[0]; - size = SIZ(src); - if (size < 0 || size > 1) - return 0; - return mpl <= (~(unsigned int) 0); -} diff --git a/rts/gmp/mpz/fits_ulong_p.c b/rts/gmp/mpz/fits_ulong_p.c deleted file mode 100644 index 92eb42e86e..0000000000 --- a/rts/gmp/mpz/fits_ulong_p.c +++ /dev/null @@ -1,41 +0,0 @@ -/* int mpz_fits_X_p (mpz_t src) -- Return whether src fits the C type X. - -Copyright (C) 1997, 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -int -#if __STDC__ -mpz_fits_ulong_p (mpz_srcptr src) -#else -mpz_fits_ulong_p (src) - mpz_srcptr src; -#endif -{ - mp_size_t size; - mp_limb_t mpl; - - mpl = PTR(src)[0]; - size = SIZ(src); - if (size < 0 || size > 1) - return 0; - return mpl <= (~(unsigned long int) 0); -} diff --git a/rts/gmp/mpz/fits_ushort_p.c b/rts/gmp/mpz/fits_ushort_p.c deleted file mode 100644 index bde0edae6e..0000000000 --- a/rts/gmp/mpz/fits_ushort_p.c +++ /dev/null @@ -1,41 +0,0 @@ -/* int mpz_fits_X_p (mpz_t src) -- Return whether src fits the C type X. - -Copyright (C) 1997, 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -int -#if __STDC__ -mpz_fits_ushort_p (mpz_srcptr src) -#else -mpz_fits_ushort_p (src) - mpz_srcptr src; -#endif -{ - mp_size_t size; - mp_limb_t mpl; - - mpl = PTR(src)[0]; - size = SIZ(src); - if (size < 0 || size > 1) - return 0; - return mpl <= ((unsigned short int) ~(unsigned int) 0); -} diff --git a/rts/gmp/mpz/gcd.c b/rts/gmp/mpz/gcd.c deleted file mode 100644 index 0d950dd609..0000000000 --- a/rts/gmp/mpz/gcd.c +++ /dev/null @@ -1,180 +0,0 @@ -/* mpz/gcd.c: Calculate the greatest common divisor of two integers. - -Copyright (C) 1991, 1993, 1994, 1996, 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" -#include "longlong.h" -#ifdef BERKELEY_MP -#include "mp.h" -#endif - - -#ifndef BERKELEY_MP -void -#if __STDC__ -mpz_gcd (mpz_ptr g, mpz_srcptr u, mpz_srcptr v) -#else -mpz_gcd (g, u, v) - mpz_ptr g; - mpz_srcptr u; - mpz_srcptr v; -#endif -#else /* BERKELEY_MP */ -void -#if __STDC__ -gcd (mpz_srcptr u, mpz_srcptr v, mpz_ptr g) -#else -gcd (u, v, g) - mpz_ptr g; - mpz_srcptr u; - mpz_srcptr v; -#endif -#endif /* BERKELEY_MP */ - -{ - unsigned long int g_zero_bits, u_zero_bits, v_zero_bits; - mp_size_t g_zero_limbs, u_zero_limbs, v_zero_limbs; - mp_ptr tp; - mp_ptr up = u->_mp_d; - mp_size_t usize = ABS (u->_mp_size); - mp_ptr vp = v->_mp_d; - mp_size_t vsize = ABS (v->_mp_size); - mp_size_t gsize; - TMP_DECL (marker); - - /* GCD(0, V) == V. */ - if (usize == 0) - { - g->_mp_size = vsize; - if (g == v) - return; - if (g->_mp_alloc < vsize) - _mpz_realloc (g, vsize); - MPN_COPY (g->_mp_d, vp, vsize); - return; - } - - /* GCD(U, 0) == U. */ - if (vsize == 0) - { - g->_mp_size = usize; - if (g == u) - return; - if (g->_mp_alloc < usize) - _mpz_realloc (g, usize); - MPN_COPY (g->_mp_d, up, usize); - return; - } - - if (usize == 1) - { - g->_mp_size = 1; - g->_mp_d[0] = mpn_gcd_1 (vp, vsize, up[0]); - return; - } - - if (vsize == 1) - { - g->_mp_size = 1; - g->_mp_d[0] = mpn_gcd_1 (up, usize, vp[0]); - return; - } - - TMP_MARK (marker); - - /* Eliminate low zero bits from U and V and move to temporary storage. */ - while (*up == 0) - up++; - u_zero_limbs = up - u->_mp_d; - usize -= u_zero_limbs; - count_trailing_zeros (u_zero_bits, *up); - tp = up; - up = (mp_ptr) TMP_ALLOC (usize * BYTES_PER_MP_LIMB); - if (u_zero_bits != 0) - { - mpn_rshift (up, tp, usize, u_zero_bits); - usize -= up[usize - 1] == 0; - } - else - MPN_COPY (up, tp, usize); - - while (*vp == 0) - vp++; - v_zero_limbs = vp - v->_mp_d; - vsize -= v_zero_limbs; - count_trailing_zeros (v_zero_bits, *vp); - tp = vp; - vp = (mp_ptr) TMP_ALLOC (vsize * BYTES_PER_MP_LIMB); - if (v_zero_bits != 0) - { - mpn_rshift (vp, tp, vsize, v_zero_bits); - vsize -= vp[vsize - 1] == 0; - } - else - MPN_COPY (vp, tp, vsize); - - if (u_zero_limbs > v_zero_limbs) - { - g_zero_limbs = v_zero_limbs; - g_zero_bits = v_zero_bits; - } - else if (u_zero_limbs < v_zero_limbs) - { - g_zero_limbs = u_zero_limbs; - g_zero_bits = u_zero_bits; - } - else /* Equal. */ - { - g_zero_limbs = u_zero_limbs; - g_zero_bits = MIN (u_zero_bits, v_zero_bits); - } - - /* Call mpn_gcd. The 2nd argument must not have more bits than the 1st. */ - vsize = (usize < vsize || (usize == vsize && up[usize-1] < vp[vsize-1])) - ? mpn_gcd (vp, vp, vsize, up, usize) - : mpn_gcd (vp, up, usize, vp, vsize); - - /* Here G <-- V << (g_zero_limbs*BITS_PER_MP_LIMB + g_zero_bits). */ - gsize = vsize + g_zero_limbs; - if (g_zero_bits != 0) - { - mp_limb_t cy_limb; - gsize += (vp[vsize - 1] >> (BITS_PER_MP_LIMB - g_zero_bits)) != 0; - if (g->_mp_alloc < gsize) - _mpz_realloc (g, gsize); - MPN_ZERO (g->_mp_d, g_zero_limbs); - - tp = g->_mp_d + g_zero_limbs; - cy_limb = mpn_lshift (tp, vp, vsize, g_zero_bits); - if (cy_limb != 0) - tp[vsize] = cy_limb; - } - else - { - if (g->_mp_alloc < gsize) - _mpz_realloc (g, gsize); - MPN_ZERO (g->_mp_d, g_zero_limbs); - MPN_COPY (g->_mp_d + g_zero_limbs, vp, vsize); - } - - g->_mp_size = gsize; - TMP_FREE (marker); -} diff --git a/rts/gmp/mpz/gcd_ui.c b/rts/gmp/mpz/gcd_ui.c deleted file mode 100644 index f3bec58829..0000000000 --- a/rts/gmp/mpz/gcd_ui.c +++ /dev/null @@ -1,65 +0,0 @@ -/* mpz_gcd_ui -- Calculate the greatest common divisior of two integers. - -Copyright (C) 1994, 1996, 1999, 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include <stdio.h> /* for NULL */ -#include "gmp.h" -#include "gmp-impl.h" - -unsigned long int -#if __STDC__ -mpz_gcd_ui (mpz_ptr w, mpz_srcptr u, unsigned long int v) -#else -mpz_gcd_ui (w, u, v) - mpz_ptr w; - mpz_srcptr u; - unsigned long int v; -#endif -{ - mp_size_t size; - mp_limb_t res; - - size = ABS (u->_mp_size); - - if (size == 0) - res = v; - else if (v == 0) - { - if (w != NULL && u != w) - { - if (w->_mp_alloc < size) - _mpz_realloc (w, size); - - MPN_COPY (w->_mp_d, u->_mp_d, size); - } - w->_mp_size = size; - /* We can't return any useful result for gcd(big,0). */ - return size > 1 ? 0 : w->_mp_d[0]; - } - else - res = mpn_gcd_1 (u->_mp_d, size, (mp_limb_t) v); - - if (w != NULL) - { - w->_mp_d[0] = res; - w->_mp_size = 1; - } - return res; -} diff --git a/rts/gmp/mpz/gcdext.c b/rts/gmp/mpz/gcdext.c deleted file mode 100644 index 3ba04c84ff..0000000000 --- a/rts/gmp/mpz/gcdext.c +++ /dev/null @@ -1,137 +0,0 @@ -/* mpz_gcdext(g, s, t, a, b) -- Set G to gcd(a, b), and S and T such that - g = as + bt. - -Copyright (C) 1991, 1993, 1994, 1995, 1996, 1997, 2000 Free Software -Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include <stdio.h> /* for NULL */ -#include "gmp.h" -#include "gmp-impl.h" - -void -#if __STDC__ -mpz_gcdext (mpz_ptr g, mpz_ptr s, mpz_ptr t, mpz_srcptr a, mpz_srcptr b) -#else -mpz_gcdext (g, s, t, a, b) - mpz_ptr g; - mpz_ptr s; - mpz_ptr t; - mpz_srcptr a; - mpz_srcptr b; -#endif -{ - mp_size_t asize, bsize, usize, vsize; - mp_srcptr ap, bp; - mp_ptr up, vp; - mp_size_t gsize, ssize, tmp_ssize; - mp_ptr gp, sp, tmp_gp, tmp_sp; - mpz_srcptr u, v; - mpz_ptr ss, tt; - __mpz_struct stmp, gtmp; - TMP_DECL (marker); - - TMP_MARK (marker); - - /* mpn_gcdext requires that U >= V. Therefore, we often have to swap U and - V. This in turn leads to a lot of complications. The computed cofactor - will be the wrong one, so we have to fix that up at the end. */ - - asize = ABS (SIZ (a)); - bsize = ABS (SIZ (b)); - ap = PTR (a); - bp = PTR (b); - if (asize > bsize || (asize == bsize && mpn_cmp (ap, bp, asize) > 0)) - { - usize = asize; - vsize = bsize; - up = (mp_ptr) TMP_ALLOC ((usize + 1) * BYTES_PER_MP_LIMB); - vp = (mp_ptr) TMP_ALLOC ((vsize + 1) * BYTES_PER_MP_LIMB); - MPN_COPY (up, ap, usize); - MPN_COPY (vp, bp, vsize); - u = a; - v = b; - ss = s; - tt = t; - } - else - { - usize = bsize; - vsize = asize; - up = (mp_ptr) TMP_ALLOC ((usize + 1) * BYTES_PER_MP_LIMB); - vp = (mp_ptr) TMP_ALLOC ((vsize + 1) * BYTES_PER_MP_LIMB); - MPN_COPY (up, bp, usize); - MPN_COPY (vp, ap, vsize); - u = b; - v = a; - ss = t; - tt = s; - } - - tmp_gp = (mp_ptr) TMP_ALLOC ((usize + 1) * BYTES_PER_MP_LIMB); - tmp_sp = (mp_ptr) TMP_ALLOC ((usize + 1) * BYTES_PER_MP_LIMB); - - if (vsize == 0) - { - tmp_sp[0] = 1; - tmp_ssize = 1; - MPN_COPY (tmp_gp, up, usize); - gsize = usize; - } - else - gsize = mpn_gcdext (tmp_gp, tmp_sp, &tmp_ssize, up, usize, vp, vsize); - ssize = ABS (tmp_ssize); - - PTR (>mp) = tmp_gp; - SIZ (>mp) = gsize; - - PTR (&stmp) = tmp_sp; - SIZ (&stmp) = (tmp_ssize ^ SIZ (u)) >= 0 ? ssize : -ssize; - - if (tt != NULL) - { - if (SIZ (v) == 0) - SIZ (tt) = 0; - else - { - mpz_t x; - MPZ_TMP_INIT (x, ssize + usize + 1); - mpz_mul (x, &stmp, u); - mpz_sub (x, >mp, x); - mpz_tdiv_q (tt, x, v); - } - } - - if (ss != NULL) - { - if (ALLOC (ss) < ssize) - _mpz_realloc (ss, ssize); - sp = PTR (ss); - MPN_COPY (sp, tmp_sp, ssize); - SIZ (ss) = SIZ (&stmp); - } - - if (ALLOC (g) < gsize) - _mpz_realloc (g, gsize); - gp = PTR (g); - MPN_COPY (gp, tmp_gp, gsize); - SIZ (g) = gsize; - - TMP_FREE (marker); -} diff --git a/rts/gmp/mpz/get_d.c b/rts/gmp/mpz/get_d.c deleted file mode 100644 index 6a7c5856bb..0000000000 --- a/rts/gmp/mpz/get_d.c +++ /dev/null @@ -1,128 +0,0 @@ -/* double mpz_get_d (mpz_t src) -- Return the double approximation to SRC. - -Copyright (C) 1996, 1997, 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" -#include "longlong.h" - - -static int -#if __STDC__ -mpn_zero_p (mp_ptr p, mp_size_t n) -#else -mpn_zero_p (p, n) - mp_ptr p; - mp_size_t n; -#endif -{ - mp_size_t i; - - for (i = 0; i < n; i++) - { - if (p[i] != 0) - return 0; - } - - return 1; -} - - -double -#if __STDC__ -mpz_get_d (mpz_srcptr src) -#else -mpz_get_d (src) - mpz_srcptr src; -#endif -{ - double res; - mp_size_t size; - int negative; - mp_ptr qp; - mp_limb_t hz, lz; - int cnt; - - size = SIZ(src); - if (size == 0) - return 0.0; - - negative = size < 0; - size = ABS (size); - qp = PTR(src); - - if (size == 1) - { - res = qp[size - 1]; - } - else if (size == 2) - { - res = MP_BASE_AS_DOUBLE * qp[size - 1] + qp[size - 2]; - } - else - { - count_leading_zeros (cnt, qp[size - 1]); - -#if BITS_PER_MP_LIMB == 32 - if (cnt == 0) - { - hz = qp[size - 1]; - lz = qp[size - 2]; - } - else - { - hz = (qp[size - 1] << cnt) | (qp[size - 2] >> BITS_PER_MP_LIMB - cnt); - lz = (qp[size - 2] << cnt) | (qp[size - 3] >> BITS_PER_MP_LIMB - cnt); - } -#if _GMP_IEEE_FLOATS - /* Take bits from less significant limbs, but only if they may affect - the result. */ - if ((lz & 0x7ff) == 0x400) - { - if (cnt != 0) - lz += ((qp[size - 3] << cnt) != 0 || ! mpn_zero_p (qp, size - 3)); - else - lz += (! mpn_zero_p (qp, size - 2)); - } -#endif - res = MP_BASE_AS_DOUBLE * hz + lz; - res = __gmp_scale2 (res, (size - 2) * BITS_PER_MP_LIMB - cnt); -#endif -#if BITS_PER_MP_LIMB == 64 - if (cnt == 0) - hz = qp[size - 1]; - else - hz = (qp[size - 1] << cnt) | (qp[size - 2] >> BITS_PER_MP_LIMB - cnt); -#if _GMP_IEEE_FLOATS - if ((hz & 0x7ff) == 0x400) - { - if (cnt != 0) - hz += ((qp[size - 2] << cnt) != 0 || ! mpn_zero_p (qp, size - 2)); - else - hz += (! mpn_zero_p (qp, size - 1)); - } -#endif - res = hz; - res = __gmp_scale2 (res, (size - 1) * BITS_PER_MP_LIMB - cnt); -#endif - } - - return negative ? -res : res; -} diff --git a/rts/gmp/mpz/get_si.c b/rts/gmp/mpz/get_si.c deleted file mode 100644 index 8a5d0e4803..0000000000 --- a/rts/gmp/mpz/get_si.c +++ /dev/null @@ -1,43 +0,0 @@ -/* mpz_get_si(integer) -- Return the least significant digit from INTEGER. - -Copyright (C) 1991, 1993, 1994, 1995 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -signed long int -#if __STDC__ -mpz_get_si (mpz_srcptr op) -#else -mpz_get_si (op) - mpz_srcptr op; -#endif -{ - mp_size_t size = op->_mp_size; - mp_limb_t low_limb = op->_mp_d[0]; - - if (size > 0) - return low_limb % ((mp_limb_t) 1 << (BITS_PER_MP_LIMB - 1)); - else if (size < 0) - /* This convoluted expression is necessary to properly handle 0x80000000 */ - return ~((low_limb - 1) % ((mp_limb_t) 1 << (BITS_PER_MP_LIMB - 1))); - else - return 0; -} diff --git a/rts/gmp/mpz/get_str.c b/rts/gmp/mpz/get_str.c deleted file mode 100644 index c7278afb52..0000000000 --- a/rts/gmp/mpz/get_str.c +++ /dev/null @@ -1,118 +0,0 @@ -/* mpz_get_str (string, base, mp_src) -- Convert the multiple precision - number MP_SRC to a string STRING of base BASE. If STRING is NULL - allocate space for the result. In any case, return a pointer to the - result. If STRING is not NULL, the caller must ensure enough space is - available to store the result. - -Copyright (C) 1991, 1993, 1994, 1996 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -char * -#if __STDC__ -mpz_get_str (char *res_str, int base, mpz_srcptr x) -#else -mpz_get_str (res_str, base, x) - char *res_str; - int base; - mpz_srcptr x; -#endif -{ - mp_ptr xp; - mp_size_t x_size = x->_mp_size; - unsigned char *str; - char *return_str; - size_t str_size; - char *num_to_text; - int i; - TMP_DECL (marker); - - TMP_MARK (marker); - if (base >= 0) - { - if (base == 0) - base = 10; - num_to_text = "0123456789abcdefghijklmnopqrstuvwxyz"; - } - else - { - base = -base; - num_to_text = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; - } - - /* We allways allocate space for the string. If the caller passed a - NULL pointer for RES_STR, we allocate permanent space and return - a pointer to that to the caller. */ - str_size = ((size_t) (ABS (x_size) * BITS_PER_MP_LIMB - * __mp_bases[base].chars_per_bit_exactly)) + 3; - if (res_str == 0) - { - /* We didn't get a string from the user. Allocate one (and return - a pointer to it). */ - res_str = (char *) (*_mp_allocate_func) (str_size); - /* Make str, the variable used for raw result from mpn_get_str, - point to the same string, but just after a possible minus sign. */ - str = (unsigned char *) res_str + 1; - } - else - { - /* Use TMP_ALLOC to get temporary space, since we need a few extra bytes - that we can't expect to caller to supply us with. */ - str = (unsigned char *) TMP_ALLOC (str_size); - } - - return_str = res_str; - - if (x_size == 0) - { - res_str[0] = '0'; - res_str[1] = 0; - TMP_FREE (marker); - return res_str; - } - if (x_size < 0) - { - *res_str++ = '-'; - x_size = -x_size; - } - - /* Move the number to convert into temporary space, since mpn_get_str - clobbers its argument + needs one extra high limb.... */ - xp = (mp_ptr) TMP_ALLOC ((x_size + 1) * BYTES_PER_MP_LIMB); - MPN_COPY (xp, x->_mp_d, x_size); - - str_size = mpn_get_str (str, base, xp, x_size); - - /* mpn_get_str might make some leading zeros. Skip them. */ - while (*str == 0) - { - str_size--; - str++; - } - - /* Translate result to printable chars and move result to RES_STR. */ - for (i = 0; i < str_size; i++) - res_str[i] = num_to_text[str[i]]; - res_str[str_size] = 0; - - TMP_FREE (marker); - return return_str; -} diff --git a/rts/gmp/mpz/get_ui.c b/rts/gmp/mpz/get_ui.c deleted file mode 100644 index a8ec9e01a4..0000000000 --- a/rts/gmp/mpz/get_ui.c +++ /dev/null @@ -1,37 +0,0 @@ -/* mpz_get_ui(integer) -- Return the least significant digit from INTEGER. - -Copyright (C) 1991, 1993, 1994, 1995 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -unsigned long int -#if __STDC__ -mpz_get_ui (mpz_srcptr integer) -#else -mpz_get_ui (integer) - mpz_srcptr integer; -#endif -{ - if (integer->_mp_size == 0) - return 0; - else - return integer->_mp_d[0]; -} diff --git a/rts/gmp/mpz/getlimbn.c b/rts/gmp/mpz/getlimbn.c deleted file mode 100644 index b772ed05c4..0000000000 --- a/rts/gmp/mpz/getlimbn.c +++ /dev/null @@ -1,38 +0,0 @@ -/* mpz_getlimbn(integer,n) -- Return the N:th limb from INTEGER. - -Copyright (C) 1993, 1994, 1995, 1996 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -mp_limb_t -#if __STDC__ -mpz_getlimbn (mpz_srcptr integer, mp_size_t n) -#else -mpz_getlimbn (integer, n) - mpz_srcptr integer; - mp_size_t n; -#endif -{ - if (ABS (integer->_mp_size) <= n || n < 0) - return 0; - else - return integer->_mp_d[n]; -} diff --git a/rts/gmp/mpz/hamdist.c b/rts/gmp/mpz/hamdist.c deleted file mode 100644 index b039a653d2..0000000000 --- a/rts/gmp/mpz/hamdist.c +++ /dev/null @@ -1,62 +0,0 @@ -/* mpz_hamdist(mpz_ptr op1, mpz_ptr op2) -- Compute the hamming distance - between OP1 and OP2. If one of the operands is negative, return ~0. (We - could make the function well-defined when both operands are negative, but - that would probably not be worth the trouble. - -Copyright (C) 1994, 1996 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -unsigned long int -#if __STDC__ -mpz_hamdist (mpz_srcptr u, mpz_srcptr v) -#else -mpz_hamdist (u, v) - mpz_srcptr u; - mpz_srcptr v; -#endif -{ - mp_srcptr up, vp; - mp_size_t usize, vsize, size; - unsigned long int count; - - usize = u->_mp_size; - vsize = v->_mp_size; - - if ((usize | vsize) < 0) - return ~ (unsigned long int) 0; - - up = u->_mp_d; - vp = v->_mp_d; - - if (usize > vsize) - { - count = mpn_popcount (up + vsize, usize - vsize); - size = vsize; - } - else - { - count = mpn_popcount (vp + usize, vsize - usize); - size = usize; - } - - return count + mpn_hamdist (up, vp, size); -} diff --git a/rts/gmp/mpz/init.c b/rts/gmp/mpz/init.c deleted file mode 100644 index 2e8e4d2cbd..0000000000 --- a/rts/gmp/mpz/init.c +++ /dev/null @@ -1,36 +0,0 @@ -/* mpz_init() -- Make a new multiple precision number with value 0. - -Copyright (C) 1991, 1993, 1994, 1995 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -void -#if __STDC__ -mpz_init (mpz_ptr x) -#else -mpz_init (x) - mpz_ptr x; -#endif -{ - x->_mp_alloc = 1; - x->_mp_d = (mp_ptr) (*_mp_allocate_func) (BYTES_PER_MP_LIMB); - x->_mp_size = 0; -} diff --git a/rts/gmp/mpz/inp_raw.c b/rts/gmp/mpz/inp_raw.c deleted file mode 100644 index 15e601229d..0000000000 --- a/rts/gmp/mpz/inp_raw.c +++ /dev/null @@ -1,101 +0,0 @@ -/* mpz_inp_raw -- Input a mpz_t in raw, but endianess, and wordsize - independent format (as output by mpz_out_raw). - -Copyright (C) 1991, 1993, 1994, 1995 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include <stdio.h> - -#include "gmp.h" -#include "gmp-impl.h" - -size_t -#if __STDC__ -mpz_inp_raw (mpz_ptr x, FILE *stream) -#else -mpz_inp_raw (x, stream) - mpz_ptr x; - FILE *stream; -#endif -{ - int i; - mp_size_t s; - mp_size_t xsize; - mp_ptr xp; - unsigned int c; - mp_limb_t x_limb; - mp_size_t in_bytesize; - int neg_flag; - - if (stream == 0) - stream = stdin; - - /* Read 4-byte size */ - in_bytesize = 0; - for (i = 4 - 1; i >= 0; i--) - { - c = fgetc (stream); - in_bytesize = (in_bytesize << BITS_PER_CHAR) | c; - } - - /* Size is stored as a 32 bit word; sign extend in_bytesize for non-32 bit - machines. */ - if (sizeof (mp_size_t) > 4) - in_bytesize |= (-(in_bytesize < 0)) << 31; - - neg_flag = in_bytesize < 0; - in_bytesize = ABS (in_bytesize); - xsize = (in_bytesize + BYTES_PER_MP_LIMB - 1) / BYTES_PER_MP_LIMB; - - if (xsize == 0) - { - x->_mp_size = 0; - return 4; /* we've read 4 bytes */ - } - - if (x->_mp_alloc < xsize) - _mpz_realloc (x, xsize); - xp = x->_mp_d; - - x_limb = 0; - for (i = (in_bytesize - 1) % BYTES_PER_MP_LIMB; i >= 0; i--) - { - c = fgetc (stream); - x_limb = (x_limb << BITS_PER_CHAR) | c; - } - xp[xsize - 1] = x_limb; - - for (s = xsize - 2; s >= 0; s--) - { - x_limb = 0; - for (i = BYTES_PER_MP_LIMB - 1; i >= 0; i--) - { - c = fgetc (stream); - x_limb = (x_limb << BITS_PER_CHAR) | c; - } - xp[s] = x_limb; - } - - if (c == EOF) - return 0; /* error */ - - MPN_NORMALIZE (xp, xsize); - x->_mp_size = neg_flag ? -xsize : xsize; - return in_bytesize + 4; -} diff --git a/rts/gmp/mpz/inp_str.c b/rts/gmp/mpz/inp_str.c deleted file mode 100644 index 7aa5e1fc30..0000000000 --- a/rts/gmp/mpz/inp_str.c +++ /dev/null @@ -1,167 +0,0 @@ -/* mpz_inp_str(dest_integer, stream, base) -- Input a number in base - BASE from stdio stream STREAM and store the result in DEST_INTEGER. - -Copyright (C) 1991, 1993, 1994, 1996, 1998, 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include <stdio.h> -#include <ctype.h> -#include "gmp.h" -#include "gmp-impl.h" - -static int -#if __STDC__ -digit_value_in_base (int c, int base) -#else -digit_value_in_base (c, base) - int c; - int base; -#endif -{ - int digit; - - if (isdigit (c)) - digit = c - '0'; - else if (islower (c)) - digit = c - 'a' + 10; - else if (isupper (c)) - digit = c - 'A' + 10; - else - return -1; - - if (digit < base) - return digit; - return -1; -} - -size_t -#if __STDC__ -mpz_inp_str (mpz_ptr x, FILE *stream, int base) -#else -mpz_inp_str (x, stream, base) - mpz_ptr x; - FILE *stream; - int base; -#endif -{ - char *str; - size_t alloc_size, str_size; - int c; - int negative; - mp_size_t xsize; - size_t nread; - - if (stream == 0) - stream = stdin; - - nread = 0; - - /* Skip whitespace. */ - do - { - c = getc (stream); - nread++; - } - while (isspace (c)); - - negative = 0; - if (c == '-') - { - negative = 1; - c = getc (stream); - nread++; - } - - if (digit_value_in_base (c, base == 0 ? 10 : base) < 0) - return 0; /* error if no digits */ - - /* If BASE is 0, try to find out the base by looking at the initial - characters. */ - if (base == 0) - { - base = 10; - if (c == '0') - { - base = 8; - c = getc (stream); - nread++; - if (c == 'x' || c == 'X') - { - base = 16; - c = getc (stream); - nread++; - } - else if (c == 'b' || c == 'B') - { - base = 2; - c = getc (stream); - nread++; - } - } - } - - /* Skip leading zeros. */ - while (c == '0') - { - c = getc (stream); - nread++; - } - - alloc_size = 100; - str = (char *) (*_mp_allocate_func) (alloc_size); - str_size = 0; - - for (;;) - { - int dig; - if (str_size >= alloc_size) - { - size_t old_alloc_size = alloc_size; - alloc_size = alloc_size * 3 / 2; - str = (char *) (*_mp_reallocate_func) (str, old_alloc_size, alloc_size); - } - dig = digit_value_in_base (c, base); - if (dig < 0) - break; - str[str_size++] = dig; - c = getc (stream); - } - - ungetc (c, stream); - - /* Make sure the string is not empty, mpn_set_str would fail. */ - if (str_size == 0) - { - x->_mp_size = 0; - (*_mp_free_func) (str, alloc_size); - return nread; - } - - xsize = (((mp_size_t) (str_size / __mp_bases[base].chars_per_bit_exactly)) - / BITS_PER_MP_LIMB + 2); - if (x->_mp_alloc < xsize) - _mpz_realloc (x, xsize); - - /* Convert the byte array in base BASE to our bignum format. */ - xsize = mpn_set_str (x->_mp_d, (unsigned char *) str, str_size, base); - x->_mp_size = negative ? -xsize : xsize; - - (*_mp_free_func) (str, alloc_size); - return str_size + nread; -} diff --git a/rts/gmp/mpz/invert.c b/rts/gmp/mpz/invert.c deleted file mode 100644 index 749a0969fc..0000000000 --- a/rts/gmp/mpz/invert.c +++ /dev/null @@ -1,77 +0,0 @@ -/* mpz_invert (inv, x, n). Find multiplicative inverse of X in Z(N). - If X has an inverse, return non-zero and store inverse in INVERSE, - otherwise, return 0 and put garbage in INVERSE. - -Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -int -#if __STDC__ -mpz_invert (mpz_ptr inverse, mpz_srcptr x, mpz_srcptr n) -#else -mpz_invert (inverse, x, n) - mpz_ptr inverse; - mpz_srcptr x, n; -#endif -{ - mpz_t gcd, tmp; - mp_size_t xsize, nsize, size; - TMP_DECL (marker); - - xsize = SIZ (x); - nsize = SIZ (n); - xsize = ABS (xsize); - nsize = ABS (nsize); - size = MAX (xsize, nsize) + 1; - - /* No inverse exists if the leftside operand is 0. Likewise, no - inverse exists if the mod operand is 1. */ - if (xsize == 0 || (nsize == 1 && (PTR (n))[0] == 1)) - return 0; - - TMP_MARK (marker); - - MPZ_TMP_INIT (gcd, size); - MPZ_TMP_INIT (tmp, size); - mpz_gcdext (gcd, tmp, (mpz_ptr) 0, x, n); - - /* If no inverse existed, return with an indication of that. */ - if (gcd->_mp_size != 1 || (gcd->_mp_d)[0] != 1) - { - TMP_FREE (marker); - return 0; - } - - /* Make sure we return a positive inverse. */ - if (SIZ (tmp) < 0) - { - if (SIZ (n) < 0) - mpz_sub (inverse, tmp, n); - else - mpz_add (inverse, tmp, n); - } - else - mpz_set (inverse, tmp); - - TMP_FREE (marker); - return 1; -} diff --git a/rts/gmp/mpz/ior.c b/rts/gmp/mpz/ior.c deleted file mode 100644 index 0bb5a806dc..0000000000 --- a/rts/gmp/mpz/ior.c +++ /dev/null @@ -1,244 +0,0 @@ -/* mpz_ior -- Logical inclusive or. - -Copyright (C) 1991, 1993, 1994, 1996, 1997, 2000 Free Software Foundation, -Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -void -#if __STDC__ -mpz_ior (mpz_ptr res, mpz_srcptr op1, mpz_srcptr op2) -#else -mpz_ior (res, op1, op2) - mpz_ptr res; - mpz_srcptr op1; - mpz_srcptr op2; -#endif -{ - mp_srcptr op1_ptr, op2_ptr; - mp_size_t op1_size, op2_size; - mp_ptr res_ptr; - mp_size_t res_size; - mp_size_t i; - TMP_DECL (marker); - - TMP_MARK (marker); - op1_size = op1->_mp_size; - op2_size = op2->_mp_size; - - op1_ptr = op1->_mp_d; - op2_ptr = op2->_mp_d; - res_ptr = res->_mp_d; - - if (op1_size >= 0) - { - if (op2_size >= 0) - { - if (op1_size >= op2_size) - { - if (res->_mp_alloc < op1_size) - { - _mpz_realloc (res, op1_size); - op1_ptr = op1->_mp_d; - op2_ptr = op2->_mp_d; - res_ptr = res->_mp_d; - } - - if (res_ptr != op1_ptr) - MPN_COPY (res_ptr + op2_size, op1_ptr + op2_size, - op1_size - op2_size); - for (i = op2_size - 1; i >= 0; i--) - res_ptr[i] = op1_ptr[i] | op2_ptr[i]; - res_size = op1_size; - } - else - { - if (res->_mp_alloc < op2_size) - { - _mpz_realloc (res, op2_size); - op1_ptr = op1->_mp_d; - op2_ptr = op2->_mp_d; - res_ptr = res->_mp_d; - } - - if (res_ptr != op2_ptr) - MPN_COPY (res_ptr + op1_size, op2_ptr + op1_size, - op2_size - op1_size); - for (i = op1_size - 1; i >= 0; i--) - res_ptr[i] = op1_ptr[i] | op2_ptr[i]; - res_size = op2_size; - } - - res->_mp_size = res_size; - return; - } - else /* op2_size < 0 */ - { - /* Fall through to the code at the end of the function. */ - } - } - else - { - if (op2_size < 0) - { - mp_ptr opx; - mp_limb_t cy; - - /* Both operands are negative, so will be the result. - -((-OP1) | (-OP2)) = -(~(OP1 - 1) | ~(OP2 - 1)) = - = ~(~(OP1 - 1) | ~(OP2 - 1)) + 1 = - = ((OP1 - 1) & (OP2 - 1)) + 1 */ - - op1_size = -op1_size; - op2_size = -op2_size; - - res_size = MIN (op1_size, op2_size); - - /* Possible optimization: Decrease mpn_sub precision, - as we won't use the entire res of both. */ - opx = (mp_ptr) TMP_ALLOC (res_size * BYTES_PER_MP_LIMB); - mpn_sub_1 (opx, op1_ptr, res_size, (mp_limb_t) 1); - op1_ptr = opx; - - opx = (mp_ptr) TMP_ALLOC (res_size * BYTES_PER_MP_LIMB); - mpn_sub_1 (opx, op2_ptr, res_size, (mp_limb_t) 1); - op2_ptr = opx; - - if (res->_mp_alloc < res_size) - { - _mpz_realloc (res, res_size); - res_ptr = res->_mp_d; - /* Don't re-read OP1_PTR and OP2_PTR. They point to - temporary space--never to the space RES->_mp_d used - to point to before reallocation. */ - } - - /* First loop finds the size of the result. */ - for (i = res_size - 1; i >= 0; i--) - if ((op1_ptr[i] & op2_ptr[i]) != 0) - break; - res_size = i + 1; - - if (res_size != 0) - { - /* Second loop computes the real result. */ - for (i = res_size - 1; i >= 0; i--) - res_ptr[i] = op1_ptr[i] & op2_ptr[i]; - - cy = mpn_add_1 (res_ptr, res_ptr, res_size, (mp_limb_t) 1); - if (cy) - { - res_ptr[res_size] = cy; - res_size++; - } - } - else - { - res_ptr[0] = 1; - res_size = 1; - } - - res->_mp_size = -res_size; - TMP_FREE (marker); - return; - } - else - { - /* We should compute -OP1 | OP2. Swap OP1 and OP2 and fall - through to the code that handles OP1 | -OP2. */ - MPZ_SRCPTR_SWAP (op1, op2); - MPN_SRCPTR_SWAP (op1_ptr,op1_size, op2_ptr,op2_size); - } - } - - { - mp_ptr opx; - mp_limb_t cy; - mp_size_t res_alloc; - mp_size_t count; - - /* Operand 2 negative, so will be the result. - -(OP1 | (-OP2)) = -(OP1 | ~(OP2 - 1)) = - = ~(OP1 | ~(OP2 - 1)) + 1 = - = (~OP1 & (OP2 - 1)) + 1 */ - - op2_size = -op2_size; - - res_alloc = op2_size; - - opx = (mp_ptr) TMP_ALLOC (op2_size * BYTES_PER_MP_LIMB); - mpn_sub_1 (opx, op2_ptr, op2_size, (mp_limb_t) 1); - op2_ptr = opx; - op2_size -= op2_ptr[op2_size - 1] == 0; - - if (res->_mp_alloc < res_alloc) - { - _mpz_realloc (res, res_alloc); - op1_ptr = op1->_mp_d; - res_ptr = res->_mp_d; - /* Don't re-read OP2_PTR. It points to temporary space--never - to the space RES->_mp_d used to point to before reallocation. */ - } - - if (op1_size >= op2_size) - { - /* We can just ignore the part of OP1 that stretches above OP2, - because the result limbs are zero there. */ - - /* First loop finds the size of the result. */ - for (i = op2_size - 1; i >= 0; i--) - if ((~op1_ptr[i] & op2_ptr[i]) != 0) - break; - res_size = i + 1; - count = res_size; - } - else - { - res_size = op2_size; - - /* Copy the part of OP2 that stretches above OP1, to RES. */ - MPN_COPY (res_ptr + op1_size, op2_ptr + op1_size, op2_size - op1_size); - count = op1_size; - } - - if (res_size != 0) - { - /* Second loop computes the real result. */ - for (i = count - 1; i >= 0; i--) - res_ptr[i] = ~op1_ptr[i] & op2_ptr[i]; - - cy = mpn_add_1 (res_ptr, res_ptr, res_size, (mp_limb_t) 1); - if (cy) - { - res_ptr[res_size] = cy; - res_size++; - } - } - else - { - res_ptr[0] = 1; - res_size = 1; - } - - res->_mp_size = -res_size; - } - TMP_FREE (marker); -} diff --git a/rts/gmp/mpz/iset.c b/rts/gmp/mpz/iset.c deleted file mode 100644 index 114bc2d542..0000000000 --- a/rts/gmp/mpz/iset.c +++ /dev/null @@ -1,49 +0,0 @@ -/* mpz_init_set (src_integer) -- Make a new multiple precision number with - a value copied from SRC_INTEGER. - -Copyright (C) 1991, 1993, 1994, 1996 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -void -#if __STDC__ -mpz_init_set (mpz_ptr w, mpz_srcptr u) -#else -mpz_init_set (w, u) - mpz_ptr w; - mpz_srcptr u; -#endif -{ - mp_ptr wp, up; - mp_size_t usize, size; - - usize = u->_mp_size; - size = ABS (usize); - - w->_mp_alloc = MAX (size, 1); - w->_mp_d = (mp_ptr) (*_mp_allocate_func) (w->_mp_alloc * BYTES_PER_MP_LIMB); - - wp = w->_mp_d; - up = u->_mp_d; - - MPN_COPY (wp, up, size); - w->_mp_size = usize; -} diff --git a/rts/gmp/mpz/iset_d.c b/rts/gmp/mpz/iset_d.c deleted file mode 100644 index 502a8933e2..0000000000 --- a/rts/gmp/mpz/iset_d.c +++ /dev/null @@ -1,39 +0,0 @@ -/* mpz_init_set_d(integer, val) -- Initialize and assign INTEGER with a double - value VAL. - -Copyright (C) 1996 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -void -#if __STDC__ -mpz_init_set_d (mpz_ptr dest, double val) -#else -mpz_init_set_d (dest, val) - mpz_ptr dest; - double val; -#endif -{ - dest->_mp_alloc = 1; - dest->_mp_d = (mp_ptr) (*_mp_allocate_func) (BYTES_PER_MP_LIMB); - dest->_mp_size = 0; - mpz_set_d (dest, val); -} diff --git a/rts/gmp/mpz/iset_si.c b/rts/gmp/mpz/iset_si.c deleted file mode 100644 index 842db140ef..0000000000 --- a/rts/gmp/mpz/iset_si.c +++ /dev/null @@ -1,49 +0,0 @@ -/* mpz_init_set_si(val) -- Make a new multiple precision number with - value val. - -Copyright (C) 1991, 1993, 1994, 1995, 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -void -#if __STDC__ -mpz_init_set_si (mpz_ptr x, signed long int val) -#else -mpz_init_set_si (x, val) - mpz_ptr x; - signed long int val; -#endif -{ - x->_mp_alloc = 1; - x->_mp_d = (mp_ptr) (*_mp_allocate_func) (BYTES_PER_MP_LIMB); - if (val > 0) - { - x->_mp_d[0] = val; - x->_mp_size = 1; - } - else if (val < 0) - { - x->_mp_d[0] = (unsigned long) -val; - x->_mp_size = -1; - } - else - x->_mp_size = 0; -} diff --git a/rts/gmp/mpz/iset_str.c b/rts/gmp/mpz/iset_str.c deleted file mode 100644 index dfb8c6b230..0000000000 --- a/rts/gmp/mpz/iset_str.c +++ /dev/null @@ -1,47 +0,0 @@ -/* mpz_init_set_str(string, base) -- Convert the \0-terminated string - STRING in base BASE to a multiple precision integer. Return a MP_INT - structure representing the integer. Allow white space in the - string. If BASE == 0 determine the base in the C standard way, - i.e. 0xhh...h means base 16, 0oo...o means base 8, otherwise - assume base 10. - -Copyright (C) 1991, 1993, 1994, 1995, 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -int -#if __STDC__ -mpz_init_set_str (mpz_ptr x, const char *str, int base) -#else -mpz_init_set_str (x, str, base) - mpz_ptr x; - const char *str; - int base; -#endif -{ - x->_mp_alloc = 1; - x->_mp_d = (mp_ptr) (*_mp_allocate_func) (BYTES_PER_MP_LIMB); - - /* if str has no digits mpz_set_str leaves x->_mp_size unset */ - x->_mp_size = 0; - - return mpz_set_str (x, str, base); -} diff --git a/rts/gmp/mpz/iset_ui.c b/rts/gmp/mpz/iset_ui.c deleted file mode 100644 index 759182c556..0000000000 --- a/rts/gmp/mpz/iset_ui.c +++ /dev/null @@ -1,39 +0,0 @@ -/* mpz_init_set_ui(val) -- Make a new multiple precision number with - value val. - -Copyright (C) 1991, 1993, 1994, 1995 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -void -#if __STDC__ -mpz_init_set_ui (mpz_ptr x, unsigned long int val) -#else -mpz_init_set_ui (x, val) - mpz_ptr x; - unsigned long int val; -#endif -{ - x->_mp_alloc = 1; - x->_mp_d = (mp_ptr) (*_mp_allocate_func) (BYTES_PER_MP_LIMB); - x->_mp_d[0] = val; - x->_mp_size = val != 0; -} diff --git a/rts/gmp/mpz/jacobi.c b/rts/gmp/mpz/jacobi.c deleted file mode 100644 index 9d49e1d0c6..0000000000 --- a/rts/gmp/mpz/jacobi.c +++ /dev/null @@ -1,53 +0,0 @@ -/* mpz_jacobi (op1, op2). - Contributed by Bennet Yee (bsy) at Carnegie-Mellon University - -Copyright (C) 1991, 1996 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" - -/* Precondition: both p and q are positive */ - -int -#if __STDC__ -mpz_jacobi (mpz_srcptr pi, mpz_srcptr qi) -#else -mpz_jacobi (pi, qi) - mpz_srcptr pi, qi; -#endif -{ -#if GCDCHECK - int retval; - mpz_t gcdval; - - mpz_init (gcdval); - mpz_gcd (gcdval, pi, qi); - if (!mpz_cmp_ui (gcdval, 1L)) - { - /* J(ab,cb) = J(ab,c)J(ab,b) = J(ab,c)J(0,b) = J(ab,c)*0 */ - retval = 0; - } - else - retval = mpz_legendre (pi, qi); - mpz_clear (gcdval); - return retval; -#else - return mpz_legendre (pi, qi); -#endif -} diff --git a/rts/gmp/mpz/kronsz.c b/rts/gmp/mpz/kronsz.c deleted file mode 100644 index c8c6752224..0000000000 --- a/rts/gmp/mpz/kronsz.c +++ /dev/null @@ -1,126 +0,0 @@ -/* mpz_si_kronecker -- Kronecker/Jacobi symbol. */ - -/* -Copyright (C) 1999, 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. -*/ - -#include "gmp.h" -#include "gmp-impl.h" -#include "longlong.h" - - -int -#if __STDC__ -mpz_si_kronecker (long a, mpz_srcptr b) -#else -mpz_si_kronecker (a, b) - long a; - mpz_srcptr b; -#endif -{ - int b_abs_size; - mp_srcptr b_ptr; - mp_limb_t b_low; - int twos; - int result_bit1; - - b_abs_size = ABSIZ (b); - if (b_abs_size == 0) - return JACOBI_S0 (a); /* (a/0) */ - - b_ptr = PTR(b); - b_low = b_ptr[0]; - - /* (0/b) = 1 if b=+/-1, 0 otherwise */ - if (a == 0) - return (b_abs_size == 1) & (b_low == 1); - - /* account for the effect of the sign of b, so can then ignore it */ - result_bit1 = JACOBI_BSGN_SZ_BIT1 (a, b); - - if ((b_low & 1) == 0) - { - /* b even */ - - if ((a & 1) == 0) - return 0; /* (a/b)=0 if both a,b even */ - - /* Require MP_BITS_PER_LIMB even, so that (a/2)^MP_BITS_PER_LIMB = 1, - and so that therefore there's no need to account for how many zero - limbs are stripped. */ - ASSERT ((BITS_PER_MP_LIMB & 1) == 0); - - MPN_STRIP_LOW_ZEROS_NOT_ZERO (b_ptr, b_abs_size); - b_low = b_ptr[0]; - - if ((b_low & 1) == 0) - { - /* odd a, even b */ - - mp_limb_t b_shl_bit1; - - count_trailing_zeros (twos, b_low); - - /* b_shl_bit1 is b>>twos, but with only bit 1 guaranteed */ - if (twos == BITS_PER_MP_LIMB-1) - b_shl_bit1 = (b_abs_size == 1) ? 0 : (b_ptr[1] << 1); - else - b_shl_bit1 = (b_low >> twos); - - result_bit1 ^= JACOBI_ASGN_SU_BIT1 (a, b_shl_bit1); - a = ABS(a); - - if (a == 1) - return JACOBI_BIT1_TO_PN (result_bit1); /* (1/b)=1 */ - - /* twos (a/2), reciprocity to (b/a), and (b/a) = (b mod a / b) */ - return mpn_jacobi_base (mpn_mod_1_rshift (b_ptr, b_abs_size, - twos, a), - a, - result_bit1 - ^ JACOBI_TWOS_U_BIT1 (twos, a) - ^ JACOBI_RECIP_UU_BIT1 (a, b_shl_bit1)); - } - } - - /* b odd */ - - result_bit1 ^= JACOBI_ASGN_SU_BIT1 (a, b_low); - a = ABS(a); - - /* (a/1) = 1 for any a */ - if (b_abs_size == 1 && b_low == 1) - return JACOBI_BIT1_TO_PN (result_bit1); - - /* Note a is cast to unsigned because 0x80..00 doesn't fit in a signed. */ - if ((a & 1) == 0) - { - count_trailing_zeros (twos, a); - a = ((unsigned long) a) >> twos; - result_bit1 ^= JACOBI_TWOS_U_BIT1 (twos, b_low); - } - - if (a == 1) - return JACOBI_BIT1_TO_PN (result_bit1); /* (1/b)=1 */ - - /* reciprocity to (b/a), and (b/a) == (b mod a / a) */ - return mpn_jacobi_base (mpn_mod_1 (b_ptr, b_abs_size, a), a, - result_bit1 ^ JACOBI_RECIP_UU_BIT1 (a, b_low)); -} diff --git a/rts/gmp/mpz/kronuz.c b/rts/gmp/mpz/kronuz.c deleted file mode 100644 index b877e6f64c..0000000000 --- a/rts/gmp/mpz/kronuz.c +++ /dev/null @@ -1,115 +0,0 @@ -/* mpz_ui_kronecker -- Kronecker/Jacobi symbol. */ - -/* -Copyright (C) 1999, 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. -*/ - -#include "gmp.h" -#include "gmp-impl.h" -#include "longlong.h" - - -int -#if __STDC__ -mpz_ui_kronecker (unsigned long a, mpz_srcptr b) -#else -mpz_ui_kronecker (a, b) - unsigned long a; - mpz_srcptr b; -#endif -{ - int b_abs_size; - mp_srcptr b_ptr; - mp_limb_t b_low; - int twos; - int result_bit1; - - /* (a/0) */ - b_abs_size = ABSIZ (b); - if (b_abs_size == 0) - return JACOBI_U0 (a); - - /* (a/-1)=1 when a>=0, so the sign of b is ignored */ - b_ptr = PTR(b); - b_low = b_ptr[0]; - - /* (0/1)=1; (0/-1)=1; (0/b)=0 for b!=+/-1 - (1/b)=1, for any b */ - if (a <= 1) - return (a == 1) | ((b_abs_size == 1) & (b_low == 1)); - - if (b_low & 1) - { - /* (a/1) = 1 for any a */ - if (b_abs_size == 1 && b_low == 1) - return 1; - - count_trailing_zeros (twos, a); - a >>= twos; - if (a == 1) - return JACOBI_TWOS_U (twos, b_low); /* powers of (2/b) only */ - - /* powers of (2/b); reciprocity to (b/a); (b/a) == (b mod a / a) */ - return mpn_jacobi_base (mpn_mod_1 (b_ptr, b_abs_size, a), - a, - JACOBI_TWOS_U_BIT1 (twos, b_low) - ^ JACOBI_RECIP_UU_BIT1 (b_low, a)); - } - - /* b is even; (a/2)=0 if a is even */ - if ((a & 1) == 0) - return 0; - - /* Require MP_BITS_PER_LIMB even, so (a/2)^MP_BITS_PER_LIMB = 1, and so we - don't have to pay attention to how many trailing zero limbs are - stripped. */ - ASSERT ((BITS_PER_MP_LIMB & 1) == 0); - - MPN_STRIP_LOW_ZEROS_NOT_ZERO (b_ptr, b_abs_size); - b_low = b_ptr[0]; - - if (b_low & 1) - /* reciprocity to (b/a); (b/a) == (b mod a / a) */ - return mpn_jacobi_base (mpn_mod_1 (b_ptr, b_abs_size, a), - a, - JACOBI_RECIP_UU_BIT1 (b_low, a)); - - count_trailing_zeros (twos, b_low); - - /* reciprocity to get (b/a) */ - if (twos == BITS_PER_MP_LIMB-1) - { - if (b_abs_size == 1) - { - /* b==0x800...00, one limb high bit only, so (a/2)^(BPML-1) */ - return JACOBI_TWOS_U (BITS_PER_MP_LIMB-1, a); - } - - /* b_abs_size > 1 */ - result_bit1 = JACOBI_RECIP_UU_BIT1 (a, b_ptr[1] << 1); - } - else - result_bit1 = JACOBI_RECIP_UU_BIT1 (a, b_low >> twos); - - /* powers of (a/2); reciprocity to (b/a); (b/a) == (b mod a / a) */ - return mpn_jacobi_base (mpn_mod_1_rshift (b_ptr, b_abs_size, twos, a), - a, - JACOBI_TWOS_U_BIT1 (twos, a) ^ result_bit1); -} diff --git a/rts/gmp/mpz/kronzs.c b/rts/gmp/mpz/kronzs.c deleted file mode 100644 index edfb465976..0000000000 --- a/rts/gmp/mpz/kronzs.c +++ /dev/null @@ -1,74 +0,0 @@ -/* mpz_kronecker_si -- Kronecker/Jacobi symbol. */ - -/* -Copyright (C) 1999, 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. -*/ - -#include "gmp.h" -#include "gmp-impl.h" -#include "longlong.h" - - -/* This function is expected to be often used with b odd, so there's a test - for this before invoking count_trailing_zeros(). - - After the absolute value of b is established it's treated as an unsigned - long, because 0x80..00 doesn't fit in a signed long. */ - -int -#if __STDC__ -mpz_kronecker_si (mpz_srcptr a, long b) -#else -mpz_kronecker_si (a, b) - mpz_srcptr a; - long b; -#endif -{ - int result_bit1; - int twos; - - if (b == 0) - return JACOBI_Z0 (a); - - result_bit1 = JACOBI_BSGN_ZS_BIT1(a, b); - b = ABS (b); - - if (b == 1) - return JACOBI_BIT1_TO_PN (result_bit1); /* (a/1) = 1 for any a */ - - if (b & 1) - return mpn_jacobi_base (mpz_fdiv_ui (a, b), b, result_bit1); - - /* result 0 if both a,b even */ - if (mpz_even_p (a)) - return 0; - - /* (a/2)=(2/a) when a odd */ - count_trailing_zeros (twos, b); - result_bit1 ^= JACOBI_TWOS_U_BIT1 (twos, PTR(a)[0]); - - b = ((unsigned long) b) >> twos; - if (b == 1) - return JACOBI_BIT1_TO_PN (result_bit1); - else - return mpn_jacobi_base (mpz_fdiv_ui (a, b), b, result_bit1); -} - - diff --git a/rts/gmp/mpz/kronzu.c b/rts/gmp/mpz/kronzu.c deleted file mode 100644 index 749be5df07..0000000000 --- a/rts/gmp/mpz/kronzu.c +++ /dev/null @@ -1,66 +0,0 @@ -/* mpz_kronecker_ui -- Kronecker/Jacobi symbol. */ - -/* -Copyright (C) 1999, 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. -*/ - -#include "gmp.h" -#include "gmp-impl.h" -#include "longlong.h" - - -/* This function is expected to be often used with b an odd prime, so the - code for odd b is nice and short. */ - -int -#if __STDC__ -mpz_kronecker_ui (mpz_srcptr a, unsigned long b) -#else -mpz_kronecker_ui (a, b) - mpz_srcptr a; - unsigned long b; -#endif -{ - int twos; - - if (b & 1) - { - if (b != 1) - return mpn_jacobi_base (mpz_fdiv_ui (a, b), b, 0); - else - return 1; /* (a/1)=1 for any a */ - } - - if (b == 0) - return JACOBI_Z0 (a); - - /* (a/2)=0 if a even */ - if (mpz_even_p (a)) - return 0; - - /* (a/2)=(2/a) when a odd */ - count_trailing_zeros (twos, b); - b >>= twos; - if (b == 1) - return JACOBI_TWOS_U (twos, PTR(a)[0]); - - return mpn_jacobi_base (mpz_fdiv_ui (a, b), b, - JACOBI_TWOS_U_BIT1(twos, PTR(a)[0])); -} diff --git a/rts/gmp/mpz/lcm.c b/rts/gmp/mpz/lcm.c deleted file mode 100644 index 7495882ae5..0000000000 --- a/rts/gmp/mpz/lcm.c +++ /dev/null @@ -1,61 +0,0 @@ -/* mpz/lcm.c: Calculate the least common multiple of two integers. - -Copyright (C) 1996, 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" -#include "longlong.h" - -void *_mpz_realloc (); - -void -#if __STDC__ -mpz_lcm (mpz_ptr r, mpz_srcptr u, mpz_srcptr v) -#else -mpz_lcm (r, u, v) - mpz_ptr r; - mpz_srcptr u; - mpz_srcptr v; -#endif -{ - mpz_t g; - mp_size_t usize, vsize, size; - TMP_DECL (marker); - - TMP_MARK (marker); - - usize = ABS (SIZ (u)); - vsize = ABS (SIZ (v)); - - if (usize == 0 || vsize == 0) - { - SIZ (r) = 0; - return; - } - - size = MAX (usize, vsize); - MPZ_TMP_INIT (g, size); - - mpz_gcd (g, u, v); - mpz_divexact (g, u, g); - mpz_mul (r, g, v); - - TMP_FREE (marker); -} diff --git a/rts/gmp/mpz/legendre.c b/rts/gmp/mpz/legendre.c deleted file mode 100644 index ab665f70d0..0000000000 --- a/rts/gmp/mpz/legendre.c +++ /dev/null @@ -1,184 +0,0 @@ -/* mpz_legendre (op1, op2). - Contributed by Bennet Yee (bsy) at Carnegie-Mellon University - -Copyright (C) 1992, 1996 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" - -#if defined (DEBUG) -#include <stdio.h> -#endif - -/* Precondition: both p and q are positive */ - -int -#if __STDC__ -mpz_legendre (mpz_srcptr pi, mpz_srcptr qi) -#else -mpz_legendre (pi, qi) -mpz_srcptr pi, qi; -#endif -{ - mpz_t p, q, qdiv2; -#ifdef Q_MINUS_1 - mpz_t q_minus_1; -#endif - mpz_ptr mtmp; - register mpz_ptr pptr, qptr; - register int retval = 1; - register unsigned long int s; - - pptr = p; - mpz_init_set (pptr, pi); - qptr = q; - mpz_init_set (qptr, qi); - -#ifdef Q_MINUS_1 - mpz_init (q_minus_1); -#endif - mpz_init (qdiv2); - -tail_recurse2: -#ifdef DEBUG - printf ("tail_recurse2: p="); - mpz_out_str (stdout, 10, pptr); - printf ("\nq="); - mpz_out_str (stdout, 10, qptr); - putchar ('\n'); -#endif - s = mpz_scan1 (qptr, 0); - if (s) mpz_tdiv_q_2exp (qptr, qptr, s); /* J(a,2) = 1 */ -#ifdef DEBUG - printf ("2 factor decomposition: p="); - mpz_out_str (stdout, 10, pptr); - printf ("\nq="); - mpz_out_str (stdout, 10, qptr); - putchar ('\n'); -#endif - /* postcondition q odd */ - if (!mpz_cmp_ui (qptr, 1L)) /* J(a,1) = 1 */ - goto done; - mpz_mod (pptr, pptr, qptr); /* J(a,q) = J(b,q) when a == b mod q */ -#ifdef DEBUG - printf ("mod out by q: p="); - mpz_out_str (stdout, 10, pptr); - printf ("\nq="); - mpz_out_str (stdout, 10, qptr); - putchar ('\n'); -#endif - /* quick calculation to get approximate size first */ - /* precondition: p < q */ - if ((mpz_sizeinbase (pptr, 2) + 1 >= mpz_sizeinbase (qptr,2)) - && (mpz_tdiv_q_2exp (qdiv2, qptr, 1L), mpz_cmp (pptr, qdiv2) > 0)) - { - /* p > q/2 */ - mpz_sub (pptr, qptr, pptr); - /* J(-1,q) = (-1)^((q-1)/2), q odd */ - if (mpz_get_ui (qptr) & 2) - retval = -retval; - } - /* p < q/2 */ -#ifdef Q_MINUS_1 - mpz_sub_ui (q_minus_q, qptr, 1L); -#endif -tail_recurse: /* we use tail_recurse only if q has not changed */ -#ifdef DEBUG - printf ("tail_recurse1: p="); - mpz_out_str (stdout, 10, pptr); - printf ("\nq="); - mpz_out_str (stdout, 10, qptr); - putchar ('\n'); -#endif - /* - * J(0,q) = 0 - * this occurs only if gcd(p,q) != 1 which is never true for - * Legendre function. - */ - if (!mpz_cmp_ui (pptr, 0L)) - { - retval = 0; - goto done; - } - - if (!mpz_cmp_ui (pptr, 1L)) - { - /* J(1,q) = 1 */ - /* retval *= 1; */ - goto done; - } -#ifdef Q_MINUS_1 - if (!mpz_cmp (pptr, q_minus_1)) - { - /* J(-1,q) = (-1)^((q-1)/2) */ - if (mpz_get_ui (qptr) & 2) - retval = -retval; - /* else retval *= 1; */ - goto done; - } -#endif - /* - * we do not handle J(xy,q) except for x==2 - * since we do not want to factor - */ - if ((s = mpz_scan1 (pptr, 0)) != 0) - { - /* - * J(2,q) = (-1)^((q^2-1)/8) - * - * Note that q odd guarantees that q^2-1 is divisible by 8: - * Let a: q=2a+1. q^2 = 4a^2+4a+1, (q^2-1)/8 = a(a+1)/2, qed - * - * Now, note that this means that the low two bits of _a_ - * (or the low bits of q shifted over by 1 determines - * the factor). - */ - mpz_tdiv_q_2exp (pptr, pptr, s); - - /* even powers of 2 gives J(2,q)^{2n} = 1 */ - if (s & 1) - { - s = mpz_get_ui (qptr) >> 1; - s = s * (s + 1); - if (s & 2) - retval = -retval; - } - goto tail_recurse; - } - /* - * we know p is odd since we have cast out 2s - * precondition that q is odd guarantees both odd. - * - * quadratic reciprocity - * J(p,q) = (-1)^((p-1)(q-1)/4) * J(q,p) - */ - if ((s = mpz_scan1 (pptr, 1)) <= 2 && (s + mpz_scan1 (qptr, 1)) <= 2) - retval = -retval; - - mtmp = pptr; pptr = qptr; qptr = mtmp; - goto tail_recurse2; -done: - mpz_clear (p); - mpz_clear (q); - mpz_clear (qdiv2); -#ifdef Q_MINUS_1 - mpz_clear (q_minus_1); -#endif - return retval; -} diff --git a/rts/gmp/mpz/mod.c b/rts/gmp/mpz/mod.c deleted file mode 100644 index 87033b333b..0000000000 --- a/rts/gmp/mpz/mod.c +++ /dev/null @@ -1,63 +0,0 @@ -/* mpz_mod -- The mathematical mod function. - -Copyright (C) 1991, 1993, 1994, 1995, 1996 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -void -#if __STDC__ -mpz_mod (mpz_ptr rem, mpz_srcptr dividend, mpz_srcptr divisor) -#else -mpz_mod (rem, dividend, divisor) - mpz_ptr rem; - mpz_srcptr dividend; - mpz_srcptr divisor; -#endif -{ - mp_size_t divisor_size = divisor->_mp_size; - mpz_t temp_divisor; /* N.B.: lives until function returns! */ - TMP_DECL (marker); - - TMP_MARK (marker); - - /* We need the original value of the divisor after the remainder has been - preliminary calculated. We have to copy it to temporary space if it's - the same variable as REM. */ - if (rem == divisor) - { - MPZ_TMP_INIT (temp_divisor, ABS (divisor_size)); - mpz_set (temp_divisor, divisor); - divisor = temp_divisor; - } - - mpz_tdiv_r (rem, dividend, divisor); - - if (rem->_mp_size != 0) - { - if (dividend->_mp_size < 0) - if (divisor->_mp_size < 0) - mpz_sub (rem, rem, divisor); - else - mpz_add (rem, rem, divisor); - } - - TMP_FREE (marker); -} diff --git a/rts/gmp/mpz/mul.c b/rts/gmp/mpz/mul.c deleted file mode 100644 index 7854788e50..0000000000 --- a/rts/gmp/mpz/mul.c +++ /dev/null @@ -1,131 +0,0 @@ -/* mpz_mul -- Multiply two integers. - -Copyright (C) 1991, 1993, 1994, 1996, 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include <stdio.h> /* for NULL */ -#include "gmp.h" -#include "gmp-impl.h" -#ifdef BERKELEY_MP -#include "mp.h" -#endif - -#ifndef BERKELEY_MP -void -#if __STDC__ -mpz_mul (mpz_ptr w, mpz_srcptr u, mpz_srcptr v) -#else -mpz_mul (w, u, v) - mpz_ptr w; - mpz_srcptr u; - mpz_srcptr v; -#endif -#else /* BERKELEY_MP */ -void -#if __STDC__ -mult (mpz_srcptr u, mpz_srcptr v, mpz_ptr w) -#else -mult (u, v, w) - mpz_srcptr u; - mpz_srcptr v; - mpz_ptr w; -#endif -#endif /* BERKELEY_MP */ -{ - mp_size_t usize = u->_mp_size; - mp_size_t vsize = v->_mp_size; - mp_size_t wsize; - mp_size_t sign_product; - mp_ptr up, vp; - mp_ptr wp; - mp_ptr free_me = NULL; - size_t free_me_size; - mp_limb_t cy_limb; - TMP_DECL (marker); - - TMP_MARK (marker); - sign_product = usize ^ vsize; - usize = ABS (usize); - vsize = ABS (vsize); - - if (usize < vsize) - { - /* Swap U and V. */ - {const __mpz_struct *t = u; u = v; v = t;} - {mp_size_t t = usize; usize = vsize; vsize = t;} - } - - up = u->_mp_d; - vp = v->_mp_d; - wp = w->_mp_d; - - /* Ensure W has space enough to store the result. */ - wsize = usize + vsize; - if (w->_mp_alloc < wsize) - { - if (wp == up || wp == vp) - { - free_me = wp; - free_me_size = w->_mp_alloc; - } - else - (*_mp_free_func) (wp, w->_mp_alloc * BYTES_PER_MP_LIMB); - - w->_mp_alloc = wsize; - wp = (mp_ptr) (*_mp_allocate_func) (wsize * BYTES_PER_MP_LIMB); - w->_mp_d = wp; - } - else - { - /* Make U and V not overlap with W. */ - if (wp == up) - { - /* W and U are identical. Allocate temporary space for U. */ - up = (mp_ptr) TMP_ALLOC (usize * BYTES_PER_MP_LIMB); - /* Is V identical too? Keep it identical with U. */ - if (wp == vp) - vp = up; - /* Copy to the temporary space. */ - MPN_COPY (up, wp, usize); - } - else if (wp == vp) - { - /* W and V are identical. Allocate temporary space for V. */ - vp = (mp_ptr) TMP_ALLOC (vsize * BYTES_PER_MP_LIMB); - /* Copy to the temporary space. */ - MPN_COPY (vp, wp, vsize); - } - } - - if (vsize == 0) - { - wsize = 0; - } - else - { - cy_limb = mpn_mul (wp, up, usize, vp, vsize); - wsize = usize + vsize; - wsize -= cy_limb == 0; - } - - w->_mp_size = sign_product < 0 ? -wsize : wsize; - if (free_me != NULL) - (*_mp_free_func) (free_me, free_me_size * BYTES_PER_MP_LIMB); - TMP_FREE (marker); -} diff --git a/rts/gmp/mpz/mul_2exp.c b/rts/gmp/mpz/mul_2exp.c deleted file mode 100644 index abea5fed2c..0000000000 --- a/rts/gmp/mpz/mul_2exp.c +++ /dev/null @@ -1,76 +0,0 @@ -/* mpz_mul_2exp -- Multiply a bignum by 2**CNT - -Copyright (C) 1991, 1993, 1994, 1996 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -void -#if __STDC__ -mpz_mul_2exp (mpz_ptr w, mpz_srcptr u, unsigned long int cnt) -#else -mpz_mul_2exp (w, u, cnt) - mpz_ptr w; - mpz_srcptr u; - unsigned long int cnt; -#endif -{ - mp_size_t usize = u->_mp_size; - mp_size_t abs_usize = ABS (usize); - mp_size_t wsize; - mp_size_t limb_cnt; - mp_ptr wp; - mp_limb_t wlimb; - - if (usize == 0) - { - w->_mp_size = 0; - return; - } - - limb_cnt = cnt / BITS_PER_MP_LIMB; - wsize = abs_usize + limb_cnt + 1; - if (w->_mp_alloc < wsize) - _mpz_realloc (w, wsize); - - wp = w->_mp_d; - wsize = abs_usize + limb_cnt; - - cnt %= BITS_PER_MP_LIMB; - if (cnt != 0) - { - wlimb = mpn_lshift (wp + limb_cnt, u->_mp_d, abs_usize, cnt); - if (wlimb != 0) - { - wp[wsize] = wlimb; - wsize++; - } - } - else - { - MPN_COPY_DECR (wp + limb_cnt, u->_mp_d, abs_usize); - } - - /* Zero all whole limbs at low end. Do it here and not before calling - mpn_lshift, not to lose for U == W. */ - MPN_ZERO (wp, limb_cnt); - - w->_mp_size = usize >= 0 ? wsize : -wsize; -} diff --git a/rts/gmp/mpz/mul_siui.c b/rts/gmp/mpz/mul_siui.c deleted file mode 100644 index 9849cd41b0..0000000000 --- a/rts/gmp/mpz/mul_siui.c +++ /dev/null @@ -1,81 +0,0 @@ -/* mpz_mul_ui/si (product, multiplier, small_multiplicand) -- Set PRODUCT to - MULTIPLICATOR times SMALL_MULTIPLICAND. - -Copyright (C) 1991, 1993, 1994, 1996, 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - - -#ifdef OPERATION_mul_ui -#define FUNCTION mpz_mul_ui -#define MULTIPLICAND_UNSIGNED unsigned -#define MULTIPLICAND_ABS(x) x -#else -#ifdef OPERATION_mul_si -#define FUNCTION mpz_mul_si -#define MULTIPLICAND_UNSIGNED -#define MULTIPLICAND_ABS(x) ABS(x) -#else -Error, error, unrecognised OPERATION -#endif -#endif - - -void -#if __STDC__ -FUNCTION (mpz_ptr prod, mpz_srcptr mult, - MULTIPLICAND_UNSIGNED long int small_mult) -#else -FUNCTION (prod, mult, small_mult) - mpz_ptr prod; - mpz_srcptr mult; - MULTIPLICAND_UNSIGNED long int small_mult; -#endif -{ - mp_size_t size = mult->_mp_size; - mp_size_t sign_product = size; - mp_limb_t cy; - mp_size_t prod_size; - mp_ptr prod_ptr; - - if (size == 0 || small_mult == 0) - { - prod->_mp_size = 0; - return; - } - size = ABS (size); - - prod_size = size + 1; - if (prod->_mp_alloc < prod_size) - _mpz_realloc (prod, prod_size); - - prod_ptr = prod->_mp_d; - - cy = mpn_mul_1 (prod_ptr, mult->_mp_d, size, - (mp_limb_t) MULTIPLICAND_ABS (small_mult)); - if (cy != 0) - { - prod_ptr[size] = cy; - size++; - } - - prod->_mp_size = ((sign_product < 0) ^ (small_mult < 0)) ? -size : size; -} diff --git a/rts/gmp/mpz/neg.c b/rts/gmp/mpz/neg.c deleted file mode 100644 index 566c3a95aa..0000000000 --- a/rts/gmp/mpz/neg.c +++ /dev/null @@ -1,53 +0,0 @@ -/* mpz_neg(mpz_ptr dst, mpz_ptr src) -- Assign the negated value of SRC to DST. - -Copyright (C) 1991, 1993, 1994, 1995 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -void -#if __STDC__ -mpz_neg (mpz_ptr w, mpz_srcptr u) -#else -mpz_neg (w, u) - mpz_ptr w; - mpz_srcptr u; -#endif -{ - mp_ptr wp, up; - mp_size_t usize, size; - - usize = u->_mp_size; - - if (u != w) - { - size = ABS (usize); - - if (w->_mp_alloc < size) - _mpz_realloc (w, size); - - wp = w->_mp_d; - up = u->_mp_d; - - MPN_COPY (wp, up, size); - } - - w->_mp_size = -usize; -} diff --git a/rts/gmp/mpz/nextprime.c b/rts/gmp/mpz/nextprime.c deleted file mode 100644 index f024dd1206..0000000000 --- a/rts/gmp/mpz/nextprime.c +++ /dev/null @@ -1,120 +0,0 @@ -/* mpz_nextprime(p,t) - compute the next prime > t and store that in p. - -Copyright (C) 1999, 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -void -#if __STDC__ -mpz_nextprime (mpz_ptr p, mpz_srcptr t) -#else -mpz_nextprime (p, t) - mpz_ptr p; - mpz_srcptr t; -#endif -{ - mpz_add_ui (p, t, 1L); - while (! mpz_probab_prime_p (p, 5)) - mpz_add_ui (p, p, 1L); -} - -#if 0 -/* This code is not yet tested. Will be enabled in 3.1. */ - -status unsigned short primes[] = -{ -3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97, -101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181, -191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277, -281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383, -389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487, -491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601, -607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709, -719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827, -829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947, -953,967,971,977,983,991,997 -}; - -#define NUMBER_OF_PRIMES 167 - -void -#if __STDC__ -mpz_nextprime (mpz_ptr p, mpz_srcptr n) -#else -mpz_nextprime (p, n) - mpz_ptr p; - mpz_srcptr n; -#endif -{ - mpz_t tmp; - unsigned short *moduli; - unsigned long difference; - int i; - int composite; - - /* First handle tiny numbers */ - if (mpz_cmp_ui (n, 2) < 0) - { - mpz_set_ui (p, 2); - return; - } - mpz_add_ui (p, n, 1); - mpz_setbit (p, 0); - - if (mpz_cmp_ui (p, 7) <= 0) - return; - - prime_limit = NUMBER_OF_PRIMES - 1; - if (mpz_cmp_ui (p, primes[prime_limit]) <= 0) - /* Just use first three entries (3,5,7) of table for small numbers */ - prime_limit = 3; - if (prime_limit) - { - /* Compute residues modulo small odd primes */ - moduli = (unsigned short *) TMP_ALLOC (prime_limit * sizeof moduli[0]); - for (i = 0; i < prime_limit; i++) - moduli[i] = mpz_fdiv_ui (p, primes[i]); - } - for (difference = 0; ; difference += 2) - { - composite = 0; - - /* First check residues */ - for (i = 0; i < prime_limit; i++) - { - int acc, pr; - composite |= (moduli[i] == 0); - acc = moduli[i] + 2; - pr = primes[i]; - moduli[i] = acc >= pr ? acc - pr : acc; - } - if (composite) - continue; - - mpz_add_ui (p, p, difference); - difference = 0; - - /* Miller-Rabin test */ - if (mpz_millerrabin (p, 2)) - break; - } -} -#endif diff --git a/rts/gmp/mpz/out_raw.c b/rts/gmp/mpz/out_raw.c deleted file mode 100644 index 62709479c5..0000000000 --- a/rts/gmp/mpz/out_raw.c +++ /dev/null @@ -1,89 +0,0 @@ -/* mpz_out_raw -- Output a mpz_t in binary. Use an endianess and word size - independent format. - -Copyright (C) 1995 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include <stdio.h> - -#include "gmp.h" -#include "gmp-impl.h" - -size_t -#if __STDC__ -mpz_out_raw (FILE *stream, mpz_srcptr x) -#else -mpz_out_raw (stream, x) - FILE *stream; - mpz_srcptr x; -#endif -{ - int i; - mp_size_t s; - mp_size_t xsize = ABS (x->_mp_size); - mp_srcptr xp = x->_mp_d; - mp_size_t out_bytesize; - mp_limb_t hi_limb; - int n_bytes_in_hi_limb; - - if (stream == 0) - stream = stdout; - - if (xsize == 0) - { - for (i = 4 - 1; i >= 0; i--) - fputc (0, stream); - return ferror (stream) ? 0 : 4; - } - - hi_limb = xp[xsize - 1]; - for (i = BYTES_PER_MP_LIMB - 1; i > 0; i--) - { - if ((hi_limb >> i * BITS_PER_CHAR) != 0) - break; - } - n_bytes_in_hi_limb = i + 1; - out_bytesize = BYTES_PER_MP_LIMB * (xsize - 1) + n_bytes_in_hi_limb; - if (x->_mp_size < 0) - out_bytesize = -out_bytesize; - - /* Make the size 4 bytes on all machines, to make the format portable. */ - for (i = 4 - 1; i >= 0; i--) - fputc ((out_bytesize >> (i * BITS_PER_CHAR)) % (1 << BITS_PER_CHAR), - stream); - - /* Output from the most significant limb to the least significant limb, - with each limb also output in decreasing significance order. */ - - /* Output the most significant limb separately, since we will only - output some of its bytes. */ - for (i = n_bytes_in_hi_limb - 1; i >= 0; i--) - fputc ((hi_limb >> (i * BITS_PER_CHAR)) % (1 << BITS_PER_CHAR), stream); - - /* Output the remaining limbs. */ - for (s = xsize - 2; s >= 0; s--) - { - mp_limb_t x_limb; - - x_limb = xp[s]; - for (i = BYTES_PER_MP_LIMB - 1; i >= 0; i--) - fputc ((x_limb >> (i * BITS_PER_CHAR)) % (1 << BITS_PER_CHAR), stream); - } - return ferror (stream) ? 0 : ABS (out_bytesize) + 4; -} diff --git a/rts/gmp/mpz/out_str.c b/rts/gmp/mpz/out_str.c deleted file mode 100644 index bf971b0057..0000000000 --- a/rts/gmp/mpz/out_str.c +++ /dev/null @@ -1,108 +0,0 @@ -/* mpz_out_str(stream, base, integer) -- Output to STREAM the multi prec. - integer INTEGER in base BASE. - -Copyright (C) 1991, 1993, 1994, 1996 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include <stdio.h> -#include "gmp.h" -#include "gmp-impl.h" - -size_t -#if __STDC__ -mpz_out_str (FILE *stream, int base, mpz_srcptr x) -#else -mpz_out_str (stream, base, x) - FILE *stream; - int base; - mpz_srcptr x; -#endif -{ - mp_ptr xp; - mp_size_t x_size = x->_mp_size; - unsigned char *str; - size_t str_size; - size_t i; - size_t written; - char *num_to_text; - TMP_DECL (marker); - - if (stream == 0) - stream = stdout; - - if (base >= 0) - { - if (base == 0) - base = 10; - num_to_text = "0123456789abcdefghijklmnopqrstuvwxyz"; - } - else - { - base = -base; - num_to_text = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; - } - - if (x_size == 0) - { - fputc ('0', stream); - return ferror (stream) ? 0 : 1; - } - - written = 0; - - if (x_size < 0) - { - fputc ('-', stream); - x_size = -x_size; - written = 1; - } - - TMP_MARK (marker); - str_size = ((size_t) (x_size * BITS_PER_MP_LIMB - * __mp_bases[base].chars_per_bit_exactly)) + 3; - str = (unsigned char *) TMP_ALLOC (str_size); - - /* Move the number to convert into temporary space, since mpn_get_str - clobbers its argument + needs one extra high limb.... */ - xp = (mp_ptr) TMP_ALLOC ((x_size + 1) * BYTES_PER_MP_LIMB); - MPN_COPY (xp, x->_mp_d, x_size); - - str_size = mpn_get_str (str, base, xp, x_size); - - /* mpn_get_str might make some leading zeros. Skip them. */ - while (*str == 0) - { - str_size--; - str++; - } - - /* Translate to printable chars. */ - for (i = 0; i < str_size; i++) - str[i] = num_to_text[str[i]]; - str[str_size] = 0; - - { - size_t fwret; - fwret = fwrite ((char *) str, 1, str_size, stream); - written += fwret; - } - - TMP_FREE (marker); - return ferror (stream) ? 0 : written; -} diff --git a/rts/gmp/mpz/perfpow.c b/rts/gmp/mpz/perfpow.c deleted file mode 100644 index e71670a0be..0000000000 --- a/rts/gmp/mpz/perfpow.c +++ /dev/null @@ -1,272 +0,0 @@ -/* mpz_perfect_power_p(arg) -- Return non-zero if ARG is a perfect power, - zero otherwise. - -Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -/* - We are to determine if c is a perfect power, c = a ^ b. - Assume c is divisible by 2^n and that codd = c/2^n is odd. - Assume a is divisible by 2^m and that aodd = a/2^m is odd. - It is always true that m divides n. - - * If n is prime, either 1) a is 2*aodd and b = n - or 2) a = c and b = 1. - So for n prime, we readily have a solution. - * If n is factorable into the non-trivial factors p1,p2,... - Since m divides n, m has a subset of n's factors and b = n / m. - - BUG: Should handle negative numbers, since they can be odd perfect powers. -*/ - -/* This is a naive approach to recognizing perfect powers. - Many things can be improved. In particular, we should use p-adic - arithmetic for computing possible roots. */ - -#include <stdio.h> /* for NULL */ -#include "gmp.h" -#include "gmp-impl.h" -#include "longlong.h" - -static unsigned long int gcd _PROTO ((unsigned long int a, unsigned long int b)); -static int isprime _PROTO ((unsigned long int t)); - -static const unsigned short primes[] = -{ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, - 59, 61, 67, 71, 73, 79, 83, 89, 97,101,103,107,109,113,127,131, - 137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223, - 227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311, - 313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409, - 419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503, - 509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613, - 617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719, - 727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827, - 829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941, - 947,953,967,971,977,983,991,997,0 -}; -#define SMALLEST_OMITTED_PRIME 1009 - - -int -#if __STDC__ -mpz_perfect_power_p (mpz_srcptr u) -#else -mpz_perfect_power_p (u) - mpz_srcptr u; -#endif -{ - unsigned long int prime; - unsigned long int n, n2; - int i; - unsigned long int rem; - mpz_t u2, q; - int exact; - mp_size_t uns; - TMP_DECL (marker); - - if (mpz_cmp_ui (u, 1) <= 0) - return 0; - - n2 = mpz_scan1 (u, 0); - if (n2 == 1) - return 0; - - TMP_MARK (marker); - - uns = ABSIZ (u) - n2 / BITS_PER_MP_LIMB; - MPZ_TMP_INIT (q, uns); - MPZ_TMP_INIT (u2, uns); - - mpz_tdiv_q_2exp (u2, u, n2); - - if (isprime (n2)) - goto n2prime; - - for (i = 1; primes[i] != 0; i++) - { - prime = primes[i]; - rem = mpz_tdiv_ui (u2, prime); - if (rem == 0) /* divisable? */ - { - rem = mpz_tdiv_q_ui (q, u2, prime * prime); - if (rem != 0) - { - TMP_FREE (marker); - return 0; - } - mpz_swap (q, u2); - for (n = 2;;) - { - rem = mpz_tdiv_q_ui (q, u2, prime); - if (rem != 0) - break; - mpz_swap (q, u2); - n++; - } - - n2 = gcd (n2, n); - if (n2 == 1) - { - TMP_FREE (marker); - return 0; - } - - /* As soon as n2 becomes a prime number, stop factoring. - Either we have u=x^n2 or u is not a perfect power. */ - if (isprime (n2)) - goto n2prime; - } - } - - if (mpz_cmp_ui (u2, 1) == 0) - { - TMP_FREE (marker); - return 1; - } - - if (n2 == 0) - { - unsigned long int nth; - /* We did not find any factors above. We have to consider all values - of n. */ - for (nth = 2;; nth++) - { - if (! isprime (nth)) - continue; -#if 0 - exact = mpz_padic_root (q, u2, nth, PTH); - if (exact) -#endif - exact = mpz_root (q, u2, nth); - if (exact) - { - TMP_FREE (marker); - return 1; - } - if (mpz_cmp_ui (q, SMALLEST_OMITTED_PRIME) < 0) - { - TMP_FREE (marker); - return 0; - } - } - } - else - { - unsigned long int nth; - /* We found some factors above. We just need to consider values of n - that divides n2. */ - for (nth = 2; nth <= n2; nth++) - { - if (! isprime (nth)) - continue; - if (n2 % nth != 0) - continue; -#if 0 - exact = mpz_padic_root (q, u2, nth, PTH); - if (exact) -#endif - exact = mpz_root (q, u2, nth); - if (exact) - { - TMP_FREE (marker); - return 1; - } - if (mpz_cmp_ui (q, SMALLEST_OMITTED_PRIME) < 0) - { - TMP_FREE (marker); - return 0; - } - } - - TMP_FREE (marker); - return 0; - } - -n2prime: - exact = mpz_root (NULL, u2, n2); - TMP_FREE (marker); - return exact; -} - -static unsigned long int -#if __STDC__ -gcd (unsigned long int a, unsigned long int b) -#else -gcd (a, b) - unsigned long int a, b; -#endif -{ - int an2, bn2, n2; - - if (a == 0) - return b; - if (b == 0) - return a; - - count_trailing_zeros (an2, a); - a >>= an2; - - count_trailing_zeros (bn2, b); - b >>= bn2; - - n2 = MIN (an2, bn2); - - while (a != b) - { - if (a > b) - { - a -= b; - do - a >>= 1; - while ((a & 1) == 0); - } - else /* b > a. */ - { - b -= a; - do - b >>= 1; - while ((b & 1) == 0); - } - } - - return a << n2; -} - -static int -#if __STDC__ -isprime (unsigned long int t) -#else -isprime (t) - unsigned long int t; -#endif -{ - unsigned long int q, r, d; - - if (t < 3 || (t & 1) == 0) - return t == 2; - - for (d = 3, r = 1; r != 0; d += 2) - { - q = t / d; - r = t - q * d; - if (q < d) - return 1; - } - return 0; -} diff --git a/rts/gmp/mpz/perfsqr.c b/rts/gmp/mpz/perfsqr.c deleted file mode 100644 index 92e8d08ea9..0000000000 --- a/rts/gmp/mpz/perfsqr.c +++ /dev/null @@ -1,45 +0,0 @@ -/* mpz_perfect_square_p(arg) -- Return non-zero if ARG is a perfect square, - zero otherwise. - -Copyright (C) 1991, 1993, 1994, 1996, 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -int -#if __STDC__ -mpz_perfect_square_p (mpz_srcptr a) -#else -mpz_perfect_square_p (a) - mpz_srcptr a; -#endif -{ - mp_size_t asize = a->_mp_size; - - /* No negative numbers are perfect squares. */ - if (asize < 0) - return 0; - - /* Zero is a perfect square. */ - if (asize == 0) - return 1; - - return mpn_perfect_square_p (a->_mp_d, asize); -} diff --git a/rts/gmp/mpz/popcount.c b/rts/gmp/mpz/popcount.c deleted file mode 100644 index 3105258e26..0000000000 --- a/rts/gmp/mpz/popcount.c +++ /dev/null @@ -1,42 +0,0 @@ -/* mpz_popcount(mpz_ptr op) -- Population count of OP. If the operand is - negative, return ~0 (a novel representation of infinity). - -Copyright (C) 1994, 1996 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -unsigned long int -#if __STDC__ -mpz_popcount (mpz_srcptr u) -#else -mpz_popcount (u) - mpz_srcptr u; -#endif -{ - mp_size_t usize; - - usize = u->_mp_size; - - if ((usize) < 0) - return ~ (unsigned long int) 0; - - return mpn_popcount (u->_mp_d, usize); -} diff --git a/rts/gmp/mpz/pow_ui.c b/rts/gmp/mpz/pow_ui.c deleted file mode 100644 index 96ca114e4d..0000000000 --- a/rts/gmp/mpz/pow_ui.c +++ /dev/null @@ -1,129 +0,0 @@ -/* mpz_pow_ui(res, base, exp) -- Set RES to BASE**EXP. - -Copyright (C) 1991, 1993, 1994, 1996, 1997 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#ifdef BERKELEY_MP -#include "mp.h" -#endif -#include "gmp.h" -#include "gmp-impl.h" -#include "longlong.h" - -#ifndef BERKELEY_MP -void -#if __STDC__ -mpz_pow_ui (mpz_ptr r, mpz_srcptr b, unsigned long int e) -#else -mpz_pow_ui (r, b, e) - mpz_ptr r; - mpz_srcptr b; - unsigned long int e; -#endif -#else /* BERKELEY_MP */ -void -#if __STDC__ -rpow (const MINT *b, signed short int e, MINT *r) -#else -rpow (b, e, r) - const MINT *b; - signed short int e; - MINT *r; -#endif -#endif /* BERKELEY_MP */ -{ - mp_ptr rp, bp, tp, xp; - mp_size_t ralloc, rsize, bsize; - int cnt, i; - mp_limb_t blimb; - TMP_DECL (marker); - - bsize = ABS (b->_mp_size); - - /* Single out cases that give result == 0 or 1. These tests are here - to simplify the general code below, not to optimize. */ - if (e == 0) - { - r->_mp_d[0] = 1; - r->_mp_size = 1; - return; - } - if (bsize == 0 -#ifdef BERKELEY_MP - || e < 0 -#endif - ) - { - r->_mp_size = 0; - return; - } - - bp = b->_mp_d; - - blimb = bp[bsize - 1]; - if (bsize == 1 && blimb < 0x100) - { - /* Estimate space requirements accurately. Using the code from the - `else' path would over-estimate space requirements wildly. */ - float lb = __mp_bases[blimb].chars_per_bit_exactly; - ralloc = 3 + ((mp_size_t) (e / lb) / BITS_PER_MP_LIMB); - } - else - { - /* Over-estimate space requirements somewhat. */ - count_leading_zeros (cnt, blimb); - ralloc = bsize * e - cnt * e / BITS_PER_MP_LIMB + 2; - } - - TMP_MARK (marker); - - /* The two areas are used to alternatingly hold the input and recieve the - product for mpn_mul. (This scheme is used to fulfill the requirements - of mpn_mul; that the product space may not be the same as any of the - input operands.) */ - rp = (mp_ptr) TMP_ALLOC (ralloc * BYTES_PER_MP_LIMB); - tp = (mp_ptr) TMP_ALLOC (ralloc * BYTES_PER_MP_LIMB); - - MPN_COPY (rp, bp, bsize); - rsize = bsize; - count_leading_zeros (cnt, e); - - for (i = BITS_PER_MP_LIMB - cnt - 2; i >= 0; i--) - { - mpn_mul_n (tp, rp, rp, rsize); - rsize = 2 * rsize; - rsize -= tp[rsize - 1] == 0; - xp = tp; tp = rp; rp = xp; - - if ((e & ((mp_limb_t) 1 << i)) != 0) - { - rsize = rsize + bsize - (mpn_mul (tp, rp, rsize, bp, bsize) == 0); - xp = tp; tp = rp; rp = xp; - } - } - - /* Now then we know the exact space requirements, reallocate if - necessary. */ - if (r->_mp_alloc < rsize) - _mpz_realloc (r, rsize); - - MPN_COPY (r->_mp_d, rp, rsize); - r->_mp_size = (e & 1) == 0 || b->_mp_size >= 0 ? rsize : -rsize; - TMP_FREE (marker); -} diff --git a/rts/gmp/mpz/powm.c b/rts/gmp/mpz/powm.c deleted file mode 100644 index e6af855a71..0000000000 --- a/rts/gmp/mpz/powm.c +++ /dev/null @@ -1,364 +0,0 @@ -/* mpz_powm(res,base,exp,mod) -- Set RES to (base**exp) mod MOD. - -Copyright (C) 1991, 1993, 1994, 1996, 1997, 2000 Free Software Foundation, Inc. -Contributed by Paul Zimmermann. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" -#include "longlong.h" -#ifdef BERKELEY_MP -#include "mp.h" -#endif - - -/* set c <- (a*b)/R^n mod m c has to have at least (2n) allocated limbs */ -static void -#if __STDC__ -mpz_redc (mpz_ptr c, mpz_srcptr a, mpz_srcptr b, mpz_srcptr m, mp_limb_t Nprim) -#else -mpz_redc (c, a, b, m, Nprim) - mpz_ptr c; - mpz_srcptr a; - mpz_srcptr b; - mpz_srcptr m; - mp_limb_t Nprim; -#endif -{ - mp_ptr cp, mp = PTR (m); - mp_limb_t cy, cout = 0; - mp_limb_t q; - size_t j, n = ABSIZ (m); - - ASSERT (ALLOC (c) >= 2 * n); - - mpz_mul (c, a, b); - cp = PTR (c); - j = ABSIZ (c); - MPN_ZERO (cp + j, 2 * n - j); - for (j = 0; j < n; j++) - { - q = cp[0] * Nprim; - cy = mpn_addmul_1 (cp, mp, n, q); - cout += mpn_add_1 (cp + n, cp + n, n - j, cy); - cp++; - } - cp -= n; - if (cout) - { - cy = cout - mpn_sub_n (cp, cp + n, mp, n); - while (cy) - cy -= mpn_sub_n (cp, cp, mp, n); - } - else - MPN_COPY (cp, cp + n, n); - MPN_NORMALIZE (cp, n); - SIZ (c) = SIZ (c) < 0 ? -n : n; -} - -/* average number of calls to redc for an exponent of n bits - with the sliding window algorithm of base 2^k: the optimal is - obtained for the value of k which minimizes 2^(k-1)+n/(k+1): - - n\k 4 5 6 7 8 - 128 156* 159 171 200 261 - 256 309 307* 316 343 403 - 512 617 607* 610 632 688 - 1024 1231 1204 1195* 1207 1256 - 2048 2461 2399 2366 2360* 2396 - 4096 4918 4787 4707 4665* 4670 -*/ - -#ifndef BERKELEY_MP -void -#if __STDC__ -mpz_powm (mpz_ptr res, mpz_srcptr base, mpz_srcptr e, mpz_srcptr mod) -#else -mpz_powm (res, base, e, mod) - mpz_ptr res; - mpz_srcptr base; - mpz_srcptr e; - mpz_srcptr mod; -#endif -#else /* BERKELEY_MP */ -void -#if __STDC__ -pow (mpz_srcptr base, mpz_srcptr e, mpz_srcptr mod, mpz_ptr res) -#else -pow (base, e, mod, res) - mpz_srcptr base; - mpz_srcptr e; - mpz_srcptr mod; - mpz_ptr res; -#endif -#endif /* BERKELEY_MP */ -{ - mp_limb_t invm, *ep, c, mask; - mpz_t xx, *g; - mp_size_t n, i, K, j, l, k; - int sh; - int use_redc; - -#ifdef POWM_DEBUG - mpz_t exp; - mpz_init (exp); -#endif - - n = ABSIZ (mod); - - if (n == 0) - DIVIDE_BY_ZERO; - - if (SIZ (e) == 0) - { - /* Exponent is zero, result is 1 mod MOD, i.e., 1 or 0 - depending on if MOD equals 1. */ - SIZ(res) = (ABSIZ (mod) == 1 && (PTR(mod))[0] == 1) ? 0 : 1; - PTR(res)[0] = 1; - return; - } - - /* Use REDC instead of usual reduction for sizes < POWM_THRESHOLD. - In REDC each modular multiplication costs about 2*n^2 limbs operations, - whereas using usual reduction it costs 3*K(n), where K(n) is the cost of a - multiplication using Karatsuba, and a division is assumed to cost 2*K(n), - for example using Burnikel-Ziegler's algorithm. This gives a theoretical - threshold of a*KARATSUBA_SQR_THRESHOLD, with a=(3/2)^(1/(2-ln(3)/ln(2))) ~ - 2.66. */ - /* For now, also disable REDC when MOD is even, as the inverse can't - handle that. */ - -#ifndef POWM_THRESHOLD -#define POWM_THRESHOLD ((8 * KARATSUBA_SQR_THRESHOLD) / 3) -#endif - - use_redc = (n < POWM_THRESHOLD && PTR(mod)[0] % 2 != 0); - if (use_redc) - { - /* invm = -1/m mod 2^BITS_PER_MP_LIMB, must have m odd */ - modlimb_invert (invm, PTR(mod)[0]); - invm = -invm; - } - - /* determines optimal value of k */ - l = ABSIZ (e) * BITS_PER_MP_LIMB; /* number of bits of exponent */ - k = 1; - K = 2; - while (2 * l > K * (2 + k * (3 + k))) - { - k++; - K *= 2; - } - - g = (mpz_t *) (*_mp_allocate_func) (K / 2 * sizeof (mpz_t)); - /* compute x*R^n where R=2^BITS_PER_MP_LIMB */ - mpz_init (g[0]); - if (use_redc) - { - mpz_mul_2exp (g[0], base, n * BITS_PER_MP_LIMB); - mpz_mod (g[0], g[0], mod); - } - else - mpz_mod (g[0], base, mod); - - /* compute xx^g for odd g < 2^k */ - mpz_init (xx); - if (use_redc) - { - _mpz_realloc (xx, 2 * n); - mpz_redc (xx, g[0], g[0], mod, invm); /* xx = x^2*R^n */ - } - else - { - mpz_mul (xx, g[0], g[0]); - mpz_mod (xx, xx, mod); - } - for (i = 1; i < K / 2; i++) - { - mpz_init (g[i]); - if (use_redc) - { - _mpz_realloc (g[i], 2 * n); - mpz_redc (g[i], g[i - 1], xx, mod, invm); /* g[i] = x^(2i+1)*R^n */ - } - else - { - mpz_mul (g[i], g[i - 1], xx); - mpz_mod (g[i], g[i], mod); - } - } - - /* now starts the real stuff */ - mask = (mp_limb_t) ((1<<k) - 1); - ep = PTR (e); - i = ABSIZ (e) - 1; /* current index */ - c = ep[i]; /* current limb */ - count_leading_zeros (sh, c); - sh = BITS_PER_MP_LIMB - sh; /* significant bits in ep[i] */ - sh -= k; /* index of lower bit of ep[i] to take into account */ - if (sh < 0) - { /* k-sh extra bits are needed */ - if (i > 0) - { - i--; - c = (c << (-sh)) | (ep[i] >> (BITS_PER_MP_LIMB + sh)); - sh += BITS_PER_MP_LIMB; - } - } - else - c = c >> sh; -#ifdef POWM_DEBUG - printf ("-1/m mod 2^%u = %lu\n", BITS_PER_MP_LIMB, invm); - mpz_set_ui (exp, c); -#endif - j=0; - while (c % 2 == 0) - { - j++; - c = (c >> 1); - } - mpz_set (xx, g[c >> 1]); - while (j--) - { - if (use_redc) - mpz_redc (xx, xx, xx, mod, invm); - else - { - mpz_mul (xx, xx, xx); - mpz_mod (xx, xx, mod); - } - } - -#ifdef POWM_DEBUG - printf ("x^"); mpz_out_str (0, 10, exp); - printf ("*2^%u mod m = ", n * BITS_PER_MP_LIMB); mpz_out_str (0, 10, xx); - putchar ('\n'); -#endif - - while (i > 0 || sh > 0) - { - c = ep[i]; - sh -= k; - l = k; /* number of bits treated */ - if (sh < 0) - { - if (i > 0) - { - i--; - c = (c << (-sh)) | (ep[i] >> (BITS_PER_MP_LIMB + sh)); - sh += BITS_PER_MP_LIMB; - } - else - { - l += sh; /* may be less bits than k here */ - c = c & ((1<<l) - 1); - } - } - else - c = c >> sh; - c = c & mask; - - /* this while loop implements the sliding window improvement */ - while ((c & (1 << (k - 1))) == 0 && (i > 0 || sh > 0)) - { - if (use_redc) mpz_redc (xx, xx, xx, mod, invm); - else - { - mpz_mul (xx, xx, xx); - mpz_mod (xx, xx, mod); - } - if (sh) - { - sh--; - c = (c<<1) + ((ep[i]>>sh) & 1); - } - else - { - i--; - sh = BITS_PER_MP_LIMB - 1; - c = (c<<1) + (ep[i]>>sh); - } - } - -#ifdef POWM_DEBUG - printf ("l=%u c=%lu\n", l, c); - mpz_mul_2exp (exp, exp, k); - mpz_add_ui (exp, exp, c); -#endif - - /* now replace xx by xx^(2^k)*x^c */ - if (c != 0) - { - j = 0; - while (c % 2 == 0) - { - j++; - c = c >> 1; - } - /* c0 = c * 2^j, i.e. xx^(2^k)*x^c = (A^(2^(k - j))*c)^(2^j) */ - l -= j; - while (l--) - if (use_redc) mpz_redc (xx, xx, xx, mod, invm); - else - { - mpz_mul (xx, xx, xx); - mpz_mod (xx, xx, mod); - } - if (use_redc) - mpz_redc (xx, xx, g[c >> 1], mod, invm); - else - { - mpz_mul (xx, xx, g[c >> 1]); - mpz_mod (xx, xx, mod); - } - } - else - j = l; /* case c=0 */ - while (j--) - { - if (use_redc) - mpz_redc (xx, xx, xx, mod, invm); - else - { - mpz_mul (xx, xx, xx); - mpz_mod (xx, xx, mod); - } - } -#ifdef POWM_DEBUG - printf ("x^"); mpz_out_str (0, 10, exp); - printf ("*2^%u mod m = ", n * BITS_PER_MP_LIMB); mpz_out_str (0, 10, xx); - putchar ('\n'); -#endif - } - - /* now convert back xx to xx/R^n */ - if (use_redc) - { - mpz_set_ui (g[0], 1); - mpz_redc (xx, xx, g[0], mod, invm); - if (mpz_cmp (xx, mod) >= 0) - mpz_sub (xx, xx, mod); - } - mpz_set (res, xx); - - mpz_clear (xx); - for (i = 0; i < K / 2; i++) - mpz_clear (g[i]); - (*_mp_free_func) (g, K / 2 * sizeof (mpz_t)); -} diff --git a/rts/gmp/mpz/powm_ui.c b/rts/gmp/mpz/powm_ui.c deleted file mode 100644 index 00f70bd563..0000000000 --- a/rts/gmp/mpz/powm_ui.c +++ /dev/null @@ -1,248 +0,0 @@ -/* mpz_powm_ui(res,base,exp,mod) -- Set RES to (base**exp) mod MOD. - -Copyright (C) 1991, 1993, 1994, 1996, 1997, 2000 Free Software Foundation, -Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include <stdio.h> /* for NULL */ -#include "gmp.h" -#include "gmp-impl.h" -#include "longlong.h" - -void -#if __STDC__ -mpz_powm_ui (mpz_ptr res, mpz_srcptr base, unsigned long int exp, mpz_srcptr mod) -#else -mpz_powm_ui (res, base, exp, mod) - mpz_ptr res; - mpz_srcptr base; - unsigned long int exp; - mpz_srcptr mod; -#endif -{ - mp_ptr rp, mp, bp; - mp_size_t msize, bsize, rsize; - mp_size_t size; - int mod_shift_cnt; - int negative_result; - mp_limb_t *free_me = NULL; - size_t free_me_size; - TMP_DECL (marker); - - msize = ABS (mod->_mp_size); - size = 2 * msize; - - rp = res->_mp_d; - - if (msize == 0) - DIVIDE_BY_ZERO; - - if (exp == 0) - { - /* Exponent is zero, result is 1 mod MOD, i.e., 1 or 0 - depending on if MOD equals 1. */ - res->_mp_size = (msize == 1 && (mod->_mp_d)[0] == 1) ? 0 : 1; - rp[0] = 1; - return; - } - - TMP_MARK (marker); - - /* Normalize MOD (i.e. make its most significant bit set) as required by - mpn_divmod. This will make the intermediate values in the calculation - slightly larger, but the correct result is obtained after a final - reduction using the original MOD value. */ - - mp = (mp_ptr) TMP_ALLOC (msize * BYTES_PER_MP_LIMB); - count_leading_zeros (mod_shift_cnt, mod->_mp_d[msize - 1]); - if (mod_shift_cnt != 0) - mpn_lshift (mp, mod->_mp_d, msize, mod_shift_cnt); - else - MPN_COPY (mp, mod->_mp_d, msize); - - bsize = ABS (base->_mp_size); - if (bsize > msize) - { - /* The base is larger than the module. Reduce it. */ - - /* Allocate (BSIZE + 1) with space for remainder and quotient. - (The quotient is (bsize - msize + 1) limbs.) */ - bp = (mp_ptr) TMP_ALLOC ((bsize + 1) * BYTES_PER_MP_LIMB); - MPN_COPY (bp, base->_mp_d, bsize); - /* We don't care about the quotient, store it above the remainder, - at BP + MSIZE. */ - mpn_divmod (bp + msize, bp, bsize, mp, msize); - bsize = msize; - /* Canonicalize the base, since we are going to multiply with it - quite a few times. */ - MPN_NORMALIZE (bp, bsize); - } - else - bp = base->_mp_d; - - if (bsize == 0) - { - res->_mp_size = 0; - TMP_FREE (marker); - return; - } - - if (res->_mp_alloc < size) - { - /* We have to allocate more space for RES. If any of the input - parameters are identical to RES, defer deallocation of the old - space. */ - - if (rp == mp || rp == bp) - { - free_me = rp; - free_me_size = res->_mp_alloc; - } - else - (*_mp_free_func) (rp, res->_mp_alloc * BYTES_PER_MP_LIMB); - - rp = (mp_ptr) (*_mp_allocate_func) (size * BYTES_PER_MP_LIMB); - res->_mp_alloc = size; - res->_mp_d = rp; - } - else - { - /* Make BASE, EXP and MOD not overlap with RES. */ - if (rp == bp) - { - /* RES and BASE are identical. Allocate temp. space for BASE. */ - bp = (mp_ptr) TMP_ALLOC (bsize * BYTES_PER_MP_LIMB); - MPN_COPY (bp, rp, bsize); - } - if (rp == mp) - { - /* RES and MOD are identical. Allocate temporary space for MOD. */ - mp = (mp_ptr) TMP_ALLOC (msize * BYTES_PER_MP_LIMB); - MPN_COPY (mp, rp, msize); - } - } - - MPN_COPY (rp, bp, bsize); - rsize = bsize; - - { - mp_ptr xp = (mp_ptr) TMP_ALLOC (2 * (msize + 1) * BYTES_PER_MP_LIMB); - int c; - mp_limb_t e; - mp_limb_t carry_limb; - - negative_result = (exp & 1) && base->_mp_size < 0; - - e = exp; - count_leading_zeros (c, e); - e = (e << c) << 1; /* shift the exp bits to the left, lose msb */ - c = BITS_PER_MP_LIMB - 1 - c; - - /* Main loop. - - Make the result be pointed to alternately by XP and RP. This - helps us avoid block copying, which would otherwise be necessary - with the overlap restrictions of mpn_divmod. With 50% probability - the result after this loop will be in the area originally pointed - by RP (==RES->_mp_d), and with 50% probability in the area originally - pointed to by XP. */ - - while (c != 0) - { - mp_ptr tp; - mp_size_t xsize; - - mpn_mul_n (xp, rp, rp, rsize); - xsize = 2 * rsize; - xsize -= xp[xsize - 1] == 0; - if (xsize > msize) - { - mpn_divmod (xp + msize, xp, xsize, mp, msize); - xsize = msize; - } - - tp = rp; rp = xp; xp = tp; - rsize = xsize; - - if ((mp_limb_signed_t) e < 0) - { - mpn_mul (xp, rp, rsize, bp, bsize); - xsize = rsize + bsize; - xsize -= xp[xsize - 1] == 0; - if (xsize > msize) - { - mpn_divmod (xp + msize, xp, xsize, mp, msize); - xsize = msize; - } - - tp = rp; rp = xp; xp = tp; - rsize = xsize; - } - e <<= 1; - c--; - } - - /* We shifted MOD, the modulo reduction argument, left MOD_SHIFT_CNT - steps. Adjust the result by reducing it with the original MOD. - - Also make sure the result is put in RES->_mp_d (where it already - might be, see above). */ - - if (mod_shift_cnt != 0) - { - carry_limb = mpn_lshift (res->_mp_d, rp, rsize, mod_shift_cnt); - rp = res->_mp_d; - if (carry_limb != 0) - { - rp[rsize] = carry_limb; - rsize++; - } - } - else - { - MPN_COPY (res->_mp_d, rp, rsize); - rp = res->_mp_d; - } - - if (rsize >= msize) - { - mpn_divmod (rp + msize, rp, rsize, mp, msize); - rsize = msize; - } - - /* Remove any leading zero words from the result. */ - if (mod_shift_cnt != 0) - mpn_rshift (rp, rp, rsize, mod_shift_cnt); - MPN_NORMALIZE (rp, rsize); - } - - if (negative_result && rsize != 0) - { - if (mod_shift_cnt != 0) - mpn_rshift (mp, mp, msize, mod_shift_cnt); - mpn_sub (rp, mp, msize, rp, rsize); - rsize = msize; - MPN_NORMALIZE (rp, rsize); - } - res->_mp_size = rsize; - - if (free_me != NULL) - (*_mp_free_func) (free_me, free_me_size * BYTES_PER_MP_LIMB); - TMP_FREE (marker); -} diff --git a/rts/gmp/mpz/pprime_p.c b/rts/gmp/mpz/pprime_p.c deleted file mode 100644 index 82eb678238..0000000000 --- a/rts/gmp/mpz/pprime_p.c +++ /dev/null @@ -1,242 +0,0 @@ -/* mpz_probab_prime_p -- - An implementation of the probabilistic primality test found in Knuth's - Seminumerical Algorithms book. If the function mpz_probab_prime_p() - returns 0 then n is not prime. If it returns 1, then n is 'probably' - prime. If it returns 2, n is surely prime. The probability of a false - positive is (1/4)**reps, where reps is the number of internal passes of the - probabilistic algorithm. Knuth indicates that 25 passes are reasonable. - -Copyright (C) 1991, 1993, 1994, 1996, 1997, 1998, 1999, 2000 Free Software -Foundation, Inc. Miller-Rabin code contributed by John Amanatides. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" -#include "longlong.h" - -static int isprime _PROTO ((unsigned long int t)); -static int mpz_millerrabin _PROTO ((mpz_srcptr n, int reps)); - -int -#if __STDC__ -mpz_probab_prime_p (mpz_srcptr n, int reps) -#else -mpz_probab_prime_p (n, reps) - mpz_srcptr n; - int reps; -#endif -{ - mp_limb_t r; - - /* Handle small and negative n. */ - if (mpz_cmp_ui (n, 1000000L) <= 0) - { - int is_prime; - if (mpz_sgn (n) < 0) - { - /* Negative number. Negate and call ourselves. */ - mpz_t n2; - mpz_init (n2); - mpz_neg (n2, n); - is_prime = mpz_probab_prime_p (n2, reps); - mpz_clear (n2); - return is_prime; - } - is_prime = isprime (mpz_get_ui (n)); - return is_prime ? 2 : 0; - } - - /* If n is now even, it is not a prime. */ - if ((mpz_get_ui (n) & 1) == 0) - return 0; - - /* Check if n has small factors. */ - if (UDIV_TIME > (2 * UMUL_TIME + 6)) - r = mpn_preinv_mod_1 (PTR(n), SIZ(n), (mp_limb_t) PP, (mp_limb_t) PP_INVERTED); - else - r = mpn_mod_1 (PTR(n), SIZ(n), (mp_limb_t) PP); - if (r % 3 == 0 || r % 5 == 0 || r % 7 == 0 || r % 11 == 0 || r % 13 == 0 - || r % 17 == 0 || r % 19 == 0 || r % 23 == 0 || r % 29 == 0 -#if BITS_PER_MP_LIMB == 64 - || r % 31 == 0 || r % 37 == 0 || r % 41 == 0 || r % 43 == 0 - || r % 47 == 0 || r % 53 == 0 -#endif - ) - { - return 0; - } - - /* Do more dividing. We collect small primes, using umul_ppmm, until we - overflow a single limb. We divide our number by the small primes product, - and look for factors in the remainder. */ - { - unsigned long int ln2; - unsigned long int q; - mp_limb_t p1, p0, p; - unsigned int primes[15]; - int nprimes; - - nprimes = 0; - p = 1; - ln2 = mpz_sizeinbase (n, 2) / 30; ln2 = ln2 * ln2; - for (q = BITS_PER_MP_LIMB == 64 ? 59 : 31; q < ln2; q += 2) - { - if (isprime (q)) - { - umul_ppmm (p1, p0, p, q); - if (p1 != 0) - { - r = mpn_mod_1 (PTR(n), SIZ(n), p); - while (--nprimes >= 0) - if (r % primes[nprimes] == 0) - { - if (mpn_mod_1 (PTR(n), SIZ(n), (mp_limb_t) primes[nprimes]) != 0) - abort (); - return 0; - } - p = q; - nprimes = 0; - } - else - { - p = p0; - } - primes[nprimes++] = q; - } - } - } - - /* Perform a number of Miller-Rabin tests. */ - return mpz_millerrabin (n, reps); -} - -static int -#if __STDC__ -isprime (unsigned long int t) -#else -isprime (t) - unsigned long int t; -#endif -{ - unsigned long int q, r, d; - - if (t < 3 || (t & 1) == 0) - return t == 2; - - for (d = 3, r = 1; r != 0; d += 2) - { - q = t / d; - r = t - q * d; - if (q < d) - return 1; - } - return 0; -} - -static int millerrabin _PROTO ((mpz_srcptr n, mpz_srcptr nm1, - mpz_ptr x, mpz_ptr y, - mpz_srcptr q, unsigned long int k)); - -static int -#if __STDC__ -mpz_millerrabin (mpz_srcptr n, int reps) -#else -mpz_millerrabin (n, reps) - mpz_srcptr n; - int reps; -#endif -{ - int r; - mpz_t nm1, x, y, q; - unsigned long int k; - gmp_randstate_t rstate; - int is_prime; - TMP_DECL (marker); - TMP_MARK (marker); - - MPZ_TMP_INIT (nm1, SIZ (n) + 1); - mpz_sub_ui (nm1, n, 1L); - - MPZ_TMP_INIT (x, SIZ (n)); - MPZ_TMP_INIT (y, 2 * SIZ (n)); /* mpz_powm_ui needs excessive memory!!! */ - - /* Perform a Fermat test. */ - mpz_set_ui (x, 210L); - mpz_powm (y, x, nm1, n); - if (mpz_cmp_ui (y, 1L) != 0) - { - TMP_FREE (marker); - return 0; - } - - MPZ_TMP_INIT (q, SIZ (n)); - - /* Find q and k, where q is odd and n = 1 + 2**k * q. */ - k = mpz_scan1 (nm1, 0L); - mpz_tdiv_q_2exp (q, nm1, k); - - gmp_randinit (rstate, GMP_RAND_ALG_DEFAULT, 32L); - - is_prime = 1; - for (r = 0; r < reps && is_prime; r++) - { - do - mpz_urandomb (x, rstate, mpz_sizeinbase (n, 2) - 1); - while (mpz_cmp_ui (x, 1L) <= 0); - - is_prime = millerrabin (n, nm1, x, y, q, k); - } - - gmp_randclear (rstate); - - TMP_FREE (marker); - return is_prime; -} - -static int -#if __STDC__ -millerrabin (mpz_srcptr n, mpz_srcptr nm1, mpz_ptr x, mpz_ptr y, - mpz_srcptr q, unsigned long int k) -#else -millerrabin (n, nm1, x, y, q, k) - mpz_srcptr n; - mpz_srcptr nm1; - mpz_ptr x; - mpz_ptr y; - mpz_srcptr q; - unsigned long int k; -#endif -{ - unsigned long int i; - - mpz_powm (y, x, q, n); - - if (mpz_cmp_ui (y, 1L) == 0 || mpz_cmp (y, nm1) == 0) - return 1; - - for (i = 1; i < k; i++) - { - mpz_powm_ui (y, y, 2L, n); - if (mpz_cmp (y, nm1) == 0) - return 1; - if (mpz_cmp_ui (y, 1L) == 0) - return 0; - } - return 0; -} diff --git a/rts/gmp/mpz/random.c b/rts/gmp/mpz/random.c deleted file mode 100644 index 60d9113991..0000000000 --- a/rts/gmp/mpz/random.c +++ /dev/null @@ -1,56 +0,0 @@ -/* mpz_random -- Generate a random mpz_t of specified size. - This function is non-portable and generates poor random numbers. - -Copyright (C) 1991, 1993, 1994, 1995 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" -#include "urandom.h" - -void -#if __STDC__ -mpz_random (mpz_ptr x, mp_size_t size) -#else -mpz_random (x, size) - mpz_ptr x; - mp_size_t size; -#endif -{ - mp_size_t i; - mp_limb_t ran; - mp_ptr xp; - mp_size_t abs_size; - - abs_size = ABS (size); - - if (x->_mp_alloc < abs_size) - _mpz_realloc (x, abs_size); - - xp = x->_mp_d; - - for (i = 0; i < abs_size; i++) - { - ran = urandom (); - xp[i] = ran; - } - - MPN_NORMALIZE (xp, abs_size); - x->_mp_size = size < 0 ? -abs_size : abs_size; -} diff --git a/rts/gmp/mpz/random2.c b/rts/gmp/mpz/random2.c deleted file mode 100644 index a90af115e9..0000000000 --- a/rts/gmp/mpz/random2.c +++ /dev/null @@ -1,48 +0,0 @@ -/* mpz_random2 -- Generate a positive random mpz_t of specified size, with - long runs of consecutive ones and zeros in the binary representation. - Meant for testing of other MP routines. - -Copyright (C) 1991, 1993, 1994, 1996 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -void -#if __STDC__ -mpz_random2 (mpz_ptr x, mp_size_t size) -#else -mpz_random2 (x, size) - mpz_ptr x; - mp_size_t size; -#endif -{ - mp_size_t abs_size; - - abs_size = ABS (size); - if (abs_size != 0) - { - if (x->_mp_alloc < abs_size) - _mpz_realloc (x, abs_size); - - mpn_random2 (x->_mp_d, abs_size); - } - - x->_mp_size = size; -} diff --git a/rts/gmp/mpz/realloc.c b/rts/gmp/mpz/realloc.c deleted file mode 100644 index 0b9e447ec3..0000000000 --- a/rts/gmp/mpz/realloc.c +++ /dev/null @@ -1,52 +0,0 @@ -/* _mpz_realloc -- make the mpz_t have NEW_SIZE digits allocated. - -Copyright (C) 1991, 1993, 1994, 1995 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -void * -#if __STDC__ -_mpz_realloc (mpz_ptr m, mp_size_t new_size) -#else -_mpz_realloc (m, new_size) - mpz_ptr m; - mp_size_t new_size; -#endif -{ - /* Never allocate zero space. */ - if (new_size == 0) - new_size = 1; - - m->_mp_d = (mp_ptr) (*_mp_reallocate_func) (m->_mp_d, - m->_mp_alloc * BYTES_PER_MP_LIMB, - new_size * BYTES_PER_MP_LIMB); - m->_mp_alloc = new_size; - -#if 0 - /* This might break some code that reads the size field after - reallocation, in the case the reallocated destination and a - source argument are identical. */ - if (ABS (m->_mp_size) > new_size) - m->_mp_size = 0; -#endif - - return (void *) m->_mp_d; -} diff --git a/rts/gmp/mpz/remove.c b/rts/gmp/mpz/remove.c deleted file mode 100644 index bc6675f972..0000000000 --- a/rts/gmp/mpz/remove.c +++ /dev/null @@ -1,93 +0,0 @@ -/* mpz_remove -- divide out a factor and return its multiplicity. - -Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -unsigned long int -#if __STDC__ -mpz_remove (mpz_ptr dest, mpz_srcptr src, mpz_srcptr f) -#else -mpz_remove (dest, src, f) - mpz_ptr dest; - mpz_srcptr src; - mpz_srcptr f; -#endif -{ - mpz_t fpow[40]; /* inexhaustible...until year 2020 or so */ - mpz_t x, rem; - unsigned long int pwr; - int p; - - if (mpz_cmp_ui (f, 1) <= 0 || mpz_sgn (src) == 0) - DIVIDE_BY_ZERO; - if (mpz_cmp_ui (f, 2) == 0) - { - unsigned long int s0; - s0 = mpz_scan1 (src, 0); - mpz_div_2exp (dest, src, s0); - return s0; - } - - /* We could perhaps compute mpz_scan1(src,0)/mpz_scan1(f,0). It is an - upper bound of the result we're seeking. We could also shift down the - operands so that they become odd, to make intermediate values smaller. */ - - mpz_init (rem); - mpz_init (x); - - pwr = 0; - mpz_init (fpow[0]); - mpz_set (fpow[0], f); - mpz_set (dest, src); - - /* Divide by f, f^2, ..., f^(2^k) until we get a remainder for f^(2^k). */ - for (p = 0;; p++) - { - mpz_tdiv_qr (x, rem, dest, fpow[p]); - if (SIZ (rem) != 0) - break; - mpz_init (fpow[p + 1]); - mpz_mul (fpow[p + 1], fpow[p], fpow[p]); - mpz_set (dest, x); - } - - pwr = (1 << p) - 1; - - mpz_clear (fpow[p]); - - /* Divide by f^(2^(k-1)), f^(2^(k-2)), ..., f for all divisors that give a - zero remainder. */ - while (--p >= 0) - { - mpz_tdiv_qr (x, rem, dest, fpow[p]); - if (SIZ (rem) == 0) - { - pwr += 1 << p; - mpz_set (dest, x); - } - mpz_clear (fpow[p]); - } - - mpz_clear (x); - mpz_clear (rem); - return pwr; -} diff --git a/rts/gmp/mpz/root.c b/rts/gmp/mpz/root.c deleted file mode 100644 index 0920bf22d3..0000000000 --- a/rts/gmp/mpz/root.c +++ /dev/null @@ -1,183 +0,0 @@ -/* mpz_root(root, u, nth) -- Set ROOT to floor(U^(1/nth)). - Return an indication if the result is exact. - -Copyright (C) 1999, 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -/* Naive implementation of nth root extraction. It would probably be a - better idea to use a division-free Newton iteration. It is insane - to use full precision from iteration 1. The mpz_scan1 trick compensates - to some extent. It would be natural to avoid representing the low zero - bits mpz_scan1 is counting, and at the same time call mpn directly. */ - -#include <stdio.h> /* for NULL */ -#include "gmp.h" -#include "gmp-impl.h" -#include "longlong.h" - -int -#if __STDC__ -mpz_root (mpz_ptr r, mpz_srcptr c, unsigned long int nth) -#else -mpz_root (r, c, nth) - mpz_ptr r; - mpz_srcptr c; - unsigned long int nth; -#endif -{ - mpz_t x, t0, t1, t2; - __mpz_struct ccs, *cc = &ccs; - unsigned long int nbits; - int bit; - int exact; - int i; - unsigned long int lowz; - unsigned long int rl; - - /* even roots of negatives provoke an exception */ - if (mpz_sgn (c) < 0 && (nth & 1) == 0) - SQRT_OF_NEGATIVE; - - /* root extraction interpreted as c^(1/nth) means a zeroth root should - provoke a divide by zero, do this even if c==0 */ - if (nth == 0) - DIVIDE_BY_ZERO; - - if (mpz_sgn (c) == 0) - { - if (r != NULL) - mpz_set_ui (r, 0); - return 1; /* exact result */ - } - - PTR(cc) = PTR(c); - SIZ(cc) = ABSIZ(c); - - nbits = (mpz_sizeinbase (cc, 2) - 1) / nth; - if (nbits == 0) - { - if (r != NULL) - mpz_set_ui (r, 1); - if (mpz_sgn (c) < 0) - { - if (r != NULL) - SIZ(r) = -SIZ(r); - return mpz_cmp_si (c, -1L) == 0; - } - return mpz_cmp_ui (c, 1L) == 0; - } - - mpz_init (x); - mpz_init (t0); - mpz_init (t1); - mpz_init (t2); - - /* Create a one-bit approximation. */ - mpz_set_ui (x, 0); - mpz_setbit (x, nbits); - - /* Make the approximation better, one bit at a time. This odd-looking - termination criteria makes large nth get better initial approximation, - which avoids slow convergence for such values. */ - bit = nbits - 1; - for (i = 1; (nth >> i) != 0; i++) - { - mpz_setbit (x, bit); - mpz_tdiv_q_2exp (t0, x, bit); - mpz_pow_ui (t1, t0, nth); - mpz_mul_2exp (t1, t1, bit * nth); - if (mpz_cmp (cc, t1) < 0) - mpz_clrbit (x, bit); - - bit--; /* check/set next bit */ - if (bit < 0) - { - /* We're done. */ - mpz_pow_ui (t1, x, nth); - goto done; - } - } - mpz_setbit (x, bit); - mpz_set_ui (t2, 0); mpz_setbit (t2, bit); mpz_add (x, x, t2); - -#if DEBUG - /* Check that the starting approximation is >= than the root. */ - mpz_pow_ui (t1, x, nth); - if (mpz_cmp (cc, t1) >= 0) - abort (); -#endif - - mpz_add_ui (x, x, 1); - - /* Main loop */ - do - { - lowz = mpz_scan1 (x, 0); - mpz_tdiv_q_2exp (t0, x, lowz); - mpz_pow_ui (t1, t0, nth - 1); - mpz_mul_2exp (t1, t1, lowz * (nth - 1)); - mpz_tdiv_q (t2, cc, t1); - mpz_sub (t2, x, t2); - rl = mpz_tdiv_q_ui (t2, t2, nth); - mpz_sub (x, x, t2); - } - while (mpz_sgn (t2) != 0); - - /* If we got a non-zero remainder in the last division, we know our root - is too large. */ - mpz_sub_ui (x, x, (mp_limb_t) (rl != 0)); - - /* Adjustment loop. If we spend more care on rounding in the loop above, - we could probably get rid of this, or greatly simplify it. */ - { - int bad = 0; - lowz = mpz_scan1 (x, 0); - mpz_tdiv_q_2exp (t0, x, lowz); - mpz_pow_ui (t1, t0, nth); - mpz_mul_2exp (t1, t1, lowz * nth); - while (mpz_cmp (cc, t1) < 0) - { - bad++; - if (bad > 2) - abort (); /* abort if our root is far off */ - mpz_sub_ui (x, x, 1); - lowz = mpz_scan1 (x, 0); - mpz_tdiv_q_2exp (t0, x, lowz); - mpz_pow_ui (t1, t0, nth); - mpz_mul_2exp (t1, t1, lowz * nth); - } - } - - done: - exact = mpz_cmp (t1, cc) == 0; - - if (r != NULL) - { - mpz_set (r, x); - if (mpz_sgn (c) < 0) - SIZ(r) = -SIZ(r); - } - - mpz_clear (t2); - mpz_clear (t1); - mpz_clear (t0); - mpz_clear (x); - - return exact; -} diff --git a/rts/gmp/mpz/rrandomb.c b/rts/gmp/mpz/rrandomb.c deleted file mode 100644 index 7d78243674..0000000000 --- a/rts/gmp/mpz/rrandomb.c +++ /dev/null @@ -1,117 +0,0 @@ -/* mpz_rrandomb -- Generate a positive random mpz_t of specified bit size, with - long runs of consecutive ones and zeros in the binary representation. - Meant for testing of other MP routines. - -Copyright (C) 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -static void gmp_rrandomb _PROTO ((mp_ptr rp, gmp_randstate_t rstate, unsigned long int nbits)); - -void -#if __STDC__ -mpz_rrandomb (mpz_ptr x, gmp_randstate_t rstate, unsigned long int nbits) -#else -mpz_rrandomb (x, rstate, nbits) - mpz_ptr x; - gmp_randstate_t rstate; - unsigned long int nbits; -#endif -{ - mp_size_t nl = 0; - - if (nbits != 0) - { - mp_ptr xp; - nl = (nbits + BITS_PER_MP_LIMB - 1) / BITS_PER_MP_LIMB; - if (x->_mp_alloc < nl) - _mpz_realloc (x, nl); - - xp = PTR(x); - gmp_rrandomb (xp, rstate, nbits); - MPN_NORMALIZE (xp, nl); - } - - SIZ(x) = nl; -} - -#define BITS_PER_CHUNK 4 - -static void -#if __STDC__ -gmp_rrandomb (mp_ptr rp, gmp_randstate_t rstate, unsigned long int nbits) -#else -gmp_rrandomb (rp, rstate, nbits) - mp_ptr rp; - gmp_randstate_t rstate; - unsigned long int nbits; -#endif -{ - int nb; - int bit_pos; - mp_size_t limb_pos; - mp_limb_t ran, ranm; - mp_limb_t acc; - mp_size_t n; - - bit_pos = nbits % BITS_PER_MP_LIMB; - limb_pos = nbits / BITS_PER_MP_LIMB; - if (bit_pos == 0) - { - bit_pos = BITS_PER_MP_LIMB; - limb_pos--; - } - - acc = 0; - while (limb_pos >= 0) - { - _gmp_rand (&ranm, rstate, BITS_PER_CHUNK + 1); - ran = ranm; - nb = (ran >> 1) + 1; - if ((ran & 1) != 0) - { - /* Generate a string of ones. */ - if (nb > bit_pos) - { - rp[limb_pos--] = acc | ((((mp_limb_t) 1) << bit_pos) - 1); - bit_pos += BITS_PER_MP_LIMB; - bit_pos -= nb; - acc = (~(mp_limb_t) 0) << bit_pos; - } - else - { - bit_pos -= nb; - acc |= ((((mp_limb_t) 1) << nb) - 1) << bit_pos; - } - } - else - { - /* Generate a string of zeroes. */ - if (nb > bit_pos) - { - rp[limb_pos--] = acc; - acc = 0; - bit_pos += BITS_PER_MP_LIMB; - } - bit_pos -= nb; - } - } -} diff --git a/rts/gmp/mpz/scan0.c b/rts/gmp/mpz/scan0.c deleted file mode 100644 index 6c59cf8939..0000000000 --- a/rts/gmp/mpz/scan0.c +++ /dev/null @@ -1,35 +0,0 @@ -/* mpz_scan0(op, startbit) -- Scan for the next set bit, starting at startbit. - -Copyright (C) 1996 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -unsigned long int -#if __STDC__ -mpz_scan0 (mpz_srcptr u, unsigned long int starting_bit) -#else -mpz_scan0 (u, starting_bit) - mpz_srcptr u; - unsigned long int starting_bit; -#endif -{ - return mpn_scan0 (u->_mp_d, starting_bit); -} diff --git a/rts/gmp/mpz/scan1.c b/rts/gmp/mpz/scan1.c deleted file mode 100644 index 3b84e3420c..0000000000 --- a/rts/gmp/mpz/scan1.c +++ /dev/null @@ -1,35 +0,0 @@ -/* mpz_scan1(op, startbit) -- Scan for the next set bit, starting at startbit. - -Copyright (C) 1996 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -unsigned long int -#if __STDC__ -mpz_scan1 (mpz_srcptr u, unsigned long int starting_bit) -#else -mpz_scan1 (u, starting_bit) - mpz_srcptr u; - unsigned long int starting_bit; -#endif -{ - return mpn_scan1 (u->_mp_d, starting_bit); -} diff --git a/rts/gmp/mpz/set.c b/rts/gmp/mpz/set.c deleted file mode 100644 index 06b2eef511..0000000000 --- a/rts/gmp/mpz/set.c +++ /dev/null @@ -1,48 +0,0 @@ -/* mpz_set (dest_integer, src_integer) -- Assign DEST_INTEGER from SRC_INTEGER. - -Copyright (C) 1991, 1993, 1994, 1995 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -void -#if __STDC__ -mpz_set (mpz_ptr w, mpz_srcptr u) -#else -mpz_set (w, u) - mpz_ptr w; - mpz_srcptr u; -#endif -{ - mp_ptr wp, up; - mp_size_t usize, size; - - usize = u->_mp_size; - size = ABS (usize); - - if (w->_mp_alloc < size) - _mpz_realloc (w, size); - - wp = w->_mp_d; - up = u->_mp_d; - - MPN_COPY (wp, up, size); - w->_mp_size = usize; -} diff --git a/rts/gmp/mpz/set_d.c b/rts/gmp/mpz/set_d.c deleted file mode 100644 index e90ed9bc2f..0000000000 --- a/rts/gmp/mpz/set_d.c +++ /dev/null @@ -1,96 +0,0 @@ -/* mpz_set_d(integer, val) -- Assign INTEGER with a double value VAL. - -Copyright (C) 1995, 1996, 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -void -#if __STDC__ -mpz_set_d (mpz_ptr r, double d) -#else -mpz_set_d (r, d) - mpz_ptr r; - double d; -#endif -{ - int negative; - mp_limb_t tp[3]; - mp_ptr rp; - mp_size_t rn; - - negative = d < 0; - d = ABS (d); - - /* Handle small arguments quickly. */ - if (d < MP_BASE_AS_DOUBLE) - { - mp_limb_t tmp; - tmp = d; - PTR(r)[0] = tmp; - SIZ(r) = negative ? -(tmp != 0) : (tmp != 0); - return; - } - - rn = __gmp_extract_double (tp, d); - - if (ALLOC(r) < rn) - _mpz_realloc (r, rn); - - rp = PTR (r); - -#if BITS_PER_MP_LIMB == 32 - switch (rn) - { - default: - MPN_ZERO (rp, rn - 3); - rp += rn - 3; - /* fall through */ - case 3: - rp[2] = tp[2]; - rp[1] = tp[1]; - rp[0] = tp[0]; - break; - case 2: - rp[1] = tp[2]; - rp[0] = tp[1]; - break; - case 1: - /* handled in "small aguments" case above */ - abort (); - } -#else - switch (rn) - { - default: - MPN_ZERO (rp, rn - 2); - rp += rn - 2; - /* fall through */ - case 2: - rp[1] = tp[1], rp[0] = tp[0]; - break; - case 1: - /* handled in "small aguments" case above */ - abort (); - } -#endif - - SIZ(r) = negative ? -rn : rn; -} diff --git a/rts/gmp/mpz/set_f.c b/rts/gmp/mpz/set_f.c deleted file mode 100644 index 2273953dfd..0000000000 --- a/rts/gmp/mpz/set_f.c +++ /dev/null @@ -1,64 +0,0 @@ -/* mpz_set_f (dest_integer, src_float) -- Assign DEST_INTEGER from SRC_FLOAT. - -Copyright (C) 1996 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -void -#if __STDC__ -mpz_set_f (mpz_ptr w, mpf_srcptr u) -#else -mpz_set_f (w, u) - mpz_ptr w; - mpf_srcptr u; -#endif -{ - mp_ptr wp, up; - mp_size_t usize, size; - mp_exp_t exp; - - usize = SIZ (u); - size = ABS (usize); - exp = EXP (u); - - if (w->_mp_alloc < exp) - _mpz_realloc (w, exp); - - wp = w->_mp_d; - up = u->_mp_d; - - if (exp <= 0) - { - SIZ (w) = 0; - return; - } - if (exp < size) - { - MPN_COPY (wp, up + size - exp, exp); - } - else - { - MPN_ZERO (wp, exp - size); - MPN_COPY (wp + exp - size, up, size); - } - - w->_mp_size = usize >= 0 ? exp : -exp; -} diff --git a/rts/gmp/mpz/set_q.c b/rts/gmp/mpz/set_q.c deleted file mode 100644 index 72d3222a80..0000000000 --- a/rts/gmp/mpz/set_q.c +++ /dev/null @@ -1,36 +0,0 @@ -/* mpz_set_q (dest_integer, src_rational) -- Assign DEST_INTEGER from - SRC_rational. - -Copyright (C) 1996 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -void -#if __STDC__ -mpz_set_q (mpz_ptr w, mpq_srcptr u) -#else -mpz_set_q (w, u) - mpz_ptr w; - mpq_srcptr u; -#endif -{ - mpz_tdiv_q (w, mpq_numref (u), mpq_denref (u)); -} diff --git a/rts/gmp/mpz/set_si.c b/rts/gmp/mpz/set_si.c deleted file mode 100644 index 9ba2fbaf30..0000000000 --- a/rts/gmp/mpz/set_si.c +++ /dev/null @@ -1,48 +0,0 @@ -/* mpz_set_si(integer, val) -- Assign INTEGER with a small value VAL. - -Copyright (C) 1991, 1993, 1994, 1995, 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -void -#if __STDC__ -mpz_set_si (mpz_ptr dest, signed long int val) -#else -mpz_set_si (dest, val) - mpz_ptr dest; - signed long int val; -#endif -{ - /* We don't check if the allocation is enough, since the rest of the - package ensures it's at least 1, which is what we need here. */ - if (val > 0) - { - dest->_mp_d[0] = val; - dest->_mp_size = 1; - } - else if (val < 0) - { - dest->_mp_d[0] = (unsigned long) -val; - dest->_mp_size = -1; - } - else - dest->_mp_size = 0; -} diff --git a/rts/gmp/mpz/set_str.c b/rts/gmp/mpz/set_str.c deleted file mode 100644 index 3ab79c0e89..0000000000 --- a/rts/gmp/mpz/set_str.c +++ /dev/null @@ -1,157 +0,0 @@ -/* mpz_set_str(mp_dest, string, base) -- Convert the \0-terminated - string STRING in base BASE to multiple precision integer in - MP_DEST. Allow white space in the string. If BASE == 0 determine - the base in the C standard way, i.e. 0xhh...h means base 16, - 0oo...o means base 8, otherwise assume base 10. - -Copyright (C) 1991, 1993, 1994, 1996, 1997, 1998, 2000 Free Software -Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include <string.h> -#include <ctype.h> -#include "gmp.h" -#include "gmp-impl.h" -#include "longlong.h" - -static int -#if __STDC__ -digit_value_in_base (int c, int base) -#else -digit_value_in_base (c, base) - int c; - int base; -#endif -{ - int digit; - - if (isdigit (c)) - digit = c - '0'; - else if (islower (c)) - digit = c - 'a' + 10; - else if (isupper (c)) - digit = c - 'A' + 10; - else - return -1; - - if (digit < base) - return digit; - return -1; -} - -int -#if __STDC__ -mpz_set_str (mpz_ptr x, const char *str, int base) -#else -mpz_set_str (x, str, base) - mpz_ptr x; - const char *str; - int base; -#endif -{ - size_t str_size; - char *s, *begs; - size_t i; - mp_size_t xsize; - int c; - int negative; - TMP_DECL (marker); - - /* Skip whitespace. */ - do - c = *str++; - while (isspace (c)); - - negative = 0; - if (c == '-') - { - negative = 1; - c = *str++; - } - - if (digit_value_in_base (c, base == 0 ? 10 : base) < 0) - return -1; /* error if no digits */ - - /* If BASE is 0, try to find out the base by looking at the initial - characters. */ - if (base == 0) - { - base = 10; - if (c == '0') - { - base = 8; - c = *str++; - if (c == 'x' || c == 'X') - { - base = 16; - c = *str++; - } - else if (c == 'b' || c == 'B') - { - base = 2; - c = *str++; - } - } - } - - /* Skip leading zeros. */ - while (c == '0') - c = *str++; - /* Make sure the string does not become empty, mpn_set_str would fail. */ - if (c == 0) - { - x->_mp_size = 0; - return 0; - } - - TMP_MARK (marker); - str_size = strlen (str - 1); - s = begs = (char *) TMP_ALLOC (str_size + 1); - - /* Remove spaces from the string and convert the result from ASCII to a - byte array. */ - for (i = 0; i < str_size; i++) - { - if (!isspace (c)) - { - int dig = digit_value_in_base (c, base); - if (dig < 0) - { - TMP_FREE (marker); - return -1; - } - *s++ = dig; - } - c = *str++; - } - - str_size = s - begs; - - xsize = (((mp_size_t) (str_size / __mp_bases[base].chars_per_bit_exactly)) - / BITS_PER_MP_LIMB + 2); - if (x->_mp_alloc < xsize) - _mpz_realloc (x, xsize); - - /* Convert the byte array in base BASE to our bignum format. */ - xsize = mpn_set_str (x->_mp_d, (unsigned char *) begs, str_size, base); - x->_mp_size = negative ? -xsize : xsize; - - TMP_FREE (marker); - return 0; -} diff --git a/rts/gmp/mpz/set_ui.c b/rts/gmp/mpz/set_ui.c deleted file mode 100644 index d6097c170a..0000000000 --- a/rts/gmp/mpz/set_ui.c +++ /dev/null @@ -1,43 +0,0 @@ -/* mpz_set_ui(integer, val) -- Assign INTEGER with a small value VAL. - -Copyright (C) 1991, 1993, 1994, 1995 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -void -#if __STDC__ -mpz_set_ui (mpz_ptr dest, unsigned long int val) -#else -mpz_set_ui (dest, val) - mpz_ptr dest; - unsigned long int val; -#endif -{ - /* We don't check if the allocation is enough, since the rest of the - package ensures it's at least 1, which is what we need here. */ - if (val > 0) - { - dest->_mp_d[0] = val; - dest->_mp_size = 1; - } - else - dest->_mp_size = 0; -} diff --git a/rts/gmp/mpz/setbit.c b/rts/gmp/mpz/setbit.c deleted file mode 100644 index d4249a434e..0000000000 --- a/rts/gmp/mpz/setbit.c +++ /dev/null @@ -1,119 +0,0 @@ -/* mpz_setbit -- set a specified bit. - -Copyright (C) 1991, 1993, 1994, 1995, 1997, 1999 Free Software Foundation, -Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -void -#if __STDC__ -mpz_setbit (mpz_ptr d, unsigned long int bit_index) -#else -mpz_setbit (d, bit_index) - mpz_ptr d; - unsigned long int bit_index; -#endif -{ - mp_size_t dsize = d->_mp_size; - mp_ptr dp = d->_mp_d; - mp_size_t limb_index; - - limb_index = bit_index / BITS_PER_MP_LIMB; - if (dsize >= 0) - { - if (limb_index < dsize) - { - dp[limb_index] |= (mp_limb_t) 1 << (bit_index % BITS_PER_MP_LIMB); - d->_mp_size = dsize; - } - else - { - /* Ugh. The bit should be set outside of the end of the - number. We have to increase the size of the number. */ - if (d->_mp_alloc < limb_index + 1) - { - _mpz_realloc (d, limb_index + 1); - dp = d->_mp_d; - } - MPN_ZERO (dp + dsize, limb_index - dsize); - dp[limb_index] = (mp_limb_t) 1 << (bit_index % BITS_PER_MP_LIMB); - d->_mp_size = limb_index + 1; - } - } - else - { - mp_size_t zero_bound; - - /* Simulate two's complement arithmetic, i.e. simulate - 1. Set OP = ~(OP - 1) [with infinitely many leading ones]. - 2. Set the bit. - 3. Set OP = ~OP + 1. */ - - dsize = -dsize; - - /* No upper bound on this loop, we're sure there's a non-zero limb - sooner ot later. */ - for (zero_bound = 0; ; zero_bound++) - if (dp[zero_bound] != 0) - break; - - if (limb_index > zero_bound) - { - if (limb_index < dsize) - dp[limb_index] &= ~((mp_limb_t) 1 << (bit_index % BITS_PER_MP_LIMB)); - else - ; - } - else if (limb_index == zero_bound) - { - dp[limb_index] = ((dp[limb_index] - 1) - & ~((mp_limb_t) 1 << (bit_index % BITS_PER_MP_LIMB))) + 1; - if (dp[limb_index] == 0) - { - mp_size_t i; - for (i = limb_index + 1; i < dsize; i++) - { - dp[i] += 1; - if (dp[i] != 0) - goto fin; - } - /* We got carry all way out beyond the end of D. Increase - its size (and allocation if necessary). */ - dsize++; - if (d->_mp_alloc < dsize) - { - _mpz_realloc (d, dsize); - dp = d->_mp_d; - } - dp[i] = 1; - d->_mp_size = -dsize; - fin:; - } - } - else - { - mpn_decr_u (dp + limb_index, - (mp_limb_t) 1 << (bit_index % BITS_PER_MP_LIMB)); - dsize -= dp[dsize - 1] == 0; - d->_mp_size = -dsize; - } - } -} diff --git a/rts/gmp/mpz/size.c b/rts/gmp/mpz/size.c deleted file mode 100644 index 6574756783..0000000000 --- a/rts/gmp/mpz/size.c +++ /dev/null @@ -1,35 +0,0 @@ -/* mpz_size(x) -- return the number of lims currently used by the - value of integer X. - -Copyright (C) 1991, 1993, 1994, 1995 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -size_t -#if __STDC__ -mpz_size (mpz_srcptr x) -#else -mpz_size (x) - mpz_srcptr x; -#endif -{ - return ABS (x->_mp_size); -} diff --git a/rts/gmp/mpz/sizeinbase.c b/rts/gmp/mpz/sizeinbase.c deleted file mode 100644 index 734f9c4532..0000000000 --- a/rts/gmp/mpz/sizeinbase.c +++ /dev/null @@ -1,60 +0,0 @@ -/* mpz_sizeinbase(x, base) -- return an approximation to the number of - character the integer X would have printed in base BASE. The - approximation is never too small. - -Copyright (C) 1991, 1993, 1994, 1995 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" -#include "longlong.h" - -size_t -#if __STDC__ -mpz_sizeinbase (mpz_srcptr x, int base) -#else -mpz_sizeinbase (x, base) - mpz_srcptr x; - int base; -#endif -{ - mp_size_t size = ABS (x->_mp_size); - int lb_base, cnt; - size_t totbits; - - /* Special case for X == 0. */ - if (size == 0) - return 1; - - /* Calculate the total number of significant bits of X. */ - count_leading_zeros (cnt, x->_mp_d[size - 1]); - totbits = size * BITS_PER_MP_LIMB - cnt; - - if ((base & (base - 1)) == 0) - { - /* Special case for powers of 2, giving exact result. */ - - count_leading_zeros (lb_base, base); - lb_base = BITS_PER_MP_LIMB - lb_base - 1; - - return (totbits + lb_base - 1) / lb_base; - } - else - return (size_t) (totbits * __mp_bases[base].chars_per_bit_exactly) + 1; -} diff --git a/rts/gmp/mpz/sqrt.c b/rts/gmp/mpz/sqrt.c deleted file mode 100644 index fe82fe407a..0000000000 --- a/rts/gmp/mpz/sqrt.c +++ /dev/null @@ -1,86 +0,0 @@ -/* mpz_sqrt(root, u) -- Set ROOT to floor(sqrt(U)). - -Copyright (C) 1991, 1993, 1994, 1996, 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include <stdio.h> /* for NULL */ -#include "gmp.h" -#include "gmp-impl.h" - -void -#if __STDC__ -mpz_sqrt (mpz_ptr root, mpz_srcptr op) -#else -mpz_sqrt (root, op) - mpz_ptr root; - mpz_srcptr op; -#endif -{ - mp_size_t op_size, root_size; - mp_ptr root_ptr, op_ptr; - mp_ptr free_me = NULL; - mp_size_t free_me_size; - TMP_DECL (marker); - - TMP_MARK (marker); - op_size = op->_mp_size; - if (op_size < 0) - SQRT_OF_NEGATIVE; - - /* The size of the root is accurate after this simple calculation. */ - root_size = (op_size + 1) / 2; - - root_ptr = root->_mp_d; - op_ptr = op->_mp_d; - - if (root->_mp_alloc < root_size) - { - if (root_ptr == op_ptr) - { - free_me = root_ptr; - free_me_size = root->_mp_alloc; - } - else - (*_mp_free_func) (root_ptr, root->_mp_alloc * BYTES_PER_MP_LIMB); - - root->_mp_alloc = root_size; - root_ptr = (mp_ptr) (*_mp_allocate_func) (root_size * BYTES_PER_MP_LIMB); - root->_mp_d = root_ptr; - } - else - { - /* Make OP not overlap with ROOT. */ - if (root_ptr == op_ptr) - { - /* ROOT and OP are identical. Allocate temporary space for OP. */ - op_ptr = (mp_ptr) TMP_ALLOC (op_size * BYTES_PER_MP_LIMB); - /* Copy to the temporary space. Hack: Avoid temporary variable - by using ROOT_PTR. */ - MPN_COPY (op_ptr, root_ptr, op_size); - } - } - - mpn_sqrtrem (root_ptr, NULL, op_ptr, op_size); - - root->_mp_size = root_size; - - if (free_me != NULL) - (*_mp_free_func) (free_me, free_me_size * BYTES_PER_MP_LIMB); - TMP_FREE (marker); -} diff --git a/rts/gmp/mpz/sqrtrem.c b/rts/gmp/mpz/sqrtrem.c deleted file mode 100644 index 99a6453122..0000000000 --- a/rts/gmp/mpz/sqrtrem.c +++ /dev/null @@ -1,111 +0,0 @@ -/* mpz_sqrtrem(root,rem,x) -- Set ROOT to floor(sqrt(X)) and REM - to the remainder, i.e. X - ROOT**2. - -Copyright (C) 1991, 1993, 1994, 1996, 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include <stdio.h> /* for NULL */ -#include "gmp.h" -#include "gmp-impl.h" -#ifdef BERKELEY_MP -#include "mp.h" -#endif - -#ifndef BERKELEY_MP -void -#if __STDC__ -mpz_sqrtrem (mpz_ptr root, mpz_ptr rem, mpz_srcptr op) -#else -mpz_sqrtrem (root, rem, op) - mpz_ptr root; - mpz_ptr rem; - mpz_srcptr op; -#endif -#else /* BERKELEY_MP */ -void -#if __STDC__ -msqrt (mpz_srcptr op, mpz_ptr root, mpz_ptr rem) -#else -msqrt (op, root, rem) - mpz_srcptr op; - mpz_ptr root; - mpz_ptr rem; -#endif -#endif /* BERKELEY_MP */ -{ - mp_size_t op_size, root_size, rem_size; - mp_ptr root_ptr, op_ptr; - mp_ptr free_me = NULL; - mp_size_t free_me_size; - TMP_DECL (marker); - - TMP_MARK (marker); - op_size = op->_mp_size; - if (op_size < 0) - SQRT_OF_NEGATIVE; - - if (rem->_mp_alloc < op_size) - _mpz_realloc (rem, op_size); - - /* The size of the root is accurate after this simple calculation. */ - root_size = (op_size + 1) / 2; - - root_ptr = root->_mp_d; - op_ptr = op->_mp_d; - - if (root->_mp_alloc < root_size) - { - if (root_ptr == op_ptr) - { - free_me = root_ptr; - free_me_size = root->_mp_alloc; - } - else - (*_mp_free_func) (root_ptr, root->_mp_alloc * BYTES_PER_MP_LIMB); - - root->_mp_alloc = root_size; - root_ptr = (mp_ptr) (*_mp_allocate_func) (root_size * BYTES_PER_MP_LIMB); - root->_mp_d = root_ptr; - } - else - { - /* Make OP not overlap with ROOT. */ - if (root_ptr == op_ptr) - { - /* ROOT and OP are identical. Allocate temporary space for OP. */ - op_ptr = (mp_ptr) TMP_ALLOC (op_size * BYTES_PER_MP_LIMB); - /* Copy to the temporary space. Hack: Avoid temporary variable - by using ROOT_PTR. */ - MPN_COPY (op_ptr, root_ptr, op_size); - } - } - - rem_size = mpn_sqrtrem (root_ptr, rem->_mp_d, op_ptr, op_size); - - root->_mp_size = root_size; - - /* Write remainder size last, to enable us to define this function to - give only the square root remainder, if the user calls if with - ROOT == REM. */ - rem->_mp_size = rem_size; - - if (free_me != NULL) - (*_mp_free_func) (free_me, free_me_size * BYTES_PER_MP_LIMB); - TMP_FREE (marker); -} diff --git a/rts/gmp/mpz/sub.c b/rts/gmp/mpz/sub.c deleted file mode 100644 index f3ae7c23a0..0000000000 --- a/rts/gmp/mpz/sub.c +++ /dev/null @@ -1,123 +0,0 @@ -/* mpz_sub -- Subtract two integers. - -Copyright (C) 1991, 1993, 1994, 1996, 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" -#ifdef BERKELEY_MP -#include "mp.h" -#endif - -#ifndef BERKELEY_MP -void -#if __STDC__ -mpz_sub (mpz_ptr w, mpz_srcptr u, mpz_srcptr v) -#else -mpz_sub (w, u, v) - mpz_ptr w; - mpz_srcptr u; - mpz_srcptr v; -#endif -#else /* BERKELEY_MP */ -void -#if __STDC__ -msub (mpz_srcptr u, mpz_srcptr v, mpz_ptr w) -#else -msub (u, v, w) - mpz_srcptr u; - mpz_srcptr v; - mpz_ptr w; -#endif -#endif /* BERKELEY_MP */ -{ - mp_srcptr up, vp; - mp_ptr wp; - mp_size_t usize, vsize, wsize; - mp_size_t abs_usize; - mp_size_t abs_vsize; - - usize = u->_mp_size; - vsize = -v->_mp_size; /* The "-" makes the difference from mpz_add */ - abs_usize = ABS (usize); - abs_vsize = ABS (vsize); - - if (abs_usize < abs_vsize) - { - /* Swap U and V. */ - MPZ_SRCPTR_SWAP (u, v); - MP_SIZE_T_SWAP (usize, vsize); - MP_SIZE_T_SWAP (abs_usize, abs_vsize); - } - - /* True: ABS_USIZE >= ABS_VSIZE. */ - - /* If not space for w (and possible carry), increase space. */ - wsize = abs_usize + 1; - if (w->_mp_alloc < wsize) - _mpz_realloc (w, wsize); - - /* These must be after realloc (u or v may be the same as w). */ - up = u->_mp_d; - vp = v->_mp_d; - wp = w->_mp_d; - - if ((usize ^ vsize) < 0) - { - /* U and V have different sign. Need to compare them to determine - which operand to subtract from which. */ - - /* This test is right since ABS_USIZE >= ABS_VSIZE. */ - if (abs_usize != abs_vsize) - { - mpn_sub (wp, up, abs_usize, vp, abs_vsize); - wsize = abs_usize; - MPN_NORMALIZE (wp, wsize); - if (usize < 0) - wsize = -wsize; - } - else if (mpn_cmp (up, vp, abs_usize) < 0) - { - mpn_sub_n (wp, vp, up, abs_usize); - wsize = abs_usize; - MPN_NORMALIZE (wp, wsize); - if (usize >= 0) - wsize = -wsize; - } - else - { - mpn_sub_n (wp, up, vp, abs_usize); - wsize = abs_usize; - MPN_NORMALIZE (wp, wsize); - if (usize < 0) - wsize = -wsize; - } - } - else - { - /* U and V have same sign. Add them. */ - mp_limb_t cy_limb = mpn_add (wp, up, abs_usize, vp, abs_vsize); - wp[abs_usize] = cy_limb; - wsize = abs_usize + cy_limb; - if (usize < 0) - wsize = -wsize; - } - - w->_mp_size = wsize; -} diff --git a/rts/gmp/mpz/sub_ui.c b/rts/gmp/mpz/sub_ui.c deleted file mode 100644 index 327add8503..0000000000 --- a/rts/gmp/mpz/sub_ui.c +++ /dev/null @@ -1,84 +0,0 @@ -/* mpz_sub_ui -- Subtract an unsigned one-word integer from an MP_INT. - -Copyright (C) 1991, 1993, 1994, 1996, 1999 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -void -#if __STDC__ -mpz_sub_ui (mpz_ptr w, mpz_srcptr u, unsigned long int v) -#else -mpz_sub_ui (w, u, v) - mpz_ptr w; - mpz_srcptr u; - unsigned long int v; -#endif -{ - mp_srcptr up; - mp_ptr wp; - mp_size_t usize, wsize; - mp_size_t abs_usize; - - usize = u->_mp_size; - abs_usize = ABS (usize); - - /* If not space for W (and possible carry), increase space. */ - wsize = abs_usize + 1; - if (w->_mp_alloc < wsize) - _mpz_realloc (w, wsize); - - /* These must be after realloc (U may be the same as W). */ - up = u->_mp_d; - wp = w->_mp_d; - - if (abs_usize == 0) - { - wp[0] = v; - w->_mp_size = -(v != 0); - return; - } - - if (usize < 0) - { - mp_limb_t cy; - cy = mpn_add_1 (wp, up, abs_usize, (mp_limb_t) v); - wp[abs_usize] = cy; - wsize = -(abs_usize + cy); - } - else - { - /* The signs are different. Need exact comparison to determine - which operand to subtract from which. */ - if (abs_usize == 1 && up[0] < v) - { - wp[0] = v - up[0]; - wsize = -1; - } - else - { - mpn_sub_1 (wp, up, abs_usize, (mp_limb_t) v); - /* Size can decrease with at most one limb. */ - wsize = abs_usize - (wp[abs_usize - 1] == 0); - } - } - - w->_mp_size = wsize; -} diff --git a/rts/gmp/mpz/swap.c b/rts/gmp/mpz/swap.c deleted file mode 100644 index 0070d6ff24..0000000000 --- a/rts/gmp/mpz/swap.c +++ /dev/null @@ -1,52 +0,0 @@ -/* mpz_swap (dest_integer, src_integer) -- Swap U and V. - -Copyright (C) 1997, 1998 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -void -#if __STDC__ -mpz_swap (mpz_ptr u, mpz_ptr v) -#else -mpz_swap (u, v) - mpz_ptr u; - mpz_ptr v; -#endif -{ - mp_ptr up, vp; - mp_size_t usize, vsize; - mp_size_t ualloc, valloc; - - ualloc = u->_mp_alloc; - valloc = v->_mp_alloc; - v->_mp_alloc = ualloc; - u->_mp_alloc = valloc; - - usize = u->_mp_size; - vsize = v->_mp_size; - v->_mp_size = usize; - u->_mp_size = vsize; - - up = u->_mp_d; - vp = v->_mp_d; - v->_mp_d = up; - u->_mp_d = vp; -} diff --git a/rts/gmp/mpz/tdiv_q.c b/rts/gmp/mpz/tdiv_q.c deleted file mode 100644 index 21db4ab385..0000000000 --- a/rts/gmp/mpz/tdiv_q.c +++ /dev/null @@ -1,91 +0,0 @@ -/* mpz_tdiv_q -- divide two integers and produce a quotient. - -Copyright (C) 1991, 1993, 1994, 1996, 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" -#include "longlong.h" - -void -#if __STDC__ -mpz_tdiv_q (mpz_ptr quot, mpz_srcptr num, mpz_srcptr den) -#else -mpz_tdiv_q (quot, num, den) - mpz_ptr quot; - mpz_srcptr num; - mpz_srcptr den; -#endif -{ - mp_size_t ql; - mp_size_t ns, ds, nl, dl; - mp_ptr np, dp, qp, rp; - TMP_DECL (marker); - - ns = SIZ (num); - ds = SIZ (den); - nl = ABS (ns); - dl = ABS (ds); - ql = nl - dl + 1; - - if (dl == 0) - DIVIDE_BY_ZERO; - - if (ql <= 0) - { - SIZ (quot) = 0; - return; - } - - MPZ_REALLOC (quot, ql); - - TMP_MARK (marker); - qp = PTR (quot); - rp = (mp_ptr) TMP_ALLOC (dl * BYTES_PER_MP_LIMB); - np = PTR (num); - dp = PTR (den); - - /* FIXME: We should think about how to handle the temporary allocation. - Perhaps mpn_tdiv_qr should handle it, since it anyway often needs to - allocate temp space. */ - - /* Copy denominator to temporary space if it overlaps with the quotient. */ - if (dp == qp) - { - mp_ptr tp; - tp = (mp_ptr) TMP_ALLOC (dl * BYTES_PER_MP_LIMB); - MPN_COPY (tp, dp, dl); - dp = tp; - } - /* Copy numerator to temporary space if it overlaps with the quotient. */ - if (np == qp) - { - mp_ptr tp; - tp = (mp_ptr) TMP_ALLOC (nl * BYTES_PER_MP_LIMB); - MPN_COPY (tp, np, nl); - np = tp; - } - - mpn_tdiv_qr (qp, rp, 0L, np, nl, dp, dl); - - ql -= qp[ql - 1] == 0; - - SIZ (quot) = (ns ^ ds) >= 0 ? ql : -ql; - TMP_FREE (marker); -} diff --git a/rts/gmp/mpz/tdiv_q_2exp.c b/rts/gmp/mpz/tdiv_q_2exp.c deleted file mode 100644 index 03d1e01f89..0000000000 --- a/rts/gmp/mpz/tdiv_q_2exp.c +++ /dev/null @@ -1,68 +0,0 @@ -/* mpz_tdiv_q_2exp -- Divide an integer by 2**CNT. Round the quotient - towards -infinity. - -Copyright (C) 1991, 1993, 1994, 1996 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -void -#if __STDC__ -mpz_tdiv_q_2exp (mpz_ptr w, mpz_srcptr u, unsigned long int cnt) -#else -mpz_tdiv_q_2exp (w, u, cnt) - mpz_ptr w; - mpz_srcptr u; - unsigned long int cnt; -#endif -{ - mp_size_t usize, wsize; - mp_size_t limb_cnt; - - usize = u->_mp_size; - limb_cnt = cnt / BITS_PER_MP_LIMB; - wsize = ABS (usize) - limb_cnt; - if (wsize <= 0) - w->_mp_size = 0; - else - { - mp_ptr wp; - mp_srcptr up; - - if (w->_mp_alloc < wsize) - _mpz_realloc (w, wsize); - - wp = w->_mp_d; - up = u->_mp_d; - - cnt %= BITS_PER_MP_LIMB; - if (cnt != 0) - { - mpn_rshift (wp, up + limb_cnt, wsize, cnt); - wsize -= wp[wsize - 1] == 0; - } - else - { - MPN_COPY_INCR (wp, up + limb_cnt, wsize); - } - - w->_mp_size = usize >= 0 ? wsize : -wsize; - } -} diff --git a/rts/gmp/mpz/tdiv_q_ui.c b/rts/gmp/mpz/tdiv_q_ui.c deleted file mode 100644 index a2e3462b76..0000000000 --- a/rts/gmp/mpz/tdiv_q_ui.c +++ /dev/null @@ -1,64 +0,0 @@ -/* mpz_tdiv_q_ui(quot, dividend, divisor_limb) - -- Divide DIVIDEND by DIVISOR_LIMB and store the result in QUOT. - -Copyright (C) 1991, 1993, 1994, 1996, 1998 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -unsigned long int -#if __STDC__ -mpz_tdiv_q_ui (mpz_ptr quot, mpz_srcptr dividend, unsigned long int divisor) -#else -mpz_tdiv_q_ui (quot, dividend, divisor) - mpz_ptr quot; - mpz_srcptr dividend; - unsigned long int divisor; -#endif -{ - mp_size_t dividend_size; - mp_size_t size; - mp_ptr quot_ptr; - mp_limb_t remainder_limb; - - if (divisor == 0) - DIVIDE_BY_ZERO; - - dividend_size = dividend->_mp_size; - size = ABS (dividend_size); - - /* No need for temporary allocation and copying if QUOT == DIVIDEND as - the divisor is just one limb, and thus no intermediate remainders - need to be stored. */ - - if (quot->_mp_alloc < size) - _mpz_realloc (quot, size); - - quot_ptr = quot->_mp_d; - - remainder_limb - = mpn_divmod_1 (quot_ptr, dividend->_mp_d, size, (mp_limb_t) divisor); - - /* The quotient is SIZE limbs, but the most significant might be zero. */ - size -= size != 0 && quot_ptr[size - 1] == 0; - quot->_mp_size = dividend_size >= 0 ? size : -size; - - return remainder_limb; -} diff --git a/rts/gmp/mpz/tdiv_qr.c b/rts/gmp/mpz/tdiv_qr.c deleted file mode 100644 index d66f57d9e5..0000000000 --- a/rts/gmp/mpz/tdiv_qr.c +++ /dev/null @@ -1,130 +0,0 @@ -/* mpz_tdiv_qr(quot,rem,dividend,divisor) -- Set QUOT to DIVIDEND/DIVISOR, - and REM to DIVIDEND mod DIVISOR. - -Copyright (C) 1991, 1993, 1994, 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" -#include "longlong.h" -#ifdef BERKELEY_MP -#include "mp.h" -#endif - - -#ifndef BERKELEY_MP - -void -#if __STDC__ -mpz_tdiv_qr (mpz_ptr quot, mpz_ptr rem, mpz_srcptr num, mpz_srcptr den) -#else -mpz_tdiv_qr (quot, rem, num, den) - mpz_ptr quot; - mpz_ptr rem; - mpz_srcptr num; - mpz_srcptr den; -#endif - -#else /* BERKELEY_MP */ - -void -#if __STDC__ -mdiv (mpz_srcptr num, mpz_srcptr den, mpz_ptr quot, mpz_ptr rem) -#else -mdiv (num, den, quot, rem) - mpz_srcptr num; - mpz_srcptr den; - mpz_ptr quot; - mpz_ptr rem; -#endif - -#endif /* BERKELEY_MP */ -{ - mp_size_t ql; - mp_size_t ns, ds, nl, dl; - mp_ptr np, dp, qp, rp; - TMP_DECL (marker); - - ns = SIZ (num); - ds = SIZ (den); - nl = ABS (ns); - dl = ABS (ds); - ql = nl - dl + 1; - - if (dl == 0) - DIVIDE_BY_ZERO; - - MPZ_REALLOC (rem, dl); - - if (ql <= 0) - { - if (num != rem) - { - mp_ptr np, rp; - np = PTR (num); - rp = PTR (rem); - MPN_COPY (rp, np, nl); - SIZ (rem) = SIZ (num); - } - /* This needs to follow the assignment to rem, in case the - numerator and quotient are the same. */ - SIZ (quot) = 0; - return; - } - - MPZ_REALLOC (quot, ql); - - TMP_MARK (marker); - qp = PTR (quot); - rp = PTR (rem); - np = PTR (num); - dp = PTR (den); - - /* FIXME: We should think about how to handle the temporary allocation. - Perhaps mpn_tdiv_qr should handle it, since it anyway often needs to - allocate temp space. */ - - /* Copy denominator to temporary space if it overlaps with the quotient - or remainder. */ - if (dp == rp || dp == qp) - { - mp_ptr tp; - tp = (mp_ptr) TMP_ALLOC (dl * BYTES_PER_MP_LIMB); - MPN_COPY (tp, dp, dl); - dp = tp; - } - /* Copy numerator to temporary space if it overlaps with the quotient or - remainder. */ - if (np == rp || np == qp) - { - mp_ptr tp; - tp = (mp_ptr) TMP_ALLOC (nl * BYTES_PER_MP_LIMB); - MPN_COPY (tp, np, nl); - np = tp; - } - - mpn_tdiv_qr (qp, rp, 0L, np, nl, dp, dl); - - ql -= qp[ql - 1] == 0; - MPN_NORMALIZE (rp, dl); - - SIZ (quot) = (ns ^ ds) >= 0 ? ql : -ql; - SIZ (rem) = ns >= 0 ? dl : -dl; - TMP_FREE (marker); -} diff --git a/rts/gmp/mpz/tdiv_qr_ui.c b/rts/gmp/mpz/tdiv_qr_ui.c deleted file mode 100644 index 10368cd340..0000000000 --- a/rts/gmp/mpz/tdiv_qr_ui.c +++ /dev/null @@ -1,76 +0,0 @@ -/* mpz_tdiv_qr_ui(quot,rem,dividend,short_divisor) -- - Set QUOT to DIVIDEND / SHORT_DIVISOR - and REM to DIVIDEND mod SHORT_DIVISOR. - -Copyright (C) 1991, 1993, 1994, 1996, 1998 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -unsigned long int -#if __STDC__ -mpz_tdiv_qr_ui (mpz_ptr quot, mpz_ptr rem, mpz_srcptr dividend, unsigned long int divisor) -#else -mpz_tdiv_qr_ui (quot, rem, dividend, divisor) - mpz_ptr quot; - mpz_ptr rem; - mpz_srcptr dividend; - unsigned long int divisor; -#endif -{ - mp_size_t dividend_size; - mp_size_t size; - mp_ptr quot_ptr; - mp_limb_t remainder_limb; - - if (divisor == 0) - DIVIDE_BY_ZERO; - - dividend_size = dividend->_mp_size; - size = ABS (dividend_size); - - /* No need for temporary allocation and copying if QUOT == DIVIDEND as - the divisor is just one limb, and thus no intermediate remainders - need to be stored. */ - - if (quot->_mp_alloc < size) - _mpz_realloc (quot, size); - - quot_ptr = quot->_mp_d; - - remainder_limb = mpn_divmod_1 (quot_ptr, dividend->_mp_d, size, - (mp_limb_t) divisor); - - if (remainder_limb == 0) - rem->_mp_size = 0; - else - { - /* Store the single-limb remainder. We don't check if there's space - for just one limb, since no function ever makes zero space. */ - rem->_mp_size = dividend_size >= 0 ? 1 : -1; - rem->_mp_d[0] = remainder_limb; - } - - /* The quotient is SIZE limbs, but the most significant might be zero. */ - size -= size != 0 && quot_ptr[size - 1] == 0; - quot->_mp_size = dividend_size >= 0 ? size : -size; - - return remainder_limb; -} diff --git a/rts/gmp/mpz/tdiv_r.c b/rts/gmp/mpz/tdiv_r.c deleted file mode 100644 index 9eb87dfabf..0000000000 --- a/rts/gmp/mpz/tdiv_r.c +++ /dev/null @@ -1,98 +0,0 @@ -/* mpz_tdiv_r(rem, dividend, divisor) -- Set REM to DIVIDEND mod DIVISOR. - -Copyright (C) 1991, 1993, 1994, 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" -#include "longlong.h" - -void -#if __STDC__ -mpz_tdiv_r (mpz_ptr rem, mpz_srcptr num, mpz_srcptr den) -#else -mpz_tdiv_r (rem, num, den) - mpz_ptr rem; - mpz_srcptr num; - mpz_srcptr den; -#endif -{ - mp_size_t ql; - mp_size_t ns, ds, nl, dl; - mp_ptr np, dp, qp, rp; - TMP_DECL (marker); - - ns = SIZ (num); - ds = SIZ (den); - nl = ABS (ns); - dl = ABS (ds); - ql = nl - dl + 1; - - if (dl == 0) - DIVIDE_BY_ZERO; - - MPZ_REALLOC (rem, dl); - - if (ql <= 0) - { - if (num != rem) - { - mp_ptr np, rp; - np = PTR (num); - rp = PTR (rem); - MPN_COPY (rp, np, nl); - SIZ (rem) = SIZ (num); - } - return; - } - - TMP_MARK (marker); - qp = (mp_ptr) TMP_ALLOC (ql * BYTES_PER_MP_LIMB); - rp = PTR (rem); - np = PTR (num); - dp = PTR (den); - - /* FIXME: We should think about how to handle the temporary allocation. - Perhaps mpn_tdiv_qr should handle it, since it anyway often needs to - allocate temp space. */ - - /* Copy denominator to temporary space if it overlaps with the remainder. */ - if (dp == rp) - { - mp_ptr tp; - tp = (mp_ptr) TMP_ALLOC (dl * BYTES_PER_MP_LIMB); - MPN_COPY (tp, dp, dl); - dp = tp; - } - /* Copy numerator to temporary space if it overlaps with the remainder. */ - if (np == rp) - { - mp_ptr tp; - tp = (mp_ptr) TMP_ALLOC (nl * BYTES_PER_MP_LIMB); - MPN_COPY (tp, np, nl); - np = tp; - } - - mpn_tdiv_qr (qp, rp, 0L, np, nl, dp, dl); - - MPN_NORMALIZE (rp, dl); - - SIZ (rem) = ns >= 0 ? dl : -dl; - TMP_FREE (marker); -} diff --git a/rts/gmp/mpz/tdiv_r_2exp.c b/rts/gmp/mpz/tdiv_r_2exp.c deleted file mode 100644 index 91de170f5c..0000000000 --- a/rts/gmp/mpz/tdiv_r_2exp.c +++ /dev/null @@ -1,79 +0,0 @@ -/* mpz_tdiv_r_2exp -- Divide a integer by 2**CNT and produce a remainder. - -Copyright (C) 1991, 1993, 1994, 1995 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -void -#if __STDC__ -mpz_tdiv_r_2exp (mpz_ptr res, mpz_srcptr in, unsigned long int cnt) -#else -mpz_tdiv_r_2exp (res, in, cnt) - mpz_ptr res; - mpz_srcptr in; - unsigned long int cnt; -#endif -{ - mp_size_t in_size = ABS (in->_mp_size); - mp_size_t res_size; - mp_size_t limb_cnt = cnt / BITS_PER_MP_LIMB; - mp_srcptr in_ptr = in->_mp_d; - - if (in_size > limb_cnt) - { - /* The input operand is (probably) greater than 2**CNT. */ - mp_limb_t x; - - x = in_ptr[limb_cnt] & (((mp_limb_t) 1 << cnt % BITS_PER_MP_LIMB) - 1); - if (x != 0) - { - res_size = limb_cnt + 1; - if (res->_mp_alloc < res_size) - _mpz_realloc (res, res_size); - - res->_mp_d[limb_cnt] = x; - } - else - { - res_size = limb_cnt; - MPN_NORMALIZE (in_ptr, res_size); - - if (res->_mp_alloc < res_size) - _mpz_realloc (res, res_size); - - limb_cnt = res_size; - } - } - else - { - /* The input operand is smaller than 2**CNT. We perform a no-op, - apart from that we might need to copy IN to RES. */ - res_size = in_size; - if (res->_mp_alloc < res_size) - _mpz_realloc (res, res_size); - - limb_cnt = res_size; - } - - if (res != in) - MPN_COPY (res->_mp_d, in->_mp_d, limb_cnt); - res->_mp_size = in->_mp_size >= 0 ? res_size : -res_size; -} diff --git a/rts/gmp/mpz/tdiv_r_ui.c b/rts/gmp/mpz/tdiv_r_ui.c deleted file mode 100644 index 2ea411fda1..0000000000 --- a/rts/gmp/mpz/tdiv_r_ui.c +++ /dev/null @@ -1,63 +0,0 @@ -/* mpz_tdiv_r_ui(rem, dividend, divisor_limb) - -- Set REM to DIVDEND mod DIVISOR_LIMB. - -Copyright (C) 1991, 1993, 1994, 1996, 1998 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -unsigned long int -#if __STDC__ -mpz_tdiv_r_ui (mpz_ptr rem, mpz_srcptr dividend, unsigned long int divisor) -#else -mpz_tdiv_r_ui (rem, dividend, divisor) - mpz_ptr rem; - mpz_srcptr dividend; - unsigned long int divisor; -#endif -{ - mp_size_t dividend_size; - mp_size_t size; - mp_limb_t remainder_limb; - - if (divisor == 0) - DIVIDE_BY_ZERO; - - dividend_size = dividend->_mp_size; - size = ABS (dividend_size); - - /* No need for temporary allocation and copying if QUOT == DIVIDEND as - the divisor is just one limb, and thus no intermediate remainders - need to be stored. */ - - remainder_limb = mpn_mod_1 (dividend->_mp_d, size, (mp_limb_t) divisor); - - if (remainder_limb == 0) - rem->_mp_size = 0; - else - { - /* Store the single-limb remainder. We don't check if there's space - for just one limb, since no function ever makes zero space. */ - rem->_mp_size = dividend_size >= 0 ? 1 : -1; - rem->_mp_d[0] = remainder_limb; - } - - return remainder_limb; -} diff --git a/rts/gmp/mpz/tdiv_ui.c b/rts/gmp/mpz/tdiv_ui.c deleted file mode 100644 index 7a40a6a7f7..0000000000 --- a/rts/gmp/mpz/tdiv_ui.c +++ /dev/null @@ -1,53 +0,0 @@ -/* mpz_tdiv_ui(dividend, divisor_limb) - -- Return DIVDEND mod DIVISOR_LIMB. - -Copyright (C) 1991, 1993, 1994, 1996, 1997, 1998 Free Software Foundation, -Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -unsigned long int -#if __STDC__ -mpz_tdiv_ui (mpz_srcptr dividend, unsigned long int divisor) -#else -mpz_tdiv_ui (dividend, divisor) - mpz_srcptr dividend; - unsigned long int divisor; -#endif -{ - mp_size_t dividend_size; - mp_size_t size; - mp_limb_t remainder_limb; - - if (divisor == 0) - DIVIDE_BY_ZERO; - - dividend_size = dividend->_mp_size; - size = ABS (dividend_size); - - /* No need for temporary allocation and copying if QUOT == DIVIDEND as - the divisor is just one limb, and thus no intermediate remainders - need to be stored. */ - - remainder_limb = mpn_mod_1 (dividend->_mp_d, size, (mp_limb_t) divisor); - - return remainder_limb; -} diff --git a/rts/gmp/mpz/tstbit.c b/rts/gmp/mpz/tstbit.c deleted file mode 100644 index b0a8b0b31a..0000000000 --- a/rts/gmp/mpz/tstbit.c +++ /dev/null @@ -1,70 +0,0 @@ -/* mpz_tstbit -- test a specified bit. Simulate 2's complement representation. - -Copyright (C) 1997 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -int -#if __STDC__ -mpz_tstbit (mpz_srcptr d, unsigned long int bit_index) -#else -mpz_tstbit (d, bit_index) - mpz_srcptr d; - unsigned long int bit_index; -#endif -{ - mp_size_t dsize = d->_mp_size; - mp_ptr dp = d->_mp_d; - mp_size_t limb_index; - - limb_index = bit_index / BITS_PER_MP_LIMB; - if (dsize >= 0) - { - if (limb_index < dsize) - return (dp[limb_index] >> (bit_index % BITS_PER_MP_LIMB)) & 1; - else - /* Testing a bit outside of a positive number. */ - return 0; - } - else - { - mp_size_t zero_bound; - - dsize = -dsize; - - /* Locate the least significant non-zero limb. */ - for (zero_bound = 0; dp[zero_bound] == 0; zero_bound++) - ; - - if (limb_index > zero_bound) - { - if (limb_index < dsize) - return (~dp[limb_index] >> (bit_index % BITS_PER_MP_LIMB)) & 1; - else - /* Testing a bit outside of a negative number. */ - return 1; - } - else if (limb_index == zero_bound) - return (-dp[limb_index] >> (bit_index % BITS_PER_MP_LIMB)) & 1; - else - return 0; - } -} diff --git a/rts/gmp/mpz/ui_pow_ui.c b/rts/gmp/mpz/ui_pow_ui.c deleted file mode 100644 index edd2dee625..0000000000 --- a/rts/gmp/mpz/ui_pow_ui.c +++ /dev/null @@ -1,139 +0,0 @@ -/* mpz_ui_pow_ui(res, base, exp) -- Set RES to BASE**EXP. - -Copyright (C) 1991, 1993, 1994, 1996, 1997, 2000 Free Software Foundation, -Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" -#include "longlong.h" - - -static void mpz_pow2 _PROTO ((mpz_ptr r, mp_limb_t blimb, unsigned long int e, mp_limb_t rl)); - -void -#if __STDC__ -mpz_ui_pow_ui (mpz_ptr r, unsigned long int b, unsigned long int e) -#else -mpz_ui_pow_ui (r, b, e) - mpz_ptr r; - unsigned long int b; - unsigned long int e; -#endif -{ - mp_limb_t blimb = b; - mp_limb_t rl; - - if (e == 0) - { - /* For x^0 we return 1, even if x is 0. */ - r->_mp_d[0] = 1; - r->_mp_size = 1; - return; - } - - /* Compute b^e as (b^n)^(e div n) * b^(e mod n), where n is chosen such that - the latter factor is the largest number small enough to fit in a limb. */ - - rl = 1; - while (e != 0 && blimb < ((mp_limb_t) 1 << BITS_PER_MP_LIMB/2)) - { - if ((e & 1) != 0) - rl = rl * blimb; - blimb = blimb * blimb; - e = e >> 1; - } - - /* rl is now b^(e mod n). (I.e., the latter factor above.) */ - - if (e == 0) - { - r->_mp_d[0] = rl; - r->_mp_size = rl != 0; - return; - } - - mpz_pow2 (r, blimb, e, rl); -} - -/* Multi-precision part of expontialization code. */ -static void -#if __STDC__ -mpz_pow2 (mpz_ptr r, mp_limb_t blimb, unsigned long int e, mp_limb_t rl) -#else -mpz_pow2 (r, blimb, e, rl) - mpz_ptr r; - mp_limb_t blimb; - unsigned long int e; - mp_limb_t rl; -#endif -{ - mp_ptr rp, tp; - mp_size_t ralloc, rsize; - int cnt, i; - TMP_DECL (marker); - - TMP_MARK (marker); - - /* Over-estimate temporary space requirements somewhat. */ - count_leading_zeros (cnt, blimb); - ralloc = e - cnt * e / BITS_PER_MP_LIMB + 1; - - /* The two areas are used to alternatingly hold the input and receive the - product for mpn_mul. (Needed since mpn_mul_n requires that the product - is distinct from either input operand.) */ - rp = (mp_ptr) TMP_ALLOC (ralloc * BYTES_PER_MP_LIMB); - tp = (mp_ptr) TMP_ALLOC (ralloc * BYTES_PER_MP_LIMB); - - rp[0] = blimb; - rsize = 1; - - count_leading_zeros (cnt, e); - for (i = BITS_PER_MP_LIMB - cnt - 2; i >= 0; i--) - { - mpn_mul_n (tp, rp, rp, rsize); - rsize = 2 * rsize; - rsize -= tp[rsize - 1] == 0; - MP_PTR_SWAP (rp, tp); - - if ((e & ((mp_limb_t) 1 << i)) != 0) - { - mp_limb_t cy; - cy = mpn_mul_1 (rp, rp, rsize, blimb); - rp[rsize] = cy; - rsize += cy != 0; - } - } - - /* We will need rsize or rsize+1 limbs for the result. */ - if (r->_mp_alloc <= rsize) - _mpz_realloc (r, rsize + 1); - - /* Multiply the two factors (in rp,rsize and rl) and put the final result - in place. */ - { - mp_limb_t cy; - cy = mpn_mul_1 (r->_mp_d, rp, rsize, rl); - (r->_mp_d)[rsize] = cy; - rsize += cy != 0; - } - - r->_mp_size = rsize; - TMP_FREE (marker); -} diff --git a/rts/gmp/mpz/urandomb.c b/rts/gmp/mpz/urandomb.c deleted file mode 100644 index caca086e05..0000000000 --- a/rts/gmp/mpz/urandomb.c +++ /dev/null @@ -1,49 +0,0 @@ -/* mpz_urandomb (rop, state, n) -- Generate a uniform pseudorandom - integer in the range 0 to 2^N - 1, inclusive, using STATE as the - random state previously initialized by a call to gmp_randinit(). - -Copyright (C) 1999, 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -void -#if __STDC__ -mpz_urandomb (mpz_t rop, gmp_randstate_t rstate, unsigned long int nbits) -#else -mpz_urandomb (rop, rstate, nbits) - mpz_t rop; - gmp_randstate_t rstate; - unsigned long int nbits; -#endif -{ - mp_ptr rp; - mp_size_t size; - - size = (nbits + BITS_PER_MP_LIMB - 1) / BITS_PER_MP_LIMB; - if (ALLOC (rop) < size) - _mpz_realloc (rop, size); - - rp = PTR (rop); - - _gmp_rand (rp, rstate, nbits); - MPN_NORMALIZE (rp, size); - SIZ (rop) = size; -} diff --git a/rts/gmp/mpz/urandomm.c b/rts/gmp/mpz/urandomm.c deleted file mode 100644 index 69e1bae78a..0000000000 --- a/rts/gmp/mpz/urandomm.c +++ /dev/null @@ -1,78 +0,0 @@ -/* mpz_urandomm (rop, state, n) -- Generate a uniform pseudorandom - integer in the range 0 to N-1, using STATE as the random state - previously initialized by a call to gmp_randinit(). - -Copyright (C) 2000 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" -#include "longlong.h" - -void -#if __STDC__ -mpz_urandomm (mpz_t rop, gmp_randstate_t rstate, mpz_t n) -#else -mpz_urandomm (rop, rstate, n) - mpz_t rop; - gmp_randstate_t rstate; - mpz_t n; -#endif -{ - mpz_t t, p, m; - mp_ptr tp; - mp_size_t nbits, size; - int count; - TMP_DECL (marker); - - TMP_MARK (marker); - - /* FIXME: Should check for n == 0 and report error */ - - size = SIZ (n); - count_leading_zeros (count, PTR (n)[size - 1]); - nbits = size * BITS_PER_MP_LIMB - count; - - /* Allocate enough for any mpz function called since a realloc of - these will fail. */ - MPZ_TMP_INIT (t, size); - MPZ_TMP_INIT (m, size + 1); - MPZ_TMP_INIT (p, size + 1); - - /* Let m = highest possible random number plus 1. */ - mpz_set_ui (m, 0); - mpz_setbit (m, nbits); - - /* Let p = floor(m / n) * n. */ - mpz_fdiv_q (p, m, n); - mpz_mul (p, p, n); - - tp = PTR (t); - do - { - _gmp_rand (tp, rstate, nbits); - MPN_NORMALIZE (tp, size); /* FIXME: Really necessary? */ - SIZ (t) = size; - } - while (mpz_cmp (t, p) >= 0); - - mpz_mod (rop, t, n); - - TMP_FREE (marker); -} diff --git a/rts/gmp/mpz/xor.c b/rts/gmp/mpz/xor.c deleted file mode 100644 index 69898d1791..0000000000 --- a/rts/gmp/mpz/xor.c +++ /dev/null @@ -1,217 +0,0 @@ -/* mpz_xor -- Logical xor. - -Copyright (C) 1991, 1993, 1994, 1996, 1997, 2000 Free Software Foundation, -Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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. - -The GNU MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "gmp.h" -#include "gmp-impl.h" - -void -#if __STDC__ -mpz_xor (mpz_ptr res, mpz_srcptr op1, mpz_srcptr op2) -#else -mpz_xor (res, op1, op2) - mpz_ptr res; - mpz_srcptr op1; - mpz_srcptr op2; -#endif -{ - mp_srcptr op1_ptr, op2_ptr; - mp_size_t op1_size, op2_size; - mp_ptr res_ptr; - mp_size_t res_size, res_alloc; - mp_size_t i; - TMP_DECL (marker); - - TMP_MARK (marker); - op1_size = op1->_mp_size; - op2_size = op2->_mp_size; - - op1_ptr = op1->_mp_d; - op2_ptr = op2->_mp_d; - res_ptr = res->_mp_d; - - if (op1_size >= 0) - { - if (op2_size >= 0) - { - if (op1_size >= op2_size) - { - if (res->_mp_alloc < op1_size) - { - _mpz_realloc (res, op1_size); - op1_ptr = op1->_mp_d; - op2_ptr = op2->_mp_d; - res_ptr = res->_mp_d; - } - - if (res_ptr != op1_ptr) - MPN_COPY (res_ptr + op2_size, op1_ptr + op2_size, - op1_size - op2_size); - for (i = op2_size - 1; i >= 0; i--) - res_ptr[i] = op1_ptr[i] ^ op2_ptr[i]; - res_size = op1_size; - } - else - { - if (res->_mp_alloc < op2_size) - { - _mpz_realloc (res, op2_size); - op1_ptr = op1->_mp_d; - op2_ptr = op2->_mp_d; - res_ptr = res->_mp_d; - } - - if (res_ptr != op2_ptr) - MPN_COPY (res_ptr + op1_size, op2_ptr + op1_size, - op2_size - op1_size); - for (i = op1_size - 1; i >= 0; i--) - res_ptr[i] = op1_ptr[i] ^ op2_ptr[i]; - res_size = op2_size; - } - - MPN_NORMALIZE (res_ptr, res_size); - res->_mp_size = res_size; - return; - } - else /* op2_size < 0 */ - { - /* Fall through to the code at the end of the function. */ - } - } - else - { - if (op2_size < 0) - { - mp_ptr opx; - mp_limb_t cy; - - /* Both operands are negative, the result will be positive. - (-OP1) ^ (-OP2) = - = ~(OP1 - 1) ^ ~(OP2 - 1) = - = (OP1 - 1) ^ (OP2 - 1) */ - - op1_size = -op1_size; - op2_size = -op2_size; - - /* Possible optimization: Decrease mpn_sub precision, - as we won't use the entire res of both. */ - opx = (mp_ptr) TMP_ALLOC (op1_size * BYTES_PER_MP_LIMB); - mpn_sub_1 (opx, op1_ptr, op1_size, (mp_limb_t) 1); - op1_ptr = opx; - - opx = (mp_ptr) TMP_ALLOC (op2_size * BYTES_PER_MP_LIMB); - mpn_sub_1 (opx, op2_ptr, op2_size, (mp_limb_t) 1); - op2_ptr = opx; - - res_alloc = MAX (op1_size, op2_size); - if (res->_mp_alloc < res_alloc) - { - _mpz_realloc (res, res_alloc); - res_ptr = res->_mp_d; - /* Don't re-read OP1_PTR and OP2_PTR. They point to - temporary space--never to the space RES->_mp_d used - to point to before reallocation. */ - } - - if (op1_size > op2_size) - { - MPN_COPY (res_ptr + op2_size, op1_ptr + op2_size, - op1_size - op2_size); - for (i = op2_size - 1; i >= 0; i--) - res_ptr[i] = op1_ptr[i] ^ op2_ptr[i]; - res_size = op1_size; - } - else - { - MPN_COPY (res_ptr + op1_size, op2_ptr + op1_size, - op2_size - op1_size); - for (i = op1_size - 1; i >= 0; i--) - res_ptr[i] = op1_ptr[i] ^ op2_ptr[i]; - res_size = op2_size; - } - - MPN_NORMALIZE (res_ptr, res_size); - res->_mp_size = res_size; - TMP_FREE (marker); - return; - } - else - { - /* We should compute -OP1 ^ OP2. Swap OP1 and OP2 and fall - through to the code that handles OP1 ^ -OP2. */ - MPZ_SRCPTR_SWAP (op1, op2); - MPN_SRCPTR_SWAP (op1_ptr,op1_size, op2_ptr,op2_size); - } - } - - { - mp_ptr opx; - mp_limb_t cy; - mp_size_t count; - - /* Operand 2 negative, so will be the result. - -(OP1 ^ (-OP2)) = -(OP1 ^ ~(OP2 - 1)) = - = ~(OP1 ^ ~(OP2 - 1)) + 1 = - = (OP1 ^ (OP2 - 1)) + 1 */ - - op2_size = -op2_size; - - opx = (mp_ptr) TMP_ALLOC (op2_size * BYTES_PER_MP_LIMB); - mpn_sub_1 (opx, op2_ptr, op2_size, (mp_limb_t) 1); - op2_ptr = opx; - - res_alloc = MAX (op1_size, op2_size) + 1; - if (res->_mp_alloc < res_alloc) - { - _mpz_realloc (res, res_alloc); - op1_ptr = op1->_mp_d; - res_ptr = res->_mp_d; - /* Don't re-read OP2_PTR. It points to temporary space--never - to the space RES->_mp_d used to point to before reallocation. */ - } - - if (op1_size > op2_size) - { - MPN_COPY (res_ptr + op2_size, op1_ptr + op2_size, op1_size - op2_size); - for (i = op2_size - 1; i >= 0; i--) - res_ptr[i] = op1_ptr[i] ^ op2_ptr[i]; - res_size = op1_size; - } - else - { - MPN_COPY (res_ptr + op1_size, op2_ptr + op1_size, op2_size - op1_size); - for (i = op1_size - 1; i >= 0; i--) - res_ptr[i] = op1_ptr[i] ^ op2_ptr[i]; - res_size = op2_size; - } - - cy = mpn_add_1 (res_ptr, res_ptr, res_size, (mp_limb_t) 1); - if (cy) - { - res_ptr[res_size] = cy; - res_size++; - } - - MPN_NORMALIZE (res_ptr, res_size); - res->_mp_size = -res_size; - TMP_FREE (marker); - } -} |