From: Ian Lynagh Date: Thu, 5 Jul 2007 21:52:40 +0000 (+0000) Subject: Update the in-tree GMP; fixes trac #832 X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=commitdiff_plain;h=fdf1cd0399158308769fcb2ab7e46e215a68d865 Update the in-tree GMP; fixes trac #832 gmp is now in a top-level directory and we only have the tarball in the darcs repo. It gets untarred if it is needed. --- diff --git a/Makefile b/Makefile index 2902bbf..a2337f0 100644 --- a/Makefile +++ b/Makefile @@ -59,12 +59,12 @@ include $(TOP)/mk/boilerplate.mk # We can't 'make boot' in libraries until stage1 is built ifeq "$(BootingFromHc)" "YES" -SUBDIRS_BUILD = includes rts compat compiler docs utils driver +SUBDIRS_BUILD = gmp includes rts compat compiler docs utils driver else -SUBDIRS_BUILD = includes compat utils driver docs compiler rts +SUBDIRS_BUILD = gmp includes compat utils driver docs compiler rts endif -SUBDIRS = includes compat utils driver docs rts libraries compiler +SUBDIRS = gmp includes compat utils driver docs rts libraries compiler # Sanity check that all the core libraries are in the tree, to catch # failure to run darcs-all. @@ -261,6 +261,7 @@ binary-dist-pre:: $(MKDIRHIER) $(BIN_DIST_DIR)/share binary-dist:: + $(MAKE) -C gmp binary-dist DOING_BIN_DIST=YES $(MAKE) -C includes binary-dist DOING_BIN_DIST=YES $(MAKE) -C compiler binary-dist DOING_BIN_DIST=YES $(INSTALL_STAGE) # XXX $(MAKE) -C docs binary-dist DOING_BIN_DIST=YES diff --git a/boot b/boot index 262ae52..14d886a 100644 --- a/boot +++ b/boot @@ -13,7 +13,6 @@ do done chmod +x push-all -chmod +x rts/gmp/configure echo "Booting ." autoreconf diff --git a/gmp/Makefile b/gmp/Makefile new file mode 100644 index 0000000..18d0b75 --- /dev/null +++ b/gmp/Makefile @@ -0,0 +1,110 @@ + +TOP=.. + +include $(TOP)/mk/boilerplate.mk + +# ----------------------------------------------------------------------------- +# Compile GMP only if we don't have it already +# +# We use GMP's own configuration stuff, because it's all rather hairy +# and not worth re-implementing in our Makefile framework. + +ifneq "$(HaveLibGmp)" "YES" +ifneq "$(HaveFrameworkGMP)" "YES" + +boot :: stamp.gmp + +PLATFORM := $(shell echo $(HOSTPLATFORM) | sed 's/i[567]86/i486/g') + +# 2007-07-05 +# We do +# set -o igncr; export SHELLOPTS +# here as otherwise checking the size of limbs +# makes the build fall over on Cygwin. See the thread +# http://www.cygwin.com/ml/cygwin/2006-12/msg00011.html +# for more details. + +# 2007-07-05 +# Passing +# as_ln_s='cp -p' +# isn't sufficient to stop cygwin using symlinks the mingw gcc can't +# follow, as it isn't used consistently. Instead we put an ln.bat in +# path that always fails. + +GMP_TARBALL := $(firstword $(wildcard gmp*.tar.gz)) +GMP_DIR := $(subst .tar.gz,,$(GMP_TARBALL)) +BMP_BUILD_DIR := build + +stamp.gmp: + $(RM) -rf $(GMP_DIR) gmpbuild + $(TAR) -zxf $(GMP_TARBALL) + mv $(GMP_DIR) gmpbuild + chmod +x ln + set -o igncr; export SHELLOPTS; \ + export PATH=`pwd`:$$PATH; \ + cd gmpbuild && \ + CC=$(WhatGccIsCalled) $(SHELL) configure \ + --enable-shared=no --host=$(PLATFORM) --build=$(PLATFORM) + touch $@ + +all :: gmpbuild/libgmp.a + +ifeq "$(DLLized)" "YES" +all :: $(DLL_PEN)/gmp.dll + +$(DLL_PEN)/gmp.dll: + $(MAKE) -C gmpbuild gmp.dll + $(CP) gmpbuild/gmp.dll $(DLL_PEN) +endif + +install :: gmpbuild/libgmp.a + +INSTALL_LIBS += gmpbuild/libgmp.a + +gmpbuild/libgmp.a :: + $(MAKE) -C gmpbuild MAKEFLAGS= + $(CP) gmpbuild/.libs/libgmp.a gmpbuild + $(RANLIB) gmpbuild/libgmp.a +endif +endif + +clean distclean maintainer-clean :: + $(RM) -f stamp.gmp + $(RM) -rf gmpbuild + $(RM) -rf gmpbuild + +#----------------------------------------------------------------------------- +# +# Files to install +# +# Just libHSrts is installed uniformly across ways +# +ifeq "$(DLLized)" "YES" +INSTALL_PROGS += gmpbuild/gmp.dll +INSTALL_LIBS += gmpbuild/libgmp_imp.a +endif + +#----------------------------------------------------------------------------- +# +# binary-dist + +include $(TOP)/mk/target.mk + +binary-dist: + @: +ifneq "$(HaveLibGmp)" "YES" +ifneq "$(HaveFrameworkGMP)" "YES" + $(INSTALL_DIR) $(BIN_DIST_DIR)/gmp + $(INSTALL_DIR) $(BIN_DIST_DIR)/gmp/gmpbuild + touch $(BIN_DIST_DIR)/gmp/$(GMP_TARBALL) + $(INSTALL_DATA) Makefile $(BIN_DIST_DIR)/gmp/ +ifneq "$(INSTALL_PROGS)" "" + $(INSTALL_DATA) $(INSTALL_PROGS) $(BIN_DIST_DIR)/gmp/gmpbuild/ +endif +ifneq "$(INSTALL_LIBS)" "" + $(INSTALL_DATA) $(INSTALL_LIBS) $(BIN_DIST_DIR)/gmp/gmpbuild/ +endif + +endif +endif + diff --git a/gmp/gmp-4.2.1.tar.gz b/gmp/gmp-4.2.1.tar.gz new file mode 100644 index 0000000..4ed0e97 Binary files /dev/null and b/gmp/gmp-4.2.1.tar.gz differ diff --git a/gmp/ln b/gmp/ln new file mode 100644 index 0000000..0040f95 --- /dev/null +++ b/gmp/ln @@ -0,0 +1,2 @@ +exit 1 + diff --git a/includes/Makefile b/includes/Makefile index 4b89d52..e7292cd 100644 --- a/includes/Makefile +++ b/includes/Makefile @@ -12,7 +12,7 @@ H_PLATFORM = ghcplatform.h # # All header files # -H_FILES = $(filter-out gmp.h $(H_CONFIG) $(H_PLATFORM),$(wildcard *.h)) gmp.h +H_FILES = $(filter-out $(H_CONFIG) $(H_PLATFORM),$(wildcard *.h)) ifneq "$(DOING_BIN_DIST)" "YES" @@ -27,20 +27,14 @@ ifeq "$(GhcEnableTablesNextToCode) $(GhcUnregisterised)" "YES NO" SRC_CC_OPTS += -DTABLES_NEXT_TO_CODE endif -SRC_CC_OPTS += -I. -I../rts +SRC_CC_OPTS += -I. -I../rts -I../gmp/gmpbuild ifneq "$(GhcWithSMP)" "YES" SRC_CC_OPTS += -DNOSMP endif -boot :: gmp.h - all :: $(H_CONFIG) $(H_PLATFORM) -# gmp.h is copied from the GMP directory -gmp.h : $(FPTOOLS_TOP)/rts/gmp/gmp.h - $(CP) $< $@ - # The fptools configure script creates the configuration header file and puts it # in fptools/mk/config.h. We copy it down to here (without any PACKAGE_FOO # definitions to avoid clashes), prepending some make variables specifying cpp diff --git a/rts/Makefile b/rts/Makefile index cd96f7f..2c5dcc4 100644 --- a/rts/Makefile +++ b/rts/Makefile @@ -7,9 +7,6 @@ # .hc files are "Haskellized-C", compiled using the C compiler and # (possibly) the assembly-mangler. The GHC driver script # knows how to compile this stuff. -# -# Other sorta independent, compile-once subdirs are: -# gmp -- GNU multi-precision library (for Integer) #----------------------------------------------------------------------------- # Preamble @@ -254,46 +251,6 @@ endif # We use GMP's own configuration stuff, because it's all rather hairy # and not worth re-implementing in our Makefile framework. -ifneq "$(HaveLibGmp)" "YES" -ifneq "$(HaveFrameworkGMP)" "YES" -boot :: - if [ -f gmp/config.status ]; then \ - cd gmp && CC=$(WhatGccIsCalled) ./config.status; \ - else \ - cd gmp && CC=$(WhatGccIsCalled) $(SHELL) configure --enable-shared=no \ - --host=`echo $(HOSTPLATFORM) | sed 's/i[567]86/i486/g'`; \ - fi - -# Slight cheatage here to pass host as target, but x-compilation isn't supported by ghc. - -ifeq "$(way)" "" -all :: gmp/libgmp.a - -ifeq "$(DLLized)" "YES" -all :: $(DLL_PEN)/gmp.dll - -$(DLL_PEN)/gmp.dll: - $(MAKE) -C gmp gmp.dll - $(MV) gmp/gmp.dll $(DLL_PEN) -endif -endif - -install :: gmp/libgmp.a - -ifeq "$(way)" "" -clean distclean maintainer-clean :: - -$(MAKE) -C gmp MAKEFLAGS= $@ - -INSTALL_LIBS += gmp/libgmp.a -endif -endif - -gmp/libgmp.a :: - $(MAKE) -C gmp MAKEFLAGS= - @$(CP) gmp/.libs/libgmp.a gmp - @$(RANLIB) gmp/libgmp.a -endif - CLEAN_FILES += gmp/libgmp.a # Need to get the GMP vars in through CPP to package.conf.in, and put @@ -314,6 +271,11 @@ ifneq "$(GMP_LIB_DIRS)" "" SRC_LD_OPTS += -L$(GMP_LIB_DIRS) endif +SRC_CC_OPTS += -I../gmp/gmpbuild +SRC_HC_OPTS += -I../gmp/gmpbuild +SRC_HSC2HS_OPTS += -I../gmp/gmpbuild +SRC_LD_OPTS += -L../gmp/gmpbuild + #----------------------------------------------------------------------------- # # Building the GUM SysMan diff --git a/rts/gmp/.gdbinit b/rts/gmp/.gdbinit deleted file mode 100644 index 843c109..0000000 --- a/rts/gmp/.gdbinit +++ /dev/null @@ -1,34 +0,0 @@ -# Copyright (C) 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. - - -define pz -set __gmpz_dump ($) -end - -define pq -set __gmpz_dump ($->_mp_num) -echo / -set __gmpz_dump ($->_mp_den) -end - -define pf -set __gmpf_dump ($) -end - diff --git a/rts/gmp/AUTHORS b/rts/gmp/AUTHORS deleted file mode 100644 index 1fa057a..0000000 --- a/rts/gmp/AUTHORS +++ /dev/null @@ -1,12 +0,0 @@ -Authors if GNU MP (in chronological order) -Torbjörn Granlund -John Amanatides -Paul Zimmermann -Ken Weber -Bennet Yee -Andreas Schwab -Robert Harley -Linus Nordberg -Kent Boortz -Kevin Ryde -Guillaume Hanrot diff --git a/rts/gmp/COPYING b/rts/gmp/COPYING deleted file mode 100644 index a6d7d01..0000000 --- a/rts/gmp/COPYING +++ /dev/null @@ -1,336 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Hereny it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Section \ No newline at end of file diff --git a/rts/gmp/COPYING.LIB b/rts/gmp/COPYING.LIB deleted file mode 100644 index c4792dd..0000000 --- a/rts/gmp/COPYING.LIB +++ /dev/null @@ -1,515 +0,0 @@ - - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations -below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. -^L - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it -becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. -^L - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control -compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. -^L - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. -^L - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. -^L - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. -^L - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply, and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License -may add an explicit geographical distribution limitation excluding those -countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. -^L - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS -^L - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms -of the ordinary General Public License). - - To apply these terms, attach the following notices to the library. -It is safest to attach them to the start of each source file to most -effectively convey the exclusion of warranty; and each file should -have at least the "copyright" line and a pointer to where the full -notice is found. - - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Also add information on how to contact you by electronic and paper -mail. - -You should also get your employer (if you work as a programmer) or -your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James -Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - diff --git a/rts/gmp/INSTALL b/rts/gmp/INSTALL deleted file mode 100644 index 62faa1a..0000000 --- a/rts/gmp/INSTALL +++ /dev/null @@ -1,146 +0,0 @@ - - INSTALLING GNU MP - ================= - - -These instructions are only for the impatient. Others should read the install -instructions in the manual, gmp.info. Use - - info -f ./gmp.info - -or in emacs - - C-u C-h i gmp.info - - -Here are some brief instructions on how to install GMP, and some examples to -help you get started using GMP. - -First, you need to compile, and optionally install, GMP. Since you're -impatient, try this: - - ./configure; make - -If that fails, or you care about the performance of GMP, you need to read the -full instructions in the chapter "Installing GMP", in the manual. - -Next, try some small test programs, for example the ones below. - -In GMP programs, all variables need to be initialized before they are -assigned, and cleared out before program flow leaves the scope in which they -were declared. Here is an example program that reads two numbers from the -command line, multiplies them, and prints the result to stdout. - - - #include - #include /* All GMP programs need to include gmp.h */ - - main (int argc, char **argv) - { - mpz_t a, b, p; - - if (argc != 3) - { printf ("Usage: %s \n", argv[0]); exit (1); } - - /* Initialize variables */ - mpz_init (a); - mpz_init (b); - mpz_init (p); - - /* Assign a and b from base 10 strings in argv */ - mpz_set_str (a, argv[1], 10); - mpz_set_str (b, argv[2], 10); - - /* Multiply a and b and put the result in p */ - mpz_mul (p, a, b); - - /* Print p in base 10 */ - mpz_out_str (stdout, 10, p); - fputc ('\n', stdout); - - /* Clear out variables */ - mpz_clear (a); - mpz_clear (b); - mpz_clear (p); - exit (0); - } - - -This might look tedious, with all the initializing and clearing. Fortunately -some of these operations can be combined, and other operations can often be -avoided. An experienced GMP user might write: - - - #include - #include - - main (int argc, char **argv) - { - mpz_t a, b, p; - - if (argc != 3) - { printf ("Usage: %s \n", argv[0]); exit (1); } - - /* Initialize and assign a and b from base 10 strings in argv */ - mpz_init_set_str (a, argv[1], 10); - mpz_init_set_str (b, argv[2], 10); - /* Initialize p */ - mpz_init (p); - - /* Multiply a and b and put the result in p */ - mpz_mul (p, a, b); - - /* Print p in base 10 */ - mpz_out_str (stdout, 10, p); - fputc ('\n', stdout); - - /* Since we're about to exit, no need to clear out variables */ - exit (0); - } - - -Now you have to compile your test program, and link it with the GMP library. -Assuming your working directory is still the gmp source directory, and your -source file is called example.c, enter: - - gcc -g -I. example.c .libs/libgmp.a - -After installing, the command becomes: "gcc -g example.c -lgmp". Also, GMP is -libtool based so you can use that to link if you want. - -Now try to run the example: - - ./a.out 98365871231256752134 319378318340103345227 - 31415926535897932384618573336104570964418 - -The functions used here all operate on signed integers, and have names -starting with "mpz_". There are many more such functions than used in these -examples. See the chapter "Integer Functions" in the manual, for a complete -list. - -There are two other main classes of functions in GMP. They operate on -rational numbers and floating-point numbers, respectively. The chapters -"Rational Number Functions", and "Floating-point Functions" document these -classes. - -To run a set of tests, do "make check". This will take a while. - -To create the printable documentation from the texinfo source, type "make -gmp.dvi" or "make gmp.ps". This requires various "tex" commands. - -To install the library, do "make install" (then you can use -lgmp instead of -.libs/libgmp.a). - -If you decide to use GMP, it is a good idea you at least read the chapter "GMP -Basics" in the manual. - -Some known build problems are noted in the "Installing GMP" chapter of -the manual. Please report other problems to bug-gmp@gnu.org. - - - ----------------- -Local variables: -mode: text -fill-column: 78 -End: diff --git a/rts/gmp/Makefile.am b/rts/gmp/Makefile.am deleted file mode 100644 index b73b805..0000000 --- a/rts/gmp/Makefile.am +++ /dev/null @@ -1,197 +0,0 @@ -## Process this file with automake to generate Makefile.in - - -# Copyright (C) 1991, 1993, 1994, 1996, 1997, 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. - - -# make check -# -# It'd be good if "make check" first did a "make all" or whatever to -# build libgmp.la, but it's not clear how best to do this. Putting a -# "check:" target is overridden by automake, and a "check-local:" runs -# too late (due to depth-first subdirectory processing). For now it's -# necessary to do "make && make check". -# -# MPF_OBJECTS etc -# -# Libtool needs all the .lo files passed to it if it's going to build -# both a static and shared library. If a convenience library like -# mpf/libmpf.la is passed then the resulting libgmp.a gets the PIC .lo -# objects rather than the non-PIC .o's. -# -# Unfortunately this leads to the big lists of objects below. Something -# like mpz/*.lo would probably work, but might risk missing something -# out or getting something extra. The source files for each .lo are -# listed in the Makefile.am's in the subdirectories. - - -# Libtool -version-info for libgmp.la and libmp.la. See (libtool)Versioning -# -# 1. No interfaces changed, only implementations (good): Increment REVISION. -# -# 2. Interfaces added, none removed (good): Increment CURRENT, increment -# AGE, set REVISION to 0. -# -# 3. Interfaces removed (BAD, breaks upward compatibility): Increment -# CURRENT, set AGE and REVISION to 0. -# -# Do this separately for libgmp and libmp, only do it just before a release. -# -# GMP -version-info -# release libgmp libmp -# 2.0.x - - -# 3.0 3:0:0 3:0:0 -# 3.0.1 3:1:0 3:0:0 -# 3.1 4:0:1 4:0:1 -# 3.1.1 4:1:1 4:1:1 -# -# -# Starting at 3:0:0 is a slight abuse of the versioning system, but it -# ensures we're past soname libgmp.so.2, which is what has been used on -# Debian GNU/Linux packages of gmp 2. Pretend gmp 2 was 2:0:0, so the -# interface changes for gmp 3 mean 3:0:0 is right. - -LIBGMP_LT_CURRENT = 4 -LIBGMP_LT_REVISION = 1 -LIBGMP_LT_AGE = 1 - -LIBMP_LT_CURRENT = 4 -LIBMP_LT_REVISION = 1 -LIBMP_LT_AGE = 1 - - -AUTOMAKE_OPTIONS = gnu check-news no-dependencies ansi2knr - -SUBDIRS = mpn mpz mpq mpf mpbsd mpfr tests demos tune - -include_HEADERS = gmp.h $(MPBSD_HEADERS_OPTION) $(MPFR_HEADERS_OPTION) -EXTRA_HEADERS = mp.h - -lib_LTLIBRARIES = libgmp.la $(MPBSD_LTLIBRARIES_OPTION) - -EXTRA_DIST = .gdbinit gmp-impl.h longlong.h stack-alloc.h urandom.h doc macos - -DISTCLEANFILES = asm-syntax.h config.m4 @gmp_srclinks@ - - -MPF_OBJECTS = mpf/init.lo mpf/init2.lo mpf/set.lo mpf/set_ui.lo mpf/set_si.lo \ - mpf/set_str.lo mpf/set_d.lo mpf/set_z.lo mpf/iset.lo mpf/iset_ui.lo \ - mpf/iset_si.lo mpf/iset_str.lo mpf/iset_d.lo mpf/clear.lo mpf/get_str.lo \ - mpf/dump.lo mpf/size.lo mpf/eq.lo mpf/reldiff.lo mpf/sqrt.lo mpf/random2.lo \ - mpf/inp_str.lo mpf/out_str.lo mpf/add.lo mpf/add_ui.lo mpf/sub.lo \ - mpf/sub_ui.lo mpf/ui_sub.lo mpf/mul.lo mpf/mul_ui.lo mpf/div.lo \ - mpf/div_ui.lo mpf/cmp.lo mpf/cmp_ui.lo mpf/cmp_si.lo mpf/mul_2exp.lo \ - mpf/div_2exp.lo mpf/abs.lo mpf/neg.lo mpf/set_q.lo mpf/get_d.lo \ - mpf/set_dfl_prec.lo mpf/set_prc.lo mpf/set_prc_raw.lo mpf/get_prc.lo \ - mpf/ui_div.lo mpf/sqrt_ui.lo mpf/floor.lo mpf/ceil.lo mpf/trunc.lo \ - mpf/pow_ui.lo mpf/urandomb.lo mpf/swap.lo -MPZ_OBJECTS = mpz/abs.lo mpz/add.lo mpz/add_ui.lo mpz/addmul_ui.lo mpz/and.lo \ - mpz/array_init.lo mpz/bin_ui.lo mpz/bin_uiui.lo mpz/cdiv_q.lo \ - mpz/cdiv_q_ui.lo mpz/cdiv_qr.lo mpz/cdiv_qr_ui.lo mpz/cdiv_r.lo \ - mpz/cdiv_r_ui.lo mpz/cdiv_ui.lo mpz/clear.lo mpz/clrbit.lo mpz/cmp.lo \ - mpz/cmp_si.lo mpz/cmp_ui.lo mpz/cmpabs.lo mpz/cmpabs_ui.lo mpz/com.lo \ - mpz/divexact.lo mpz/dump.lo mpz/fac_ui.lo mpz/fdiv_q.lo mpz/fdiv_q_2exp.lo \ - mpz/fdiv_q_ui.lo mpz/fdiv_qr.lo mpz/fdiv_qr_ui.lo mpz/fdiv_r.lo \ - mpz/fdiv_r_2exp.lo mpz/fdiv_r_ui.lo mpz/fdiv_ui.lo mpz/fib_ui.lo \ - mpz/fits_sint_p.lo mpz/fits_slong_p.lo mpz/fits_sshort_p.lo \ - mpz/fits_uint_p.lo mpz/fits_ulong_p.lo mpz/fits_ushort_p.lo mpz/gcd.lo \ - mpz/gcd_ui.lo mpz/gcdext.lo mpz/get_d.lo mpz/get_si.lo mpz/get_str.lo \ - mpz/get_ui.lo mpz/getlimbn.lo mpz/hamdist.lo mpz/init.lo mpz/inp_raw.lo \ - mpz/inp_str.lo mpz/invert.lo mpz/ior.lo mpz/iset.lo mpz/iset_d.lo \ - mpz/iset_si.lo mpz/iset_str.lo mpz/iset_ui.lo mpz/jacobi.lo \ - mpz/kronsz.lo mpz/kronuz.lo mpz/kronzs.lo mpz/kronzu.lo \ - mpz/lcm.lo mpz/legendre.lo \ - mpz/mod.lo mpz/mul.lo mpz/mul_2exp.lo mpz/mul_si.lo mpz/mul_ui.lo \ - mpz/neg.lo mpz/nextprime.lo mpz/out_raw.lo mpz/out_str.lo mpz/perfpow.lo mpz/perfsqr.lo \ - mpz/popcount.lo mpz/pow_ui.lo mpz/powm.lo mpz/powm_ui.lo mpz/pprime_p.lo \ - mpz/random.lo mpz/random2.lo mpz/realloc.lo mpz/remove.lo mpz/root.lo \ - mpz/rrandomb.lo \ - mpz/scan0.lo mpz/scan1.lo mpz/set.lo mpz/set_d.lo mpz/set_f.lo mpz/set_q.lo \ - mpz/set_si.lo mpz/set_str.lo mpz/set_ui.lo mpz/setbit.lo mpz/size.lo \ - mpz/sizeinbase.lo mpz/sqrt.lo mpz/sqrtrem.lo mpz/sub.lo mpz/sub_ui.lo \ - mpz/swap.lo mpz/tdiv_ui.lo mpz/tdiv_q.lo mpz/tdiv_q_2exp.lo mpz/tdiv_q_ui.lo \ - mpz/tdiv_qr.lo mpz/tdiv_qr_ui.lo mpz/tdiv_r.lo mpz/tdiv_r_2exp.lo \ - mpz/tdiv_r_ui.lo mpz/tstbit.lo mpz/ui_pow_ui.lo mpz/urandomb.lo \ - mpz/urandomm.lo mpz/xor.lo -MPQ_OBJECTS = mpq/add.lo mpq/canonicalize.lo mpq/clear.lo mpq/cmp.lo \ - mpq/cmp_ui.lo mpq/div.lo mpq/get_d.lo mpq/get_den.lo mpq/get_num.lo \ - mpq/init.lo mpq/inv.lo mpq/mul.lo mpq/neg.lo mpq/out_str.lo \ - mpq/set.lo mpq/set_den.lo \ - mpq/set_num.lo mpq/set_si.lo mpq/set_ui.lo mpq/sub.lo mpq/equal.lo \ - mpq/set_z.lo mpq/set_d.lo mpq/swap.lo -MPN_OBJECTS = @mpn_objs_in_libgmp@ - -MPBSD_OBJECTS = mpbsd/add.lo mpbsd/tdiv_qr.lo mpbsd/move.lo mpbsd/powm.lo \ - mpbsd/sub.lo mpbsd/cmp.lo mpbsd/mfree.lo mpbsd/mtox.lo mpbsd/realloc.lo \ - mpbsd/gcd.lo mpbsd/itom.lo mpbsd/min.lo mpbsd/mul.lo mpbsd/mout.lo \ - mpbsd/pow_ui.lo mpbsd/sdiv.lo mpbsd/sqrtrem.lo mpbsd/xtom.lo - -# FIXME: Add mpfr/rnd_mode.lo when it's clean. -MPFR_OBJECTS = mpfr/add.lo mpfr/div_2exp.lo mpfr/neg.lo mpfr/set_dfl_prec.lo \ - mpfr/set_str_raw.lo mpfr/agm.lo mpfr/get_str.lo mpfr/print_raw.lo \ - mpfr/set_dfl_rnd.lo mpfr/sqrt.lo mpfr/clear.lo mpfr/init.lo \ - mpfr/set_f.lo mpfr/sub.lo mpfr/cmp.lo mpfr/mul.lo mpfr/round.lo \ - mpfr/set_prec.lo mpfr/cmp_ui.lo mpfr/mul_2exp.lo mpfr/set.lo mpfr/set_si.lo \ - mpfr/div.lo mpfr/mul_ui.lo mpfr/set_d.lo mpfr/pow.lo mpfr/out_str.lo \ - mpfr/pi.lo mpfr/set_z.lo mpfr/add_ulp.lo mpfr/log2.lo mpfr/random.lo \ - mpfr/log.lo mpfr/exp.lo mpfr/div_ui.lo mpfr/zeta.lo mpfr/karadiv.lo \ - mpfr/karasqrt.lo mpfr/print_rnd_mode.lo - - -if WANT_MPFR -MPFR_HEADERS_OPTION = mpfr/mpfr.h -MPFR_OBJECTS_OPTION = $(MPFR_OBJECTS) -MPFR_LIBADD_OPTION = -lm -endif -libgmp_la_SOURCES = assert.c compat.c errno.c memory.c mp_set_fns.c \ - mp_clz_tab.c mp_minv_tab.c \ - rand.c randclr.c randlc.c randlc2x.c randraw.c randsd.c \ - randsdui.c version.c stack-alloc.c mp_bpl.c extract-dbl.c insert-dbl.c -libgmp_la_DEPENDENCIES = \ - $(MPF_OBJECTS) $(MPZ_OBJECTS) $(MPN_OBJECTS) $(MPQ_OBJECTS) \ - $(MPFR_OBJECTS_OPTION) -libgmp_la_LIBADD = $(libgmp_la_DEPENDENCIES) $(MPFR_LIBADD_OPTION) -libgmp_la_LDFLAGS = \ - -version-info $(LIBGMP_LT_CURRENT):$(LIBGMP_LT_REVISION):$(LIBGMP_LT_AGE) - - -if WANT_MPBSD -MPBSD_HEADERS_OPTION = mp.h -MPBSD_LTLIBRARIES_OPTION = libmp.la -endif -libmp_la_SOURCES = assert.c errno.c memory.c mp_bpl.c mp_clz_tab.c \ - mp_minv_tab.c mp_set_fns.c stack-alloc.c -libmp_la_DEPENDENCIES = $(MPBSD_OBJECTS) $(MPN_OBJECTS) \ - mpz/add.lo mpz/clear.lo mpz/cmp.lo mpz/init.lo mpz/mod.lo mpz/mul.lo \ - mpz/mul_2exp.lo mpz/realloc.lo mpz/set.lo mpz/set_ui.lo mpz/tdiv_r.lo \ - mpz/sub.lo -libmp_la_LIBADD = $(libmp_la_DEPENDENCIES) -libmp_la_LDFLAGS = \ - -version-info $(LIBMP_LT_CURRENT):$(LIBMP_LT_REVISION):$(LIBMP_LT_AGE) - - -info_TEXINFOS = gmp.texi - - -# Don't ship CVS directories or emacs backups. -dist-hook: - -find $(distdir) \( -name CVS -type d \) -o -name "*.~*" \ - | xargs rm -rf diff --git a/rts/gmp/Makefile.in b/rts/gmp/Makefile.in deleted file mode 100644 index e63383e..0000000 --- a/rts/gmp/Makefile.in +++ /dev/null @@ -1,932 +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) 1991, 1993, 1994, 1996, 1997, 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. - -# make check -# -# It'd be good if "make check" first did a "make all" or whatever to -# build libgmp.la, but it's not clear how best to do this. Putting a -# "check:" target is overridden by automake, and a "check-local:" runs -# too late (due to depth-first subdirectory processing). For now it's -# necessary to do "make && make check". -# -# MPF_OBJECTS etc -# -# Libtool needs all the .lo files passed to it if it's going to build -# both a static and shared library. If a convenience library like -# mpf/libmpf.la is passed then the resulting libgmp.a gets the PIC .lo -# objects rather than the non-PIC .o's. -# -# Unfortunately this leads to the big lists of objects below. Something -# like mpz/*.lo would probably work, but might risk missing something -# out or getting something extra. The source files for each .lo are -# listed in the Makefile.am's in the subdirectories. - -# Libtool -version-info for libgmp.la and libmp.la. See (libtool)Versioning -# -# 1. No interfaces changed, only implementations (good): Increment REVISION. -# -# 2. Interfaces added, none removed (good): Increment CURRENT, increment -# AGE, set REVISION to 0. -# -# 3. Interfaces removed (BAD, breaks upward compatibility): Increment -# CURRENT, set AGE and REVISION to 0. -# -# Do this separately for libgmp and libmp, only do it just before a release. -# -# GMP -version-info -# release libgmp libmp -# 2.0.x - - -# 3.0 3:0:0 3:0:0 -# 3.0.1 3:1:0 3:0:0 -# 3.1 4:0:1 4:0:1 -# 3.1.1 4:1:1 4:1:1 -# -# -# Starting at 3:0:0 is a slight abuse of the versioning system, but it -# ensures we're past soname libgmp.so.2, which is what has been used on -# Debian GNU/Linux packages of gmp 2. Pretend gmp 2 was 2:0:0, so the -# interface changes for gmp 3 mean 3:0:0 is right. - - -LIBGMP_LT_CURRENT = 4 -LIBGMP_LT_REVISION = 1 -LIBGMP_LT_AGE = 1 - -LIBMP_LT_CURRENT = 4 -LIBMP_LT_REVISION = 1 -LIBMP_LT_AGE = 1 - -AUTOMAKE_OPTIONS = gnu check-news no-dependencies ansi2knr - -SUBDIRS = mpn mpz - -include_HEADERS = gmp.h $(MPBSD_HEADERS_OPTION) $(MPFR_HEADERS_OPTION) -EXTRA_HEADERS = mp.h - -lib_LTLIBRARIES = libgmp.la $(MPBSD_LTLIBRARIES_OPTION) - -EXTRA_DIST = .gdbinit gmp-impl.h longlong.h stack-alloc.h urandom.h doc macos - -DISTCLEANFILES = asm-syntax.h config.m4 @gmp_srclinks@ - -MPZ_OBJECTS = mpz/abs.lo mpz/add.lo mpz/add_ui.lo mpz/addmul_ui.lo mpz/and.lo \ - mpz/array_init.lo mpz/bin_ui.lo mpz/bin_uiui.lo mpz/cdiv_q.lo \ - mpz/cdiv_q_ui.lo mpz/cdiv_qr.lo mpz/cdiv_qr_ui.lo mpz/cdiv_r.lo \ - mpz/cdiv_r_ui.lo mpz/cdiv_ui.lo mpz/clear.lo mpz/clrbit.lo mpz/cmp.lo \ - mpz/cmp_si.lo mpz/cmp_ui.lo mpz/cmpabs.lo mpz/cmpabs_ui.lo mpz/com.lo \ - mpz/divexact.lo mpz/dump.lo mpz/fac_ui.lo mpz/fdiv_q.lo mpz/fdiv_q_2exp.lo \ - mpz/fdiv_q_ui.lo mpz/fdiv_qr.lo mpz/fdiv_qr_ui.lo mpz/fdiv_r.lo \ - mpz/fdiv_r_2exp.lo mpz/fdiv_r_ui.lo mpz/fdiv_ui.lo mpz/fib_ui.lo \ - mpz/fits_sint_p.lo mpz/fits_slong_p.lo mpz/fits_sshort_p.lo \ - mpz/fits_uint_p.lo mpz/fits_ulong_p.lo mpz/fits_ushort_p.lo mpz/gcd.lo \ - mpz/gcd_ui.lo mpz/gcdext.lo mpz/get_d.lo mpz/get_si.lo mpz/get_str.lo \ - mpz/get_ui.lo mpz/getlimbn.lo mpz/hamdist.lo mpz/init.lo mpz/inp_raw.lo \ - mpz/inp_str.lo mpz/invert.lo mpz/ior.lo mpz/iset.lo mpz/iset_d.lo \ - mpz/iset_si.lo mpz/iset_str.lo mpz/iset_ui.lo mpz/jacobi.lo \ - mpz/kronsz.lo mpz/kronuz.lo mpz/kronzs.lo mpz/kronzu.lo \ - mpz/lcm.lo mpz/legendre.lo \ - mpz/mod.lo mpz/mul.lo mpz/mul_2exp.lo mpz/mul_si.lo mpz/mul_ui.lo \ - mpz/neg.lo mpz/nextprime.lo mpz/out_raw.lo mpz/out_str.lo mpz/perfpow.lo mpz/perfsqr.lo \ - mpz/popcount.lo mpz/pow_ui.lo mpz/powm.lo mpz/powm_ui.lo mpz/pprime_p.lo \ - mpz/random.lo mpz/random2.lo mpz/realloc.lo mpz/remove.lo mpz/root.lo \ - mpz/rrandomb.lo \ - mpz/scan0.lo mpz/scan1.lo mpz/set.lo mpz/set_d.lo mpz/set_f.lo mpz/set_q.lo \ - mpz/set_si.lo mpz/set_str.lo mpz/set_ui.lo mpz/setbit.lo mpz/size.lo \ - mpz/sizeinbase.lo mpz/sqrt.lo mpz/sqrtrem.lo mpz/sub.lo mpz/sub_ui.lo \ - mpz/swap.lo mpz/tdiv_ui.lo mpz/tdiv_q.lo mpz/tdiv_q_2exp.lo mpz/tdiv_q_ui.lo \ - mpz/tdiv_qr.lo mpz/tdiv_qr_ui.lo mpz/tdiv_r.lo mpz/tdiv_r_2exp.lo \ - mpz/tdiv_r_ui.lo mpz/tstbit.lo mpz/ui_pow_ui.lo mpz/urandomb.lo \ - mpz/urandomm.lo mpz/xor.lo - -MPN_OBJECTS = @mpn_objs_in_libgmp@ - -MPBSD_OBJECTS = mpbsd/add.lo mpbsd/tdiv_qr.lo mpbsd/move.lo mpbsd/powm.lo \ - mpbsd/sub.lo mpbsd/cmp.lo mpbsd/mfree.lo mpbsd/mtox.lo mpbsd/realloc.lo \ - mpbsd/gcd.lo mpbsd/itom.lo mpbsd/min.lo mpbsd/mul.lo mpbsd/mout.lo \ - mpbsd/pow_ui.lo mpbsd/sdiv.lo mpbsd/sqrtrem.lo mpbsd/xtom.lo - - - -@WANT_MPFR_TRUE@MPFR_HEADERS_OPTION = @WANT_MPFR_TRUE@mpfr/mpfr.h -@WANT_MPFR_TRUE@MPFR_OBJECTS_OPTION = @WANT_MPFR_TRUE@$(MPFR_OBJECTS) -@WANT_MPFR_TRUE@MPFR_LIBADD_OPTION = @WANT_MPFR_TRUE@-lm -libgmp_la_SOURCES = assert.c compat.c errno.c memory.c mp_set_fns.c \ - mp_clz_tab.c mp_minv_tab.c \ - version.c stack-alloc.c mp_bpl.c extract-dbl.c insert-dbl.c - -libgmp_la_DEPENDENCIES = \ - $(MPF_OBJECTS) $(MPZ_OBJECTS) $(MPN_OBJECTS) $(MPQ_OBJECTS) \ - $(MPFR_OBJECTS_OPTION) - -libgmp_la_LIBADD = $(libgmp_la_DEPENDENCIES) $(MPFR_LIBADD_OPTION) -libgmp_la_LDFLAGS = \ - -version-info $(LIBGMP_LT_CURRENT):$(LIBGMP_LT_REVISION):$(LIBGMP_LT_AGE) - - -@WANT_MPBSD_TRUE@MPBSD_HEADERS_OPTION = @WANT_MPBSD_TRUE@mp.h -@WANT_MPBSD_TRUE@MPBSD_LTLIBRARIES_OPTION = @WANT_MPBSD_TRUE@libmp.la -libmp_la_SOURCES = assert.c errno.c memory.c mp_bpl.c mp_clz_tab.c \ - mp_minv_tab.c mp_set_fns.c stack-alloc.c - -libmp_la_DEPENDENCIES = $(MPBSD_OBJECTS) $(MPN_OBJECTS) \ - mpz/add.lo mpz/clear.lo mpz/cmp.lo mpz/init.lo mpz/mod.lo mpz/mul.lo \ - mpz/mul_2exp.lo mpz/realloc.lo mpz/set.lo mpz/set_ui.lo mpz/tdiv_r.lo \ - mpz/sub.lo - -libmp_la_LIBADD = $(libmp_la_DEPENDENCIES) -libmp_la_LDFLAGS = \ - -version-info $(LIBMP_LT_CURRENT):$(LIBMP_LT_REVISION):$(LIBMP_LT_AGE) - - -info_TEXINFOS = gmp.texi -subdir = . -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs -CONFIG_HEADER = config.h -CONFIG_CLEAN_FILES = -LTLIBRARIES = $(lib_LTLIBRARIES) - - -DEFS = @DEFS@ -I. -I$(srcdir) -I. -CPPFLAGS = @CPPFLAGS@ -LDFLAGS = @LDFLAGS@ -LIBS = @LIBS@ -ANSI2KNR = @ANSI2KNR@ -am_libgmp_la_OBJECTS = assert$U.lo compat$U.lo errno$U.lo memory$U.lo \ -mp_set_fns$U.lo mp_clz_tab$U.lo mp_minv_tab$U.lo rand$U.lo randclr$U.lo \ -randlc$U.lo randlc2x$U.lo randraw$U.lo randsd$U.lo randsdui$U.lo \ -version$U.lo stack-alloc$U.lo mp_bpl$U.lo extract-dbl$U.lo \ -insert-dbl$U.lo -libgmp_la_OBJECTS = $(am_libgmp_la_OBJECTS) -am_libmp_la_OBJECTS = assert$U.lo errno$U.lo memory$U.lo mp_bpl$U.lo \ -mp_clz_tab$U.lo mp_minv_tab$U.lo mp_set_fns$U.lo stack-alloc$U.lo -libmp_la_OBJECTS = $(am_libmp_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 = $(libgmp_la_SOURCES) $(libmp_la_SOURCES) -TEXI2DVI = texi2dvi -# INFO_DEPS = gmp.info -DVIS = gmp.dvi -TEXINFOS = gmp.texi -HEADERS = $(include_HEADERS) - -DIST_COMMON = README $(EXTRA_HEADERS) $(include_HEADERS) ./stamp-h.in \ -AUTHORS COPYING COPYING.LIB ChangeLog INSTALL Makefile.am Makefile.in \ -NEWS acconfig.h acinclude.m4 aclocal.m4 ansi2knr.1 ansi2knr.c \ -config.guess config.in config.sub configure configure.in depcomp \ -install-sh ltconfig ltmain.sh mdate-sh missing mkinstalldirs stamp-vti \ -texinfo.tex version.texi - - -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) - -GZIP_ENV = --best -depcomp = -SOURCES = $(libgmp_la_SOURCES) $(libmp_la_SOURCES) -OBJECTS = $(am_libgmp_la_OBJECTS) $(am_libmp_la_OBJECTS) - -all: all-redirect -.SUFFIXES: -.SUFFIXES: .c .dvi .info .lo .o .obj .ps .texi .texinfo .txi -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) - cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile - -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - cd $(top_builddir) \ - && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status - -$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ configure.in acinclude.m4 - cd $(srcdir) && $(ACLOCAL) - -config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - $(SHELL) ./config.status --recheck -$(srcdir)/configure: @MAINTAINER_MODE_TRUE@$(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES) - cd $(srcdir) && $(AUTOCONF) - -config.h: stamp-h - @if test ! -f $@; then \ - rm -f stamp-h; \ - $(MAKE) stamp-h; \ - else :; fi -stamp-h: $(srcdir)/config.in $(top_builddir)/config.status - @rm -f stamp-h stamp-hT - @echo timestamp > stamp-hT 2> /dev/null - cd $(top_builddir) \ - && CONFIG_FILES= CONFIG_HEADERS=config.h:config.in \ - $(SHELL) ./config.status - @mv stamp-hT stamp-h -$(srcdir)/config.in: @MAINTAINER_MODE_TRUE@$(srcdir)/./stamp-h.in - @if test ! -f $@; then \ - rm -f $(srcdir)/./stamp-h.in; \ - $(MAKE) $(srcdir)/./stamp-h.in; \ - else :; fi -$(srcdir)/./stamp-h.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) acconfig.h - @rm -f $(srcdir)/./stamp-h.in $(srcdir)/./stamp-h.inT - @echo timestamp > $(srcdir)/./stamp-h.inT 2> /dev/null - cd $(top_srcdir) && $(AUTOHEADER) - @mv $(srcdir)/./stamp-h.inT $(srcdir)/./stamp-h.in - -mostlyclean-hdr: - -clean-hdr: - -distclean-hdr: - -rm -f config.h - -maintainer-clean-hdr: - -mostlyclean-libLTLIBRARIES: - -clean-libLTLIBRARIES: - -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) - -distclean-libLTLIBRARIES: - -maintainer-clean-libLTLIBRARIES: - -install-libLTLIBRARIES: $(lib_LTLIBRARIES) - @$(NORMAL_INSTALL) - $(mkinstalldirs) $(DESTDIR)$(libdir) - @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ - if test -f $$p; then \ - echo " $(LIBTOOL) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$p $(DESTDIR)$(libdir)/$$p"; \ - $(LIBTOOL) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$p $(DESTDIR)$(libdir)/$$p; \ - else :; fi; \ - done - -uninstall-libLTLIBRARIES: - @$(NORMAL_UNINSTALL) - @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ - echo " $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(libdir)/$$p"; \ - $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(libdir)/$$p; \ - done - -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: - -mostlyclean-krextra: - -clean-krextra: - -rm -f ansi2knr - -distclean-krextra: - -maintainer-clean-krextra: -ansi2knr: ansi2knr.$(OBJEXT) - $(LINK) ansi2knr.$(OBJEXT) $(LIBS) -ansi2knr.$(OBJEXT): $(CONFIG_HEADER) - - -mostlyclean-kr: - -rm -f *_.c - -clean-kr: - -distclean-kr: - -maintainer-clean-kr: - -gmp.dll: libgmp.a - dllwrap -mno-cygwin --target=i386-unknown-mingw32 \ - --export-all --dllname gmp.dll --output-lib=libgmp_imp.a \ - -o gmp.dll libgmp.a - -libgmp.la: $(libgmp_la_OBJECTS) $(libgmp_la_DEPENDENCIES) - $(LINK) -rpath $(libdir) $(libgmp_la_LDFLAGS) $(libgmp_la_OBJECTS) $(libgmp_la_LIBADD) $(LIBS) - -libmp.la: $(libmp_la_OBJECTS) $(libmp_la_DEPENDENCIES) - $(LINK) -rpath $(libdir) $(libmp_la_LDFLAGS) $(libmp_la_OBJECTS) $(libmp_la_LIBADD) $(LIBS) -.c.o: - $(COMPILE) -c $< -.c.obj: - $(COMPILE) -c `cygpath -w $<` -.c.lo: - $(LTCOMPILE) -c -o $@ $< -assert_.c: assert.c $(ANSI2KNR) - $(CPP) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/assert.c; then echo $(srcdir)/assert.c; else echo assert.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > assert_.c -compat_.c: compat.c $(ANSI2KNR) - $(CPP) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/compat.c; then echo $(srcdir)/compat.c; else echo compat.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > compat_.c -errno_.c: errno.c $(ANSI2KNR) - $(CPP) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/errno.c; then echo $(srcdir)/errno.c; else echo errno.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > errno_.c -extract-dbl_.c: extract-dbl.c $(ANSI2KNR) - $(CPP) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/extract-dbl.c; then echo $(srcdir)/extract-dbl.c; else echo extract-dbl.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > extract-dbl_.c -insert-dbl_.c: insert-dbl.c $(ANSI2KNR) - $(CPP) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/insert-dbl.c; then echo $(srcdir)/insert-dbl.c; else echo insert-dbl.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > insert-dbl_.c -memory_.c: memory.c $(ANSI2KNR) - $(CPP) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/memory.c; then echo $(srcdir)/memory.c; else echo memory.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > memory_.c -mp_bpl_.c: mp_bpl.c $(ANSI2KNR) - $(CPP) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/mp_bpl.c; then echo $(srcdir)/mp_bpl.c; else echo mp_bpl.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > mp_bpl_.c -mp_clz_tab_.c: mp_clz_tab.c $(ANSI2KNR) - $(CPP) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/mp_clz_tab.c; then echo $(srcdir)/mp_clz_tab.c; else echo mp_clz_tab.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > mp_clz_tab_.c -mp_minv_tab_.c: mp_minv_tab.c $(ANSI2KNR) - $(CPP) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/mp_minv_tab.c; then echo $(srcdir)/mp_minv_tab.c; else echo mp_minv_tab.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > mp_minv_tab_.c -mp_set_fns_.c: mp_set_fns.c $(ANSI2KNR) - $(CPP) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/mp_set_fns.c; then echo $(srcdir)/mp_set_fns.c; else echo mp_set_fns.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > mp_set_fns_.c -rand_.c: rand.c $(ANSI2KNR) - $(CPP) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/rand.c; then echo $(srcdir)/rand.c; else echo rand.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > rand_.c -randclr_.c: randclr.c $(ANSI2KNR) - $(CPP) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/randclr.c; then echo $(srcdir)/randclr.c; else echo randclr.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > randclr_.c -randlc_.c: randlc.c $(ANSI2KNR) - $(CPP) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/randlc.c; then echo $(srcdir)/randlc.c; else echo randlc.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > randlc_.c -randlc2x_.c: randlc2x.c $(ANSI2KNR) - $(CPP) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/randlc2x.c; then echo $(srcdir)/randlc2x.c; else echo randlc2x.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > randlc2x_.c -randraw_.c: randraw.c $(ANSI2KNR) - $(CPP) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/randraw.c; then echo $(srcdir)/randraw.c; else echo randraw.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > randraw_.c -randsd_.c: randsd.c $(ANSI2KNR) - $(CPP) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/randsd.c; then echo $(srcdir)/randsd.c; else echo randsd.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > randsd_.c -randsdui_.c: randsdui.c $(ANSI2KNR) - $(CPP) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/randsdui.c; then echo $(srcdir)/randsdui.c; else echo randsdui.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > randsdui_.c -stack-alloc_.c: stack-alloc.c $(ANSI2KNR) - $(CPP) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/stack-alloc.c; then echo $(srcdir)/stack-alloc.c; else echo stack-alloc.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > stack-alloc_.c -version_.c: version.c $(ANSI2KNR) - $(CPP) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/version.c; then echo $(srcdir)/version.c; else echo version.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > version_.c -assert_.$(OBJEXT) assert_.lo compat_.$(OBJEXT) compat_.lo \ -errno_.$(OBJEXT) errno_.lo extract-dbl_.$(OBJEXT) extract-dbl_.lo \ -insert-dbl_.$(OBJEXT) insert-dbl_.lo memory_.$(OBJEXT) memory_.lo \ -mp_bpl_.$(OBJEXT) mp_bpl_.lo mp_clz_tab_.$(OBJEXT) mp_clz_tab_.lo \ -mp_minv_tab_.$(OBJEXT) mp_minv_tab_.lo mp_set_fns_.$(OBJEXT) \ -mp_set_fns_.lo rand_.$(OBJEXT) rand_.lo randclr_.$(OBJEXT) randclr_.lo \ -randlc_.$(OBJEXT) randlc_.lo randlc2x_.$(OBJEXT) randlc2x_.lo \ -randraw_.$(OBJEXT) randraw_.lo randsd_.$(OBJEXT) randsd_.lo \ -randsdui_.$(OBJEXT) randsdui_.lo stack-alloc_.$(OBJEXT) stack-alloc_.lo \ -version_.$(OBJEXT) version_.lo : $(ANSI2KNR) - -$(srcdir)/version.texi: @MAINTAINER_MODE_TRUE@stamp-vti - @: - -$(srcdir)/stamp-vti: gmp.texi $(top_srcdir)/configure.in - @echo "@set UPDATED `$(SHELL) $(srcdir)/mdate-sh $(srcdir)/gmp.texi`" > vti.tmp - @echo "@set EDITION $(VERSION)" >> vti.tmp - @echo "@set VERSION $(VERSION)" >> vti.tmp - @cmp -s vti.tmp $(srcdir)/version.texi \ - || (echo "Updating $(srcdir)/version.texi"; \ - cp vti.tmp $(srcdir)/version.texi) - -@rm -f vti.tmp - @cp $(srcdir)/version.texi $@ - -mostlyclean-vti: - -rm -f vti.tmp - -clean-vti: - -distclean-vti: - -maintainer-clean-vti: - -@MAINTAINER_MODE_TRUE@rm -f $(srcdir)/stamp-vti $(srcdir)/version.texi - -# gmp.info: gmp.texi version.texi -# gmp.dvi: gmp.texi version.texi - - -DVIPS = dvips - -.texi.info: - @cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9] - cd $(srcdir) \ - && $(MAKEINFO) `echo $< | sed 's,.*/,,'` - -.texi.dvi: - TEXINPUTS=$(srcdir):$$TEXINPUTS \ - MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) $< - -.texi: - @cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9] - cd $(srcdir) \ - && $(MAKEINFO) `echo $< | sed 's,.*/,,'` - -.texinfo.info: - @cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9] - cd $(srcdir) \ - && $(MAKEINFO) `echo $< | sed 's,.*/,,'` - -.texinfo: - @cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9] - cd $(srcdir) \ - && $(MAKEINFO) `echo $< | sed 's,.*/,,'` - -.texinfo.dvi: - TEXINPUTS=$(srcdir):$$TEXINPUTS \ - MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) $< - -.txi.info: - @cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9] - cd $(srcdir) \ - && $(MAKEINFO) `echo $< | sed 's,.*/,,'` - -.txi.dvi: - TEXINPUTS=$(srcdir):$$TEXINPUTS \ - MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) $< - -.txi: - @cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9] - cd $(srcdir) \ - && $(MAKEINFO) `echo $< | sed 's,.*/,,'` -.dvi.ps: - $(DVIPS) $< -o $@ - -install-info-am: $(INFO_DEPS) - @$(NORMAL_INSTALL) - $(mkinstalldirs) $(DESTDIR)$(infodir) - @list='$(INFO_DEPS)'; \ - for file in $$list; do \ - d=$(srcdir); \ - for ifile in `CDPATH=: && cd $$d && echo $$file $$file-[0-9] $$file-[0-9][0-9]`; do \ - if test -f $$d/$$ifile; then \ - echo " $(INSTALL_DATA) $$d/$$ifile $(DESTDIR)$(infodir)/$$ifile"; \ - $(INSTALL_DATA) $$d/$$ifile $(DESTDIR)$(infodir)/$$ifile; \ - else : ; fi; \ - done; \ - done - @$(POST_INSTALL) - @if $(SHELL) -c 'install-info --version | sed 1q | fgrep -s -v -i debian' >/dev/null 2>&1; then \ - list='$(INFO_DEPS)'; \ - for file in $$list; do \ - echo " install-info --info-dir=$(DESTDIR)$(infodir) $(DESTDIR)$(infodir)/$$file";\ - install-info --info-dir=$(DESTDIR)$(infodir) $(DESTDIR)$(infodir)/$$file || :;\ - done; \ - else : ; fi - -uninstall-info: - $(PRE_UNINSTALL) - @if $(SHELL) -c 'install-info --version | sed 1q | fgrep -s -v -i debian' >/dev/null 2>&1; then \ - list='$(INFO_DEPS)'; \ - for file in $$list; do \ - echo " install-info --info-dir=$(DESTDIR)$(infodir) --remove $(DESTDIR)$(infodir)/$$file"; \ - install-info --info-dir=$(DESTDIR)$(infodir) --remove $(DESTDIR)$(infodir)/$$file; \ - done; \ - else :; fi - @$(NORMAL_UNINSTALL) - @list='$(INFO_DEPS)'; \ - for file in $$list; do \ - (if cd $(DESTDIR)$(infodir); then \ - echo " rm -f $$file $$file-[0-9] $$file-[0-9][0-9])"; \ - rm -f $$file $$file-[0-9] $$file-[0-9][0-9]; \ - else :; fi); \ - done - -dist-info: $(INFO_DEPS) - list='$(INFO_DEPS)'; \ - for base in $$list; do \ - d=$(srcdir); \ - for file in `CDPATH=: && cd $$d && eval echo $$base*`; do \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file; \ - done; \ - done - -mostlyclean-aminfo: - -rm -f gmp.aux gmp.cp gmp.cps gmp.dvi gmp.fn gmp.fns gmp.pgs gmp.ky \ - gmp.kys gmp.ps gmp.log gmp.pg gmp.toc gmp.tp gmp.tps gmp.vr \ - gmp.vrs gmp.op gmp.tr gmp.cv gmp.cn gmp.cm gmp.ov - -clean-aminfo: - -distclean-aminfo: - -maintainer-clean-aminfo: - cd $(srcdir) && for i in $(INFO_DEPS); do \ - rm -f $$i; \ - if test "`echo $$i-[0-9]*`" != "$$i-[0-9]*"; then \ - rm -f $$i-[0-9]*; \ - fi; \ - done - -install-includeHEADERS: $(include_HEADERS) - @$(NORMAL_INSTALL) - $(mkinstalldirs) $(DESTDIR)$(includedir) - @list='$(include_HEADERS)'; for p in $$list; do \ - if test -f "$$p"; then d= ; else d="$(srcdir)/"; fi; \ - f="`echo $$p | sed -e 's|^.*/||'`"; \ - echo " $(INSTALL_DATA) $$d$$p $(DESTDIR)$(includedir)/$$f"; \ - $(INSTALL_DATA) $$d$$p $(DESTDIR)$(includedir)/$$f; \ - done - -uninstall-includeHEADERS: - @$(NORMAL_UNINSTALL) - @list='$(include_HEADERS)'; for p in $$list; do \ - f="`echo $$p | sed -e 's|^.*/||'`"; \ - echo " rm -f $(DESTDIR)$(includedir)/$$f"; \ - rm -f $(DESTDIR)$(includedir)/$$f; \ - done - -# 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) config.in $(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)config.in$$unique$(LISP)$$tags" \ - || etags $(ETAGS_ARGS) $$tags config.in $$unique $(LISP) - -mostlyclean-tags: - -clean-tags: - -distclean-tags: - -rm -f TAGS ID - -maintainer-clean-tags: - -distdir = $(PACKAGE)-$(VERSION) -top_distdir = $(distdir) - - -# This target untars the dist file and tries a VPATH configuration. Then -# it guarantees that the distribution is self-contained by making another -# tarfile. -distcheck: dist - -chmod -R a+w $(distdir) > /dev/null 2>&1; rm -rf $(distdir) - GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(AMTAR) xf - - chmod -R a-w $(distdir); chmod a+w $(distdir) - mkdir $(distdir)/=build - mkdir $(distdir)/=inst - chmod a-w $(distdir) - dc_install_base=`CDPATH=: && cd $(distdir)/=inst && pwd` \ - && cd $(distdir)/=build \ - && ../configure --srcdir=.. --prefix=$$dc_install_base \ - && $(MAKE) $(AM_MAKEFLAGS) \ - && $(MAKE) $(AM_MAKEFLAGS) dvi \ - && $(MAKE) $(AM_MAKEFLAGS) check \ - && $(MAKE) $(AM_MAKEFLAGS) install \ - && $(MAKE) $(AM_MAKEFLAGS) installcheck \ - && $(MAKE) $(AM_MAKEFLAGS) uninstall \ - && test `find $$dc_install_base -type f -print | wc -l` -le 1 \ - && $(MAKE) $(AM_MAKEFLAGS) dist \ - && $(MAKE) $(AM_MAKEFLAGS) distclean \ - && rm -f $(distdir).tar.gz \ - && test `find . -type f -print | wc -l` -eq 0 - -chmod -R a+w $(distdir) > /dev/null 2>&1; rm -rf $(distdir) - @banner="$(distdir).tar.gz is ready for distribution"; \ - dashes=`echo "$$banner" | sed s/./=/g`; \ - echo "$$dashes"; \ - echo "$$banner"; \ - echo "$$dashes" -dist: distdir - -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ - ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ - ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ - ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \ - || chmod -R a+r $(distdir) - $(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c > $(distdir).tar.gz - -chmod -R a+w $(distdir) > /dev/null 2>&1; rm -rf $(distdir) -dist-all: distdir - -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ - ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ - ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ - ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \ - || chmod -R a+r $(distdir) - $(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c > $(distdir).tar.gz - -chmod -R a+w $(distdir) > /dev/null 2>&1; rm -rf $(distdir) -distdir: $(DISTFILES) - @if sed 15q $(srcdir)/NEWS | fgrep -e "$(VERSION)" > /dev/null; then :; else \ - echo "NEWS not updated; not releasing" 1>&2; \ - exit 1; \ - fi - -chmod -R a+w $(distdir) > /dev/null 2>&1; rm -rf $(distdir) - mkdir $(distdir) - $(mkinstalldirs) $(distdir)/mpfr - @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=../$(distdir) distdir=../$(distdir)/$$subdir distdir) \ - || exit 1; \ - fi; \ - done - $(MAKE) $(AM_MAKEFLAGS) top_distdir="$(top_distdir)" distdir="$(distdir)" dist-info - $(MAKE) $(AM_MAKEFLAGS) top_distdir="$(top_distdir)" distdir="$(distdir)" dist-hook -info-am: $(INFO_DEPS) -info: info-recursive -dvi-am: $(DVIS) -dvi: dvi-recursive -check-am: all-am -check: check-recursive -installcheck-am: -installcheck: installcheck-recursive -all-recursive-am: config.h - $(MAKE) $(AM_MAKEFLAGS) all-recursive - -install-exec-am: install-libLTLIBRARIES -install-exec: install-exec-recursive - -install-data-am: install-info-am install-includeHEADERS -install-data: install-data-recursive - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am -install: install-recursive -uninstall-am: uninstall-libLTLIBRARIES uninstall-info \ - uninstall-includeHEADERS -uninstall: uninstall-recursive -all-am: Makefile $(INFO_DEPS) $(ANSI2KNR) $(LTLIBRARIES) $(HEADERS) \ - config.h -all-redirect: all-recursive-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_STRIP_FLAG=-s install -installdirs: installdirs-recursive -installdirs-am: - $(mkinstalldirs) $(DESTDIR)$(libdir) $(DESTDIR)$(infodir) \ - $(DESTDIR)$(includedir) - - -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -rm -f Makefile $(CONFIG_CLEAN_FILES) - -rm -f config.cache config.log stamp-h stamp-h[0-9]* - -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) - -maintainer-clean-generic: - -rm -f Makefile.in -mostlyclean-am: mostlyclean-hdr mostlyclean-libLTLIBRARIES \ - mostlyclean-compile mostlyclean-libtool \ - mostlyclean-krextra mostlyclean-kr mostlyclean-vti \ - mostlyclean-aminfo mostlyclean-tags mostlyclean-generic - -mostlyclean: mostlyclean-recursive - -clean-am: clean-hdr clean-libLTLIBRARIES clean-compile clean-libtool \ - clean-krextra clean-kr clean-vti clean-aminfo \ - clean-tags clean-generic mostlyclean-am - -clean: clean-recursive - -distclean-am: distclean-hdr distclean-libLTLIBRARIES distclean-compile \ - distclean-libtool distclean-krextra distclean-kr \ - distclean-vti distclean-aminfo distclean-tags \ - distclean-generic clean-am - -rm -f libtool - -distclean: distclean-recursive - -rm -f config.status - -maintainer-clean-am: maintainer-clean-hdr \ - maintainer-clean-libLTLIBRARIES \ - maintainer-clean-compile maintainer-clean-libtool \ - maintainer-clean-krextra maintainer-clean-kr \ - maintainer-clean-vti maintainer-clean-aminfo \ - 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 - -rm -f config.status - -.PHONY: mostlyclean-hdr distclean-hdr clean-hdr maintainer-clean-hdr \ -mostlyclean-libLTLIBRARIES distclean-libLTLIBRARIES \ -clean-libLTLIBRARIES maintainer-clean-libLTLIBRARIES \ -uninstall-libLTLIBRARIES install-libLTLIBRARIES mostlyclean-compile \ -distclean-compile clean-compile maintainer-clean-compile \ -mostlyclean-libtool distclean-libtool clean-libtool \ -maintainer-clean-libtool mostlyclean-krextra distclean-krextra \ -clean-krextra maintainer-clean-krextra mostlyclean-kr distclean-kr \ -clean-kr maintainer-clean-kr mostlyclean-vti distclean-vti clean-vti \ -maintainer-clean-vti install-info-am uninstall-info mostlyclean-aminfo \ -distclean-aminfo clean-aminfo maintainer-clean-aminfo \ -uninstall-includeHEADERS install-includeHEADERS 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 all-recursive-am \ -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 - - -# Don't ship CVS directories or emacs backups. -dist-hook: - -find $(distdir) \( -name CVS -type d \) -o -name "*.~*" \ - | xargs rm -rf - -# 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/NEWS b/rts/gmp/NEWS deleted file mode 100644 index 3b549d5..0000000 --- a/rts/gmp/NEWS +++ /dev/null @@ -1,136 +0,0 @@ -Changes between MP version 3.1 and 3.1.1 - -* Bug fixes for division (rare), mpf_get_str, FFT, and miscellaneous minor - things. - -Changes between MP version 3.0 and 3.1 - -* Bug fixes. -* Improved `make check' running more tests. -* Tuned algorithm cutoff points for many machines. This will improve speed for - a lot of operations, in some cases by a large amount. -* Major speed improvments: Alpha 21264. -* Some speed improvments: Cray vector computers, AMD K6 and Athlon, Intel P5 - and Pentium Pro/II/III. -* The mpf_get_prec function now works as it did in GMP 2. -* New utilities for auto-tuning and speed measuring. -* Multiplication now optionally uses FFT for very large operands. (To enable - it, pass --enable-fft to configure.) -* Support for new systems: Solaris running on x86, FreeBSD 5, HP-UX 11, Cray - vector computers, Rhapsody, Nextstep/Openstep, MacOS. -* Support for shared libraries on 32-bit HPPA. -* New integer functions: mpz_mul_si, mpz_odd_p, mpz_even_p. -* New Kronecker symbol functions: mpz_kronecker_si, mpz_kronecker_ui, - mpz_si_kronecker, mpz_ui_kronecker. -* New rational functions: mpq_out_str, mpq_swap. -* New float functions: mpf_swap. -* New mpn functions: mpn_divexact_by3c, mpn_tdiv_qr. -* New EXPERIMENTAL function layer for accurate floating-point arithmetic, mpfr. - To try it, pass --enable-mpfr to configure. See the mpfr subdirectory for - more information; it is not documented in the main GMP manual. - -Changes between MP version 3.0 and 3.0.1 - -* Memory leaks in gmp_randinit and mpz_probab_prime_p fixed. -* Documentation for gmp_randinit fixed. Misc documentation errors fixed. - -Changes between MP version 2.0 and 3.0 - -* Source level compatibility with past releases (except mpn_gcd). -* Bug fixes. -* Much improved speed thanks to both host independent and host dependent - optimizations. -* Switch to autoconf/automake/libtool. -* Support for building libgmp as a shared library. -* Multiplication and squaring using 3-way Toom-Cook. -* Division using the Burnikel-Ziegler method. -* New functions computing binomial coefficients: mpz_bin_ui, mpz_bin_uiui. -* New function computing Fibonacci numbers: mpz_fib_ui. -* New random number generators: mpf_urandomb, mpz_rrandomb, mpz_urandomb, - mpz_urandomm, gmp_randclear, gmp_randinit, gmp_randinit_lc_2exp, gmp_randseed, - gmp_randseed_ui. -* New function for quickly extracting limbs: mpz_getlimbn. -* New functions performing integer size tests: mpz_fits_sint_p, - mpz_fits_slong_p, mpz_fits_sshort_p, mpz_fits_uint_p, mpz_fits_ulong_p, - mpz_fits_ushort_p. -* New mpf functions: mpf_ceil, mpf_floor, mpf_pow_ui, mpf_trunc. -* New mpq function: mpq_set_d. -* New mpz functions: mpz_addmul_ui, mpz_cmpabs, mpz_cmpabs_ui, mpz_lcm, - mpz_nextprime, mpz_perfect_power_p, mpz_remove, mpz_root, mpz_swap, - mpz_tdiv_ui, mpz_tstbit, mpz_xor. -* New mpn function: mpn_divexact_by3. -* New CPU support: DEC Alpha 21264, AMD K6 and Athlon, HPPA 2.0 and 64, - Intel Pentium Pro and Pentium-II/III, Sparc 64, PowerPC 64. -* Almost 10 times faster mpz_invert and mpn_gcdext. -* The interface of mpn_gcd has changed. -* Better support for MIPS R4x000 and R5000 under Irix 6. -* Improved support for SPARCv8 and SPARCv9 processors. - -Changes between MP version 2.0 and 2.0.2 - -* Many bug fixes. - -Changes between MP version 1.3.2 and 2.0 - -* Division routines in the mpz class have changed. There are three classes of - functions, that rounds the quotient to -infinity, 0, and +infinity, - respectively. The first class of functions have names that begin with - mpz_fdiv (f is short for floor), the second class' names begin with mpz_tdiv - (t is short for trunc), and the third class' names begin with mpz_cdiv (c is - short for ceil). - - The old division routines beginning with mpz_m are similar to the new - mpz_fdiv, with the exception that some of the new functions return useful - values. - - The old function names can still be used. All the old functions names will - now do floor division, not trunc division as some of them used to. This was - changed to make the functions more compatible with common mathematical - practice. - - The mpz_mod and mpz_mod_ui functions now compute the mathematical mod - function. I.e., the sign of the 2nd argument is ignored. - -* The mpq assignment functions do not canonicalize their results. A new - function, mpq_canonicalize must be called by the user if the result is not - known to be canonical. -* The mpn functions are now documented. These functions are intended for - very time critical applications, or applications that need full control over - memory allocation. Note that the mpn interface is irregular and hard to - use. -* New functions for arbitrary precision floating point arithmetic. Names - begin with `mpf_'. Associated type mpf_t. -* New and improved mpz functions, including much faster GCD, fast exact - division (mpz_divexact), bit scan (mpz_scan0 and mpz_scan1), and number - theoretical functions like Jacobi (mpz_jacobi) and multiplicative inverse - (mpz_invert). -* New variable types (mpz_t and mpq_t) are available that makes syntax of - mpz and mpq calls nicer (no need for & before variables). The MP_INT and - MP_RAT types are still available for compatibility. -* Uses GNU configure. This makes it possible to choose target architecture - and CPU variant, and to compile into a separate object directory. -* Carefully optimized assembly for important inner loops. Support for DEC - Alpha, Amd 29000, HPPA 1.0 and 1.1, Intel Pentium and generic x86, Intel - i960, Motorola MC68000, MC68020, MC88100, and MC88110, Motorola/IBM - PowerPC, National NS32000, IBM POWER, MIPS R3000, R4000, SPARCv7, - SuperSPARC, generic SPARCv8, and DEC VAX. Some support also for ARM, - Clipper, IBM ROMP (RT), and Pyramid AP/XP. -* Faster. Thanks to the assembler code, new algorithms, and general tuning. - In particular, the speed on machines without GCC is improved. -* Support for machines without alloca. -* Now under the LGPL. - -INCOMPATIBILITIES BETWEEN GMP 1 AND GMP 2 - -* mpq assignment functions do not canonicalize their results. -* mpz division functions round differently. -* mpz mod functions now really compute mod. -* mpz_powm and mpz_powm_ui now really use mod for reduction. - - - ----------------- -Local variables: -mode: text -fill-column: 76 -End: diff --git a/rts/gmp/README b/rts/gmp/README deleted file mode 100644 index 177c97e..0000000 --- a/rts/gmp/README +++ /dev/null @@ -1,84 +0,0 @@ - - THE GNU MP LIBRARY - - -GNU MP is a library for arbitrary precision arithmetic, operating on signed -integers, rational numbers, and floating point numbers. It has a rich set of -functions, and the functions have a regular interface. - -GNU MP is designed to be as fast as possible, both for small operands and huge -operands. The speed is achieved by using fullwords as the basic arithmetic -type, by using fast algorithms, with carefully optimized assembly code for the -most common inner loops for lots of CPUs, and by a general emphasis on speed -(instead of simplicity or elegance). - -GNU MP is believed to be faster than any other similar library. Its advantage -increases with operand sizes for certain operations, since GNU MP in many -cases has asymptotically faster algorithms. - -GNU MP is free software and may be freely copied on the terms contained in the -files COPYING.LIB and COPYING (most of GNU MP is under the former, some under -the latter). - - - - OVERVIEW OF GNU MP - -There are five classes of functions in GNU MP. - - 1. Signed integer arithmetic functions (mpz). These functions are intended - to be easy to use, with their regular interface. The associated type is - `mpz_t'. - - 2. Rational arithmetic functions (mpq). For now, just a small set of - functions necessary for basic rational arithmetics. The associated type - is `mpq_t'. - - 3. Floating-point arithmetic functions (mpf). If the C type `double' - doesn't give enough precision for your application, declare your - variables as `mpf_t' instead, set the precision to any number desired, - and call the functions in the mpf class for the arithmetic operations. - - 4. Positive-integer, hard-to-use, very low overhead functions are in the - mpn class. No memory management is performed. The caller must ensure - enough space is available for the results. The set of functions is not - regular, nor is the calling interface. These functions accept input - arguments in the form of pairs consisting of a pointer to the least - significant word, and an integral size telling how many limbs (= words) - the pointer points to. - - Almost all calculations, in the entire package, are made by calling these - low-level functions. - - 5. Berkeley MP compatible functions. - - To use these functions, include the file "mp.h". You can test if you are - using the GNU version by testing if the symbol __GNU_MP__ is defined. - -For more information on how to use GNU MP, please refer to the documentation. -It is composed from the file gmp.texi, and can be displayed on the screen or -printed. How to do that, as well how to build the library, is described in -the INSTALL file in this directory. - - - - REPORTING BUGS - -If you find a bug in the library, please make sure to tell us about it! - -You should first check the GNU MP web pages at http://www.swox.com/gmp/, -under "Status of the current release". There will be patches for all known -serious bugs there. - -Report bugs to bug-gmp@gnu.org. What information is needed in a good bug -report is described in the manual. The same address can be used for -suggesting modifications and enhancements. - - - - ----------------- -Local variables: -mode: text -fill-column: 78 -End: diff --git a/rts/gmp/acconfig.h b/rts/gmp/acconfig.h deleted file mode 100644 index dfb1b0b..0000000 --- a/rts/gmp/acconfig.h +++ /dev/null @@ -1,92 +0,0 @@ -/* -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. -*/ - -@TOP@ - -/* Define if a limb is long long. */ -#undef _LONG_LONG_LIMB - -/* Define if we have native implementation of function. */ -#undef HAVE_NATIVE_ -#undef HAVE_NATIVE_mpn_add -#undef HAVE_NATIVE_mpn_add_1 -#undef HAVE_NATIVE_mpn_add_n -#undef HAVE_NATIVE_mpn_add_nc -#undef HAVE_NATIVE_mpn_addmul_1 -#undef HAVE_NATIVE_mpn_addmul_1c -#undef HAVE_NATIVE_mpn_addsub_n -#undef HAVE_NATIVE_mpn_addsub_nc -#undef HAVE_NATIVE_mpn_and_n -#undef HAVE_NATIVE_mpn_andn_n -#undef HAVE_NATIVE_mpn_bdivmod -#undef HAVE_NATIVE_mpn_cmp -#undef HAVE_NATIVE_mpn_com_n -#undef HAVE_NATIVE_mpn_copyd -#undef HAVE_NATIVE_mpn_copyi -#undef HAVE_NATIVE_mpn_divexact_by3c -#undef HAVE_NATIVE_mpn_divrem -#undef HAVE_NATIVE_mpn_divrem_1 -#undef HAVE_NATIVE_mpn_divrem_1c -#undef HAVE_NATIVE_mpn_divrem_2 -#undef HAVE_NATIVE_mpn_divrem_newton -#undef HAVE_NATIVE_mpn_divrem_classic -#undef HAVE_NATIVE_mpn_dump -#undef HAVE_NATIVE_mpn_gcd -#undef HAVE_NATIVE_mpn_gcd_1 -#undef HAVE_NATIVE_mpn_gcdext -#undef HAVE_NATIVE_mpn_get_str -#undef HAVE_NATIVE_mpn_hamdist -#undef HAVE_NATIVE_mpn_invert_limb -#undef HAVE_NATIVE_mpn_ior_n -#undef HAVE_NATIVE_mpn_iorn_n -#undef HAVE_NATIVE_mpn_lshift -#undef HAVE_NATIVE_mpn_mod_1 -#undef HAVE_NATIVE_mpn_mod_1c -#undef HAVE_NATIVE_mpn_mul -#undef HAVE_NATIVE_mpn_mul_1 -#undef HAVE_NATIVE_mpn_mul_1c -#undef HAVE_NATIVE_mpn_mul_basecase -#undef HAVE_NATIVE_mpn_mul_n -#undef HAVE_NATIVE_mpn_nand_n -#undef HAVE_NATIVE_mpn_nior_n -#undef HAVE_NATIVE_mpn_perfect_square_p -#undef HAVE_NATIVE_mpn_popcount -#undef HAVE_NATIVE_mpn_preinv_mod_1 -#undef HAVE_NATIVE_mpn_random2 -#undef HAVE_NATIVE_mpn_random -#undef HAVE_NATIVE_mpn_rawrandom -#undef HAVE_NATIVE_mpn_rshift -#undef HAVE_NATIVE_mpn_scan0 -#undef HAVE_NATIVE_mpn_scan1 -#undef HAVE_NATIVE_mpn_set_str -#undef HAVE_NATIVE_mpn_sqrtrem -#undef HAVE_NATIVE_mpn_sqr_basecase -#undef HAVE_NATIVE_mpn_sub -#undef HAVE_NATIVE_mpn_sub_1 -#undef HAVE_NATIVE_mpn_sub_n -#undef HAVE_NATIVE_mpn_sub_nc -#undef HAVE_NATIVE_mpn_submul_1 -#undef HAVE_NATIVE_mpn_submul_1c -#undef HAVE_NATIVE_mpn_udiv_w_sdiv -#undef HAVE_NATIVE_mpn_umul_ppmm -#undef HAVE_NATIVE_mpn_udiv_qrnnd -#undef HAVE_NATIVE_mpn_xor_n -#undef HAVE_NATIVE_mpn_xnor_n diff --git a/rts/gmp/acinclude.m4 b/rts/gmp/acinclude.m4 deleted file mode 100644 index a02394a..0000000 --- a/rts/gmp/acinclude.m4 +++ /dev/null @@ -1,835 +0,0 @@ -dnl GMP specific autoconf macros - - -dnl Copyright (C) 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published -dnl by the Free Software Foundation; either version 2.1 of the License, or (at -dnl your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - - -dnl GMP_HEADER_GETVAL(NAME,FILE) -dnl ---------------------------- -dnl Expand to the value of a "#define NAME" from the given FILE. -dnl The regexps here aren't very rugged, but are enough for gmp. -dnl /dev/null as a parameter prevents a hang if $2 is accidentally omitted. - -define(GMP_HEADER_GETVAL, -[patsubst(patsubst( -esyscmd([grep "^#define $1 " $2 /dev/null 2>/dev/null]), -[^.*$1[ ]+],[]), -[[ - ]*$],[])]) - - -dnl GMP_VERSION -dnl ----------- -dnl The gmp version number, extracted from the #defines in gmp.h. -dnl Two digits like 3.0 if patchlevel <= 0, or three digits like 3.0.1 if -dnl patchlevel > 0. - -define(GMP_VERSION, -[GMP_HEADER_GETVAL(__GNU_MP_VERSION,gmp.h)[]dnl -.GMP_HEADER_GETVAL(__GNU_MP_VERSION_MINOR,gmp.h)[]dnl -ifelse(m4_eval(GMP_HEADER_GETVAL(__GNU_MP_VERSION_PATCHLEVEL,gmp.h) > 0),1, -[.GMP_HEADER_GETVAL(__GNU_MP_VERSION_PATCHLEVEL,gmp.h)])]) - - -dnl GMP_PROG_M4() -dnl ------------- -dnl -dnl Find a working m4, either in $PATH or likely locations, and setup $M4 -dnl and an AC_SUBST accordingly. If $M4 is already set then it's a user -dnl choice and is accepted with no checks. GMP_PROG_M4 is like -dnl AC_PATH_PROG or AC_CHECK_PROG, but it tests each m4 found to see if -dnl it's good enough. -dnl -dnl See mpn/asm-defs.m4 for details on the known bad m4s. - -AC_DEFUN(GMP_PROG_M4, -[AC_CACHE_CHECK([for suitable m4], - gmp_cv_prog_m4, -[if test -n "$M4"; then - gmp_cv_prog_m4="$M4" -else - cat >conftest.m4 <<\EOF -dnl must protect this against being expanded during autoconf m4! -[define(dollarhash,``$][#'')dnl -ifelse(dollarhash(x),1,`define(t1,Y)', -``bad: $][# not supported (SunOS /usr/bin/m4) -'')dnl -ifelse(eval(89),89,`define(t2,Y)', -`bad: eval() doesnt support 8 or 9 in a constant (OpenBSD 2.6 m4) -')dnl -ifelse(t1`'t2,YY,`good -')dnl] -EOF - echo "trying m4" 1>&AC_FD_CC - gmp_tmp_val="`(m4 conftest.m4) 2>&AC_FD_CC`" - echo "$gmp_tmp_val" 1>&AC_FD_CC - if test "$gmp_tmp_val" = good; then - gmp_cv_prog_m4="m4" - else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" -dnl $ac_dummy forces splitting on constant user-supplied paths. -dnl POSIX.2 word splitting is done only on the output of word expansions, -dnl not every word. This closes a longstanding sh security hole. - ac_dummy="$PATH:/usr/5bin" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - echo "trying $ac_dir/m4" 1>&AC_FD_CC - gmp_tmp_val="`($ac_dir/m4 conftest.m4) 2>&AC_FD_CC`" - echo "$gmp_tmp_val" 1>&AC_FD_CC - if test "$gmp_tmp_val" = good; then - gmp_cv_prog_m4="$ac_dir/m4" - break - fi - done - IFS="$ac_save_ifs" - if test -z "$gmp_cv_prog_m4"; then - AC_MSG_ERROR([No usable m4 in \$PATH or /usr/5bin (see config.log for reasons).]) - fi - fi - rm -f conftest.m4 -fi]) -M4="$gmp_cv_prog_m4" -AC_SUBST(M4) -]) - - -dnl GMP_PROG_CC_FIND([CC_LIST], [REQ_64BIT_CC]) -dnl Find first working compiler in CC_LIST. -dnl If REQ_64BIT_CC is "yes", the compiler is required to be able to -dnl produce 64-bit code. -dnl NOTE: If a compiler needs any special flags for producing 64-bit code, -dnl these have to be found in shell variable `gmp_cflags64_{cc}', where `{cc}' -dnl is the name of the compiler. -dnl Set CC to the name of the first working compiler. -dnl If a 64-bit compiler is found, set CC64 to the name of the compiler and -dnl CFLAGS64 to flags to use. -dnl This macro does not test if any of the compilers found is a GNU compiler. -dnl To do this, when you have finally made up your mind on which one to use, -dnl and set CC accordingly, invoke [GMP_PROG_CC_SELECT]. That macro will -dnl also make sure that your selection of CFLAGS is valid. -dnl -AC_DEFUN(GMP_PROG_CC_FIND, -[AC_BEFORE([$0], [CC_PROG_CPP]) -ifelse([$1], , gmp_cc_list="gcc cc", gmp_cc_list="[$1]") -ifelse([$2], , gmp_req_64bit_cc="no", gmp_req_64bit_cc="[$2]") - -CC32= -CC64= -for c in $gmp_cc_list; do - # Avoid cache hits. - unset CC - unset ac_cv_prog_CC - AC_CHECK_TOOL(CC, $c, $c) - if test -n "$CC"; then - eval c_flags=\$gmp_cflags_$c - GMP_PROG_CC_WORKS($CC, $c_flags, - gmp_prog_cc_works=yes, - gmp_prog_cc_works=no) - - if test "$gmp_prog_cc_works" != "yes"; then - continue - fi - - # Save first working compiler, whether 32- or 64-bit capable. - if test -z "$CC32"; then - CC32="$CC" - fi - if test "$gmp_req_64bit_cc" = "yes"; then - eval c_flags=\$gmp_cflags64_$c - - # Verify that the compiler works in 64-bit mode as well. - # /usr/ucb/cc on Solaris 7 can *compile* in 64-bit mode, but not link. - GMP_PROG_CC_WORKS($c, $c_flags, - gmp_prog_cc_works=yes, - gmp_prog_cc_works=no) - - if test "$gmp_prog_cc_works" = "yes"; then - GMP_CHECK_CC_64BIT($c, $c_flags) - if test "$gmp_cv_cc_64bit" = "yes"; then - test -z "$CC64" && CC64="$c" - test -z "$CFLAGS64" && CFLAGS64="$c_flags" - # We have CC64 so we're done. - break - fi - fi - else - # We have CC32, and we don't need a 64-bit compiler so we're done. - break - fi - fi -done -CC="$CC32" -])dnl - -dnl GMP_PROG_CC_SELECT -dnl Check that `CC' works with `CFLAGS'. Check if `CC' is a GNU compiler. -dnl Cache the result as `ac_cv_prog_CC'. -AC_DEFUN(GMP_PROG_CC_SELECT, -[AC_BEFORE([$0], [CC_PROG_CPP]) -AC_PROG_CC_WORKS -AC_PROG_CC_GNU - -if test "$ac_cv_prog_gcc" = "yes"; then - GCC=yes -else - GCC= -fi - -# Set CFLAGS if not already set. -if test -z "$CFLAGS"; then - CFLAGS="-g" - if test "$GCC" = "yes"; then - CFLAGS="$CFLAGS -O2" - fi -fi - -AC_SUBST(CC) -AC_CACHE_VAL(ac_cv_prog_CC, ac_cv_prog_CC="$CC") -AC_PROVIDE([AC_PROG_CC]) -])dnl - -dnl GMP_CHECK_CC_64BIT(cc, cflags64) -dnl Find out if `CC' can produce 64-bit code. -dnl Requires NM to be set to nm for target. -dnl FIXME: Cache result. -AC_DEFUN(GMP_CHECK_CC_64BIT, -[ - gmp_tmp_CC_save="$CC" - CC="[$1]" - AC_MSG_CHECKING([whether the C compiler ($CC) is 64-bit capable]) - if test -z "$NM"; then - echo; echo ["configure: $0: fatal: need nm"] - exit 1 - fi - gmp_tmp_CFLAGS_save="$CFLAGS" - CFLAGS="[$2]" - - case "$target" in - hppa2.0*-*-*) - # FIXME: If gcc is installed under another name than "gcc", we will - # test the wrong thing. - if test "$CC" != "gcc"; then - dnl Let compiler version A.10.32.30 or higher be ok. - dnl Bad compiler output: - dnl ccom: HP92453-01 G.10.32.05 HP C Compiler - dnl Good compiler output: - dnl ccom: HP92453-01 A.10.32.30 HP C Compiler - echo >conftest.c - gmp_tmp_vs=`$CC $CFLAGS -V -c -o conftest.o conftest.c 2>&1 | grep "^ccom:"` - rm conftest* - gmp_tmp_v1=`echo $gmp_tmp_vs | sed 's/.* .\.\(.*\)\..*\..* HP C.*/\1/'` - gmp_tmp_v2=`echo $gmp_tmp_vs | sed 's/.* .\..*\.\(.*\)\..* HP C.*/\1/'` - gmp_tmp_v3=`echo $gmp_tmp_vs | sed 's/.* .\..*\..*\.\(.*\) HP C.*/\1/'` - gmp_cv_cc_64bit=no - test -n "$gmp_tmp_v1" && test "$gmp_tmp_v1" -ge "10" \ - && test -n "$gmp_tmp_v2" && test "$gmp_tmp_v2" -ge "32" \ - && test -n "$gmp_tmp_v3" && test "$gmp_tmp_v3" -ge "30" \ - && gmp_cv_cc_64bit=yes - else # gcc - # FIXME: Compile a minimal file and determine if the resulting object - # file is an ELF file. If so, gcc can produce 64-bit code. - # Do we have file(1) for target? - gmp_cv_cc_64bit=no - fi - ;; - mips-sgi-irix6.*) - # We use `-n32' to cc and `-mabi=n32' to gcc, resulting in 64-bit - # arithmetic but not 64-bit pointers, so the general test for sizeof - # (void *) is not valid. - # Simply try to compile an empty main. If that succeeds return - # true. - AC_TRY_COMPILE( , , - gmp_cv_cc_64bit=yes, gmp_cv_cc_64bit=no, - gmp_cv_cc_64bit=no) - ;; - *-*-*) - # Allocate an array of size sizeof (void *) and use nm to determine its - # size. We depend on the first declared variable being put at address 0. - cat >conftest.c <)dnl - gmp_tmp_val=`$NM conftest.o | grep post | sed -e 's;[[][0-9][]]\(.*\);\1;' \ - -e 's;[^1-9]*\([0-9]*\).*;\1;'` - changequote([, ])dnl - if test "$gmp_tmp_val" = "8"; then - gmp_cv_cc_64bit=yes - else - gmp_cv_cc_64bit=no - fi - else - echo "configure: failed program was:" >&AC_FD_CC - cat conftest.$ac_ext >&AC_FD_CC - gmp_cv_cc_64bit=no - fi - rm -f conftest* - ;; - esac - - CC="$gmp_tmp_CC_save" - CFLAGS="$gmp_tmp_CFLAGS_save" - AC_MSG_RESULT($gmp_cv_cc_64bit) -])dnl - -dnl GMP_INIT([M4-DEF-FILE]) -dnl -AC_DEFUN(GMP_INIT, -[ifelse([$1], , gmp_configm4=config.m4, gmp_configm4="[$1]") -gmp_tmpconfigm4=cnfm4.tmp -gmp_tmpconfigm4i=cnfm4i.tmp -gmp_tmpconfigm4p=cnfm4p.tmp -test -f $gmp_tmpconfigm4 && rm $gmp_tmpconfigm4 -test -f $gmp_tmpconfigm4i && rm $gmp_tmpconfigm4i -test -f $gmp_tmpconfigm4p && rm $gmp_tmpconfigm4p -])dnl - -dnl GMP_FINISH -dnl ---------- -dnl Create config.m4 from its accumulated parts. -dnl -dnl __CONFIG_M4_INCLUDED__ is used so that a second or subsequent include -dnl of config.m4 is harmless. -dnl -dnl A separate ifdef on the angle bracket quoted part ensures the quoting -dnl style there is respected. The basic defines from gmp_tmpconfigm4 are -dnl fully quoted but are still put under an ifdef in case any have been -dnl redefined by one of the m4 include files. -dnl -dnl Doing a big ifdef within asm-defs.m4 and/or other macro files wouldn't -dnl work, since it'd interpret parentheses and quotes in dnl comments, and -dnl having a whole file as a macro argument would overflow the string space -dnl on BSD m4. - -AC_DEFUN(GMP_FINISH, -[AC_REQUIRE([GMP_INIT]) -echo "creating $gmp_configm4" -echo ["dnl $gmp_configm4. Generated automatically by configure."] > $gmp_configm4 -if test -f $gmp_tmpconfigm4; then - echo ["changequote(<,>)dnl"] >> $gmp_configm4 - echo ["ifdef(<__CONFIG_M4_INCLUDED__>,,<"] >> $gmp_configm4 - cat $gmp_tmpconfigm4 >> $gmp_configm4 - echo [">)"] >> $gmp_configm4 - echo ["changequote(\`,')dnl"] >> $gmp_configm4 - rm $gmp_tmpconfigm4 -fi -echo ["ifdef(\`__CONFIG_M4_INCLUDED__',,\`"] >> $gmp_configm4 -if test -f $gmp_tmpconfigm4i; then - cat $gmp_tmpconfigm4i >> $gmp_configm4 - rm $gmp_tmpconfigm4i -fi -if test -f $gmp_tmpconfigm4p; then - cat $gmp_tmpconfigm4p >> $gmp_configm4 - rm $gmp_tmpconfigm4p -fi -echo ["')"] >> $gmp_configm4 -echo ["define(\`__CONFIG_M4_INCLUDED__')"] >> $gmp_configm4 -])dnl - -dnl GMP_INCLUDE(FILE) -AC_DEFUN(GMP_INCLUDE, -[AC_REQUIRE([GMP_INIT]) -echo ["include(\`$1')"] >> $gmp_tmpconfigm4i -])dnl - -dnl GMP_SINCLUDE(FILE) -AC_DEFUN(GMP_SINCLUDE, -[AC_REQUIRE([GMP_INIT]) -echo ["sinclude(\`$1')"] >> $gmp_tmpconfigm4i -])dnl - -dnl GMP_DEFINE(MACRO, DEFINITION [, LOCATION]) -dnl [ Define M4 macro MACRO as DEFINITION in temporary file. ] -dnl [ If LOCATION is `POST', the definition will appear after any ] -dnl [ include() directives inserted by GMP_INCLUDE/GMP_SINCLUDE. ] -dnl [ Mind the quoting! No shell variables will get expanded. ] -dnl [ Don't forget to invoke GMP_FINISH to create file config.m4. ] -dnl [ config.m4 uses `<' and '>' as quote characters for all defines. ] -AC_DEFUN(GMP_DEFINE, -[AC_REQUIRE([GMP_INIT]) -echo ['define(<$1>, <$2>)'] >> ifelse([$3], [POST], $gmp_tmpconfigm4p, $gmp_tmpconfigm4) -])dnl - -dnl GMP_DEFINE_RAW(STRING, [, LOCATION]) -dnl [ Put STRING in temporary file. ] -dnl [ If LOCATION is `POST', the definition will appear after any ] -dnl [ include() directives inserted by GMP_INCLUDE/GMP_SINCLUDE. ] -dnl [ Don't forget to invoke GMP_FINISH to create file config.m4. ] -AC_DEFUN(GMP_DEFINE_RAW, -[AC_REQUIRE([GMP_INIT]) -echo [$1] >> ifelse([$2], [POST], $gmp_tmpconfigm4p, $gmp_tmpconfigm4) -])dnl - -dnl GMP_CHECK_ASM_LABEL_SUFFIX -dnl Should a label have a colon or not? -AC_DEFUN(GMP_CHECK_ASM_LABEL_SUFFIX, -[AC_CACHE_CHECK([what assembly label suffix to use], - gmp_cv_check_asm_label_suffix, -[case "$target" in - *-*-hpux*) gmp_cv_check_asm_label_suffix=[""] ;; - *) gmp_cv_check_asm_label_suffix=[":"] ;; -esac -]) -echo ["define(, <\$][1$gmp_cv_check_asm_label_suffix>)"] >> $gmp_tmpconfigm4 -])dnl - -dnl GMP_CHECK_ASM_UNDERSCORE([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) -dnl Shamelessly borrowed from glibc. -AC_DEFUN(GMP_CHECK_ASM_UNDERSCORE, -[AC_CACHE_CHECK([if symbols are prefixed by underscore], - gmp_cv_check_asm_underscore, -[cat > conftest.$ac_ext </dev/null; then - gmp_cv_check_asm_underscore=yes - else - gmp_cv_check_asm_underscore=no - fi -else - echo "configure: failed program was:" >&AC_FD_CC - cat conftest.$ac_ext >&AC_FD_CC -fi -rm -f conftest* -]) -if test "$gmp_cv_check_asm_underscore" = "yes"; then - GMP_DEFINE(GSYM_PREFIX, [_]) - ifelse([$1], , :, [$1]) -else - GMP_DEFINE(GSYM_PREFIX, []) - ifelse([$2], , :, [$2]) -fi -])dnl - -dnl GMP_CHECK_ASM_ALIGN_LOG([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) -dnl Is parameter to `.align' logarithmic? -dnl Requires NM to be set to nm for target. -AC_DEFUN(GMP_CHECK_ASM_ALIGN_LOG, -[AC_REQUIRE([GMP_CHECK_ASM_GLOBL]) -AC_REQUIRE([GMP_CHECK_ASM_DATA]) -AC_REQUIRE([GMP_CHECK_ASM_LABEL_SUFFIX]) -AC_CACHE_CHECK([if .align assembly directive is logarithmic], - gmp_cv_check_asm_align_log, -[if test -z "$NM"; then - echo; echo ["configure: $0: fatal: need nm"] - exit 1 -fi -cat > conftest.s <) - gmp_tmp_val=`$NM conftest.o | grep foo | sed -e 's;[[][0-9][]]\(.*\);\1;' \ - -e 's;[^1-9]*\([0-9]*\).*;\1;'` - changequote([, ])dnl - if test "$gmp_tmp_val" = "10" || test "$gmp_tmp_val" = "16"; then - gmp_cv_check_asm_align_log=yes - else - gmp_cv_check_asm_align_log=no - fi -else - echo "configure: failed program was:" >&AC_FD_CC - cat conftest.s >&AC_FD_CC -fi -rm -f conftest* -]) -GMP_DEFINE_RAW(["define(,<$gmp_cv_check_asm_align_log>)"]) -if test "$gmp_cv_check_asm_align_log" = "yes"; then - ifelse([$1], , :, [$1]) -else - ifelse([$2], , :, [$2]) -fi -])dnl - - -dnl GMP_CHECK_ASM_ALIGN_FILL_0x90 -dnl ----------------------------- -dnl Determine whether a ",0x90" suffix works on a .align directive. -dnl This is only meant for use on x86, where 0x90 is a "nop". -dnl -dnl Old gas, eg. 1.92.3 - needs ",0x90" or else the fill is an invalid 0x00. -dnl New gas, eg. 2.91 - generates the good multibyte nop fills even when -dnl ",0x90" is given. -dnl Solaris 2.6 as - doesn't allow ",0x90", gives a fatal error. -dnl Solaris 2.8 as - gives a warning for ",0x90", no ill effect. -dnl -dnl Note that both solaris "as"s only care about ",0x90" if they actually -dnl have to use it to fill something, hence the .byte in the sample. It's -dnl only the second .align that provokes an error or warning. -dnl -dnl We prefer to suppress the warning from solaris 2.8 to stop anyone -dnl worrying something might be wrong. - -AC_DEFUN(GMP_CHECK_ASM_ALIGN_FILL_0x90, -[AC_CACHE_CHECK([if the .align directive accepts an 0x90 fill in .text], - gmp_cv_check_asm_align_fill_0x90, -[AC_REQUIRE([GMP_CHECK_ASM_TEXT]) -cat > conftest.s <&AC_FD_CC - if echo "$gmp_tmp_val" | grep "Warning: Fill parameter ignored for executable section"; then - echo "Supressing this warning by omitting 0x90" 1>&AC_FD_CC - gmp_cv_check_asm_align_fill_0x90=no - else - gmp_cv_check_asm_align_fill_0x90=yes - fi -else - echo "Non-zero exit code" 1>&AC_FD_CC - echo "$gmp_tmp_val" 1>&AC_FD_CC - gmp_cv_check_asm_align_fill_0x90=no -fi -rm -f conftest* -]) -GMP_DEFINE_RAW( -["define(,<$gmp_cv_check_asm_align_fill_0x90>)"]) -]) - - -dnl GMP_CHECK_ASM_TEXT -AC_DEFUN(GMP_CHECK_ASM_TEXT, -[AC_CACHE_CHECK([how to switch to text section], gmp_cv_check_asm_text, -[case "$target" in - *-*-aix*) - changequote({, }) - gmp_cv_check_asm_text={".csect .text[PR]"} - changequote([, ]) - ;; - *-*-hpux*) gmp_cv_check_asm_text=[".code"] ;; - *) gmp_cv_check_asm_text=[".text"] ;; -esac -]) -echo ["define(, <$gmp_cv_check_asm_text>)"] >> $gmp_tmpconfigm4 -])dnl - -dnl GMP_CHECK_ASM_DATA -dnl Can we say `.data'? -AC_DEFUN(GMP_CHECK_ASM_DATA, -[AC_CACHE_CHECK([how to switch to data section], gmp_cv_check_asm_data, -[case "$target" in - *-*-aix*) - changequote({, }) - gmp_cv_check_asm_data={".csect .data[RW]"} - changequote([, ]) - ;; - *) gmp_cv_check_asm_data=[".data"] ;; -esac -]) -echo ["define(, <$gmp_cv_check_asm_data>)"] >> $gmp_tmpconfigm4 -])dnl - -dnl GMP_CHECK_ASM_GLOBL -dnl Can we say `.global'? -AC_DEFUN(GMP_CHECK_ASM_GLOBL, -[AC_CACHE_CHECK([how to export a symbol], gmp_cv_check_asm_globl, -[case "$target" in - *-*-hpux*) gmp_cv_check_asm_globl=[".export"] ;; - *) gmp_cv_check_asm_globl=[".globl"] ;; -esac -]) -echo ["define(, <$gmp_cv_check_asm_globl>)"] >> $gmp_tmpconfigm4 -])dnl - -dnl GMP_CHECK_ASM_TYPE -dnl Can we say `.type'? -AC_DEFUN(GMP_CHECK_ASM_TYPE, -[AC_CACHE_CHECK([how the .type assembly directive should be used], -gmp_cv_check_asm_type, -[ac_assemble="$CCAS $CFLAGS conftest.s 1>&AC_FD_CC" -for gmp_tmp_prefix in @ \# %; do - echo " .type sym,${gmp_tmp_prefix}function" > conftest.s - if AC_TRY_EVAL(ac_assemble); then - gmp_cv_check_asm_type="[.type \$][1,${gmp_tmp_prefix}\$][2]" - break - fi -done -if test -z "$gmp_cv_check_asm_type"; then - gmp_cv_check_asm_type="[dnl]" -fi -]) -echo ["define(, <$gmp_cv_check_asm_type>)"] >> $gmp_tmpconfigm4 -])dnl - -dnl GMP_CHECK_ASM_SIZE -dnl Can we say `.size'? -AC_DEFUN(GMP_CHECK_ASM_SIZE, -[AC_CACHE_CHECK([if the .size assembly directive works], gmp_cv_check_asm_size, -[ac_assemble="$CCAS $CFLAGS conftest.s 1>&AC_FD_CC" -echo ' .size sym,1' > conftest.s -if AC_TRY_EVAL(ac_assemble); then - gmp_cv_check_asm_size="[.size \$][1,\$][2]" -else - gmp_cv_check_asm_size="[dnl]" -fi -]) -echo ["define(, <$gmp_cv_check_asm_size>)"] >> $gmp_tmpconfigm4 -])dnl - -dnl GMP_CHECK_ASM_LSYM_PREFIX -dnl What is the prefix for a local label? -dnl Requires NM to be set to nm for target. -AC_DEFUN(GMP_CHECK_ASM_LSYM_PREFIX, -[AC_REQUIRE([GMP_CHECK_ASM_LABEL_SUFFIX]) -AC_CACHE_CHECK([what prefix to use for a local label], -gmp_cv_check_asm_lsym_prefix, -[if test -z "$NM"; then - echo; echo ["$0: fatal: need nm"] - exit 1 -fi -ac_assemble="$CCAS $CFLAGS conftest.s 1>&AC_FD_CC" -gmp_cv_check_asm_lsym_prefix="L" -for gmp_tmp_pre in L .L $ L$; do - cat > conftest.s </dev/null 2>&1 - gmp_rc=$? - if test "$gmp_rc" != "0"; then - echo "configure: $NM failure, using default" - break - fi - if $NM conftest.o | grep gurkmacka >/dev/null; then true; else - gmp_cv_check_asm_lsym_prefix="$gmp_tmp_pre" - break - fi - else - echo "configure: failed program was:" >&AC_FD_CC - cat conftest.s >&AC_FD_CC - # Use default. - fi -done -rm -f conftest* -]) -echo ["define(, <${gmp_cv_check_asm_lsym_prefix}>)"] >> $gmp_tmpconfigm4 -]) - -dnl GMP_CHECK_ASM_W32 -dnl How to [define] a 32-bit word. -dnl Requires NM to be set to nm for target. -AC_DEFUN(GMP_CHECK_ASM_W32, -[AC_REQUIRE([GMP_CHECK_ASM_DATA]) -AC_REQUIRE([GMP_CHECK_ASM_GLOBL]) -AC_REQUIRE([GMP_CHECK_ASM_LABEL_SUFFIX]) -AC_CACHE_CHECK([how to [define] a 32-bit word], - gmp_cv_check_asm_w32, -[if test -z "$NM"; then - echo; echo ["configure: $0: fatal: need nm"] - exit 1 -fi - -# FIXME: HPUX puts first symbol at 0x40000000, breaking our assumption -# that it's at 0x0. We'll have to declare another symbol before the -# .long/.word and look at the distance between the two symbols. The -# only problem is that the sed expression(s) barfs (on Solaris, for -# example) for the symbol with value 0. For now, HPUX uses .word. - -case "$target" in - *-*-hpux*) - gmp_cv_check_asm_w32=".word" - ;; - *-*-*) - ac_assemble="$CCAS $CFLAGS conftest.s 1>&AC_FD_CC" - for gmp_tmp_op in .long .word; do - cat > conftest.s <) - gmp_tmp_val=`$NM conftest.o | grep foo | sed -e 's;[[][0-9][]]\(.*\);\1;' \ - -e 's;[^1-9]*\([0-9]*\).*;\1;'` - changequote([, ])dnl - if test "$gmp_tmp_val" = "4"; then - gmp_cv_check_asm_w32="$gmp_tmp_op" - break - fi - fi - done - ;; -esac - -if test -z "$gmp_cv_check_asm_w32"; then - echo; echo ["configure: $0: fatal: do not know how to define a 32-bit word"] - exit 1 -fi -rm -f conftest* -]) -echo ["define(, <$gmp_cv_check_asm_w32>)"] >> $gmp_tmpconfigm4 -]) - -dnl GMP_CHECK_ASM_MMX([ACTION-IF-FOUND, [ACTION-IF-NOT-FOUND]]) -dnl Can we assemble MMX insns? -AC_DEFUN(GMP_CHECK_ASM_MMX, -[AC_REQUIRE([GMP_CHECK_ASM_TEXT]) -AC_CACHE_CHECK([if the assembler knows about MMX instructions], - gmp_cv_check_asm_mmx, -[cat > conftest.s < conftest.s <conftest.c </dev/null]), -[^.*$1[ ]+],[]), -[[ - ]*$],[])]) - - -dnl GMP_VERSION -dnl ----------- -dnl The gmp version number, extracted from the #defines in gmp.h. -dnl Two digits like 3.0 if patchlevel <= 0, or three digits like 3.0.1 if -dnl patchlevel > 0. - -define(GMP_VERSION, -[GMP_HEADER_GETVAL(__GNU_MP_VERSION,gmp.h)[]dnl -.GMP_HEADER_GETVAL(__GNU_MP_VERSION_MINOR,gmp.h)[]dnl -ifelse(m4_eval(GMP_HEADER_GETVAL(__GNU_MP_VERSION_PATCHLEVEL,gmp.h) > 0),1, -[.GMP_HEADER_GETVAL(__GNU_MP_VERSION_PATCHLEVEL,gmp.h)])]) - - -dnl GMP_PROG_M4() -dnl ------------- -dnl -dnl Find a working m4, either in $PATH or likely locations, and setup $M4 -dnl and an AC_SUBST accordingly. If $M4 is already set then it's a user -dnl choice and is accepted with no checks. GMP_PROG_M4 is like -dnl AC_PATH_PROG or AC_CHECK_PROG, but it tests each m4 found to see if -dnl it's good enough. -dnl -dnl See mpn/asm-defs.m4 for details on the known bad m4s. - -AC_DEFUN(GMP_PROG_M4, -[AC_CACHE_CHECK([for suitable m4], - gmp_cv_prog_m4, -[if test -n "$M4"; then - gmp_cv_prog_m4="$M4" -else - cat >conftest.m4 <<\EOF -dnl must protect this against being expanded during autoconf m4! -[define(dollarhash,``$][#'')dnl -ifelse(dollarhash(x),1,`define(t1,Y)', -``bad: $][# not supported (SunOS /usr/bin/m4) -'')dnl -ifelse(eval(89),89,`define(t2,Y)', -`bad: eval() doesnt support 8 or 9 in a constant (OpenBSD 2.6 m4) -')dnl -ifelse(t1`'t2,YY,`good -')dnl] -EOF - echo "trying m4" 1>&AC_FD_CC - gmp_tmp_val="`(m4 conftest.m4) 2>&AC_FD_CC`" - echo "$gmp_tmp_val" 1>&AC_FD_CC - if test "$gmp_tmp_val" = good; then - gmp_cv_prog_m4="m4" - else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" -dnl $ac_dummy forces splitting on constant user-supplied paths. -dnl POSIX.2 word splitting is done only on the output of word expansions, -dnl not every word. This closes a longstanding sh security hole. - ac_dummy="$PATH:/usr/5bin" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - echo "trying $ac_dir/m4" 1>&AC_FD_CC - gmp_tmp_val="`($ac_dir/m4 conftest.m4) 2>&AC_FD_CC`" - echo "$gmp_tmp_val" 1>&AC_FD_CC - if test "$gmp_tmp_val" = good; then - gmp_cv_prog_m4="$ac_dir/m4" - break - fi - done - IFS="$ac_save_ifs" - if test -z "$gmp_cv_prog_m4"; then - AC_MSG_ERROR([No usable m4 in \$PATH or /usr/5bin (see config.log for reasons).]) - fi - fi - rm -f conftest.m4 -fi]) -M4="$gmp_cv_prog_m4" -AC_SUBST(M4) -]) - - -dnl GMP_PROG_CC_FIND([CC_LIST], [REQ_64BIT_CC]) -dnl Find first working compiler in CC_LIST. -dnl If REQ_64BIT_CC is "yes", the compiler is required to be able to -dnl produce 64-bit code. -dnl NOTE: If a compiler needs any special flags for producing 64-bit code, -dnl these have to be found in shell variable `gmp_cflags64_{cc}', where `{cc}' -dnl is the name of the compiler. -dnl Set CC to the name of the first working compiler. -dnl If a 64-bit compiler is found, set CC64 to the name of the compiler and -dnl CFLAGS64 to flags to use. -dnl This macro does not test if any of the compilers found is a GNU compiler. -dnl To do this, when you have finally made up your mind on which one to use, -dnl and set CC accordingly, invoke [GMP_PROG_CC_SELECT]. That macro will -dnl also make sure that your selection of CFLAGS is valid. -dnl -AC_DEFUN(GMP_PROG_CC_FIND, -[AC_BEFORE([$0], [CC_PROG_CPP]) -ifelse([$1], , gmp_cc_list="gcc cc", gmp_cc_list="[$1]") -ifelse([$2], , gmp_req_64bit_cc="no", gmp_req_64bit_cc="[$2]") - -CC32= -CC64= -for c in $gmp_cc_list; do - # Avoid cache hits. - unset CC - unset ac_cv_prog_CC - AC_CHECK_TOOL(CC, $c, $c) - if test -n "$CC"; then - eval c_flags=\$gmp_cflags_$c - GMP_PROG_CC_WORKS($CC, $c_flags, - gmp_prog_cc_works=yes, - gmp_prog_cc_works=no) - - if test "$gmp_prog_cc_works" != "yes"; then - continue - fi - - # Save first working compiler, whether 32- or 64-bit capable. - if test -z "$CC32"; then - CC32="$CC" - fi - if test "$gmp_req_64bit_cc" = "yes"; then - eval c_flags=\$gmp_cflags64_$c - - # Verify that the compiler works in 64-bit mode as well. - # /usr/ucb/cc on Solaris 7 can *compile* in 64-bit mode, but not link. - GMP_PROG_CC_WORKS($c, $c_flags, - gmp_prog_cc_works=yes, - gmp_prog_cc_works=no) - - if test "$gmp_prog_cc_works" = "yes"; then - GMP_CHECK_CC_64BIT($c, $c_flags) - if test "$gmp_cv_cc_64bit" = "yes"; then - test -z "$CC64" && CC64="$c" - test -z "$CFLAGS64" && CFLAGS64="$c_flags" - # We have CC64 so we're done. - break - fi - fi - else - # We have CC32, and we don't need a 64-bit compiler so we're done. - break - fi - fi -done -CC="$CC32" -])dnl - -dnl GMP_PROG_CC_SELECT -dnl Check that `CC' works with `CFLAGS'. Check if `CC' is a GNU compiler. -dnl Cache the result as `ac_cv_prog_CC'. -AC_DEFUN(GMP_PROG_CC_SELECT, -[AC_BEFORE([$0], [CC_PROG_CPP]) -AC_PROG_CC_WORKS -AC_PROG_CC_GNU - -if test "$ac_cv_prog_gcc" = "yes"; then - GCC=yes -else - GCC= -fi - -# Set CFLAGS if not already set. -if test -z "$CFLAGS"; then - CFLAGS="-g" - if test "$GCC" = "yes"; then - CFLAGS="$CFLAGS -O2" - fi -fi - -AC_SUBST(CC) -AC_CACHE_VAL(ac_cv_prog_CC, ac_cv_prog_CC="$CC") -AC_PROVIDE([AC_PROG_CC]) -])dnl - -dnl GMP_CHECK_CC_64BIT(cc, cflags64) -dnl Find out if `CC' can produce 64-bit code. -dnl Requires NM to be set to nm for target. -dnl FIXME: Cache result. -AC_DEFUN(GMP_CHECK_CC_64BIT, -[ - gmp_tmp_CC_save="$CC" - CC="[$1]" - AC_MSG_CHECKING([whether the C compiler ($CC) is 64-bit capable]) - if test -z "$NM"; then - echo; echo ["configure: $0: fatal: need nm"] - exit 1 - fi - gmp_tmp_CFLAGS_save="$CFLAGS" - CFLAGS="[$2]" - - case "$target" in - hppa2.0*-*-*) - # FIXME: If gcc is installed under another name than "gcc", we will - # test the wrong thing. - if test "$CC" != "gcc"; then - dnl Let compiler version A.10.32.30 or higher be ok. - dnl Bad compiler output: - dnl ccom: HP92453-01 G.10.32.05 HP C Compiler - dnl Good compiler output: - dnl ccom: HP92453-01 A.10.32.30 HP C Compiler - echo >conftest.c - gmp_tmp_vs=`$CC $CFLAGS -V -c -o conftest.o conftest.c 2>&1 | grep "^ccom:"` - rm conftest* - gmp_tmp_v1=`echo $gmp_tmp_vs | sed 's/.* .\.\(.*\)\..*\..* HP C.*/\1/'` - gmp_tmp_v2=`echo $gmp_tmp_vs | sed 's/.* .\..*\.\(.*\)\..* HP C.*/\1/'` - gmp_tmp_v3=`echo $gmp_tmp_vs | sed 's/.* .\..*\..*\.\(.*\) HP C.*/\1/'` - gmp_cv_cc_64bit=no - test -n "$gmp_tmp_v1" && test "$gmp_tmp_v1" -ge "10" \ - && test -n "$gmp_tmp_v2" && test "$gmp_tmp_v2" -ge "32" \ - && test -n "$gmp_tmp_v3" && test "$gmp_tmp_v3" -ge "30" \ - && gmp_cv_cc_64bit=yes - else # gcc - # FIXME: Compile a minimal file and determine if the resulting object - # file is an ELF file. If so, gcc can produce 64-bit code. - # Do we have file(1) for target? - gmp_cv_cc_64bit=no - fi - ;; - mips-sgi-irix6.*) - # We use `-n32' to cc and `-mabi=n32' to gcc, resulting in 64-bit - # arithmetic but not 64-bit pointers, so the general test for sizeof - # (void *) is not valid. - # Simply try to compile an empty main. If that succeeds return - # true. - AC_TRY_COMPILE( , , - gmp_cv_cc_64bit=yes, gmp_cv_cc_64bit=no, - gmp_cv_cc_64bit=no) - ;; - *-*-*) - # Allocate an array of size sizeof (void *) and use nm to determine its - # size. We depend on the first declared variable being put at address 0. - cat >conftest.c <)dnl - gmp_tmp_val=`$NM conftest.o | grep post | sed -e 's;[[][0-9][]]\(.*\);\1;' \ - -e 's;[^1-9]*\([0-9]*\).*;\1;'` - changequote([, ])dnl - if test "$gmp_tmp_val" = "8"; then - gmp_cv_cc_64bit=yes - else - gmp_cv_cc_64bit=no - fi - else - echo "configure: failed program was:" >&AC_FD_CC - cat conftest.$ac_ext >&AC_FD_CC - gmp_cv_cc_64bit=no - fi - rm -f conftest* - ;; - esac - - CC="$gmp_tmp_CC_save" - CFLAGS="$gmp_tmp_CFLAGS_save" - AC_MSG_RESULT($gmp_cv_cc_64bit) -])dnl - -dnl GMP_INIT([M4-DEF-FILE]) -dnl -AC_DEFUN(GMP_INIT, -[ifelse([$1], , gmp_configm4=config.m4, gmp_configm4="[$1]") -gmp_tmpconfigm4=cnfm4.tmp -gmp_tmpconfigm4i=cnfm4i.tmp -gmp_tmpconfigm4p=cnfm4p.tmp -test -f $gmp_tmpconfigm4 && rm $gmp_tmpconfigm4 -test -f $gmp_tmpconfigm4i && rm $gmp_tmpconfigm4i -test -f $gmp_tmpconfigm4p && rm $gmp_tmpconfigm4p -])dnl - -dnl GMP_FINISH -dnl ---------- -dnl Create config.m4 from its accumulated parts. -dnl -dnl __CONFIG_M4_INCLUDED__ is used so that a second or subsequent include -dnl of config.m4 is harmless. -dnl -dnl A separate ifdef on the angle bracket quoted part ensures the quoting -dnl style there is respected. The basic defines from gmp_tmpconfigm4 are -dnl fully quoted but are still put under an ifdef in case any have been -dnl redefined by one of the m4 include files. -dnl -dnl Doing a big ifdef within asm-defs.m4 and/or other macro files wouldn't -dnl work, since it'd interpret parentheses and quotes in dnl comments, and -dnl having a whole file as a macro argument would overflow the string space -dnl on BSD m4. - -AC_DEFUN(GMP_FINISH, -[AC_REQUIRE([GMP_INIT]) -echo "creating $gmp_configm4" -echo ["dnl $gmp_configm4. Generated automatically by configure."] > $gmp_configm4 -if test -f $gmp_tmpconfigm4; then - echo ["changequote(<,>)dnl"] >> $gmp_configm4 - echo ["ifdef(<__CONFIG_M4_INCLUDED__>,,<"] >> $gmp_configm4 - cat $gmp_tmpconfigm4 >> $gmp_configm4 - echo [">)"] >> $gmp_configm4 - echo ["changequote(\`,')dnl"] >> $gmp_configm4 - rm $gmp_tmpconfigm4 -fi -echo ["ifdef(\`__CONFIG_M4_INCLUDED__',,\`"] >> $gmp_configm4 -if test -f $gmp_tmpconfigm4i; then - cat $gmp_tmpconfigm4i >> $gmp_configm4 - rm $gmp_tmpconfigm4i -fi -if test -f $gmp_tmpconfigm4p; then - cat $gmp_tmpconfigm4p >> $gmp_configm4 - rm $gmp_tmpconfigm4p -fi -echo ["')"] >> $gmp_configm4 -echo ["define(\`__CONFIG_M4_INCLUDED__')"] >> $gmp_configm4 -])dnl - -dnl GMP_INCLUDE(FILE) -AC_DEFUN(GMP_INCLUDE, -[AC_REQUIRE([GMP_INIT]) -echo ["include(\`$1')"] >> $gmp_tmpconfigm4i -])dnl - -dnl GMP_SINCLUDE(FILE) -AC_DEFUN(GMP_SINCLUDE, -[AC_REQUIRE([GMP_INIT]) -echo ["sinclude(\`$1')"] >> $gmp_tmpconfigm4i -])dnl - -dnl GMP_DEFINE(MACRO, DEFINITION [, LOCATION]) -dnl [ Define M4 macro MACRO as DEFINITION in temporary file. ] -dnl [ If LOCATION is `POST', the definition will appear after any ] -dnl [ include() directives inserted by GMP_INCLUDE/GMP_SINCLUDE. ] -dnl [ Mind the quoting! No shell variables will get expanded. ] -dnl [ Don't forget to invoke GMP_FINISH to create file config.m4. ] -dnl [ config.m4 uses `<' and '>' as quote characters for all defines. ] -AC_DEFUN(GMP_DEFINE, -[AC_REQUIRE([GMP_INIT]) -echo ['define(<$1>, <$2>)'] >> ifelse([$3], [POST], $gmp_tmpconfigm4p, $gmp_tmpconfigm4) -])dnl - -dnl GMP_DEFINE_RAW(STRING, [, LOCATION]) -dnl [ Put STRING in temporary file. ] -dnl [ If LOCATION is `POST', the definition will appear after any ] -dnl [ include() directives inserted by GMP_INCLUDE/GMP_SINCLUDE. ] -dnl [ Don't forget to invoke GMP_FINISH to create file config.m4. ] -AC_DEFUN(GMP_DEFINE_RAW, -[AC_REQUIRE([GMP_INIT]) -echo [$1] >> ifelse([$2], [POST], $gmp_tmpconfigm4p, $gmp_tmpconfigm4) -])dnl - -dnl GMP_CHECK_ASM_LABEL_SUFFIX -dnl Should a label have a colon or not? -AC_DEFUN(GMP_CHECK_ASM_LABEL_SUFFIX, -[AC_CACHE_CHECK([what assembly label suffix to use], - gmp_cv_check_asm_label_suffix, -[case "$target" in - *-*-hpux*) gmp_cv_check_asm_label_suffix=[""] ;; - *) gmp_cv_check_asm_label_suffix=[":"] ;; -esac -]) -echo ["define(, <\$][1$gmp_cv_check_asm_label_suffix>)"] >> $gmp_tmpconfigm4 -])dnl - -dnl GMP_CHECK_ASM_UNDERSCORE([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) -dnl Shamelessly borrowed from glibc. -AC_DEFUN(GMP_CHECK_ASM_UNDERSCORE, -[AC_CACHE_CHECK([if symbols are prefixed by underscore], - gmp_cv_check_asm_underscore, -[cat > conftest.$ac_ext </dev/null; then - gmp_cv_check_asm_underscore=yes - else - gmp_cv_check_asm_underscore=no - fi -else - echo "configure: failed program was:" >&AC_FD_CC - cat conftest.$ac_ext >&AC_FD_CC -fi -rm -f conftest* -]) -if test "$gmp_cv_check_asm_underscore" = "yes"; then - GMP_DEFINE(GSYM_PREFIX, [_]) - ifelse([$1], , :, [$1]) -else - GMP_DEFINE(GSYM_PREFIX, []) - ifelse([$2], , :, [$2]) -fi -])dnl - -dnl GMP_CHECK_ASM_ALIGN_LOG([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) -dnl Is parameter to `.align' logarithmic? -dnl Requires NM to be set to nm for target. -AC_DEFUN(GMP_CHECK_ASM_ALIGN_LOG, -[AC_REQUIRE([GMP_CHECK_ASM_GLOBL]) -AC_REQUIRE([GMP_CHECK_ASM_DATA]) -AC_REQUIRE([GMP_CHECK_ASM_LABEL_SUFFIX]) -AC_CACHE_CHECK([if .align assembly directive is logarithmic], - gmp_cv_check_asm_align_log, -[if test -z "$NM"; then - echo; echo ["configure: $0: fatal: need nm"] - exit 1 -fi -cat > conftest.s <) - gmp_tmp_val=`$NM conftest.o | grep foo | sed -e 's;[[][0-9][]]\(.*\);\1;' \ - -e 's;[^1-9]*\([0-9]*\).*;\1;'` - changequote([, ])dnl - if test "$gmp_tmp_val" = "10" || test "$gmp_tmp_val" = "16"; then - gmp_cv_check_asm_align_log=yes - else - gmp_cv_check_asm_align_log=no - fi -else - echo "configure: failed program was:" >&AC_FD_CC - cat conftest.s >&AC_FD_CC -fi -rm -f conftest* -]) -GMP_DEFINE_RAW(["define(,<$gmp_cv_check_asm_align_log>)"]) -if test "$gmp_cv_check_asm_align_log" = "yes"; then - ifelse([$1], , :, [$1]) -else - ifelse([$2], , :, [$2]) -fi -])dnl - - -dnl GMP_CHECK_ASM_ALIGN_FILL_0x90 -dnl ----------------------------- -dnl Determine whether a ",0x90" suffix works on a .align directive. -dnl This is only meant for use on x86, where 0x90 is a "nop". -dnl -dnl Old gas, eg. 1.92.3 - needs ",0x90" or else the fill is an invalid 0x00. -dnl New gas, eg. 2.91 - generates the good multibyte nop fills even when -dnl ",0x90" is given. -dnl Solaris 2.6 as - doesn't allow ",0x90", gives a fatal error. -dnl Solaris 2.8 as - gives a warning for ",0x90", no ill effect. -dnl -dnl Note that both solaris "as"s only care about ",0x90" if they actually -dnl have to use it to fill something, hence the .byte in the sample. It's -dnl only the second .align that provokes an error or warning. -dnl -dnl We prefer to suppress the warning from solaris 2.8 to stop anyone -dnl worrying something might be wrong. - -AC_DEFUN(GMP_CHECK_ASM_ALIGN_FILL_0x90, -[AC_CACHE_CHECK([if the .align directive accepts an 0x90 fill in .text], - gmp_cv_check_asm_align_fill_0x90, -[AC_REQUIRE([GMP_CHECK_ASM_TEXT]) -cat > conftest.s <&AC_FD_CC - if echo "$gmp_tmp_val" | grep "Warning: Fill parameter ignored for executable section"; then - echo "Supressing this warning by omitting 0x90" 1>&AC_FD_CC - gmp_cv_check_asm_align_fill_0x90=no - else - gmp_cv_check_asm_align_fill_0x90=yes - fi -else - echo "Non-zero exit code" 1>&AC_FD_CC - echo "$gmp_tmp_val" 1>&AC_FD_CC - gmp_cv_check_asm_align_fill_0x90=no -fi -rm -f conftest* -]) -GMP_DEFINE_RAW( -["define(,<$gmp_cv_check_asm_align_fill_0x90>)"]) -]) - - -dnl GMP_CHECK_ASM_TEXT -AC_DEFUN(GMP_CHECK_ASM_TEXT, -[AC_CACHE_CHECK([how to switch to text section], gmp_cv_check_asm_text, -[case "$target" in - *-*-aix*) - changequote({, }) - gmp_cv_check_asm_text={".csect .text[PR]"} - changequote([, ]) - ;; - *-*-hpux*) gmp_cv_check_asm_text=[".code"] ;; - *) gmp_cv_check_asm_text=[".text"] ;; -esac -]) -echo ["define(, <$gmp_cv_check_asm_text>)"] >> $gmp_tmpconfigm4 -])dnl - -dnl GMP_CHECK_ASM_DATA -dnl Can we say `.data'? -AC_DEFUN(GMP_CHECK_ASM_DATA, -[AC_CACHE_CHECK([how to switch to data section], gmp_cv_check_asm_data, -[case "$target" in - *-*-aix*) - changequote({, }) - gmp_cv_check_asm_data={".csect .data[RW]"} - changequote([, ]) - ;; - *) gmp_cv_check_asm_data=[".data"] ;; -esac -]) -echo ["define(, <$gmp_cv_check_asm_data>)"] >> $gmp_tmpconfigm4 -])dnl - -dnl GMP_CHECK_ASM_GLOBL -dnl Can we say `.global'? -AC_DEFUN(GMP_CHECK_ASM_GLOBL, -[AC_CACHE_CHECK([how to export a symbol], gmp_cv_check_asm_globl, -[case "$target" in - *-*-hpux*) gmp_cv_check_asm_globl=[".export"] ;; - *) gmp_cv_check_asm_globl=[".globl"] ;; -esac -]) -echo ["define(, <$gmp_cv_check_asm_globl>)"] >> $gmp_tmpconfigm4 -])dnl - -dnl GMP_CHECK_ASM_TYPE -dnl Can we say `.type'? -AC_DEFUN(GMP_CHECK_ASM_TYPE, -[AC_CACHE_CHECK([how the .type assembly directive should be used], -gmp_cv_check_asm_type, -[ac_assemble="$CCAS $CFLAGS conftest.s 1>&AC_FD_CC" -for gmp_tmp_prefix in @ \# %; do - echo " .type sym,${gmp_tmp_prefix}function" > conftest.s - if AC_TRY_EVAL(ac_assemble); then - gmp_cv_check_asm_type="[.type \$][1,${gmp_tmp_prefix}\$][2]" - break - fi -done -if test -z "$gmp_cv_check_asm_type"; then - gmp_cv_check_asm_type="[dnl]" -fi -]) -echo ["define(, <$gmp_cv_check_asm_type>)"] >> $gmp_tmpconfigm4 -])dnl - -dnl GMP_CHECK_ASM_SIZE -dnl Can we say `.size'? -AC_DEFUN(GMP_CHECK_ASM_SIZE, -[AC_CACHE_CHECK([if the .size assembly directive works], gmp_cv_check_asm_size, -[ac_assemble="$CCAS $CFLAGS conftest.s 1>&AC_FD_CC" -echo ' .size sym,1' > conftest.s -if AC_TRY_EVAL(ac_assemble); then - gmp_cv_check_asm_size="[.size \$][1,\$][2]" -else - gmp_cv_check_asm_size="[dnl]" -fi -]) -echo ["define(, <$gmp_cv_check_asm_size>)"] >> $gmp_tmpconfigm4 -])dnl - -dnl GMP_CHECK_ASM_LSYM_PREFIX -dnl What is the prefix for a local label? -dnl Requires NM to be set to nm for target. -AC_DEFUN(GMP_CHECK_ASM_LSYM_PREFIX, -[AC_REQUIRE([GMP_CHECK_ASM_LABEL_SUFFIX]) -AC_CACHE_CHECK([what prefix to use for a local label], -gmp_cv_check_asm_lsym_prefix, -[if test -z "$NM"; then - echo; echo ["$0: fatal: need nm"] - exit 1 -fi -ac_assemble="$CCAS $CFLAGS conftest.s 1>&AC_FD_CC" -gmp_cv_check_asm_lsym_prefix="L" -for gmp_tmp_pre in L .L $ L$; do - cat > conftest.s </dev/null 2>&1 - gmp_rc=$? - if test "$gmp_rc" != "0"; then - echo "configure: $NM failure, using default" - break - fi - if $NM conftest.o | grep gurkmacka >/dev/null; then true; else - gmp_cv_check_asm_lsym_prefix="$gmp_tmp_pre" - break - fi - else - echo "configure: failed program was:" >&AC_FD_CC - cat conftest.s >&AC_FD_CC - # Use default. - fi -done -rm -f conftest* -]) -echo ["define(, <${gmp_cv_check_asm_lsym_prefix}>)"] >> $gmp_tmpconfigm4 -]) - -dnl GMP_CHECK_ASM_W32 -dnl How to [define] a 32-bit word. -dnl Requires NM to be set to nm for target. -AC_DEFUN(GMP_CHECK_ASM_W32, -[AC_REQUIRE([GMP_CHECK_ASM_DATA]) -AC_REQUIRE([GMP_CHECK_ASM_GLOBL]) -AC_REQUIRE([GMP_CHECK_ASM_LABEL_SUFFIX]) -AC_CACHE_CHECK([how to [define] a 32-bit word], - gmp_cv_check_asm_w32, -[if test -z "$NM"; then - echo; echo ["configure: $0: fatal: need nm"] - exit 1 -fi - -# FIXME: HPUX puts first symbol at 0x40000000, breaking our assumption -# that it's at 0x0. We'll have to declare another symbol before the -# .long/.word and look at the distance between the two symbols. The -# only problem is that the sed expression(s) barfs (on Solaris, for -# example) for the symbol with value 0. For now, HPUX uses .word. - -case "$target" in - *-*-hpux*) - gmp_cv_check_asm_w32=".word" - ;; - *-*-*) - ac_assemble="$CCAS $CFLAGS conftest.s 1>&AC_FD_CC" - for gmp_tmp_op in .long .word; do - cat > conftest.s <) - gmp_tmp_val=`$NM conftest.o | grep foo | sed -e 's;[[][0-9][]]\(.*\);\1;' \ - -e 's;[^1-9]*\([0-9]*\).*;\1;'` - changequote([, ])dnl - if test "$gmp_tmp_val" = "4"; then - gmp_cv_check_asm_w32="$gmp_tmp_op" - break - fi - fi - done - ;; -esac - -if test -z "$gmp_cv_check_asm_w32"; then - echo; echo ["configure: $0: fatal: do not know how to define a 32-bit word"] - exit 1 -fi -rm -f conftest* -]) -echo ["define(, <$gmp_cv_check_asm_w32>)"] >> $gmp_tmpconfigm4 -]) - -dnl GMP_CHECK_ASM_MMX([ACTION-IF-FOUND, [ACTION-IF-NOT-FOUND]]) -dnl Can we assemble MMX insns? -AC_DEFUN(GMP_CHECK_ASM_MMX, -[AC_REQUIRE([GMP_CHECK_ASM_TEXT]) -AC_CACHE_CHECK([if the assembler knows about MMX instructions], - gmp_cv_check_asm_mmx, -[cat > conftest.s < conftest.s <conftest.c < -#include -#include -#include -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -int argc; -char **argv; -], [ -return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; -], -[am_cv_prog_cc_stdc="$ac_arg"; break]) -done -CC="$ac_save_CC" -]) -if test -z "$am_cv_prog_cc_stdc"; then - AC_MSG_RESULT([none needed]) -else - AC_MSG_RESULT($am_cv_prog_cc_stdc) -fi -case "x$am_cv_prog_cc_stdc" in - x|xno) ;; - *) CC="$CC $am_cv_prog_cc_stdc" ;; -esac -]) - -# Do all the work for Automake. This macro actually does too much -- -# some checks are only needed if your package does certain things. -# But this isn't really a big deal. - -# serial 1 - -dnl Usage: -dnl AM_INIT_AUTOMAKE(package,version, [no-define]) - -AC_DEFUN(AM_INIT_AUTOMAKE, -[AC_REQUIRE([AC_PROG_INSTALL]) -dnl We require 2.13 because we rely on SHELL being computed by configure. -AC_PREREQ([2.13]) -PACKAGE=[$1] -AC_SUBST(PACKAGE) -VERSION=[$2] -AC_SUBST(VERSION) -dnl test to see if srcdir already configured -if test "`CDPATH=: && cd $srcdir && pwd`" != "`pwd`" && - test -f $srcdir/config.status; then - AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) -fi -ifelse([$3],, -AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) -AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])) -AC_REQUIRE([AM_SANITY_CHECK]) -AC_REQUIRE([AC_ARG_PROGRAM]) -AM_MISSING_PROG(ACLOCAL, aclocal) -AM_MISSING_PROG(AUTOCONF, autoconf) -AM_MISSING_PROG(AUTOMAKE, automake) -AM_MISSING_PROG(AUTOHEADER, autoheader) -AM_MISSING_PROG(MAKEINFO, makeinfo) -AM_MISSING_PROG(AMTAR, tar) -AM_MISSING_INSTALL_SH -dnl We need awk for the "check" target. The system "awk" is bad on -dnl some platforms. -AC_REQUIRE([AC_PROG_AWK]) -AC_REQUIRE([AC_PROG_MAKE_SET]) -AC_REQUIRE([AM_DEP_TRACK]) -AC_REQUIRE([AM_SET_DEPDIR]) -ifdef([AC_PROVIDE_AC_PROG_CC], [AM_DEPENDENCIES(CC)], [ - define([AC_PROG_CC], defn([AC_PROG_CC])[AM_DEPENDENCIES(CC)])]) -ifdef([AC_PROVIDE_AC_PROG_CXX], [AM_DEPENDENCIES(CXX)], [ - define([AC_PROG_CXX], defn([AC_PROG_CXX])[AM_DEPENDENCIES(CXX)])]) -]) - -# -# Check to make sure that the build environment is sane. -# - -AC_DEFUN(AM_SANITY_CHECK, -[AC_MSG_CHECKING([whether build environment is sane]) -# Just in case -sleep 1 -echo timestamp > conftestfile -# Do `set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null` - if test "[$]*" = "X"; then - # -L didn't work. - set X `ls -t $srcdir/configure conftestfile` - fi - if test "[$]*" != "X $srcdir/configure conftestfile" \ - && test "[$]*" != "X conftestfile $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken -alias in your environment]) - fi - - test "[$]2" = conftestfile - ) -then - # Ok. - : -else - AC_MSG_ERROR([newly created file is older than distributed files! -Check your system clock]) -fi -rm -f conftest* -AC_MSG_RESULT(yes)]) - -dnl AM_MISSING_PROG(NAME, PROGRAM) -AC_DEFUN(AM_MISSING_PROG, [ -AC_REQUIRE([AM_MISSING_HAS_RUN]) -$1=${$1-"${am_missing_run}$2"} -AC_SUBST($1)]) - -dnl Like AM_MISSING_PROG, but only looks for install-sh. -dnl AM_MISSING_INSTALL_SH() -AC_DEFUN(AM_MISSING_INSTALL_SH, [ -AC_REQUIRE([AM_MISSING_HAS_RUN]) -if test -z "$install_sh"; then - install_sh="$ac_aux_dir/install-sh" - test -f "$install_sh" || install_sh="$ac_aux_dir/install.sh" - test -f "$install_sh" || install_sh="${am_missing_run}${ac_auxdir}/install-sh" - dnl FIXME: an evil hack: we remove the SHELL invocation from - dnl install_sh because automake adds it back in. Sigh. - install_sh="`echo $install_sh | sed -e 's/\${SHELL}//'`" -fi -AC_SUBST(install_sh)]) - -dnl AM_MISSING_HAS_RUN. -dnl Define MISSING if not defined so far and test if it supports --run. -dnl If it does, set am_missing_run to use it, otherwise, to nothing. -AC_DEFUN([AM_MISSING_HAS_RUN], [ -test x"${MISSING+set}" = xset || \ - MISSING="\${SHELL} `CDPATH=: && cd $ac_aux_dir && pwd`/missing" -dnl Use eval to expand $SHELL -if eval "$MISSING --run :"; then - am_missing_run="$MISSING --run " -else - am_missing_run= - am_backtick='`' - AC_MSG_WARN([${am_backtick}missing' script is too old or missing]) -fi -]) - -dnl See how the compiler implements dependency checking. -dnl Usage: -dnl AM_DEPENDENCIES(NAME) -dnl NAME is "CC", "CXX" or "OBJC". - -dnl We try a few techniques and use that to set a single cache variable. - -AC_DEFUN(AM_DEPENDENCIES,[ -AC_REQUIRE([AM_SET_DEPDIR]) -AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS]) -ifelse([$1],CC,[ -AC_REQUIRE([AC_PROG_CC]) -AC_REQUIRE([AC_PROG_CPP]) -depcc="$CC" -depcpp="$CPP"],[$1],CXX,[ -AC_REQUIRE([AC_PROG_CXX]) -AC_REQUIRE([AC_PROG_CXXCPP]) -depcc="$CXX" -depcpp="$CXXCPP"],[$1],OBJC,[ -am_cv_OBJC_dependencies_compiler_type=gcc],[ -AC_REQUIRE([AC_PROG_][$1]) -depcc="$[$1]" -depcpp=""]) -AC_MSG_CHECKING([dependency style of $depcc]) -AC_CACHE_VAL(am_cv_[$1]_dependencies_compiler_type,[ -if test -z "$AMDEP"; then - echo '#include "conftest.h"' > conftest.c - echo 'int i;' > conftest.h - - am_cv_[$1]_dependencies_compiler_type=none - for depmode in `sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < "$am_depcomp"`; do - case "$depmode" in - nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - none) break ;; - esac - if depmode="$depmode" \ - source=conftest.c object=conftest.o \ - depfile=conftest.Po tmpdepfile=conftest.TPo \ - $SHELL $am_depcomp $depcc -c conftest.c 2>/dev/null && - grep conftest.h conftest.Po > /dev/null 2>&1; then - am_cv_[$1]_dependencies_compiler_type="$depmode" - break - fi - done - - rm -f conftest.* -else - am_cv_[$1]_dependencies_compiler_type=none -fi -]) -AC_MSG_RESULT($am_cv_[$1]_dependencies_compiler_type) -[$1]DEPMODE="depmode=$am_cv_[$1]_dependencies_compiler_type" -AC_SUBST([$1]DEPMODE) -]) - -dnl Choose a directory name for dependency files. -dnl This macro is AC_REQUIREd in AM_DEPENDENCIES - -AC_DEFUN(AM_SET_DEPDIR,[ -if test -d .deps || mkdir .deps 2> /dev/null || test -d .deps; then - DEPDIR=.deps -else - DEPDIR=_deps -fi -AC_SUBST(DEPDIR) -]) - -AC_DEFUN(AM_DEP_TRACK,[ -AC_ARG_ENABLE(dependency-tracking, -[ --disable-dependency-tracking Speeds up one-time builds - --enable-dependency-tracking Do not reject slow dependency extractors]) -if test "x$enable_dependency_tracking" = xno; then - AMDEP="#" -else - am_depcomp="$ac_aux_dir/depcomp" - if test ! -f "$am_depcomp"; then - AMDEP="#" - else - AMDEP= - fi -fi -AC_SUBST(AMDEP) -if test -z "$AMDEP"; then - AMDEPBACKSLASH='\' -else - AMDEPBACKSLASH= -fi -pushdef([subst], defn([AC_SUBST])) -subst(AMDEPBACKSLASH) -popdef([subst]) -]) - -dnl Generate code to set up dependency tracking. -dnl This macro should only be invoked once -- use via AC_REQUIRE. -dnl Usage: -dnl AM_OUTPUT_DEPENDENCY_COMMANDS - -dnl -dnl This code is only required when automatic dependency tracking -dnl is enabled. FIXME. This creates each `.P' file that we will -dnl need in order to bootstrap the dependency handling code. -AC_DEFUN(AM_OUTPUT_DEPENDENCY_COMMANDS,[ -AC_OUTPUT_COMMANDS([ -test x"$AMDEP" != x"" || -for mf in $CONFIG_FILES; do - case "$mf" in - Makefile) dirpart=.;; - */Makefile) dirpart=`echo "$mf" | sed -e 's|/[^/]*$||'`;; - *) continue;; - esac - grep '^DEP_FILES *= *[^ #]' < "$mf" > /dev/null || continue - # Extract the definition of DEP_FILES from the Makefile without - # running `make'. - DEPDIR=`sed -n -e '/^DEPDIR = / s///p' < "$mf"` - test -z "$DEPDIR" && continue - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n -e '/^U = / s///p' < "$mf"` - test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR" - # We invoke sed twice because it is the simplest approach to - # changing $(DEPDIR) to its actual value in the expansion. - for file in `sed -n -e ' - /^DEP_FILES = .*\\\\$/ { - s/^DEP_FILES = // - :loop - s/\\\\$// - p - n - /\\\\$/ b loop - p - } - /^DEP_FILES = / s/^DEP_FILES = //p' < "$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`echo "$file" | sed -e 's|/[^/]*$||'` - $ac_aux_dir/mkinstalldirs "$dirpart/$fdir" > /dev/null 2>&1 - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" - done -done -], [AMDEP="$AMDEP" -ac_aux_dir="$ac_aux_dir"])]) - -# Like AC_CONFIG_HEADER, but automatically create stamp file. - -AC_DEFUN(AM_CONFIG_HEADER, -[AC_PREREQ([2.12]) -AC_CONFIG_HEADER([$1]) -dnl When config.status generates a header, we must update the stamp-h file. -dnl This file resides in the same directory as the config header -dnl that is generated. We must strip everything past the first ":", -dnl and everything past the last "/". -AC_OUTPUT_COMMANDS(changequote(<<,>>)dnl -ifelse(patsubst(<<$1>>, <<[^ ]>>, <<>>), <<>>, -<>CONFIG_HEADERS" || echo timestamp > patsubst(<<$1>>, <<^\([^:]*/\)?.*>>, <<\1>>)stamp-h<<>>dnl>>, -<>; do - case " <<$>>CONFIG_HEADERS " in - *" <<$>>am_file "*<<)>> - echo timestamp > `echo <<$>>am_file | sed -e 's%:.*%%' -e 's%[^/]*$%%'`stamp-h$am_indx - ;; - esac - am_indx=`expr "<<$>>am_indx" + 1` -done<<>>dnl>>) -changequote([,]))]) - -# Add --enable-maintainer-mode option to configure. -# From Jim Meyering - -# serial 1 - -AC_DEFUN(AM_MAINTAINER_MODE, -[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) - dnl maintainer-mode is disabled by default - AC_ARG_ENABLE(maintainer-mode, -[ --enable-maintainer-mode enable make rules and dependencies not useful - (and sometimes confusing) to the casual installer], - USE_MAINTAINER_MODE=$enableval, - USE_MAINTAINER_MODE=no) - AC_MSG_RESULT($USE_MAINTAINER_MODE) - AM_CONDITIONAL(MAINTAINER_MODE, test $USE_MAINTAINER_MODE = yes) - MAINT=$MAINTAINER_MODE_TRUE - AC_SUBST(MAINT)dnl -] -) - -# Define a conditional. - -AC_DEFUN(AM_CONDITIONAL, -[AC_SUBST($1_TRUE) -AC_SUBST($1_FALSE) -if $2; then - $1_TRUE= - $1_FALSE='#' -else - $1_TRUE='#' - $1_FALSE= -fi]) - - -# serial 42 AC_PROG_LIBTOOL -AC_DEFUN(AC_PROG_LIBTOOL, -[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl - -# Save cache, so that ltconfig can load it -AC_CACHE_SAVE - -# Actually configure libtool. ac_aux_dir is where install-sh is found. -AR="$AR" CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" \ -MAGIC="$MAGIC" LD="$LD" LDFLAGS="$LDFLAGS" LIBS="$LIBS" \ -LN_S="$LN_S" NM="$NM" RANLIB="$RANLIB" STRIP="$STRIP" \ -AS="$AS" DLLTOOL="$DLLTOOL" OBJDUMP="$OBJDUMP" \ -objext="$OBJEXT" exeext="$EXEEXT" reload_flag="$reload_flag" \ -deplibs_check_method="$deplibs_check_method" file_magic_cmd="$file_magic_cmd" \ -${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig --no-reexec \ -$libtool_flags --no-verify --build="$build" $ac_aux_dir/ltmain.sh $lt_target \ -|| AC_MSG_ERROR([libtool configure failed]) - -# Reload cache, that may have been modified by ltconfig -AC_CACHE_LOAD - -# This can be used to rebuild libtool when needed -LIBTOOL_DEPS="$ac_aux_dir/ltconfig $ac_aux_dir/ltmain.sh" - -# Always use our own libtool. -LIBTOOL='$(SHELL) $(top_builddir)/libtool' -AC_SUBST(LIBTOOL)dnl - -# Redirect the config.log output again, so that the ltconfig log is not -# clobbered by the next message. -exec 5>>./config.log -]) - -AC_DEFUN(AC_LIBTOOL_SETUP, -[AC_PREREQ(2.13)dnl -AC_REQUIRE([AC_ENABLE_SHARED])dnl -AC_REQUIRE([AC_ENABLE_STATIC])dnl -AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl -AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_CANONICAL_BUILD])dnl -AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([AC_PROG_LD])dnl -AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl -AC_REQUIRE([AC_PROG_NM])dnl -AC_REQUIRE([AC_PROG_LN_S])dnl -AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl -AC_REQUIRE([AC_OBJEXT])dnl -AC_REQUIRE([AC_EXEEXT])dnl -dnl - -# Only perform the check for file, if the check method requires it -case "$deplibs_check_method" in -file_magic*) - if test "$file_magic_cmd" = '${MAGIC}'; then - AC_PATH_MAGIC - fi - ;; -esac - -case "$target" in -NONE) lt_target="$host" ;; -*) lt_target="$target" ;; -esac - -AC_CHECK_TOOL(RANLIB, ranlib, :) -AC_CHECK_TOOL(STRIP, strip, :) - -# Check for any special flags to pass to ltconfig. -libtool_flags="--cache-file=$cache_file" -test "$enable_shared" = no && libtool_flags="$libtool_flags --disable-shared" -test "$enable_static" = no && libtool_flags="$libtool_flags --disable-static" -test "$enable_fast_install" = no && libtool_flags="$libtool_flags --disable-fast-install" -test "$ac_cv_prog_gcc" = yes && libtool_flags="$libtool_flags --with-gcc" -test "$ac_cv_prog_gnu_ld" = yes && libtool_flags="$libtool_flags --with-gnu-ld" -ifdef([AC_PROVIDE_AC_LIBTOOL_DLOPEN], -[libtool_flags="$libtool_flags --enable-dlopen"]) -ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL], -[libtool_flags="$libtool_flags --enable-win32-dll"]) -AC_ARG_ENABLE(libtool-lock, - [ --disable-libtool-lock avoid locking (might break parallel builds)]) -test "x$enable_libtool_lock" = xno && libtool_flags="$libtool_flags --disable-lock" -test x"$silent" = xyes && libtool_flags="$libtool_flags --silent" - -AC_ARG_WITH(pic, - [ --with-pic try to use only PIC/non-PIC objects [default=use both]], - pic_mode="$withval", pic_mode=default) -test x"$pic_mode" = xyes && libtool_flags="$libtool_flags --prefer-pic" -test x"$pic_mode" = xno && libtool_flags="$libtool_flags --prefer-non-pic" - -# Some flags need to be propagated to the compiler or linker for good -# libtool support. -case "$lt_target" in -*-*-irix6*) - # Find out which ABI we are using. - echo '[#]line __oline__ "configure"' > conftest.$ac_ext - if AC_TRY_EVAL(ac_compile); then - case "`/usr/bin/file conftest.o`" in - *32-bit*) - LD="${LD-ld} -32" - ;; - *N32*) - LD="${LD-ld} -n32" - ;; - *64-bit*) - LD="${LD-ld} -64" - ;; - esac - fi - rm -rf conftest* - ;; - -*-*-sco3.2v5*) - # On SCO OpenServer 5, we need -belf to get full-featured binaries. - SAVE_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -belf" - AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, - [AC_LANG_SAVE - AC_LANG_C - AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) - AC_LANG_RESTORE]) - if test x"$lt_cv_cc_needs_belf" != x"yes"; then - # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf - CFLAGS="$SAVE_CFLAGS" - fi - ;; - -ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL], -[*-*-cygwin* | *-*-mingw*) - AC_CHECK_TOOL(DLLTOOL, dlltool, false) - AC_CHECK_TOOL(AS, as, false) - AC_CHECK_TOOL(OBJDUMP, objdump, false) - - # recent cygwin and mingw systems supply a stub DllMain which the user - # can override, but on older systems we have to supply one - AC_CACHE_CHECK([if libtool should supply DllMain function], lt_cv_need_dllmain, - [AC_TRY_LINK([], - [extern int __attribute__((__stdcall__)) DllMain(void*, int, void*); - DllMain (0, 0, 0);], - [lt_cv_need_dllmain=no],[lt_cv_need_dllmain=yes])]) - - case "$lt_target/$CC" in - *-*-cygwin*/gcc*-mno-cygwin*|*-*-mingw*) - # old mingw systems require "-dll" to link a DLL, while more recent ones - # require "-mdll" - SAVE_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -mdll" - AC_CACHE_CHECK([how to link DLLs], lt_cv_cc_dll_switch, - [AC_TRY_LINK([], [], [lt_cv_cc_dll_switch=-mdll],[lt_cv_cc_dll_switch=-dll])]) - CFLAGS="$SAVE_CFLAGS" ;; - *-*-cygwin*) - # cygwin systems need to pass --dll to the linker, and not link - # crt.o which will require a WinMain@16 definition. - lt_cv_cc_dll_switch="-Wl,--dll -nostartfiles" ;; - esac - ;; - ]) -esac -]) - -# AC_LIBTOOL_DLOPEN - enable checks for dlopen support -AC_DEFUN(AC_LIBTOOL_DLOPEN, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])]) - -# AC_LIBTOOL_WIN32_DLL - declare package support for building win32 dll's -AC_DEFUN(AC_LIBTOOL_WIN32_DLL, [AC_BEFORE([$0], [AC_LIBTOOL_SETUP])]) - -# AC_ENABLE_SHARED - implement the --enable-shared flag -# Usage: AC_ENABLE_SHARED[(DEFAULT)] -# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to -# `yes'. -AC_DEFUN(AC_ENABLE_SHARED, [dnl -define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl -AC_ARG_ENABLE(shared, -changequote(<<, >>)dnl -<< --enable-shared[=PKGS] build shared libraries [default=>>AC_ENABLE_SHARED_DEFAULT], -changequote([, ])dnl -[p=${PACKAGE-default} -case "$enableval" in -yes) enable_shared=yes ;; -no) enable_shared=no ;; -*) - enable_shared=no - # Look at the argument we got. We use all the common list separators. - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," - for pkg in $enableval; do - if test "X$pkg" = "X$p"; then - enable_shared=yes - fi - done - IFS="$ac_save_ifs" - ;; -esac], -enable_shared=AC_ENABLE_SHARED_DEFAULT)dnl -]) - -# AC_DISABLE_SHARED - set the default shared flag to --disable-shared -AC_DEFUN(AC_DISABLE_SHARED, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl -AC_ENABLE_SHARED(no)]) - -# AC_ENABLE_STATIC - implement the --enable-static flag -# Usage: AC_ENABLE_STATIC[(DEFAULT)] -# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to -# `yes'. -AC_DEFUN(AC_ENABLE_STATIC, [dnl -define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl -AC_ARG_ENABLE(static, -changequote(<<, >>)dnl -<< --enable-static[=PKGS] build static libraries [default=>>AC_ENABLE_STATIC_DEFAULT], -changequote([, ])dnl -[p=${PACKAGE-default} -case "$enableval" in -yes) enable_static=yes ;; -no) enable_static=no ;; -*) - enable_static=no - # Look at the argument we got. We use all the common list separators. - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," - for pkg in $enableval; do - if test "X$pkg" = "X$p"; then - enable_static=yes - fi - done - IFS="$ac_save_ifs" - ;; -esac], -enable_static=AC_ENABLE_STATIC_DEFAULT)dnl -]) - -# AC_DISABLE_STATIC - set the default static flag to --disable-static -AC_DEFUN(AC_DISABLE_STATIC, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl -AC_ENABLE_STATIC(no)]) - - -# AC_ENABLE_FAST_INSTALL - implement the --enable-fast-install flag -# Usage: AC_ENABLE_FAST_INSTALL[(DEFAULT)] -# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to -# `yes'. -AC_DEFUN(AC_ENABLE_FAST_INSTALL, [dnl -define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl -AC_ARG_ENABLE(fast-install, -changequote(<<, >>)dnl -<< --enable-fast-install[=PKGS] optimize for fast installation [default=>>AC_ENABLE_FAST_INSTALL_DEFAULT], -changequote([, ])dnl -[p=${PACKAGE-default} -case "$enableval" in -yes) enable_fast_install=yes ;; -no) enable_fast_install=no ;; -*) - enable_fast_install=no - # Look at the argument we got. We use all the common list separators. - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," - for pkg in $enableval; do - if test "X$pkg" = "X$p"; then - enable_fast_install=yes - fi - done - IFS="$ac_save_ifs" - ;; -esac], -enable_fast_install=AC_ENABLE_FAST_INSTALL_DEFAULT)dnl -]) - -# AC_ENABLE_FAST_INSTALL - set the default to --disable-fast-install -AC_DEFUN(AC_DISABLE_FAST_INSTALL, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl -AC_ENABLE_FAST_INSTALL(no)]) - - -# AC_PATH_TOOL_PREFIX - find a file program which can recognise shared library -AC_DEFUN(AC_PATH_TOOL_PREFIX, -[AC_MSG_CHECKING([for $1]) -AC_CACHE_VAL(lt_cv_path_MAGIC, -[case "$MAGIC" in - /*) - lt_cv_path_MAGIC="$MAGIC" # Let the user override the test with a path. - ;; - ?:/*) - ac_cv_path_MAGIC="$MAGIC" # Let the user override the test with a dos path. - ;; - *) - ac_save_MAGIC="$MAGIC" - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" -dnl $ac_dummy forces splitting on constant user-supplied paths. -dnl POSIX.2 word splitting is done only on the output of word expansions, -dnl not every word. This closes a longstanding sh security hole. - ac_dummy="ifelse([$2], , $PATH, [$2])" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$1; then - lt_cv_path_MAGIC="$ac_dir/$1" - if test -n "$file_magic_test_file"; then - case "$deplibs_check_method" in - "file_magic "*) - file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" - MAGIC="$lt_cv_path_MAGIC" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - egrep "$file_magic_regex" > /dev/null; then - : - else - cat <&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -EOF - fi ;; - esac - fi - break - fi - done - IFS="$ac_save_ifs" - MAGIC="$ac_save_MAGIC" - ;; -esac]) -MAGIC="$lt_cv_path_MAGIC" -if test -n "$MAGIC"; then - AC_MSG_RESULT($MAGIC) -else - AC_MSG_RESULT(no) -fi -]) - - -# AC_PATH_MAGIC - find a file program which can recognise a shared library -AC_DEFUN(AC_PATH_MAGIC, -[AC_REQUIRE([AC_CHECK_TOOL_PREFIX])dnl -AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin:$PATH) -if test -z "$lt_cv_path_MAGIC"; then - if test -n "$ac_tool_prefix"; then - AC_PATH_TOOL_PREFIX(file, /usr/bin:$PATH) - else - MAGIC=: - fi -fi -]) - - -# AC_PROG_LD - find the path to the GNU or non-GNU linker -AC_DEFUN(AC_PROG_LD, -[AC_ARG_WITH(gnu-ld, -[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]], -test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no) -AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_CANONICAL_BUILD])dnl -ac_prog=ld -if test "$ac_cv_prog_gcc" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - AC_MSG_CHECKING([for ld used by GCC]) - case $lt_target in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case "$ac_prog" in - # Accept absolute paths. -changequote(,)dnl - [\\/]* | [A-Za-z]:[\\/]*) - re_direlt='/[^/][^/]*/\.\./' -changequote([,])dnl - # Canonicalize the path of ld - ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` - while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do - ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - AC_MSG_CHECKING([for GNU ld]) -else - AC_MSG_CHECKING([for non-GNU ld]) -fi -AC_CACHE_VAL(ac_cv_path_LD, -[if test -z "$LD"; then - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - ac_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some GNU ld's only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - if "$ac_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then - test "$with_gnu_ld" != no && break - else - test "$with_gnu_ld" != yes && break - fi - fi - done - IFS="$ac_save_ifs" -else - ac_cv_path_LD="$LD" # Let the user override the test with a path. -fi]) -LD="$ac_cv_path_LD" -if test -n "$LD"; then - AC_MSG_RESULT($LD) -else - AC_MSG_RESULT(no) -fi -test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) -AC_PROG_LD_GNU -]) - -AC_DEFUN(AC_PROG_LD_GNU, -[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], ac_cv_prog_gnu_ld, -[# I'd rather use --version here, but apparently some GNU ld's only accept -v. -if $LD -v 2>&1 &5; then - ac_cv_prog_gnu_ld=yes -else - ac_cv_prog_gnu_ld=no -fi]) -with_gnu_ld=$ac_cv_prog_gnu_ld -]) - -# AC_PROG_LD_RELOAD_FLAG - find reload flag for linker -# -- PORTME Some linkers may need a different reload flag. -AC_DEFUN(AC_PROG_LD_RELOAD_FLAG, -[AC_CACHE_CHECK([for $LD option to reload object files], lt_cv_ld_reload_flag, -[lt_cv_ld_reload_flag='-r']) -reload_flag=$lt_cv_ld_reload_flag -test -n "$reload_flag" && reload_flag=" $reload_flag" -]) - -# AC_DEPLIBS_CHECK_METHOD - how to check for library dependencies -# -- PORTME fill in with the dynamic library characteristics -AC_DEFUN(AC_DEPLIBS_CHECK_METHOD, -[AC_CACHE_CHECK([how to recognise dependant libraries], -lt_cv_deplibs_check_method, -[lt_cv_file_magic_cmd='${MAGIC}' -lt_cv_file_magic_test_file= -lt_cv_deplibs_check_method='unknown' -# Need to set the preceding variable on all platforms that support -# interlibrary dependencies. -# 'none' -- dependencies not supported. -# `unknown' -- same as none, but documents that we really don't know. -# 'pass_all' -- all dependencies passed with no checks. -# 'test_compile' -- check by making test program. -# 'file_magic [regex]' -- check by looking for files in library path -# which responds to the $file_magic_cmd with a given egrep regex. -# If you have `file' or equivalent on your system and you're not sure -# whether `pass_all' will *always* work, you probably want this one. - -case "$host_os" in -aix4* | beos*) - lt_cv_deplibs_check_method=pass_all - ;; - -bsdi4*) - changequote(,)dnl - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' - changequote([, ])dnl - lt_cv_file_magic_test_file=/shlib/libc.so - ;; - -cygwin* | mingw*) - lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' - lt_cv_file_magic_cmd='${OBJDUMP} -f' - ;; - -freebsd*) - case "$version_type" in - freebsd-elf*) - lt_cv_deplibs_check_method=pass_all - ;; - esac - ;; - -gnu*) - lt_cv_deplibs_check_method=pass_all - ;; - -irix5* | irix6*) - case "$host_os" in - irix5*) - # this will be overridden with pass_all, but let us keep it just in case - lt_cv_deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1" - ;; - *) - case "$LD" in - *-32|*"-32 ") libmagic=32-bit;; - *-n32|*"-n32 ") libmagic=N32;; - *-64|*"-64 ") libmagic=64-bit;; - *) libmagic=never-match;; - esac - # this will be overridden with pass_all, but let us keep it just in case - changequote(,)dnl - lt_cv_deplibs_check_method="file_magic ELF ${libmagic} MSB mips-[1234] dynamic lib MIPS - version 1" - changequote([, ])dnl - ;; - esac - lt_cv_file_magic_test_file=`echo /lib${libsuff}/libc.so*` - lt_cv_deplibs_check_method=pass_all - ;; - -# This must be Linux ELF. -linux-gnu*) - case "$host_cpu" in - alpha* | i*86 | powerpc* | sparc* ) - lt_cv_deplibs_check_method=pass_all ;; - *) - # glibc up to 2.1.1 does not perform some relocations on ARM - changequote(,)dnl - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; - changequote([, ])dnl - esac - lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` - ;; - -osf3* | osf4* | osf5*) - # this will be overridden with pass_all, but let us keep it just in case - lt_cv_deplibs_check_method='file_magic COFF format alpha shared library' - lt_cv_file_magic_test_file=/shlib/libc.so - lt_cv_deplibs_check_method=pass_all - ;; - -sco3.2v5*) - lt_cv_deplibs_check_method=pass_all - ;; - -solaris*) - lt_cv_deplibs_check_method=pass_all - lt_cv_file_magic_test_file=/lib/libc.so - ;; - -sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - case "$host_vendor" in - ncr) - lt_cv_deplibs_check_method=pass_all - ;; - motorola) - changequote(,)dnl - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' - changequote([, ])dnl - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` - ;; - esac - ;; -esac -]) -file_magic_cmd=$lt_cv_file_magic_cmd -deplibs_check_method=$lt_cv_deplibs_check_method -]) - - -# AC_PROG_NM - find the path to a BSD-compatible name lister -AC_DEFUN(AC_PROG_NM, -[AC_MSG_CHECKING([for BSD-compatible nm]) -AC_CACHE_VAL(ac_cv_path_NM, -[if test -n "$NM"; then - # Let the user override the test. - ac_cv_path_NM="$NM" -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" - for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/nm || test -f $ac_dir/nm$ac_exeext ; then - # Check to see if the nm accepts a BSD-compat flag. - # Adding the `sed 1q' prevents false positives on HP-UX, which says: - # nm: unknown option "B" ignored - if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then - ac_cv_path_NM="$ac_dir/nm -B" - break - elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then - ac_cv_path_NM="$ac_dir/nm -p" - break - else - ac_cv_path_NM=${ac_cv_path_NM="$ac_dir/nm"} # keep the first match, but - continue # so that we can try to find one that supports BSD flags - fi - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_path_NM" && ac_cv_path_NM=nm -fi]) -NM="$ac_cv_path_NM" -AC_MSG_RESULT([$NM]) -]) - -# AC_CHECK_LIBM - check for math library -AC_DEFUN(AC_CHECK_LIBM, -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -LIBM= -case "$lt_target" in -*-*-beos* | *-*-cygwin*) - # These system don't have libm - ;; -*-ncr-sysv4.3*) - AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") - AC_CHECK_LIB(m, main, LIBM="$LIBM -lm") - ;; -*) - AC_CHECK_LIB(m, main, LIBM="-lm") - ;; -esac -]) - -# AC_LIBLTDL_CONVENIENCE[(dir)] - sets LIBLTDL to the link flags for -# the libltdl convenience library, adds --enable-ltdl-convenience to -# the configure arguments. Note that LIBLTDL is not AC_SUBSTed, nor -# is AC_CONFIG_SUBDIRS called. If DIR is not provided, it is assumed -# to be `${top_builddir}/libltdl'. Make sure you start DIR with -# '${top_builddir}/' (note the single quotes!) if your package is not -# flat, and, if you're not using automake, define top_builddir as -# appropriate in the Makefiles. -AC_DEFUN(AC_LIBLTDL_CONVENIENCE, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl - case "$enable_ltdl_convenience" in - no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; - "") enable_ltdl_convenience=yes - ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; - esac - LIBLTDL=ifelse($#,1,$1,['${top_builddir}/libltdl'])/libltdlc.la - INCLTDL=ifelse($#,1,-I$1,['-I${top_srcdir}/libltdl']) -]) - -# AC_LIBLTDL_INSTALLABLE[(dir)] - sets LIBLTDL to the link flags for -# the libltdl installable library, and adds --enable-ltdl-install to -# the configure arguments. Note that LIBLTDL is not AC_SUBSTed, nor -# is AC_CONFIG_SUBDIRS called. If DIR is not provided, it is assumed -# to be `${top_builddir}/libltdl'. Make sure you start DIR with -# '${top_builddir}/' (note the single quotes!) if your package is not -# flat, and, if you're not using automake, define top_builddir as -# appropriate in the Makefiles. -# In the future, this macro may have to be called after AC_PROG_LIBTOOL. -AC_DEFUN(AC_LIBLTDL_INSTALLABLE, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl - AC_CHECK_LIB(ltdl, main, - [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], - [if test x"$enable_ltdl_install" = xno; then - AC_MSG_WARN([libltdl not installed, but installation disabled]) - else - enable_ltdl_install=yes - fi - ]) - if test x"$enable_ltdl_install" = x"yes"; then - ac_configure_args="$ac_configure_args --enable-ltdl-install" - LIBLTDL=ifelse($#,1,$1,['${top_builddir}/libltdl'])/libltdl.la - INCLTDL=ifelse($#,1,-I$1,['-I${top_srcdir}/libltdl']) - else - ac_configure_args="$ac_configure_args --enable-ltdl-install=no" - LIBLTDL="-lltdl" - INCLTDL= - fi -]) - -dnl old names -AC_DEFUN(AM_PROG_LIBTOOL, [indir([AC_PROG_LIBTOOL])])dnl -AC_DEFUN(AM_ENABLE_SHARED, [indir([AC_ENABLE_SHARED], $@)])dnl -AC_DEFUN(AM_ENABLE_STATIC, [indir([AC_ENABLE_STATIC], $@)])dnl -AC_DEFUN(AM_DISABLE_SHARED, [indir([AC_DISABLE_SHARED], $@)])dnl -AC_DEFUN(AM_DISABLE_STATIC, [indir([AC_DISABLE_STATIC], $@)])dnl -AC_DEFUN(AM_PROG_LD, [indir([AC_PROG_LD])])dnl -AC_DEFUN(AM_PROG_NM, [indir([AC_PROG_NM])])dnl - -dnl This is just to silence aclocal about the macro not being used -ifelse([AC_DISABLE_FAST_INSTALL])dnl - diff --git a/rts/gmp/ansi2knr.1 b/rts/gmp/ansi2knr.1 deleted file mode 100644 index f9ee5a6..0000000 --- a/rts/gmp/ansi2knr.1 +++ /dev/null @@ -1,36 +0,0 @@ -.TH ANSI2KNR 1 "19 Jan 1996" -.SH NAME -ansi2knr \- convert ANSI C to Kernighan & Ritchie C -.SH SYNOPSIS -.I ansi2knr -[--varargs] input_file [output_file] -.SH DESCRIPTION -If no output_file is supplied, output goes to stdout. -.br -There are no error messages. -.sp -.I ansi2knr -recognizes function definitions by seeing a non-keyword identifier at the left -margin, followed by a left parenthesis, with a right parenthesis as the last -character on the line, and with a left brace as the first token on the -following line (ignoring possible intervening comments). It will recognize a -multi-line header provided that no intervening line ends with a left or right -brace or a semicolon. These algorithms ignore whitespace and comments, except -that the function name must be the first thing on the line. -.sp -The following constructs will confuse it: -.br - - Any other construct that starts at the left margin and follows the -above syntax (such as a macro or function call). -.br - - Some macros that tinker with the syntax of the function header. -.sp -The --varargs switch is obsolete, and is recognized only for -backwards compatibility. The present version of -.I ansi2knr -will always attempt to convert a ... argument to va_alist and va_dcl. -.SH AUTHOR -L. Peter Deutsch wrote the original ansi2knr and -continues to maintain the current version; most of the code in the current -version is his work. ansi2knr also includes contributions by Francois -Pinard and Jim Avera . diff --git a/rts/gmp/ansi2knr.c b/rts/gmp/ansi2knr.c deleted file mode 100644 index 937c731..0000000 --- a/rts/gmp/ansi2knr.c +++ /dev/null @@ -1,677 +0,0 @@ -/* Copyright (C) 1989, 1997, 1998, 1999 Aladdin Enterprises. All rights reserved. */ - -/* Convert ANSI C function definitions to K&R ("traditional C") syntax */ - -/* -ansi2knr is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY. No author or distributor accepts responsibility to anyone for the -consequences of using it or for whether it serves any particular purpose or -works at all, unless he says so in writing. Refer to the GNU General Public -License (the "GPL") for full details. - -Everyone is granted permission to copy, modify and redistribute ansi2knr, -but only under the conditions described in the GPL. A copy of this license -is supposed to have been given to you along with ansi2knr so you can know -your rights and responsibilities. It should be in a file named COPYLEFT, -or, if there is no file named COPYLEFT, a file named COPYING. Among other -things, the copyright notice and this notice must be preserved on all -copies. - -We explicitly state here what we believe is already implied by the GPL: if -the ansi2knr program is distributed as a separate set of sources and a -separate executable file which are aggregated on a storage medium together -with another program, this in itself does not bring the other program under -the GPL, nor does the mere fact that such a program or the procedures for -constructing it invoke the ansi2knr executable bring any other part of the -program under the GPL. -*/ - -/* - * Usage: - ansi2knr [--filename FILENAME] [INPUT_FILE [OUTPUT_FILE]] - * --filename provides the file name for the #line directive in the output, - * overriding input_file (if present). - * If no input_file is supplied, input is read from stdin. - * If no output_file is supplied, output goes to stdout. - * There are no error messages. - * - * ansi2knr recognizes function definitions by seeing a non-keyword - * identifier at the left margin, followed by a left parenthesis, - * with a right parenthesis as the last character on the line, - * and with a left brace as the first token on the following line - * (ignoring possible intervening comments), except that a line - * consisting of only - * identifier1(identifier2) - * will not be considered a function definition unless identifier2 is - * the word "void", and a line consisting of - * identifier1(identifier2, <>) - * will not be considered a function definition. - * ansi2knr will recognize a multi-line header provided - * that no intervening line ends with a left or right brace or a semicolon. - * These algorithms ignore whitespace and comments, except that - * the function name must be the first thing on the line. - * The following constructs will confuse it: - * - Any other construct that starts at the left margin and - * follows the above syntax (such as a macro or function call). - * - Some macros that tinker with the syntax of function headers. - */ - -/* - * The original and principal author of ansi2knr is L. Peter Deutsch - * . Other authors are noted in the change history - * that follows (in reverse chronological order): - lpd 1999-04-12 added minor fixes from Pavel Roskin - for clean compilation with - gcc -W -Wall - lpd 1999-03-22 added hack to recognize lines consisting of - identifier1(identifier2, xxx) as *not* being procedures - lpd 1999-02-03 made indentation of preprocessor commands consistent - lpd 1999-01-28 fixed two bugs: a '/' in an argument list caused an - endless loop; quoted strings within an argument list - confused the parser - lpd 1999-01-24 added a check for write errors on the output, - suggested by Jim Meyering - lpd 1998-11-09 added further hack to recognize identifier(void) - as being a procedure - lpd 1998-10-23 added hack to recognize lines consisting of - identifier1(identifier2) as *not* being procedures - lpd 1997-12-08 made input_file optional; only closes input and/or - output file if not stdin or stdout respectively; prints - usage message on stderr rather than stdout; adds - --filename switch (changes suggested by - ) - lpd 1996-01-21 added code to cope with not HAVE_CONFIG_H and with - compilers that don't understand void, as suggested by - Tom Lane - lpd 1996-01-15 changed to require that the first non-comment token - on the line following a function header be a left brace, - to reduce sensitivity to macros, as suggested by Tom Lane - - lpd 1995-06-22 removed #ifndefs whose sole purpose was to define - undefined preprocessor symbols as 0; changed all #ifdefs - for configuration symbols to #ifs - lpd 1995-04-05 changed copyright notice to make it clear that - including ansi2knr in a program does not bring the entire - program under the GPL - lpd 1994-12-18 added conditionals for systems where ctype macros - don't handle 8-bit characters properly, suggested by - Francois Pinard ; - removed --varargs switch (this is now the default) - lpd 1994-10-10 removed CONFIG_BROKETS conditional - lpd 1994-07-16 added some conditionals to help GNU `configure', - suggested by Francois Pinard ; - properly erase prototype args in function parameters, - contributed by Jim Avera ; - correct error in writeblanks (it shouldn't erase EOLs) - lpd 1989-xx-xx original version - */ - -/* Most of the conditionals here are to make ansi2knr work with */ -/* or without the GNU configure machinery. */ - -#if HAVE_CONFIG_H -# include -#endif - -#include -#include - -#if HAVE_CONFIG_H - -/* - For properly autoconfiguring ansi2knr, use AC_CONFIG_HEADER(config.h). - This will define HAVE_CONFIG_H and so, activate the following lines. - */ - -# if STDC_HEADERS || HAVE_STRING_H -# include -# else -# include -# endif - -#else /* not HAVE_CONFIG_H */ - -/* Otherwise do it the hard way */ - -# ifdef BSD -# include -# else -# ifdef VMS - extern int strlen(), strncmp(); -# else -# include -# endif -# endif - -#endif /* not HAVE_CONFIG_H */ - -#if STDC_HEADERS -# include -#else -/* - malloc and free should be declared in stdlib.h, - but if you've got a K&R compiler, they probably aren't. - */ -# ifdef MSDOS -# include -# else -# ifdef VMS - extern char *malloc(); - extern void free(); -# else - extern char *malloc(); - extern int free(); -# endif -# endif - -#endif - -/* Define NULL (for *very* old compilers). */ -#ifndef NULL -# define NULL (0) -#endif - -/* - * The ctype macros don't always handle 8-bit characters correctly. - * Compensate for this here. - */ -#ifdef isascii -# undef HAVE_ISASCII /* just in case */ -# define HAVE_ISASCII 1 -#else -#endif -#if STDC_HEADERS || !HAVE_ISASCII -# define is_ascii(c) 1 -#else -# define is_ascii(c) isascii(c) -#endif - -#define is_space(c) (is_ascii(c) && isspace(c)) -#define is_alpha(c) (is_ascii(c) && isalpha(c)) -#define is_alnum(c) (is_ascii(c) && isalnum(c)) - -/* Scanning macros */ -#define isidchar(ch) (is_alnum(ch) || (ch) == '_') -#define isidfirstchar(ch) (is_alpha(ch) || (ch) == '_') - -/* Forward references */ -char *skipspace(); -char *scanstring(); -int writeblanks(); -int test1(); -int convert1(); - -/* The main program */ -int -main(argc, argv) - int argc; - char *argv[]; -{ FILE *in = stdin; - FILE *out = stdout; - char *filename = 0; - char *program_name = argv[0]; - char *output_name = 0; -#define bufsize 5000 /* arbitrary size */ - char *buf; - char *line; - char *more; - char *usage = - "Usage: ansi2knr [--filename FILENAME] [INPUT_FILE [OUTPUT_FILE]]\n"; - /* - * In previous versions, ansi2knr recognized a --varargs switch. - * If this switch was supplied, ansi2knr would attempt to convert - * a ... argument to va_alist and va_dcl; if this switch was not - * supplied, ansi2knr would simply drop any such arguments. - * Now, ansi2knr always does this conversion, and we only - * check for this switch for backward compatibility. - */ - int convert_varargs = 1; - int output_error; - - while ( argc > 1 && argv[1][0] == '-' ) { - if ( !strcmp(argv[1], "--varargs") ) { - convert_varargs = 1; - argc--; - argv++; - continue; - } - if ( !strcmp(argv[1], "--filename") && argc > 2 ) { - filename = argv[2]; - argc -= 2; - argv += 2; - continue; - } - fprintf(stderr, "%s: Unrecognized switch: %s\n", program_name, - argv[1]); - fprintf(stderr, usage); - exit(1); - } - switch ( argc ) - { - default: - fprintf(stderr, usage); - exit(0); - case 3: - output_name = argv[2]; - out = fopen(output_name, "w"); - if ( out == NULL ) { - fprintf(stderr, "%s: Cannot open output file %s\n", - program_name, output_name); - exit(1); - } - /* falls through */ - case 2: - in = fopen(argv[1], "r"); - if ( in == NULL ) { - fprintf(stderr, "%s: Cannot open input file %s\n", - program_name, argv[1]); - exit(1); - } - if ( filename == 0 ) - filename = argv[1]; - /* falls through */ - case 1: - break; - } - if ( filename ) - fprintf(out, "#line 1 \"%s\"\n", filename); - buf = malloc(bufsize); - if ( buf == NULL ) - { - fprintf(stderr, "Unable to allocate read buffer!\n"); - exit(1); - } - line = buf; - while ( fgets(line, (unsigned)(buf + bufsize - line), in) != NULL ) - { -test: line += strlen(line); - switch ( test1(buf) ) - { - case 2: /* a function header */ - convert1(buf, out, 1, convert_varargs); - break; - case 1: /* a function */ - /* Check for a { at the start of the next line. */ - more = ++line; -f: if ( line >= buf + (bufsize - 1) ) /* overflow check */ - goto wl; - if ( fgets(line, (unsigned)(buf + bufsize - line), in) == NULL ) - goto wl; - switch ( *skipspace(more, 1) ) - { - case '{': - /* Definitely a function header. */ - convert1(buf, out, 0, convert_varargs); - fputs(more, out); - break; - case 0: - /* The next line was blank or a comment: */ - /* keep scanning for a non-comment. */ - line += strlen(line); - goto f; - default: - /* buf isn't a function header, but */ - /* more might be. */ - fputs(buf, out); - strcpy(buf, more); - line = buf; - goto test; - } - break; - case -1: /* maybe the start of a function */ - if ( line != buf + (bufsize - 1) ) /* overflow check */ - continue; - /* falls through */ - default: /* not a function */ -wl: fputs(buf, out); - break; - } - line = buf; - } - if ( line != buf ) - fputs(buf, out); - free(buf); - if ( output_name ) { - output_error = ferror(out); - output_error |= fclose(out); - } else { /* out == stdout */ - fflush(out); - output_error = ferror(out); - } - if ( output_error ) { - fprintf(stderr, "%s: error writing to %s\n", program_name, - (output_name ? output_name : "stdout")); - exit(1); - } - if ( in != stdin ) - fclose(in); - return 0; -} - -/* Skip over whitespace and comments, in either direction. */ -char * -skipspace(p, dir) - register char *p; - register int dir; /* 1 for forward, -1 for backward */ -{ for ( ; ; ) - { while ( is_space(*p) ) - p += dir; - if ( !(*p == '/' && p[dir] == '*') ) - break; - p += dir; p += dir; - while ( !(*p == '*' && p[dir] == '/') ) - { if ( *p == 0 ) - return p; /* multi-line comment?? */ - p += dir; - } - p += dir; p += dir; - } - return p; -} - -/* Scan over a quoted string, in either direction. */ -char * -scanstring(p, dir) - register char *p; - register int dir; -{ - for (p += dir; ; p += dir) - if (*p == '"' && p[-dir] != '\\') - return p + dir; -} - -/* - * Write blanks over part of a string. - * Don't overwrite end-of-line characters. - */ -int -writeblanks(start, end) - char *start; - char *end; -{ char *p; - for ( p = start; p < end; p++ ) - if ( *p != '\r' && *p != '\n' ) - *p = ' '; - return 0; -} - -/* - * Test whether the string in buf is a function definition. - * The string may contain and/or end with a newline. - * Return as follows: - * 0 - definitely not a function definition; - * 1 - definitely a function definition; - * 2 - definitely a function prototype (NOT USED); - * -1 - may be the beginning of a function definition, - * append another line and look again. - * The reason we don't attempt to convert function prototypes is that - * Ghostscript's declaration-generating macros look too much like - * prototypes, and confuse the algorithms. - */ -int -test1(buf) - char *buf; -{ register char *p = buf; - char *bend; - char *endfn; - int contin; - - if ( !isidfirstchar(*p) ) - return 0; /* no name at left margin */ - bend = skipspace(buf + strlen(buf) - 1, -1); - switch ( *bend ) - { - case ';': contin = 0 /*2*/; break; - case ')': contin = 1; break; - case '{': return 0; /* not a function */ - case '}': return 0; /* not a function */ - default: contin = -1; - } - while ( isidchar(*p) ) - p++; - endfn = p; - p = skipspace(p, 1); - if ( *p++ != '(' ) - return 0; /* not a function */ - p = skipspace(p, 1); - if ( *p == ')' ) - return 0; /* no parameters */ - /* Check that the apparent function name isn't a keyword. */ - /* We only need to check for keywords that could be followed */ - /* by a left parenthesis (which, unfortunately, is most of them). */ - { static char *words[] = - { "asm", "auto", "case", "char", "const", "double", - "extern", "float", "for", "if", "int", "long", - "register", "return", "short", "signed", "sizeof", - "static", "switch", "typedef", "unsigned", - "void", "volatile", "while", 0 - }; - char **key = words; - char *kp; - unsigned len = endfn - buf; - - while ( (kp = *key) != 0 ) - { if ( strlen(kp) == len && !strncmp(kp, buf, len) ) - return 0; /* name is a keyword */ - key++; - } - } - { - char *id = p; - int len; - /* - * Check for identifier1(identifier2) and not - * identifier1(void), or identifier1(identifier2, xxxx). - */ - - while ( isidchar(*p) ) - p++; - len = p - id; - p = skipspace(p, 1); - if (*p == ',' || - (*p == ')' && (len != 4 || strncmp(id, "void", 4))) - ) - return 0; /* not a function */ - } - /* - * If the last significant character was a ), we need to count - * parentheses, because it might be part of a formal parameter - * that is a procedure. - */ - if (contin > 0) { - int level = 0; - - for (p = skipspace(buf, 1); *p; p = skipspace(p + 1, 1)) - level += (*p == '(' ? 1 : *p == ')' ? -1 : 0); - if (level > 0) - contin = -1; - } - return contin; -} - -/* Convert a recognized function definition or header to K&R syntax. */ -int -convert1(buf, out, header, convert_varargs) - char *buf; - FILE *out; - int header; /* Boolean */ - int convert_varargs; /* Boolean */ -{ char *endfn; - register char *p; - /* - * The breaks table contains pointers to the beginning and end - * of each argument. - */ - char **breaks; - unsigned num_breaks = 2; /* for testing */ - char **btop; - char **bp; - char **ap; - char *vararg = 0; - - /* Pre-ANSI implementations don't agree on whether strchr */ - /* is called strchr or index, so we open-code it here. */ - for ( endfn = buf; *(endfn++) != '('; ) - ; -top: p = endfn; - breaks = (char **)malloc(sizeof(char *) * num_breaks * 2); - if ( breaks == NULL ) - { /* Couldn't allocate break table, give up */ - fprintf(stderr, "Unable to allocate break table!\n"); - fputs(buf, out); - return -1; - } - btop = breaks + num_breaks * 2 - 2; - bp = breaks; - /* Parse the argument list */ - do - { int level = 0; - char *lp = NULL; - char *rp = NULL; - char *end = NULL; - - if ( bp >= btop ) - { /* Filled up break table. */ - /* Allocate a bigger one and start over. */ - free((char *)breaks); - num_breaks <<= 1; - goto top; - } - *bp++ = p; - /* Find the end of the argument */ - for ( ; end == NULL; p++ ) - { switch(*p) - { - case ',': - if ( !level ) end = p; - break; - case '(': - if ( !level ) lp = p; - level++; - break; - case ')': - if ( --level < 0 ) end = p; - else rp = p; - break; - case '/': - if (p[1] == '*') - p = skipspace(p, 1) - 1; - break; - case '"': - p = scanstring(p, 1) - 1; - break; - default: - ; - } - } - /* Erase any embedded prototype parameters. */ - if ( lp && rp ) - writeblanks(lp + 1, rp); - p--; /* back up over terminator */ - /* Find the name being declared. */ - /* This is complicated because of procedure and */ - /* array modifiers. */ - for ( ; ; ) - { p = skipspace(p - 1, -1); - switch ( *p ) - { - case ']': /* skip array dimension(s) */ - case ')': /* skip procedure args OR name */ - { int level = 1; - while ( level ) - switch ( *--p ) - { - case ']': case ')': - level++; - break; - case '[': case '(': - level--; - break; - case '/': - if (p > buf && p[-1] == '*') - p = skipspace(p, -1) + 1; - break; - case '"': - p = scanstring(p, -1) + 1; - break; - default: ; - } - } - if ( *p == '(' && *skipspace(p + 1, 1) == '*' ) - { /* We found the name being declared */ - while ( !isidfirstchar(*p) ) - p = skipspace(p, 1) + 1; - goto found; - } - break; - default: - goto found; - } - } -found: if ( *p == '.' && p[-1] == '.' && p[-2] == '.' ) - { if ( convert_varargs ) - { *bp++ = "va_alist"; - vararg = p-2; - } - else - { p++; - if ( bp == breaks + 1 ) /* sole argument */ - writeblanks(breaks[0], p); - else - writeblanks(bp[-1] - 1, p); - bp--; - } - } - else - { while ( isidchar(*p) ) p--; - *bp++ = p+1; - } - p = end; - } - while ( *p++ == ',' ); - *bp = p; - /* Make a special check for 'void' arglist */ - if ( bp == breaks+2 ) - { p = skipspace(breaks[0], 1); - if ( !strncmp(p, "void", 4) ) - { p = skipspace(p+4, 1); - if ( p == breaks[2] - 1 ) - { bp = breaks; /* yup, pretend arglist is empty */ - writeblanks(breaks[0], p + 1); - } - } - } - /* Put out the function name and left parenthesis. */ - p = buf; - while ( p != endfn ) putc(*p, out), p++; - /* Put out the declaration. */ - if ( header ) - { fputs(");", out); - for ( p = breaks[0]; *p; p++ ) - if ( *p == '\r' || *p == '\n' ) - putc(*p, out); - } - else - { for ( ap = breaks+1; ap < bp; ap += 2 ) - { p = *ap; - while ( isidchar(*p) ) - putc(*p, out), p++; - if ( ap < bp - 1 ) - fputs(", ", out); - } - fputs(") ", out); - /* Put out the argument declarations */ - for ( ap = breaks+2; ap <= bp; ap += 2 ) - (*ap)[-1] = ';'; - if ( vararg != 0 ) - { *vararg = 0; - fputs(breaks[0], out); /* any prior args */ - fputs("va_dcl", out); /* the final arg */ - fputs(bp[0], out); - } - else - fputs(breaks[0], out); - } - free((char *)breaks); - return 0; -} diff --git a/rts/gmp/assert.c b/rts/gmp/assert.c deleted file mode 100644 index 65eccfa..0000000 --- a/rts/gmp/assert.c +++ /dev/null @@ -1,52 +0,0 @@ -/* GMP assertion failure handler. */ - -/* -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 -#include "gmp.h" -#include "gmp-impl.h" - - -int -#if __STDC__ -__gmp_assert_fail (const char *filename, int linenum, - const char *expr) -#else -__gmp_assert_fail (filename, linenum, expr) -char *filename; -int linenum; -char *expr; -#endif -{ - if (filename != NULL && filename[0] != '\0') - { - fprintf (stderr, "%s:", filename); - if (linenum != -1) - fprintf (stderr, "%d: ", linenum); - } - - fprintf (stderr, "GNU MP assertion failed: %s\n", expr); - abort(); - - /*NOTREACHED*/ - return 0; -} diff --git a/rts/gmp/compat.c b/rts/gmp/compat.c deleted file mode 100644 index ab7529f..0000000 --- a/rts/gmp/compat.c +++ /dev/null @@ -1,46 +0,0 @@ -/* Old function entrypoints retained for binary compatibility. */ - -/* -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 -#include "gmp.h" -#include "gmp-impl.h" - - -/* mpn_divexact_by3 was a function in gmp 3.0, but as of gmp 3.1 it's a - macro calling mpn_divexact_by3c. */ -int -__MPN (divexact_by3) (mp_ptr dst, mp_srcptr src, mp_size_t size) -{ - mpn_divexact_by3 (dst, src, size); -} - - -/* mpn_divmod_1 was a function in gmp 3.0 and earlier, but marked obsolete - in gmp 2 and 3. As of gmp 3.1 it's a macro calling mpn_divrem_1. */ -int -__MPN (divmod_1) (mp_ptr dst, mp_srcptr src, mp_size_t size, mp_limb_t divisor) -{ - mpn_divmod_1 (dst, src, size, divisor); -} - - diff --git a/rts/gmp/config.guess b/rts/gmp/config.guess deleted file mode 100644 index 08018f4..0000000 --- a/rts/gmp/config.guess +++ /dev/null @@ -1,1373 +0,0 @@ -#! /bin/sh -# Attempt to guess a canonical system name. -# -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000 -# Free Software Foundation, Inc. -# -# This file is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# Written by Per Bothner . -# Please send patches to . -# -# This script attempts to guess a canonical system name similar to -# config.sub. If it succeeds, it prints the system name on stdout, and -# exits with 0. Otherwise, it exits with 1. -# -# The plan is that this can be called by configure scripts if you -# don't specify an explicit system type (host/target name). -# -# Only a few systems have been added to this list; please add others -# (but try to keep the structure clean). -# - - -# This is needed to find uname on a Pyramid OSx when run in the BSD universe. -# (ghazi@noc.rutgers.edu 8/24/94.) -if (test -f /.attbin/uname) >/dev/null 2>&1 ; then - PATH=$PATH:/.attbin ; export PATH -fi - -UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown -UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown -UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown -UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown - -dummy=dummy-$$ -trap 'rm -f $dummy.c $dummy.o $dummy ${dummy}1.s ${dummy}2.c ; exit 1' 1 2 15 - -# Use $HOST_CC if defined. $CC may point to a cross-compiler -if test x"$CC_FOR_BUILD" = x; then - if test x"$HOST_CC" != x; then - CC_FOR_BUILD="$HOST_CC" - else - if test x"$CC" != x; then - CC_FOR_BUILD="$CC" - else - echo 'dummy(){}' >$dummy.c - for c in cc c89 gcc; do - ($c $dummy.c -c) >/dev/null 2>&1 - if test $? = 0; then - CC_FOR_BUILD="$c"; break - fi - done - rm -f $dummy.c $dummy.o - if test x"$CC_FOR_BUILD" = x; then - CC_FOR_BUILD=no_compiler_found - fi - fi - fi -fi - - -# First make a best effort at recognizing x86 CPU type and leave it in X86CPU. -# If we fail, set X86CPU to UNAME_MACHINE -# -# DJGPP v2 (or 2.03 at least) always gives "pc" for uname -m, and the -# OEM for uname -s. Eg. pc:MS-DOS:6:2 on MS-DOS 6.21. The list of -# possible OEMs is in src/libc/dos/dos/getdos_v.c of djlsr203.zip, but -# just pc:*:*:* seems ok. - -case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in - i?86:*:*:* | i86pc:*:*:* | pc:*:*:*) - case "${UNAME_MACHINE}" in - i86pc | pc) UNAME_MACHINE=i386 ;; - esac - cat <${dummy}1.s - .globl cpuid - .globl _cpuid -cpuid: -_cpuid: - pushl %esi - pushl %ebx - movl 16(%esp),%eax - .byte 0x0f - .byte 0xa2 - movl 12(%esp),%esi - movl %ebx,(%esi) - movl %edx,4(%esi) - movl %ecx,8(%esi) - popl %ebx - popl %esi - ret -EOF - cat <${dummy}2.c -main () -{ - char vendor_string[13]; - char dummy_string[12]; - long fms; - int family, model; - char *modelstr; - - cpuid (vendor_string, 0); - vendor_string[12] = 0; - - fms = cpuid (dummy_string, 1); - - family = (fms >> 8) & 15; - model = (fms >> 4) & 15; - - modelstr = "i486"; - if (strcmp (vendor_string, "GenuineIntel") == 0) - { - switch (family) - { - case 5: - if (model <= 2) - modelstr = "pentium"; - else if (model >= 4) - modelstr = "pentiummmx"; - break; - case 6: - if (model == 1) - modelstr = "pentiumpro"; - else if (model <= 6) - modelstr = "pentium2"; - else - modelstr = "pentium3"; - break; - } - } - else if (strcmp (vendor_string, "AuthenticAMD") == 0) - { - switch (family) - { - case 5: - if (model <= 3) - modelstr = "k5"; - else if (model <= 7) - modelstr = "k6"; - else if (model <= 8) - modelstr = "k62"; - else if (model <= 9) - modelstr = "k63"; - break; - case 6: - modelstr = "athlon"; - break; - } - } - else if (strcmp (vendor_string, "CyrixInstead") == 0) - { - /* Should recognize Cyrix' processors too. */ - } - - printf ("%s\n", modelstr); - return 0; -} -EOF - $CC_FOR_BUILD ${dummy}1.s ${dummy}2.c -o $dummy >/dev/null 2>&1 - if test "$?" = 0 ; then - X86CPU=`./$dummy` - fi - - - # Default to believing uname -m if the program fails to compile or - # run. Will fail to run on 386 since cpuid was only added on 486. - if test -z "$X86CPU" - then - X86CPU="$UNAME_MACHINE" - fi - rm -f ${dummy}1.s ${dummy}2.c $dummy - ;; -esac - -# Note: order is significant - the case branches are not exclusive. - -case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in - alpha:OSF1:*:*) - if test $UNAME_RELEASE = "V4.0"; then - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` - fi - # A Vn.n version is a released version. - # A Tn.n version is a released field test version. - # A Xn.n version is an unreleased experimental baselevel. - # 1.2 uses "1.2" for uname -r. - cat <$dummy.s - .data -\$Lformat: - .byte 37,100,45,37,120,10,0 # "%d-%x\n" - - .text - .globl main - .align 4 - .ent main -main: - .frame \$30,16,\$26,0 - ldgp \$29,0(\$27) - .prologue 1 - .long 0x47e03d80 # implver \$0 - lda \$2,-1 - .long 0x47e20c21 # amask \$2,\$1 - lda \$16,\$Lformat - mov \$0,\$17 - not \$1,\$18 - jsr \$26,printf - ldgp \$29,0(\$26) - mov 0,\$16 - jsr \$26,exit - .end main -EOF - $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null - if test "$?" = 0 ; then - case `./$dummy` in - 0-0) - UNAME_MACHINE="alpha" - ;; - 1-0) - UNAME_MACHINE="alphaev5" - ;; - 1-1) - UNAME_MACHINE="alphaev56" - ;; - 1-101) - UNAME_MACHINE="alphapca56" - ;; - 2-303) - UNAME_MACHINE="alphaev6" - ;; - 2-307) - UNAME_MACHINE="alphaev67" - ;; - esac - fi - rm -f $dummy.s $dummy - echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - exit 0 ;; - alpha:NetBSD:*:* | alpha:FreeBSD:*:*) - cat <$dummy.s - .globl main - .ent main -main: - .frame \$30,0,\$26,0 - .prologue 0 - .long 0x47e03d80 # implver $0 - lda \$2,259 - .long 0x47e20c21 # amask $2,$1 - srl \$1,8,\$2 - sll \$2,2,\$2 - sll \$0,3,\$0 - addl \$1,\$0,\$0 - addl \$2,\$0,\$0 - ret \$31,(\$26),1 - .end main -EOF - $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null - if test "$?" = 0 ; then - ./$dummy - case "$?" in - 7) - UNAME_MACHINE="alpha" - ;; - 15) - UNAME_MACHINE="alphaev5" - ;; - 14) - UNAME_MACHINE="alphaev56" - ;; - 10) - UNAME_MACHINE="alphapca56" - ;; - 16) - UNAME_MACHINE="alphaev6" - ;; - esac - fi - rm -f $dummy.s $dummy - echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM}${UNAME_RELEASE} | sed -e 's/^[VTX]//' -e 's/[-(].*//' | tr [[A-Z]] [[a-z]]` - exit 0 ;; - Alpha\ *:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # Should we change UNAME_MACHINE based on the output of uname instead - # of the specific Alpha model? - echo alpha-pc-interix - exit 0 ;; - 21064:Windows_NT:50:3) - echo alpha-dec-winnt3.5 - exit 0 ;; - Amiga*:UNIX_System_V:4.0:*) - echo m68k-cbm-sysv4 - exit 0;; - amiga:NetBSD:*:*) - echo m68k-cbm-netbsd${UNAME_RELEASE} - exit 0 ;; - amiga:OpenBSD:*:*) - echo m68k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - *:[Aa]miga[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-amigaos - exit 0 ;; - arc64:OpenBSD:*:*) - echo mips64el-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - arc:OpenBSD:*:*) - echo mipsel-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - hkmips:OpenBSD:*:*) - echo mips-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - pmax:OpenBSD:*:*) - echo mipsel-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - sgi:OpenBSD:*:*) - echo mips-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - wgrisc:OpenBSD:*:*) - echo mipsel-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - *:OS/390:*:*) - echo i370-ibm-openedition - exit 0 ;; - arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) - echo arm-acorn-riscix${UNAME_RELEASE} - exit 0;; - arm32:NetBSD:*:*) - echo arm-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` - exit 0 ;; - SR2?01:HI-UX/MPP:*:*) - echo hppa1.1-hitachi-hiuxmpp - exit 0;; - Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) - # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. - if test "`(/bin/universe) 2>/dev/null`" = att ; then - echo pyramid-pyramid-sysv3 - else - echo pyramid-pyramid-bsd - fi - exit 0 ;; - NILE*:*:*:dcosx) - echo pyramid-pyramid-svr4 - exit 0 ;; - sun4H:SunOS:5.*:*) - echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit 0 ;; - sun4[md]:SunOS:5.*:*) - echo sparcv8-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit 0 ;; - sun4u:SunOS:5.*:*) - echo sparcv9-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit 0 ;; - sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) - echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit 0 ;; - i386:SunOS:5.*:*) - echo ${X86CPU}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit 0 ;; - sun4[md]:SunOS:*:*) - case "`/usr/bin/arch -k`" in - Series*|S4*) - UNAME_RELEASE=`uname -v` - ;; - esac - # Japanese Language versions have a version number like `4.1.3-JL'. - echo sparcv8-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` - exit 0 ;; - sun4*:SunOS:*:*) - case "`/usr/bin/arch -k`" in - Series*|S4*) - UNAME_RELEASE=`uname -v` - ;; - esac - # Japanese Language versions have a version number like `4.1.3-JL'. - echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` - exit 0 ;; - sun3*:SunOS:*:*) - echo m68k-sun-sunos${UNAME_RELEASE} - exit 0 ;; - sun*:*:4.2BSD:*) - UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` - test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 - case "`/bin/arch`" in - sun3) - echo m68k-sun-sunos${UNAME_RELEASE} - ;; - sun4) - echo sparc-sun-sunos${UNAME_RELEASE} - ;; - esac - exit 0 ;; - aushp:SunOS:*:*) - echo sparc-auspex-sunos${UNAME_RELEASE} - exit 0 ;; - atari*:NetBSD:*:*) - echo m68k-atari-netbsd${UNAME_RELEASE} - exit 0 ;; - atari*:OpenBSD:*:*) - echo m68k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - # The situation for MiNT is a little confusing. The machine name - # can be virtually everything (everything which is not - # "atarist" or "atariste" at least should have a processor - # > m68000). The system name ranges from "MiNT" over "FreeMiNT" - # to the lowercase version "mint" (or "freemint"). Finally - # the system name "TOS" denotes a system which is actually not - # MiNT. But MiNT is downward compatible to TOS, so this should - # be no problem. - atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit 0 ;; - atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit 0 ;; - *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit 0 ;; - milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) - echo m68k-milan-mint${UNAME_RELEASE} - exit 0 ;; - hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) - echo m68k-hades-mint${UNAME_RELEASE} - exit 0 ;; - *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) - echo m68k-unknown-mint${UNAME_RELEASE} - exit 0 ;; - sun3*:NetBSD:*:*) - echo m68k-sun-netbsd${UNAME_RELEASE} - exit 0 ;; - sun3*:OpenBSD:*:*) - echo m68k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - mac68k:NetBSD:*:*) - echo m68k-apple-netbsd${UNAME_RELEASE} - exit 0 ;; - mac68k:OpenBSD:*:*) - echo m68k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - macppc:NetBSD:*:*) - echo powerpc-apple-netbsd${UNAME_RELEASE} - exit 0 ;; - mvme68k:OpenBSD:*:*) - echo m68k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - mvme88k:OpenBSD:*:*) - echo m88k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - powerpc:machten:*:*) - echo powerpc-apple-machten${UNAME_RELEASE} - exit 0 ;; - RISC*:Mach:*:*) - echo mips-dec-mach_bsd4.3 - exit 0 ;; - RISC*:ULTRIX:*:*) - echo mips-dec-ultrix${UNAME_RELEASE} - exit 0 ;; - VAX*:ULTRIX*:*:*) - echo vax-dec-ultrix${UNAME_RELEASE} - exit 0 ;; - 2020:CLIX:*:* | 2430:CLIX:*:*) - echo clipper-intergraph-clix${UNAME_RELEASE} - exit 0 ;; - mips:*:*:UMIPS | mips:*:*:RISCos) - sed 's/^ //' << EOF >$dummy.c -#ifdef __cplusplus -#include /* for printf() prototype */ - int main (int argc, char *argv[]) { -#else - int main (argc, argv) int argc; char *argv[]; { -#endif - #if defined (host_mips) && defined (MIPSEB) - #if defined (SYSTYPE_SYSV) - printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); - #endif - #if defined (SYSTYPE_SVR4) - printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); - #endif - #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) - printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); - #endif - #endif - exit (-1); - } -EOF - $CC_FOR_BUILD $dummy.c -o $dummy \ - && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ - && rm $dummy.c $dummy && exit 0 - rm -f $dummy.c $dummy - echo mips-mips-riscos${UNAME_RELEASE} - exit 0 ;; - Night_Hawk:Power_UNIX:*:*) - echo powerpc-harris-powerunix - exit 0 ;; - m88k:CX/UX:7*:*) - echo m88k-harris-cxux7 - exit 0 ;; - m88k:*:4*:R4*) - echo m88k-motorola-sysv4 - exit 0 ;; - m88k:*:3*:R3*) - echo m88k-motorola-sysv3 - exit 0 ;; - AViiON:dgux:*:*) - # DG/UX returns AViiON for all architectures - UNAME_PROCESSOR=`/usr/bin/uname -p` - if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] - then - if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ - [ ${TARGET_BINARY_INTERFACE}x = x ] - then - echo m88k-dg-dgux${UNAME_RELEASE} - else - echo m88k-dg-dguxbcs${UNAME_RELEASE} - fi - else - echo i586-dg-dgux${UNAME_RELEASE} - fi - exit 0 ;; - M88*:DolphinOS:*:*) # DolphinOS (SVR3) - echo m88k-dolphin-sysv3 - exit 0 ;; - M88*:*:R3*:*) - # Delta 88k system running SVR3 - echo m88k-motorola-sysv3 - exit 0 ;; - XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) - echo m88k-tektronix-sysv3 - exit 0 ;; - Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) - echo m68k-tektronix-bsd - exit 0 ;; - *:IRIX*:*:*) - echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` - exit 0 ;; - ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. - echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id - exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' - i?86:AIX:*:*) - echo i386-ibm-aix - exit 0 ;; - *:AIX:2:3) - if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then - sed 's/^ //' << EOF >$dummy.c - #include - - main() - { - if (!__power_pc()) - exit(1); - puts("powerpc-ibm-aix3.2.5"); - exit(0); - } -EOF - $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm $dummy.c $dummy && exit 0 - rm -f $dummy.c $dummy - echo rs6000-ibm-aix3.2.5 - elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then - echo rs6000-ibm-aix3.2.4 - else - echo rs6000-ibm-aix3.2 - fi - exit 0 ;; - *:AIX:*:4) - sed 's/^ //' << EOF >$dummy.c - #include - #include - main () - { - if (_system_configuration.architecture == POWER_RS - || _system_configuration.implementation == POWER_601) - puts ("power"); - else - { - if (_system_configuration.width == 64) - puts ("powerpc64"); - else - puts ("powerpc"); - } - exit (0); - } -EOF - $CC_FOR_BUILD $dummy.c -o $dummy - IBM_ARCH=`./$dummy` - rm -f $dummy.c $dummy - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` - else - IBM_REV=4.${UNAME_RELEASE} - fi - echo ${IBM_ARCH}-ibm-aix${IBM_REV} - exit 0 ;; - *:AIX:*:*) - echo rs6000-ibm-aix - exit 0 ;; - ibmrt:4.4BSD:*|romp-ibm:BSD:*) - echo romp-ibm-bsd4.4 - exit 0 ;; - ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and - echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to - exit 0 ;; # report: romp-ibm BSD 4.3 - *:BOSX:*:*) - echo rs6000-bull-bosx - exit 0 ;; - DPX/2?00:B.O.S.:*:*) - echo m68k-bull-sysv3 - exit 0 ;; - 9000/[34]??:4.3bsd:1.*:*) - echo m68k-hp-bsd - exit 0 ;; - hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) - echo m68k-hp-bsd4.4 - exit 0 ;; - 9000/[34678]??:HP-UX:*:*) - case "${UNAME_MACHINE}" in - 9000/31? ) HP_ARCH=m68000 ;; - 9000/[34]?? ) HP_ARCH=m68k ;; - 9000/[678][0-9][0-9]) - sed 's/^ //' << EOF >$dummy.c - - #define _HPUX_SOURCE - #include - #include - - int main () - { - #if defined(_SC_KERNEL_BITS) - long bits = sysconf(_SC_KERNEL_BITS); - #endif - long cpu = sysconf (_SC_CPU_VERSION); - - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1"); break; - case CPU_PA_RISC2_0: - #if defined(_SC_KERNEL_BITS) - switch (bits) - { - case 64: puts ("hppa2.0w"); break; - case 32: puts ("hppa2.0n"); break; - default: puts ("hppa2.0"); break; - } break; - #else /* !defined(_SC_KERNEL_BITS) */ - puts ("hppa2.0"); break; - #endif - default: puts ("hppa1.0"); break; - } - exit (0); - } -EOF - (CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy` - rm -f $dummy.c $dummy - esac - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - echo ${HP_ARCH}-hp-hpux${HPUX_REV} - exit 0 ;; - 3050*:HI-UX:*:*) - sed 's/^ //' << EOF >$dummy.c - #include - int - main () - { - long cpu = sysconf (_SC_CPU_VERSION); - /* The order matters, because CPU_IS_HP_MC68K erroneously returns - true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct - results, however. */ - if (CPU_IS_PA_RISC (cpu)) - { - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; - case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; - default: puts ("hppa-hitachi-hiuxwe2"); break; - } - } - else if (CPU_IS_HP_MC68K (cpu)) - puts ("m68k-hitachi-hiuxwe2"); - else puts ("unknown-hitachi-hiuxwe2"); - exit (0); - } -EOF - $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm $dummy.c $dummy && exit 0 - rm -f $dummy.c $dummy - echo unknown-hitachi-hiuxwe2 - exit 0 ;; - 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) - echo hppa1.1-hp-bsd - exit 0 ;; - 9000/8??:4.3bsd:*:*) - echo hppa1.0-hp-bsd - exit 0 ;; - *9??*:MPE/iX:*:*) - echo hppa1.0-hp-mpeix - exit 0 ;; - hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) - echo hppa1.1-hp-osf - exit 0 ;; - hp8??:OSF1:*:*) - echo hppa1.0-hp-osf - exit 0 ;; - i?86:OSF1:*:*) - if [ -x /usr/sbin/sysversion ] ; then - echo ${UNAME_MACHINE}-unknown-osf1mk - else - echo ${UNAME_MACHINE}-unknown-osf1 - fi - exit 0 ;; - parisc*:Lites*:*:*) - echo hppa1.1-hp-lites - exit 0 ;; - hppa*:OpenBSD:*:*) - echo hppa-unknown-openbsd - exit 0 ;; - C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) - echo c1-convex-bsd - exit 0 ;; - C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit 0 ;; - C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) - echo c34-convex-bsd - exit 0 ;; - C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) - echo c38-convex-bsd - exit 0 ;; - C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) - echo c4-convex-bsd - exit 0 ;; - CRAY*X-MP:*:*:*) - echo xmp-cray-unicos - exit 0 ;; - CRAY*Y-MP:*:*:*) - echo ymp-cray-unicos${UNAME_RELEASE} - exit 0 ;; - CRAY*[A-Z]90:*:*:*) - echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ - | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ - -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ - exit 0 ;; - CRAY*TS:*:*:*) - echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit 0 ;; - CRAY*T3D:*:*:*) - echo alpha-cray-unicos - exit 0 ;; - CRAY*T3E:*:*:*) - echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit 0 ;; - CRAY*SV1:*:*:*) - echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit 0 ;; - CRAY-2:*:*:*) - echo cray2-cray-unicos - exit 0 ;; - F300:UNIX_System_V:*:*) - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` - echo "f300-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit 0 ;; - F301:UNIX_System_V:*:*) - echo f301-fujitsu-uxpv`echo $UNAME_RELEASE | sed 's/ .*//'` - exit 0 ;; - hp3[0-9][05]:NetBSD:*:*) - echo m68k-hp-netbsd${UNAME_RELEASE} - exit 0 ;; - hp300:OpenBSD:*:*) - echo m68k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - i?86:BSD/386:*:* | i?86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) - echo ${X86CPU}-pc-bsdi${UNAME_RELEASE} - exit 0 ;; - sparc*:BSD/OS:*:*) - echo sparc-unknown-bsdi${UNAME_RELEASE} - exit 0 ;; - *:BSD/OS:*:*) - echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} - exit 0 ;; - i386:FreeBSD:*:*) - echo ${X86CPU}-pc-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` - exit 0 ;; - *:FreeBSD:*:*) - echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` - exit 0 ;; - i386:NetBSD:*:*) - echo ${X86CPU}-pc-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` - exit 0 ;; - *:NetBSD:*:*) - echo ${UNAME_MACHINE}-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` - exit 0 ;; - i386:OpenBSD:*:*) - echo ${X86CPU}-pc-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` - exit 0 ;; - *:OpenBSD:*:*) - echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` - exit 0 ;; - i*:CYGWIN*:*) - echo ${X86CPU}-pc-cygwin - exit 0 ;; - i*:MINGW*:*) - echo ${UNAME_MACHINE}-pc-mingw32 - exit 0 ;; - i*:Windows_NT*:* | Pentium*:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we - # UNAME_MACHINE based on the output of uname instead of i386? - echo i386-pc-interix - exit 0 ;; - i*:UWIN*:*) - echo ${UNAME_MACHINE}-pc-uwin - exit 0 ;; - p*:CYGWIN*:*) - echo powerpcle-unknown-cygwin - exit 0 ;; - prep*:SunOS:5.*:*) - echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit 0 ;; - *:GNU:*:*) - echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` - exit 0 ;; - *:Linux:*:*) - - # The BFD linker knows what the default object file format is, so - # first see if it will tell us. cd to the root directory to prevent - # problems with other programs or directories called `ld' in the path. - ld_help_string=`cd /; ld --help 2>&1` - ld_supported_emulations=`echo $ld_help_string \ - | sed -ne '/supported emulations:/!d - s/[ ][ ]*/ /g - s/.*supported emulations: *// - s/ .*// - p'` - case "$ld_supported_emulations" in - *ia64) - echo "${UNAME_MACHINE}-unknown-linux" - exit 0 - ;; - i?86linux) - echo "${X86CPU}-pc-linux-gnuaout" - exit 0 - ;; - i?86coff) - echo "${X86CPU}-pc-linux-gnucoff" - exit 0 - ;; - sparclinux) - echo "${UNAME_MACHINE}-unknown-linux-gnuaout" - exit 0 - ;; - armlinux) - echo "${UNAME_MACHINE}-unknown-linux-gnuaout" - exit 0 - ;; - elf32arm*) - echo "${UNAME_MACHINE}-unknown-linux-gnuoldld" - exit 0 - ;; - armelf_linux*) - echo "${UNAME_MACHINE}-unknown-linux-gnu" - exit 0 - ;; - m68klinux) - echo "${UNAME_MACHINE}-unknown-linux-gnuaout" - exit 0 - ;; - elf32ppc | elf32ppclinux) - # Determine Lib Version - cat >$dummy.c < -#if defined(__GLIBC__) -extern char __libc_version[]; -extern char __libc_release[]; -#endif -main(argc, argv) - int argc; - char *argv[]; -{ -#if defined(__GLIBC__) - printf("%s %s\n", __libc_version, __libc_release); -#else - printf("unkown\n"); -#endif - return 0; -} -EOF - LIBC="" - $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null - if test "$?" = 0 ; then - ./$dummy | grep 1\.99 > /dev/null - if test "$?" = 0 ; then - LIBC="libc1" - fi - fi - rm -f $dummy.c $dummy - echo powerpc-unknown-linux-gnu${LIBC} - exit 0 - ;; - esac - - if test "${UNAME_MACHINE}" = "alpha" ; then - cat <$dummy.s - .data - \$Lformat: - .byte 37,100,45,37,120,10,0 # "%d-%x\n" - - .text - .globl main - .align 4 - .ent main - main: - .frame \$30,16,\$26,0 - ldgp \$29,0(\$27) - .prologue 1 - .long 0x47e03d80 # implver \$0 - lda \$2,-1 - .long 0x47e20c21 # amask \$2,\$1 - lda \$16,\$Lformat - mov \$0,\$17 - not \$1,\$18 - jsr \$26,printf - ldgp \$29,0(\$26) - mov 0,\$16 - jsr \$26,exit - .end main -EOF - LIBC="" - $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null - if test "$?" = 0 ; then - case `./$dummy` in - 0-0) - UNAME_MACHINE="alpha" - ;; - 1-0) - UNAME_MACHINE="alphaev5" - ;; - 1-1) - UNAME_MACHINE="alphaev56" - ;; - 1-101) - UNAME_MACHINE="alphapca56" - ;; - 2-303) - UNAME_MACHINE="alphaev6" - ;; - 2-307) - UNAME_MACHINE="alphaev67" - ;; - esac - - objdump --private-headers $dummy | \ - grep ld.so.1 > /dev/null - if test "$?" = 0 ; then - LIBC="libc1" - fi - fi - rm -f $dummy.s $dummy - echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} ; exit 0 - elif test "${UNAME_MACHINE}" = "mips" ; then - cat >$dummy.c < /* for printf() prototype */ - int main (int argc, char *argv[]) { -#else - int main (argc, argv) int argc; char *argv[]; { -#endif -#ifdef __MIPSEB__ - printf ("%s-unknown-linux-gnu\n", argv[1]); -#endif -#ifdef __MIPSEL__ - printf ("%sel-unknown-linux-gnu\n", argv[1]); -#endif - return 0; -} -EOF - $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0 - rm -f $dummy.c $dummy - elif test "${UNAME_MACHINE}" = "s390"; then - echo s390-ibm-linux && exit 0 - else - # Either a pre-BFD a.out linker (linux-gnuoldld) - # or one that does not give us useful --help. - # GCC wants to distinguish between linux-gnuoldld and linux-gnuaout. - # If ld does not provide *any* "supported emulations:" - # that means it is gnuoldld. - echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations:" - test $? != 0 && echo "${X86CPU}-pc-linux-gnuoldld" && exit 0 - - case "${UNAME_MACHINE}" in - i?86) - VENDOR=pc; - UNAME_MACHINE=${X86CPU} - ;; - *) - VENDOR=unknown; - ;; - esac - # Determine whether the default compiler is a.out or elf - cat >$dummy.c < -#ifdef __cplusplus -#include /* for printf() prototype */ - int main (int argc, char *argv[]) { -#else - int main (argc, argv) int argc; char *argv[]; { -#endif -#ifdef __ELF__ -# ifdef __GLIBC__ -# if __GLIBC__ >= 2 - printf ("%s-${VENDOR}-linux-gnu\n", argv[1]); -# else - printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]); -# endif -# else - printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]); -# endif -#else - printf ("%s-${VENDOR}-linux-gnuaout\n", argv[1]); -#endif - return 0; -} -EOF - $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0 - rm -f $dummy.c $dummy - fi ;; -# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. earlier versions -# are messed up and put the nodename in both sysname and nodename. - i?86:DYNIX/ptx:4*:*) - echo i386-sequent-sysv4 - exit 0 ;; - i?86:UNIX_SV:4.2MP:2.*) - # Unixware is an offshoot of SVR4, but it has its own version - # number series starting with 2... - # I am not positive that other SVR4 systems won't match this, - # I just have to hope. -- rms. - # Use sysv4.2uw... so that sysv4* matches it. - echo ${X86CPU}-pc-sysv4.2uw${UNAME_VERSION} - exit 0 ;; - i?86:*:4.*:* | i?86:SYSTEM_V:4.*:*) - UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` - if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then - echo ${X86CPU}-univel-sysv${UNAME_REL} - else - echo ${X86CPU}-pc-sysv${UNAME_REL} - fi - exit 0 ;; - i?86:*:5:7*) - # Fixed at (any) Pentium or better - UNAME_MACHINE=i586 - if [ ${UNAME_SYSTEM} = "UnixWare" ] ; then - echo ${X86CPU}-sco-sysv${UNAME_RELEASE}uw${UNAME_VERSION} - else - echo ${X86CPU}-pc-sysv${UNAME_RELEASE} - fi - exit 0 ;; - i?86:*:3.2:*) - if test -f /usr/options/cb.name; then - UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then - UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')` - (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486 - (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \ - && UNAME_MACHINE=i586 - (/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \ - && UNAME_MACHINE=i686 - (/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \ - && UNAME_MACHINE=i686 - echo ${X86CPU}-pc-sco$UNAME_REL - else - echo ${X86CPU}-pc-sysv32 - fi - exit 0 ;; - i?86:*DOS:*:*) - echo ${X86CPU}-pc-msdosdjgpp - exit 0 ;; - pc:*:*:*) - # Left here for compatibility: - # uname -m prints for DJGPP always 'pc', but it prints nothing about - # the processor, so we play safe by assuming i386. - echo i386-pc-msdosdjgpp - exit 0 ;; - Intel:Mach:3*:*) - echo i386-pc-mach3 - exit 0 ;; - paragon:*:*:*) - echo i860-intel-osf1 - exit 0 ;; - i860:*:4.*:*) # i860-SVR4 - if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then - echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 - else # Add other i860-SVR4 vendors below as they are discovered. - echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 - fi - exit 0 ;; - mini*:CTIX:SYS*5:*) - # "miniframe" - echo m68010-convergent-sysv - exit 0 ;; - M68*:*:R3V[567]*:*) - test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; - 3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0) - OS_REL='' - test -r /etc/.relid \ - && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && echo i486-ncr-sysv4.3${OS_REL} && exit 0 - /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; - 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && echo i486-ncr-sysv4 && exit 0 ;; - m68*:LynxOS:2.*:*) - echo m68k-unknown-lynxos${UNAME_RELEASE} - exit 0 ;; - mc68030:UNIX_System_V:4.*:*) - echo m68k-atari-sysv4 - exit 0 ;; - i?86:LynxOS:2.*:* | i?86:LynxOS:3.[01]*:*) - echo i386-unknown-lynxos${UNAME_RELEASE} - exit 0 ;; - TSUNAMI:LynxOS:2.*:*) - echo sparc-unknown-lynxos${UNAME_RELEASE} - exit 0 ;; - rs6000:LynxOS:2.*:* | PowerPC:LynxOS:2.*:*) - echo rs6000-unknown-lynxos${UNAME_RELEASE} - exit 0 ;; - SM[BE]S:UNIX_SV:*:*) - echo mips-dde-sysv${UNAME_RELEASE} - exit 0 ;; - RM*:ReliantUNIX-*:*:*) - echo mips-sni-sysv4 - exit 0 ;; - RM*:SINIX-*:*:*) - echo mips-sni-sysv4 - exit 0 ;; - *:SINIX-*:*:*) - if uname -p 2>/dev/null >/dev/null ; then - UNAME_MACHINE=`(uname -p) 2>/dev/null` - echo ${UNAME_MACHINE}-sni-sysv4 - else - echo ns32k-sni-sysv - fi - exit 0 ;; - PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort - # says - echo i586-unisys-sysv4 - exit 0 ;; - *:UNIX_System_V:4*:FTX*) - # From Gerald Hewes . - # How about differentiating between stratus architectures? -djm - echo hppa1.1-stratus-sysv4 - exit 0 ;; - *:*:*:FTX*) - # From seanf@swdc.stratus.com. - echo i860-stratus-sysv4 - exit 0 ;; - mc68*:A/UX:*:*) - echo m68k-apple-aux${UNAME_RELEASE} - exit 0 ;; - news*:NEWS-OS:*:6*) - echo mips-sony-newsos6 - exit 0 ;; - R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) - if [ -d /usr/nec ]; then - echo mips-nec-sysv${UNAME_RELEASE} - else - echo mips-unknown-sysv${UNAME_RELEASE} - fi - exit 0 ;; - BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. - echo powerpc-be-beos - exit 0 ;; - BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. - echo powerpc-apple-beos - exit 0 ;; - BePC:BeOS:*:*) # BeOS running on Intel PC compatible. - echo i586-pc-beos - exit 0 ;; - SX-4:SUPER-UX:*:*) - echo sx4-nec-superux${UNAME_RELEASE} - exit 0 ;; - SX-5:SUPER-UX:*:*) - echo sx5-nec-superux${UNAME_RELEASE} - exit 0 ;; - Power*:Rhapsody:*:*) - echo powerpc-apple-rhapsody${UNAME_RELEASE} - exit 0 ;; - *:Rhapsody:*:*) - echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} - exit 0 ;; - Power*:Mac*OS:*:*) - echo powerpc-apple-macos${UNAME_RELEASE} - exit 0 ;; - *:Mac*OS:*:*) - echo ${UNAME_MACHINE}-apple-macos${UNAME_RELEASE} - exit 0 ;; - *:Darwin:*:*) - echo `uname -p`-apple-darwin${UNAME_RELEASE} - exit 0 ;; - *:procnto*:*:* | *:QNX:[0123456789]*:*) - if test "${UNAME_MACHINE}" = "x86pc"; then - UNAME_MACHINE=pc - fi - echo `uname -p`-${UNAME_MACHINE}-nto-qnx - exit 0 ;; - *:QNX:*:4*) - echo i386-pc-qnx - exit 0 ;; - NSR-W:NONSTOP_KERNEL:*:*) - echo nsr-tandem-nsk${UNAME_RELEASE} - exit 0 ;; - BS2000:POSIX*:*:*) - echo bs2000-siemens-sysv - exit 0 ;; -esac - -#echo '(No uname command or uname output not recognized.)' 1>&2 -#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 - -cat >$dummy.c < -# include -#endif -main () -{ -#if defined (sony) -#if defined (MIPSEB) - /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, - I don't know.... */ - printf ("mips-sony-bsd\n"); exit (0); -#else -#include - printf ("m68k-sony-newsos%s\n", -#ifdef NEWSOS4 - "4" -#else - "" -#endif - ); exit (0); -#endif -#endif - -#if defined (__arm) && defined (__acorn) && defined (__unix) - printf ("arm-acorn-riscix"); exit (0); -#endif - -#if defined (hp300) && !defined (hpux) - printf ("m68k-hp-bsd\n"); exit (0); -#endif - -#if defined (NeXT) -#if !defined (__ARCHITECTURE__) -#define __ARCHITECTURE__ "m68k" -#endif - int version; - version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; - if (version < 4) - printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); - else - printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); - exit (0); -#endif - -#if defined (MULTIMAX) || defined (n16) -#if defined (UMAXV) - printf ("ns32k-encore-sysv\n"); exit (0); -#else -#if defined (CMU) - printf ("ns32k-encore-mach\n"); exit (0); -#else - printf ("ns32k-encore-bsd\n"); exit (0); -#endif -#endif -#endif - -#if defined (__386BSD__) - printf ("i386-pc-bsd\n"); exit (0); -#endif - -#if defined (sequent) -#if defined (i386) - printf ("i386-sequent-dynix\n"); exit (0); -#endif -#if defined (ns32000) - printf ("ns32k-sequent-dynix\n"); exit (0); -#endif -#endif - -#if defined (_SEQUENT_) - struct utsname un; - - uname(&un); - - if (strncmp(un.version, "V2", 2) == 0) { - printf ("i386-sequent-ptx2\n"); exit (0); - } - if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ - printf ("i386-sequent-ptx1\n"); exit (0); - } - printf ("i386-sequent-ptx\n"); exit (0); - -#endif - -#if defined (vax) -#if !defined (ultrix) - printf ("vax-dec-bsd\n"); exit (0); -#else - printf ("vax-dec-ultrix\n"); exit (0); -#endif -#endif - -#if defined (alliant) && defined (i860) - printf ("i860-alliant-bsd\n"); exit (0); -#endif - - exit (1); -} -EOF - -$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm $dummy.c $dummy && exit 0 -rm -f $dummy.c $dummy - -# Apollos put the system type in the environment. - -test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } - -# Convex versions that predate uname can use getsysinfo(1) - -if [ -x /usr/convex/getsysinfo ] -then - case `getsysinfo -f cpu_type` in - c1*) - echo c1-convex-bsd - exit 0 ;; - c2*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit 0 ;; - c34*) - echo c34-convex-bsd - exit 0 ;; - c38*) - echo c38-convex-bsd - exit 0 ;; - c4*) - echo c4-convex-bsd - exit 0 ;; - esac -fi - -#echo '(Unable to guess system type)' 1>&2 - -exit 1 diff --git a/rts/gmp/config.in b/rts/gmp/config.in deleted file mode 100644 index 8b2546e..0000000 --- a/rts/gmp/config.in +++ /dev/null @@ -1,162 +0,0 @@ -/* config.in. Generated automatically from configure.in by autoheader. */ -/* -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. -*/ - - -/* Define if a limb is long long. */ -#undef _LONG_LONG_LIMB - -/* Define if we have native implementation of function. */ -#undef HAVE_NATIVE_ -#undef HAVE_NATIVE_mpn_add -#undef HAVE_NATIVE_mpn_add_1 -#undef HAVE_NATIVE_mpn_add_n -#undef HAVE_NATIVE_mpn_add_nc -#undef HAVE_NATIVE_mpn_addmul_1 -#undef HAVE_NATIVE_mpn_addmul_1c -#undef HAVE_NATIVE_mpn_addsub_n -#undef HAVE_NATIVE_mpn_addsub_nc -#undef HAVE_NATIVE_mpn_and_n -#undef HAVE_NATIVE_mpn_andn_n -#undef HAVE_NATIVE_mpn_bdivmod -#undef HAVE_NATIVE_mpn_cmp -#undef HAVE_NATIVE_mpn_com_n -#undef HAVE_NATIVE_mpn_copyd -#undef HAVE_NATIVE_mpn_copyi -#undef HAVE_NATIVE_mpn_divexact_by3c -#undef HAVE_NATIVE_mpn_divrem -#undef HAVE_NATIVE_mpn_divrem_1 -#undef HAVE_NATIVE_mpn_divrem_1c -#undef HAVE_NATIVE_mpn_divrem_2 -#undef HAVE_NATIVE_mpn_divrem_newton -#undef HAVE_NATIVE_mpn_divrem_classic -#undef HAVE_NATIVE_mpn_dump -#undef HAVE_NATIVE_mpn_gcd -#undef HAVE_NATIVE_mpn_gcd_1 -#undef HAVE_NATIVE_mpn_gcdext -#undef HAVE_NATIVE_mpn_get_str -#undef HAVE_NATIVE_mpn_hamdist -#undef HAVE_NATIVE_mpn_invert_limb -#undef HAVE_NATIVE_mpn_ior_n -#undef HAVE_NATIVE_mpn_iorn_n -#undef HAVE_NATIVE_mpn_lshift -#undef HAVE_NATIVE_mpn_mod_1 -#undef HAVE_NATIVE_mpn_mod_1c -#undef HAVE_NATIVE_mpn_mul -#undef HAVE_NATIVE_mpn_mul_1 -#undef HAVE_NATIVE_mpn_mul_1c -#undef HAVE_NATIVE_mpn_mul_basecase -#undef HAVE_NATIVE_mpn_mul_n -#undef HAVE_NATIVE_mpn_nand_n -#undef HAVE_NATIVE_mpn_nior_n -#undef HAVE_NATIVE_mpn_perfect_square_p -#undef HAVE_NATIVE_mpn_popcount -#undef HAVE_NATIVE_mpn_preinv_mod_1 -#undef HAVE_NATIVE_mpn_random2 -#undef HAVE_NATIVE_mpn_random -#undef HAVE_NATIVE_mpn_rawrandom -#undef HAVE_NATIVE_mpn_rshift -#undef HAVE_NATIVE_mpn_scan0 -#undef HAVE_NATIVE_mpn_scan1 -#undef HAVE_NATIVE_mpn_set_str -#undef HAVE_NATIVE_mpn_sqrtrem -#undef HAVE_NATIVE_mpn_sqr_basecase -#undef HAVE_NATIVE_mpn_sub -#undef HAVE_NATIVE_mpn_sub_1 -#undef HAVE_NATIVE_mpn_sub_n -#undef HAVE_NATIVE_mpn_sub_nc -#undef HAVE_NATIVE_mpn_submul_1 -#undef HAVE_NATIVE_mpn_submul_1c -#undef HAVE_NATIVE_mpn_udiv_w_sdiv -#undef HAVE_NATIVE_mpn_umul_ppmm -#undef HAVE_NATIVE_mpn_udiv_qrnnd -#undef HAVE_NATIVE_mpn_xor_n -#undef HAVE_NATIVE_mpn_xnor_n - -/* Define to 1 if you have the declaration of `optarg', and to 0 if you don't. - */ -#undef HAVE_DECL_OPTARG - -/* ./configure --enable-assert option, to enable some ASSERT()s */ -#undef WANT_ASSERT - -/* Define if you have the header file. */ -#undef HAVE_SYS_SYSCTL_H - -/* Define if you have the `strtoul' function. */ -#undef HAVE_STRTOUL - -/* Name of package */ -#undef PACKAGE - -/* Define if you have the `sysctlbyname' function. */ -#undef HAVE_SYSCTLBYNAME - -/* Define if the system has the type `void'. */ -#undef HAVE_VOID - -/* Define if you have the `popen' function. */ -#undef HAVE_POPEN - -/* ./configure --disable-alloca option, to use stack-alloc.c, not alloca */ -#undef USE_STACK_ALLOC - -/* Define if cpp supports the ANSI # stringizing operator. */ -#undef HAVE_STRINGIZE - -/* Define if you have the header file. */ -#undef HAVE_SYS_TIME_H - -/* Define if you have the `sysconf' function. */ -#undef HAVE_SYSCONF - -/* Define if you have the `getpagesize' function. */ -#undef HAVE_GETPAGESIZE - -/* Define if you have the `processor_info' function. */ -#undef HAVE_PROCESSOR_INFO - -/* Version number of package */ -#undef VERSION - -/* Define if you have the `getopt_long' function. */ -#undef HAVE_GETOPT_LONG - -/* Define if you have the header file. */ -#undef HAVE_GETOPT_H - -/* Define if you have the ANSI C header files. */ -#undef STDC_HEADERS - -/* Define if a speed_cyclecounter exists (for the tune programs) */ -#undef HAVE_SPEED_CYCLECOUNTER - -/* Define if mpn/tests has calling conventions checking for the CPU */ -#undef HAVE_CALLING_CONVENTIONS - -/* ./configure --enable-fft option, to enable FFTs for multiplication */ -#undef WANT_FFT - -/* Define if you have the header file. */ -#undef HAVE_STRING_H - -/* Define if you have the header file. */ -#undef HAVE_UNISTD_H diff --git a/rts/gmp/config.sub b/rts/gmp/config.sub deleted file mode 100644 index c4123f2..0000000 --- a/rts/gmp/config.sub +++ /dev/null @@ -1,1273 +0,0 @@ -#! /bin/sh -# Configuration validation subroutine script, version 1.1. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000 -# Free Software Foundation, Inc. -# -# This file is (in principle) common to ALL GNU software. -# The presence of a machine in this file suggests that SOME GNU software -# can handle that machine. It does not imply ALL GNU software can. -# -# This file is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, -# Boston, MA 02111-1307, USA. - -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# Written by Per Bothner . -# Please send patches to . -# -# Configuration subroutine to validate and canonicalize a configuration type. -# Supply the specified configuration type as an argument. -# If it is invalid, we print an error message on stderr and exit with code 1. -# Otherwise, we print the canonical config type on stdout and succeed. - -# This file is supposed to be the same for all GNU packages -# and recognize all the CPU types, system types and aliases -# that are meaningful with *any* GNU software. -# Each package is responsible for reporting which valid configurations -# it does not support. The user should be able to distinguish -# a failure to support a valid configuration from a meaningless -# configuration. - -# The goal of this file is to map all the various variations of a given -# machine specification into a single specification in the form: -# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM -# or in some cases, the newer four-part form: -# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM -# It is wrong to echo any other type of specification. - -if [ x$1 = x ] -then - echo Configuration name missing. 1>&2 - echo "Usage: $0 CPU-MFR-OPSYS" 1>&2 - echo "or $0 ALIAS" 1>&2 - echo where ALIAS is a recognized configuration type. 1>&2 - exit 1 -fi - -# First pass through any local machine types. -case $1 in - *local*) - echo $1 - exit 0 - ;; - *) - ;; -esac - -# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). -# Here we must recognize all the valid KERNEL-OS combinations. -maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` -case $maybe_os in - nto-qnx* | linux-gnu*) - os=-$maybe_os - basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` - ;; - *) - basic_machine=`echo $1 | sed 's/-[^-]*$//'` - if [ $basic_machine != $1 ] - then os=`echo $1 | sed 's/.*-/-/'` - else os=; fi - ;; -esac - -### Let's recognize common machines as not being operating systems so -### that things like config.sub decstation-3100 work. We also -### recognize some manufacturers as not being operating systems, so we -### can provide default operating systems below. -case $os in - -sun*os*) - # Prevent following clause from handling this invalid input. - ;; - -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ - -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ - -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ - -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ - -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ - -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ - -apple) - os= - basic_machine=$1 - ;; - -sim | -cisco | -oki | -wec | -winbond) - os= - basic_machine=$1 - ;; - -scout) - ;; - -wrs) - os=-vxworks - basic_machine=$1 - ;; - -hiux*) - os=-hiuxwe2 - ;; - -sco5) - os=-sco3.2v5 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco4) - os=-sco3.2v4 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco3.2.[4-9]*) - os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco3.2v[4-9]*) - # Don't forget version if it is 3.2v4 or newer. - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco*) - os=-sco3.2v2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -udk*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -isc) - os=-isc2.2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -clix*) - basic_machine=clipper-intergraph - ;; - -isc*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -lynx*) - os=-lynxos - ;; - -ptx*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` - ;; - -windowsnt*) - os=`echo $os | sed -e 's/windowsnt/winnt/'` - ;; - -psos*) - os=-psos - ;; - -mint | -mint[0-9]*) - basic_machine=m68k-atari - os=-mint - ;; -esac - -# Decode aliases for certain CPU-COMPANY combinations. -case $basic_machine in - # Recognize the basic CPU types without company name. - # Some are omitted here because they have special meanings below. - tahoe | i860 | ia64 | m32r | m68k | m68000 | m88k | ns32k | arc | arm \ - | arme[lb] | pyramid | mn10200 | mn10300 | tron | a29k \ - | 580 | i960 | h8300 \ - | x86 | ppcbe | mipsbe | mipsle | shbe | shle | armbe | armle \ - | hppa | hppa1.0 | hppa1.1 | hppa2.0 | hppa2.0w | hppa2.0n \ - | alpha | alphaev[4-8] | alphaev56 | alphapca5[67] \ - | alphaev6[78] \ - | we32k | ns16k | clipper | i370 | sh | powerpc | powerpcle \ - | 1750a | dsp16xx | pdp11 | mips16 | mips64 | mipsel | mips64el \ - | mips64orion | mips64orionel | mipstx39 | mipstx39el \ - | mips64vr4300 | mips64vr4300el | mips64vr4100 | mips64vr4100el \ - | mips64vr5000 | miprs64vr5000el | mcore \ - | sparc | sparclet | sparclite | sparc64 | sparcv9 | v850 | c4x \ - | powerpc64 | sparcv8 | supersparc | microsparc | ultrasparc \ - | thumb | d10v | fr30 | avr) - basic_machine=$basic_machine-unknown - ;; - m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | z8k | v70 | h8500 | w65 | pj | pjl) - ;; - - # We use `pc' rather than `unknown' - # because (1) that's what they normally are, and - # (2) the word "unknown" tends to confuse beginning users. - i[34567]86 | pentium[23] | k[56] | k6[23] | athlon) - basic_machine=$basic_machine-pc - ;; - # Object if more than one company name word. - *-*-*) - echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 - exit 1 - ;; - # Recognize the basic CPU types with company name. - vax-* | tahoe-* | i[34567]86-* | pentium[23]-* | i860-* | ia64-* | m32r-* | m68k-* | m68000-* \ - | m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | arm-* | c[123]* \ - | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \ - | power-* | none-* | 580-* | cray2-* | h8300-* | h8500-* | i960-* \ - | xmp-* | ymp-* \ - | x86-* | ppcbe-* | mipsbe-* | mipsle-* | shbe-* | shle-* | armbe-* | armle-* \ - | hppa-* | hppa1.0-* | hppa1.1-* | hppa2.0-* | hppa2.0w-* | hppa2.0n-* \ - | alpha-* | alphaev[4-8]-* | alphaev56-* | alphapca5[67]-* \ - | alphaev6[78]-* \ - | we32k-* | cydra-* | ns16k-* | pn-* | np1-* | xps100-* \ - | clipper-* | orion-* \ - | sparclite-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \ - | sparc64-* | sparcv9-* | sparc86x-* | mips16-* | mips64-* | mipsel-* \ - | mips64el-* | mips64orion-* | mips64orionel-* \ - | mips64vr4100-* | mips64vr4100el-* | mips64vr4300-* | mips64vr4300el-* \ - | mipstx39-* | mipstx39el-* | mcore-* \ - | f301-* | armv*-* | s390-* | sv1-* | t3e-* \ - | m88110-* | m680[01234]0-* | m683?2-* | m68360-* | z8k-* | d10v-* \ - | k[56]-* | k6[23]-* | athlon-* | powerpc64-* \ - | sparcv8-* | supersparc-* | microsparc-* | ultrasparc-* \ - | thumb-* | v850-* | d30v-* | tic30-* | c30-* | fr30-* ) - ;; - # Recognize the various machine names and aliases which stand - # for a CPU type and a company and sometimes even an OS. - 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) - basic_machine=m68000-att - ;; - 3b*) - basic_machine=we32k-att - ;; - a29khif) - basic_machine=a29k-amd - os=-udi - ;; - adobe68k) - basic_machine=m68010-adobe - os=-scout - ;; - alliant | fx80) - basic_machine=fx80-alliant - ;; - altos | altos3068) - basic_machine=m68k-altos - ;; - am29k) - basic_machine=a29k-none - os=-bsd - ;; - amdahl) - basic_machine=580-amdahl - os=-sysv - ;; - amiga | amiga-*) - basic_machine=m68k-cbm - ;; - amigaos | amigados) - basic_machine=m68k-cbm - os=-amigaos - ;; - amigaunix | amix) - basic_machine=m68k-cbm - os=-sysv4 - ;; - apollo68) - basic_machine=m68k-apollo - os=-sysv - ;; - apollo68bsd) - basic_machine=m68k-apollo - os=-bsd - ;; - aux) - basic_machine=m68k-apple - os=-aux - ;; - balance) - basic_machine=ns32k-sequent - os=-dynix - ;; - convex-c1) - basic_machine=c1-convex - os=-bsd - ;; - convex-c2) - basic_machine=c2-convex - os=-bsd - ;; - convex-c32) - basic_machine=c32-convex - os=-bsd - ;; - convex-c34) - basic_machine=c34-convex - os=-bsd - ;; - convex-c38) - basic_machine=c38-convex - os=-bsd - ;; - cray | ymp) - basic_machine=ymp-cray - os=-unicos - ;; - cray2) - basic_machine=cray2-cray - os=-unicos - ;; - [ctj]90-cray) - basic_machine=c90-cray - os=-unicos - ;; - crds | unos) - basic_machine=m68k-crds - ;; - da30 | da30-*) - basic_machine=m68k-da30 - ;; - decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) - basic_machine=mips-dec - ;; - delta | 3300 | motorola-3300 | motorola-delta \ - | 3300-motorola | delta-motorola) - basic_machine=m68k-motorola - ;; - delta88) - basic_machine=m88k-motorola - os=-sysv3 - ;; - dpx20 | dpx20-*) - basic_machine=rs6000-bull - os=-bosx - ;; - dpx2* | dpx2*-bull) - basic_machine=m68k-bull - os=-sysv3 - ;; - ebmon29k) - basic_machine=a29k-amd - os=-ebmon - ;; - elxsi) - basic_machine=elxsi-elxsi - os=-bsd - ;; - encore | umax | mmax) - basic_machine=ns32k-encore - ;; - es1800 | OSE68k | ose68k | ose | OSE) - basic_machine=m68k-ericsson - os=-ose - ;; - fx2800) - basic_machine=i860-alliant - ;; - genix) - basic_machine=ns32k-ns - ;; - gmicro) - basic_machine=tron-gmicro - os=-sysv - ;; - h3050r* | hiux*) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - h8300hms) - basic_machine=h8300-hitachi - os=-hms - ;; - h8300xray) - basic_machine=h8300-hitachi - os=-xray - ;; - h8500hms) - basic_machine=h8500-hitachi - os=-hms - ;; - harris) - basic_machine=m88k-harris - os=-sysv3 - ;; - hp300-*) - basic_machine=m68k-hp - ;; - hp300bsd) - basic_machine=m68k-hp - os=-bsd - ;; - hp300hpux) - basic_machine=m68k-hp - os=-hpux - ;; - hp3k9[0-9][0-9] | hp9[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k2[0-9][0-9] | hp9k31[0-9]) - basic_machine=m68000-hp - ;; - hp9k3[2-9][0-9]) - basic_machine=m68k-hp - ;; - hp9k6[0-9][0-9] | hp6[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k7[0-79][0-9] | hp7[0-79][0-9]) - basic_machine=hppa1.1-hp - ;; - hp9k78[0-9] | hp78[0-9]) - basic_machine=hppa2.0-hp - ;; - hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) - basic_machine=hppa2.0-hp - ;; - hp9k8[0-9][13679] | hp8[0-9][13679]) - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][0-9] | hp8[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hppa-next) - os=-nextstep3 - ;; - hppaosf) - basic_machine=hppa1.1-hp - os=-osf - ;; - hppro) - basic_machine=hppa1.1-hp - os=-proelf - ;; - i370-ibm* | ibm*) - basic_machine=i370-ibm - ;; -# I'm not sure what "Sysv32" means. Should this be sysv3.2? - i[34567]86v32) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv32 - ;; - i[34567]86v4*) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv4 - ;; - i[34567]86v) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv - ;; - i[34567]86sol2) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-solaris2 - ;; - i386mach) - basic_machine=i386-mach - os=-mach - ;; - i386-vsta | vsta) - basic_machine=i386-unknown - os=-vsta - ;; - i386-go32 | go32) - basic_machine=i386-unknown - os=-go32 - ;; - i386-mingw32 | mingw32) - basic_machine=i386-unknown - os=-mingw32 - ;; - iris | iris4d) - basic_machine=mips-sgi - case $os in - -irix*) - ;; - *) - os=-irix4 - ;; - esac - ;; - isi68 | isi) - basic_machine=m68k-isi - os=-sysv - ;; - macppc*) - basic_machine=powerpc-apple - ;; - m88k-omron*) - basic_machine=m88k-omron - ;; - magnum | m3230) - basic_machine=mips-mips - os=-sysv - ;; - merlin) - basic_machine=ns32k-utek - os=-sysv - ;; - miniframe) - basic_machine=m68000-convergent - ;; - *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) - basic_machine=m68k-atari - os=-mint - ;; - mipsel*-linux*) - basic_machine=mipsel-unknown - os=-linux-gnu - ;; - mips*-linux*) - basic_machine=mips-unknown - os=-linux-gnu - ;; - mips3*-*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` - ;; - mips3*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown - ;; - mmix*) - basic_machine=mmix-knuth - os=-mmixware - ;; - monitor) - basic_machine=m68k-rom68k - os=-coff - ;; - msdos) - basic_machine=i386-unknown - os=-msdos - ;; - mvs) - basic_machine=i370-ibm - os=-mvs - ;; - ncr3000) - basic_machine=i486-ncr - os=-sysv4 - ;; - netbsd386) - basic_machine=i386-unknown - os=-netbsd - ;; - netwinder) - basic_machine=armv4l-rebel - os=-linux - ;; - news | news700 | news800 | news900) - basic_machine=m68k-sony - os=-newsos - ;; - news1000) - basic_machine=m68030-sony - os=-newsos - ;; - news-3600 | risc-news) - basic_machine=mips-sony - os=-newsos - ;; - necv70) - basic_machine=v70-nec - os=-sysv - ;; - next | m*-next ) - basic_machine=m68k-next - case $os in - -nextstep* ) - ;; - -ns2*) - os=-nextstep2 - ;; - *) - os=-nextstep3 - ;; - esac - ;; - nh3000) - basic_machine=m68k-harris - os=-cxux - ;; - nh[45]000) - basic_machine=m88k-harris - os=-cxux - ;; - nindy960) - basic_machine=i960-intel - os=-nindy - ;; - mon960) - basic_machine=i960-intel - os=-mon960 - ;; - np1) - basic_machine=np1-gould - ;; - nsr-tandem) - basic_machine=nsr-tandem - ;; - op50n-* | op60c-*) - basic_machine=hppa1.1-oki - os=-proelf - ;; - OSE68000 | ose68000) - basic_machine=m68000-ericsson - os=-ose - ;; - os68k) - basic_machine=m68k-none - os=-os68k - ;; - pa-hitachi) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - paragon) - basic_machine=i860-intel - os=-osf - ;; - pbd) - basic_machine=sparc-tti - ;; - pbb) - basic_machine=m68k-tti - ;; - pc532 | pc532-*) - basic_machine=ns32k-pc532 - ;; - pentiummmx | p55) - basic_machine=pentiummmx-pc - ;; - pentium | p5 | i586) - basic_machine=pentium-pc - ;; - pentiumpro | p6) - basic_machine=pentiumpro-pc - ;; - pentiummmx-* | p55-*) - basic_machine=pentiummmx-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentium-* | p5-* | i586-*) - basic_machine=pentium-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentiumpro-* | p6-*) - basic_machine=pentiumpro-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - nexen) - # We don't have specific support for Nexgen yet, so just call it a Pentium - basic_machine=i586-nexgen - ;; - pn) - basic_machine=pn-gould - ;; - power) basic_machine=rs6000-ibm - ;; - ppc) basic_machine=powerpc-unknown - ;; - ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppc64) basic_machine=powerpc64-unknown - ;; - ppc64-*) - basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppcle | powerpclittle | ppc-le | powerpc-little) - basic_machine=powerpcle-unknown - ;; - ppcle-* | powerpclittle-*) - basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ps2) - basic_machine=i386-ibm - ;; - rom68k) - basic_machine=m68k-rom68k - os=-coff - ;; - rm[46]00) - basic_machine=mips-siemens - ;; - rtpc | rtpc-*) - basic_machine=romp-ibm - ;; - sa29200) - basic_machine=a29k-amd - os=-udi - ;; - sequent) - basic_machine=i386-sequent - ;; - sh) - basic_machine=sh-hitachi - os=-hms - ;; - sparclite-wrs) - basic_machine=sparclite-wrs - os=-vxworks - ;; - sps7) - basic_machine=m68k-bull - os=-sysv2 - ;; - spur) - basic_machine=spur-unknown - ;; - st2000) - basic_machine=m68k-tandem - ;; - stratus) - basic_machine=i860-stratus - os=-sysv4 - ;; - sun2) - basic_machine=m68000-sun - ;; - sun2os3) - basic_machine=m68000-sun - os=-sunos3 - ;; - sun2os4) - basic_machine=m68000-sun - os=-sunos4 - ;; - sun3os3) - basic_machine=m68k-sun - os=-sunos3 - ;; - sun3os4) - basic_machine=m68k-sun - os=-sunos4 - ;; - sun4os3) - basic_machine=sparc-sun - os=-sunos3 - ;; - sun4os4) - basic_machine=sparc-sun - os=-sunos4 - ;; - sun4sol2) - basic_machine=sparc-sun - os=-solaris2 - ;; - sun3 | sun3-*) - basic_machine=m68k-sun - ;; - sun4) - basic_machine=sparc-sun - ;; - sun386 | sun386i | roadrunner) - basic_machine=i386-sun - ;; - sv1) - basic_machine=sv1-cray - os=-unicos - ;; - symmetry) - basic_machine=i386-sequent - os=-dynix - ;; - t3e) - basic_machine=t3e-cray - os=-unicos - ;; - tx39) - basic_machine=mipstx39-unknown - ;; - tx39el) - basic_machine=mipstx39el-unknown - ;; - tower | tower-32) - basic_machine=m68k-ncr - ;; - udi29k) - basic_machine=a29k-amd - os=-udi - ;; - ultra3) - basic_machine=a29k-nyu - os=-sym1 - ;; - v810 | necv810) - basic_machine=v810-nec - os=-none - ;; - vaxv) - basic_machine=vax-dec - os=-sysv - ;; - vms) - basic_machine=vax-dec - os=-vms - ;; - vpp*|vx|vx-*) - basic_machine=f301-fujitsu - ;; - vxworks960) - basic_machine=i960-wrs - os=-vxworks - ;; - vxworks68) - basic_machine=m68k-wrs - os=-vxworks - ;; - vxworks29k) - basic_machine=a29k-wrs - os=-vxworks - ;; - w65*) - basic_machine=w65-wdc - os=-none - ;; - w89k-*) - basic_machine=hppa1.1-winbond - os=-proelf - ;; - xmp) - basic_machine=xmp-cray - os=-unicos - ;; - xps | xps100) - basic_machine=xps100-honeywell - ;; - z8k-*-coff) - basic_machine=z8k-unknown - os=-sim - ;; - none) - basic_machine=none-none - os=-none - ;; - -# Here we handle the default manufacturer of certain CPU types. It is in -# some cases the only manufacturer, in others, it is the most popular. - w89k) - basic_machine=hppa1.1-winbond - ;; - op50n) - basic_machine=hppa1.1-oki - ;; - op60c) - basic_machine=hppa1.1-oki - ;; - mips) - if [ x$os = x-linux-gnu ]; then - basic_machine=mips-unknown - else - basic_machine=mips-mips - fi - ;; - romp) - basic_machine=romp-ibm - ;; - rs6000) - basic_machine=rs6000-ibm - ;; - vax) - basic_machine=vax-dec - ;; - pdp11) - basic_machine=pdp11-dec - ;; - we32k) - basic_machine=we32k-att - ;; - sparc | sparcv9) - basic_machine=sparc-sun - ;; - cydra) - basic_machine=cydra-cydrome - ;; - orion) - basic_machine=orion-highlevel - ;; - orion105) - basic_machine=clipper-highlevel - ;; - mac | mpw | mac-mpw) - basic_machine=m68k-apple - ;; - pmac | pmac-mpw) - basic_machine=powerpc-apple - ;; - c4x*) - basic_machine=c4x-none - os=-coff - ;; - *) - echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 - exit 1 - ;; -esac - -# Here we canonicalize certain aliases for manufacturers. -case $basic_machine in - *-digital*) - basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` - ;; - *-commodore*) - basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` - ;; - *) - ;; -esac - -# Decode manufacturer-specific aliases for certain operating systems. - -if [ x"$os" != x"" ] -then -case $os in - # First match some system type aliases - # that might get confused with valid system types. - # -solaris* is a basic system type, with this one exception. - -solaris1 | -solaris1.*) - os=`echo $os | sed -e 's|solaris1|sunos4|'` - ;; - -solaris) - os=-solaris2 - ;; - -svr4*) - os=-sysv4 - ;; - -unixware*) - os=-sysv4.2uw - ;; - -gnu/linux*) - os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` - ;; - # First accept the basic system types. - # The portable systems comes first. - # Each alternative MUST END IN A *, to match a version number. - # -sysv* is not here because it comes later, after sysvr4. - -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ - | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ - | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ - | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ - | -aos* \ - | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ - | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ - | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \ - | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ - | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ - | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ - | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ - | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ - | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \ - | -openstep* | -oskit*) - # Remember, each alternative MUST END IN *, to match a version number. - ;; - -qnx*) - case $basic_machine in - x86-* | i[34567]86-*) - ;; - *) - os=-nto$os - ;; - esac - ;; - -nto*) - os=-nto-qnx - ;; - -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ - | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ - | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) - ;; - -mac*) - os=`echo $os | sed -e 's|mac|macos|'` - ;; - -linux*) - os=`echo $os | sed -e 's|linux|linux-gnu|'` - ;; - -sunos5*) - os=`echo $os | sed -e 's|sunos5|solaris2|'` - ;; - -sunos6*) - os=`echo $os | sed -e 's|sunos6|solaris3|'` - ;; - -opened*) - os=-openedition - ;; - -wince*) - os=-wince - ;; - -osfrose*) - os=-osfrose - ;; - -osf*) - os=-osf - ;; - -utek*) - os=-bsd - ;; - -dynix*) - os=-bsd - ;; - -acis*) - os=-aos - ;; - -386bsd) - os=-bsd - ;; - -ctix* | -uts*) - os=-sysv - ;; - -ns2 ) - os=-nextstep2 - ;; - -nsk) - os=-nsk - ;; - # Preserve the version number of sinix5. - -sinix5.*) - os=`echo $os | sed -e 's|sinix|sysv|'` - ;; - -sinix*) - os=-sysv4 - ;; - -triton*) - os=-sysv3 - ;; - -oss*) - os=-sysv3 - ;; - -svr4) - os=-sysv4 - ;; - -svr3) - os=-sysv3 - ;; - -sysvr4) - os=-sysv4 - ;; - # This must come after -sysvr4. - -sysv*) - ;; - -ose*) - os=-ose - ;; - -es1800*) - os=-ose - ;; - -xenix) - os=-xenix - ;; - -*mint | -*MiNT) - os=-mint - ;; - -none) - ;; - *) - # Get rid of the `-' at the beginning of $os. - os=`echo $os | sed 's/[^-]*-//'` - echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 - exit 1 - ;; -esac -else - -# Here we handle the default operating systems that come with various machines. -# The value should be what the vendor currently ships out the door with their -# machine or put another way, the most popular os provided with the machine. - -# Note that if you're going to try to match "-MANUFACTURER" here (say, -# "-sun"), then you have to tell the case statement up towards the top -# that MANUFACTURER isn't an operating system. Otherwise, code above -# will signal an error saying that MANUFACTURER isn't an operating -# system, and we'll never get to this point. - -case $basic_machine in - *-acorn) - os=-riscix1.2 - ;; - arm*-rebel) - os=-linux - ;; - arm*-semi) - os=-aout - ;; - pdp11-*) - os=-none - ;; - *-dec | vax-*) - os=-ultrix4.2 - ;; - m68*-apollo) - os=-domain - ;; - i386-sun) - os=-sunos4.0.2 - ;; - m68000-sun) - os=-sunos3 - # This also exists in the configure program, but was not the - # default. - # os=-sunos4 - ;; - m68*-cisco) - os=-aout - ;; - mips*-cisco) - os=-elf - ;; - mips*-*) - os=-elf - ;; - *-tti) # must be before sparc entry or we get the wrong os. - os=-sysv3 - ;; - sparc-* | *-sun) - os=-sunos4.1.1 - ;; - *-be) - os=-beos - ;; - *-ibm) - os=-aix - ;; - *-wec) - os=-proelf - ;; - *-winbond) - os=-proelf - ;; - *-oki) - os=-proelf - ;; - *-hp) - os=-hpux - ;; - *-hitachi) - os=-hiux - ;; - i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) - os=-sysv - ;; - *-cbm) - os=-amigaos - ;; - *-dg) - os=-dgux - ;; - *-dolphin) - os=-sysv3 - ;; - m68k-ccur) - os=-rtu - ;; - m88k-omron*) - os=-luna - ;; - *-next ) - os=-nextstep - ;; - *-sequent) - os=-ptx - ;; - *-crds) - os=-unos - ;; - *-ns) - os=-genix - ;; - i370-*) - os=-mvs - ;; - *-next) - os=-nextstep3 - ;; - *-gould) - os=-sysv - ;; - *-highlevel) - os=-bsd - ;; - *-encore) - os=-bsd - ;; - *-sgi) - os=-irix - ;; - *-siemens) - os=-sysv4 - ;; - *-masscomp) - os=-rtu - ;; - f301-fujitsu) - os=-uxpv - ;; - *-rom68k) - os=-coff - ;; - *-*bug) - os=-coff - ;; - *-apple) - os=-macos - ;; - *-atari*) - os=-mint - ;; - *) - os=-none - ;; -esac -fi - -# Here we handle the case where we know the os, and the CPU type, but not the -# manufacturer. We pick the logical manufacturer. -vendor=unknown -case $basic_machine in - *-unknown) - case $os in - -riscix*) - vendor=acorn - ;; - -sunos*) - vendor=sun - ;; - -aix*) - vendor=ibm - ;; - -beos*) - vendor=be - ;; - -hpux*) - vendor=hp - ;; - -mpeix*) - vendor=hp - ;; - -hiux*) - vendor=hitachi - ;; - -unos*) - vendor=crds - ;; - -dgux*) - vendor=dg - ;; - -luna*) - vendor=omron - ;; - -genix*) - vendor=ns - ;; - -mvs* | -opened*) - vendor=ibm - ;; - -ptx*) - vendor=sequent - ;; - -vxsim* | -vxworks*) - vendor=wrs - ;; - -aux*) - vendor=apple - ;; - -hms*) - vendor=hitachi - ;; - -mpw* | -macos*) - vendor=apple - ;; - -*mint | -*MiNT) - vendor=atari - ;; - esac - basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` - ;; -esac - -echo $basic_machine$os diff --git a/rts/gmp/configure b/rts/gmp/configure deleted file mode 100644 index 8294680..0000000 --- a/rts/gmp/configure +++ /dev/null @@ -1,5216 +0,0 @@ -#! /bin/sh -# From configure.in Revision: 1.129.2.2 -# Guess values for system-dependent variables and create Makefiles. -# Generated automatically using Autoconf version 2.14a. -# Copyright (C) 1992, 93, 94, 95, 96, 98, 99, 2000 -# Free Software Foundation, Inc. -# -# This configure script is free software; the Free Software Foundation -# gives unlimited permission to copy, distribute and modify it. - -# Defaults: -ac_default_prefix=/usr/local -# Any additions from configure.in: - -# Initialize some variables set by options. -ac_init_help=false -ac_init_version=false -# The variables have the same names as the options, with -# dashes changed to underlines. -build=NONE -cache_file=./config.cache -exec_prefix=NONE -host=NONE -no_create= -nonopt=NONE -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -target=NONE -verbose= -x_includes=NONE -x_libraries=NONE -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datadir='${prefix}/share' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -libdir='${exec_prefix}/lib' -includedir='${prefix}/include' -oldincludedir='/usr/include' -infodir='${prefix}/info' -mandir='${prefix}/man' - -# Initialize some other variables. -subdirs= -MFLAGS= MAKEFLAGS= -SHELL=${CONFIG_SHELL-/bin/sh} -# Maximum number of lines to put in a shell here document. -: ${ac_max_here_lines=48} -# Sed expression to map a string onto a valid sh and CPP variable names. -ac_tr_sh='sed -e y%*+%pp%;s%[^a-zA-Z0-9_]%_%g' -ac_tr_cpp='sed -e y%*abcdefghijklmnopqrstuvwxyz%PABCDEFGHIJKLMNOPQRSTUVWXYZ%;s%[^A-Z0-9_]%_%g' - -ac_prev= -for ac_option -do - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval "$ac_prev=\$ac_option" - ac_prev= - continue - fi - - ac_optarg=`echo "$ac_option" | sed -n 's/^[^=]*=//p'` - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case "$ac_option" in - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; - -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir="$ac_optarg" ;; - - -build | --build | --buil | --bui | --bu) - ac_prev=build ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build="$ac_optarg" ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file="$ac_optarg" ;; - - -datadir | --datadir | --datadi | --datad | --data | --dat | --da) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ - | --da=*) - datadir="$ac_optarg" ;; - - -disable-* | --disable-*) - ac_feature=`echo "$ac_option"|sed -e 's/-*disable-//'` - # Reject names that are not valid shell variable names. - if echo "$ac_feature" | grep '[^-a-zA-Z0-9_]' >/dev/null 2>&1; then - { echo "configure: error: invalid feature: $ac_feature" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - eval "enable_${ac_feature}=no" ;; - - -enable-* | --enable-*) - ac_feature=`echo "$ac_option"|sed -e 's/-*enable-//' -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if echo "$ac_feature" | grep '[^-a-zA-Z0-9_]' >/dev/null 2>&1; then - { echo "configure: error: invalid feature: $ac_feature" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - case "$ac_option" in - *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; - *) ac_optarg=yes ;; - esac - eval "enable_${ac_feature}='$ac_optarg'" ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix="$ac_optarg" ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he | -h) - ac_init_help=: ;; - -host | --host | --hos | --ho) - ac_prev=host ;; - -host=* | --host=* | --hos=* | --ho=*) - host="$ac_optarg" ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir="$ac_optarg" ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir="$ac_optarg" ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir="$ac_optarg" ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir="$ac_optarg" ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst \ - | --locals | --local | --loca | --loc | --lo) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* \ - | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) - localstatedir="$ac_optarg" ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir="$ac_optarg" ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir="$ac_optarg" ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix="$ac_optarg" ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix="$ac_optarg" ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix="$ac_optarg" ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name="$ac_optarg" ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir="$ac_optarg" ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir="$ac_optarg" ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site="$ac_optarg" ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir="$ac_optarg" ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir="$ac_optarg" ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target="$ac_optarg" ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers | -V) - ac_init_version=: ;; - - -with-* | --with-*) - ac_package=`echo "$ac_option"|sed -e 's/-*with-//' -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if echo "$ac_package" | grep '[^-a-zA-Z0-9_]' >/dev/null 2>&1; then - { echo "configure: error: invalid package: $ac_package" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - case "$ac_option" in - *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; - *) ac_optarg=yes ;; - esac - eval "with_${ac_package}='$ac_optarg'" ;; - - -without-* | --without-*) - ac_package=`echo "$ac_option"|sed -e 's/-*without-//'` - # Reject names that are not valid shell variable names. - if echo "$ac_package" | grep '[^-a-zA-Z0-9_]' >/dev/null 2>&1; then - { echo "configure: error: invalid package: $ac_package" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - eval "with_${ac_package}=no" ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes="$ac_optarg" ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries="$ac_optarg" ;; - - -*) { echo "configure: error: unrecognized option: $ac_option -Try \`configure --help' for more information." 1>&2; exit 1; } - ;; - - *=*) - ac_envvar=`echo "$ac_option" | sed -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if echo "$ac_envvar" | grep '[^a-zA-Z0-9_]' >/dev/null 2>&1; then - { echo "configure: error: invalid variable name: $ac_envvar" 1>&2; exit 1; } - fi - ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` - eval "$ac_envvar='$ac_optarg'" - export $ac_envvar ;; - - *) - if echo "$ac_option" | grep '[^-a-zA-Z0-9.]' >/dev/null 2>&1; then - echo "configure: warning: invalid host type: $ac_option" 1>&2 - fi - if test "x$nonopt" != xNONE; then - { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } - fi - nonopt="$ac_option" - ;; - - esac -done - -if test -n "$ac_prev"; then - { echo "configure: error: missing argument to --\`echo $ac_prev | sed 's/_/-/g'\`" 1>&2; exit 1; } -fi -if $ac_init_help; then - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat <<\EOF -`configure' configures software source code packages to adapt to many kinds -of systems. - -Usage: configure [OPTION]... [VAR=VALUE]... [HOST] - -To safely assign special values to environment variables (e.g., CC, -CFLAGS...), give to `configure' the definition as VAR=VALUE. - -Defaults for the options are specified in brackets. - -Configuration: - -h, --help print this message - -V, --version print the version of autoconf that created configure - -q, --quiet, --silent do not print `checking...' messages - --cache-file=FILE cache test results in FILE - -n, --no-create do not create output files - -EOF - - cat <\?\"\']*) - ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` - ac_configure_args="$ac_configure_args '$ac_arg'" ;; - *) ac_configure_args="$ac_configure_args $ac_arg" ;; - esac -done - -# File descriptor usage: -# 0 standard input -# 1 file creation -# 2 errors and warnings -# 3 some systems may open it to /dev/tty -# 4 used on the Kubota Titan -# 6 checking for... messages and results -# 5 compiler messages saved in config.log -if test "$silent" = yes; then - exec 6>/dev/null -else - exec 6>&1 -fi -exec 5>./config.log - -echo "\ -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. - -It was created by configure version 2.14a, executed with - > $0 $ac_configure_args -" 1>&5 - -# NLS nuisances. -# Only set these to C if already set. These must not be set unconditionally -# because not all systems understand e.g. LANG=C (notably SCO). -# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! -# Non-C LC_CTYPE values break the ctype check. -if test "${LANG+set}" = set; then LANG=C; export LANG; fi -if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi -if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi -if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -rf conftest* confdefs.h -# AIX cpp loses on an empty file, so make sure it contains at least a newline. -echo >confdefs.h - -# A filename unique to this package, relative to the directory that -# configure is in, which we can look for to find out if srcdir is correct. -ac_unique_file= - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then its parent. - ac_prog=$0 - ac_confdir=`echo "$ac_prog" | sed 's%/[^/][^/]*$%%'` - test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. - srcdir=$ac_confdir - if test ! -r $srcdir/$ac_unique_file; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r $srcdir/$ac_unique_file; then - if test "$ac_srcdir_defaulted" = yes; then - { echo "configure: error: cannot find sources in $ac_confdir or .." 1>&2; exit 1; } - else - { echo "configure: error: cannot find sources in $srcdir" 1>&2; exit 1; } - fi -fi -srcdir=`echo "$srcdir" | sed 's%\([^/]\)/*$%\1%'` - -# Prefer explicitly selected file to automatically selected ones. -if test -z "$CONFIG_SITE"; then - if test "x$prefix" != xNONE; then - CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" - else - CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" - fi -fi -for ac_site_file in $CONFIG_SITE; do - if test -r "$ac_site_file"; then - echo "loading site script $ac_site_file" - . "$ac_site_file" - fi -done - -if test -r "$cache_file"; then - echo "loading cache $cache_file" - test -f "$cache_file" && . $cache_file -else - echo "creating cache $cache_file" - >$cache_file -fi - -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -ac_exeext= -ac_objext=o -# Factoring default headers for most tests. -ac_includes_default="\ -#include -#include -#if STDC_HEADERS -# include -# include -#else -# if HAVE_STDLIB_H -# include -# endif -#endif -#if HAVE_STRING_H -# if !STDC_HEADERS && HAVE_MEMORY_H -# include -# endif -# include -#else -# if HAVE_STRINGS_H -# include -# endif -#endif -#if HAVE_INTTYPES_H -# include -#endif -#if HAVE_UNISTD_H -# include -#endif" - -if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then - # Stardent Vistra SVR4 grep lacks -e, says Kaveh R. Ghazi. - if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then - ECHO_N= ECHO_C=' -' ECHO_T=' ' - else - ECHO_N=-n ECHO_C= ECHO_T= - fi -else - ECHO_N= ECHO_C='\c' ECHO_T= -fi - -ac_aux_dir= -for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do - if test -f $ac_dir/install-sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f $ac_dir/install.sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - elif test -f $ac_dir/shtool; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/shtool install -c" - break - fi -done -if test -z "$ac_aux_dir"; then - { echo "configure: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } -fi -ac_config_guess="$SHELL $ac_aux_dir/config.guess" -ac_config_sub="$SHELL $ac_aux_dir/config.sub" -ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. - -echo $ECHO_N "checking host system type... $ECHO_C" 1>&6 -echo "configure:636: checking host system type" 1>&5 -if test "x$ac_cv_host" = "x" || (test "x$host" != "xNONE" && test "x$host" != "x$ac_cv_host_alias"); then - - # Make sure we can run config.sub. - if $ac_config_sub sun4 >/dev/null 2>&1; then :; else - { echo "configure: error: cannot run $ac_config_sub" 1>&2; exit 1; } - fi - - ac_cv_host_alias=$host - case "$ac_cv_host_alias" in - NONE) - case $nonopt in - NONE) - if ac_cv_host_alias=`$ac_config_guess`; then : - else { echo "configure: error: cannot guess host type; you must specify one" 1>&2; exit 1; } - fi ;; *) ac_cv_host_alias=$nonopt ;; - esac ;; - esac - - ac_cv_host=`$ac_config_sub $ac_cv_host_alias` || exit 1 - ac_cv_host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` - ac_cv_host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` - ac_cv_host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` -else - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -fi - -echo "$ECHO_T""$ac_cv_host" 1>&6 - -host=$ac_cv_host -host_alias=$ac_cv_host_alias -host_cpu=$ac_cv_host_cpu -host_vendor=$ac_cv_host_vendor -host_os=$ac_cv_host_os - -echo $ECHO_N "checking target system type... $ECHO_C" 1>&6 -echo "configure:672: checking target system type" 1>&5 -if test "x$ac_cv_target" = "x" || (test "x$target" != "xNONE" && test "x$target" != "x$ac_cv_target_alias"); then - - # Make sure we can run config.sub. - if $ac_config_sub sun4 >/dev/null 2>&1; then :; else - { echo "configure: error: cannot run $ac_config_sub" 1>&2; exit 1; } - fi - - ac_cv_target_alias=$target - case "$ac_cv_target_alias" in - NONE) - case $nonopt in - NONE) - ac_cv_target_alias=$host_alias ;; - *) ac_cv_target_alias=$nonopt ;; - esac ;; - esac - - ac_cv_target=`$ac_config_sub $ac_cv_target_alias` || exit 1 - ac_cv_target_cpu=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` - ac_cv_target_vendor=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` - ac_cv_target_os=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` -else - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -fi - -echo "$ECHO_T""$ac_cv_target" 1>&6 - -target=$ac_cv_target -target_alias=$ac_cv_target_alias -target_cpu=$ac_cv_target_cpu -target_vendor=$ac_cv_target_vendor -target_os=$ac_cv_target_os - -echo $ECHO_N "checking build system type... $ECHO_C" 1>&6 -echo "configure:707: checking build system type" 1>&5 -if test "x$ac_cv_build" = "x" || (test "x$build" != "xNONE" && test "x$build" != "x$ac_cv_build_alias"); then - - # Make sure we can run config.sub. - if $ac_config_sub sun4 >/dev/null 2>&1; then :; else - { echo "configure: error: cannot run $ac_config_sub" 1>&2; exit 1; } - fi - - ac_cv_build_alias=$build - case "$ac_cv_build_alias" in - NONE) - case $nonopt in - NONE) - ac_cv_build_alias=$host_alias ;; - *) ac_cv_build_alias=$nonopt ;; - esac ;; - esac - - ac_cv_build=`$ac_config_sub $ac_cv_build_alias` || exit 1 - ac_cv_build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` - ac_cv_build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` - ac_cv_build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` -else - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -fi - -echo "$ECHO_T""$ac_cv_build" 1>&6 - -build=$ac_cv_build -build_alias=$ac_cv_build_alias -build_cpu=$ac_cv_build_cpu -build_vendor=$ac_cv_build_vendor -build_os=$ac_cv_build_os - -# Do some error checking and defaulting for the host and target type. -# The inputs are: -# configure --host=HOST --target=TARGET --build=BUILD NONOPT -# -# The rules are: -# 1. You are not allowed to specify --host, --target, and nonopt at the -# same time. -# 2. Host defaults to nonopt. -# 3. If nonopt is not specified, then host defaults to the current host, -# as determined by config.guess. -# 4. Target and build default to nonopt. -# 5. If nonopt is not specified, then target and build default to host. - -# The aliases save the names the user supplied, while $host etc. -# will get canonicalized. -case $host---$target---$nonopt in -NONE---*---* | *---NONE---* | *---*---NONE) ;; -*) { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } ;; -esac - -test "$host_alias" != "$target_alias" && - test "$program_prefix$program_suffix$program_transform_name" = \ - NONENONEs,x,x, && - program_prefix=${target_alias}- - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# ./install, which can be erroneously created by make from ./install.sh. -echo $ECHO_N "checking for a BSD compatible install... $ECHO_C" 1>&6 -echo "configure:778: checking for a BSD compatible install" 1>&5 -if test -z "$INSTALL"; then -if test "${ac_cv_path_install+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" - for ac_dir in $PATH; do - # Account for people who put trailing slashes in PATH elements. - case "$ac_dir/" in - /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - if test -f $ac_dir/$ac_prog; then - if test $ac_prog = install && - grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - elif test $ac_prog = install && - grep pwplus $ac_dir/$ac_prog >/dev/null 2>&1; then - # program-specific install script used by HP pwplus--don't use. - : - else - ac_cv_path_install="$ac_dir/$ac_prog -c" - break 2 - fi - fi - done - ;; - esac - done - IFS="$ac_save_IFS" - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL="$ac_cv_path_install" - else - # As a last resort, use the slow shell script. We don't cache a - # path for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the path is relative. - INSTALL="$ac_install_sh" - fi -fi -echo "$ECHO_T""$INSTALL" 1>&6 - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - -echo $ECHO_N "checking whether build environment is sane... $ECHO_C" 1>&6 -echo "configure:835: checking whether build environment is sane" 1>&5 -# Just in case -sleep 1 -echo timestamp > conftestfile -# Do `set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null` - if test "$*" = "X"; then - # -L didn't work. - set X `ls -t $srcdir/configure conftestfile` - fi - if test "$*" != "X $srcdir/configure conftestfile" \ - && test "$*" != "X conftestfile $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - { echo "configure: error: ls -t appears to fail. Make sure there is not a broken -alias in your environment" 1>&2; exit 1; } - fi - - test "$2" = conftestfile - ) -then - # Ok. - : -else - { echo "configure: error: newly created file is older than distributed files! -Check your system clock" 1>&2; exit 1; } -fi -rm -f conftest* -echo "$ECHO_T""yes" 1>&6 -if test "$program_transform_name" = s,x,x,; then - program_transform_name= -else - # Double any \ or $. echo might interpret backslashes. - cat <<\EOF >conftestsed -s,\\,\\\\,g; s,\$,$$,g -EOF - program_transform_name=`echo $program_transform_name | sed -f conftestsed` - rm -f conftestsed -fi -test "$program_prefix" != NONE && - program_transform_name="s,^,${program_prefix},;$program_transform_name" -# Use a double $ so make ignores it. -test "$program_suffix" != NONE && - program_transform_name="s,\$\$,${program_suffix},;$program_transform_name" - -# sed with no file args requires a program. -test "$program_transform_name" = "" && program_transform_name="s,x,x," - -test x"${MISSING+set}" = xset || \ - MISSING="\${SHELL} `CDPATH=: && cd $ac_aux_dir && pwd`/missing" -if eval "$MISSING --run :"; then - am_missing_run="$MISSING --run " -else - am_missing_run= - am_backtick='`' - echo "configure: warning: ${am_backtick}missing' script is too old or missing" 1>&2 -fi - -for ac_prog in mawk gawk nawk awk -do -# Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -echo $ECHO_N "checking for $ac_word... $ECHO_C" 1>&6 -echo "configure:906: checking for $ac_word" 1>&5 -if test "${ac_cv_prog_AWK+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - if test -n "$AWK"; then - ac_cv_prog_AWK="$AWK" # Let the user override the test. -else - for ac_path in `IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" -ac_dummy="$PATH" -for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - echo "$ac_dir/$ac_word" - fi -done -IFS="$ac_save_ifs" -`; do - ac_cv_prog_AWK="$ac_prog" - break - done -fi -fi -AWK="$ac_cv_prog_AWK" -if test -n "$AWK"; then - echo "$ECHO_T""$AWK" 1>&6 -else - echo "$ECHO_T""no" 1>&6 -fi - -test -n "$AWK" && break -done - -echo $ECHO_N "checking whether ${MAKE-make} sets \${MAKE}... $ECHO_C" 1>&6 -echo "configure:939: checking whether ${MAKE-make} sets \${MAKE}" 1>&5 -set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` -if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - cat >conftestmake <<\EOF -all: - @echo 'ac_maketemp="${MAKE}"' -EOF -# GNU make sometimes prints "make[1]: Entering...", which would confuse us. -eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=` -if test -n "$ac_maketemp"; then - eval ac_cv_prog_make_${ac_make}_set=yes -else - eval ac_cv_prog_make_${ac_make}_set=no -fi -rm -f conftestmake -fi -if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then - echo "$ECHO_T""yes" 1>&6 - SET_MAKE= -else - echo "$ECHO_T""no" 1>&6 - SET_MAKE="MAKE=${MAKE-make}" -fi - -# Check whether --enable-dependency-tracking or --disable-dependency-tracking was given. -if test "${enable_dependency_tracking+set}" = set; then - enableval="$enable_dependency_tracking" - -fi -if test "x$enable_dependency_tracking" = xno; then - AMDEP="#" -else - am_depcomp="$ac_aux_dir/depcomp" - if test ! -f "$am_depcomp"; then - AMDEP="#" - else - AMDEP= - fi -fi - -if test -z "$AMDEP"; then - AMDEPBACKSLASH='\' -else - AMDEPBACKSLASH= -fi - -if test -d .deps || mkdir .deps 2> /dev/null || test -d .deps; then - DEPDIR=.deps -else - DEPDIR=_deps -fi - -PACKAGE=gmp - -VERSION=3.1.1 - -if test "`CDPATH=: && cd $srcdir && pwd`" != "`pwd`" && - test -f $srcdir/config.status; then - { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; } -fi -cat >>confdefs.h <>confdefs.h <&6 -echo "configure:1029: checking whether to enable maintainer-specific portions of Makefiles" 1>&5 - # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. -if test "${enable_maintainer_mode+set}" = set; then - enableval="$enable_maintainer_mode" - USE_MAINTAINER_MODE=$enableval -else - USE_MAINTAINER_MODE=no -fi - echo "$ECHO_T""$USE_MAINTAINER_MODE" 1>&6 - -if test $USE_MAINTAINER_MODE = yes; then - MAINTAINER_MODE_TRUE= - MAINTAINER_MODE_FALSE='#' -else - MAINTAINER_MODE_TRUE='#' - MAINTAINER_MODE_FALSE= -fi - MAINT=$MAINTAINER_MODE_TRUE - -gmp_configm4="config.m4" -gmp_tmpconfigm4=cnfm4.tmp -gmp_tmpconfigm4i=cnfm4i.tmp -gmp_tmpconfigm4p=cnfm4p.tmp -test -f $gmp_tmpconfigm4 && rm $gmp_tmpconfigm4 -test -f $gmp_tmpconfigm4i && rm $gmp_tmpconfigm4i -test -f $gmp_tmpconfigm4p && rm $gmp_tmpconfigm4p - -# Check whether --enable-assert or --disable-assert was given. -if test "${enable_assert+set}" = set; then - enableval="$enable_assert" - case "${enableval}" in -yes|no) ;; -*) { echo "configure: error: bad value ${enableval} for --enable-assert, need yes or no" 1>&2; exit 1; } ;; -esac -else - enable_assert=no -fi - -if test "$enable_assert" = "yes"; then - cat >>confdefs.h <<\EOF -#define WANT_ASSERT 1 -EOF - -fi - -# Check whether --enable-alloca or --disable-alloca was given. -if test "${enable_alloca+set}" = set; then - enableval="$enable_alloca" - case "${enableval}" in -yes|no) ;; -*) { echo "configure: error: bad value ${enableval} for --enable-alloca, need yes or no" 1>&2; exit 1; } ;; -esac -else - enable_alloca=yes -fi - -if test "$enable_alloca" = "no"; then - cat >>confdefs.h <<\EOF -#define USE_STACK_ALLOC 1 -EOF - -fi - -# Check whether --enable-fft or --disable-fft was given. -if test "${enable_fft+set}" = set; then - enableval="$enable_fft" - case "${enableval}" in -yes|no) ;; -*) { echo "configure: error: bad value ${enableval} for --enable-fft, need yes or no" 1>&2; exit 1; } ;; -esac -else - enable_fft=no -fi - -if test "$enable_fft" = "yes"; then - cat >>confdefs.h <<\EOF -#define WANT_FFT 1 -EOF - -fi - -# Check whether --enable-mpbsd or --disable-mpbsd was given. -if test "${enable_mpbsd+set}" = set; then - enableval="$enable_mpbsd" - case "${enableval}" in -yes|no) ;; -*) { echo "configure: error: bad value ${enableval} for --enable-mpbsd, need yes or no" 1>&2; exit 1; } ;; -esac -else - enable_mpbsd=no -fi - -if test "$enable_mpbsd" = "yes"; then - WANT_MPBSD_TRUE= - WANT_MPBSD_FALSE='#' -else - WANT_MPBSD_TRUE='#' - WANT_MPBSD_FALSE= -fi - -# Check whether --enable-mpfr or --disable-mpfr was given. -if test "${enable_mpfr+set}" = set; then - enableval="$enable_mpfr" - case "${enableval}" in -yes|no) ;; -*) { echo "configure: error: bad value ${enableval} for --enable-mpfr, need yes or no" 1>&2; exit 1; } ;; -esac -else - enable_mpfr=no -fi - -if test "$enable_mpfr" = "yes"; then - WANT_MPFR_TRUE= - WANT_MPFR_FALSE='#' -else - WANT_MPFR_TRUE='#' - WANT_MPFR_FALSE= -fi - -os_64bit="no" -cclist="gcc cc" # FIXME: Prefer c89 to cc. -gmp_cflags_gcc="-g -O2" -gmp_cflags64_gcc="-g -O2" -gmp_cflags_cc="-g" -gmp_cflags64_cc="-g" - -case "$target" in - # Alpha - alpha*-cray-unicos*) - # Don't perform any assembly syntax tests on this beast. - gmp_no_asm_syntax_testing=yes - cclist=cc - gmp_cflags_cc="$gmp_cflags_cc -O" - ;; - alpha*-*-osf*) - flavour=`echo $target_cpu | sed 's/^alpha//g'` - if test -n "$flavour"; then - case $flavour in # compilers don't seem to understand `ev67' and such. - ev6? | ev7*) flavour=ev6;; - esac - gmp_optcflags_gcc="-mcpu=$flavour" - # FIXME: We shouldn't fail fatally if none of these work, but that's - # how xoptcflags work and we don't have any other mechanism right now. - # Why do we need this here and not for alpha*-*-* below? - gmp_xoptcflags_gcc="-Wa,-arch,${flavour} -Wa,-m${flavour}" - gmp_optcflags_cc="-arch $flavour -tune $flavour" - fi - ;; - alpha*-*-*) - cclist="gcc" - flavour=`echo $target_cpu | sed 's/^alpha//g'` - if test -n "$flavour"; then - case $flavour in - ev6? | ev7*) flavour=ev6;; - esac - gmp_optcflags_gcc="-mcpu=$flavour" - fi - ;; - # Cray vector machines. This must come after alpha* so that we can - # recognize present and future vector processors with a wildcard. - *-cray-unicos*) - # Don't perform any assembly syntax tests on this beast. - gmp_no_asm_syntax_testing=yes - cclist=cc - # Don't inherit default gmp_cflags_cc value; it comes with -g which - # disables all optimization on Cray vector systems - gmp_cflags_cc="-O" - ;; - - # AMD and Intel x86 configurations - i?86*-*-* | k[5-8]*-*-* | pentium*-*-* | athlon-*-*) - # Rumour has it -O2 used to give worse register allocation than just -O. - gmp_cflags_gcc="-g -O -fomit-frame-pointer" - - case "${target}" in - i386*-*-*) gmp_optcflags_gcc="-mcpu=i386 -march=i386";; - i486*-*-*) gmp_optcflags_gcc="-mcpu=i486 -march=i486";; - i586*-*-* | pentium-*-* | pentiummmx-*-*) - gmp_optcflags_gcc="-mcpu=pentium -march=pentium";; - - # -march=pentiumpro not used because mpz/powm.c (swox cvs rev 1.4) - # tickles a bug in gcc 2.95.2 (believed fixed in 2.96). - i686*-*-* | pentiumpro-*-* | pentium[23]-*-*) - gmp_optcflags_gcc="-mcpu=pentiumpro";; - - k6*-*-*) gmp_optcflags_gcc="-mcpu=k6 -march=k6";; - - # Athlon instruction costs are close to p6: 3 cycle load latency, 4-6 - # cycle mul, 40 cycle div, pairable adc, ... - # FIXME: Change this when gcc gets something specific for Athlon. - # -march=pentiumpro not used, per i686 above. - athlon-*-*) gmp_optcflags_gcc="-mcpu=pentiumpro";; - esac - ;; - - # Sparc - ultrasparc*-*-solaris2.[7-9] | sparcv9-*-solaris2.[7-9]) - os_64bit=yes - gmp_cflags_gcc="$gmp_cflags_gcc -Wa,-xarch=v8plus" - gmp_xoptcflags_gcc="-mcpu=v9 -mcpu=v8 -mv8" - gmp_cflags64_gcc="$gmp_cflags64_gcc -m64 -mptr64 -Wa,-xarch=v9 -mcpu=v9" - gmp_cflags_cc="-xtarget=native -xarch=v8 -xO4" - gmp_cflags64_cc="-xtarget=native -xarch=v9 -xO4" - ;; - sparc64-*-linux*) - # Need to think more about the options passed here. This isn't good for - # some sparc64 linux distros, since we end up not optimizing when all the - # options below fail. - os_64bit=yes - gmp_cflags64_gcc="$gmp_cflags64_gcc -m64 -mptr64 -Wa,-xarch=v9 -mcpu=v9" - gmp_cflags_gcc="$gmp_cflags_gcc -m32" - gmp_xoptflags_gcc="-mcpu=ultrasparc -mvis" - ;; - ultrasparc*-*-* | sparcv9-*-*) - gmp_cflags_gcc="$gmp_cflags_gcc -Wa,-xarch=v8plus" - gmp_xoptcflags_gcc="-mcpu=v9 -mcpu=v8 -mv8" - gmp_cflags_cc="-xtarget=native -xarch=v8 -xO4" - ;; - sparcv8*-*-solaris2.* | microsparc*-*-solaris2.*) - gmp_cflags_gcc="$gmp_cflags_gcc" - gmp_xoptcflags_gcc="-mcpu=v8 -mv8" - gmp_cflags_cc="-xtarget=native -xarch=v8 -xO4" - ;; - sparcv8*-*-* | microsparc*-*-*) # SunOS, Linux, *BSD - cclist="gcc acc cc" - gmp_cflags_gcc="$gmp_cflags_gcc" - gmp_xoptcflags_gcc="-mcpu=v8 -mv8" - gmp_cflags_acc="-g -O2 -cg92" - gmp_cflags_cc="-O2" # FIXME: Flag for v8? - ;; - supersparc*-*-solaris2.*) - gmp_cflags_gcc="$gmp_cflags_gcc -DSUPERSPARC" - gmp_xoptcflags_gcc="-mcpu=v8 -mv8" - gmp_cflags_cc="-xtarget=native -xarch=v8 -xO4 -DSUPERSPARC" - ;; - supersparc*-*-*) # SunOS, Linux, *BSD - cclist="gcc acc cc" - gmp_cflags_gcc="$gmp_cflags_gcc -DSUPERSPARC" - gmp_xoptcflags_gcc="-mcpu=v8 -mv8" - gmp_cflags_acc="-g -O2 -cg92 -DSUPERSPARC" - gmp_cflags_cc="-O2 -DSUPERSPARC" # FIXME: Flag for v8? - ;; - *sparc*-*-*) - cclist="gcc acc cc" - gmp_cflags_acc="-g -O2" - gmp_cflags_cc="-g -O2" - ;; - - # POWER/PowerPC - powerpc64-*-aix*) - cclist="gcc xlc" - gmp_cflags_gcc="$gmp_cflags_gcc -maix64 -mpowerpc64" - gmp_cflags_xlc="-g -O2 -q64 -qtune=pwr3" - ;; - powerpc*-*-aix*) - cclist="gcc xlc" - gmp_cflags_gcc="$gmp_cflags_gcc -mpowerpc" - gmp_cflags_xlc="$gmp_cflags_cc -qarch=ppc -O2" - ;; - power-*-aix*) - cclist="gcc xlc" - gmp_cflags_gcc="$gmp_cflags_gcc -mpower" - gmp_cflags_xlc="$gmp_cflags_cc -qarch=pwr -O2" - ;; - powerpc64*-*-*) - gmp_cflags_gcc="$gmp_cflags_gcc -mpowerpc64" - cat >>confdefs.h <<\EOF -#define _LONG_LONG_LIMB 1 -EOF - ;; - powerpc-apple-darwin* | powerpc-apple-macosx*) - gmp_cflags_gcc="$gmp_cflags_gcc -mpowerpc -traditional-cpp" - ;; - powerpc*-*-*) - gmp_cflags_gcc="$gmp_cflags_gcc -mpowerpc" - ;; - - # MIPS - mips-sgi-irix6.*) - os_64bit=yes - gmp_cflags64_gcc="-g -O2 -mabi=n32" - gmp_cflags64_cc="$gmp_cflags64_cc -O2 -n32" - ;; - - # Motorola 68k family - m88110*-*-*) - gmp_cflags_gcc="-g -O -m88110" ;; - m68*-*-*) - gmp_cflags_gcc="$gmp_cflags_gcc -fomit-frame-pointer" - ;; - - # HP - hppa1.0*-*-*) - cclist="gcc c89 cc" - gmp_cflags_c89="$gmp_cflags_cc +O2" - gmp_cflags_cc="$gmp_cflags_cc +O2" - ;; - hppa2.0w*-*-*) - cclist="c89 cc" - gmp_cflags_c89="+DD64 +O3" - gmp_cflags_cc="+DD64 +O3" - ;; - hppa2.0*-*-*) - os_64bit=yes - cclist="gcc c89 cc" - gmp_cflags64_gcc="$gmp_cflags64_gcc -mWHAT -D_LONG_LONG_LIMB" - # +O2 to cc triggers bug in mpz/powm.c (1.4) - gmp_cflags64_c89="+DA2.0 +e +O3 -D_LONG_LONG_LIMB" - gmp_cflags64_cc="+DA2.0 +e +O3 -D_LONG_LONG_LIMB" - gmp_cflags_c89="$gmp_cflags_cc +O2" - gmp_cflags_cc="$gmp_cflags_cc +O2" - ;; - - # VAX - vax*-*-*) - gmp_cflags_gcc="$gmp_cflags_gcc -fomit-frame-pointer" - ;; - - # Fujitsu - f30[01]-fujitsu-sysv*) - cclist="gcc vcc" - gmp_cflags_vcc="-g" # FIXME: flags for vcc? - ;; -esac - -case "${target}" in - *-*-mingw32) gmp_cflags_gcc="$gmp_cflags_gcc -mno-cygwin";; -esac - -echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" 1>&6 -echo "configure:1352: checking for BSD-compatible nm" 1>&5 -if test "${ac_cv_path_NM+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - if test -n "$NM"; then - # Let the user override the test. - ac_cv_path_NM="$NM" -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" - for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/nm || test -f $ac_dir/nm$ac_exeext ; then - # Check to see if the nm accepts a BSD-compat flag. - # Adding the `sed 1q' prevents false positives on HP-UX, which says: - # nm: unknown option "B" ignored - if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then - ac_cv_path_NM="$ac_dir/nm -B" - break - elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then - ac_cv_path_NM="$ac_dir/nm -p" - break - else - ac_cv_path_NM=${ac_cv_path_NM="$ac_dir/nm"} # keep the first match, but - continue # so that we can try to find one that supports BSD flags - fi - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_path_NM" && ac_cv_path_NM=nm -fi -fi - -NM="$ac_cv_path_NM" -echo "$ECHO_T""$NM" 1>&6 - # nm on 64-bit AIX needs to know the object file format -case "$target" in - powerpc64*-*-aix*) - NM="$NM -X 64" - ;; -esac - -# Save CFLAGS given on command line. -gmp_user_CFLAGS="$CFLAGS" - -if test -z "$CC"; then - # Find compiler. - -if test $host != $build; then - ac_tool_prefix=${host_alias}- -else - ac_tool_prefix= -fi - -gmp_cc_list="$cclist" -gmp_req_64bit_cc="$os_64bit" - -CC32= -CC64= -for c in $gmp_cc_list; do - # Avoid cache hits. - unset CC - unset ac_cv_prog_CC - -# Extract the first word of "${ac_tool_prefix}$c", so it can be a program name with args. -set dummy ${ac_tool_prefix}$c; ac_word=$2 -echo $ECHO_N "checking for $ac_word... $ECHO_C" 1>&6 -echo "configure:1418: checking for $ac_word" 1>&5 -if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - for ac_path in `IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" -ac_dummy="$PATH" -for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - echo "$ac_dir/$ac_word" - fi -done -IFS="$ac_save_ifs" -`; do - ac_cv_prog_CC="${ac_tool_prefix}$c" - break - done -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ECHO_T""$CC" 1>&6 -else - echo "$ECHO_T""no" 1>&6 -fi - -if test -z "$ac_cv_prog_CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "$c", so it can be a program name with args. -set dummy $c; ac_word=$2 -echo $ECHO_N "checking for $ac_word... $ECHO_C" 1>&6 -echo "configure:1452: checking for $ac_word" 1>&5 -if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - for ac_path in `IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" -ac_dummy="$PATH" -for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - echo "$ac_dir/$ac_word" - fi -done -IFS="$ac_save_ifs" -`; do - ac_cv_prog_CC="$c" - break - done - test -z "$ac_cv_prog_CC" && ac_cv_prog_CC="$c" -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ECHO_T""$CC" 1>&6 -else - echo "$ECHO_T""no" 1>&6 -fi - - else - CC="$c" - fi -fi - - if test -n "$CC"; then - eval c_flags=\$gmp_cflags_$c - ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - CC="$CC" -CFLAGS="$c_flags" -echo $ECHO_N "checking if the C compiler ($CC) works with flags $CFLAGS... $ECHO_C" 1>&6 -echo "configure:1498: checking if the C compiler ($CC) works with flags $CFLAGS" 1>&5 - -# Simple test for all targets. -cat >conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - tmp_works=yes - # If we can't run a trivial program, we are probably using a cross compiler. - if (./conftest; exit) 2>/dev/null; then - tmp_cross=no - else - tmp_cross=yes - fi -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - tmp_works=no -fi -rm -fr conftest* - -# Target specific tests. -if test "$tmp_works" = "yes"; then - case "$target" in - *-*-aix*) # Returning a funcptr. - cat >conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - tmp_works=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - tmp_works=no -fi -rm -f conftest* - ;; - esac -fi - -if test "$tmp_works" = "yes"; then - gmp_prog_cc_works=yes -else - gmp_prog_cc_works=no -fi - -echo "$ECHO_T""$tmp_works" 1>&6 - - if test "$gmp_prog_cc_works" != "yes"; then - continue - fi - - # Save first working compiler, whether 32- or 64-bit capable. - if test -z "$CC32"; then - CC32="$CC" - fi - if test "$gmp_req_64bit_cc" = "yes"; then - eval c_flags=\$gmp_cflags64_$c - - # Verify that the compiler works in 64-bit mode as well. - # /usr/ucb/cc on Solaris 7 can *compile* in 64-bit mode, but not link. - ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - CC="$c" -CFLAGS="$c_flags" -echo $ECHO_N "checking if the C compiler ($CC) works with flags $CFLAGS... $ECHO_C" 1>&6 -echo "configure:1583: checking if the C compiler ($CC) works with flags $CFLAGS" 1>&5 - -# Simple test for all targets. -cat >conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - tmp_works=yes - # If we can't run a trivial program, we are probably using a cross compiler. - if (./conftest; exit) 2>/dev/null; then - tmp_cross=no - else - tmp_cross=yes - fi -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - tmp_works=no -fi -rm -fr conftest* - -# Target specific tests. -if test "$tmp_works" = "yes"; then - case "$target" in - *-*-aix*) # Returning a funcptr. - cat >conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - tmp_works=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - tmp_works=no -fi -rm -f conftest* - ;; - esac -fi - -if test "$tmp_works" = "yes"; then - gmp_prog_cc_works=yes -else - gmp_prog_cc_works=no -fi - -echo "$ECHO_T""$tmp_works" 1>&6 - - if test "$gmp_prog_cc_works" = "yes"; then - - gmp_tmp_CC_save="$CC" - CC="$c" - echo $ECHO_N "checking whether the C compiler ($CC) is 64-bit capable... $ECHO_C" 1>&6 -echo "configure:1651: checking whether the C compiler ($CC) is 64-bit capable" 1>&5 - if test -z "$NM"; then - echo; echo "configure: GMP_CHECK_CC_64BIT: fatal: need nm" - exit 1 - fi - gmp_tmp_CFLAGS_save="$CFLAGS" - CFLAGS="$c_flags" - - case "$target" in - hppa2.0*-*-*) - # FIXME: If gcc is installed under another name than "gcc", we will - # test the wrong thing. - if test "$CC" != "gcc"; then - echo >conftest.c - gmp_tmp_vs=`$CC $CFLAGS -V -c -o conftest.o conftest.c 2>&1 | grep "^ccom:"` - rm conftest* - gmp_tmp_v1=`echo $gmp_tmp_vs | sed 's/.* .\.\(.*\)\..*\..* HP C.*/\1/'` - gmp_tmp_v2=`echo $gmp_tmp_vs | sed 's/.* .\..*\.\(.*\)\..* HP C.*/\1/'` - gmp_tmp_v3=`echo $gmp_tmp_vs | sed 's/.* .\..*\..*\.\(.*\) HP C.*/\1/'` - gmp_cv_cc_64bit=no - test -n "$gmp_tmp_v1" && test "$gmp_tmp_v1" -ge "10" \ - && test -n "$gmp_tmp_v2" && test "$gmp_tmp_v2" -ge "32" \ - && test -n "$gmp_tmp_v3" && test "$gmp_tmp_v3" -ge "30" \ - && gmp_cv_cc_64bit=yes - else # gcc - # FIXME: Compile a minimal file and determine if the resulting object - # file is an ELF file. If so, gcc can produce 64-bit code. - # Do we have file(1) for target? - gmp_cv_cc_64bit=no - fi - ;; - mips-sgi-irix6.*) - # We use `-n32' to cc and `-mabi=n32' to gcc, resulting in 64-bit - # arithmetic but not 64-bit pointers, so the general test for sizeof - # (void *) is not valid. - # Simply try to compile an empty main. If that succeeds return - # true. - cat >conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - gmp_cv_cc_64bit=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - gmp_cv_cc_64bit=no -fi -rm -f conftest* - ;; - *-*-*) - # Allocate an array of size sizeof (void *) and use nm to determine its - # size. We depend on the first declared variable being put at address 0. - cat >conftest.c <&5; (eval $gmp_compile) 2>&5; }; then - gmp_tmp_val=`$NM conftest.o | grep post | sed -e 's;[[][0-9][]]\(.*\);\1;' \ - -e 's;[^1-9]*\([0-9]*\).*;\1;'` - if test "$gmp_tmp_val" = "8"; then - gmp_cv_cc_64bit=yes - else - gmp_cv_cc_64bit=no - fi - else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - gmp_cv_cc_64bit=no - fi - rm -f conftest* - ;; - esac - - CC="$gmp_tmp_CC_save" - CFLAGS="$gmp_tmp_CFLAGS_save" - echo "$ECHO_T""$gmp_cv_cc_64bit" 1>&6 - - if test "$gmp_cv_cc_64bit" = "yes"; then - test -z "$CC64" && CC64="$c" - test -z "$CFLAGS64" && CFLAGS64="$c_flags" - # We have CC64 so we're done. - break - fi - fi - else - # We have CC32, and we don't need a 64-bit compiler so we're done. - break - fi - fi -done -CC="$CC32" - - # If 64-bit OS and we have a 64-bit compiler, use it. - if test -n "$os_64bit" && test -n "$CC64"; then - CC=$CC64 - CFLAGS=$CFLAGS64 - else - eval CFLAGS=\$gmp_cflags_$CC - fi - - # Try compiler flags that may work with only some compiler versions. - # gmp_optcflags: All or nothing. - eval optcflags=\$gmp_optcflags_$CC - if test -n "$optcflags"; then - CFLAGS_save="$CFLAGS" - CFLAGS="$CFLAGS $optcflags" - echo $ECHO_N "checking whether $CC accepts $optcflags... $ECHO_C" 1>&6 -echo "configure:1770: checking whether $CC accepts $optcflags" 1>&5 - ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - - cat >conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - optok=yes - # If we can't run a trivial program, we are probably using a cross compiler. - if (./conftest; exit) 2>/dev/null; then - cross=no - else - cross=yes - fi -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - optok=no -fi -rm -fr conftest* - if test "$optok" = "yes"; then - echo "$ECHO_T""yes" 1>&6 - else - echo "$ECHO_T""no" 1>&6 - CFLAGS="$CFLAGS_save" - fi - fi - # gmp_xoptcflags: First is best, one has to work. - eval xoptcflags=\$gmp_xoptcflags_$CC - if test -n "$xoptcflags"; then - gmp_found="no" - for xopt in $xoptcflags; do - CFLAGS_save="$CFLAGS" - CFLAGS="$CFLAGS $xopt" - echo $ECHO_N "checking whether $CC accepts $xopt... $ECHO_C" 1>&6 -echo "configure:1814: checking whether $CC accepts $xopt" 1>&5 - ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - - cat >conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - optok=yes - # If we can't run a trivial program, we are probably using a cross compiler. - if (./conftest; exit) 2>/dev/null; then - cross=no - else - cross=yes - fi -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - optok=no -fi -rm -fr conftest* - if test "$optok" = "yes"; then - echo "$ECHO_T""yes" 1>&6 - gmp_found="yes" - break - else - echo "$ECHO_T""no" 1>&6 - CFLAGS="$CFLAGS_save" - fi - done - if test "$gmp_found" = "no"; then - echo "$0: fatal: need a compiler that understands one of $xoptcflags" - exit 1 - fi - fi -fi - -# Restore CFLAGS given on command line. -# FIXME: We've run through quite some unnecessary code looking for a -# nice compiler and working flags for it, just to spoil that with user -# supplied flags. -test -n "$gmp_user_CFLAGS" && CFLAGS="$gmp_user_CFLAGS" - -# Select chosen compiler. - -echo $ECHO_N "checking whether the C compiler ($CC $CFLAGS $CPPFLAGS $LDFLAGS) works... $ECHO_C" 1>&6 -echo "configure:1868: checking whether the C compiler ($CC $CFLAGS $CPPFLAGS $LDFLAGS) works" 1>&5 - -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -cat >conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - ac_cv_prog_cc_works=yes - # If we can't run a trivial program, we are probably using a cross compiler. - if (./conftest; exit) 2>/dev/null; then - ac_cv_prog_cc_cross=no - else - ac_cv_prog_cc_cross=yes - fi -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - ac_cv_prog_cc_works=no -fi -rm -fr conftest* -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -echo "$ECHO_T""$ac_cv_prog_cc_works" 1>&6 -if test $ac_cv_prog_cc_works = no; then - { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 77; } -fi -echo $ECHO_N "checking whether the C compiler ($CC $CFLAGS $CPPFLAGS $LDFLAGS) is a cross-compiler... $ECHO_C" 1>&6 -echo "configure:1910: checking whether the C compiler ($CC $CFLAGS $CPPFLAGS $LDFLAGS) is a cross-compiler" 1>&5 -echo "$ECHO_T""$ac_cv_prog_cc_cross" 1>&6 -cross_compiling=$ac_cv_prog_cc_cross - -echo $ECHO_N "checking whether we are using GNU C... $ECHO_C" 1>&6 -echo "configure:1915: checking whether we are using GNU C" 1>&5 -if test "${ac_cv_prog_gcc+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - cat >conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then - ac_cv_prog_gcc=yes -else - ac_cv_prog_gcc=no -fi -fi -echo "$ECHO_T""$ac_cv_prog_gcc" 1>&6 - -if test "$ac_cv_prog_gcc" = "yes"; then - GCC=yes -else - GCC= -fi - -# Set CFLAGS if not already set. -if test -z "$CFLAGS"; then - CFLAGS="-g" - if test "$GCC" = "yes"; then - CFLAGS="$CFLAGS -O2" - fi -fi - -if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - ac_cv_prog_CC="$CC" -fi - -# How to assemble. -CCAS="$CC -c" - -echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" 1>&6 -echo "configure:1956: checking how to run the C preprocessor" 1>&5 -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then -if test "${ac_cv_prog_CPP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - # This must be in double quotes, not single quotes, because CPP may get - # substituted into the Makefile and "${CC-cc}" will confuse make. - CPP="${CC-cc} -E" - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. - -cat >conftest.$ac_ext < -Syntax Error -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1978: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - CPP="${CC-cc} -E -traditional-cpp" - -cat >conftest.$ac_ext < -Syntax Error -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1996: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - CPP="${CC-cc} -nologo -E" - -cat >conftest.$ac_ext < -Syntax Error -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2014: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - CPP=/lib/cpp -fi -rm -f conftest* -fi -rm -f conftest* -fi -rm -f conftest* - ac_cv_prog_CPP="$CPP" -fi - CPP="$ac_cv_prog_CPP" -else - ac_cv_prog_CPP="$CPP" -fi -echo "$ECHO_T""$CPP" 1>&6 - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# ./install, which can be erroneously created by make from ./install.sh. -echo $ECHO_N "checking for a BSD compatible install... $ECHO_C" 1>&6 -echo "configure:2050: checking for a BSD compatible install" 1>&5 -if test -z "$INSTALL"; then -if test "${ac_cv_path_install+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" - for ac_dir in $PATH; do - # Account for people who put trailing slashes in PATH elements. - case "$ac_dir/" in - /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - if test -f $ac_dir/$ac_prog; then - if test $ac_prog = install && - grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - elif test $ac_prog = install && - grep pwplus $ac_dir/$ac_prog >/dev/null 2>&1; then - # program-specific install script used by HP pwplus--don't use. - : - else - ac_cv_path_install="$ac_dir/$ac_prog -c" - break 2 - fi - fi - done - ;; - esac - done - IFS="$ac_save_IFS" - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL="$ac_cv_path_install" - else - # As a last resort, use the slow shell script. We don't cache a - # path for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the path is relative. - INSTALL="$ac_install_sh" - fi -fi -echo "$ECHO_T""$INSTALL" 1>&6 - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - -echo $ECHO_N "checking whether ln -s works... $ECHO_C" 1>&6 -echo "configure:2107: checking whether ln -s works" 1>&5 -if test "${ac_cv_prog_LN_S+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - rm -f conftestdata -if ln -s X conftestdata 2>/dev/null -then - rm -f conftestdata - ac_cv_prog_LN_S="ln -s" -else - ac_cv_prog_LN_S=ln -fi -fi -LN_S="$ac_cv_prog_LN_S" -if test "$ac_cv_prog_LN_S" = "ln -s"; then - echo "$ECHO_T""yes" 1>&6 -else - echo "$ECHO_T""no" 1>&6 -fi - -echo $ECHO_N "checking for suitable m4... $ECHO_C" 1>&6 -echo "configure:2128: checking for suitable m4" 1>&5 -if test "${gmp_cv_prog_m4+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - if test -n "$M4"; then - gmp_cv_prog_m4="$M4" -else - cat >conftest.m4 <<\EOF -define(dollarhash,``$#'')dnl -ifelse(dollarhash(x),1,`define(t1,Y)', -``bad: $# not supported (SunOS /usr/bin/m4) -'')dnl -ifelse(eval(89),89,`define(t2,Y)', -`bad: eval() doesnt support 8 or 9 in a constant (OpenBSD 2.6 m4) -')dnl -ifelse(t1`'t2,YY,`good -')dnl -EOF - echo "trying m4" 1>&5 - gmp_tmp_val="`(m4 conftest.m4) 2>&5`" - echo "$gmp_tmp_val" 1>&5 - if test "$gmp_tmp_val" = good; then - gmp_cv_prog_m4="m4" - else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH:/usr/5bin" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - echo "trying $ac_dir/m4" 1>&5 - gmp_tmp_val="`($ac_dir/m4 conftest.m4) 2>&5`" - echo "$gmp_tmp_val" 1>&5 - if test "$gmp_tmp_val" = good; then - gmp_cv_prog_m4="$ac_dir/m4" - break - fi - done - IFS="$ac_save_ifs" - if test -z "$gmp_cv_prog_m4"; then - { echo "configure: error: No usable m4 in \$PATH or /usr/5bin (see config.log for reasons)." 1>&2; exit 1; } - fi - fi - rm -f conftest.m4 -fi -fi -echo "$ECHO_T""$gmp_cv_prog_m4" 1>&6 -M4="$gmp_cv_prog_m4" - -# Extract the first word of "ar", so it can be a program name with args. -set dummy ar; ac_word=$2 -echo $ECHO_N "checking for $ac_word... $ECHO_C" 1>&6 -echo "configure:2178: checking for $ac_word" 1>&5 -if test "${ac_cv_prog_AR+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - if test -n "$AR"; then - ac_cv_prog_AR="$AR" # Let the user override the test. -else - for ac_path in `IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" -ac_dummy="$PATH" -for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - echo "$ac_dir/$ac_word" - fi -done -IFS="$ac_save_ifs" -`; do - ac_cv_prog_AR="ar" - break - done -fi -fi -AR="$ac_cv_prog_AR" -if test -n "$AR"; then - echo "$ECHO_T""$AR" 1>&6 -else - echo "$ECHO_T""no" 1>&6 -fi - -# ar on AIX needs to know the object file format -case "$target" in - powerpc64*-*-aix*) - AR="$AR -X 64" - ;; -esac - -if test "$gmp_no_asm_syntax_testing" != "yes"; then - echo $ECHO_N "checking how to switch to text section... $ECHO_C" 1>&6 -echo "configure:2216: checking how to switch to text section" 1>&5 -if test "${gmp_cv_check_asm_text+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - case "$target" in - *-*-aix*) - - gmp_cv_check_asm_text=".csect .text[PR]" - - ;; - *-*-hpux*) gmp_cv_check_asm_text=".code" ;; - *) gmp_cv_check_asm_text=".text" ;; -esac - -fi -echo "$ECHO_T""$gmp_cv_check_asm_text" 1>&6 -echo "define(, <$gmp_cv_check_asm_text>)" >> $gmp_tmpconfigm4 - - echo $ECHO_N "checking how to switch to data section... $ECHO_C" 1>&6 -echo "configure:2235: checking how to switch to data section" 1>&5 -if test "${gmp_cv_check_asm_data+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - case "$target" in - *-*-aix*) - - gmp_cv_check_asm_data=".csect .data[RW]" - - ;; - *) gmp_cv_check_asm_data=".data" ;; -esac - -fi -echo "$ECHO_T""$gmp_cv_check_asm_data" 1>&6 -echo "define(, <$gmp_cv_check_asm_data>)" >> $gmp_tmpconfigm4 - - echo $ECHO_N "checking how to export a symbol... $ECHO_C" 1>&6 -echo "configure:2253: checking how to export a symbol" 1>&5 -if test "${gmp_cv_check_asm_globl+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - case "$target" in - *-*-hpux*) gmp_cv_check_asm_globl=".export" ;; - *) gmp_cv_check_asm_globl=".globl" ;; -esac - -fi -echo "$ECHO_T""$gmp_cv_check_asm_globl" 1>&6 -echo "define(, <$gmp_cv_check_asm_globl>)" >> $gmp_tmpconfigm4 - - echo $ECHO_N "checking what assembly label suffix to use... $ECHO_C" 1>&6 -echo "configure:2267: checking what assembly label suffix to use" 1>&5 -if test "${gmp_cv_check_asm_label_suffix+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - case "$target" in - *-*-hpux*) gmp_cv_check_asm_label_suffix="" ;; - *) gmp_cv_check_asm_label_suffix=":" ;; -esac - -fi -echo "$ECHO_T""$gmp_cv_check_asm_label_suffix" 1>&6 -echo "define(, <\$1$gmp_cv_check_asm_label_suffix>)" >> $gmp_tmpconfigm4 - - echo $ECHO_N "checking how the .type assembly directive should be used... $ECHO_C" 1>&6 -echo "configure:2281: checking how the .type assembly directive should be used" 1>&5 -if test "${gmp_cv_check_asm_type+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - ac_assemble="$CCAS $CFLAGS conftest.s 1>&5" -for gmp_tmp_prefix in @ \# %; do - echo " .type sym,${gmp_tmp_prefix}function" > conftest.s - if { (eval echo configure:2288: \"$ac_assemble\") 1>&5; (eval $ac_assemble) 2>&5; }; then - gmp_cv_check_asm_type=".type \$1,${gmp_tmp_prefix}\$2" - break - fi -done -if test -z "$gmp_cv_check_asm_type"; then - gmp_cv_check_asm_type="dnl" -fi - -fi -echo "$ECHO_T""$gmp_cv_check_asm_type" 1>&6 -echo "define(, <$gmp_cv_check_asm_type>)" >> $gmp_tmpconfigm4 - - echo $ECHO_N "checking if the .size assembly directive works... $ECHO_C" 1>&6 -echo "configure:2302: checking if the .size assembly directive works" 1>&5 -if test "${gmp_cv_check_asm_size+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - ac_assemble="$CCAS $CFLAGS conftest.s 1>&5" -echo ' .size sym,1' > conftest.s -if { (eval echo configure:2308: \"$ac_assemble\") 1>&5; (eval $ac_assemble) 2>&5; }; then - gmp_cv_check_asm_size=".size \$1,\$2" -else - gmp_cv_check_asm_size="dnl" -fi - -fi -echo "$ECHO_T""$gmp_cv_check_asm_size" 1>&6 -echo "define(, <$gmp_cv_check_asm_size>)" >> $gmp_tmpconfigm4 - -echo $ECHO_N "checking what prefix to use for a local label... $ECHO_C" 1>&6 -echo "configure:2319: checking what prefix to use for a local label" 1>&5 -if test "${gmp_cv_check_asm_lsym_prefix+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - if test -z "$NM"; then - echo; echo "GMP_CHECK_ASM_LSYM_PREFIX: fatal: need nm" - exit 1 -fi -ac_assemble="$CCAS $CFLAGS conftest.s 1>&5" -gmp_cv_check_asm_lsym_prefix="L" -for gmp_tmp_pre in L .L $ L$; do - cat > conftest.s <&5; (eval $ac_assemble) 2>&5; }; then - $NM conftest.o >/dev/null 2>&1 - gmp_rc=$? - if test "$gmp_rc" != "0"; then - echo "configure: $NM failure, using default" - break - fi - if $NM conftest.o | grep gurkmacka >/dev/null; then true; else - gmp_cv_check_asm_lsym_prefix="$gmp_tmp_pre" - break - fi - else - echo "configure: failed program was:" >&5 - cat conftest.s >&5 - # Use default. - fi -done -rm -f conftest* - -fi -echo "$ECHO_T""$gmp_cv_check_asm_lsym_prefix" 1>&6 -echo "define(, <${gmp_cv_check_asm_lsym_prefix}>)" >> $gmp_tmpconfigm4 - -echo $ECHO_N "checking how to define a 32-bit word... $ECHO_C" 1>&6 -echo "configure:2359: checking how to [define] a 32-bit word" 1>&5 -if test "${gmp_cv_check_asm_w32+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - if test -z "$NM"; then - echo; echo "configure: GMP_CHECK_ASM_W32: fatal: need nm" - exit 1 -fi - -# FIXME: HPUX puts first symbol at 0x40000000, breaking our assumption -# that it's at 0x0. We'll have to declare another symbol before the -# .long/.word and look at the distance between the two symbols. The -# only problem is that the sed expression(s) barfs (on Solaris, for -# example) for the symbol with value 0. For now, HPUX uses .word. - -case "$target" in - *-*-hpux*) - gmp_cv_check_asm_w32=".word" - ;; - *-*-*) - ac_assemble="$CCAS $CFLAGS conftest.s 1>&5" - for gmp_tmp_op in .long .word; do - cat > conftest.s <&5; (eval $ac_assemble) 2>&5; }; then - - gmp_tmp_val=`$NM conftest.o | grep foo | sed -e 's;[[][0-9][]]\(.*\);\1;' \ - -e 's;[^1-9]*\([0-9]*\).*;\1;'` - if test "$gmp_tmp_val" = "4"; then - gmp_cv_check_asm_w32="$gmp_tmp_op" - break - fi - fi - done - ;; -esac - -if test -z "$gmp_cv_check_asm_w32"; then - echo; echo "configure: GMP_CHECK_ASM_W32: fatal: do not know how to define a 32-bit word" - exit 1 -fi -rm -f conftest* - -fi -echo "$ECHO_T""$gmp_cv_check_asm_w32" 1>&6 -echo "define(, <$gmp_cv_check_asm_w32>)" >> $gmp_tmpconfigm4 - - echo $ECHO_N "checking if symbols are prefixed by underscore... $ECHO_C" 1>&6 -echo "configure:2412: checking if symbols are prefixed by underscore" 1>&5 -if test "${gmp_cv_check_asm_underscore+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then - if grep _underscore_test conftest* >/dev/null; then - gmp_cv_check_asm_underscore=yes - else - gmp_cv_check_asm_underscore=no - fi -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 -fi -rm -f conftest* - -fi -echo "$ECHO_T""$gmp_cv_check_asm_underscore" 1>&6 -if test "$gmp_cv_check_asm_underscore" = "yes"; then - -echo 'define(, <_>)' >> $gmp_tmpconfigm4 - - underscore=yes -else - -echo 'define(, <>)' >> $gmp_tmpconfigm4 - - underscore=no -fi - -echo $ECHO_N "checking if .align assembly directive is logarithmic... $ECHO_C" 1>&6 -echo "configure:2449: checking if .align assembly directive is logarithmic" 1>&5 -if test "${gmp_cv_check_asm_align_log+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - if test -z "$NM"; then - echo; echo "configure: GMP_CHECK_ASM_ALIGN_LOG: fatal: need nm" - exit 1 -fi -cat > conftest.s <&5; (eval $ac_assemble) 2>&5; }; then - - gmp_tmp_val=`$NM conftest.o | grep foo | sed -e 's;[[][0-9][]]\(.*\);\1;' \ - -e 's;[^1-9]*\([0-9]*\).*;\1;'` - if test "$gmp_tmp_val" = "10" || test "$gmp_tmp_val" = "16"; then - gmp_cv_check_asm_align_log=yes - else - gmp_cv_check_asm_align_log=no - fi -else - echo "configure: failed program was:" >&5 - cat conftest.s >&5 -fi -rm -f conftest* - -fi -echo "$ECHO_T""$gmp_cv_check_asm_align_log" 1>&6 - -echo "define(,<$gmp_cv_check_asm_align_log>)" >> $gmp_tmpconfigm4 - -if test "$gmp_cv_check_asm_align_log" = "yes"; then - asm_align=log -else - asm_align=nolog -fi - -fi - -family=generic - -case ${target} in - arm*-*-*) - path="arm" - ;; - sparcv9*-*-solaris2.[789]* | sparc64*-*-solaris2.[789]* | ultrasparc*-*-solaris2.[789]*) - if test -n "$CC64" - then path="sparc64" - else path="sparc32/v9 sparc32/v8 sparc32" - fi - ;; - sparc64-*-linux*) - if test -n "$CC64" - then path="sparc64" - else path="sparc32/v9 sparc32/v8 sparc32" - fi - ;; - sparcv8*-*-* | microsparc*-*-*) - path="sparc32/v8 sparc32" - if test x${floating_point} = xno - then extra_functions="udiv_nfp" - else extra_functions="udiv_fp" - fi - ;; - sparcv9*-*-* | ultrasparc*-*-*) - path="sparc32/v9 sparc32/v8 sparc32" - extra_functions="udiv_fp" - ;; - supersparc*-*-*) - path="sparc32/v8/supersparc sparc32/v8 sparc32" - extra_functions="udiv" - ;; - sparc*-*-*) path="sparc32" - if test x${floating_point} = xno - then extra_functions="udiv_nfp" - else extra_functions="udiv_fp" - fi - ;; - hppa7000*-*-*) - path="hppa/hppa1_1 hppa" - extra_functions="udiv_qrnnd" - ;; - hppa1.0*-*-*) - path="hppa" - extra_functions="udiv_qrnnd" - ;; - hppa2.0w-*-*) - path="pa64w" - extra_functions="umul_ppmm udiv_qrnnd" - ;; - hppa2.0*-*-*) - if test -n "$CC64"; then - path="pa64" - extra_functions="umul_ppmm udiv_qrnnd" - # We need to use the system compiler, or actually the system assembler, - # since GAS has not been ported to understand the 2.0 instructions. - CCAS="$CC64 -c" - else - # FIXME: path should be "hppa/hppa2_0 hppa/hppa1_1 hppa" - path="hppa/hppa1_1 hppa" - extra_functions="udiv_qrnnd" - fi - ;; - hppa*-*-*) #assume pa7100 - path="hppa/hppa1_1/pa7100 hppa/hppa1_1 hppa" - extra_functions="udiv_qrnnd";; - f30[01]-fujitsu-sysv*) - path=fujitsu;; - alphaev6*-*-*) path="alpha/ev6 alpha"; extra_functions="invert_limb cntlz";; - alphaev5*-*-*) path="alpha/ev5 alpha"; extra_functions="invert_limb cntlz";; - alpha*-*-*) path="alpha"; extra_functions="invert_limb cntlz";; - # Cray vector machines. This must come after alpha* so that we can - # recognize present and future vector processors with a wildcard. - *-cray-unicos*) - path="cray" - extra_functions="mulww";; - am29000*-*-*) path="a29k";; - a29k*-*-*) path="a29k";; - - # AMD and Intel x86 configurations - - i?86*-*-* | k[5-8]*-*-* | pentium*-*-* | athlon-*-*) - gmp_m4postinc="x86/x86-defs.m4" - extra_functions="udiv umul" - CALLING_CONVENTIONS_OBJS="x86call.o x86check.o" - -echo $ECHO_N "checking if the assembler takes cl with shldl... $ECHO_C" 1>&6 -echo "configure:2583: checking if the assembler takes cl with shldl" 1>&5 -if test "${gmp_cv_check_asm_shldl_cl+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - cat > conftest.s <&5; (eval $ac_assemble) 2>&5; }; then - gmp_cv_check_asm_shldl_cl=yes -else - gmp_cv_check_asm_shldl_cl=no -fi -rm -f conftest* - -fi -echo "$ECHO_T""$gmp_cv_check_asm_shldl_cl" 1>&6 -if test "$gmp_cv_check_asm_shldl_cl" = "yes"; then - -echo 'define(, <1>)' >> $gmp_tmpconfigm4 - -else - -echo 'define(, <0>)' >> $gmp_tmpconfigm4 - -fi - - echo $ECHO_N "checking if the .align directive accepts an 0x90 fill in .text... $ECHO_C" 1>&6 -echo "configure:2612: checking if the .align directive accepts an 0x90 fill in .text" 1>&5 -if test "${gmp_cv_check_asm_align_fill_0x90+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - -cat > conftest.s <&5 - if echo "$gmp_tmp_val" | grep "Warning: Fill parameter ignored for executable section"; then - echo "Supressing this warning by omitting 0x90" 1>&5 - gmp_cv_check_asm_align_fill_0x90=no - else - gmp_cv_check_asm_align_fill_0x90=yes - fi -else - echo "Non-zero exit code" 1>&5 - echo "$gmp_tmp_val" 1>&5 - gmp_cv_check_asm_align_fill_0x90=no -fi -rm -f conftest* - -fi -echo "$ECHO_T""$gmp_cv_check_asm_align_fill_0x90" 1>&6 - -echo "define(,<$gmp_cv_check_asm_align_fill_0x90>)" >> $gmp_tmpconfigm4 - - # the CPUs below wanting to know about mmx - case ${target} in - pentiummmx-*-* | pentium[23]-*-* | k6*-*-* | athlon-*-*) - -echo $ECHO_N "checking if the assembler knows about MMX instructions... $ECHO_C" 1>&6 -echo "configure:2649: checking if the assembler knows about MMX instructions" 1>&5 -if test "${gmp_cv_check_asm_mmx+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - cat > conftest.s <&5; (eval $ac_assemble) 2>&5; }; then - gmp_cv_check_asm_mmx=yes -else - gmp_cv_check_asm_mmx=no -fi -rm -f conftest* - -fi -echo "$ECHO_T""$gmp_cv_check_asm_mmx" 1>&6 -if test "$gmp_cv_check_asm_mmx" = "yes"; then - tmp_mmx=yes -else - echo "configure: warning: +----------------------------------------------------------" 1>&2 - echo "configure: warning: | WARNING WARNING WARNING" 1>&2 - echo "configure: warning: | Target CPU has MMX code, but it can't be assembled by" 1>&2 - echo "configure: warning: | $CCAS $CFLAGS" 1>&2 - echo "configure: warning: | Non-MMX replacements will be used." 1>&2 - echo "configure: warning: | This will be an inferior build." 1>&2 - echo "configure: warning: +----------------------------------------------------------" 1>&2 - tmp_mmx=no -fi - - ;; - esac - - # default for anything not otherwise mentioned - path="x86" - - case ${target} in - i[34]86*-*-*) - path="x86" - ;; - k5*-*-*) - # don't know what best suits k5 - path="x86" - ;; - i586*-*-* | pentium-*-*) - path="x86/pentium x86" - ;; - pentiummmx-*-*) - path="x86/pentium x86" - if test "$tmp_mmx" = yes; then - path="x86/pentium/mmx $path" - fi - ;; - i686*-*-* | pentiumpro-*-*) - path="x86/p6 x86" - ;; - pentium2-*-*) - path="x86/p6 x86" - # The pentium/mmx lshift and rshift are good on p6 and can be used - # until there's something specific for p6. - if test "$tmp_mmx" = yes; then - path="x86/p6/mmx x86/pentium/mmx $path" - fi - ;; - pentium3-*-*) - path="x86/p6 x86" - # The pentium/mmx lshift and rshift are good on p6 and can be used - # until there's something specific for p6. - if test "$tmp_mmx" = yes; then - path="x86/p6/p3mmx x86/p6/mmx x86/pentium/mmx $path" - fi - ;; - k6[23]*-*-*) - path="x86/k6 x86" - if test "$tmp_mmx" = yes; then - path="x86/k6/k62mmx x86/k6/mmx $path" - fi - ;; - k6*-*-*) - path="x86/k6 x86" - if test "$tmp_mmx" = yes; then - path="x86/k6/mmx $path" - fi - ;; - athlon-*-*) - path="x86/k7 x86" - if test "$tmp_mmx" = yes; then - path="x86/k7/mmx $path" - fi - ;; - esac - ;; - - i960*-*-*) path="i960";; - - ia64*-*-*) path="ia64";; - -# Motorola 68k configurations. Let m68k mean 68020-68040. - m680[234]0*-*-* | m68k*-*-* | \ - m68*-next-nextstep*) # Nexts are at least '020 - path="m68k/mc68020 m68k" - family=m68k - ;; - m68000*-*-*) - path="m68k" - family=m68k - ;; - - m88k*-*-* | m88k*-*-*) path="m88k";; - m88110*-*-*) path="m88k/mc88110 m88k";; - ns32k*-*-*) path="ns32k";; - - pyramid-*-*) path="pyr";; - - ppc601-*-*) path="power powerpc32";; - powerpc64*-*-*) path="powerpc64";; - powerpc*-*-*) path="powerpc32";; - rs6000-*-* | power-*-* | power2-*-*) - path="power" - extra_functions="udiv_w_sdiv" - ;; - - sh-*-*) path="sh";; - sh2-*-*) path="sh/sh2 sh";; - - mips[34]*-*-*) path="mips3";; - mips*-*-irix6*) path="mips3";; - mips*-*-*) path="mips2";; - - vax*-*-*) path="vax"; extra_functions="udiv_w_sdiv";; - - z8000x*-*-*) path="z8000x"; extra_functions="udiv_w_sdiv";; - z8000*-*-*) path="z8000"; extra_functions="udiv_w_sdiv";; - - clipper*-*-*) path="clipper";; -esac - -if test -n "$CALLING_CONVENTIONS_OBJS"; then - cat >>confdefs.h <<\EOF -#define HAVE_CALLING_CONVENTIONS 1 -EOF - -fi - -case ${target} in - i[5-8]86*-*-* | k[5-8]*-*-* | pentium*-*-* | athlon-*-*) - # rdtsc is in pentium and up, not in i386 and i486 - SPEED_CYCLECOUNTER_OBJS=pentium.lo - ;; - alpha*-*-*) - SPEED_CYCLECOUNTER_OBJS=alpha.lo - ;; - sparcv9*-*-* | ultrasparc*-*-* | sparc64*-*-*) - SPEED_CYCLECOUNTER_OBJS=sparcv9.lo - ;; - hppa2*-*-*) - SPEED_CYCLECOUNTER_OBJS=hppa2.lo - ;; - hppa*-*-*) - SPEED_CYCLECOUNTER_OBJS=hppa.lo - ;; -esac - -if test -n "$SPEED_CYCLECOUNTER_OBJS" -then - cat >>confdefs.h <<\EOF -#define HAVE_SPEED_CYCLECOUNTER 1 -EOF - -fi - -echo $ECHO_N "checking for Cygwin environment... $ECHO_C" 1>&6 -echo "configure:2822: checking for Cygwin environment" 1>&5 -if test "${ac_cv_cygwin+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - cat >conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - ac_cv_cygwin=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_cygwin=no -fi -rm -f conftest* -fi -echo "$ECHO_T""$ac_cv_cygwin" 1>&6 -CYGWIN= -test "$ac_cv_cygwin" = yes && CYGWIN=yes -echo $ECHO_N "checking for mingw32 environment... $ECHO_C" 1>&6 -echo "configure:2856: checking for mingw32 environment" 1>&5 -if test "${ac_cv_mingw32+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - cat >conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - ac_cv_mingw32=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_mingw32=no -fi -rm -f conftest* -fi -echo "$ECHO_T""$ac_cv_mingw32" 1>&6 -MINGW32= -test "$ac_cv_mingw32" = yes && MINGW32=yes -echo $ECHO_N "checking for EMX OS/2 environment... $ECHO_C" 1>&6 -echo "configure:2887: checking for EMX OS/2 environment" 1>&5 -if test "${ac_cv_emxos2+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - cat >conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - ac_cv_emxos2=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_emxos2=no -fi -rm -f conftest* -fi -echo "$ECHO_T""$ac_cv_emxos2" 1>&6 -EMXOS2= -test "$ac_cv_emxos2" = yes && EMXOS2=yes - -echo $ECHO_N "checking for executable suffix... $ECHO_C" 1>&6 -echo "configure:2919: checking for executable suffix" 1>&5 -if test "${ac_cv_exeext+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - if test "$CYGWIN" = yes || test "$MINGW32" = yes || test "$EMXOS2" = yes; then - ac_cv_exeext=.exe -else - rm -f conftest* - echo 'int main () { return 0; }' >conftest.$ac_ext - ac_cv_exeext= - if { (eval echo configure:2929: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then - for ac_file in conftest.*; do - case $ac_file in - *.c | *.C | *.o | *.obj | *.xcoff) ;; - *) ac_cv_exeext=`echo $ac_file | sed -e s/conftest//` ;; - esac - done - else - { echo "configure: error: installation or configuration problem: compiler cannot create executables." 1>&2; exit 1; } - fi - rm -f conftest* - test x"${ac_cv_exeext}" = x && ac_cv_exeext=no -fi -fi - -EXEEXT="" -test x"${ac_cv_exeext}" != xno && EXEEXT=${ac_cv_exeext} -echo "$ECHO_T""${ac_cv_exeext}" 1>&6 -ac_exeext=$EXEEXT - -echo $ECHO_N "checking for object suffix... $ECHO_C" 1>&6 -echo "configure:2950: checking for object suffix" 1>&5 -if test "${ac_cv_objext+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - rm -f conftest* -echo 'int i = 1;' >conftest.$ac_ext -if { (eval echo configure:2956: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then - for ac_file in conftest.*; do - case $ac_file in - *.c) ;; - *) ac_cv_objext=`echo $ac_file | sed -e s/conftest.//` ;; - esac - done -else - { echo "configure: error: installation or configuration problem; compiler does not work" 1>&2; exit 1; } -fi -rm -f conftest* -fi - -echo "$ECHO_T""$ac_cv_objext" 1>&6 -OBJEXT=$ac_cv_objext -ac_objext=$ac_cv_objext - -case "$target" in - *-*-aix4.[3-9]*) enable_shared=no ;; -esac -# Check whether --enable-shared or --disable-shared was given. -if test "${enable_shared+set}" = set; then - enableval="$enable_shared" - p=${PACKAGE-default} -case "$enableval" in -yes) enable_shared=yes ;; -no) enable_shared=no ;; -*) - enable_shared=no - # Look at the argument we got. We use all the common list separators. - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," - for pkg in $enableval; do - if test "X$pkg" = "X$p"; then - enable_shared=yes - fi - done - IFS="$ac_save_ifs" - ;; -esac -else - enable_shared=yes -fi -# Check whether --enable-static or --disable-static was given. -if test "${enable_static+set}" = set; then - enableval="$enable_static" - p=${PACKAGE-default} -case "$enableval" in -yes) enable_static=yes ;; -no) enable_static=no ;; -*) - enable_static=no - # Look at the argument we got. We use all the common list separators. - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," - for pkg in $enableval; do - if test "X$pkg" = "X$p"; then - enable_static=yes - fi - done - IFS="$ac_save_ifs" - ;; -esac -else - enable_static=yes -fi -# Check whether --enable-fast-install or --disable-fast-install was given. -if test "${enable_fast_install+set}" = set; then - enableval="$enable_fast_install" - p=${PACKAGE-default} -case "$enableval" in -yes) enable_fast_install=yes ;; -no) enable_fast_install=no ;; -*) - enable_fast_install=no - # Look at the argument we got. We use all the common list separators. - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," - for pkg in $enableval; do - if test "X$pkg" = "X$p"; then - enable_fast_install=yes - fi - done - IFS="$ac_save_ifs" - ;; -esac -else - enable_fast_install=yes -fi - -echo $ECHO_N "checking build system type... $ECHO_C" 1>&6 -echo "configure:3044: checking build system type" 1>&5 -if test "x$ac_cv_build" = "x" || (test "x$build" != "xNONE" && test "x$build" != "x$ac_cv_build_alias"); then - - # Make sure we can run config.sub. - if $ac_config_sub sun4 >/dev/null 2>&1; then :; else - { echo "configure: error: cannot run $ac_config_sub" 1>&2; exit 1; } - fi - - ac_cv_build_alias=$build - case "$ac_cv_build_alias" in - NONE) - case $nonopt in - NONE) - ac_cv_build_alias=$host_alias ;; - *) ac_cv_build_alias=$nonopt ;; - esac ;; - esac - - ac_cv_build=`$ac_config_sub $ac_cv_build_alias` || exit 1 - ac_cv_build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` - ac_cv_build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` - ac_cv_build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` -else - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -fi - -echo "$ECHO_T""$ac_cv_build" 1>&6 - -build=$ac_cv_build -build_alias=$ac_cv_build_alias -build_cpu=$ac_cv_build_cpu -build_vendor=$ac_cv_build_vendor -build_os=$ac_cv_build_os - -# Check whether --with-gnu-ld or --without-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then - withval="$with_gnu_ld" - test "$withval" = no || with_gnu_ld=yes -else - with_gnu_ld=no -fi - -ac_prog=ld -if test "$ac_cv_prog_gcc" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - echo $ECHO_N "checking for ld used by GCC... $ECHO_C" 1>&6 -echo "configure:3090: checking for ld used by GCC" 1>&5 - case $target in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case "$ac_prog" in - # Accept absolute paths. - [\\/]* | [A-Za-z]:[\\/]*) - re_direlt='/[^/][^/]*/\.\./' - # Canonicalize the path of ld - ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` - while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do - ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - echo $ECHO_N "checking for GNU ld... $ECHO_C" 1>&6 -echo "configure:3120: checking for GNU ld" 1>&5 -else - echo $ECHO_N "checking for non-GNU ld... $ECHO_C" 1>&6 -echo "configure:3123: checking for non-GNU ld" 1>&5 -fi -if test "${ac_cv_path_LD+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - if test -z "$LD"; then - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - ac_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some GNU ld's only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - if "$ac_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then - test "$with_gnu_ld" != no && break - else - test "$with_gnu_ld" != yes && break - fi - fi - done - IFS="$ac_save_ifs" -else - ac_cv_path_LD="$LD" # Let the user override the test with a path. -fi -fi - -LD="$ac_cv_path_LD" -if test -n "$LD"; then - echo "$ECHO_T""$LD" 1>&6 -else - echo "$ECHO_T""no" 1>&6 -fi -test -z "$LD" && { echo "configure: error: no acceptable ld found in \$PATH" 1>&2; exit 1; } -echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" 1>&6 -echo "configure:3158: checking if the linker ($LD) is GNU ld" 1>&5 -if test "${ac_cv_prog_gnu_ld+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - # I'd rather use --version here, but apparently some GNU ld's only accept -v. -if $LD -v 2>&1 &5; then - ac_cv_prog_gnu_ld=yes -else - ac_cv_prog_gnu_ld=no -fi -fi -echo "$ECHO_T""$ac_cv_prog_gnu_ld" 1>&6 -with_gnu_ld=$ac_cv_prog_gnu_ld - -echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" 1>&6 -echo "configure:3173: checking for $LD option to reload object files" 1>&5 -if test "${lt_cv_ld_reload_flag+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - lt_cv_ld_reload_flag='-r' -fi -echo "$ECHO_T""$lt_cv_ld_reload_flag" 1>&6 -reload_flag=$lt_cv_ld_reload_flag -test -n "$reload_flag" && reload_flag=" $reload_flag" - -echo $ECHO_N "checking how to recognise dependant libraries... $ECHO_C" 1>&6 -echo "configure:3184: checking how to recognise dependant libraries" 1>&5 -if test "${lt_cv_deplibs_check_method+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - lt_cv_file_magic_cmd='${MAGIC}' -lt_cv_file_magic_test_file= -lt_cv_deplibs_check_method='unknown' -# Need to set the preceding variable on all platforms that support -# interlibrary dependencies. -# 'none' -- dependencies not supported. -# `unknown' -- same as none, but documents that we really don't know. -# 'pass_all' -- all dependencies passed with no checks. -# 'test_compile' -- check by making test program. -# 'file_magic [regex]' -- check by looking for files in library path -# which responds to the $file_magic_cmd with a given egrep regex. -# If you have `file' or equivalent on your system and you're not sure -# whether `pass_all' will *always* work, you probably want this one. - -case "$host_os" in -aix4* | beos*) - lt_cv_deplibs_check_method=pass_all - ;; - -bsdi4*) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' - lt_cv_file_magic_test_file=/shlib/libc.so - ;; - -cygwin* | mingw*) - lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' - lt_cv_file_magic_cmd='${OBJDUMP} -f' - ;; - -freebsd*) - case "$version_type" in - freebsd-elf*) - lt_cv_deplibs_check_method=pass_all - ;; - esac - ;; - -gnu*) - lt_cv_deplibs_check_method=pass_all - ;; - -irix5* | irix6*) - case "$host_os" in - irix5*) - # this will be overridden with pass_all, but let us keep it just in case - lt_cv_deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1" - ;; - *) - case "$LD" in - *-32|*"-32 ") libmagic=32-bit;; - *-n32|*"-n32 ") libmagic=N32;; - *-64|*"-64 ") libmagic=64-bit;; - *) libmagic=never-match;; - esac - # this will be overridden with pass_all, but let us keep it just in case - lt_cv_deplibs_check_method="file_magic ELF ${libmagic} MSB mips-[1234] dynamic lib MIPS - version 1" - ;; - esac - lt_cv_file_magic_test_file=`echo /lib${libsuff}/libc.so*` - lt_cv_deplibs_check_method=pass_all - ;; - -# This must be Linux ELF. -linux-gnu*) - case "$host_cpu" in - alpha* | i*86 | powerpc* | sparc* ) - lt_cv_deplibs_check_method=pass_all ;; - *) - # glibc up to 2.1.1 does not perform some relocations on ARM - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; - esac - lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` - ;; - -osf3* | osf4* | osf5*) - # this will be overridden with pass_all, but let us keep it just in case - lt_cv_deplibs_check_method='file_magic COFF format alpha shared library' - lt_cv_file_magic_test_file=/shlib/libc.so - lt_cv_deplibs_check_method=pass_all - ;; - -sco3.2v5*) - lt_cv_deplibs_check_method=pass_all - ;; - -solaris*) - lt_cv_deplibs_check_method=pass_all - lt_cv_file_magic_test_file=/lib/libc.so - ;; - -sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - case "$host_vendor" in - ncr) - lt_cv_deplibs_check_method=pass_all - ;; - motorola) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` - ;; - esac - ;; -esac - -fi -echo "$ECHO_T""$lt_cv_deplibs_check_method" 1>&6 -file_magic_cmd=$lt_cv_file_magic_cmd -deplibs_check_method=$lt_cv_deplibs_check_method - -if test $host != $build; then - ac_tool_prefix=${host_alias}- -else - ac_tool_prefix= -fi - -# Only perform the check for file, if the check method requires it -case "$deplibs_check_method" in -file_magic*) - if test "$file_magic_cmd" = '${MAGIC}'; then - -echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" 1>&6 -echo "configure:3308: checking for ${ac_tool_prefix}file" 1>&5 -if test "${lt_cv_path_MAGIC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - case "$MAGIC" in - /*) - lt_cv_path_MAGIC="$MAGIC" # Let the user override the test with a path. - ;; - ?:/*) - ac_cv_path_MAGIC="$MAGIC" # Let the user override the test with a dos path. - ;; - *) - ac_save_MAGIC="$MAGIC" - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="/usr/bin:$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/${ac_tool_prefix}file; then - lt_cv_path_MAGIC="$ac_dir/${ac_tool_prefix}file" - if test -n "$file_magic_test_file"; then - case "$deplibs_check_method" in - "file_magic "*) - file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" - MAGIC="$lt_cv_path_MAGIC" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - egrep "$file_magic_regex" > /dev/null; then - : - else - cat <&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -EOF - fi ;; - esac - fi - break - fi - done - IFS="$ac_save_ifs" - MAGIC="$ac_save_MAGIC" - ;; -esac -fi - -MAGIC="$lt_cv_path_MAGIC" -if test -n "$MAGIC"; then - echo "$ECHO_T""$MAGIC" 1>&6 -else - echo "$ECHO_T""no" 1>&6 -fi - -if test -z "$lt_cv_path_MAGIC"; then - if test -n "$ac_tool_prefix"; then - echo $ECHO_N "checking for file... $ECHO_C" 1>&6 -echo "configure:3370: checking for file" 1>&5 -if test "${lt_cv_path_MAGIC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - case "$MAGIC" in - /*) - lt_cv_path_MAGIC="$MAGIC" # Let the user override the test with a path. - ;; - ?:/*) - ac_cv_path_MAGIC="$MAGIC" # Let the user override the test with a dos path. - ;; - *) - ac_save_MAGIC="$MAGIC" - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="/usr/bin:$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/file; then - lt_cv_path_MAGIC="$ac_dir/file" - if test -n "$file_magic_test_file"; then - case "$deplibs_check_method" in - "file_magic "*) - file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" - MAGIC="$lt_cv_path_MAGIC" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - egrep "$file_magic_regex" > /dev/null; then - : - else - cat <&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -EOF - fi ;; - esac - fi - break - fi - done - IFS="$ac_save_ifs" - MAGIC="$ac_save_MAGIC" - ;; -esac -fi - -MAGIC="$lt_cv_path_MAGIC" -if test -n "$MAGIC"; then - echo "$ECHO_T""$MAGIC" 1>&6 -else - echo "$ECHO_T""no" 1>&6 -fi - - else - MAGIC=: - fi -fi - - fi - ;; -esac - -case "$target" in -NONE) lt_target="$host" ;; -*) lt_target="$target" ;; -esac - -# Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. -set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -echo $ECHO_N "checking for $ac_word... $ECHO_C" 1>&6 -echo "configure:3446: checking for $ac_word" 1>&5 -if test "${ac_cv_prog_RANLIB+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else - for ac_path in `IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" -ac_dummy="$PATH" -for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - echo "$ac_dir/$ac_word" - fi -done -IFS="$ac_save_ifs" -`; do - ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - break - done -fi -fi -RANLIB="$ac_cv_prog_RANLIB" -if test -n "$RANLIB"; then - echo "$ECHO_T""$RANLIB" 1>&6 -else - echo "$ECHO_T""no" 1>&6 -fi - -if test -z "$ac_cv_prog_RANLIB"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -echo $ECHO_N "checking for $ac_word... $ECHO_C" 1>&6 -echo "configure:3480: checking for $ac_word" 1>&5 -if test "${ac_cv_prog_RANLIB+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else - for ac_path in `IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" -ac_dummy="$PATH" -for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - echo "$ac_dir/$ac_word" - fi -done -IFS="$ac_save_ifs" -`; do - ac_cv_prog_RANLIB="ranlib" - break - done - test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":" -fi -fi -RANLIB="$ac_cv_prog_RANLIB" -if test -n "$RANLIB"; then - echo "$ECHO_T""$RANLIB" 1>&6 -else - echo "$ECHO_T""no" 1>&6 -fi - - else - RANLIB=":" - fi -fi - -# Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. -set dummy ${ac_tool_prefix}strip; ac_word=$2 -echo $ECHO_N "checking for $ac_word... $ECHO_C" 1>&6 -echo "configure:3518: checking for $ac_word" 1>&5 -if test "${ac_cv_prog_STRIP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else - for ac_path in `IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" -ac_dummy="$PATH" -for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - echo "$ac_dir/$ac_word" - fi -done -IFS="$ac_save_ifs" -`; do - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - break - done -fi -fi -STRIP="$ac_cv_prog_STRIP" -if test -n "$STRIP"; then - echo "$ECHO_T""$STRIP" 1>&6 -else - echo "$ECHO_T""no" 1>&6 -fi - -if test -z "$ac_cv_prog_STRIP"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -echo $ECHO_N "checking for $ac_word... $ECHO_C" 1>&6 -echo "configure:3552: checking for $ac_word" 1>&5 -if test "${ac_cv_prog_STRIP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else - for ac_path in `IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" -ac_dummy="$PATH" -for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - echo "$ac_dir/$ac_word" - fi -done -IFS="$ac_save_ifs" -`; do - ac_cv_prog_STRIP="strip" - break - done - test -z "$ac_cv_prog_STRIP" && ac_cv_prog_STRIP=":" -fi -fi -STRIP="$ac_cv_prog_STRIP" -if test -n "$STRIP"; then - echo "$ECHO_T""$STRIP" 1>&6 -else - echo "$ECHO_T""no" 1>&6 -fi - - else - STRIP=":" - fi -fi - -# Check for any special flags to pass to ltconfig. -libtool_flags="--cache-file=$cache_file" -test "$enable_shared" = no && libtool_flags="$libtool_flags --disable-shared" -test "$enable_static" = no && libtool_flags="$libtool_flags --disable-static" -test "$enable_fast_install" = no && libtool_flags="$libtool_flags --disable-fast-install" -test "$ac_cv_prog_gcc" = yes && libtool_flags="$libtool_flags --with-gcc" -test "$ac_cv_prog_gnu_ld" = yes && libtool_flags="$libtool_flags --with-gnu-ld" - -# Check whether --enable-libtool-lock or --disable-libtool-lock was given. -if test "${enable_libtool_lock+set}" = set; then - enableval="$enable_libtool_lock" - -fi -test "x$enable_libtool_lock" = xno && libtool_flags="$libtool_flags --disable-lock" -test x"$silent" = xyes && libtool_flags="$libtool_flags --silent" - -# Check whether --with-pic or --without-pic was given. -if test "${with_pic+set}" = set; then - withval="$with_pic" - pic_mode="$withval" -else - pic_mode=default -fi -test x"$pic_mode" = xyes && libtool_flags="$libtool_flags --prefer-pic" -test x"$pic_mode" = xno && libtool_flags="$libtool_flags --prefer-non-pic" - -# Some flags need to be propagated to the compiler or linker for good -# libtool support. -case "$lt_target" in -*-*-irix6*) - # Find out which ABI we are using. - echo '#line 3618 "configure"' > conftest.$ac_ext - if { (eval echo configure:3619: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then - case "`/usr/bin/file conftest.o`" in - *32-bit*) - LD="${LD-ld} -32" - ;; - *N32*) - LD="${LD-ld} -n32" - ;; - *64-bit*) - LD="${LD-ld} -64" - ;; - esac - fi - rm -rf conftest* - ;; - -*-*-sco3.2v5*) - # On SCO OpenServer 5, we need -belf to get full-featured binaries. - SAVE_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -belf" - echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" 1>&6 -echo "configure:3640: checking whether the C compiler needs -belf" 1>&5 -if test "${lt_cv_cc_needs_belf+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - - ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - - cat >conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - lt_cv_cc_needs_belf=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - lt_cv_cc_needs_belf=no -fi -rm -f conftest* - - ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -fi -echo "$ECHO_T""$lt_cv_cc_needs_belf" 1>&6 - if test x"$lt_cv_cc_needs_belf" != x"yes"; then - # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf - CFLAGS="$SAVE_CFLAGS" - fi - ;; - -esac - -# Save cache, so that ltconfig can load it -cat >confcache <<\EOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs. It is not useful on other systems. -# If it contains results you don't want to keep, you may remove or edit it. -# -# By default, configure uses ./config.cache as the cache file, -# creating it if it does not exist already. You can give configure -# the --cache-file=FILE option to use a different cache file; that is -# what configure does when it calls configure scripts in -# subdirectories, so they share the cache. -# Giving --cache-file=/dev/null disables caching, for debugging configure. -# config.status only pays attention to the cache file if you give it the -# --recheck option to rerun configure. -# -EOF -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, don't put newlines in cache variables' values. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -(set) 2>&1 | - case `(ac_space=' '; set | grep ac_space) 2>&1` in - *ac_space=\ *) - # `set' does not quote correctly, so add quotes (double-quote substitution - # turns \\\\ into \\, and sed turns \\ into \). - sed -n \ - -e "s/'/'\\\\''/g" \ - -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" - ;; - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' - ;; - esac >>confcache -if cmp -s $cache_file confcache; then :; else - if test -w $cache_file; then - echo "updating cache $cache_file" - cat confcache >$cache_file - else - echo "not updating unwritable cache $cache_file" - fi -fi -rm -f confcache - -# Actually configure libtool. ac_aux_dir is where install-sh is found. -AR="$AR" CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" \ -MAGIC="$MAGIC" LD="$LD" LDFLAGS="$LDFLAGS" LIBS="$LIBS" \ -LN_S="$LN_S" NM="$NM" RANLIB="$RANLIB" STRIP="$STRIP" \ -AS="$AS" DLLTOOL="$DLLTOOL" OBJDUMP="$OBJDUMP" \ -objext="$OBJEXT" exeext="$EXEEXT" reload_flag="$reload_flag" \ -deplibs_check_method="$deplibs_check_method" file_magic_cmd="$file_magic_cmd" \ -${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig --no-reexec \ -$libtool_flags --no-verify --build="$build" $ac_aux_dir/ltmain.sh $lt_target \ -|| { echo "configure: error: libtool configure failed" 1>&2; exit 1; } - -# Reload cache, that may have been modified by ltconfig -if test -r "$cache_file"; then - echo "loading cache $cache_file" - test -f "$cache_file" && . $cache_file -else - echo "creating cache $cache_file" - >$cache_file -fi - -# This can be used to rebuild libtool when needed -LIBTOOL_DEPS="$ac_aux_dir/ltconfig $ac_aux_dir/ltmain.sh" - -# Always use our own libtool. -LIBTOOL='$(SHELL) $(top_builddir)/libtool' - -# Redirect the config.log output again, so that the ltconfig log is not -# clobbered by the next message. -exec 5>>./config.log - -echo $ECHO_N "checking whether optarg is declared... $ECHO_C" 1>&6 -echo "configure:3769: checking whether optarg is declared" 1>&5 -if test "${ac_cv_have_decl_optarg+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - cat >conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - ac_cv_have_decl_optarg=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_have_decl_optarg=no -fi -rm -f conftest* -fi -echo "$ECHO_T""$ac_cv_have_decl_optarg" 1>&6 -if test $ac_cv_have_decl_optarg = yes; then - cat >>confdefs.h <>confdefs.h <&6 -echo "configure:3813: checking for ANSI C header files" 1>&5 -if test "${ac_cv_header_stdc+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - -cat >conftest.$ac_ext < -#include -#include -#include - -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:3828: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - rm -rf conftest* - ac_cv_header_stdc=yes -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - -cat >conftest.$ac_ext < - -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "memchr" >/dev/null 2>&1; then - : -else - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - -cat >conftest.$ac_ext < - -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "free" >/dev/null 2>&1; then - : -else - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. -if test "$cross_compiling" = yes; then - : -else - cat >conftest.$ac_ext < -#if ((' ' & 0x0FF) == 0x020) -# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#else -# define ISLOWER(c) (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) -# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) -#endif - -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int -main () -{ - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - exit(2); - exit (0); -} -EOF -if { (eval echo configure:3913: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null -then - : -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -fr conftest* - ac_cv_header_stdc=no -fi -rm -fr conftest* - -fi - -fi -fi -echo "$ECHO_T""$ac_cv_header_stdc" 1>&6 -if test $ac_cv_header_stdc = yes; then - cat >>confdefs.h <<\EOF -#define STDC_HEADERS 1 -EOF - -fi - -for ac_header in getopt.h unistd.h sys/sysctl.h sys/time.h -do -ac_ac_Header=`echo "ac_cv_header_$ac_header" | $ac_tr_sh` -echo $ECHO_N "checking for $ac_header... $ECHO_C" 1>&6 -echo "configure:3940: checking for $ac_header" 1>&5 -if eval "test \"\${$ac_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - -cat >conftest.$ac_ext < - -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:3952: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - rm -rf conftest* - eval "$ac_ac_Header=yes" -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "$ac_ac_Header=no" -fi -rm -f conftest* -fi -echo "$ECHO_T""`eval echo '${'$ac_ac_Header'}'`" 1>&6 -if test `eval echo '${'$ac_ac_Header'}'` = yes; then - cat >>confdefs.h <&6 -echo "configure:3976: checking for void" 1>&5 -if test "${ac_cv_type_void+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - cat >conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - ac_cv_type_void=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_type_void=no -fi -rm -f conftest* -fi -echo "$ECHO_T""$ac_cv_type_void" 1>&6 -if test $ac_cv_type_void = yes; then - cat >>confdefs.h <&6 -echo "configure:4015: checking for preprocessor stringizing operator" 1>&5 -if test "${ac_cv_c_stringize+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - -cat >conftest.$ac_ext <&5 | - egrep "#teststring" >/dev/null 2>&1; then - rm -rf conftest* - ac_cv_c_stringize=no -else - rm -rf conftest* - ac_cv_c_stringize=yes -fi -rm -f conftest* - -fi - -if test "${ac_cv_c_stringize}" = yes; then - cat >>confdefs.h <<\EOF -#define HAVE_STRINGIZE 1 -EOF - -fi -echo "$ECHO_T""${ac_cv_c_stringize}" 1>&6 - -for ac_func in getopt_long getpagesize popen processor_info strtoul sysconf sysctlbyname -do -ac_ac_var=`echo "ac_cv_func_$ac_func" | $ac_tr_sh` -echo $ECHO_N "checking for $ac_func... $ECHO_C" 1>&6 -echo "configure:4053: checking for $ac_func" 1>&5 -if eval "test \"\${$ac_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - cat >conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func(); -char (*f)(); - -int -main() -{ - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -f = $ac_func; -#endif - - ; - return 0; -} -EOF -if { (eval echo configure:4086: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "$ac_ac_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "$ac_ac_var=no" -fi -rm -f conftest* - -fi -echo "$ECHO_T""`eval echo '${'$ac_ac_var'}'`" 1>&6 -if test `eval echo '${'$ac_ac_var'}'` = yes; then - cat >>confdefs.h <&6 -echo "configure:4108: checking if ansi2knr should be used" 1>&5 -if test "${gmp_cv_c_ansi2knr+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - cat >conftest.c <&5; (eval $ac_compile) 2>&5; }; then - gmp_cv_c_ansi2knr=no -else - gmp_cv_c_ansi2knr=yes -fi -rm -f conftest.* - -fi -echo "$ECHO_T""$gmp_cv_c_ansi2knr" 1>&6 -if test $gmp_cv_c_ansi2knr = no; then - U= ANSI2KNR= -else - U=_ ANSI2KNR=./ansi2knr - # Ensure some checks needed by ansi2knr itself. - -echo $ECHO_N "checking for ANSI C header files... $ECHO_C" 1>&6 -echo "configure:4131: checking for ANSI C header files" 1>&5 -if test "${ac_cv_header_stdc+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - -cat >conftest.$ac_ext < -#include -#include -#include - -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:4146: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - rm -rf conftest* - ac_cv_header_stdc=yes -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - -cat >conftest.$ac_ext < - -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "memchr" >/dev/null 2>&1; then - : -else - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - -cat >conftest.$ac_ext < - -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "free" >/dev/null 2>&1; then - : -else - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. -if test "$cross_compiling" = yes; then - : -else - cat >conftest.$ac_ext < -#if ((' ' & 0x0FF) == 0x020) -# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#else -# define ISLOWER(c) (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) -# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) -#endif - -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int -main () -{ - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - exit(2); - exit (0); -} -EOF -if { (eval echo configure:4231: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null -then - : -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -fr conftest* - ac_cv_header_stdc=no -fi -rm -fr conftest* - -fi - -fi -fi -echo "$ECHO_T""$ac_cv_header_stdc" 1>&6 -if test $ac_cv_header_stdc = yes; then - cat >>confdefs.h <<\EOF -#define STDC_HEADERS 1 -EOF - -fi - - for ac_header in string.h -do -ac_ac_Header=`echo "ac_cv_header_$ac_header" | $ac_tr_sh` -echo $ECHO_N "checking for $ac_header... $ECHO_C" 1>&6 -echo "configure:4258: checking for $ac_header" 1>&5 -if eval "test \"\${$ac_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" 1>&6 -else - -cat >conftest.$ac_ext < - -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:4270: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - rm -rf conftest* - eval "$ac_ac_Header=yes" -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "$ac_ac_Header=no" -fi -rm -f conftest* -fi -echo "$ECHO_T""`eval echo '${'$ac_ac_Header'}'`" 1>&6 -if test `eval echo '${'$ac_ac_Header'}'` = yes; then - cat >>confdefs.h <asm-syntax.h - cat $srcdir/mpn/underscore.h >>asm-syntax.h - echo '#include "'$srcdir'/mpn/m68k/syntax.h"' >>asm-syntax.h;; - m68k-no-nolog-elf) - echo '#define ELF_SYNTAX' >asm-syntax.h - echo '#define C_SYMBOL_NAME(name) name' >>asm-syntax.h - echo '#include "'$srcdir'/mpn/m68k/syntax.h"' >>asm-syntax.h;; -esac - -# The pattern here tests for an absolute path the same way as -# _AC_OUTPUT_FILES in autoconf acgeneral.m4. - -echo "dnl CONFIG_TOP_SRCDIR is a path from the mpn builddir to the top srcdir" >> $gmp_tmpconfigm4 - -case "$srcdir" in -[\\/]* | ?:[\\/]* ) - -echo "define(,<\`$srcdir'>)" >> $gmp_tmpconfigm4 - ;; -*) - -echo "define(,<\`../$srcdir'>)" >> $gmp_tmpconfigm4 - ;; -esac - -echo "include(CONFIG_TOP_SRCDIR\`/mpn/asm-defs.m4')" >> $gmp_tmpconfigm4p - -# Must be after asm-defs.m4 - -echo "define_not_for_expansion(\`HAVE_TARGET_CPU_$target_cpu')" >> $gmp_tmpconfigm4p - -case "$target" in - alpha*-cray-unicos*) - gmp_m4postinc="alpha/unicos.m4" - ;; - alpha*-*-*) - gmp_m4postinc="alpha/default.m4" - ;; - power*-*-*) - case "$target" in - *-*-mach* | *-*-rhapsody* | *-*-nextstep* | *-*-darwin* | *-*-macosx*) - ;; # these use non-conventional assembly syntax. - powerpc64-*-aix*) - gmp_m4postinc="powerpc32/regmap.m4 powerpc64/aix.m4" - ;; - *-*-aix*) - gmp_m4postinc="powerpc32/regmap.m4 powerpc32/aix.m4" - ;; - *) - gmp_m4postinc="powerpc32/regmap.m4" - ;; - esac - ;; -esac - -for tmp_f in $gmp_m4postinc; do - -echo "include_mpn(\`$tmp_f')" >> $gmp_tmpconfigm4p - -done - -# Set up `gmp_links'. It's a list of link:file pairs that configure will -# process to create link -> file. -gmp_links= - -# If the user specified `MPN_PATH', use that instead of the path we've -# come up with. -if test -z "$MPN_PATH"; then - path="$path generic" -else - path="$MPN_PATH" -fi - -# Pick the correct source files in $path and link them to mpn/. -# $gmp_mpn_functions lists all functions we need. -# -# The rule is to find a file with the function name and a .asm, .S, -# .s, or .c extension. Certain multi-function files with special names -# can provide some functions too. (mpn/Makefile.am passes -# -DOPERATION_ to get them to generate the right code.) - -# FIXME: udiv and umul aren't in $gmp_mpn_functions_optional yet since -# there's some versions of those files which should be checked for bit -# rot first. Put them in $extra_functions for each target for now, -# change to standard optionals when all are ready. - -# Note: The following lines defining $gmp_mpn_functions_optional -# and $gmp_mpn_functions are parsed by the "macos/configure" -# Perl script. So if you change the lines in a major way -# make sure to run and examine the output from -# -# % (cd macos; perl configure) - -gmp_mpn_functions_optional="copyi copyd com_n \ - and_n andn_n nand_n ior_n iorn_n nior_n xor_n xnor_n" - -gmp_mpn_functions="${extra_functions} inlines add_n sub_n mul_1 addmul_1 \ - submul_1 lshift rshift diveby3 divrem divrem_1 divrem_2 \ - mod_1 mod_1_rs pre_mod_1 dump \ - mul mul_fft mul_n mul_basecase sqr_basecase random \ - random2 sqrtrem get_str set_str scan0 scan1 popcount hamdist cmp perfsqr \ - bdivmod gcd_1 gcd gcdext tdiv_qr bz_divrem_n sb_divrem_mn jacbase \ - $gmp_mpn_functions_optional" - -# the list of all object files used by mpn/Makefile.in and the -# top-level Makefile.in, respectively -mpn_objects= -mpn_objs_in_libgmp="mpn/mp_bases.lo" - -# SLPJ trace -echo "Peering at file structure (takes a while)..." 1>&6 - -for tmp_fn in ${gmp_mpn_functions} ; do -# SLPJ trace - echo "...$tmp_fn..." 1>&6 - -# This line was -# rm -f mpn/${tmp_fn}.[Ssc] mpn/${tmp_fn}.asm -# but I found that on my NT workstation the command -# would unpredictably hang. rm wasn't an active process, -# but absolutlely nothing was happening. -# I *think* that expanding the [Ssc] cures the problem -# SLPJ May 01 - rm -f mpn/${tmp_fn}.S mpn/${tmp_fn}.s mpn/${tmp_fn}.c mpn/${tmp_fn}.asm - - echo "...$tmp_fn (done rm)..." 1>&6 - - # functions that can be provided by multi-function files - tmp_mulfunc= - case $tmp_fn in - add_n|sub_n) tmp_mulfunc="aors_n" ;; - addmul_1|submul_1) tmp_mulfunc="aorsmul_1" ;; - popcount|hamdist) tmp_mulfunc="popham" ;; - and_n|andn_n|nand_n | ior_n|iorn_n|nior_n | xor_n|xnor_n) - tmp_mulfunc="logops_n" ;; - esac - - found=no - for tmp_dir in $path; do - -# SLPJ trace -# We get stuck sometimes - echo " ...dir $tmp_dir..." 1>&6 - for tmp_base in $tmp_fn $tmp_mulfunc; do - -# SLPJ trace -# We get stuck sometimes - echo " ...base $tmp_base..." 1>&6 - for tmp_ext in asm S s c; do - tmp_file=$srcdir/mpn/$tmp_dir/$tmp_base.$tmp_ext - -# SLPJ trace -# We get stuck sometimes - echo " ...$tmp_file..." 1>&6 - - if test -f $tmp_file; then - found=yes - - mpn_objects="$mpn_objects ${tmp_fn}.lo" - mpn_objs_in_libgmp="$mpn_objs_in_libgmp mpn/${tmp_fn}.lo" - gmp_links="$gmp_links mpn/$tmp_fn.$tmp_ext:mpn/$tmp_dir/$tmp_base.$tmp_ext" - - # duplicate AC_DEFINEs are harmless, so it doesn't matter - # that multi-function files get grepped here repeatedly - gmp_ep="` - sed -n 's/^[ ]*MULFUNC_PROLOGUE(\(.*\))/\1/p' $tmp_file ; - sed -n 's/^[ ]*PROLOGUE.*(\(.*\))/\1/p' $tmp_file - `" - for gmp_tmp in $gmp_ep; do - cat >>confdefs.h <&2; exit 1; } - fi - fi -done - - -# Create link for gmp-mparam.h. - -# SLPJ trace -echo "Creating link for gmp-mparam.h..." 1>&6 - -for tmp_dir in $path ; do - rm -f gmp-mparam.h - if test -f $srcdir/mpn/${tmp_dir}/gmp-mparam.h ; then - gmp_links="$gmp_links gmp-mparam.h:mpn/${tmp_dir}/gmp-mparam.h" - - # Copy any KARATSUBA_SQR_THRESHOLD in gmp-mparam.h to config.m4. - # Some versions of sqr_basecase.asm use this. - tmp_gmp_karatsuba_sqr_threshold="`sed -n 's/^#define KARATSUBA_SQR_THRESHOLD[ ]*\([0-9][0-9]*\).*$/\1/p' $srcdir/mpn/${tmp_dir}/gmp-mparam.h`" - if test -n "$tmp_gmp_karatsuba_sqr_threshold"; then - -echo "define(,<$tmp_gmp_karatsuba_sqr_threshold>)" >> $gmp_tmpconfigm4 - - fi - - break - fi -done - -# SLPJ trace -echo "Digging out links to include in DISTCLEANFILES..." 1>&6 - -# Dig out the links from `gmp_links' for inclusion in DISTCLEANFILES. -gmp_srclinks= -for f in $gmp_links; do - gmp_srclinks="$gmp_srclinks `echo $f | sed 's/\(.*\):.*/\1/'`" -done - -echo "creating $gmp_configm4" -echo "dnl $gmp_configm4. Generated automatically by configure." > $gmp_configm4 -if test -f $gmp_tmpconfigm4; then - echo "changequote(<,>)dnl" >> $gmp_configm4 - echo "ifdef(<__CONFIG_M4_INCLUDED__>,,<" >> $gmp_configm4 - cat $gmp_tmpconfigm4 >> $gmp_configm4 - echo ">)" >> $gmp_configm4 - echo "changequote(\`,')dnl" >> $gmp_configm4 - rm $gmp_tmpconfigm4 -fi -echo "ifdef(\`__CONFIG_M4_INCLUDED__',,\`" >> $gmp_configm4 -if test -f $gmp_tmpconfigm4i; then - cat $gmp_tmpconfigm4i >> $gmp_configm4 - rm $gmp_tmpconfigm4i -fi -if test -f $gmp_tmpconfigm4p; then - cat $gmp_tmpconfigm4p >> $gmp_configm4 - rm $gmp_tmpconfigm4p -fi -echo "')" >> $gmp_configm4 -echo "define(\`__CONFIG_M4_INCLUDED__')" >> $gmp_configm4 - -trap '' 1 2 15 -cat >confcache <<\EOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs. It is not useful on other systems. -# If it contains results you don't want to keep, you may remove or edit it. -# -# By default, configure uses ./config.cache as the cache file, -# creating it if it does not exist already. You can give configure -# the --cache-file=FILE option to use a different cache file; that is -# what configure does when it calls configure scripts in -# subdirectories, so they share the cache. -# Giving --cache-file=/dev/null disables caching, for debugging configure. -# config.status only pays attention to the cache file if you give it the -# --recheck option to rerun configure. -# -EOF -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, don't put newlines in cache variables' values. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -(set) 2>&1 | - case `(ac_space=' '; set | grep ac_space) 2>&1` in - *ac_space=\ *) - # `set' does not quote correctly, so add quotes (double-quote substitution - # turns \\\\ into \\, and sed turns \\ into \). - sed -n \ - -e "s/'/'\\\\''/g" \ - -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" - ;; - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' - ;; - esac >>confcache -if cmp -s $cache_file confcache; then :; else - if test -w $cache_file; then - echo "updating cache $cache_file" - cat confcache >$cache_file - else - echo "not updating unwritable cache $cache_file" - fi -fi -rm -f confcache - -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -# Any assignment to VPATH causes Sun make to only execute -# the first set of double-colon rules, so remove it if not needed. -# If there is a colon in the path, we need to keep it. -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' -fi - -DEFS=-DHAVE_CONFIG_H - -: ${CONFIG_STATUS=./config.status} -trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 -echo creating $CONFIG_STATUS -cat >$CONFIG_STATUS </dev/null | sed 1q`: -# -# $0 $ac_configure_args -# -# Compiler output produced by configure, useful for debugging -# configure, is in ./config.log if it exists. - -# Files that config.status was made for. -config_files="\\ - Makefile mpn/Makefile mpz/Makefile" -config_headers="\\ - config.h:config.in" -config_links="\\ - $gmp_links" -config_commands="\\ - default-1" - -ac_cs_usage="\\ -\\\`$CONFIG_STATUS' instantiates files from templates according to the -current configuration. - -Usage: $CONFIG_STATUS [OPTIONS] FILE... - - --recheck Update $CONFIG_STATUS by reconfiguring in the same conditions - --version Print the version of Autoconf and exit - --help Display this help and exit - --file=FILE[:TEMPLATE] - Instantiate the configuration file FILE - --header=FILE[:TEMPLATE] - Instantiate the configuration header FILE - -Configuration files: -\$config_files - -Configuration headers: -\$config_headers - -Configuration links: -\$config_links - -Configuration commands: -\$config_commands - -Report bugs to ." - -ac_cs_version="\\ -$CONFIG_STATUS generated by autoconf version 2.14a. -Configured on host `(hostname || uname -n) 2>/dev/null | sed 1q` by - `echo "$0 $ac_configure_args" | sed 's/[\\"\`\$]/\\\\&/g'`" - -# Root of the tmp file names. Use pid to allow concurrent executions. -ac_cs_root=cs\$\$ -ac_given_srcdir=$srcdir -ac_given_INSTALL="$INSTALL" - -# If no file are specified by the user, then we need to provide default -# value. By we need to know if files were specified by the user. -ac_need_defaults=: -while test \$# != 0 -do - case "\$1" in - --*=*) - ac_option=\`echo "\$1" | sed -e 's/=.*//'\` - ac_optarg=\`echo "\$1" | sed -e 's/[^=]*=//'\` - shift - set dummy "\$ac_option" "\$ac_optarg" \${1+"\$@"} - shift - ;; - -*);; - *) # This is not an option, so the user has probably given explicit - # arguments. - ac_need_defaults=false;; - esac - - case "\$1" in - - # Handling of the options. - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - echo "running \${CONFIG_SHELL-/bin/sh} $0 `echo "$ac_configure_args" | sed 's/[\\"\`\$]/\\\\&/g'` --no-create --no-recursion" - exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; - -version | --version | --versio | --versi | --vers | --ver | --ve | --v) - echo "\$ac_cs_version"; exit 0 ;; - --he | --h) - # Conflict between --help and --header - echo "$CONFIG_STATUS: ambiguous option: \$ac_option -Try \\\`$CONFIG_STATUS --help' for more information."; exit 1 ;; - -help | --help | --hel ) - echo "\$ac_cs_usage"; exit 0 ;; - --file | --fil | --fi | --f ) - shift - CONFIG_FILES="\$CONFIG_FILES \$1" - ac_need_defaults=false;; - --header | --heade | --head | --hea ) - shift - CONFIG_HEADERS="\$CONFIG_FILES \$1" - ac_need_defaults=false;; - - # Handling of arguments. - 'Makefile' ) CONFIG_FILES="\$CONFIG_FILES Makefile" ;; - 'mpz/Makefile' ) CONFIG_FILES="\$CONFIG_FILES mpz/Makefile" ;; - 'mpn/Makefile' ) CONFIG_FILES="\$CONFIG_FILES mpn/Makefile" ;; - '$gmp_links' ) CONFIG_LINKS="\$CONFIG_LINKS $gmp_links" ;; - 'default-1' ) CONFIG_COMMANDS="\$CONFIG_COMMANDS default-1" ;; - 'config.h' ) CONFIG_HEADERS="\$CONFIG_HEADERS config.h:config.in" ;; - - # This is an error. - -*) echo "$CONFIG_STATUS: unrecognized option: \$1 -Try \\\`$CONFIG_STATUS --help' for more information."; exit 1 ;; - *) echo "$CONFIG_STATUS: invalid argument: \$1"; exit 1 ;; - esac - shift -done - -EOF - -cat >>$CONFIG_STATUS <<\EOF -# If the user did not use the arguments to specify the items to instantiate, -# then the envvar interface is used. Set only those that are not. -if $ac_need_defaults; then - : ${CONFIG_FILES=$config_files} - : ${CONFIG_HEADERS=$config_headers} - : ${CONFIG_LINKS=$config_links} - : ${CONFIG_COMMANDS=$config_commands} -fi - -# Trap to remove the temp files. -trap 'rm -fr $ac_cs_root*; exit 1' 1 2 15 - -EOF - -cat >>$CONFIG_STATUS <>$CONFIG_STATUS <\$ac_cs_root.subs <<\\CEOF -s%@exec_prefix@%$exec_prefix%;t t -s%@prefix@%$prefix%;t t -s%@program_transform_name@%$program_transform_name%;t t -s%@bindir@%$bindir%;t t -s%@sbindir@%$sbindir%;t t -s%@libexecdir@%$libexecdir%;t t -s%@datadir@%$datadir%;t t -s%@sysconfdir@%$sysconfdir%;t t -s%@sharedstatedir@%$sharedstatedir%;t t -s%@localstatedir@%$localstatedir%;t t -s%@libdir@%$libdir%;t t -s%@includedir@%$includedir%;t t -s%@oldincludedir@%$oldincludedir%;t t -s%@infodir@%$infodir%;t t -s%@mandir@%$mandir%;t t -s%@SHELL@%$SHELL%;t t -s%@ECHO_C@%$ECHO_C%;t t -s%@ECHO_N@%$ECHO_N%;t t -s%@ECHO_T@%$ECHO_T%;t t -s%@CFLAGS@%$CFLAGS%;t t -s%@CPPFLAGS@%$CPPFLAGS%;t t -s%@CXXFLAGS@%$CXXFLAGS%;t t -s%@FFLAGS@%$FFLAGS%;t t -s%@DEFS@%$DEFS%;t t -s%@LDFLAGS@%$LDFLAGS%;t t -s%@LIBS@%$LIBS%;t t -s%@host@%$host%;t t -s%@host_alias@%$host_alias%;t t -s%@host_cpu@%$host_cpu%;t t -s%@host_vendor@%$host_vendor%;t t -s%@host_os@%$host_os%;t t -s%@target@%$target%;t t -s%@target_alias@%$target_alias%;t t -s%@target_cpu@%$target_cpu%;t t -s%@target_vendor@%$target_vendor%;t t -s%@target_os@%$target_os%;t t -s%@build@%$build%;t t -s%@build_alias@%$build_alias%;t t -s%@build_cpu@%$build_cpu%;t t -s%@build_vendor@%$build_vendor%;t t -s%@build_os@%$build_os%;t t -s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%;t t -s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%;t t -s%@INSTALL_DATA@%$INSTALL_DATA%;t t -s%@PACKAGE@%$PACKAGE%;t t -s%@VERSION@%$VERSION%;t t -s%@ACLOCAL@%$ACLOCAL%;t t -s%@AUTOCONF@%$AUTOCONF%;t t -s%@AUTOMAKE@%$AUTOMAKE%;t t -s%@AUTOHEADER@%$AUTOHEADER%;t t -s%@MAKEINFO@%$MAKEINFO%;t t -s%@AMTAR@%$AMTAR%;t t -s%@install_sh@%$install_sh%;t t -s%@AWK@%$AWK%;t t -s%@SET_MAKE@%$SET_MAKE%;t t -s%@AMDEP@%$AMDEP%;t t -s%@AMDEPBACKSLASH@%$AMDEPBACKSLASH%;t t -s%@DEPDIR@%$DEPDIR%;t t -s%@MAINTAINER_MODE_TRUE@%$MAINTAINER_MODE_TRUE%;t t -s%@MAINTAINER_MODE_FALSE@%$MAINTAINER_MODE_FALSE%;t t -s%@MAINT@%$MAINT%;t t -s%@WANT_MPBSD_TRUE@%$WANT_MPBSD_TRUE%;t t -s%@WANT_MPBSD_FALSE@%$WANT_MPBSD_FALSE%;t t -s%@WANT_MPFR_TRUE@%$WANT_MPFR_TRUE%;t t -s%@WANT_MPFR_FALSE@%$WANT_MPFR_FALSE%;t t -s%@CC@%$CC%;t t -s%@CCAS@%$CCAS%;t t -s%@CPP@%$CPP%;t t -s%@LN_S@%$LN_S%;t t -s%@M4@%$M4%;t t -s%@AR@%$AR%;t t -s%@CALLING_CONVENTIONS_OBJS@%$CALLING_CONVENTIONS_OBJS%;t t -s%@SPEED_CYCLECOUNTER_OBJS@%$SPEED_CYCLECOUNTER_OBJS%;t t -s%@EXEEXT@%$EXEEXT%;t t -s%@OBJEXT@%$OBJEXT%;t t -s%@RANLIB@%$RANLIB%;t t -s%@STRIP@%$STRIP%;t t -s%@LIBTOOL@%$LIBTOOL%;t t -s%@U@%$U%;t t -s%@ANSI2KNR@%$ANSI2KNR%;t t -s%@mpn_objects@%$mpn_objects%;t t -s%@mpn_objs_in_libgmp@%$mpn_objs_in_libgmp%;t t -s%@gmp_srclinks@%$gmp_srclinks%;t t -CEOF - -EOF - - cat >>$CONFIG_STATUS <<\EOF - # Split the substitutions into bite-sized pieces for seds with - # small command number limits, like on Digital OSF/1 and HP-UX. - ac_max_sed_lines=48 - ac_sed_frag=1 # Number of current file. - ac_beg=1 # First line for current file. - ac_end=$ac_max_sed_lines # Line after last line for current file. - ac_more_lines=: - ac_sed_cmds="" - while $ac_more_lines; do - if test $ac_beg -gt 1; then - sed "1,${ac_beg}d; ${ac_end}q" $ac_cs_root.subs >$ac_cs_root.sfrag - else - sed "${ac_end}q" $ac_cs_root.subs >$ac_cs_root.sfrag - fi - if test ! -s $ac_cs_root.sfrag; then - ac_more_lines=false - rm -f $ac_cs_root.sfrag - else - # The purpose of the label and of the branching condition is to - # speed up the sed processing (if there are no `@' at all, there - # is no need to browse any of the substitutions). - # These are the two extra sed commands mentioned above. - (echo ':t - /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $ac_cs_root.sfrag) >$ac_cs_root.s$ac_sed_frag - if test -z "$ac_sed_cmds"; then - ac_sed_cmds="sed -f $ac_cs_root.s$ac_sed_frag" - else - ac_sed_cmds="$ac_sed_cmds | sed -f $ac_cs_root.s$ac_sed_frag" - fi - ac_sed_frag=`expr $ac_sed_frag + 1` - ac_beg=$ac_end - ac_end=`expr $ac_end + $ac_max_sed_lines` - fi - done - if test -z "$ac_sed_cmds"; then - ac_sed_cmds=cat - fi -fi # test -n "$CONFIG_FILES" - -EOF -cat >>$CONFIG_STATUS <<\EOF -for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then - # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". - case "$ac_file" in - *:*) ac_file_in=`echo "$ac_file" | sed 's%[^:]*:%%'` - ac_file=`echo "$ac_file" | sed 's%:.*%%'` ;; - *) ac_file_in="${ac_file}.in" ;; - esac - - # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. - - # Remove last slash and all that follows it. Not all systems have dirname. - ac_dir=`echo "$ac_file" | sed 's%/[^/][^/]*$%%'` - if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then - # The file is in a subdirectory. - test ! -d "$ac_dir" && mkdir "$ac_dir" - ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" - # A "../" for each directory in $ac_dir_suffix. - ac_dots=`echo "$ac_dir_suffix" | sed 's%/[^/]*%../%g'` - else - ac_dir_suffix= ac_dots= - fi - - case "$ac_given_srcdir" in - .) srcdir=. - if test -z "$ac_dots"; then top_srcdir=. - else top_srcdir=`echo $ac_dots | sed 's%/$%%'`; fi ;; - [\\/]* | ?:[\\/]* ) - srcdir="$ac_given_srcdir$ac_dir_suffix"; - top_srcdir=$ac_given_srcdir ;; - *) # Relative path. - srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" - top_srcdir="$ac_dots$ac_given_srcdir" ;; - esac - - case "$ac_given_INSTALL" in - [\\/$]* | ?:[\\/]* ) INSTALL="$ac_given_INSTALL" ;; - *) INSTALL="$ac_dots$ac_given_INSTALL" ;; - esac - - echo creating "$ac_file" - rm -f "$ac_file" - configure_input="Generated automatically from `echo $ac_file_in | - sed 's%.*/%%'` by configure." - case "$ac_file" in - *[Mm]akefile*) ac_comsub="1i\\ -# $configure_input" ;; - *) ac_comsub= ;; - esac - - # Don't redirect the output to AC_FILE directly: use `mv' so that updating - # is atomic, and doesn't need trapping. - ac_file_inputs=`echo "$ac_file_in" | - sed -e "s%:% $ac_given_srcdir/%g;s%^%$ac_given_srcdir/%"` - for ac_file_input in $ac_file_inputs; - do - test -f "$ac_file_input" || - { echo "configure: error: cannot find input file \`$ac_file_input'" 1>&2; exit 1; } - done -EOF -cat >>$CONFIG_STATUS <>$CONFIG_STATUS <<\EOF -:t -/@[a-zA-Z_][a-zA-Z_0-9]*@/!b -s%@configure_input@%$configure_input%;t t -s%@srcdir@%$srcdir%;t t -s%@top_srcdir@%$top_srcdir%;t t -s%@INSTALL@%$INSTALL%;t t -" $ac_file_inputs | (eval "$ac_sed_cmds") >$ac_cs_root.out - mv $ac_cs_root.out $ac_file - -fi; done -rm -f $ac_cs_root.s* -EOF -cat >>$CONFIG_STATUS <<\EOF - -# -# CONFIG_HEADER section. -# - -# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where -# NAME is the cpp macro being defined and VALUE is the value it is being given. -# -# ac_d sets the value in "#define NAME VALUE" lines. -ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)' -ac_dB='[ ].*$%\1#\2' -ac_dC=' ' -ac_dD='%;t' -# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE". -ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' -ac_uB='$%\1#\2define\3' -ac_uC=' ' -ac_uD='%;t' - -for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then - # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". - case "$ac_file" in - *:*) ac_file_in=`echo "$ac_file" | sed 's%[^:]*:%%'` - ac_file=`echo "$ac_file" | sed 's%:.*%%'` ;; - *) ac_file_in="${ac_file}.in" ;; - esac - - echo creating $ac_file - - rm -f $ac_cs_root.frag $ac_cs_root.in $ac_cs_root.out - ac_file_inputs=`echo "$ac_file_in" | - sed -e "s%:% $ac_given_srcdir/%g;s%^%$ac_given_srcdir/%"` - for ac_file_input in $ac_file_inputs; - do - test -f "$ac_file_input" || - { echo "configure: error: cannot find input file \`$ac_file_input'" 1>&2; exit 1; } - done - # Remove the trailing spaces. - sed -e 's/[ ]*$//' $ac_file_inputs >$ac_cs_root.in - -EOF - -# Transform confdefs.h into two sed scripts, `conftest.defines' and -# `conftest.undefs', that substitutes the proper values into -# config.h.in to produce config.h. The first handles `#define' -# templates, and the second `#undef' templates. -# And first: Protect against being on the right side of a sed subst in -# config.status. Protect against being in an unquoted here document -# in config.status. -rm -f conftest.defines conftest.undefs -ac_cs_root=conftest -cat >$ac_cs_root.hdr <<\EOF -s/[\\&%]/\\&/g -s%[\\$`]%\\&%g -t clear -: clear -s%^[ ]*#[ ]*define[ ][ ]*\(\([^ (][^ (]*\)([^)]*)\)[ ]*\(.*\)$%${ac_dA}\2${ac_dB}\1${ac_dC}\3${ac_dD}%gp -t cleanup -s%^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp -: cleanup -EOF -# If some macros were called several times there might be several times -# the same #defines, which is useless. Nevertheless, we may not want to -# sort them, since we want the *last* AC_DEFINE to be honored. -uniq confdefs.h | sed -n -f $ac_cs_root.hdr >conftest.defines -sed -e 's/ac_d/ac_u/g' conftest.defines >conftest.undefs -rm -f $ac_cs_root.hdr - -# This sed command replaces #undef with comments. This is necessary, for -# example, in the case of _POSIX_SOURCE, which is predefined and required -# on some systems where configure will not decide to define it. -cat >>conftest.undefs <<\EOF -s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */% -EOF - -# Break up conftest.defines because some shells have a limit on the size -# of here documents, and old seds have small limits too (100 cmds). -echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS -echo ' if egrep "^[ ]*#[ ]*define" $ac_cs_root.in >/dev/null; then' >>$CONFIG_STATUS -echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS -echo ' :' >>$CONFIG_STATUS -rm -f conftest.tail -while grep . conftest.defines >/dev/null -do - # Write a limited-size here document to $ac_cs_root.frag. - echo ' cat >$ac_cs_root.frag <>$CONFIG_STATUS - echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS - sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS - echo 'CEOF - sed -f $ac_cs_root.frag $ac_cs_root.in >$ac_cs_root.out - rm -f $ac_cs_root.in - mv $ac_cs_root.out $ac_cs_root.in -' >>$CONFIG_STATUS - sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail - rm -f conftest.defines - mv conftest.tail conftest.defines -done -rm -f conftest.defines -echo ' fi # egrep' >>$CONFIG_STATUS -echo >>$CONFIG_STATUS - -# Break up conftest.undefs because some shells have a limit on the size -# of here documents, and old seds have small limits too (100 cmds). -echo ' # Handle all the #undef templates' >>$CONFIG_STATUS -rm -f conftest.tail -while grep . conftest.undefs >/dev/null -do - # Write a limited-size here document to $ac_cs_root.frag. - echo ' cat >$ac_cs_root.frag <>$CONFIG_STATUS - echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS - sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS - echo 'CEOF - sed -f $ac_cs_root.frag $ac_cs_root.in >$ac_cs_root.out - rm -f $ac_cs_root.in - mv $ac_cs_root.out $ac_cs_root.in -' >>$CONFIG_STATUS - sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail - rm -f conftest.undefs - mv conftest.tail conftest.undefs -done -rm -f conftest.undefs - -cat >>$CONFIG_STATUS <<\EOF - rm -f $ac_cs_root.frag $ac_cs_root.h - echo "/* $ac_file. Generated automatically by configure. */" >$ac_cs_root.h - cat $ac_cs_root.in >>$ac_cs_root.h - rm -f $ac_cs_root.in - if cmp -s $ac_file $ac_cs_root.h 2>/dev/null; then - echo "$ac_file is unchanged" - rm -f $ac_cs_root.h - else - # Remove last slash and all that follows it. Not all systems have dirname. - ac_dir=`echo "$ac_file" | sed 's%/[^/][^/]*$%%'` - if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then - # The file is in a subdirectory. - test ! -d "$ac_dir" && mkdir "$ac_dir" - fi - rm -f $ac_file - mv $ac_cs_root.h $ac_file - fi -fi; done -EOF -cat >>$CONFIG_STATUS <<\EOF - -# -# CONFIG_LINKS section. -# -srcdir=$ac_given_srcdir - -for ac_file in : $CONFIG_LINKS; do if test "x$ac_file" != x:; then - ac_dest=`echo "$ac_file" | sed 's%:.*%%'` - ac_source=`echo "$ac_file" | sed 's%[^:]*:%%'` - - echo "copying $srcdir/$ac_source to $ac_dest" - - if test ! -r $srcdir/$ac_source; then - { echo "configure: error: $srcdir/$ac_source: File not found" 1>&2; exit 1; } - fi - rm -f $ac_dest - - # Make relative symlinks. - # Remove last slash and all that follows it. Not all systems have dirname. - ac_dest_dir=`echo $ac_dest | sed 's%/[^/][^/]*$%%'` - if test "$ac_dest_dir" != "$ac_dest" && test "$ac_dest_dir" != .; then - # The dest file is in a subdirectory. - test ! -d "$ac_dest_dir" && mkdir "$ac_dest_dir" - ac_dest_dir_suffix="/`echo $ac_dest_dir|sed 's%^\./%%'`" - # A "../" for each directory in $ac_dest_dir_suffix. - ac_dots=`echo $ac_dest_dir_suffix|sed 's%/[^/]*%../%g'` - else - ac_dest_dir_suffix= ac_dots= - fi - - case "$srcdir" in - [\\/$]* | ?:[\\/]* ) ac_rel_source="$srcdir/$ac_source" ;; - *) ac_rel_source="$ac_dots$srcdir/$ac_source" ;; - esac - - # Note: Dodgy local mods to 'make things work' in an environment (cygwin) - # that supports symlinks (through silly hack) using tools that don't - # understand them (mingw). The end sometimes justifies the means, son. - # - # Make a symlink if possible; otherwise try a hard link. - #if ln -s $ac_rel_source $ac_dest 2>/dev/null || - # ln $srcdir/$ac_source $ac_dest; then : - # - # Note: If the -p offends your 'cp', just drop it; no harm done, you'll just - # get more recompilations. - # - if cp -p $srcdir/$ac_source $ac_dest; then : - else - { echo "configure: error: cannot copy $ac_dest to $srcdir/$ac_source" 1>&2; exit 1; } - fi -fi; done -EOF -cat >>$CONFIG_STATUS <<\EOF - -# -# CONFIG_COMMANDS section. -# -for ac_file in .. $CONFIG_COMMANDS; do if test "x$ac_file" != x..; then - ac_dest=`echo "$ac_file" | sed 's%:.*%%'` - ac_source=`echo "$ac_file" | sed 's%[^:]*:%%'` - - case "$ac_dest" in - default-1 ) test -z "$CONFIG_HEADERS" || echo timestamp > stamp-h ;; - esac -fi;done -EOF - -cat >>$CONFIG_STATUS <<\EOF - -exit 0 -EOF -chmod +x $CONFIG_STATUS -rm -fr confdefs* $ac_clean_files -trap 'exit 1' 1 2 15 - -test "$no_create" = yes || $SHELL $CONFIG_STATUS || exit 1 diff --git a/rts/gmp/configure.in b/rts/gmp/configure.in deleted file mode 100644 index 18f610f..0000000 --- a/rts/gmp/configure.in +++ /dev/null @@ -1,950 +0,0 @@ -dnl Process this file with autoconf to produce a configure script. - - -dnl Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published -dnl by the Free Software Foundation; either version 2.1 of the License, or (at -dnl your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - - -AC_REVISION($Revision: 1.8 $)dnl -AC_PREREQ(2.14)dnl -AC_INIT(gmp-impl.h) - -dnl Check system. -AC_CANONICAL_SYSTEM - -dnl Automake -AM_INIT_AUTOMAKE(gmp, GMP_VERSION) -AM_CONFIG_HEADER(config.h:config.in) -AM_MAINTAINER_MODE - -dnl GMP specific -GMP_INIT(config.m4) - - -AC_ARG_ENABLE(assert, -AC_HELP_STRING([--enable-assert],[enable ASSERT checking [default=no]]), -[case "${enableval}" in -yes|no) ;; -*) AC_MSG_ERROR([bad value ${enableval} for --enable-assert, need yes or no]) ;; -esac], -[enable_assert=no]) - -if test "$enable_assert" = "yes"; then - AC_DEFINE(WANT_ASSERT,1, - [./configure --enable-assert option, to enable some ASSERT()s]) -fi - - -AC_ARG_ENABLE(alloca, -AC_HELP_STRING([--enable-alloca],[use alloca for temp space [default=yes]]), -[case "${enableval}" in -yes|no) ;; -*) AC_MSG_ERROR([bad value ${enableval} for --enable-alloca, need yes or no]) ;; -esac], -[enable_alloca=yes]) - -if test "$enable_alloca" = "no"; then - AC_DEFINE(USE_STACK_ALLOC,1, - [./configure --disable-alloca option, to use stack-alloc.c, not alloca]) -fi - - -AC_ARG_ENABLE(fft, -AC_HELP_STRING([--enable-fft],[enable FFTs for multiplication [default=no]]), -[case "${enableval}" in -yes|no) ;; -*) AC_MSG_ERROR([bad value ${enableval} for --enable-fft, need yes or no]) ;; -esac], -[enable_fft=no]) - -if test "$enable_fft" = "yes"; then - AC_DEFINE(WANT_FFT,1, - [./configure --enable-fft option, to enable FFTs for multiplication]) -fi - - -AC_ARG_ENABLE(mpbsd, -AC_HELP_STRING([--enable-mpbsd],[build Berkley MP compatibility library [default=no]]), -[case "${enableval}" in -yes|no) ;; -*) AC_MSG_ERROR([bad value ${enableval} for --enable-mpbsd, need yes or no]) ;; -esac], -[enable_mpbsd=no]) -AM_CONDITIONAL(WANT_MPBSD, test "$enable_mpbsd" = "yes") - - -AC_ARG_ENABLE(mpfr, -AC_HELP_STRING([--enable-mpfr],[build MPFR [default=no]]), -[case "${enableval}" in -yes|no) ;; -*) AC_MSG_ERROR([bad value ${enableval} for --enable-mpfr, need yes or no]) ;; -esac], -[enable_mpfr=no]) -AM_CONDITIONAL(WANT_MPFR, test "$enable_mpfr" = "yes") - - -dnl Switch on OS and determine what compiler to use. -dnl -dnl os_64bit Set to "yes" if OS is 64-bit capable. -dnl FIXME: Rename to `check_64bit_compiler'! -dnl cclist List of compilers, best first. -dnl gmp_cflags_{cc} Flags for compiler named {cc}. -dnl gmp_cflags64_{cc} Flags for compiler named {cc} for 64-bit code. -dnl gmp_optcflags_{cc} Optional compiler flags. -dnl gmp_xoptcflags_{cc} Exclusive optional compiler flags. -dnl -os_64bit="no" -cclist="gcc cc" # FIXME: Prefer c89 to cc. -gmp_cflags_gcc="-g -O2" -gmp_cflags64_gcc="-g -O2" -gmp_cflags_cc="-g" -gmp_cflags64_cc="-g" - -case "$target" in - # Alpha - alpha*-cray-unicos*) - # Don't perform any assembly syntax tests on this beast. - gmp_no_asm_syntax_testing=yes - cclist=cc - gmp_cflags_cc="$gmp_cflags_cc -O" - ;; - alpha*-*-osf*) - flavour=`echo $target_cpu | sed 's/^alpha//g'` - if test -n "$flavour"; then - case $flavour in # compilers don't seem to understand `ev67' and such. - ev6? | ev7*) flavour=ev6;; - esac - gmp_optcflags_gcc="-mcpu=$flavour" - # FIXME: We shouldn't fail fatally if none of these work, but that's - # how xoptcflags work and we don't have any other mechanism right now. - # Why do we need this here and not for alpha*-*-* below? - gmp_xoptcflags_gcc="-Wa,-arch,${flavour} -Wa,-m${flavour}" - gmp_optcflags_cc="-arch $flavour -tune $flavour" - fi - ;; - alpha*-*-*) - cclist="gcc" - flavour=`echo $target_cpu | sed 's/^alpha//g'` - if test -n "$flavour"; then - case $flavour in - ev6? | ev7*) flavour=ev6;; - esac - gmp_optcflags_gcc="-mcpu=$flavour" - fi - ;; - # Cray vector machines. This must come after alpha* so that we can - # recognize present and future vector processors with a wildcard. - *-cray-unicos*) - # Don't perform any assembly syntax tests on this beast. - gmp_no_asm_syntax_testing=yes - cclist=cc - # Don't inherit default gmp_cflags_cc value; it comes with -g which - # disables all optimization on Cray vector systems - gmp_cflags_cc="-O" - ;; - - # AMD and Intel x86 configurations - [i?86*-*-* | k[5-8]*-*-* | pentium*-*-* | athlon-*-*]) - # Rumour has it -O2 used to give worse register allocation than just -O. - gmp_cflags_gcc="-g -O -fomit-frame-pointer" - - case "${target}" in - i386*-*-*) gmp_optcflags_gcc="-mcpu=i386 -march=i386";; - i486*-*-*) gmp_optcflags_gcc="-mcpu=i486 -march=i486";; - i586*-*-* | pentium-*-* | pentiummmx-*-*) - gmp_optcflags_gcc="-mcpu=pentium -march=pentium";; - - # -march=pentiumpro not used because mpz/powm.c (swox cvs rev 1.4) - # tickles a bug in gcc 2.95.2 (believed fixed in 2.96). - [i686*-*-* | pentiumpro-*-* | pentium[23]-*-*]) - gmp_optcflags_gcc="-mcpu=pentiumpro";; - - k6*-*-*) gmp_optcflags_gcc="-mcpu=k6 -march=k6";; - - # Athlon instruction costs are close to p6: 3 cycle load latency, 4-6 - # cycle mul, 40 cycle div, pairable adc, ... - # FIXME: Change this when gcc gets something specific for Athlon. - # -march=pentiumpro not used, per i686 above. - athlon-*-*) gmp_optcflags_gcc="-mcpu=pentiumpro";; - esac - ;; - - # Sparc - [ultrasparc*-*-solaris2.[7-9] | sparcv9-*-solaris2.[7-9]]) - os_64bit=yes - gmp_cflags_gcc="$gmp_cflags_gcc -Wa,-xarch=v8plus" - gmp_xoptcflags_gcc="-mcpu=v9 -mcpu=v8 -mv8" - gmp_cflags64_gcc="$gmp_cflags64_gcc -m64 -mptr64 -Wa,-xarch=v9 -mcpu=v9" - gmp_cflags_cc="-xtarget=native -xarch=v8 -xO4" - gmp_cflags64_cc="-xtarget=native -xarch=v9 -xO4" - ;; - sparc64-*-linux*) - # Need to think more about the options passed here. This isn't good for - # some sparc64 linux distros, since we end up not optimizing when all the - # options below fail. - os_64bit=yes - gmp_cflags64_gcc="$gmp_cflags64_gcc -m64 -mptr64 -Wa,-xarch=v9 -mcpu=v9" - gmp_cflags_gcc="$gmp_cflags_gcc -m32" - gmp_xoptflags_gcc="-mcpu=ultrasparc -mvis" - ;; - ultrasparc*-*-* | sparcv9-*-*) - gmp_cflags_gcc="$gmp_cflags_gcc -Wa,-xarch=v8plus" - gmp_xoptcflags_gcc="-mcpu=v9 -mcpu=v8 -mv8" - gmp_cflags_cc="-xtarget=native -xarch=v8 -xO4" - ;; - sparcv8*-*-solaris2.* | microsparc*-*-solaris2.*) - gmp_cflags_gcc="$gmp_cflags_gcc" - gmp_xoptcflags_gcc="-mcpu=v8 -mv8" - gmp_cflags_cc="-xtarget=native -xarch=v8 -xO4" - ;; - sparcv8*-*-* | microsparc*-*-*) # SunOS, Linux, *BSD - cclist="gcc acc cc" - gmp_cflags_gcc="$gmp_cflags_gcc" - gmp_xoptcflags_gcc="-mcpu=v8 -mv8" - gmp_cflags_acc="-g -O2 -cg92" - gmp_cflags_cc="-O2" # FIXME: Flag for v8? - ;; - supersparc*-*-solaris2.*) - gmp_cflags_gcc="$gmp_cflags_gcc -DSUPERSPARC" - gmp_xoptcflags_gcc="-mcpu=v8 -mv8" - gmp_cflags_cc="-xtarget=native -xarch=v8 -xO4 -DSUPERSPARC" - ;; - supersparc*-*-*) # SunOS, Linux, *BSD - cclist="gcc acc cc" - gmp_cflags_gcc="$gmp_cflags_gcc -DSUPERSPARC" - gmp_xoptcflags_gcc="-mcpu=v8 -mv8" - gmp_cflags_acc="-g -O2 -cg92 -DSUPERSPARC" - gmp_cflags_cc="-O2 -DSUPERSPARC" # FIXME: Flag for v8? - ;; - *sparc*-*-*) - cclist="gcc acc cc" - gmp_cflags_acc="-g -O2" - gmp_cflags_cc="-g -O2" - ;; - - # POWER/PowerPC - powerpc64-*-aix*) - cclist="gcc xlc" - gmp_cflags_gcc="$gmp_cflags_gcc -maix64 -mpowerpc64" - gmp_cflags_xlc="-g -O2 -q64 -qtune=pwr3" - ;; - powerpc*-*-aix*) - cclist="gcc xlc" - gmp_cflags_gcc="$gmp_cflags_gcc -mpowerpc" - gmp_cflags_xlc="$gmp_cflags_cc -qarch=ppc -O2" - ;; - power-*-aix*) - cclist="gcc xlc" - gmp_cflags_gcc="$gmp_cflags_gcc -mpower" - gmp_cflags_xlc="$gmp_cflags_cc -qarch=pwr -O2" - ;; - powerpc64*-*-*) - gmp_cflags_gcc="$gmp_cflags_gcc -mpowerpc64" - AC_DEFINE(_LONG_LONG_LIMB) dnl FIXME: Remove. - ;; - powerpc-apple-darwin* | powerpc-apple-macosx*) - gmp_cflags_gcc="$gmp_cflags_gcc -mpowerpc -traditional-cpp" - ;; - powerpc*-*-*) - gmp_cflags_gcc="$gmp_cflags_gcc -mpowerpc" - ;; - - # MIPS - mips-sgi-irix6.*) - os_64bit=yes - gmp_cflags64_gcc="-g -O2 -mabi=n32" - gmp_cflags64_cc="$gmp_cflags64_cc -O2 -n32" - ;; - - # Motorola 68k family - m88110*-*-*) - gmp_cflags_gcc="-g -O -m88110" dnl FIXME: Use `-O2'? - ;; - m68*-*-*) - gmp_cflags_gcc="$gmp_cflags_gcc -fomit-frame-pointer" - ;; - - # HP - hppa1.0*-*-*) - cclist="gcc c89 cc" - gmp_cflags_c89="$gmp_cflags_cc +O2" - gmp_cflags_cc="$gmp_cflags_cc +O2" - ;; - hppa2.0w*-*-*) - cclist="c89 cc" - gmp_cflags_c89="+DD64 +O3" - gmp_cflags_cc="+DD64 +O3" - ;; - hppa2.0*-*-*) - os_64bit=yes - cclist="gcc c89 cc" - gmp_cflags64_gcc="$gmp_cflags64_gcc -mWHAT -D_LONG_LONG_LIMB" - # +O2 to cc triggers bug in mpz/powm.c (1.4) - gmp_cflags64_c89="+DA2.0 +e +O3 -D_LONG_LONG_LIMB" - gmp_cflags64_cc="+DA2.0 +e +O3 -D_LONG_LONG_LIMB" - gmp_cflags_c89="$gmp_cflags_cc +O2" - gmp_cflags_cc="$gmp_cflags_cc +O2" - ;; - - # VAX - vax*-*-*) - gmp_cflags_gcc="$gmp_cflags_gcc -fomit-frame-pointer" - ;; - - # Fujitsu - [f30[01]-fujitsu-sysv*]) - cclist="gcc vcc" - gmp_cflags_vcc="-g" # FIXME: flags for vcc? - ;; -esac - -case "${target}" in - *-*-mingw32) gmp_cflags_gcc="$gmp_cflags_gcc -mno-cygwin";; -esac - -dnl Check for programs needed by macros for finding compiler. -dnl More programs are checked for below, when a compiler is found. -AC_PROG_NM dnl Macro from Libtool. -# nm on 64-bit AIX needs to know the object file format -case "$target" in - powerpc64*-*-aix*) - NM="$NM -X 64" - ;; -esac - -# Save CFLAGS given on command line. -gmp_user_CFLAGS="$CFLAGS" - -if test -z "$CC"; then - # Find compiler. - GMP_PROG_CC_FIND($cclist, $os_64bit) - - # If 64-bit OS and we have a 64-bit compiler, use it. - if test -n "$os_64bit" && test -n "$CC64"; then - CC=$CC64 - CFLAGS=$CFLAGS64 - else - eval CFLAGS=\$gmp_cflags_$CC - fi - - # Try compiler flags that may work with only some compiler versions. - # gmp_optcflags: All or nothing. - eval optcflags=\$gmp_optcflags_$CC - if test -n "$optcflags"; then - CFLAGS_save="$CFLAGS" - CFLAGS="$CFLAGS $optcflags" - AC_MSG_CHECKING([whether $CC accepts $optcflags]) - AC_LANG_C - AC_TRY_COMPILER([int main(){return(0);}], optok, cross) - if test "$optok" = "yes"; then - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - CFLAGS="$CFLAGS_save" - fi - fi - # gmp_xoptcflags: First is best, one has to work. - eval xoptcflags=\$gmp_xoptcflags_$CC - if test -n "$xoptcflags"; then - gmp_found="no" - for xopt in $xoptcflags; do - CFLAGS_save="$CFLAGS" - CFLAGS="$CFLAGS $xopt" - AC_MSG_CHECKING([whether $CC accepts $xopt]) - AC_LANG_C - AC_TRY_COMPILER([int main(){return(0);}], optok, cross) - if test "$optok" = "yes"; then - AC_MSG_RESULT([yes]) - gmp_found="yes" - break - else - AC_MSG_RESULT([no]) - CFLAGS="$CFLAGS_save" - fi - done - if test "$gmp_found" = "no"; then - echo ["$0: fatal: need a compiler that understands one of $xoptcflags"] - exit 1 - fi - fi -fi - -# Restore CFLAGS given on command line. -# FIXME: We've run through quite some unnecessary code looking for a -# nice compiler and working flags for it, just to spoil that with user -# supplied flags. -test -n "$gmp_user_CFLAGS" && CFLAGS="$gmp_user_CFLAGS" - -# Select chosen compiler. -GMP_PROG_CC_SELECT - -# How to assemble. -CCAS="$CC -c" -AC_SUBST(CCAS) - -dnl Checks for programs. -dnl -------------------- -AC_PROG_CPP -AC_PROG_INSTALL -AC_PROG_LN_S -GMP_PROG_M4 -AC_CHECK_PROG(AR, ar, ar) -# ar on AIX needs to know the object file format -case "$target" in - powerpc64*-*-aix*) - AR="$AR -X 64" - ;; -esac -dnl FIXME: Find good ld? /usr/ucb/ld on Solaris won't work. - -dnl Checks for assembly syntax. -if test "$gmp_no_asm_syntax_testing" != "yes"; then - GMP_CHECK_ASM_TEXT - GMP_CHECK_ASM_DATA - GMP_CHECK_ASM_GLOBL - GMP_CHECK_ASM_LABEL_SUFFIX - GMP_CHECK_ASM_TYPE - GMP_CHECK_ASM_SIZE - GMP_CHECK_ASM_LSYM_PREFIX - GMP_CHECK_ASM_W32 - GMP_CHECK_ASM_UNDERSCORE(underscore=yes, underscore=no) - GMP_CHECK_ASM_ALIGN_LOG(asm_align=log, asm_align=nolog) -fi - -dnl FIXME: Check for FPU and set `floating_point' appropriately. - -dnl ======================================== -dnl Configuring mpn. -dnl ---------------------------------------- -dnl Set the following target specific variables: -dnl path where to search for source files -dnl family processor family (Needed for building -dnl asm-syntax.h for now. FIXME: Remove.) -dnl extra_functions extra functions - -family=generic - -case ${target} in - arm*-*-*) - path="arm" - ;; - [sparcv9*-*-solaris2.[789]* | sparc64*-*-solaris2.[789]* | ultrasparc*-*-solaris2.[789]*]) - if test -n "$CC64" - then path="sparc64" - else path="sparc32/v9 sparc32/v8 sparc32" - fi - ;; - sparc64-*-linux*) - if test -n "$CC64" - then path="sparc64" - else path="sparc32/v9 sparc32/v8 sparc32" - fi - ;; - sparcv8*-*-* | microsparc*-*-*) - path="sparc32/v8 sparc32" - if test x${floating_point} = xno - then extra_functions="udiv_nfp" - else extra_functions="udiv_fp" - fi - ;; - sparcv9*-*-* | ultrasparc*-*-*) - path="sparc32/v9 sparc32/v8 sparc32" - extra_functions="udiv_fp" - ;; - supersparc*-*-*) - path="sparc32/v8/supersparc sparc32/v8 sparc32" - extra_functions="udiv" - ;; - sparc*-*-*) path="sparc32" - if test x${floating_point} = xno - then extra_functions="udiv_nfp" - else extra_functions="udiv_fp" - fi - ;; - hppa7000*-*-*) - path="hppa/hppa1_1 hppa" - extra_functions="udiv_qrnnd" - ;; - hppa1.0*-*-*) - path="hppa" - extra_functions="udiv_qrnnd" - ;; - hppa2.0w-*-*) - path="pa64w" - extra_functions="umul_ppmm udiv_qrnnd" - ;; - hppa2.0*-*-*) - if test -n "$CC64"; then - path="pa64" - extra_functions="umul_ppmm udiv_qrnnd" - # We need to use the system compiler, or actually the system assembler, - # since GAS has not been ported to understand the 2.0 instructions. - CCAS="$CC64 -c" - else - # FIXME: path should be "hppa/hppa2_0 hppa/hppa1_1 hppa" - path="hppa/hppa1_1 hppa" - extra_functions="udiv_qrnnd" - fi - ;; - hppa*-*-*) #assume pa7100 - path="hppa/hppa1_1/pa7100 hppa/hppa1_1 hppa" - extra_functions="udiv_qrnnd";; - [f30[01]-fujitsu-sysv*]) - path=fujitsu;; - alphaev6*-*-*) path="alpha/ev6 alpha"; extra_functions="invert_limb cntlz";; - alphaev5*-*-*) path="alpha/ev5 alpha"; extra_functions="invert_limb cntlz";; - alpha*-*-*) path="alpha"; extra_functions="invert_limb cntlz";; - # Cray vector machines. This must come after alpha* so that we can - # recognize present and future vector processors with a wildcard. - *-cray-unicos*) - path="cray" - extra_functions="mulww";; - am29000*-*-*) path="a29k";; - a29k*-*-*) path="a29k";; - - # AMD and Intel x86 configurations - - [i?86*-*-* | k[5-8]*-*-* | pentium*-*-* | athlon-*-*]) - gmp_m4postinc="x86/x86-defs.m4" - extra_functions="udiv umul" - CALLING_CONVENTIONS_OBJS="x86call.o x86check.o" - - GMP_CHECK_ASM_SHLDL_CL( - [GMP_DEFINE(WANT_SHLDL_CL,1)], - [GMP_DEFINE(WANT_SHLDL_CL,0)]) - GMP_CHECK_ASM_ALIGN_FILL_0x90 - - # the CPUs below wanting to know about mmx - case ${target} in - [pentiummmx-*-* | pentium[23]-*-* | k6*-*-* | athlon-*-*]) - GMP_CHECK_ASM_MMX(tmp_mmx=yes, tmp_mmx=no) - ;; - esac - - # default for anything not otherwise mentioned - path="x86" - - case ${target} in - [i[34]86*-*-*]) - path="x86" - ;; - k5*-*-*) - # don't know what best suits k5 - path="x86" - ;; - i586*-*-* | pentium-*-*) - path="x86/pentium x86" - ;; - pentiummmx-*-*) - path="x86/pentium x86" - if test "$tmp_mmx" = yes; then - path="x86/pentium/mmx $path" - fi - ;; - i686*-*-* | pentiumpro-*-*) - path="x86/p6 x86" - ;; - pentium2-*-*) - path="x86/p6 x86" - # The pentium/mmx lshift and rshift are good on p6 and can be used - # until there's something specific for p6. - if test "$tmp_mmx" = yes; then - path="x86/p6/mmx x86/pentium/mmx $path" - fi - ;; - pentium3-*-*) - path="x86/p6 x86" - # The pentium/mmx lshift and rshift are good on p6 and can be used - # until there's something specific for p6. - if test "$tmp_mmx" = yes; then - path="x86/p6/p3mmx x86/p6/mmx x86/pentium/mmx $path" - fi - ;; - [k6[23]*-*-*]) - path="x86/k6 x86" - if test "$tmp_mmx" = yes; then - path="x86/k6/k62mmx x86/k6/mmx $path" - fi - ;; - k6*-*-*) - path="x86/k6 x86" - if test "$tmp_mmx" = yes; then - path="x86/k6/mmx $path" - fi - ;; - athlon-*-*) - path="x86/k7 x86" - if test "$tmp_mmx" = yes; then - path="x86/k7/mmx $path" - fi - ;; - esac - ;; - - - i960*-*-*) path="i960";; - - ia64*-*-*) path="ia64";; - -# Motorola 68k configurations. Let m68k mean 68020-68040. - [m680[234]0*-*-* | m68k*-*-* | \ - m68*-next-nextstep*]) # Nexts are at least '020 - path="m68k/mc68020 m68k" - family=m68k - ;; - m68000*-*-*) - path="m68k" - family=m68k - ;; - - m88k*-*-* | m88k*-*-*) path="m88k";; - m88110*-*-*) path="m88k/mc88110 m88k";; - ns32k*-*-*) path="ns32k";; - - pyramid-*-*) path="pyr";; - - ppc601-*-*) path="power powerpc32";; - powerpc64*-*-*) path="powerpc64";; - powerpc*-*-*) path="powerpc32";; - rs6000-*-* | power-*-* | power2-*-*) - path="power" - extra_functions="udiv_w_sdiv" - ;; - - sh-*-*) path="sh";; - sh2-*-*) path="sh/sh2 sh";; - - [mips[34]*-*-*]) path="mips3";; - mips*-*-irix6*) path="mips3";; - mips*-*-*) path="mips2";; - - vax*-*-*) path="vax"; extra_functions="udiv_w_sdiv";; - - z8000x*-*-*) path="z8000x"; extra_functions="udiv_w_sdiv";; - z8000*-*-*) path="z8000"; extra_functions="udiv_w_sdiv";; - - clipper*-*-*) path="clipper";; -esac - -AC_SUBST(CALLING_CONVENTIONS_OBJS) -if test -n "$CALLING_CONVENTIONS_OBJS"; then - AC_DEFINE(HAVE_CALLING_CONVENTIONS,1, - [Define if mpn/tests has calling conventions checking for the CPU]) -fi - - -case ${target} in - [i[5-8]86*-*-* | k[5-8]*-*-* | pentium*-*-* | athlon-*-*]) - # rdtsc is in pentium and up, not in i386 and i486 - SPEED_CYCLECOUNTER_OBJS=pentium.lo - ;; - alpha*-*-*) - SPEED_CYCLECOUNTER_OBJS=alpha.lo - ;; - sparcv9*-*-* | ultrasparc*-*-* | sparc64*-*-*) - SPEED_CYCLECOUNTER_OBJS=sparcv9.lo - ;; - hppa2*-*-*) - SPEED_CYCLECOUNTER_OBJS=hppa2.lo - ;; - hppa*-*-*) - SPEED_CYCLECOUNTER_OBJS=hppa.lo - ;; -esac - -AC_SUBST(SPEED_CYCLECOUNTER_OBJS) - -if test -n "$SPEED_CYCLECOUNTER_OBJS" -then - AC_DEFINE(HAVE_SPEED_CYCLECOUNTER, 1, - [Define if a speed_cyclecounter exists (for the tune programs)]) -fi - - -dnl Extensions for executable and object files. -dnl ------------------------------------------- -AC_EXEEXT -AC_OBJEXT - -dnl Use Libtool. -dnl ------------ -dnl FIXME: Shared libs seem to fail on aix4.3. -dnl FIXME: Should invoke [AC_DISABLE_SHARED], but m4 recurses to death. -case "$target" in - [*-*-aix4.[3-9]*]) enable_shared=no ;; -esac -AC_PROG_LIBTOOL - -dnl Checks for libraries. -dnl --------------------- -AC_CHECK_DECLS((optarg)) - -dnl Checks for header files. -dnl ------------------------ -AC_HEADER_STDC -AC_CHECK_HEADERS(getopt.h unistd.h sys/sysctl.h sys/time.h) - -dnl Checks for typedefs, structures, and compiler characteristics. -dnl -------------------------------------------------------------- -AC_CHECK_TYPES((void)) -AC_C_STRINGIZE - -dnl Checks for library functions. -dnl ----------------------------- -dnl Most of these are only for the benefit of supplementary programs. The -dnl library itself doesn't use anything weird. -dnl AC_FUNC_MEMCMP -dnl AC_TYPE_SIGNAL -dnl AC_CHECK_FUNCS(strtol) -AC_CHECK_FUNCS(getopt_long getpagesize popen processor_info strtoul sysconf sysctlbyname) - -dnl Trick automake into thinking we've run AM_C_PROTOTYPES which it wants -dnl for ansi2knr, and instead use our own test. (It's only a warning -dnl automake prints, but it's good to suppress it.) -ifelse(0,1,[ -AM_C_PROTOTYPES -]) -GMP_C_ANSI2KNR - - -dnl Set `syntax' to one of , "mit", "elf", "aix", "macho". -syntax= -# For now, we use the old switch for setting syntax. -# FIXME: Remove when conversion to .asm is completed. -changequote(,)dnl -case "${target}" in - m680[234]0*-*-linuxaout* | m68k*-*-linuxaout* | \ - m68k-next-nextstep* | \ - m68000*-*-*) - syntax=mit - ;; - m680[234]0*-*-linux* | m68k*-*-linux*) - syntax=elf - ;; - m680[234]0*-*-* | m68k*-*-*) - syntax=mit - ;; -esac -changequote([,])dnl - -dnl ---------------------------------------- -# Now build an asm-syntax.h file for targets that include that from the -# assembly files. -# FIXME: Remove when conversion to .asm is completed. -case "${family}-${underscore}-${asm_align}-${syntax}" in - m68k-yes-log-mit) - echo '#define MIT_SYNTAX' >asm-syntax.h - cat $srcdir/mpn/underscore.h >>asm-syntax.h - echo '#include "'$srcdir'/mpn/m68k/syntax.h"' >>asm-syntax.h;; - m68k-no-nolog-elf) - echo '#define ELF_SYNTAX' >asm-syntax.h - echo '#define C_SYMBOL_NAME(name) name' >>asm-syntax.h - echo '#include "'$srcdir'/mpn/m68k/syntax.h"' >>asm-syntax.h;; -esac - - -# The pattern here tests for an absolute path the same way as -# _AC_OUTPUT_FILES in autoconf acgeneral.m4. -GMP_DEFINE_RAW(["dnl CONFIG_TOP_SRCDIR is a path from the mpn builddir to the top srcdir"]) -case "$srcdir" in -[[\\/]]* | ?:[[\\/]]* ) - GMP_DEFINE_RAW(["define(,<\`$srcdir'>)"]) ;; -*) GMP_DEFINE_RAW(["define(,<\`../$srcdir'>)"]) ;; -esac - -GMP_DEFINE_RAW(["include(CONFIG_TOP_SRCDIR\`/mpn/asm-defs.m4')"], POST) - -# Must be after asm-defs.m4 -GMP_DEFINE_RAW("define_not_for_expansion(\`HAVE_TARGET_CPU_$target_cpu')", POST) - - -dnl config.m4 post-includes -dnl ----------------------- -dnl (Note x86 post include set with $path above.) -changequote(,)dnl -case "$target" in - alpha*-cray-unicos*) - gmp_m4postinc="alpha/unicos.m4" - ;; - alpha*-*-*) - gmp_m4postinc="alpha/default.m4" - ;; - power*-*-*) - case "$target" in - *-*-mach* | *-*-rhapsody* | *-*-nextstep* | *-*-darwin* | *-*-macosx*) - ;; # these use non-conventional assembly syntax. - powerpc64-*-aix*) - gmp_m4postinc="powerpc32/regmap.m4 powerpc64/aix.m4" - ;; - *-*-aix*) - gmp_m4postinc="powerpc32/regmap.m4 powerpc32/aix.m4" - ;; - *) - gmp_m4postinc="powerpc32/regmap.m4" - ;; - esac - ;; -esac -changequote([, ])dnl - -for tmp_f in $gmp_m4postinc; do - GMP_DEFINE_RAW(["include_mpn(\`$tmp_f')"], POST) -done - - -# Set up `gmp_links'. It's a list of link:file pairs that configure will -# process to create link -> file. -gmp_links= - -# If the user specified `MPN_PATH', use that instead of the path we've -# come up with. -if test -z "$MPN_PATH"; then - path="$path generic" -else - path="$MPN_PATH" -fi - -# Pick the correct source files in $path and link them to mpn/. -# $gmp_mpn_functions lists all functions we need. -# -# The rule is to find a file with the function name and a .asm, .S, -# .s, or .c extension. Certain multi-function files with special names -# can provide some functions too. (mpn/Makefile.am passes -# -DOPERATION_ to get them to generate the right code.) - -# FIXME: udiv and umul aren't in $gmp_mpn_functions_optional yet since -# there's some versions of those files which should be checked for bit -# rot first. Put them in $extra_functions for each target for now, -# change to standard optionals when all are ready. - -# Note: The following lines defining $gmp_mpn_functions_optional -# and $gmp_mpn_functions are parsed by the "macos/configure" -# Perl script. So if you change the lines in a major way -# make sure to run and examine the output from -# -# % (cd macos; perl configure) - -gmp_mpn_functions_optional="copyi copyd com_n \ - and_n andn_n nand_n ior_n iorn_n nior_n xor_n xnor_n" - -gmp_mpn_functions="${extra_functions} inlines add_n sub_n mul_1 addmul_1 \ - submul_1 lshift rshift diveby3 divrem divrem_1 divrem_2 \ - mod_1 mod_1_rs pre_mod_1 dump \ - mul mul_fft mul_n mul_basecase sqr_basecase random \ - random2 sqrtrem get_str set_str scan0 scan1 popcount hamdist cmp perfsqr \ - bdivmod gcd_1 gcd gcdext tdiv_qr bz_divrem_n sb_divrem_mn jacbase \ - $gmp_mpn_functions_optional" - -# the list of all object files used by mpn/Makefile.in and the -# top-level Makefile.in, respectively -mpn_objects= -mpn_objs_in_libgmp="mpn/mp_bases.lo" - -for tmp_fn in ${gmp_mpn_functions} ; do - [rm -f mpn/${tmp_fn}.[Ssc] mpn/${tmp_fn}.asm] - - # functions that can be provided by multi-function files - tmp_mulfunc= - case $tmp_fn in - add_n|sub_n) tmp_mulfunc="aors_n" ;; - addmul_1|submul_1) tmp_mulfunc="aorsmul_1" ;; - popcount|hamdist) tmp_mulfunc="popham" ;; - and_n|andn_n|nand_n | ior_n|iorn_n|nior_n | xor_n|xnor_n) - tmp_mulfunc="logops_n" ;; - esac - - found=no - for tmp_dir in $path; do - for tmp_base in $tmp_fn $tmp_mulfunc; do - for tmp_ext in asm S s c; do - tmp_file=$srcdir/mpn/$tmp_dir/$tmp_base.$tmp_ext - if test -f $tmp_file; then - found=yes - - mpn_objects="$mpn_objects ${tmp_fn}.lo" - mpn_objs_in_libgmp="$mpn_objs_in_libgmp mpn/${tmp_fn}.lo" - gmp_links="$gmp_links mpn/$tmp_fn.$tmp_ext:mpn/$tmp_dir/$tmp_base.$tmp_ext" - - # duplicate AC_DEFINEs are harmless, so it doesn't matter - # that multi-function files get grepped here repeatedly - gmp_ep=["` - sed -n 's/^[ ]*MULFUNC_PROLOGUE(\(.*\))/\1/p' $tmp_file ; - sed -n 's/^[ ]*PROLOGUE.*(\(.*\))/\1/p' $tmp_file - `"] - for gmp_tmp in $gmp_ep; do - AC_DEFINE_UNQUOTED(HAVE_NATIVE_${gmp_tmp}) - done - - break - fi - done - if test $found = yes; then break ; fi - done - if test $found = yes; then break ; fi - done - - if test $found = no; then - for tmp_optional in $gmp_mpn_functions_optional; do - if test $tmp_optional = $tmp_fn; then - found=yes - fi - done - if test $found = no; then - AC_MSG_ERROR([no version of $tmp_fn found in path: $path]) - fi - fi -done - -# Create link for gmp-mparam.h. -for tmp_dir in $path ; do - rm -f gmp-mparam.h - if test -f $srcdir/mpn/${tmp_dir}/gmp-mparam.h ; then - gmp_links="$gmp_links gmp-mparam.h:mpn/${tmp_dir}/gmp-mparam.h" - - # Copy any KARATSUBA_SQR_THRESHOLD in gmp-mparam.h to config.m4. - # Some versions of sqr_basecase.asm use this. - tmp_gmp_karatsuba_sqr_threshold="`sed -n 's/^#define KARATSUBA_SQR_THRESHOLD[ ]*\([0-9][0-9]*\).*$/\1/p' $srcdir/mpn/${tmp_dir}/gmp-mparam.h`" - if test -n "$tmp_gmp_karatsuba_sqr_threshold"; then - GMP_DEFINE_RAW(["define(,<$tmp_gmp_karatsuba_sqr_threshold>)"]) - fi - - break - fi -done - -# Dig out the links from `gmp_links' for inclusion in DISTCLEANFILES. -gmp_srclinks= -for f in $gmp_links; do - gmp_srclinks="$gmp_srclinks `echo $f | sed 's/\(.*\):.*/\1/'`" -done - -AC_SUBST(mpn_objects) -AC_SUBST(mpn_objs_in_libgmp) -AC_SUBST(gmp_srclinks) - -dnl ---------------------------------------- -dnl Make links. -AC_CONFIG_LINKS($gmp_links) - -dnl Create config.m4. -GMP_FINISH - -dnl Create Makefiles -dnl FIXME: Upcoming version of autoconf/automake may not like broken lines. -AC_OUTPUT(Makefile mpz/Makefile mpn/Makefile) diff --git a/rts/gmp/depcomp b/rts/gmp/depcomp deleted file mode 100644 index 7906096..0000000 --- a/rts/gmp/depcomp +++ /dev/null @@ -1,269 +0,0 @@ -#! /bin/sh - -# depcomp - compile a program generating dependencies as side-effects -# Copyright (C) 1999 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -# Originally written by Alexandre Oliva . - -if test -z "$depmode" || test -z "$source" || test -z "$object"; then - echo "depcomp: Variables source, object and depmode must be set" 1>&2 - exit 1 -fi -# `libtool' can also be set to `yes' or `no'. - -depfile=${depfile-`echo "$object" | sed 's,\([^/]*\)$,.deps/\1,;s/\.\([^.]*\)$/.P\1/'`} -tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} - -rm -f "$tmpdepfile" - -# Some modes work just like other modes, but use different flags. We -# parameterize here, but still list the modes in the big case below, -# to make depend.m4 easier to write. Note that we *cannot* use a case -# here, because this file can only contain one case statement. -if test "$depmode" = hp; then - # HP compiler uses -M and no extra arg. - gccflag=-M - depmode=gcc -fi - -if test "$depmode" = dashXmstdout; then - # This is just like dashmstdout with a different argument. - dashmflag=-xM - depmode=dashmstdout -fi - -case "$depmode" in -gcc) -## There are various ways to get dependency output from gcc. Here's -## why we pick this rather obscure method: -## - Don't want to use -MD because we'd like the dependencies to end -## up in a subdir. Having to rename by hand is ugly. -## (We might end up doing this anyway to support other compilers.) -## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like -## -MM, not -M (despite what the docs say). -## - Using -M directly means running the compiler twice (even worse -## than renaming). - if test -z "$gccflag"; then - gccflag=-MD, - fi - if "$@" -Wp,"$gccflag$tmpdepfile"; then : - else - stat=$? - rm -f "$tmpdepfile" - exit $stat - fi - rm -f "$depfile" - echo "$object : \\" > "$depfile" - sed 's/^[^:]*: / /' < "$tmpdepfile" >> "$depfile" -## This next piece of magic avoids the `deleted header file' problem. -## The problem is that when a header file which appears in a .P file -## is deleted, the dependency causes make to die (because there is -## typically no way to rebuild the header). We avoid this by adding -## dummy dependencies for each header file. Too bad gcc doesn't do -## this for us directly. - tr ' ' ' -' < "$tmpdepfile" | -## Some versions of gcc put a space before the `:'. On the theory -## that the space means something, we add a space to the output as -## well. -## Some versions of the HPUX 10.20 sed can't process this invocation -## correctly. Breaking it into two sed invocations is a workaround. - sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -hp) - # This case exists only to let depend.m4 do its work. It works by - # looking at the text of this script. This case will never be run, - # since it is checked for above. - exit 1 - ;; - -dashmd) - # The Java front end to gcc doesn't run cpp, so we can't use the -Wp - # trick. Instead we must use -M and then rename the resulting .d - # file. This is also the case for older versions of gcc, which - # don't implement -Wp. - if "$@" -MD; then : - else - stat=$? - rm -f FIXME - exit $stat - fi - FIXME: rewrite the file - ;; - -sgi) - if test "$libtool" = yes; then - "$@" "-Wc,-MDupdate,$tmpdepfile" - else - "$@" -MDupdate "$tmpdepfile" - fi - stat=$? - if test $stat -eq 0; then : - else - stat=$? - rm -f "$tmpdepfile" - exit $stat - fi - rm -f "$depfile" - echo "$object : \\" > "$depfile" - sed 's/^[^:]*: / /' < "$tmpdepfile" >> "$depfile" - tr ' ' ' -' < "$tmpdepfile" | \ -## Some versions of the HPUX 10.20 sed can't process this invocation -## correctly. Breaking it into two sed invocations is a workaround. - sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -#nosideeffect) - # This comment above is used by automake to tell side-effect - # dependency tracking mechanisms from slower ones. - -dashmstdout) - # Important note: in order to support this mode, a compiler *must* - # always write the proprocessed file to stdout, regardless of -o, - # because we must use -o when running libtool. - test -z "$dashmflag" && dashmflag=-M - ( IFS=" " - case " $* " in - *" --mode=compile "*) # this is libtool, let us make it quiet - for arg - do # cycle over the arguments - case "$arg" in - "--mode=compile") - # insert --quiet before "--mode=compile" - set fnord "$@" --quiet - shift # fnord - ;; - esac - set fnord "$@" "$arg" - shift # fnord - shift # "$arg" - done - ;; - esac - "$@" $dashmflag | sed 's:^[^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" - ) & - proc=$! - "$@" - stat=$? - wait "$proc" - if test "$stat" != 0; then exit $stat; fi - rm -f "$depfile" - cat < "$tmpdepfile" > "$depfile" - tr ' ' ' -' < "$tmpdepfile" | \ -## Some versions of the HPUX 10.20 sed can't process this invocation -## correctly. Breaking it into two sed invocations is a workaround. - sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -dashXmstdout) - # This case only exists to satisfy depend.m4. It is never actually - # run, as this mode is specially recognized in the preamble. - exit 1 - ;; - -makedepend) - # X makedepend - ( - shift - cleared=no - for arg in "$@"; do - case $cleared in no) - set ""; shift - cleared=yes - esac - case "$arg" in - -D*|-I*) - set fnord "$@" "$arg"; shift;; - -*) - ;; - *) - set fnord "$@" "$arg"; shift;; - esac - done - obj_suffix="`echo $object | sed 's/^.*\././'`" - touch "$tmpdepfile" - ${MAKEDEPEND-makedepend} 2>/dev/null -o"$obj_suffix" -f"$tmpdepfile" "$@" - ) & - proc=$! - "$@" - stat=$? - wait "$proc" - if test "$stat" != 0; then exit $stat; fi - rm -f "$depfile" - cat < "$tmpdepfile" > "$depfile" - tail +3 "$tmpdepfile" | tr ' ' ' -' | \ -## Some versions of the HPUX 10.20 sed can't process this invocation -## correctly. Breaking it into two sed invocations is a workaround. - sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" "$tmpdepfile".bak - ;; - -cpp) - # Important note: in order to support this mode, a compiler *must* - # always write the proprocessed file to stdout, regardless of -o, - # because we must use -o when running libtool. - ( IFS=" " - case " $* " in - *" --mode=compile "*) - for arg - do # cycle over the arguments - case "$arg" in - "--mode=compile") - # insert --quiet before "--mode=compile" - set fnord "$@" --quiet - shift # fnord - ;; - esac - set fnord "$@" "$arg" - shift # fnord - shift # "$arg" - done - ;; - esac - "$@" -E | - sed -n '/^# [0-9][0-9]* "\([^"]*\)"/ s::'"$object"'\: \1:p' > "$tmpdepfile" - ) & - proc=$! - "$@" - stat=$? - wait "$proc" - if test "$stat" != 0; then exit $stat; fi - rm -f "$depfile" - cat < "$tmpdepfile" > "$depfile" - sed < "$tmpdepfile" -e 's/^[^:]*: //' -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -none) - exec "$@" - ;; - -*) - echo "Unknown depmode $depmode" 1>&2 - exit 1 - ;; -esac - -exit 0 diff --git a/rts/gmp/errno.c b/rts/gmp/errno.c deleted file mode 100644 index 7dd223c..0000000 --- a/rts/gmp/errno.c +++ /dev/null @@ -1,26 +0,0 @@ -/* gmp_errno -- The largest and most complex file in GMP. - -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" - -int gmp_errno = 0; diff --git a/rts/gmp/extract-dbl.c b/rts/gmp/extract-dbl.c deleted file mode 100644 index 2d70d9a..0000000 --- a/rts/gmp/extract-dbl.c +++ /dev/null @@ -1,187 +0,0 @@ -/* __gmp_extract_double -- convert from double to array of mp_limb_t. - -Copyright (C) 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 "gmp.h" -#include "gmp-impl.h" - -#ifdef XDEBUG -#undef _GMP_IEEE_FLOATS -#endif - -#ifndef _GMP_IEEE_FLOATS -#define _GMP_IEEE_FLOATS 0 -#endif - -/* Extract a non-negative double in d. */ - -int -#if __STDC__ -__gmp_extract_double (mp_ptr rp, double d) -#else -__gmp_extract_double (rp, d) - mp_ptr rp; - double d; -#endif -{ - long exp; - unsigned sc; - mp_limb_t manh, manl; - - /* BUGS - - 1. Should handle Inf and NaN in IEEE specific code. - 2. Handle Inf and NaN also in default code, to avoid hangs. - 3. Generalize to handle all BITS_PER_MP_LIMB >= 32. - 4. This lits is incomplete and misspelled. - */ - - if (d == 0.0) - { - rp[0] = 0; - rp[1] = 0; -#if BITS_PER_MP_LIMB == 32 - rp[2] = 0; -#endif - return 0; - } - -#if _GMP_IEEE_FLOATS - { -#if defined (__alpha) && __GNUC__ == 2 && __GNUC_MINOR__ == 8 - /* Work around alpha-specific bug in GCC 2.8.x. */ - volatile -#endif - union ieee_double_extract x; - x.d = d; - exp = x.s.exp; -#if BITS_PER_MP_LIMB == 64 - manl = (((mp_limb_t) 1 << 63) - | ((mp_limb_t) x.s.manh << 43) | ((mp_limb_t) x.s.manl << 11)); - if (exp == 0) - { - /* Denormalized number. Don't try to be clever about this, - since it is not an important case to make fast. */ - exp = 1; - do - { - manl = manl << 1; - exp--; - } - while ((mp_limb_signed_t) manl >= 0); - } -#else - manh = ((mp_limb_t) 1 << 31) | (x.s.manh << 11) | (x.s.manl >> 21); - manl = x.s.manl << 11; - if (exp == 0) - { - /* Denormalized number. Don't try to be clever about this, - since it is not an important case to make fast. */ - exp = 1; - do - { - manh = (manh << 1) | (manl >> 31); - manl = manl << 1; - exp--; - } - while ((mp_limb_signed_t) manh >= 0); - } -#endif - exp -= 1022; /* Remove IEEE bias. */ - } -#else - { - /* Unknown (or known to be non-IEEE) double format. */ - exp = 0; - if (d >= 1.0) - { - if (d * 0.5 == d) - abort (); - - while (d >= 32768.0) - { - d *= (1.0 / 65536.0); - exp += 16; - } - while (d >= 1.0) - { - d *= 0.5; - exp += 1; - } - } - else if (d < 0.5) - { - while (d < (1.0 / 65536.0)) - { - d *= 65536.0; - exp -= 16; - } - while (d < 0.5) - { - d *= 2.0; - exp -= 1; - } - } - - d *= MP_BASE_AS_DOUBLE; -#if BITS_PER_MP_LIMB == 64 - manl = d; -#else - manh = d; - manl = (d - manh) * MP_BASE_AS_DOUBLE; -#endif - } -#endif - - sc = (unsigned) exp % BITS_PER_MP_LIMB; - - /* We add something here to get rounding right. */ - exp = (exp + 2048) / BITS_PER_MP_LIMB - 2048 / BITS_PER_MP_LIMB + 1; - -#if BITS_PER_MP_LIMB == 64 - if (sc != 0) - { - rp[1] = manl >> (BITS_PER_MP_LIMB - sc); - rp[0] = manl << sc; - } - else - { - rp[1] = manl; - rp[0] = 0; - exp--; - } -#else - if (sc != 0) - { - rp[2] = manh >> (BITS_PER_MP_LIMB - sc); - rp[1] = (manl >> (BITS_PER_MP_LIMB - sc)) | (manh << sc); - rp[0] = manl << sc; - } - else - { - rp[2] = manh; - rp[1] = manl; - rp[0] = 0; - exp--; - } -#endif - - return exp; -} diff --git a/rts/gmp/gmp-impl.h b/rts/gmp/gmp-impl.h deleted file mode 100644 index 3c7ac26..0000000 --- a/rts/gmp/gmp-impl.h +++ /dev/null @@ -1,1072 +0,0 @@ -/* Include file for internal GNU MP types and definitions. - - THE CONTENTS OF THIS FILE ARE FOR INTERNAL USE AND ARE ALMOST CERTAIN TO - BE SUBJECT TO INCOMPATIBLE CHANGES IN FUTURE GNU MP RELEASES. - -Copyright (C) 1991, 1993, 1994, 1995, 1996, 1997, 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 "config.h" -#include "gmp-mparam.h" -/* #include "longlong.h" */ - -/* When using gcc, make sure to use its builtin alloca. */ -#if ! defined (alloca) && defined (__GNUC__) -#define alloca __builtin_alloca -#define HAVE_ALLOCA 1 -#endif - -/* When using cc, do whatever necessary to allow use of alloca. For many - machines, this means including alloca.h. IBM's compilers need a #pragma - in "each module that needs to use alloca". */ -#if ! defined (alloca) -/* We need lots of variants for MIPS, to cover all versions and perversions - of OSes for MIPS. */ -#if defined (__mips) || defined (MIPSEL) || defined (MIPSEB) \ - || defined (_MIPSEL) || defined (_MIPSEB) || defined (__sgi) \ - || defined (__alpha) || defined (__sparc) || defined (sparc) \ - || defined (__ksr__) -#include -#define HAVE_ALLOCA -#endif -#if defined (_IBMR2) -#pragma alloca -#define HAVE_ALLOCA -#endif -#if defined (__DECC) -#define alloca(x) __ALLOCA(x) -#define HAVE_ALLOCA -#endif -#endif - -#if defined (alloca) -# ifndef HAVE_ALLOCA -#define HAVE_ALLOCA -# endif -#endif - -#if ! defined (HAVE_ALLOCA) || USE_STACK_ALLOC -#include "stack-alloc.h" -#else -#define TMP_DECL(m) -#define TMP_ALLOC(x) alloca(x) -#define TMP_MARK(m) -#define TMP_FREE(m) -#endif - -/* Allocating various types. */ -#define TMP_ALLOC_TYPE(n,type) ((type *) TMP_ALLOC ((n) * sizeof (type))) -#define TMP_ALLOC_LIMBS(n) TMP_ALLOC_TYPE(n,mp_limb_t) -#define TMP_ALLOC_MP_PTRS(n) TMP_ALLOC_TYPE(n,mp_ptr) - - -#if ! defined (__GNUC__) /* FIXME: Test for C++ compilers here, - __DECC understands __inline */ -#define inline /* Empty */ -#endif - -#define ABS(x) (x >= 0 ? x : -x) -#define MIN(l,o) ((l) < (o) ? (l) : (o)) -#define MAX(h,i) ((h) > (i) ? (h) : (i)) -#define numberof(x) (sizeof (x) / sizeof ((x)[0])) - -/* Field access macros. */ -#define SIZ(x) ((x)->_mp_size) -#define ABSIZ(x) ABS (SIZ (x)) -#define PTR(x) ((x)->_mp_d) -#define LIMBS(x) ((x)->_mp_d) -#define EXP(x) ((x)->_mp_exp) -#define PREC(x) ((x)->_mp_prec) -#define ALLOC(x) ((x)->_mp_alloc) - -/* Extra casts because shorts are promoted to ints by "~" and "<<". "-1" - rather than "1" in SIGNED_TYPE_MIN avoids warnings from some compilers - about arithmetic overflow. */ -#define UNSIGNED_TYPE_MAX(type) ((type) ~ (type) 0) -#define UNSIGNED_TYPE_HIGHBIT(type) ((type) ~ (UNSIGNED_TYPE_MAX(type) >> 1)) -#define SIGNED_TYPE_MIN(type) (((type) -1) << (8*sizeof(type)-1)) -#define SIGNED_TYPE_MAX(type) ((type) ~ SIGNED_TYPE_MIN(type)) -#define SIGNED_TYPE_HIGHBIT(type) SIGNED_TYPE_MIN(type) - -#define MP_LIMB_T_MAX UNSIGNED_TYPE_MAX (mp_limb_t) -#define MP_LIMB_T_HIGHBIT UNSIGNED_TYPE_HIGHBIT (mp_limb_t) - -#define MP_SIZE_T_MAX SIGNED_TYPE_MAX (mp_size_t) - -#ifndef ULONG_MAX -#define ULONG_MAX UNSIGNED_TYPE_MAX (unsigned long) -#endif -#define ULONG_HIGHBIT UNSIGNED_TYPE_HIGHBIT (unsigned long) -#define LONG_HIGHBIT SIGNED_TYPE_HIGHBIT (long) -#ifndef LONG_MAX -#define LONG_MAX SIGNED_TYPE_MAX (long) -#endif - -#ifndef USHORT_MAX -#define USHORT_MAX UNSIGNED_TYPE_MAX (unsigned short) -#endif -#define USHORT_HIGHBIT UNSIGNED_TYPE_HIGHBIT (unsigned short) -#define SHORT_HIGHBIT SIGNED_TYPE_HIGHBIT (short) -#ifndef SHORT_MAX -#define SHORT_MAX SIGNED_TYPE_MAX (short) -#endif - - -/* Swap macros. */ - -#define MP_LIMB_T_SWAP(x, y) \ - do { \ - mp_limb_t __mp_limb_t_swap__tmp = (x); \ - (x) = (y); \ - (y) = __mp_limb_t_swap__tmp; \ - } while (0) -#define MP_SIZE_T_SWAP(x, y) \ - do { \ - mp_size_t __mp_size_t_swap__tmp = (x); \ - (x) = (y); \ - (y) = __mp_size_t_swap__tmp; \ - } while (0) - -#define MP_PTR_SWAP(x, y) \ - do { \ - mp_ptr __mp_ptr_swap__tmp = (x); \ - (x) = (y); \ - (y) = __mp_ptr_swap__tmp; \ - } while (0) -#define MP_SRCPTR_SWAP(x, y) \ - do { \ - mp_srcptr __mp_srcptr_swap__tmp = (x); \ - (x) = (y); \ - (y) = __mp_srcptr_swap__tmp; \ - } while (0) - -#define MPN_PTR_SWAP(xp,xs, yp,ys) \ - do { \ - MP_PTR_SWAP (xp, yp); \ - MP_SIZE_T_SWAP (xs, ys); \ - } while(0) -#define MPN_SRCPTR_SWAP(xp,xs, yp,ys) \ - do { \ - MP_SRCPTR_SWAP (xp, yp); \ - MP_SIZE_T_SWAP (xs, ys); \ - } while(0) - -#define MPZ_PTR_SWAP(x, y) \ - do { \ - mpz_ptr __mpz_ptr_swap__tmp = (x); \ - (x) = (y); \ - (y) = __mpz_ptr_swap__tmp; \ - } while (0) -#define MPZ_SRCPTR_SWAP(x, y) \ - do { \ - mpz_srcptr __mpz_srcptr_swap__tmp = (x); \ - (x) = (y); \ - (y) = __mpz_srcptr_swap__tmp; \ - } while (0) - - -#if defined (__cplusplus) -extern "C" { -#endif - -/* FIXME: These are purely internal, so do a search and replace to change - them to __gmp forms, rather than using these macros. */ -#define _mp_allocate_func __gmp_allocate_func -#define _mp_reallocate_func __gmp_reallocate_func -#define _mp_free_func __gmp_free_func -#define _mp_default_allocate __gmp_default_allocate -#define _mp_default_reallocate __gmp_default_reallocate -#define _mp_default_free __gmp_default_free - -extern void * (*_mp_allocate_func) _PROTO ((size_t)); -extern void * (*_mp_reallocate_func) _PROTO ((void *, size_t, size_t)); -extern void (*_mp_free_func) _PROTO ((void *, size_t)); - -void *_mp_default_allocate _PROTO ((size_t)); -void *_mp_default_reallocate _PROTO ((void *, size_t, size_t)); -void _mp_default_free _PROTO ((void *, size_t)); - -#define _MP_ALLOCATE_FUNC_TYPE(n,type) \ - ((type *) (*_mp_allocate_func) ((n) * sizeof (type))) -#define _MP_ALLOCATE_FUNC_LIMBS(n) _MP_ALLOCATE_FUNC_TYPE(n,mp_limb_t) - -#define _MP_FREE_FUNC_TYPE(p,n,type) (*_mp_free_func) (p, (n) * sizeof (type)) -#define _MP_FREE_FUNC_LIMBS(p,n) _MP_FREE_FUNC_TYPE(p,n,mp_limb_t) - - -#if (__STDC__-0) || defined (__cplusplus) - -#else - -#define const /* Empty */ -#define signed /* Empty */ - -#endif - -#if defined (__GNUC__) && defined (__i386__) -#if 0 /* check that these actually improve things */ -#define MPN_COPY_INCR(DST, SRC, N) \ - __asm__ ("cld\n\trep\n\tmovsl" : : \ - "D" (DST), "S" (SRC), "c" (N) : \ - "cx", "di", "si", "memory") -#define MPN_COPY_DECR(DST, SRC, N) \ - __asm__ ("std\n\trep\n\tmovsl" : : \ - "D" ((DST) + (N) - 1), "S" ((SRC) + (N) - 1), "c" (N) : \ - "cx", "di", "si", "memory") -#define MPN_NORMALIZE_NOT_ZERO(P, N) \ - do { \ - __asm__ ("std\n\trepe\n\tscasl" : "=c" (N) : \ - "a" (0), "D" ((P) + (N) - 1), "0" (N) : \ - "cx", "di"); \ - (N)++; \ - } while (0) -#endif -#endif - -#if HAVE_NATIVE_mpn_copyi -#define mpn_copyi __MPN(copyi) -void mpn_copyi _PROTO ((mp_ptr, mp_srcptr, mp_size_t)); -#endif - -/* Remap names of internal mpn functions. */ -#define __clz_tab __MPN(clz_tab) -#define mpn_udiv_w_sdiv __MPN(udiv_w_sdiv) -#define mpn_reciprocal __MPN(reciprocal) - -#define mpn_sb_divrem_mn __MPN(sb_divrem_mn) -#define mpn_bz_divrem_n __MPN(bz_divrem_n) -/* #define mpn_tdiv_q __MPN(tdiv_q) */ - -#define mpn_kara_mul_n __MPN(kara_mul_n) -void mpn_kara_mul_n _PROTO((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_ptr)); - -#define mpn_kara_sqr_n __MPN(kara_sqr_n) -void mpn_kara_sqr_n _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_ptr)); - -#define mpn_toom3_mul_n __MPN(toom3_mul_n) -void mpn_toom3_mul_n _PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t,mp_ptr)); - -#define mpn_toom3_sqr_n __MPN(toom3_sqr_n) -void mpn_toom3_sqr_n _PROTO((mp_ptr, mp_srcptr, mp_size_t, mp_ptr)); - -#define mpn_fft_best_k __MPN(fft_best_k) -int mpn_fft_best_k _PROTO ((mp_size_t n, int sqr)); - -#define mpn_mul_fft __MPN(mul_fft) -void mpn_mul_fft _PROTO ((mp_ptr op, mp_size_t pl, - mp_srcptr n, mp_size_t nl, - mp_srcptr m, mp_size_t ml, - int k)); - -#define mpn_mul_fft_full __MPN(mul_fft_full) -void mpn_mul_fft_full _PROTO ((mp_ptr op, - mp_srcptr n, mp_size_t nl, - mp_srcptr m, mp_size_t ml)); - -#define mpn_fft_next_size __MPN(fft_next_size) -mp_size_t mpn_fft_next_size _PROTO ((mp_size_t pl, int k)); - -mp_limb_t mpn_sb_divrem_mn _PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t)); -mp_limb_t mpn_bz_divrem_n _PROTO ((mp_ptr, mp_ptr, mp_srcptr, mp_size_t)); -/* void mpn_tdiv_q _PROTO ((mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t)); */ - -/* Copy NLIMBS *limbs* from SRC to DST, NLIMBS==0 allowed. */ -#ifndef MPN_COPY_INCR -#if HAVE_NATIVE_mpn_copyi -#define MPN_COPY_INCR(DST, SRC, NLIMBS) mpn_copyi (DST, SRC, NLIMBS) -#else -#define MPN_COPY_INCR(DST, SRC, NLIMBS) \ - do { \ - mp_size_t __i; \ - for (__i = 0; __i < (NLIMBS); __i++) \ - (DST)[__i] = (SRC)[__i]; \ - } while (0) -#endif -#endif - -#if HAVE_NATIVE_mpn_copyd -#define mpn_copyd __MPN(copyd) -void mpn_copyd _PROTO ((mp_ptr, mp_srcptr, mp_size_t)); -#endif - -/* NLIMBS==0 allowed */ -#ifndef MPN_COPY_DECR -#if HAVE_NATIVE_mpn_copyd -#define MPN_COPY_DECR(DST, SRC, NLIMBS) mpn_copyd (DST, SRC, NLIMBS) -#else -#define MPN_COPY_DECR(DST, SRC, NLIMBS) \ - do { \ - mp_size_t __i; \ - for (__i = (NLIMBS) - 1; __i >= 0; __i--) \ - (DST)[__i] = (SRC)[__i]; \ - } while (0) -#endif -#endif - -/* Define MPN_COPY for vector computers. Since #pragma cannot be in a macro, - rely on function inlining. */ -#if defined (_CRAY) || defined (__uxp__) -static inline void -_MPN_COPY (d, s, n) mp_ptr d; mp_srcptr s; mp_size_t n; -{ - int i; /* Faster for Cray with plain int */ -#pragma _CRI ivdep /* Cray PVP systems */ -#pragma loop noalias d,s /* Fujitsu VPP systems */ - for (i = 0; i < n; i++) - d[i] = s[i]; -} -#define MPN_COPY _MPN_COPY -#endif - -#ifndef MPN_COPY -#define MPN_COPY MPN_COPY_INCR -#endif - -/* Zero NLIMBS *limbs* AT DST. */ -#ifndef MPN_ZERO -#define MPN_ZERO(DST, NLIMBS) \ - do { \ - mp_size_t __i; \ - for (__i = 0; __i < (NLIMBS); __i++) \ - (DST)[__i] = 0; \ - } while (0) -#endif - -#ifndef MPN_NORMALIZE -#define MPN_NORMALIZE(DST, NLIMBS) \ - do { \ - while (NLIMBS > 0) \ - { \ - if ((DST)[(NLIMBS) - 1] != 0) \ - break; \ - NLIMBS--; \ - } \ - } while (0) -#endif -#ifndef MPN_NORMALIZE_NOT_ZERO -#define MPN_NORMALIZE_NOT_ZERO(DST, NLIMBS) \ - do { \ - while (1) \ - { \ - if ((DST)[(NLIMBS) - 1] != 0) \ - break; \ - NLIMBS--; \ - } \ - } while (0) -#endif - -/* Strip least significant zero limbs from ptr,size by incrementing ptr and - decrementing size. The number in ptr,size must be non-zero, ie. size!=0 - and somewhere a non-zero limb. */ -#define MPN_STRIP_LOW_ZEROS_NOT_ZERO(ptr, size) \ - do \ - { \ - ASSERT ((size) != 0); \ - while ((ptr)[0] == 0) \ - { \ - (ptr)++; \ - (size)--; \ - ASSERT (size >= 0); \ - } \ - } \ - while (0) - -/* Initialize X of type mpz_t with space for NLIMBS limbs. X should be a - temporary variable; it will be automatically cleared out at function - return. We use __x here to make it possible to accept both mpz_ptr and - mpz_t arguments. */ -#define MPZ_TMP_INIT(X, NLIMBS) \ - do { \ - mpz_ptr __x = (X); \ - __x->_mp_alloc = (NLIMBS); \ - __x->_mp_d = (mp_ptr) TMP_ALLOC ((NLIMBS) * BYTES_PER_MP_LIMB); \ - } while (0) - -/* Realloc for an mpz_t WHAT if it has less thann NEEDED limbs. */ -#define MPZ_REALLOC(what,needed) \ - do { \ - if ((needed) > ALLOC (what)) \ - _mpz_realloc (what, needed); \ - } while (0) - -/* If KARATSUBA_MUL_THRESHOLD is not already defined, define it to a - value which is good on most machines. */ -#ifndef KARATSUBA_MUL_THRESHOLD -#define KARATSUBA_MUL_THRESHOLD 32 -#endif - -/* If TOOM3_MUL_THRESHOLD is not already defined, define it to a - value which is good on most machines. */ -#ifndef TOOM3_MUL_THRESHOLD -#define TOOM3_MUL_THRESHOLD 256 -#endif - -#ifndef KARATSUBA_SQR_THRESHOLD -#define KARATSUBA_SQR_THRESHOLD (2*KARATSUBA_MUL_THRESHOLD) -#endif - -#ifndef TOOM3_SQR_THRESHOLD -#define TOOM3_SQR_THRESHOLD (2*TOOM3_MUL_THRESHOLD) -#endif - -/* First k to use for an FFT modF multiply. A modF FFT is an order - log(2^k)/log(2^(k-1)) algorithm, so k=3 is merely 1.5 like karatsuba, - whereas k=4 is 1.33 which is faster than toom3 at 1.485. */ -#define FFT_FIRST_K 4 - -/* Threshold at which FFT should be used to do a modF NxN -> N multiply. */ -#ifndef FFT_MODF_MUL_THRESHOLD -#define FFT_MODF_MUL_THRESHOLD (TOOM3_MUL_THRESHOLD * 3) -#endif -#ifndef FFT_MODF_SQR_THRESHOLD -#define FFT_MODF_SQR_THRESHOLD (TOOM3_SQR_THRESHOLD * 3) -#endif - -/* Threshold at which FFT should be used to do an NxN -> 2N multiply. This - will be a size where FFT is using k=7 or k=8, since an FFT-k used for an - NxN->2N multiply and not recursing into itself is an order - log(2^k)/log(2^(k-2)) algorithm, so it'll be at least k=7 at 1.39 which - is the first better than toom3. */ -#ifndef FFT_MUL_THRESHOLD -#define FFT_MUL_THRESHOLD (FFT_MODF_MUL_THRESHOLD * 10) -#endif -#ifndef FFT_SQR_THRESHOLD -#define FFT_SQR_THRESHOLD (FFT_MODF_SQR_THRESHOLD * 10) -#endif - -/* Table of thresholds for successive modF FFT "k"s. The first entry is - where FFT_FIRST_K+1 should be used, the second FFT_FIRST_K+2, - etc. See mpn_fft_best_k(). */ -#ifndef FFT_MUL_TABLE -#define FFT_MUL_TABLE \ - { TOOM3_MUL_THRESHOLD * 4, /* k=5 */ \ - TOOM3_MUL_THRESHOLD * 8, /* k=6 */ \ - TOOM3_MUL_THRESHOLD * 16, /* k=7 */ \ - TOOM3_MUL_THRESHOLD * 32, /* k=8 */ \ - TOOM3_MUL_THRESHOLD * 96, /* k=9 */ \ - TOOM3_MUL_THRESHOLD * 288, /* k=10 */ \ - 0 } -#endif -#ifndef FFT_SQR_TABLE -#define FFT_SQR_TABLE \ - { TOOM3_SQR_THRESHOLD * 4, /* k=5 */ \ - TOOM3_SQR_THRESHOLD * 8, /* k=6 */ \ - TOOM3_SQR_THRESHOLD * 16, /* k=7 */ \ - TOOM3_SQR_THRESHOLD * 32, /* k=8 */ \ - TOOM3_SQR_THRESHOLD * 96, /* k=9 */ \ - TOOM3_SQR_THRESHOLD * 288, /* k=10 */ \ - 0 } -#endif - -#ifndef FFT_TABLE_ATTRS -#define FFT_TABLE_ATTRS static const -#endif - -#define MPN_FFT_TABLE_SIZE 16 - - -/* Return non-zero if xp,xsize and yp,ysize overlap. - If xp+xsize<=yp there's no overlap, or if yp+ysize<=xp there's no - overlap. If both these are false, there's an overlap. */ -#define MPN_OVERLAP_P(xp, xsize, yp, ysize) \ - ((xp) + (xsize) > (yp) && (yp) + (ysize) > (xp)) - - -/* ASSERT() is a private assertion checking scheme, similar to . - ASSERT() does the check only if WANT_ASSERT is selected, ASSERT_ALWAYS() - does it always. Generally assertions are meant for development, but - might help when looking for a problem later too. - - ASSERT_NOCARRY() uses ASSERT() to check the expression is zero, but if - assertion checking is disabled, the expression is still evaluated. This - is meant for use with routines like mpn_add_n() where the return value - represents a carry or whatever that shouldn't occur. For example, - ASSERT_NOCARRY (mpn_add_n (rp, s1p, s2p, size)); */ - -#ifdef __LINE__ -#define ASSERT_LINE __LINE__ -#else -#define ASSERT_LINE -1 -#endif - -#ifdef __FILE__ -#define ASSERT_FILE __FILE__ -#else -#define ASSERT_FILE "" -#endif - -int __gmp_assert_fail _PROTO((const char *filename, int linenum, - const char *expr)); - -#if HAVE_STRINGIZE -#define ASSERT_FAIL(expr) __gmp_assert_fail (ASSERT_FILE, ASSERT_LINE, #expr) -#else -#define ASSERT_FAIL(expr) __gmp_assert_fail (ASSERT_FILE, ASSERT_LINE, "expr") -#endif - -#if HAVE_VOID -#define CAST_TO_VOID (void) -#else -#define CAST_TO_VOID -#endif - -#define ASSERT_ALWAYS(expr) ((expr) ? 0 : ASSERT_FAIL (expr)) - -#if WANT_ASSERT -#define ASSERT(expr) ASSERT_ALWAYS (expr) -#define ASSERT_NOCARRY(expr) ASSERT_ALWAYS ((expr) == 0) - -#else -#define ASSERT(expr) (CAST_TO_VOID 0) -#define ASSERT_NOCARRY(expr) (expr) -#endif - - -#if HAVE_NATIVE_mpn_com_n -#define mpn_com_n __MPN(com_n) -void mpn_com_n _PROTO ((mp_ptr, mp_srcptr, mp_size_t)); -#else -#define mpn_com_n(d,s,n) \ - do \ - { \ - mp_ptr __d = (d); \ - mp_srcptr __s = (s); \ - mp_size_t __n = (n); \ - do \ - *__d++ = ~ *__s++; \ - while (--__n); \ - } \ - while (0) -#endif - -#define MPN_LOGOPS_N_INLINE(d,s1,s2,n,dop,op,s2op) \ - do \ - { \ - mp_ptr __d = (d); \ - mp_srcptr __s1 = (s1); \ - mp_srcptr __s2 = (s2); \ - mp_size_t __n = (n); \ - do \ - *__d++ = dop (*__s1++ op s2op *__s2++); \ - while (--__n); \ - } \ - while (0) - -#if HAVE_NATIVE_mpn_and_n -#define mpn_and_n __MPN(and_n) -void mpn_and_n _PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); -#else -#define mpn_and_n(d,s1,s2,n) MPN_LOGOPS_N_INLINE(d,s1,s2,n, ,&, ) -#endif - -#if HAVE_NATIVE_mpn_andn_n -#define mpn_andn_n __MPN(andn_n) -void mpn_andn_n _PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); -#else -#define mpn_andn_n(d,s1,s2,n) MPN_LOGOPS_N_INLINE(d,s1,s2,n, ,&,~) -#endif - -#if HAVE_NATIVE_mpn_nand_n -#define mpn_nand_n __MPN(nand_n) -void mpn_nand_n _PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); -#else -#define mpn_nand_n(d,s1,s2,n) MPN_LOGOPS_N_INLINE(d,s1,s2,n,~,&, ) -#endif - -#if HAVE_NATIVE_mpn_ior_n -#define mpn_ior_n __MPN(ior_n) -void mpn_ior_n _PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); -#else -#define mpn_ior_n(d,s1,s2,n) MPN_LOGOPS_N_INLINE(d,s1,s2,n, ,|, ) -#endif - -#if HAVE_NATIVE_mpn_iorn_n -#define mpn_iorn_n __MPN(iorn_n) -void mpn_iorn_n _PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); -#else -#define mpn_iorn_n(d,s1,s2,n) MPN_LOGOPS_N_INLINE(d,s1,s2,n, ,|,~) -#endif - -#if HAVE_NATIVE_mpn_nior_n -#define mpn_nior_n __MPN(nior_n) -void mpn_nior_n _PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); -#else -#define mpn_nior_n(d,s1,s2,n) MPN_LOGOPS_N_INLINE(d,s1,s2,n,~,|, ) -#endif - -#if HAVE_NATIVE_mpn_xor_n -#define mpn_xor_n __MPN(xor_n) -void mpn_xor_n _PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); -#else -#define mpn_xor_n(d,s1,s2,n) MPN_LOGOPS_N_INLINE(d,s1,s2,n, ,^, ) -#endif - -#if HAVE_NATIVE_mpn_xnor_n -#define mpn_xnor_n __MPN(xnor_n) -void mpn_xnor_n _PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); -#else -#define mpn_xnor_n(d,s1,s2,n) MPN_LOGOPS_N_INLINE(d,s1,s2,n,~,^, ) -#endif - -/* Structure for conversion between internal binary format and - strings in base 2..36. */ -struct bases -{ - /* Number of digits in the conversion base that always fits in an mp_limb_t. - For example, for base 10 on a machine where a mp_limb_t has 32 bits this - is 9, since 10**9 is the largest number that fits into a mp_limb_t. */ - int chars_per_limb; - - /* log(2)/log(conversion_base) */ - double chars_per_bit_exactly; - - /* base**chars_per_limb, i.e. the biggest number that fits a word, built by - factors of base. Exception: For 2, 4, 8, etc, big_base is log2(base), - i.e. the number of bits used to represent each digit in the base. */ - mp_limb_t big_base; - - /* A BITS_PER_MP_LIMB bit approximation to 1/big_base, represented as a - fixed-point number. Instead of dividing by big_base an application can - choose to multiply by big_base_inverted. */ - mp_limb_t big_base_inverted; -}; - -#define __mp_bases __MPN(mp_bases) -extern const struct bases __mp_bases[]; -extern mp_size_t __gmp_default_fp_limb_precision; - -#if defined (__i386__) -#define TARGET_REGISTER_STARVED 1 -#else -#define TARGET_REGISTER_STARVED 0 -#endif - -/* Use a library function for invert_limb, if available. */ -#if ! defined (invert_limb) && HAVE_NATIVE_mpn_invert_limb -#define mpn_invert_limb __MPN(invert_limb) -mp_limb_t mpn_invert_limb _PROTO ((mp_limb_t)); -#define invert_limb(invxl,xl) (invxl = __MPN(invert_limb) (xl)) -#endif - -#ifndef invert_limb -#define invert_limb(invxl,xl) \ - do { \ - mp_limb_t dummy; \ - if (xl << 1 == 0) \ - invxl = ~(mp_limb_t) 0; \ - else \ - udiv_qrnnd (invxl, dummy, -xl, 0, xl); \ - } while (0) -#endif - -/* Divide the two-limb number in (NH,,NL) by D, with DI being the largest - limb not larger than (2**(2*BITS_PER_MP_LIMB))/D - (2**BITS_PER_MP_LIMB). - If this would yield overflow, DI should be the largest possible number - (i.e., only ones). For correct operation, the most significant bit of D - has to be set. Put the quotient in Q and the remainder in R. */ -#define udiv_qrnnd_preinv(q, r, nh, nl, d, di) \ - do { \ - mp_limb_t _q, _ql, _r; \ - mp_limb_t _xh, _xl; \ - umul_ppmm (_q, _ql, (nh), (di)); \ - _q += (nh); /* DI is 2**BITS_PER_MP_LIMB too small */\ - umul_ppmm (_xh, _xl, _q, (d)); \ - sub_ddmmss (_xh, _r, (nh), (nl), _xh, _xl); \ - if (_xh != 0) \ - { \ - sub_ddmmss (_xh, _r, _xh, _r, 0, (d)); \ - _q += 1; \ - if (_xh != 0) \ - { \ - sub_ddmmss (_xh, _r, _xh, _r, 0, (d)); \ - _q += 1; \ - } \ - } \ - if (_r >= (d)) \ - { \ - _r -= (d); \ - _q += 1; \ - } \ - (r) = _r; \ - (q) = _q; \ - } while (0) -/* Like udiv_qrnnd_preinv, but for for any value D. DNORM is D shifted left - so that its most significant bit is set. LGUP is ceil(log2(D)). */ -#define udiv_qrnnd_preinv2gen(q, r, nh, nl, d, di, dnorm, lgup) \ - do { \ - mp_limb_t _n2, _n10, _n1, _nadj, _q1; \ - mp_limb_t _xh, _xl; \ - _n2 = ((nh) << (BITS_PER_MP_LIMB - (lgup))) + ((nl) >> 1 >> (l - 1));\ - _n10 = (nl) << (BITS_PER_MP_LIMB - (lgup)); \ - _n1 = ((mp_limb_signed_t) _n10 >> (BITS_PER_MP_LIMB - 1)); \ - _nadj = _n10 + (_n1 & (dnorm)); \ - umul_ppmm (_xh, _xl, di, _n2 - _n1); \ - add_ssaaaa (_xh, _xl, _xh, _xl, 0, _nadj); \ - _q1 = ~(_n2 + _xh); \ - umul_ppmm (_xh, _xl, _q1, d); \ - add_ssaaaa (_xh, _xl, _xh, _xl, nh, nl); \ - _xh -= (d); \ - (r) = _xl + ((d) & _xh); \ - (q) = _xh - _q1; \ - } while (0) -/* Exactly like udiv_qrnnd_preinv, but branch-free. It is not clear which - version to use. */ -#define udiv_qrnnd_preinv2norm(q, r, nh, nl, d, di) \ - do { \ - mp_limb_t _n2, _n10, _n1, _nadj, _q1; \ - mp_limb_t _xh, _xl; \ - _n2 = (nh); \ - _n10 = (nl); \ - _n1 = ((mp_limb_signed_t) _n10 >> (BITS_PER_MP_LIMB - 1)); \ - _nadj = _n10 + (_n1 & (d)); \ - umul_ppmm (_xh, _xl, di, _n2 - _n1); \ - add_ssaaaa (_xh, _xl, _xh, _xl, 0, _nadj); \ - _q1 = ~(_n2 + _xh); \ - umul_ppmm (_xh, _xl, _q1, d); \ - add_ssaaaa (_xh, _xl, _xh, _xl, nh, nl); \ - _xh -= (d); \ - (r) = _xl + ((d) & _xh); \ - (q) = _xh - _q1; \ - } while (0) - - -/* modlimb_invert() sets "inv" to the multiplicative inverse of "n" modulo - 2^BITS_PER_MP_LIMB, ie. so that inv*n == 1 mod 2^BITS_PER_MP_LIMB. - "n" must be odd (otherwise such an inverse doesn't exist). - - This is not to be confused with invert_limb(), which is completely - different. - - The table lookup gives an inverse with the low 8 bits valid, and each - multiply step doubles the number of bits. See Jebelean's exact division - paper, end of section 4 (reference in gmp.texi). */ - -#define modlimb_invert_table __gmp_modlimb_invert_table -extern const unsigned char modlimb_invert_table[128]; - -#if BITS_PER_MP_LIMB <= 32 -#define modlimb_invert(inv,n) \ - do { \ - mp_limb_t __n = (n); \ - mp_limb_t __inv; \ - ASSERT ((__n & 1) == 1); \ - __inv = modlimb_invert_table[(__n&0xFF)/2]; /* 8 */ \ - __inv = 2 * __inv - __inv * __inv * __n; /* 16 */ \ - __inv = 2 * __inv - __inv * __inv * __n; /* 32 */ \ - ASSERT (__inv * __n == 1); \ - (inv) = __inv; \ - } while (0) -#endif - -#if BITS_PER_MP_LIMB > 32 && BITS_PER_MP_LIMB <= 64 -#define modlimb_invert(inv,n) \ - do { \ - mp_limb_t __n = (n); \ - mp_limb_t __inv; \ - ASSERT ((__n & 1) == 1); \ - __inv = modlimb_invert_table[(__n&0xFF)/2]; /* 8 */ \ - __inv = 2 * __inv - __inv * __inv * __n; /* 16 */ \ - __inv = 2 * __inv - __inv * __inv * __n; /* 32 */ \ - __inv = 2 * __inv - __inv * __inv * __n; /* 64 */ \ - ASSERT (__inv * __n == 1); \ - (inv) = __inv; \ - } while (0) -#endif - - -/* The `mode' attribute was introduced in GCC 2.2, but we can only distinguish - between GCC 2 releases from 2.5, since __GNUC_MINOR__ wasn't introduced - until then. */ -#if (__GNUC__ - 0 > 2 || defined (__GNUC_MINOR__)) && ! defined (__APPLE_CC__) -/* Define stuff for longlong.h. */ -typedef unsigned int UQItype __attribute__ ((mode (QI))); -typedef int SItype __attribute__ ((mode (SI))); -typedef unsigned int USItype __attribute__ ((mode (SI))); -typedef int DItype __attribute__ ((mode (DI))); -typedef unsigned int UDItype __attribute__ ((mode (DI))); -#else -typedef unsigned char UQItype; -typedef long SItype; -typedef unsigned long USItype; -#if defined _LONGLONG || defined _LONG_LONG_LIMB -typedef long long int DItype; -typedef unsigned long long int UDItype; -#else /* Assume `long' gives us a wide enough type. Needed for hppa2.0w. */ -typedef long int DItype; -typedef unsigned long int UDItype; -#endif -#endif - -typedef mp_limb_t UWtype; -typedef unsigned int UHWtype; -#define W_TYPE_SIZE BITS_PER_MP_LIMB - -/* Define ieee_double_extract and _GMP_IEEE_FLOATS. */ - -#if (defined (__arm__) && (defined (__ARMWEL__) || defined (__linux__))) -/* Special case for little endian ARM since floats remain in big-endian. */ -#define _GMP_IEEE_FLOATS 1 -union ieee_double_extract -{ - struct - { - unsigned int manh:20; - unsigned int exp:11; - unsigned int sig:1; - unsigned int manl:32; - } s; - double d; -}; -#else -#if defined (_LITTLE_ENDIAN) || defined (__LITTLE_ENDIAN__) \ - || defined (__alpha) \ - || defined (__clipper__) \ - || defined (__cris) \ - || defined (__i386__) \ - || defined (__i860__) \ - || defined (__i960__) \ - || defined (MIPSEL) || defined (_MIPSEL) \ - || defined (__ns32000__) \ - || defined (__WINNT) || defined (_WIN32) -#define _GMP_IEEE_FLOATS 1 -union ieee_double_extract -{ - struct - { - unsigned int manl:32; - unsigned int manh:20; - unsigned int exp:11; - unsigned int sig:1; - } s; - double d; -}; -#else /* Need this as an #else since the tests aren't made exclusive. */ -#if defined (_BIG_ENDIAN) || defined (__BIG_ENDIAN__) \ - || defined (__a29k__) || defined (_AM29K) \ - || defined (__arm__) \ - || (defined (__convex__) && defined (_IEEE_FLOAT_)) \ - || defined (_CRAYMPP) \ - || defined (__i370__) || defined (__mvs__) \ - || defined (__mc68000__) || defined (__mc68020__) || defined (__m68k__)\ - || defined(mc68020) \ - || defined (__m88000__) \ - || defined (MIPSEB) || defined (_MIPSEB) \ - || defined (__hppa) || defined (__hppa__) \ - || defined (__pyr__) \ - || defined (__ibm032__) \ - || defined (_IBMR2) || defined (_ARCH_PPC) \ - || defined (__sh__) \ - || defined (__sparc) || defined (sparc) \ - || defined (__we32k__) -#define _GMP_IEEE_FLOATS 1 -union ieee_double_extract -{ - struct - { - unsigned int sig:1; - unsigned int exp:11; - unsigned int manh:20; - unsigned int manl:32; - } s; - double d; -}; -#endif -#endif -#endif - -/* Using "(2.0 * ((mp_limb_t) 1 << (BITS_PER_MP_LIMB - 1)))" doesn't work on - SunOS 4.1.4 native /usr/ucb/cc (K&R), it comes out as -4294967296.0, - presumably due to treating the mp_limb_t constant as signed rather than - unsigned. */ -#define MP_BASE_AS_DOUBLE (4.0 * ((mp_limb_t) 1 << (BITS_PER_MP_LIMB - 2))) -#if BITS_PER_MP_LIMB == 64 -#define LIMBS_PER_DOUBLE 2 -#else -#define LIMBS_PER_DOUBLE 3 -#endif - -double __gmp_scale2 _PROTO ((double, int)); -int __gmp_extract_double _PROTO ((mp_ptr, double)); - -extern int __gmp_junk; -extern const int __gmp_0; -#define GMP_ERROR(code) (gmp_errno |= (code), __gmp_junk = 10/__gmp_0) -#define DIVIDE_BY_ZERO GMP_ERROR(GMP_ERROR_DIVISION_BY_ZERO) -#define SQRT_OF_NEGATIVE GMP_ERROR(GMP_ERROR_SQRT_OF_NEGATIVE) - -#if defined _LONG_LONG_LIMB -#if defined (__STDC__) -#define CNST_LIMB(C) C##LL -#else -#define CNST_LIMB(C) C/**/LL -#endif -#else /* not _LONG_LONG_LIMB */ -#if defined (__STDC__) -#define CNST_LIMB(C) C##L -#else -#define CNST_LIMB(C) C/**/L -#endif -#endif /* _LONG_LONG_LIMB */ - -/*** Stuff used by mpn/generic/prefsqr.c and mpn/generic/next_prime.c ***/ -#if BITS_PER_MP_LIMB == 32 -#define PP 0xC0CFD797L /* 3 x 5 x 7 x 11 x 13 x ... x 29 */ -#define PP_INVERTED 0x53E5645CL -#define PP_MAXPRIME 29 -#define PP_MASK 0x208A28A8L -#endif - -#if BITS_PER_MP_LIMB == 64 -#define PP CNST_LIMB(0xE221F97C30E94E1D) /* 3 x 5 x 7 x 11 x 13 x ... x 53 */ -#define PP_INVERTED CNST_LIMB(0x21CFE6CFC938B36B) -#define PP_MAXPRIME 53 -#define PP_MASK CNST_LIMB(0x208A20A08A28A8) -#endif - - -/* BIT1 means a result value in bit 1 (second least significant bit), with a - zero bit representing +1 and a one bit representing -1. Bits other than - bit 1 are garbage. - - JACOBI_TWOS_U_BIT1 and JACOBI_RECIP_UU_BIT1 are used in mpn_jacobi_base - and their speed is important. Expressions are used rather than - conditionals to accumulate sign changes, which effectively means XORs - instead of conditional JUMPs. */ - -/* (a/0), with a signed; is 1 if a=+/-1, 0 otherwise */ -#define JACOBI_S0(a) \ - (((a) == 1) | ((a) == -1)) - -/* (a/0), with a unsigned; is 1 if a=+/-1, 0 otherwise */ -#define JACOBI_U0(a) \ - ((a) == 1) - -/* (a/0), with a an mpz_t; is 1 if a=+/-1, 0 otherwise - An mpz_t always has at least one limb of allocated space, so the fetch of - the low limb is valid. */ -#define JACOBI_Z0(a) \ - (((SIZ(a) == 1) | (SIZ(a) == -1)) & (PTR(a)[0] == 1)) - -/* Convert a bit1 to +1 or -1. */ -#define JACOBI_BIT1_TO_PN(result_bit1) \ - (1 - ((result_bit1) & 2)) - -/* (2/b), with b unsigned and odd; - is (-1)^((b^2-1)/8) which is 1 if b==1,7mod8 or -1 if b==3,5mod8 and - hence obtained from (b>>1)^b */ -#define JACOBI_TWO_U_BIT1(b) \ - (ASSERT (b & 1), (((b) >> 1) ^ (b))) - -/* (2/b)^twos, with b unsigned and odd */ -#define JACOBI_TWOS_U_BIT1(twos, b) \ - (((twos) << 1) & JACOBI_TWO_U_BIT1 (b)) - -/* (2/b)^twos, with b unsigned and odd */ -#define JACOBI_TWOS_U(twos, b) \ - (JACOBI_BIT1_TO_PN (JACOBI_TWOS_U_BIT1 (twos, b))) - -/* (a/b) effect due to sign of a: signed/unsigned, b odd; - is (-1)^((b-1)/2) if a<0, or +1 if a>=0 */ -#define JACOBI_ASGN_SU_BIT1(a, b) \ - ((((a) < 0) << 1) & (b)) - -/* (a/b) effect due to sign of b: signed/mpz; - is -1 if a and b both negative, +1 otherwise */ -#define JACOBI_BSGN_SZ_BIT1(a, b) \ - ((((a) < 0) & (SIZ(b) < 0)) << 1) - -/* (a/b) effect due to sign of b: mpz/signed */ -#define JACOBI_BSGN_ZS_BIT1(a, b) \ - JACOBI_BSGN_SZ_BIT1(b, a) - -/* (a/b) reciprocity to switch to (b/a), a,b both unsigned and odd. - Is (-1)^((a-1)*(b-1)/4), which means +1 if either a,b==1mod4 or -1 if - both a,b==3mod4, achieved in bit 1 by a&b. No ASSERT()s about a,b odd - because this is used in a couple of places with only bit 1 of a or b - valid. */ -#define JACOBI_RECIP_UU_BIT1(a, b) \ - ((a) & (b)) - - -/* For testing and debugging. */ -#define MPZ_CHECK_FORMAT(z) \ - (ASSERT_ALWAYS (SIZ(z) == 0 || PTR(z)[ABSIZ(z) - 1] != 0), \ - ASSERT_ALWAYS (ALLOC(z) >= ABSIZ(z))) -#define MPZ_PROVOKE_REALLOC(z) \ - do { ALLOC(z) = ABSIZ(z); } while (0) - - -#if TUNE_PROGRAM_BUILD -/* Some extras wanted when recompiling some .c files for use by the tune - program. Not part of a normal build. */ - -extern mp_size_t mul_threshold[]; -extern mp_size_t fft_modf_mul_threshold; -extern mp_size_t sqr_threshold[]; -extern mp_size_t fft_modf_sqr_threshold; -extern mp_size_t bz_threshold[]; -extern mp_size_t fib_threshold[]; -extern mp_size_t powm_threshold[]; -extern mp_size_t gcd_accel_threshold[]; -extern mp_size_t gcdext_threshold[]; - -#undef KARATSUBA_MUL_THRESHOLD -#undef TOOM3_MUL_THRESHOLD -#undef FFT_MUL_TABLE -#undef FFT_MUL_THRESHOLD -#undef FFT_MODF_MUL_THRESHOLD -#undef KARATSUBA_SQR_THRESHOLD -#undef TOOM3_SQR_THRESHOLD -#undef FFT_SQR_TABLE -#undef FFT_SQR_THRESHOLD -#undef FFT_MODF_SQR_THRESHOLD -#undef BZ_THRESHOLD -#undef FIB_THRESHOLD -#undef POWM_THRESHOLD -#undef GCD_ACCEL_THRESHOLD -#undef GCDEXT_THRESHOLD - -#define KARATSUBA_MUL_THRESHOLD mul_threshold[0] -#define TOOM3_MUL_THRESHOLD mul_threshold[1] -#define FFT_MUL_TABLE 0 -#define FFT_MUL_THRESHOLD mul_threshold[2] -#define FFT_MODF_MUL_THRESHOLD fft_modf_mul_threshold -#define KARATSUBA_SQR_THRESHOLD sqr_threshold[0] -#define TOOM3_SQR_THRESHOLD sqr_threshold[1] -#define FFT_SQR_TABLE 0 -#define FFT_SQR_THRESHOLD sqr_threshold[2] -#define FFT_MODF_SQR_THRESHOLD fft_modf_sqr_threshold -#define BZ_THRESHOLD bz_threshold[0] -#define FIB_THRESHOLD fib_threshold[0] -#define POWM_THRESHOLD powm_threshold[0] -#define GCD_ACCEL_THRESHOLD gcd_accel_threshold[0] -#define GCDEXT_THRESHOLD gcdext_threshold[0] - -#define TOOM3_MUL_THRESHOLD_LIMIT 700 - -#undef FFT_TABLE_ATTRS -#define FFT_TABLE_ATTRS -extern mp_size_t mpn_fft_table[2][MPN_FFT_TABLE_SIZE]; - -#endif /* TUNE_PROGRAM_BUILD */ - -#if defined (__cplusplus) -} -#endif diff --git a/rts/gmp/gmp.h b/rts/gmp/gmp.h deleted file mode 100644 index 0f1b951..0000000 --- a/rts/gmp/gmp.h +++ /dev/null @@ -1,1083 +0,0 @@ -/* gmp.h -- Definitions for GNU multiple precision functions. - -Copyright (C) 1991, 1993, 1994, 1995, 1996, 1997, 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. */ - -#ifndef __GMP_H__ - -#ifndef __GNU_MP__ /* to allow inclusion of both gmp.h and mp.h */ -#define __GNU_MP__ 2 -#define __need_size_t -#include -#undef __need_size_t - -#ifndef STG_H -/* Get DLL_IMPORT */ -#include "../../includes/ghcconfig.h" -#include "../../includes/StgDLL.h" -#endif - -#if defined (__mips) && defined (_ABIN32) -/* Force the use of 64-bit limbs for all 64-bit MIPS CPUs if ABI permits. */ -#define _LONG_LONG_LIMB -#endif - -#if (__STDC__-0) || defined (__cplusplus) -#define __gmp_const const -#define __gmp_signed signed -#else -#define __gmp_const -#define __gmp_signed -#endif - -#if defined (__GNUC__) -#define __gmp_inline __inline__ -#else -#define __gmp_inline -#endif - -#ifndef _EXTERN_INLINE -#ifdef __GNUC__ -#define _EXTERN_INLINE extern __inline__ -#else -#define _EXTERN_INLINE static -#endif -#endif - -#ifdef _SHORT_LIMB -typedef unsigned int mp_limb_t; -typedef int mp_limb_signed_t; -#else -#ifdef _LONG_LONG_LIMB -typedef unsigned long long int mp_limb_t; -typedef long long int mp_limb_signed_t; -#else -typedef unsigned long int mp_limb_t; -typedef long int mp_limb_signed_t; -#endif -#endif - -typedef mp_limb_t * mp_ptr; -typedef __gmp_const mp_limb_t * mp_srcptr; -#if defined (_CRAY) && ! defined (_CRAYMPP) -/* plain `int' is much faster (48 bits) */ -typedef int mp_size_t; -typedef int mp_exp_t; -#else -typedef long int mp_size_t; -typedef long int mp_exp_t; -#endif - -typedef struct -{ - int _mp_alloc; /* Number of *limbs* allocated and pointed - to by the _mp_d field. */ - int _mp_size; /* abs(_mp_size) is the number of limbs the - last field points to. If _mp_size is - negative this is a negative number. */ - mp_limb_t *_mp_d; /* Pointer to the limbs. */ -} __mpz_struct; -#endif /* __GNU_MP__ */ - -typedef __mpz_struct MP_INT; -typedef __mpz_struct mpz_t[1]; - -typedef struct -{ - __mpz_struct _mp_num; - __mpz_struct _mp_den; -} __mpq_struct; - -typedef __mpq_struct MP_RAT; -typedef __mpq_struct mpq_t[1]; - -typedef struct -{ - int _mp_prec; /* Max precision, in number of `mp_limb_t's. - Set by mpf_init and modified by - mpf_set_prec. The area pointed to by the - _mp_d field contains `prec' + 1 limbs. */ - int _mp_size; /* abs(_mp_size) is the number of limbs the - last field points to. If _mp_size is - negative this is a negative number. */ - mp_exp_t _mp_exp; /* Exponent, in the base of `mp_limb_t'. */ - mp_limb_t *_mp_d; /* Pointer to the limbs. */ -} __mpf_struct; - -/* typedef __mpf_struct MP_FLOAT; */ -typedef __mpf_struct mpf_t[1]; - -/* Available random number generation algorithms. */ -typedef enum -{ - GMP_RAND_ALG_DEFAULT = 0, - GMP_RAND_ALG_LC = GMP_RAND_ALG_DEFAULT /* Linear congruential. */ -} gmp_randalg_t; - -/* Linear congruential data struct. */ -typedef struct { - mpz_t a; /* Multiplier. */ - unsigned long int c; /* Adder. */ - mpz_t m; /* Modulus (valid only if m2exp == 0). */ - unsigned long int m2exp; /* If != 0, modulus is 2 ^ m2exp. */ -} __gmp_randata_lc; - -/* Random state struct. */ -typedef struct -{ - mpz_t seed; /* Current seed. */ - gmp_randalg_t alg; /* Algorithm used. */ - union { /* Algorithm specific data. */ - __gmp_randata_lc *lc; /* Linear congruential. */ - } algdata; -} __gmp_randstate_struct; -typedef __gmp_randstate_struct gmp_randstate_t[1]; - -/* Types for function declarations in gmp files. */ -/* ??? Should not pollute user name space with these ??? */ -typedef __gmp_const __mpz_struct *mpz_srcptr; -typedef __mpz_struct *mpz_ptr; -typedef __gmp_const __mpf_struct *mpf_srcptr; -typedef __mpf_struct *mpf_ptr; -typedef __gmp_const __mpq_struct *mpq_srcptr; -typedef __mpq_struct *mpq_ptr; - -#ifndef _PROTO -#if (__STDC__-0) || defined (__cplusplus) -#define _PROTO(x) x -#else -#define _PROTO(x) () -#endif -#endif - -#ifndef __MPN -/* Really use `defined (__STDC__)' here; we want it to be true for Sun C */ -#if defined (__STDC__) || defined (__cplusplus) -#define __MPN(x) __gmpn_##x -#else -#define __MPN(x) __gmpn_/**/x -#endif -#endif - -#if defined (FILE) || defined (H_STDIO) || defined (_H_STDIO) \ - || defined (_STDIO_H) || defined (_STDIO_H_) || defined (__STDIO_H__) \ - || defined (_STDIO_INCLUDED) || defined (__dj_include_stdio_h_) -#define _GMP_H_HAVE_FILE 1 -#endif - -#if defined (__cplusplus) -extern "C" { -#endif - -#define mp_set_memory_functions __gmp_set_memory_functions -DLL_IMPORT void mp_set_memory_functions _PROTO ((void *(*) (size_t), - void *(*) (void *, size_t, size_t), - void (*) (void *, size_t))); - -#define mp_bits_per_limb __gmp_bits_per_limb -DLL_IMPORT extern __gmp_const int mp_bits_per_limb; - -#if defined (__cplusplus) -} -#endif - - -/**************** Random number routines. ****************/ - -#define _gmp_rand __gmp_rand -#define gmp_randinit __gmp_randinit -#define gmp_randinit_lc __gmp_randinit_lc -#define gmp_randinit_lc_2exp __gmp_randinit_lc_2exp -#define gmp_randseed __gmp_randseed -#define gmp_randseed_ui __gmp_randseed_ui -#define gmp_randclear __gmp_randclear - -#if defined (__cplusplus) -extern "C" { -#endif - -DLL_IMPORT void _gmp_rand _PROTO ((mp_ptr, gmp_randstate_t, unsigned long int)); -DLL_IMPORT void gmp_randinit _PROTO ((gmp_randstate_t, gmp_randalg_t, ...)); -DLL_IMPORT void gmp_randinit_lc _PROTO ((gmp_randstate_t, mpz_t, unsigned long int, - mpz_t)); -DLL_IMPORT void gmp_randinit_lc_2exp _PROTO ((gmp_randstate_t, mpz_t, unsigned long int, - unsigned long int)); -DLL_IMPORT void gmp_randseed _PROTO ((gmp_randstate_t, mpz_t)); -DLL_IMPORT void gmp_randseed_ui _PROTO ((gmp_randstate_t, unsigned long int)); -DLL_IMPORT void gmp_randclear _PROTO ((gmp_randstate_t)); - -#if defined (__cplusplus) -} -#endif - -/**************** Integer (i.e. Z) routines. ****************/ - -#define _mpz_realloc __gmpz_realloc -#define mpz_realloc __gmpz_realloc -#define mpz_abs __gmpz_abs -#define mpz_add __gmpz_add -#define mpz_add_ui __gmpz_add_ui -#define mpz_addmul_ui __gmpz_addmul_ui -#define mpz_and __gmpz_and -#define mpz_array_init __gmpz_array_init -#define mpz_bin_ui __gmpz_bin_ui -#define mpz_bin_uiui __gmpz_bin_uiui -#define mpz_cdiv_q __gmpz_cdiv_q -#define mpz_cdiv_q_ui __gmpz_cdiv_q_ui -#define mpz_cdiv_qr __gmpz_cdiv_qr -#define mpz_cdiv_qr_ui __gmpz_cdiv_qr_ui -#define mpz_cdiv_r __gmpz_cdiv_r -#define mpz_cdiv_r_ui __gmpz_cdiv_r_ui -#define mpz_cdiv_ui __gmpz_cdiv_ui -#define mpz_clear __gmpz_clear -#define mpz_clrbit __gmpz_clrbit -#define mpz_cmp __gmpz_cmp -#define _mpz_cmp_si __gmpz_cmp_si -#define _mpz_cmp_ui __gmpz_cmp_ui -#define mpz_cmpabs __gmpz_cmpabs -#define mpz_cmpabs_ui __gmpz_cmpabs_ui -#define mpz_com __gmpz_com -#define mpz_divexact __gmpz_divexact -#define mpz_dump __gmpz_dump -#define mpz_fac_ui __gmpz_fac_ui -#define mpz_fdiv_q __gmpz_fdiv_q -#define mpz_fdiv_q_2exp __gmpz_fdiv_q_2exp -#define mpz_fdiv_q_ui __gmpz_fdiv_q_ui -#define mpz_fdiv_qr __gmpz_fdiv_qr -#define mpz_fdiv_qr_ui __gmpz_fdiv_qr_ui -#define mpz_fdiv_r __gmpz_fdiv_r -#define mpz_fdiv_r_2exp __gmpz_fdiv_r_2exp -#define mpz_fdiv_r_ui __gmpz_fdiv_r_ui -#define mpz_fdiv_ui __gmpz_fdiv_ui -#define mpz_fib_ui __gmpz_fib_ui -#define mpz_fits_sint_p __gmpz_fits_sint_p -#define mpz_fits_slong_p __gmpz_fits_slong_p -#define mpz_fits_sshort_p __gmpz_fits_sshort_p -#define mpz_fits_uint_p __gmpz_fits_uint_p -#define mpz_fits_ulong_p __gmpz_fits_ulong_p -#define mpz_fits_ushort_p __gmpz_fits_ushort_p -#define mpz_gcd __gmpz_gcd -#define mpz_gcd_ui __gmpz_gcd_ui -#define mpz_gcdext __gmpz_gcdext -#define mpz_get_d __gmpz_get_d -#define mpz_get_si __gmpz_get_si -#define mpz_get_str __gmpz_get_str -#define mpz_get_ui __gmpz_get_ui -#define mpz_getlimbn __gmpz_getlimbn -#define mpz_hamdist __gmpz_hamdist -#define mpz_init __gmpz_init -#define mpz_inp_binary __gmpz_inp_binary -#define mpz_inp_raw __gmpz_inp_raw -#define mpz_inp_str __gmpz_inp_str -#define mpz_init_set __gmpz_init_set -#define mpz_init_set_d __gmpz_init_set_d -#define mpz_init_set_si __gmpz_init_set_si -#define mpz_init_set_str __gmpz_init_set_str -#define mpz_init_set_ui __gmpz_init_set_ui -#define mpz_invert __gmpz_invert -#define mpz_ior __gmpz_ior -#define mpz_jacobi __gmpz_jacobi -#define mpz_lcm __gmpz_lcm -#define mpz_legendre __gmpz_legendre -#define mpz_mod __gmpz_mod -#define mpz_mul __gmpz_mul -#define mpz_mul_2exp __gmpz_mul_2exp -#define mpz_neg __gmpz_neg -#define mpz_nextprime __gmpz_nextprime -#define mpz_out_binary __gmpz_out_binary -#define mpz_out_raw __gmpz_out_raw -#define mpz_out_str __gmpz_out_str -#define mpz_perfect_power_p __gmpz_perfect_power_p -#define mpz_perfect_square_p __gmpz_perfect_square_p -#define mpz_popcount __gmpz_popcount -#define mpz_pow_ui __gmpz_pow_ui -#define mpz_powm __gmpz_powm -#define mpz_powm_ui __gmpz_powm_ui -#define mpz_probab_prime_p __gmpz_probab_prime_p -#define mpz_random __gmpz_random -#define mpz_random2 __gmpz_random2 -#define mpz_remove __gmpz_remove -#define mpz_root __gmpz_root -#define mpz_rrandomb __gmpz_rrandomb -#define mpz_scan0 __gmpz_scan0 -#define mpz_scan1 __gmpz_scan1 -#define mpz_set __gmpz_set -#define mpz_set_d __gmpz_set_d -#define mpz_set_f __gmpz_set_f -#define mpz_set_q __gmpz_set_q -#define mpz_set_si __gmpz_set_si -#define mpz_set_str __gmpz_set_str -#define mpz_set_ui __gmpz_set_ui -#define mpz_setbit __gmpz_setbit -#define mpz_size __gmpz_size -#define mpz_sizeinbase __gmpz_sizeinbase -#define mpz_sqrt __gmpz_sqrt -#define mpz_sqrtrem __gmpz_sqrtrem -#define mpz_sub __gmpz_sub -#define mpz_sub_ui __gmpz_sub_ui -#define mpz_swap __gmpz_swap -#define mpz_tdiv_ui __gmpz_tdiv_ui -#define mpz_tdiv_q __gmpz_tdiv_q -#define mpz_tdiv_q_2exp __gmpz_tdiv_q_2exp -#define mpz_tdiv_q_ui __gmpz_tdiv_q_ui -#define mpz_tdiv_qr __gmpz_tdiv_qr -#define mpz_tdiv_qr_ui __gmpz_tdiv_qr_ui -#define mpz_tdiv_r __gmpz_tdiv_r -#define mpz_tdiv_r_2exp __gmpz_tdiv_r_2exp -#define mpz_tdiv_r_ui __gmpz_tdiv_r_ui -#define mpz_tstbit __gmpz_tstbit -#define mpz_ui_pow_ui __gmpz_ui_pow_ui -#define mpz_urandomb __gmpz_urandomb -#define mpz_urandomm __gmpz_urandomm -#define mpz_xor __gmpz_xor -#define mpz_eor __gmpz_xor - -#if defined (__cplusplus) -extern "C" { -#endif -DLL_IMPORT void *_mpz_realloc _PROTO ((mpz_ptr, mp_size_t)); - -DLL_IMPORT void mpz_abs _PROTO ((mpz_ptr, mpz_srcptr)); -DLL_IMPORT void mpz_add _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); -DLL_IMPORT void mpz_add_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); -DLL_IMPORT void mpz_addmul_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); -DLL_IMPORT void mpz_and _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); -DLL_IMPORT void mpz_array_init _PROTO ((mpz_ptr, mp_size_t, mp_size_t)); -DLL_IMPORT void mpz_bin_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); -DLL_IMPORT void mpz_bin_uiui _PROTO ((mpz_ptr, unsigned long int, unsigned long int)); -DLL_IMPORT void mpz_cdiv_q _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); -DLL_IMPORT unsigned long int mpz_cdiv_q_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); -DLL_IMPORT void mpz_cdiv_qr _PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr)); -DLL_IMPORT unsigned long int mpz_cdiv_qr_ui _PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long int)); -DLL_IMPORT void mpz_cdiv_r _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); -DLL_IMPORT unsigned long int mpz_cdiv_r_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); -DLL_IMPORT unsigned long int mpz_cdiv_ui _PROTO ((mpz_srcptr, unsigned long int)); -DLL_IMPORT void mpz_clear _PROTO ((mpz_ptr)); -DLL_IMPORT void mpz_clrbit _PROTO ((mpz_ptr, unsigned long int)); -DLL_IMPORT int mpz_cmp _PROTO ((mpz_srcptr, mpz_srcptr)); -DLL_IMPORT int _mpz_cmp_si _PROTO ((mpz_srcptr, signed long int)); -DLL_IMPORT int _mpz_cmp_ui _PROTO ((mpz_srcptr, unsigned long int)); -DLL_IMPORT int mpz_cmpabs _PROTO ((mpz_srcptr, mpz_srcptr)); -DLL_IMPORT int mpz_cmpabs_ui _PROTO ((mpz_srcptr, unsigned long int)); -DLL_IMPORT void mpz_com _PROTO ((mpz_ptr, mpz_srcptr)); -DLL_IMPORT void mpz_divexact _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); -DLL_IMPORT void mpz_dump _PROTO ((mpz_srcptr)); -DLL_IMPORT void mpz_fac_ui _PROTO ((mpz_ptr, unsigned long int)); -DLL_IMPORT void mpz_fdiv_q _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); -DLL_IMPORT void mpz_fdiv_q_2exp _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); -DLL_IMPORT unsigned long int mpz_fdiv_q_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); -DLL_IMPORT void mpz_fdiv_qr _PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr)); -DLL_IMPORT unsigned long int mpz_fdiv_qr_ui _PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long int)); -DLL_IMPORT void mpz_fdiv_r _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); -DLL_IMPORT void mpz_fdiv_r_2exp _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); -DLL_IMPORT unsigned long int mpz_fdiv_r_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); -DLL_IMPORT unsigned long int mpz_fdiv_ui _PROTO ((mpz_srcptr, unsigned long int)); -DLL_IMPORT void mpz_fib_ui _PROTO ((mpz_ptr, unsigned long int)); -DLL_IMPORT int mpz_fits_sint_p _PROTO ((mpz_srcptr)); -DLL_IMPORT int mpz_fits_slong_p _PROTO ((mpz_srcptr)); -DLL_IMPORT int mpz_fits_sshort_p _PROTO ((mpz_srcptr)); -DLL_IMPORT int mpz_fits_uint_p _PROTO ((mpz_srcptr)); -DLL_IMPORT int mpz_fits_ulong_p _PROTO ((mpz_srcptr)); -DLL_IMPORT int mpz_fits_ushort_p _PROTO ((mpz_srcptr)); -DLL_IMPORT void mpz_gcd _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); -DLL_IMPORT unsigned long int mpz_gcd_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); -DLL_IMPORT void mpz_gcdext _PROTO ((mpz_ptr, mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr)); -DLL_IMPORT double mpz_get_d _PROTO ((mpz_srcptr)); -/* signed */ long int mpz_get_si _PROTO ((mpz_srcptr)); -DLL_IMPORT char *mpz_get_str _PROTO ((char *, int, mpz_srcptr)); -DLL_IMPORT unsigned long int mpz_get_ui _PROTO ((mpz_srcptr)); -DLL_IMPORT mp_limb_t mpz_getlimbn _PROTO ((mpz_srcptr, mp_size_t)); -DLL_IMPORT unsigned long int mpz_hamdist _PROTO ((mpz_srcptr, mpz_srcptr)); -DLL_IMPORT void mpz_init _PROTO ((mpz_ptr)); -#ifdef _GMP_H_HAVE_FILE -DLL_IMPORT size_t mpz_inp_binary _PROTO ((mpz_ptr, FILE *)); -DLL_IMPORT size_t mpz_inp_raw _PROTO ((mpz_ptr, FILE *)); -DLL_IMPORT size_t mpz_inp_str _PROTO ((mpz_ptr, FILE *, int)); -#endif -DLL_IMPORT void mpz_init_set _PROTO ((mpz_ptr, mpz_srcptr)); -DLL_IMPORT void mpz_init_set_d _PROTO ((mpz_ptr, double)); -DLL_IMPORT void mpz_init_set_si _PROTO ((mpz_ptr, signed long int)); -DLL_IMPORT int mpz_init_set_str _PROTO ((mpz_ptr, __gmp_const char *, int)); -DLL_IMPORT void mpz_init_set_ui _PROTO ((mpz_ptr, unsigned long int)); -DLL_IMPORT int mpz_invert _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); -DLL_IMPORT void mpz_ior _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); -DLL_IMPORT int mpz_jacobi _PROTO ((mpz_srcptr, mpz_srcptr)); - -#define mpz_kronecker_si __gmpz_kronecker_si -DLL_IMPORT int mpz_kronecker_si _PROTO ((mpz_srcptr, long)); - -#define mpz_kronecker_ui __gmpz_kronecker_ui -DLL_IMPORT int mpz_kronecker_ui _PROTO ((mpz_srcptr, unsigned long)); - -#define mpz_si_kronecker __gmpz_si_kronecker -DLL_IMPORT int mpz_si_kronecker _PROTO ((long, mpz_srcptr)); - -#define mpz_ui_kronecker __gmpz_ui_kronecker -DLL_IMPORT int mpz_ui_kronecker _PROTO ((unsigned long, mpz_srcptr)); - -DLL_IMPORT void mpz_lcm _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); -DLL_IMPORT int mpz_legendre _PROTO ((mpz_srcptr, mpz_srcptr)); -DLL_IMPORT void mpz_mod _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); -DLL_IMPORT void mpz_mul _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); -DLL_IMPORT void mpz_mul_2exp _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); - -#define mpz_mul_si __gmpz_mul_si -DLL_IMPORT void mpz_mul_si _PROTO ((mpz_ptr, mpz_srcptr, long int)); - -#define mpz_mul_ui __gmpz_mul_ui -DLL_IMPORT void mpz_mul_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); - -DLL_IMPORT void mpz_neg _PROTO ((mpz_ptr, mpz_srcptr)); -DLL_IMPORT void mpz_nextprime _PROTO ((mpz_ptr, mpz_srcptr)); -#ifdef _GMP_H_HAVE_FILE -DLL_IMPORT size_t mpz_out_binary _PROTO ((FILE *, mpz_srcptr)); -DLL_IMPORT size_t mpz_out_raw _PROTO ((FILE *, mpz_srcptr)); -DLL_IMPORT size_t mpz_out_str _PROTO ((FILE *, int, mpz_srcptr)); -#endif -DLL_IMPORT int mpz_perfect_power_p _PROTO ((mpz_srcptr)); -DLL_IMPORT int mpz_perfect_square_p _PROTO ((mpz_srcptr)); -DLL_IMPORT unsigned long int mpz_popcount _PROTO ((mpz_srcptr)); -DLL_IMPORT void mpz_pow_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); -DLL_IMPORT void mpz_powm _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr, mpz_srcptr)); -DLL_IMPORT void mpz_powm_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int, mpz_srcptr)); -DLL_IMPORT int mpz_probab_prime_p _PROTO ((mpz_srcptr, int)); -DLL_IMPORT void mpz_random _PROTO ((mpz_ptr, mp_size_t)); -DLL_IMPORT void mpz_random2 _PROTO ((mpz_ptr, mp_size_t)); -DLL_IMPORT unsigned long int mpz_remove _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); -DLL_IMPORT int mpz_root _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); -DLL_IMPORT void mpz_rrandomb _PROTO ((mpz_ptr, gmp_randstate_t, unsigned long int)); -DLL_IMPORT unsigned long int mpz_scan0 _PROTO ((mpz_srcptr, unsigned long int)); -DLL_IMPORT unsigned long int mpz_scan1 _PROTO ((mpz_srcptr, unsigned long int)); -DLL_IMPORT void mpz_set _PROTO ((mpz_ptr, mpz_srcptr)); -DLL_IMPORT void mpz_set_d _PROTO ((mpz_ptr, double)); -DLL_IMPORT void mpz_set_f _PROTO ((mpz_ptr, mpf_srcptr)); -DLL_IMPORT void mpz_set_q _PROTO ((mpz_ptr, mpq_srcptr)); -DLL_IMPORT void mpz_set_si _PROTO ((mpz_ptr, signed long int)); -DLL_IMPORT int mpz_set_str _PROTO ((mpz_ptr, __gmp_const char *, int)); -DLL_IMPORT void mpz_set_ui _PROTO ((mpz_ptr, unsigned long int)); -DLL_IMPORT void mpz_setbit _PROTO ((mpz_ptr, unsigned long int)); -DLL_IMPORT size_t mpz_size _PROTO ((mpz_srcptr)); -DLL_IMPORT size_t mpz_sizeinbase _PROTO ((mpz_srcptr, int)); -DLL_IMPORT void mpz_sqrt _PROTO ((mpz_ptr, mpz_srcptr)); -DLL_IMPORT void mpz_sqrtrem _PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr)); -DLL_IMPORT void mpz_sub _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); -DLL_IMPORT void mpz_sub_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); -DLL_IMPORT void mpz_swap _PROTO ((mpz_ptr, mpz_ptr)); -DLL_IMPORT void mpz_tdiv_q _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); -DLL_IMPORT void mpz_tdiv_q_2exp _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); -DLL_IMPORT unsigned long int mpz_tdiv_ui _PROTO ((mpz_srcptr, unsigned long int)); -DLL_IMPORT unsigned long int mpz_tdiv_q_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); -DLL_IMPORT void mpz_tdiv_qr _PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr)); -DLL_IMPORT unsigned long int mpz_tdiv_qr_ui _PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long int)); -DLL_IMPORT void mpz_tdiv_r _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); -DLL_IMPORT void mpz_tdiv_r_2exp _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); -DLL_IMPORT unsigned long int mpz_tdiv_r_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); -DLL_IMPORT int mpz_tstbit _PROTO ((mpz_srcptr, unsigned long int)); -DLL_IMPORT void mpz_ui_pow_ui _PROTO ((mpz_ptr, unsigned long int, unsigned long int)); -DLL_IMPORT void mpz_urandomb _PROTO ((mpz_t, gmp_randstate_t, unsigned long int)); -DLL_IMPORT void mpz_urandomm _PROTO ((mpz_t, gmp_randstate_t, mpz_t)); -DLL_IMPORT void mpz_xor _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); -#if defined (__cplusplus) -} -#endif - -/**************** Rational (i.e. Q) routines. ****************/ - -#define mpq_init __gmpq_init -#define mpq_clear __gmpq_clear -#define mpq_set __gmpq_set -#define mpq_set_ui __gmpq_set_ui -#define mpq_set_si __gmpq_set_si -#define mpq_set_z __gmpq_set_z -#define mpq_add __gmpq_add -#define mpq_sub __gmpq_sub -#define mpq_mul __gmpq_mul -#define mpq_div __gmpq_div -#define mpq_neg __gmpq_neg -#define mpq_cmp __gmpq_cmp -#define _mpq_cmp_ui __gmpq_cmp_ui -#define mpq_equal __gmpq_equal -#define mpq_inv __gmpq_inv -#define mpq_set_num __gmpq_set_num -#define mpq_set_den __gmpq_set_den -#define mpq_get_num __gmpq_get_num -#define mpq_get_den __gmpq_get_den -#define mpq_get_d __gmpq_get_d -#define mpq_set_d __gmpq_set_d -#define mpq_canonicalize __gmpq_canonicalize - -#if defined (__cplusplus) -extern "C" { -#endif -DLL_IMPORT void mpq_init _PROTO ((mpq_ptr)); -DLL_IMPORT void mpq_clear _PROTO ((mpq_ptr)); -DLL_IMPORT void mpq_set _PROTO ((mpq_ptr, mpq_srcptr)); -DLL_IMPORT void mpq_set_ui _PROTO ((mpq_ptr, unsigned long int, unsigned long int)); -DLL_IMPORT void mpq_set_si _PROTO ((mpq_ptr, signed long int, unsigned long int)); -DLL_IMPORT void mpq_set_z _PROTO ((mpq_ptr, mpz_srcptr)); -DLL_IMPORT void mpq_add _PROTO ((mpq_ptr, mpq_srcptr, mpq_srcptr)); -DLL_IMPORT void mpq_sub _PROTO ((mpq_ptr, mpq_srcptr, mpq_srcptr)); -DLL_IMPORT void mpq_mul _PROTO ((mpq_ptr, mpq_srcptr, mpq_srcptr)); -DLL_IMPORT void mpq_div _PROTO ((mpq_ptr, mpq_srcptr, mpq_srcptr)); -DLL_IMPORT void mpq_neg _PROTO ((mpq_ptr, mpq_srcptr)); -DLL_IMPORT int mpq_cmp _PROTO ((mpq_srcptr, mpq_srcptr)); -DLL_IMPORT int _mpq_cmp_ui _PROTO ((mpq_srcptr, unsigned long int, unsigned long int)); -DLL_IMPORT int mpq_equal _PROTO ((mpq_srcptr, mpq_srcptr)); -DLL_IMPORT void mpq_inv _PROTO ((mpq_ptr, mpq_srcptr)); -DLL_IMPORT void mpq_set_num _PROTO ((mpq_ptr, mpz_srcptr)); -DLL_IMPORT void mpq_set_den _PROTO ((mpq_ptr, mpz_srcptr)); -DLL_IMPORT void mpq_get_num _PROTO ((mpz_ptr, mpq_srcptr)); -DLL_IMPORT void mpq_get_den _PROTO ((mpz_ptr, mpq_srcptr)); -DLL_IMPORT double mpq_get_d _PROTO ((mpq_srcptr)); -DLL_IMPORT void mpq_set_d _PROTO ((mpq_ptr, double)); -DLL_IMPORT void mpq_canonicalize _PROTO ((mpq_ptr)); - -#define mpq_swap __gmpq_swap -DLL_IMPORT void mpq_swap _PROTO ((mpq_ptr, mpq_ptr)); - -#ifdef _GMP_H_HAVE_FILE -#define mpq_out_str __gmpq_out_str -DLL_IMPORT size_t mpq_out_str _PROTO ((FILE *, int, mpq_srcptr)); -#endif - -#if defined (__cplusplus) -} -#endif - -/**************** Float (i.e. F) routines. ****************/ - -#define mpf_abs __gmpf_abs -#define mpf_add __gmpf_add -#define mpf_add_ui __gmpf_add_ui -#define mpf_ceil __gmpf_ceil -#define mpf_clear __gmpf_clear -#define mpf_cmp __gmpf_cmp -#define mpf_cmp_si __gmpf_cmp_si -#define mpf_cmp_ui __gmpf_cmp_ui -#define mpf_div __gmpf_div -#define mpf_div_2exp __gmpf_div_2exp -#define mpf_div_ui __gmpf_div_ui -#define mpf_dump __gmpf_dump -#define mpf_floor __gmpf_floor -#define mpf_eq __gmpf_eq -#define mpf_get_d __gmpf_get_d -#define mpf_get_prec __gmpf_get_prec -#define mpf_get_str __gmpf_get_str -#define mpf_init __gmpf_init -#define mpf_init2 __gmpf_init2 -#define mpf_inp_str __gmpf_inp_str -#define mpf_init_set __gmpf_init_set -#define mpf_init_set_d __gmpf_init_set_d -#define mpf_init_set_si __gmpf_init_set_si -#define mpf_init_set_str __gmpf_init_set_str -#define mpf_init_set_ui __gmpf_init_set_ui -#define mpf_mul __gmpf_mul -#define mpf_mul_2exp __gmpf_mul_2exp -#define mpf_mul_ui __gmpf_mul_ui -#define mpf_neg __gmpf_neg -#define mpf_out_str __gmpf_out_str -#define mpf_pow_ui __gmpf_pow_ui -#define mpf_random2 __gmpf_random2 -#define mpf_reldiff __gmpf_reldiff -#define mpf_set __gmpf_set -#define mpf_set_d __gmpf_set_d -#define mpf_set_default_prec __gmpf_set_default_prec -#define mpf_set_prec __gmpf_set_prec -#define mpf_set_prec_raw __gmpf_set_prec_raw -#define mpf_set_q __gmpf_set_q -#define mpf_set_si __gmpf_set_si -#define mpf_set_str __gmpf_set_str -#define mpf_set_ui __gmpf_set_ui -#define mpf_set_z __gmpf_set_z -#define mpf_size __gmpf_size -#define mpf_sqrt __gmpf_sqrt -#define mpf_sqrt_ui __gmpf_sqrt_ui -#define mpf_sub __gmpf_sub -#define mpf_sub_ui __gmpf_sub_ui -#define mpf_trunc __gmpf_trunc -#define mpf_ui_div __gmpf_ui_div -#define mpf_ui_sub __gmpf_ui_sub -#define mpf_urandomb __gmpf_urandomb - -#if defined (__cplusplus) -extern "C" { -#endif -DLL_IMPORT void mpf_abs _PROTO ((mpf_ptr, mpf_srcptr)); -DLL_IMPORT void mpf_add _PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr)); -DLL_IMPORT void mpf_add_ui _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int)); -DLL_IMPORT void mpf_ceil _PROTO ((mpf_ptr, mpf_srcptr)); -DLL_IMPORT void mpf_clear _PROTO ((mpf_ptr)); -DLL_IMPORT int mpf_cmp _PROTO ((mpf_srcptr, mpf_srcptr)); -DLL_IMPORT int mpf_cmp_si _PROTO ((mpf_srcptr, signed long int)); -DLL_IMPORT int mpf_cmp_ui _PROTO ((mpf_srcptr, unsigned long int)); -DLL_IMPORT void mpf_div _PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr)); -DLL_IMPORT void mpf_div_2exp _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int)); -DLL_IMPORT void mpf_div_ui _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int)); -DLL_IMPORT void mpf_dump _PROTO ((mpf_srcptr)); -DLL_IMPORT int mpf_eq _PROTO ((mpf_srcptr, mpf_srcptr, unsigned long int)); -DLL_IMPORT void mpf_floor _PROTO ((mpf_ptr, mpf_srcptr)); -DLL_IMPORT double mpf_get_d _PROTO ((mpf_srcptr)); -DLL_IMPORT unsigned long int mpf_get_prec _PROTO ((mpf_srcptr)); -char *mpf_get_str _PROTO ((char *, mp_exp_t *, int, size_t, mpf_srcptr)); -DLL_IMPORT void mpf_init _PROTO ((mpf_ptr)); -DLL_IMPORT void mpf_init2 _PROTO ((mpf_ptr, unsigned long int)); -#ifdef _GMP_H_HAVE_FILE -DLL_IMPORT size_t mpf_inp_str _PROTO ((mpf_ptr, FILE *, int)); -#endif -DLL_IMPORT void mpf_init_set _PROTO ((mpf_ptr, mpf_srcptr)); -DLL_IMPORT void mpf_init_set_d _PROTO ((mpf_ptr, double)); -DLL_IMPORT void mpf_init_set_si _PROTO ((mpf_ptr, signed long int)); -DLL_IMPORT int mpf_init_set_str _PROTO ((mpf_ptr, __gmp_const char *, int)); -DLL_IMPORT void mpf_init_set_ui _PROTO ((mpf_ptr, unsigned long int)); -DLL_IMPORT void mpf_mul _PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr)); -DLL_IMPORT void mpf_mul_2exp _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int)); -DLL_IMPORT void mpf_mul_ui _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int)); -DLL_IMPORT void mpf_neg _PROTO ((mpf_ptr, mpf_srcptr)); -#ifdef _GMP_H_HAVE_FILE -DLL_IMPORT size_t mpf_out_str _PROTO ((FILE *, int, size_t, mpf_srcptr)); -#endif -DLL_IMPORT void mpf_pow_ui _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int)); -DLL_IMPORT void mpf_random2 _PROTO ((mpf_ptr, mp_size_t, mp_exp_t)); -DLL_IMPORT void mpf_reldiff _PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr)); -DLL_IMPORT void mpf_set _PROTO ((mpf_ptr, mpf_srcptr)); -DLL_IMPORT void mpf_set_d _PROTO ((mpf_ptr, double)); -DLL_IMPORT void mpf_set_default_prec _PROTO ((unsigned long int)); -DLL_IMPORT void mpf_set_prec _PROTO ((mpf_ptr, unsigned long int)); -DLL_IMPORT void mpf_set_prec_raw _PROTO ((mpf_ptr, unsigned long int)); -DLL_IMPORT void mpf_set_q _PROTO ((mpf_ptr, mpq_srcptr)); -DLL_IMPORT void mpf_set_si _PROTO ((mpf_ptr, signed long int)); -DLL_IMPORT int mpf_set_str _PROTO ((mpf_ptr, __gmp_const char *, int)); -DLL_IMPORT void mpf_set_ui _PROTO ((mpf_ptr, unsigned long int)); -DLL_IMPORT void mpf_set_z _PROTO ((mpf_ptr, mpz_srcptr)); -DLL_IMPORT size_t mpf_size _PROTO ((mpf_srcptr)); -DLL_IMPORT void mpf_sqrt _PROTO ((mpf_ptr, mpf_srcptr)); -DLL_IMPORT void mpf_sqrt_ui _PROTO ((mpf_ptr, unsigned long int)); -DLL_IMPORT void mpf_sub _PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr)); -DLL_IMPORT void mpf_sub_ui _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int)); -DLL_IMPORT void mpf_trunc _PROTO ((mpf_ptr, mpf_srcptr)); -DLL_IMPORT void mpf_ui_div _PROTO ((mpf_ptr, unsigned long int, mpf_srcptr)); -DLL_IMPORT void mpf_ui_sub _PROTO ((mpf_ptr, unsigned long int, mpf_srcptr)); -DLL_IMPORT void mpf_urandomb _PROTO ((mpf_t, gmp_randstate_t, unsigned long int)); - -#define mpf_swap __gmpf_swap -DLL_IMPORT void mpf_swap _PROTO ((mpf_ptr, mpf_ptr)); - -#if defined (__cplusplus) -} -#endif -/************ Low level positive-integer (i.e. N) routines. ************/ - -/* This is ugly, but we need to make user calls reach the prefixed function. */ -#define mpn_add __MPN(add) -#define mpn_add_1 __MPN(add_1) -#define mpn_add_n __MPN(add_n) -#define mpn_add_nc __MPN(add_nc) -#define mpn_addmul_1 __MPN(addmul_1) -#define mpn_addsub_n __MPN(addsub_n) -#define mpn_addsub_nc __MPN(addsub_nc) -/* #define mpn_and_n __MPN(and_n) */ -/* #define mpn_andn_n __MPN(andn_n) */ -#define mpn_bdivmod __MPN(bdivmod) -#define mpn_cmp __MPN(cmp) -/* #define mpn_com_n __MPN(com_n) */ -#define mpn_copyd __MPN(copyd) -#define mpn_copyi __MPN(copyi) -#define mpn_divrem __MPN(divrem) -#define mpn_divrem_1 __MPN(divrem_1) -#define mpn_divrem_2 __MPN(divrem_2) -#define mpn_dump __MPN(dump) -#define mpn_gcd __MPN(gcd) -#define mpn_gcd_1 __MPN(gcd_1) -#define mpn_gcdext __MPN(gcdext) -#define mpn_get_str __MPN(get_str) -#define mpn_hamdist __MPN(hamdist) -#define mpn_invert_limb __MPN(invert_limb) -/* #define mpn_ior_n __MPN(ior_n) */ -/* #define mpn_iorn_n __MPN(iorn_n) */ -/* #define mpn_kara_mul_n __MPN(kara_mul_n) internal */ -/* #define mpn_kara_sqr_n __MPN(kara_sqr_n) internal */ -#define mpn_lshift __MPN(lshift) -#define mpn_lshiftc __MPN(lshiftc) -#define mpn_mod_1 __MPN(mod_1) -#define mpn_mul __MPN(mul) -#define mpn_mul_1 __MPN(mul_1) -#define mpn_mul_basecase __MPN(mul_basecase) -#define mpn_mul_n __MPN(mul_n) -#define mpn_perfect_square_p __MPN(perfect_square_p) -#define mpn_popcount __MPN(popcount) -#define mpn_preinv_mod_1 __MPN(preinv_mod_1) -/* #define mpn_nand_n __MPN(nand_n) */ -/* #define mpn_nior_n __MPN(nior_n) */ -#define mpn_random __MPN(random) -#define mpn_random2 __MPN(random2) -#define mpn_rshift __MPN(rshift) -#define mpn_rshiftc __MPN(rshiftc) -#define mpn_scan0 __MPN(scan0) -#define mpn_scan1 __MPN(scan1) -#define mpn_set_str __MPN(set_str) -#define mpn_sqr_basecase __MPN(sqr_basecase) -#define mpn_sqr_n __MPN(sqr_n) -#define mpn_sqrtrem __MPN(sqrtrem) -#define mpn_sub __MPN(sub) -#define mpn_sub_1 __MPN(sub_1) -#define mpn_sub_n __MPN(sub_n) -#define mpn_sub_nc __MPN(sub_nc) -#define mpn_submul_1 __MPN(submul_1) -/* #define mpn_toom3_mul_n __MPN(toom3_mul_n) internal */ -/* #define mpn_toom3_sqr_n __MPN(toom3_sqr_n) internal */ -/* #define mpn_xnor_n __MPN(xnor_n) */ -/* #define mpn_xor_n __MPN(xor_n) */ - -#if defined (__cplusplus) -extern "C" { -#endif - -DLL_IMPORT mp_limb_t mpn_add _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr,mp_size_t)); -DLL_IMPORT mp_limb_t mpn_add_1 _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t)); -DLL_IMPORT mp_limb_t mpn_add_n _PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); -DLL_IMPORT mp_limb_t mpn_add_nc _PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_limb_t)); - -DLL_IMPORT mp_limb_t mpn_addmul_1 _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t)); - -#define mpn_addmul_1c __MPN(addmul_1c) -DLL_IMPORT mp_limb_t mpn_addmul_1c _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t)); - -DLL_IMPORT mp_limb_t mpn_addsub_n _PROTO ((mp_ptr, mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); -DLL_IMPORT mp_limb_t mpn_bdivmod _PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t, unsigned long int)); -DLL_IMPORT int mpn_cmp _PROTO ((mp_srcptr, mp_srcptr, mp_size_t)); - -#define mpn_divexact_by3(dst, src, size) mpn_divexact_by3c (dst, src, size, 0) - -#define mpn_divexact_by3c __MPN(divexact_by3c) -DLL_IMPORT mp_limb_t mpn_divexact_by3c _PROTO ((mp_ptr dst, mp_srcptr src, - mp_size_t size, mp_limb_t carry)); - -#define mpn_divmod_1(qp,np,nsize,dlimb) mpn_divrem_1 (qp,0,np,nsize,dlimb) - -DLL_IMPORT mp_limb_t mpn_divrem _PROTO((mp_ptr, mp_size_t, mp_ptr, mp_size_t, mp_srcptr, mp_size_t)); - -DLL_IMPORT mp_limb_t mpn_divrem_1 _PROTO ((mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_limb_t)); - -#define mpn_divrem_1c __MPN(divrem_1c) -DLL_IMPORT mp_limb_t mpn_divrem_1c _PROTO ((mp_ptr, mp_size_t, mp_srcptr, mp_size_t, - mp_limb_t, mp_limb_t)); - -DLL_IMPORT mp_limb_t mpn_divrem_2 _PROTO ((mp_ptr, mp_size_t, mp_ptr, mp_size_t, mp_srcptr)); -DLL_IMPORT void mpn_dump _PROTO ((mp_srcptr, mp_size_t)); -mp_size_t mpn_gcd _PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_ptr, mp_size_t)); -DLL_IMPORT mp_limb_t mpn_gcd_1 _PROTO ((mp_srcptr, mp_size_t, mp_limb_t)); -mp_size_t mpn_gcdext _PROTO ((mp_ptr, mp_ptr, mp_size_t *, mp_ptr, mp_size_t, mp_ptr, mp_size_t)); -DLL_IMPORT size_t mpn_get_str _PROTO ((unsigned char *, int, mp_ptr, mp_size_t)); -DLL_IMPORT unsigned long int mpn_hamdist _PROTO ((mp_srcptr, mp_srcptr, mp_size_t)); - -#define mpn_jacobi_base __MPN(jacobi_base) -DLL_IMPORT int mpn_jacobi_base _PROTO ((mp_limb_t a, mp_limb_t b, int result_bit1)); - -DLL_IMPORT mp_limb_t mpn_lshift _PROTO ((mp_ptr, mp_srcptr, mp_size_t, unsigned int)); -DLL_IMPORT mp_limb_t mpn_mod_1 _PROTO ((mp_srcptr, mp_size_t, mp_limb_t)); - -#define mpn_mod_1c __MPN(mod_1c) -DLL_IMPORT mp_limb_t mpn_mod_1c _PROTO ((mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t)); - -#define mpn_mod_1_rshift __MPN(mod_1_rshift) -DLL_IMPORT mp_limb_t mpn_mod_1_rshift _PROTO ((mp_srcptr, mp_size_t, unsigned,mp_limb_t)); - -DLL_IMPORT mp_limb_t mpn_mul _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t)); -DLL_IMPORT mp_limb_t mpn_mul_1 _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t)); - -#define mpn_mul_1c __MPN(mul_1c) -DLL_IMPORT mp_limb_t mpn_mul_1c _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t)); - -DLL_IMPORT void mpn_mul_basecase _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t)); -DLL_IMPORT void mpn_mul_n _PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); -DLL_IMPORT int mpn_perfect_square_p _PROTO ((mp_srcptr, mp_size_t)); -DLL_IMPORT unsigned long int mpn_popcount _PROTO ((mp_srcptr, mp_size_t)); -DLL_IMPORT mp_limb_t mpn_preinv_mod_1 _PROTO ((mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t)); -DLL_IMPORT void mpn_random _PROTO ((mp_ptr, mp_size_t)); -DLL_IMPORT void mpn_random2 _PROTO ((mp_ptr, mp_size_t)); -DLL_IMPORT mp_limb_t mpn_rshift _PROTO ((mp_ptr, mp_srcptr, mp_size_t, unsigned int)); -DLL_IMPORT unsigned long int mpn_scan0 _PROTO ((mp_srcptr, unsigned long int)); -DLL_IMPORT unsigned long int mpn_scan1 _PROTO ((mp_srcptr, unsigned long int)); -mp_size_t mpn_set_str _PROTO ((mp_ptr, __gmp_const unsigned char *, size_t, int)); -DLL_IMPORT void mpn_sqr_n _PROTO ((mp_ptr, mp_srcptr, mp_size_t)); -DLL_IMPORT void mpn_sqr_basecase _PROTO ((mp_ptr, mp_srcptr, mp_size_t)); -mp_size_t mpn_sqrtrem _PROTO ((mp_ptr, mp_ptr, mp_srcptr, mp_size_t)); -DLL_IMPORT mp_limb_t mpn_sub _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr,mp_size_t)); -DLL_IMPORT mp_limb_t mpn_sub_1 _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t)); -DLL_IMPORT mp_limb_t mpn_sub_n _PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); -DLL_IMPORT mp_limb_t mpn_sub_nc _PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_limb_t)); -DLL_IMPORT mp_limb_t mpn_submul_1 _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t)); - -#define mpn_submul_1c __MPN(submul_1c) -DLL_IMPORT mp_limb_t mpn_submul_1c _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t)); - -#define mpn_tdiv_qr __MPN(tdiv_qr) -DLL_IMPORT void mpn_tdiv_qr _PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t)); - -#if defined (__cplusplus) -} -#endif - -#define mpn_incr_u(p,incr) \ - do { mp_limb_t __x; mp_ptr __p = p; \ - __x = *__p + incr; \ - *__p = __x; \ - if (__x < incr) \ - while (++(*(++__p)) == 0) \ - ; \ - } while (0) - -#define mpn_decr_u(p,incr) \ - do { mp_limb_t __x; mp_ptr __p = p; \ - __x = *__p; \ - *__p = __x - incr; \ - if (__x < incr) \ - while ((*(++__p))-- == 0) \ - ; \ - } while (0) - -#if defined (__GNUC__) || defined (_FORCE_INLINES) -_EXTERN_INLINE mp_limb_t -#if (__STDC__-0) || defined (__cplusplus) -mpn_add_1 (register mp_ptr res_ptr, - register mp_srcptr s1_ptr, - register mp_size_t s1_size, - register mp_limb_t s2_limb) -#else -mpn_add_1 (res_ptr, s1_ptr, s1_size, s2_limb) - register mp_ptr res_ptr; - register mp_srcptr s1_ptr; - register mp_size_t s1_size; - register mp_limb_t s2_limb; -#endif -{ - register mp_limb_t x; - - x = *s1_ptr++; - s2_limb = x + s2_limb; - *res_ptr++ = s2_limb; - if (s2_limb < x) - { - while (--s1_size != 0) - { - x = *s1_ptr++ + 1; - *res_ptr++ = x; - if (x != 0) - goto fin; - } - - return 1; - } - - fin: - if (res_ptr != s1_ptr) - { - mp_size_t i; - for (i = 0; i < s1_size - 1; i++) - res_ptr[i] = s1_ptr[i]; - } - return 0; -} - -_EXTERN_INLINE mp_limb_t -#if (__STDC__-0) || defined (__cplusplus) -mpn_add (register mp_ptr res_ptr, - register mp_srcptr s1_ptr, - register mp_size_t s1_size, - register mp_srcptr s2_ptr, - register mp_size_t s2_size) -#else -mpn_add (res_ptr, s1_ptr, s1_size, s2_ptr, s2_size) - register mp_ptr res_ptr; - register mp_srcptr s1_ptr; - register mp_size_t s1_size; - register mp_srcptr s2_ptr; - register mp_size_t s2_size; -#endif -{ - mp_limb_t cy_limb = 0; - - if (s2_size != 0) - cy_limb = mpn_add_n (res_ptr, s1_ptr, s2_ptr, s2_size); - - if (s1_size - s2_size != 0) - cy_limb = mpn_add_1 (res_ptr + s2_size, - s1_ptr + s2_size, - s1_size - s2_size, - cy_limb); - return cy_limb; -} - -_EXTERN_INLINE mp_limb_t -#if (__STDC__-0) || defined (__cplusplus) -mpn_sub_1 (register mp_ptr res_ptr, - register mp_srcptr s1_ptr, - register mp_size_t s1_size, - register mp_limb_t s2_limb) -#else -mpn_sub_1 (res_ptr, s1_ptr, s1_size, s2_limb) - register mp_ptr res_ptr; - register mp_srcptr s1_ptr; - register mp_size_t s1_size; - register mp_limb_t s2_limb; -#endif -{ - register mp_limb_t x; - - x = *s1_ptr++; - s2_limb = x - s2_limb; - *res_ptr++ = s2_limb; - if (s2_limb > x) - { - while (--s1_size != 0) - { - x = *s1_ptr++; - *res_ptr++ = x - 1; - if (x != 0) - goto fin; - } - - return 1; - } - - fin: - if (res_ptr != s1_ptr) - { - mp_size_t i; - for (i = 0; i < s1_size - 1; i++) - res_ptr[i] = s1_ptr[i]; - } - return 0; -} - -_EXTERN_INLINE mp_limb_t -#if (__STDC__-0) || defined (__cplusplus) -mpn_sub (register mp_ptr res_ptr, - register mp_srcptr s1_ptr, - register mp_size_t s1_size, - register mp_srcptr s2_ptr, - register mp_size_t s2_size) -#else -mpn_sub (res_ptr, s1_ptr, s1_size, s2_ptr, s2_size) - register mp_ptr res_ptr; - register mp_srcptr s1_ptr; - register mp_size_t s1_size; - register mp_srcptr s2_ptr; - register mp_size_t s2_size; -#endif -{ - mp_limb_t cy_limb = 0; - - if (s2_size != 0) - cy_limb = mpn_sub_n (res_ptr, s1_ptr, s2_ptr, s2_size); - - if (s1_size - s2_size != 0) - cy_limb = mpn_sub_1 (res_ptr + s2_size, - s1_ptr + s2_size, - s1_size - s2_size, - cy_limb); - return cy_limb; -} -#endif /* __GNUC__ */ - -/* Allow faster testing for negative, zero, and positive. */ -#define mpz_sgn(Z) ((Z)->_mp_size < 0 ? -1 : (Z)->_mp_size > 0) -#define mpf_sgn(F) ((F)->_mp_size < 0 ? -1 : (F)->_mp_size > 0) -#define mpq_sgn(Q) ((Q)->_mp_num._mp_size < 0 ? -1 : (Q)->_mp_num._mp_size > 0) - -/* When using GCC, optimize certain common comparisons. */ -#if defined (__GNUC__) -#define mpz_cmp_ui(Z,UI) \ - (__builtin_constant_p (UI) && (UI) == 0 \ - ? mpz_sgn (Z) : _mpz_cmp_ui (Z,UI)) -#define mpz_cmp_si(Z,SI) \ - (__builtin_constant_p (SI) && (SI) == 0 ? mpz_sgn (Z) \ - : __builtin_constant_p (SI) && (SI) > 0 \ - ? _mpz_cmp_ui (Z, (unsigned long int) SI) \ - : _mpz_cmp_si (Z,SI)) -#define mpq_cmp_ui(Q,NUI,DUI) \ - (__builtin_constant_p (NUI) && (NUI) == 0 \ - ? mpq_sgn (Q) : _mpq_cmp_ui (Q,NUI,DUI)) -#else -#define mpz_cmp_ui(Z,UI) _mpz_cmp_ui (Z,UI) -#define mpz_cmp_si(Z,UI) _mpz_cmp_si (Z,UI) -#define mpq_cmp_ui(Q,NUI,DUI) _mpq_cmp_ui (Q,NUI,DUI) -#endif - - -/* Using "&" rather than "&&" means these can come out branch-free. Every - mpz_t has at least one limb allocated, so fetching the low limb is always - allowed. */ -#define mpz_odd_p(z) ((int) ((z)->_mp_size != 0) & (int) (z)->_mp_d[0]) -#define mpz_even_p(z) (! mpz_odd_p (z)) - - -/* Allow direct user access to numerator and denominator of a mpq_t object. */ -#define mpq_numref(Q) (&((Q)->_mp_num)) -#define mpq_denref(Q) (&((Q)->_mp_den)) - - -/* Compatibility with GMP 2 and earlier. */ -#define mpn_divmod(qp,np,nsize,dp,dsize) mpn_divrem (qp,0,np,nsize,dp,dsize) - -/* Compatibility with GMP 1. */ -#define mpz_mdiv mpz_fdiv_q -#define mpz_mdivmod mpz_fdiv_qr -#define mpz_mmod mpz_fdiv_r -#define mpz_mdiv_ui mpz_fdiv_q_ui -#define mpz_mdivmod_ui(q,r,n,d) \ - ((r == 0) ? mpz_fdiv_q_ui (q,n,d) : mpz_fdiv_qr_ui (q,r,n,d)) -#define mpz_mmod_ui(r,n,d) \ - ((r == 0) ? mpz_fdiv_ui (n,d) : mpz_fdiv_r_ui (r,n,d)) - -/* Useful synonyms, but not quite compatible with GMP 1. */ -#define mpz_div mpz_fdiv_q -#define mpz_divmod mpz_fdiv_qr -#define mpz_div_ui mpz_fdiv_q_ui -#define mpz_divmod_ui mpz_fdiv_qr_ui -#define mpz_mod_ui mpz_fdiv_r_ui -#define mpz_div_2exp mpz_fdiv_q_2exp -#define mpz_mod_2exp mpz_fdiv_r_2exp - -#define gmp_errno __gmp_errno -extern int gmp_errno; - -enum -{ - GMP_ERROR_NONE = 0, - GMP_ERROR_UNSUPPORTED_ARGUMENT = 1, - GMP_ERROR_DIVISION_BY_ZERO = 2, - GMP_ERROR_SQRT_OF_NEGATIVE = 4, - GMP_ERROR_INVALID_ARGUMENT = 8, - GMP_ERROR_ALLOCATE = 16, - GMP_ERROR_BAD_STRING = 32, - GMP_ERROR_UNUSED_ERROR -}; - -/* Note: major version number is in mp.h too */ -#define __GNU_MP_VERSION 3 -#define __GNU_MP_VERSION_MINOR 1 -#define __GNU_MP_VERSION_PATCHLEVEL 1 - -#define gmp_version __gmp_version -extern __gmp_const char *gmp_version; - -#define __GMP_H__ -#endif /* __GMP_H__ */ diff --git a/rts/gmp/insert-dbl.c b/rts/gmp/insert-dbl.c deleted file mode 100644 index dc88a56..0000000 --- a/rts/gmp/insert-dbl.c +++ /dev/null @@ -1,98 +0,0 @@ -/* __gmp_insert_double -- convert from array of mp_limb_t to double. - -Copyright (C) 1996, 1997, 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" - -#ifdef XDEBUG -#undef _GMP_IEEE_FLOATS -#endif - -#ifndef _GMP_IEEE_FLOATS -#define _GMP_IEEE_FLOATS 0 -#endif - -double -#if __STDC__ -__gmp_scale2 (double d, int exp) -#else -__gmp_scale2 (d, exp) - double d; - int exp; -#endif -{ -#if _GMP_IEEE_FLOATS - { -#if defined (__alpha) && __GNUC__ == 2 && __GNUC_MINOR__ == 8 - /* Work around alpha-specific bug in GCC 2.8.x. */ - volatile -#endif - union ieee_double_extract x; - x.d = d; - exp += x.s.exp; - x.s.exp = exp; - if (exp >= 2047) - { - /* Return +-infinity */ - x.s.exp = 2047; - x.s.manl = x.s.manh = 0; - } - else if (exp < 1) - { - x.s.exp = 1; /* smallest exponent (biased) */ - /* Divide result by 2 until we have scaled it to the right IEEE - denormalized number, but stop if it becomes zero. */ - while (exp < 1 && x.d != 0) - { - x.d *= 0.5; - exp++; - } - } - return x.d; - } -#else - { - double factor, r; - - factor = 2.0; - if (exp < 0) - { - factor = 0.5; - exp = -exp; - } - r = d; - if (exp != 0) - { - if ((exp & 1) != 0) - r *= factor; - exp >>= 1; - while (exp != 0) - { - factor *= factor; - if ((exp & 1) != 0) - r *= factor; - exp >>= 1; - } - } - return r; - } -#endif -} diff --git a/rts/gmp/install-sh b/rts/gmp/install-sh deleted file mode 100644 index e9de238..0000000 --- a/rts/gmp/install-sh +++ /dev/null @@ -1,251 +0,0 @@ -#!/bin/sh -# -# install - install a program, script, or datafile -# This comes from X11R5 (mit/util/scripts/install.sh). -# -# Copyright 1991 by the Massachusetts Institute of Technology -# -# Permission to use, copy, modify, distribute, and sell this software and its -# documentation for any purpose is hereby granted without fee, provided that -# the above copyright notice appear in all copies and that both that -# copyright notice and this permission notice appear in supporting -# documentation, and that the name of M.I.T. not be used in advertising or -# publicity pertaining to distribution of the software without specific, -# written prior permission. M.I.T. makes no representations about the -# suitability of this software for any purpose. It is provided "as is" -# without express or implied warranty. -# -# Calling this script install-sh is preferred over install.sh, to prevent -# `make' implicit rules from creating a file called install from it -# when there is no Makefile. -# -# This script is compatible with the BSD install script, but was written -# from scratch. It can only install one file at a time, a restriction -# shared with many OS's install programs. - - -# set DOITPROG to echo to test this script - -# Don't use :- since 4.3BSD and earlier shells don't like it. -doit="${DOITPROG-}" - - -# put in absolute paths if you don't have them in your path; or use env. vars. - -mvprog="${MVPROG-mv}" -cpprog="${CPPROG-cp}" -chmodprog="${CHMODPROG-chmod}" -chownprog="${CHOWNPROG-chown}" -chgrpprog="${CHGRPPROG-chgrp}" -stripprog="${STRIPPROG-strip}" -rmprog="${RMPROG-rm}" -mkdirprog="${MKDIRPROG-mkdir}" - -transformbasename="" -transform_arg="" -instcmd="$mvprog" -chmodcmd="$chmodprog 0755" -chowncmd="" -chgrpcmd="" -stripcmd="" -rmcmd="$rmprog -f" -mvcmd="$mvprog" -src="" -dst="" -dir_arg="" - -while [ x"$1" != x ]; do - case $1 in - -c) instcmd="$cpprog" - shift - continue;; - - -d) dir_arg=true - shift - continue;; - - -m) chmodcmd="$chmodprog $2" - shift - shift - continue;; - - -o) chowncmd="$chownprog $2" - shift - shift - continue;; - - -g) chgrpcmd="$chgrpprog $2" - shift - shift - continue;; - - -s) stripcmd="$stripprog" - shift - continue;; - - -t=*) transformarg=`echo $1 | sed 's/-t=//'` - shift - continue;; - - -b=*) transformbasename=`echo $1 | sed 's/-b=//'` - shift - continue;; - - *) if [ x"$src" = x ] - then - src=$1 - else - # this colon is to work around a 386BSD /bin/sh bug - : - dst=$1 - fi - shift - continue;; - esac -done - -if [ x"$src" = x ] -then - echo "install: no input file specified" - exit 1 -else - true -fi - -if [ x"$dir_arg" != x ]; then - dst=$src - src="" - - if [ -d $dst ]; then - instcmd=: - chmodcmd="" - else - instcmd=mkdir - fi -else - -# Waiting for this to be detected by the "$instcmd $src $dsttmp" command -# might cause directories to be created, which would be especially bad -# if $src (and thus $dsttmp) contains '*'. - - if [ -f $src -o -d $src ] - then - true - else - echo "install: $src does not exist" - exit 1 - fi - - if [ x"$dst" = x ] - then - echo "install: no destination specified" - exit 1 - else - true - fi - -# If destination is a directory, append the input filename; if your system -# does not like double slashes in filenames, you may need to add some logic - - if [ -d $dst ] - then - dst="$dst"/`basename $src` - else - true - fi -fi - -## this sed command emulates the dirname command -dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` - -# Make sure that the destination directory exists. -# this part is taken from Noah Friedman's mkinstalldirs script - -# Skip lots of stat calls in the usual case. -if [ ! -d "$dstdir" ]; then -defaultIFS=' -' -IFS="${IFS-${defaultIFS}}" - -oIFS="${IFS}" -# Some sh's can't handle IFS=/ for some reason. -IFS='%' -set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` -IFS="${oIFS}" - -pathcomp='' - -while [ $# -ne 0 ] ; do - pathcomp="${pathcomp}${1}" - shift - - if [ ! -d "${pathcomp}" ] ; - then - $mkdirprog "${pathcomp}" - else - true - fi - - pathcomp="${pathcomp}/" -done -fi - -if [ x"$dir_arg" != x ] -then - $doit $instcmd $dst && - - if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && - if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && - if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && - if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi -else - -# If we're going to rename the final executable, determine the name now. - - if [ x"$transformarg" = x ] - then - dstfile=`basename $dst` - else - dstfile=`basename $dst $transformbasename | - sed $transformarg`$transformbasename - fi - -# don't allow the sed command to completely eliminate the filename - - if [ x"$dstfile" = x ] - then - dstfile=`basename $dst` - else - true - fi - -# Make a temp file name in the proper directory. - - dsttmp=$dstdir/#inst.$$# - -# Move or copy the file name to the temp name - - $doit $instcmd $src $dsttmp && - - trap "rm -f ${dsttmp}" 0 && - -# and set any options; do chmod last to preserve setuid bits - -# If any of these fail, we abort the whole thing. If we want to -# ignore errors from any of these, just make sure not to ignore -# errors from the above "$doit $instcmd $src $dsttmp" command. - - if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && - if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && - if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && - if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && - -# Now rename the file to the real destination. - - $doit $rmcmd -f $dstdir/$dstfile && - $doit $mvcmd $dsttmp $dstdir/$dstfile - -fi && - - -exit 0 diff --git a/rts/gmp/longlong.h b/rts/gmp/longlong.h deleted file mode 100644 index 9a12755..0000000 --- a/rts/gmp/longlong.h +++ /dev/null @@ -1,1347 +0,0 @@ -/* longlong.h -- definitions for mixed size 32/64 bit arithmetic. - -Copyright (C) 1991, 1992, 1993, 1994, 1996, 1997, 1999, 2000 Free Software -Foundation, Inc. - -This file is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published by -the Free Software Foundation; either version 2.1 of the License, or (at your -option) any later version. - -This file is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with this file; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -/* You have to define the following before including this file: - - UWtype -- An unsigned type, default type for operations (typically a "word") - UHWtype -- An unsigned type, at least half the size of UWtype. - UDWtype -- An unsigned type, at least twice as large a UWtype - W_TYPE_SIZE -- size in bits of UWtype - - SItype, USItype -- Signed and unsigned 32 bit types. - DItype, UDItype -- Signed and unsigned 64 bit types. - - On a 32 bit machine UWtype should typically be USItype; - on a 64 bit machine, UWtype should typically be UDItype. -*/ - -#define __BITS4 (W_TYPE_SIZE / 4) -#define __ll_B ((UWtype) 1 << (W_TYPE_SIZE / 2)) -#define __ll_lowpart(t) ((UWtype) (t) & (__ll_B - 1)) -#define __ll_highpart(t) ((UWtype) (t) >> (W_TYPE_SIZE / 2)) - -/* This is used to make sure no undesirable sharing between different libraries - that use this file takes place. */ -#ifndef __MPN -#define __MPN(x) __##x -#endif - -#ifndef _PROTO -#if (__STDC__-0) || defined (__cplusplus) -#define _PROTO(x) x -#else -#define _PROTO(x) () -#endif -#endif - -/* Define auxiliary asm macros. - - 1) umul_ppmm(high_prod, low_prod, multipler, multiplicand) multiplies two - UWtype integers MULTIPLER and MULTIPLICAND, and generates a two UWtype - word product in HIGH_PROD and LOW_PROD. - - 2) __umulsidi3(a,b) multiplies two UWtype integers A and B, and returns a - UDWtype product. This is just a variant of umul_ppmm. - - 3) udiv_qrnnd(quotient, remainder, high_numerator, low_numerator, - denominator) divides a UDWtype, composed by the UWtype integers - HIGH_NUMERATOR and LOW_NUMERATOR, by DENOMINATOR and places the quotient - in QUOTIENT and the remainder in REMAINDER. HIGH_NUMERATOR must be less - than DENOMINATOR for correct operation. If, in addition, the most - significant bit of DENOMINATOR must be 1, then the pre-processor symbol - UDIV_NEEDS_NORMALIZATION is defined to 1. - - 4) sdiv_qrnnd(quotient, remainder, high_numerator, low_numerator, - denominator). Like udiv_qrnnd but the numbers are signed. The quotient - is rounded towards 0. - - 5) count_leading_zeros(count, x) counts the number of zero-bits from the - msb to the first non-zero bit in the UWtype X. This is the number of - steps X needs to be shifted left to set the msb. Undefined for X == 0, - unless the symbol COUNT_LEADING_ZEROS_0 is defined to some value. - - 6) count_trailing_zeros(count, x) like count_leading_zeros, but counts - from the least significant end. - - 7) add_ssaaaa(high_sum, low_sum, high_addend_1, low_addend_1, - high_addend_2, low_addend_2) adds two UWtype integers, composed by - HIGH_ADDEND_1 and LOW_ADDEND_1, and HIGH_ADDEND_2 and LOW_ADDEND_2 - respectively. The result is placed in HIGH_SUM and LOW_SUM. Overflow - (i.e. carry out) is not stored anywhere, and is lost. - - 8) sub_ddmmss(high_difference, low_difference, high_minuend, low_minuend, - high_subtrahend, low_subtrahend) subtracts two two-word UWtype integers, - composed by HIGH_MINUEND_1 and LOW_MINUEND_1, and HIGH_SUBTRAHEND_2 and - LOW_SUBTRAHEND_2 respectively. The result is placed in HIGH_DIFFERENCE - and LOW_DIFFERENCE. Overflow (i.e. carry out) is not stored anywhere, - and is lost. - - If any of these macros are left undefined for a particular CPU, - C macros are used. */ - -/* The CPUs come in alphabetical order below. - - Please add support for more CPUs here, or improve the current support - for the CPUs below! */ - -#if defined (__alpha) && W_TYPE_SIZE == 64 -#if defined (__GNUC__) -#define umul_ppmm(ph, pl, m0, m1) \ - do { \ - UDItype __m0 = (m0), __m1 = (m1); \ - __asm__ ("umulh %r1,%2,%0" \ - : "=r" (ph) \ - : "%rJ" (m0), "rI" (m1)); \ - (pl) = __m0 * __m1; \ - } while (0) -#define UMUL_TIME 18 -#ifndef LONGLONG_STANDALONE -#define udiv_qrnnd(q, r, n1, n0, d) \ - do { UDItype __di; \ - __di = __MPN(invert_limb) (d); \ - udiv_qrnnd_preinv (q, r, n1, n0, d, __di); \ - } while (0) -#define UDIV_NEEDS_NORMALIZATION 1 -#define UDIV_TIME 220 -long __MPN(count_leading_zeros) (); -#define count_leading_zeros(count, x) \ - ((count) = __MPN(count_leading_zeros) (x)) -#endif /* LONGLONG_STANDALONE */ -#else /* ! __GNUC__ */ -#include -#define umul_ppmm(ph, pl, m0, m1) \ - do { \ - UDItype __m0 = (m0), __m1 = (m1); \ - (ph) = __UMULH (m0, m1); \ - (pl) = __m0 * __m1; \ - } while (0) -#endif -#endif /* __alpha */ - -#if defined (__hppa) && W_TYPE_SIZE == 64 -/* We put the result pointer parameter last here, since it makes passing - of the other parameters more efficient. */ -#ifndef LONGLONG_STANDALONE -#define umul_ppmm(wh, wl, u, v) \ - do { \ - UDItype __p0; \ - (wh) = __MPN(umul_ppmm) (u, v, &__p0); \ - (wl) = __p0; \ - } while (0) -extern UDItype __MPN(umul_ppmm) _PROTO ((UDItype, UDItype, UDItype *)); -#define udiv_qrnnd(q, r, n1, n0, d) \ - do { UDItype __r; \ - (q) = __MPN(udiv_qrnnd) (n1, n0, d, &__r); \ - (r) = __r; \ - } while (0) -extern UDItype __MPN(udiv_qrnnd) _PROTO ((UDItype, UDItype, UDItype, UDItype *)); -#define UMUL_TIME 8 -#define UDIV_TIME 60 -#endif /* LONGLONG_STANDALONE */ -#endif /* hppa */ - -#if defined (__ia64) && W_TYPE_SIZE == 64 -#if defined (__GNUC__) -#define umul_ppmm(ph, pl, m0, m1) \ - do { \ - UDItype __m0 = (m0), __m1 = (m1); \ - __asm__ ("xma.hu %0 = %1, %2, f0" \ - : "=e" (ph) \ - : "e" (m0), "e" (m1)); \ - (pl) = __m0 * __m1; \ - } while (0) -#endif -#endif - - -#if defined (__GNUC__) && !defined (NO_ASM) - -/* We sometimes need to clobber "cc" with gcc2, but that would not be - understood by gcc1. Use cpp to avoid major code duplication. */ -#if __GNUC__ < 2 -#define __CLOBBER_CC -#define __AND_CLOBBER_CC -#else /* __GNUC__ >= 2 */ -#define __CLOBBER_CC : "cc" -#define __AND_CLOBBER_CC , "cc" -#endif /* __GNUC__ < 2 */ - -#if (defined (__a29k__) || defined (_AM29K)) && W_TYPE_SIZE == 32 -#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ - __asm__ ("add %1,%4,%5\n\taddc %0,%2,%3" \ - : "=r" (sh), "=&r" (sl) \ - : "%r" (ah), "rI" (bh), "%r" (al), "rI" (bl)) -#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ - __asm__ ("sub %1,%4,%5\n\tsubc %0,%2,%3" \ - : "=r" (sh), "=&r" (sl) \ - : "r" (ah), "rI" (bh), "r" (al), "rI" (bl)) -#define umul_ppmm(xh, xl, m0, m1) \ - do { \ - USItype __m0 = (m0), __m1 = (m1); \ - __asm__ ("multiplu %0,%1,%2" \ - : "=r" (xl) \ - : "r" (__m0), "r" (__m1)); \ - __asm__ ("multmu %0,%1,%2" \ - : "=r" (xh) \ - : "r" (__m0), "r" (__m1)); \ - } while (0) -#define udiv_qrnnd(q, r, n1, n0, d) \ - __asm__ ("dividu %0,%3,%4" \ - : "=r" (q), "=q" (r) \ - : "1" (n1), "r" (n0), "r" (d)) -#define count_leading_zeros(count, x) \ - __asm__ ("clz %0,%1" \ - : "=r" (count) \ - : "r" (x)) -#define COUNT_LEADING_ZEROS_0 32 -#endif /* __a29k__ */ - -#if defined (__arm__) && W_TYPE_SIZE == 32 -#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ - __asm__ ("adds\t%1, %4, %5\n\tadc\t%0, %2, %3" \ - : "=r" (sh), "=&r" (sl) \ - : "%r" (ah), "rI" (bh), "%r" (al), "rI" (bl)) -#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ - __asm__ ("subs\t%1, %4, %5\n\tsbc\t%0, %2, %3" \ - : "=r" (sh), "=&r" (sl) \ - : "r" (ah), "rI" (bh), "r" (al), "rI" (bl)) -#if 1 || defined (__arm_m__) /* `M' series has widening multiply support */ -#define umul_ppmm(xh, xl, a, b) \ - __asm__ ("umull %0,%1,%2,%3" : "=&r" (xl), "=&r" (xh) : "r" (a), "r" (b)) -#define smul_ppmm(xh, xl, a, b) \ - __asm__ ("smull %0,%1,%2,%3" : "=&r" (xl), "=&r" (xh) : "r" (a), "r" (b)) -#define UMUL_TIME 5 -#else -#define umul_ppmm(xh, xl, a, b) \ - __asm__ ("%@ Inlined umul_ppmm\n" \ - "mov %|r0, %2, lsr #16\n" \ - "mov %|r2, %3, lsr #16\n" \ - "bic %|r1, %2, %|r0, lsl #16\n" \ - "bic %|r2, %3, %|r2, lsl #16\n" \ - "mul %1, %|r1, %|r2\n" \ - "mul %|r2, %|r0, %|r2\n" \ - "mul %|r1, %0, %|r1\n" \ - "mul %0, %|r0, %0\n" \ - "adds %|r1, %|r2, %|r1\n" \ - "addcs %0, %0, #65536\n" \ - "adds %1, %1, %|r1, lsl #16\n" \ - "adc %0, %0, %|r1, lsr #16" \ - : "=&r" (xh), "=r" (xl) \ - : "r" (a), "r" (b) \ - : "r0", "r1", "r2") -#define UMUL_TIME 20 -#endif -#define UDIV_TIME 100 -#endif /* __arm__ */ - -#if defined (__clipper__) && W_TYPE_SIZE == 32 -#define umul_ppmm(w1, w0, u, v) \ - ({union {UDItype __ll; \ - struct {USItype __l, __h;} __i; \ - } __x; \ - __asm__ ("mulwux %2,%0" \ - : "=r" (__x.__ll) \ - : "%0" ((USItype)(u)), "r" ((USItype)(v))); \ - (w1) = __x.__i.__h; (w0) = __x.__i.__l;}) -#define smul_ppmm(w1, w0, u, v) \ - ({union {DItype __ll; \ - struct {SItype __l, __h;} __i; \ - } __x; \ - __asm__ ("mulwx %2,%0" \ - : "=r" (__x.__ll) \ - : "%0" ((SItype)(u)), "r" ((SItype)(v))); \ - (w1) = __x.__i.__h; (w0) = __x.__i.__l;}) -#define __umulsidi3(u, v) \ - ({UDItype __w; \ - __asm__ ("mulwux %2,%0" \ - : "=r" (__w) : "%0" ((USItype)(u)), "r" ((USItype)(v))); \ - __w; }) -#endif /* __clipper__ */ - -/* Fujitsu vector computers. */ -#if defined (__uxp__) && W_TYPE_SIZE == 32 -#define umul_ppmm(ph, pl, u, v) \ - do { \ - union {UDItype __ll; \ - struct {USItype __h, __l;} __i; \ - } __x; \ - __asm__ ("mult.lu %1,%2,%0" : "=r" (__x.__ll) : "%r" (u), "rK" (v));\ - (ph) = __x.__i.__h; \ - (pl) = __x.__i.__l; \ - } while (0) -#define smul_ppmm(ph, pl, u, v) \ - do { \ - union {UDItype __ll; \ - struct {USItype __h, __l;} __i; \ - } __x; \ - __asm__ ("mult.l %1,%2,%0" : "=r" (__x.__ll) : "%r" (u), "rK" (v)); \ - (ph) = __x.__i.__h; \ - (pl) = __x.__i.__l; \ - } while (0) -#endif - -#if defined (__gmicro__) && W_TYPE_SIZE == 32 -#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ - __asm__ ("add.w %5,%1\n\taddx %3,%0" \ - : "=g" ((USItype)(sh)), "=&g" ((USItype)(sl)) \ - : "%0" ((USItype)(ah)), "g" ((USItype)(bh)), \ - "%1" ((USItype)(al)), "g" ((USItype)(bl))) -#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ - __asm__ ("sub.w %5,%1\n\tsubx %3,%0" \ - : "=g" ((USItype)(sh)), "=&g" ((USItype)(sl)) \ - : "0" ((USItype)(ah)), "g" ((USItype)(bh)), \ - "1" ((USItype)(al)), "g" ((USItype)(bl))) -#define umul_ppmm(ph, pl, m0, m1) \ - __asm__ ("mulx %3,%0,%1" \ - : "=g" ((USItype)(ph)), "=r" ((USItype)(pl)) \ - : "%0" ((USItype)(m0)), "g" ((USItype)(m1))) -#define udiv_qrnnd(q, r, nh, nl, d) \ - __asm__ ("divx %4,%0,%1" \ - : "=g" ((USItype)(q)), "=r" ((USItype)(r)) \ - : "1" ((USItype)(nh)), "0" ((USItype)(nl)), "g" ((USItype)(d))) -#define count_leading_zeros(count, x) \ - __asm__ ("bsch/1 %1,%0" \ - : "=g" (count) : "g" ((USItype)(x)), "0" ((USItype)0)) -#endif - -#if defined (__hppa) && W_TYPE_SIZE == 32 -#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ - __asm__ ("add %4,%5,%1\n\taddc %2,%3,%0" \ - : "=r" (sh), "=&r" (sl) \ - : "%rM" (ah), "rM" (bh), "%rM" (al), "rM" (bl)) -#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ - __asm__ ("sub %4,%5,%1\n\tsubb %2,%3,%0" \ - : "=r" (sh), "=&r" (sl) \ - : "rM" (ah), "rM" (bh), "rM" (al), "rM" (bl)) -#if defined (_PA_RISC1_1) -#define umul_ppmm(wh, wl, u, v) \ - do { \ - union {UDItype __ll; \ - struct {USItype __h, __l;} __i; \ - } __x; \ - __asm__ ("xmpyu %1,%2,%0" : "=*f" (__x.__ll) : "*f" (u), "*f" (v)); \ - (wh) = __x.__i.__h; \ - (wl) = __x.__i.__l; \ - } while (0) -#define UMUL_TIME 8 -#define UDIV_TIME 60 -#else -#define UMUL_TIME 40 -#define UDIV_TIME 80 -#endif -#ifndef LONGLONG_STANDALONE -#define udiv_qrnnd(q, r, n1, n0, d) \ - do { USItype __r; \ - (q) = __MPN(udiv_qrnnd) (&__r, (n1), (n0), (d)); \ - (r) = __r; \ - } while (0) -extern USItype __MPN(udiv_qrnnd) _PROTO ((USItype *, USItype, USItype, USItype)); -#endif /* LONGLONG_STANDALONE */ -#define count_leading_zeros(count, x) \ - do { \ - USItype __tmp; \ - __asm__ ( \ - "ldi 2,%0\n" \ - "extru,= %1,15,16,%%r0 ; Bits 31..16 zero?\n" \ - "extru,tr %1,15,16,%1 ; No. Shift down, skip add.\n" \ - "ldo 16(%0),%0 ; Yes. Perform add.\n" \ - "extru,= %1,23,8,%%r0 ; Bits 15..8 zero?\n" \ - "extru,tr %1,23,8,%1 ; No. Shift down, skip add.\n" \ - "ldo 8(%0),%0 ; Yes. Perform add.\n" \ - "extru,= %1,27,4,%%r0 ; Bits 7..4 zero?\n" \ - "extru,tr %1,27,4,%1 ; No. Shift down, skip add.\n" \ - "ldo 4(%0),%0 ; Yes. Perform add.\n" \ - "extru,= %1,29,2,%%r0 ; Bits 3..2 zero?\n" \ - "extru,tr %1,29,2,%1 ; No. Shift down, skip add.\n" \ - "ldo 2(%0),%0 ; Yes. Perform add.\n" \ - "extru %1,30,1,%1 ; Extract bit 1.\n" \ - "sub %0,%1,%0 ; Subtract it.\n" \ - : "=r" (count), "=r" (__tmp) : "1" (x)); \ - } while (0) -#endif /* hppa */ - -#if (defined (__i370__) || defined (__mvs__)) && W_TYPE_SIZE == 32 -#define smul_ppmm(xh, xl, m0, m1) \ - do { \ - union {DItype __ll; \ - struct {USItype __h, __l;} __i; \ - } __x; \ - __asm__ ("mr %0,%3" \ - : "=r" (__x.__i.__h), "=r" (__x.__i.__l) \ - : "%1" (m0), "r" (m1)); \ - (xh) = __x.__i.__h; (xl) = __x.__i.__l; \ - } while (0) -#define sdiv_qrnnd(q, r, n1, n0, d) \ - do { \ - union {DItype __ll; \ - struct {USItype __h, __l;} __i; \ - } __x; \ - __x.__i.__h = n1; __x.__i.__l = n0; \ - __asm__ ("dr %0,%2" \ - : "=r" (__x.__ll) \ - : "0" (__x.__ll), "r" (d)); \ - (q) = __x.__i.__l; (r) = __x.__i.__h; \ - } while (0) -#endif - -#if (defined (__i386__) || defined (__i486__)) && W_TYPE_SIZE == 32 -#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ - __asm__ ("addl %5,%1\n\tadcl %3,%0" \ - : "=r" ((USItype)(sh)), "=&r" ((USItype)(sl)) \ - : "%0" ((USItype)(ah)), "g" ((USItype)(bh)), \ - "%1" ((USItype)(al)), "g" ((USItype)(bl))) -#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ - __asm__ ("subl %5,%1\n\tsbbl %3,%0" \ - : "=r" ((USItype)(sh)), "=&r" ((USItype)(sl)) \ - : "0" ((USItype)(ah)), "g" ((USItype)(bh)), \ - "1" ((USItype)(al)), "g" ((USItype)(bl))) -#define umul_ppmm(w1, w0, u, v) \ - __asm__ ("mull %3" \ - : "=a" (w0), "=d" (w1) \ - : "%0" ((USItype)(u)), "rm" ((USItype)(v))) -#define udiv_qrnnd(q, r, n1, n0, d) \ - __asm__ ("divl %4" \ - : "=a" (q), "=d" (r) \ - : "0" ((USItype)(n0)), "1" ((USItype)(n1)), "rm" ((USItype)(d))) -#define count_leading_zeros(count, x) \ - do { \ - USItype __cbtmp; \ - __asm__ ("bsrl %1,%0" : "=r" (__cbtmp) : "rm" ((USItype)(x))); \ - (count) = __cbtmp ^ 31; \ - } while (0) -#define count_trailing_zeros(count, x) \ - __asm__ ("bsfl %1,%0" : "=r" (count) : "rm" ((USItype)(x))) -#ifndef UMUL_TIME -#define UMUL_TIME 10 -#endif -#ifndef UDIV_TIME -#define UDIV_TIME 40 -#endif -#endif /* 80x86 */ - -#if defined (__i860__) && W_TYPE_SIZE == 32 -#define rshift_rhlc(r,h,l,c) \ - __asm__ ("shr %3,r0,r0\;shrd %1,%2,%0" \ - "=r" (r) : "r" (h), "r" (l), "rn" (c)) -#endif /* i860 */ - -#if defined (__i960__) && W_TYPE_SIZE == 32 -#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ - __asm__ ("cmpo 1,0\;addc %5,%4,%1\;addc %3,%2,%0" \ - : "=r" (sh), "=&r" (sl) \ - : "%dI" (ah), "dI" (bh), "%dI" (al), "dI" (bl)) -#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ - __asm__ ("cmpo 0,0\;subc %5,%4,%1\;subc %3,%2,%0" \ - : "=r" (sh), "=&r" (sl) \ - : "dI" (ah), "dI" (bh), "dI" (al), "dI" (bl)) -#define umul_ppmm(w1, w0, u, v) \ - ({union {UDItype __ll; \ - struct {USItype __l, __h;} __i; \ - } __x; \ - __asm__ ("emul %2,%1,%0" \ - : "=d" (__x.__ll) : "%dI" (u), "dI" (v)); \ - (w1) = __x.__i.__h; (w0) = __x.__i.__l;}) -#define __umulsidi3(u, v) \ - ({UDItype __w; \ - __asm__ ("emul %2,%1,%0" : "=d" (__w) : "%dI" (u), "dI" (v)); \ - __w; }) -#define udiv_qrnnd(q, r, nh, nl, d) \ - do { \ - union {UDItype __ll; \ - struct {USItype __l, __h;} __i; \ - } __nn; \ - __nn.__i.__h = (nh); __nn.__i.__l = (nl); \ - __asm__ ("ediv %d,%n,%0" \ - : "=d" (__rq.__ll) : "dI" (__nn.__ll), "dI" (d)); \ - (r) = __rq.__i.__l; (q) = __rq.__i.__h; \ - } while (0) -#define count_leading_zeros(count, x) \ - do { \ - USItype __cbtmp; \ - __asm__ ("scanbit %1,%0" : "=r" (__cbtmp) : "r" (x)); \ - (count) = __cbtmp ^ 31; \ - } while (0) -#define COUNT_LEADING_ZEROS_0 (-32) /* sic */ -#if defined (__i960mx) /* what is the proper symbol to test??? */ -#define rshift_rhlc(r,h,l,c) \ - do { \ - union {UDItype __ll; \ - struct {USItype __l, __h;} __i; \ - } __nn; \ - __nn.__i.__h = (h); __nn.__i.__l = (l); \ - __asm__ ("shre %2,%1,%0" : "=d" (r) : "dI" (__nn.__ll), "dI" (c)); \ - } -#endif /* i960mx */ -#endif /* i960 */ - -#if (defined (__mc68000__) || defined (__mc68020__) || defined(mc68020) \ - || defined (__m68k__) || defined (__mc5200__) || defined (__mc5206e__) \ - || defined (__mc5307__)) && W_TYPE_SIZE == 32 -#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ - __asm__ ("add%.l %5,%1\n\taddx%.l %3,%0" \ - : "=d" ((USItype)(sh)), "=&d" ((USItype)(sl)) \ - : "%0" ((USItype)(ah)), "d" ((USItype)(bh)), \ - "%1" ((USItype)(al)), "g" ((USItype)(bl))) -#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ - __asm__ ("sub%.l %5,%1\n\tsubx%.l %3,%0" \ - : "=d" ((USItype)(sh)), "=&d" ((USItype)(sl)) \ - : "0" ((USItype)(ah)), "d" ((USItype)(bh)), \ - "1" ((USItype)(al)), "g" ((USItype)(bl))) -/* The '020, '030, '040 and CPU32 have 32x32->64 and 64/32->32q-32r. */ -#if defined (__mc68020__) || defined(mc68020) \ - || defined (__mc68030__) || defined (mc68030) \ - || defined (__mc68040__) || defined (mc68040) \ - || defined (__mc68332__) || defined (mc68332) \ - || defined (__NeXT__) -#define umul_ppmm(w1, w0, u, v) \ - __asm__ ("mulu%.l %3,%1:%0" \ - : "=d" ((USItype)(w0)), "=d" ((USItype)(w1)) \ - : "%0" ((USItype)(u)), "dmi" ((USItype)(v))) -#define UMUL_TIME 45 -#define udiv_qrnnd(q, r, n1, n0, d) \ - __asm__ ("divu%.l %4,%1:%0" \ - : "=d" ((USItype)(q)), "=d" ((USItype)(r)) \ - : "0" ((USItype)(n0)), "1" ((USItype)(n1)), "dmi" ((USItype)(d))) -#define UDIV_TIME 90 -#define sdiv_qrnnd(q, r, n1, n0, d) \ - __asm__ ("divs%.l %4,%1:%0" \ - : "=d" ((USItype)(q)), "=d" ((USItype)(r)) \ - : "0" ((USItype)(n0)), "1" ((USItype)(n1)), "dmi" ((USItype)(d))) -#else /* for other 68k family members use 16x16->32 multiplication */ -#define umul_ppmm(xh, xl, a, b) \ - do { USItype __umul_tmp1, __umul_tmp2; \ - __asm__ ("| Inlined umul_ppmm\n" \ - "move%.l %5,%3\n" \ - "move%.l %2,%0\n" \ - "move%.w %3,%1\n" \ - "swap %3\n" \ - "swap %0\n" \ - "mulu%.w %2,%1\n" \ - "mulu%.w %3,%0\n" \ - "mulu%.w %2,%3\n" \ - "swap %2\n" \ - "mulu%.w %5,%2\n" \ - "add%.l %3,%2\n" \ - "jcc 1f\n" \ - "add%.l %#0x10000,%0\n" \ -"1: move%.l %2,%3\n" \ - "clr%.w %2\n" \ - "swap %2\n" \ - "swap %3\n" \ - "clr%.w %3\n" \ - "add%.l %3,%1\n" \ - "addx%.l %2,%0\n" \ - "| End inlined umul_ppmm" \ - : "=&d" ((USItype)(xh)), "=&d" ((USItype)(xl)), \ - "=d" (__umul_tmp1), "=&d" (__umul_tmp2) \ - : "%2" ((USItype)(a)), "d" ((USItype)(b))); \ - } while (0) -#define UMUL_TIME 100 -#define UDIV_TIME 400 -#endif /* not mc68020 */ -/* The '020, '030, '040 and '060 have bitfield insns. */ -#if defined (__mc68020__) || defined (mc68020) \ - || defined (__mc68030__) || defined (mc68030) \ - || defined (__mc68040__) || defined (mc68040) \ - || defined (__mc68060__) || defined (mc68060) \ - || defined (__NeXT__) -#define count_leading_zeros(count, x) \ - __asm__ ("bfffo %1{%b2:%b2},%0" \ - : "=d" ((USItype) (count)) \ - : "od" ((USItype) (x)), "n" (0)) -#define COUNT_LEADING_ZEROS_0 32 -#endif -#endif /* mc68000 */ - -#if defined (__m88000__) && W_TYPE_SIZE == 32 -#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ - __asm__ ("addu.co %1,%r4,%r5\n\taddu.ci %0,%r2,%r3" \ - : "=r" (sh), "=&r" (sl) \ - : "%rJ" (ah), "rJ" (bh), "%rJ" (al), "rJ" (bl)) -#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ - __asm__ ("subu.co %1,%r4,%r5\n\tsubu.ci %0,%r2,%r3" \ - : "=r" (sh), "=&r" (sl) \ - : "rJ" (ah), "rJ" (bh), "rJ" (al), "rJ" (bl)) -#define count_leading_zeros(count, x) \ - do { \ - USItype __cbtmp; \ - __asm__ ("ff1 %0,%1" : "=r" (__cbtmp) : "r" (x)); \ - (count) = __cbtmp ^ 31; \ - } while (0) -#define COUNT_LEADING_ZEROS_0 63 /* sic */ -#if defined (__m88110__) -#define umul_ppmm(wh, wl, u, v) \ - do { \ - union {UDItype __ll; \ - struct {USItype __h, __l;} __i; \ - } __x; \ - __asm__ ("mulu.d %0,%1,%2" : "=r" (__x.__ll) : "r" (u), "r" (v)); \ - (wh) = __x.__i.__h; \ - (wl) = __x.__i.__l; \ - } while (0) -#define udiv_qrnnd(q, r, n1, n0, d) \ - ({union {UDItype __ll; \ - struct {USItype __h, __l;} __i; \ - } __x, __q; \ - __x.__i.__h = (n1); __x.__i.__l = (n0); \ - __asm__ ("divu.d %0,%1,%2" \ - : "=r" (__q.__ll) : "r" (__x.__ll), "r" (d)); \ - (r) = (n0) - __q.__l * (d); (q) = __q.__l; }) -#define UMUL_TIME 5 -#define UDIV_TIME 25 -#else -#define UMUL_TIME 17 -#define UDIV_TIME 150 -#endif /* __m88110__ */ -#endif /* __m88000__ */ - -#if defined (__mips) && W_TYPE_SIZE == 32 -#if __GNUC__ > 2 || __GNUC_MINOR__ >= 7 -#define umul_ppmm(w1, w0, u, v) \ - __asm__ ("multu %2,%3" : "=l" (w0), "=h" (w1) : "d" (u), "d" (v)) -#else -#define umul_ppmm(w1, w0, u, v) \ - __asm__ ("multu %2,%3\n\tmflo %0\n\tmfhi %1" \ - : "=d" (w0), "=d" (w1) : "d" (u), "d" (v)) -#endif -#define UMUL_TIME 10 -#define UDIV_TIME 100 -#endif /* __mips */ - -#if (defined (__mips) && __mips >= 3) && W_TYPE_SIZE == 64 -#if __GNUC__ > 2 || __GNUC_MINOR__ >= 7 -#define umul_ppmm(w1, w0, u, v) \ - __asm__ ("dmultu %2,%3" : "=l" (w0), "=h" (w1) : "d" (u), "d" (v)) -#else -#define umul_ppmm(w1, w0, u, v) \ - __asm__ ("dmultu %2,%3\n\tmflo %0\n\tmfhi %1" \ - : "=d" (w0), "=d" (w1) : "d" (u), "d" (v)) -#endif -#define UMUL_TIME 20 -#define UDIV_TIME 140 -#endif /* __mips */ - -#if defined (__ns32000__) && W_TYPE_SIZE == 32 -#define umul_ppmm(w1, w0, u, v) \ - ({union {UDItype __ll; \ - struct {USItype __l, __h;} __i; \ - } __x; \ - __asm__ ("meid %2,%0" \ - : "=g" (__x.__ll) \ - : "%0" ((USItype)(u)), "g" ((USItype)(v))); \ - (w1) = __x.__i.__h; (w0) = __x.__i.__l;}) -#define __umulsidi3(u, v) \ - ({UDItype __w; \ - __asm__ ("meid %2,%0" \ - : "=g" (__w) \ - : "%0" ((USItype)(u)), "g" ((USItype)(v))); \ - __w; }) -#define udiv_qrnnd(q, r, n1, n0, d) \ - ({union {UDItype __ll; \ - struct {USItype __l, __h;} __i; \ - } __x; \ - __x.__i.__h = (n1); __x.__i.__l = (n0); \ - __asm__ ("deid %2,%0" \ - : "=g" (__x.__ll) \ - : "0" (__x.__ll), "g" ((USItype)(d))); \ - (r) = __x.__i.__l; (q) = __x.__i.__h; }) -#define count_trailing_zeros(count,x) \ - do { \ - __asm__ ("ffsd %2,%0" \ - : "=r" ((USItype) (count)) \ - : "0" ((USItype) 0), "r" ((USItype) (x))); \ - } while (0) -#endif /* __ns32000__ */ - -/* We should test _IBMR2 here when we add assembly support for the system - vendor compilers. */ -#if (defined (_ARCH_PPC) || defined (_ARCH_PWR) || defined (__powerpc__)) && W_TYPE_SIZE == 32 -#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ - do { \ - if (__builtin_constant_p (bh) && (bh) == 0) \ - __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{aze|addze} %0,%2" \ - : "=r" (sh), "=&r" (sl) : "%r" (ah), "%r" (al), "rI" (bl));\ - else if (__builtin_constant_p (bh) && (bh) == ~(USItype) 0) \ - __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{ame|addme} %0,%2" \ - : "=r" (sh), "=&r" (sl) : "%r" (ah), "%r" (al), "rI" (bl));\ - else \ - __asm__ ("{a%I5|add%I5c} %1,%4,%5\n\t{ae|adde} %0,%2,%3" \ - : "=r" (sh), "=&r" (sl) \ - : "%r" (ah), "r" (bh), "%r" (al), "rI" (bl)); \ - } while (0) -#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ - do { \ - if (__builtin_constant_p (ah) && (ah) == 0) \ - __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfze|subfze} %0,%2" \ - : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\ - else if (__builtin_constant_p (ah) && (ah) == ~(USItype) 0) \ - __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfme|subfme} %0,%2" \ - : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\ - else if (__builtin_constant_p (bh) && (bh) == 0) \ - __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{ame|addme} %0,%2" \ - : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\ - else if (__builtin_constant_p (bh) && (bh) == ~(USItype) 0) \ - __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{aze|addze} %0,%2" \ - : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\ - else \ - __asm__ ("{sf%I4|subf%I4c} %1,%5,%4\n\t{sfe|subfe} %0,%3,%2" \ - : "=r" (sh), "=&r" (sl) \ - : "r" (ah), "r" (bh), "rI" (al), "r" (bl)); \ - } while (0) -#define count_leading_zeros(count, x) \ - __asm__ ("{cntlz|cntlzw} %0,%1" : "=r" (count) : "r" (x)) -#define COUNT_LEADING_ZEROS_0 32 -#if defined (_ARCH_PPC) || defined (__powerpc__) -#define umul_ppmm(ph, pl, m0, m1) \ - do { \ - USItype __m0 = (m0), __m1 = (m1); \ - __asm__ ("mulhwu %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1)); \ - (pl) = __m0 * __m1; \ - } while (0) -#define UMUL_TIME 15 -#define smul_ppmm(ph, pl, m0, m1) \ - do { \ - SItype __m0 = (m0), __m1 = (m1); \ - __asm__ ("mulhw %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1)); \ - (pl) = __m0 * __m1; \ - } while (0) -#define SMUL_TIME 14 -#define UDIV_TIME 120 -#else -#define UMUL_TIME 8 -#define smul_ppmm(xh, xl, m0, m1) \ - __asm__ ("mul %0,%2,%3" : "=r" (xh), "=q" (xl) : "r" (m0), "r" (m1)) -#define SMUL_TIME 4 -#define sdiv_qrnnd(q, r, nh, nl, d) \ - __asm__ ("div %0,%2,%4" : "=r" (q), "=q" (r) : "r" (nh), "1" (nl), "r" (d)) -#define UDIV_TIME 100 -#endif -#endif /* 32-bit POWER architecture variants. */ - -/* We should test _IBMR2 here when we add assembly support for the system - vendor compilers. */ -#if (defined (_ARCH_PPC) || defined (__powerpc__)) && W_TYPE_SIZE == 64 -#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ - do { \ - if (__builtin_constant_p (bh) && (bh) == 0) \ - __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{aze|addze} %0,%2" \ - : "=r" (sh), "=&r" (sl) : "%r" (ah), "%r" (al), "rI" (bl));\ - else if (__builtin_constant_p (bh) && (bh) == ~(UDItype) 0) \ - __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{ame|addme} %0,%2" \ - : "=r" (sh), "=&r" (sl) : "%r" (ah), "%r" (al), "rI" (bl));\ - else \ - __asm__ ("{a%I5|add%I5c} %1,%4,%5\n\t{ae|adde} %0,%2,%3" \ - : "=r" (sh), "=&r" (sl) \ - : "%r" (ah), "r" (bh), "%r" (al), "rI" (bl)); \ - } while (0) -#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ - do { \ - if (__builtin_constant_p (ah) && (ah) == 0) \ - __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfze|subfze} %0,%2" \ - : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\ - else if (__builtin_constant_p (ah) && (ah) == ~(UDItype) 0) \ - __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfme|subfme} %0,%2" \ - : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\ - else if (__builtin_constant_p (bh) && (bh) == 0) \ - __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{ame|addme} %0,%2" \ - : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\ - else if (__builtin_constant_p (bh) && (bh) == ~(UDItype) 0) \ - __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{aze|addze} %0,%2" \ - : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\ - else \ - __asm__ ("{sf%I4|subf%I4c} %1,%5,%4\n\t{sfe|subfe} %0,%3,%2" \ - : "=r" (sh), "=&r" (sl) \ - : "r" (ah), "r" (bh), "rI" (al), "r" (bl)); \ - } while (0) -#define count_leading_zeros(count, x) \ - __asm__ ("cntlzd %0,%1" : "=r" (count) : "r" (x)) -#define COUNT_LEADING_ZEROS_0 64 -#define umul_ppmm(ph, pl, m0, m1) \ - do { \ - UDItype __m0 = (m0), __m1 = (m1); \ - __asm__ ("mulhdu %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1)); \ - (pl) = __m0 * __m1; \ - } while (0) -#define UMUL_TIME 15 -#define smul_ppmm(ph, pl, m0, m1) \ - do { \ - DItype __m0 = (m0), __m1 = (m1); \ - __asm__ ("mulhd %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1)); \ - (pl) = __m0 * __m1; \ - } while (0) -#define SMUL_TIME 14 /* ??? */ -#define UDIV_TIME 120 /* ??? */ -#endif /* 64-bit PowerPC. */ - -#if defined (__pyr__) && W_TYPE_SIZE == 32 -#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ - __asm__ ("addw %5,%1\n\taddwc %3,%0" \ - : "=r" ((USItype)(sh)), "=&r" ((USItype)(sl)) \ - : "%0" ((USItype)(ah)), "g" ((USItype)(bh)), \ - "%1" ((USItype)(al)), "g" ((USItype)(bl))) -#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ - __asm__ ("subw %5,%1\n\tsubwb %3,%0" \ - : "=r" ((USItype)(sh)), "=&r" ((USItype)(sl)) \ - : "0" ((USItype)(ah)), "g" ((USItype)(bh)), \ - "1" ((USItype)(al)), "g" ((USItype)(bl))) -/* This insn works on Pyramids with AP, XP, or MI CPUs, but not with SP. */ -#define umul_ppmm(w1, w0, u, v) \ - ({union {UDItype __ll; \ - struct {USItype __h, __l;} __i; \ - } __x; \ - __asm__ ("movw %1,%R0\n\tuemul %2,%0" \ - : "=&r" (__x.__ll) \ - : "g" ((USItype) (u)), "g" ((USItype)(v))); \ - (w1) = __x.__i.__h; (w0) = __x.__i.__l;}) -#endif /* __pyr__ */ - -#if defined (__ibm032__) /* RT/ROMP */ && W_TYPE_SIZE == 32 -#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ - __asm__ ("a %1,%5\n\tae %0,%3" \ - : "=r" ((USItype)(sh)), "=&r" ((USItype)(sl)) \ - : "%0" ((USItype)(ah)), "r" ((USItype)(bh)), \ - "%1" ((USItype)(al)), "r" ((USItype)(bl))) -#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ - __asm__ ("s %1,%5\n\tse %0,%3" \ - : "=r" ((USItype)(sh)), "=&r" ((USItype)(sl)) \ - : "0" ((USItype)(ah)), "r" ((USItype)(bh)), \ - "1" ((USItype)(al)), "r" ((USItype)(bl))) -#define smul_ppmm(ph, pl, m0, m1) \ - __asm__ ( \ - "s r2,r2\n" \ - "mts r10,%2\n" \ - "m r2,%3\n" \ - "m r2,%3\n" \ - "m r2,%3\n" \ - "m r2,%3\n" \ - "m r2,%3\n" \ - "m r2,%3\n" \ - "m r2,%3\n" \ - "m r2,%3\n" \ - "m r2,%3\n" \ - "m r2,%3\n" \ - "m r2,%3\n" \ - "m r2,%3\n" \ - "m r2,%3\n" \ - "m r2,%3\n" \ - "m r2,%3\n" \ - "m r2,%3\n" \ - "cas %0,r2,r0\n" \ - "mfs r10,%1" \ - : "=r" ((USItype)(ph)), "=r" ((USItype)(pl)) \ - : "%r" ((USItype)(m0)), "r" ((USItype)(m1)) \ - : "r2"); \ -#define UMUL_TIME 20 -#define UDIV_TIME 200 -#define count_leading_zeros(count, x) \ - do { \ - if ((x) >= 0x10000) \ - __asm__ ("clz %0,%1" \ - : "=r" ((USItype)(count)) : "r" ((USItype)(x) >> 16)); \ - else \ - { \ - __asm__ ("clz %0,%1" \ - : "=r" ((USItype)(count)) : "r" ((USItype)(x))); \ - (count) += 16; \ - } \ - } while (0) -#endif /* RT/ROMP */ - -#if defined (__sh2__) && W_TYPE_SIZE == 32 -#define umul_ppmm(w1, w0, u, v) \ - __asm__ ("dmulu.l %2,%3\n\tsts macl,%1\n\tsts mach,%0" \ - : "=r" (w1), "=r" (w0) : "r" (u), "r" (v) : "macl", "mach") -#define UMUL_TIME 5 -#endif - -#if defined (__sparc__) && W_TYPE_SIZE == 32 -#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ - __asm__ ("addcc %r4,%5,%1\n\taddx %r2,%3,%0" \ - : "=r" (sh), "=&r" (sl) \ - : "%rJ" (ah), "rI" (bh),"%rJ" (al), "rI" (bl) \ - __CLOBBER_CC) -#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ - __asm__ ("subcc %r4,%5,%1\n\tsubx %r2,%3,%0" \ - : "=r" (sh), "=&r" (sl) \ - : "rJ" (ah), "rI" (bh), "rJ" (al), "rI" (bl) \ - __CLOBBER_CC) -#if defined (__sparc_v9__) || defined (__sparcv9) -/* Perhaps we should use floating-point operations here? */ -#if 0 -/* Triggers a bug making mpz/tests/t-gcd.c fail. - Perhaps we simply need explicitly zero-extend the inputs? */ -#define umul_ppmm(w1, w0, u, v) \ - __asm__ ("mulx %2,%3,%%g1; srl %%g1,0,%1; srlx %%g1,32,%0" : \ - "=r" (w1), "=r" (w0) : "r" (u), "r" (v) : "g1") -#else -/* Use v8 umul until above bug is fixed. */ -#define umul_ppmm(w1, w0, u, v) \ - __asm__ ("umul %2,%3,%1;rd %%y,%0" : "=r" (w1), "=r" (w0) : "r" (u), "r" (v)) -#endif -/* Use a plain v8 divide for v9. */ -#define udiv_qrnnd(q, r, n1, n0, d) \ - do { \ - USItype __q; \ - __asm__ ("mov %1,%%y;nop;nop;nop;udiv %2,%3,%0" \ - : "=r" (__q) : "r" (n1), "r" (n0), "r" (d)); \ - (r) = (n0) - __q * (d); \ - (q) = __q; \ - } while (0) -#else -#if defined (__sparc_v8__) -/* Don't match immediate range because, 1) it is not often useful, - 2) the 'I' flag thinks of the range as a 13 bit signed interval, - while we want to match a 13 bit interval, sign extended to 32 bits, - but INTERPRETED AS UNSIGNED. */ -#define umul_ppmm(w1, w0, u, v) \ - __asm__ ("umul %2,%3,%1;rd %%y,%0" : "=r" (w1), "=r" (w0) : "r" (u), "r" (v)) -#define UMUL_TIME 5 -#ifndef SUPERSPARC /* SuperSPARC's udiv only handles 53 bit dividends */ -#define udiv_qrnnd(q, r, n1, n0, d) \ - do { \ - USItype __q; \ - __asm__ ("mov %1,%%y;nop;nop;nop;udiv %2,%3,%0" \ - : "=r" (__q) : "r" (n1), "r" (n0), "r" (d)); \ - (r) = (n0) - __q * (d); \ - (q) = __q; \ - } while (0) -#define UDIV_TIME 25 -#else -#define UDIV_TIME 60 /* SuperSPARC timing */ -#endif /* SUPERSPARC */ -#else /* ! __sparc_v8__ */ -#if defined (__sparclite__) -/* This has hardware multiply but not divide. It also has two additional - instructions scan (ffs from high bit) and divscc. */ -#define umul_ppmm(w1, w0, u, v) \ - __asm__ ("umul %2,%3,%1;rd %%y,%0" : "=r" (w1), "=r" (w0) : "r" (u), "r" (v)) -#define UMUL_TIME 5 -#define udiv_qrnnd(q, r, n1, n0, d) \ - __asm__ ("! Inlined udiv_qrnnd\n" \ - "wr %%g0,%2,%%y ! Not a delayed write for sparclite\n" \ - "tst %%g0\n" \ - "divscc %3,%4,%%g1\n" \ - "divscc %%g1,%4,%%g1\n" \ - "divscc %%g1,%4,%%g1\n" \ - "divscc %%g1,%4,%%g1\n" \ - "divscc %%g1,%4,%%g1\n" \ - "divscc %%g1,%4,%%g1\n" \ - "divscc %%g1,%4,%%g1\n" \ - "divscc %%g1,%4,%%g1\n" \ - "divscc %%g1,%4,%%g1\n" \ - "divscc %%g1,%4,%%g1\n" \ - "divscc %%g1,%4,%%g1\n" \ - "divscc %%g1,%4,%%g1\n" \ - "divscc %%g1,%4,%%g1\n" \ - "divscc %%g1,%4,%%g1\n" \ - "divscc %%g1,%4,%%g1\n" \ - "divscc %%g1,%4,%%g1\n" \ - "divscc %%g1,%4,%%g1\n" \ - "divscc %%g1,%4,%%g1\n" \ - "divscc %%g1,%4,%%g1\n" \ - "divscc %%g1,%4,%%g1\n" \ - "divscc %%g1,%4,%%g1\n" \ - "divscc %%g1,%4,%%g1\n" \ - "divscc %%g1,%4,%%g1\n" \ - "divscc %%g1,%4,%%g1\n" \ - "divscc %%g1,%4,%%g1\n" \ - "divscc %%g1,%4,%%g1\n" \ - "divscc %%g1,%4,%%g1\n" \ - "divscc %%g1,%4,%%g1\n" \ - "divscc %%g1,%4,%%g1\n" \ - "divscc %%g1,%4,%%g1\n" \ - "divscc %%g1,%4,%%g1\n" \ - "divscc %%g1,%4,%0\n" \ - "rd %%y,%1\n" \ - "bl,a 1f\n" \ - "add %1,%4,%1\n" \ -"1: ! End of inline udiv_qrnnd" \ - : "=r" (q), "=r" (r) : "r" (n1), "r" (n0), "rI" (d) \ - : "%g1" __AND_CLOBBER_CC) -#define UDIV_TIME 37 -#define count_leading_zeros(count, x) \ - __asm__ ("scan %1,0,%0" : "=r" (x) : "r" (count)) -/* Early sparclites return 63 for an argument of 0, but they warn that future - implementations might change this. Therefore, leave COUNT_LEADING_ZEROS_0 - undefined. */ -#endif /* __sparclite__ */ -#endif /* __sparc_v8__ */ -#endif /* __sparc_v9__ */ -/* Default to sparc v7 versions of umul_ppmm and udiv_qrnnd. */ -#ifndef umul_ppmm -#define umul_ppmm(w1, w0, u, v) \ - __asm__ ("! Inlined umul_ppmm\n" \ - "wr %%g0,%2,%%y ! SPARC has 0-3 delay insn after a wr\n" \ - "sra %3,31,%%g2 ! Don't move this insn\n" \ - "and %2,%%g2,%%g2 ! Don't move this insn\n" \ - "andcc %%g0,0,%%g1 ! Don't move this insn\n" \ - "mulscc %%g1,%3,%%g1\n" \ - "mulscc %%g1,%3,%%g1\n" \ - "mulscc %%g1,%3,%%g1\n" \ - "mulscc %%g1,%3,%%g1\n" \ - "mulscc %%g1,%3,%%g1\n" \ - "mulscc %%g1,%3,%%g1\n" \ - "mulscc %%g1,%3,%%g1\n" \ - "mulscc %%g1,%3,%%g1\n" \ - "mulscc %%g1,%3,%%g1\n" \ - "mulscc %%g1,%3,%%g1\n" \ - "mulscc %%g1,%3,%%g1\n" \ - "mulscc %%g1,%3,%%g1\n" \ - "mulscc %%g1,%3,%%g1\n" \ - "mulscc %%g1,%3,%%g1\n" \ - "mulscc %%g1,%3,%%g1\n" \ - "mulscc %%g1,%3,%%g1\n" \ - "mulscc %%g1,%3,%%g1\n" \ - "mulscc %%g1,%3,%%g1\n" \ - "mulscc %%g1,%3,%%g1\n" \ - "mulscc %%g1,%3,%%g1\n" \ - "mulscc %%g1,%3,%%g1\n" \ - "mulscc %%g1,%3,%%g1\n" \ - "mulscc %%g1,%3,%%g1\n" \ - "mulscc %%g1,%3,%%g1\n" \ - "mulscc %%g1,%3,%%g1\n" \ - "mulscc %%g1,%3,%%g1\n" \ - "mulscc %%g1,%3,%%g1\n" \ - "mulscc %%g1,%3,%%g1\n" \ - "mulscc %%g1,%3,%%g1\n" \ - "mulscc %%g1,%3,%%g1\n" \ - "mulscc %%g1,%3,%%g1\n" \ - "mulscc %%g1,%3,%%g1\n" \ - "mulscc %%g1,0,%%g1\n" \ - "add %%g1,%%g2,%0\n" \ - "rd %%y,%1" \ - : "=r" (w1), "=r" (w0) : "%rI" (u), "r" (v) \ - : "%g1", "%g2" __AND_CLOBBER_CC) -#define UMUL_TIME 39 /* 39 instructions */ -#endif -#ifndef udiv_qrnnd -#ifndef LONGLONG_STANDALONE -#define udiv_qrnnd(q, r, n1, n0, d) \ - do { USItype __r; \ - (q) = __MPN(udiv_qrnnd) (&__r, (n1), (n0), (d)); \ - (r) = __r; \ - } while (0) -extern USItype __MPN(udiv_qrnnd) _PROTO ((USItype *, USItype, USItype, USItype)); -#ifndef UDIV_TIME -#define UDIV_TIME 140 -#endif -#endif /* LONGLONG_STANDALONE */ -#endif /* udiv_qrnnd */ -#endif /* __sparc__ */ - -#if defined (__vax__) && W_TYPE_SIZE == 32 -#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ - __asm__ ("addl2 %5,%1\n\tadwc %3,%0" \ - : "=g" ((USItype)(sh)), "=&g" ((USItype)(sl)) \ - : "%0" ((USItype)(ah)), "g" ((USItype)(bh)), \ - "%1" ((USItype)(al)), "g" ((USItype)(bl))) -#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ - __asm__ ("subl2 %5,%1\n\tsbwc %3,%0" \ - : "=g" ((USItype)(sh)), "=&g" ((USItype)(sl)) \ - : "0" ((USItype)(ah)), "g" ((USItype)(bh)), \ - "1" ((USItype)(al)), "g" ((USItype)(bl))) -#define smul_ppmm(xh, xl, m0, m1) \ - do { \ - union {UDItype __ll; \ - struct {USItype __l, __h;} __i; \ - } __x; \ - USItype __m0 = (m0), __m1 = (m1); \ - __asm__ ("emul %1,%2,$0,%0" \ - : "=g" (__x.__ll) : "g" (__m0), "g" (__m1)); \ - (xh) = __x.__i.__h; (xl) = __x.__i.__l; \ - } while (0) -#define sdiv_qrnnd(q, r, n1, n0, d) \ - do { \ - union {DItype __ll; \ - struct {SItype __l, __h;} __i; \ - } __x; \ - __x.__i.__h = n1; __x.__i.__l = n0; \ - __asm__ ("ediv %3,%2,%0,%1" \ - : "=g" (q), "=g" (r) : "g" (__x.__ll), "g" (d)); \ - } while (0) -#endif /* __vax__ */ - -#if defined (__z8000__) && W_TYPE_SIZE == 16 -#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ - __asm__ ("add %H1,%H5\n\tadc %H0,%H3" \ - : "=r" ((unsigned int)(sh)), "=&r" ((unsigned int)(sl)) \ - : "%0" ((unsigned int)(ah)), "r" ((unsigned int)(bh)), \ - "%1" ((unsigned int)(al)), "rQR" ((unsigned int)(bl))) -#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ - __asm__ ("sub %H1,%H5\n\tsbc %H0,%H3" \ - : "=r" ((unsigned int)(sh)), "=&r" ((unsigned int)(sl)) \ - : "0" ((unsigned int)(ah)), "r" ((unsigned int)(bh)), \ - "1" ((unsigned int)(al)), "rQR" ((unsigned int)(bl))) -#define umul_ppmm(xh, xl, m0, m1) \ - do { \ - union {long int __ll; \ - struct {unsigned int __h, __l;} __i; \ - } __x; \ - unsigned int __m0 = (m0), __m1 = (m1); \ - __asm__ ("mult %S0,%H3" \ - : "=r" (__x.__i.__h), "=r" (__x.__i.__l) \ - : "%1" (m0), "rQR" (m1)); \ - (xh) = __x.__i.__h; (xl) = __x.__i.__l; \ - (xh) += ((((signed int) __m0 >> 15) & __m1) \ - + (((signed int) __m1 >> 15) & __m0)); \ - } while (0) -#endif /* __z8000__ */ - -#endif /* __GNUC__ */ - - -#if !defined (umul_ppmm) && defined (__umulsidi3) -#define umul_ppmm(ph, pl, m0, m1) \ - { \ - UDWtype __ll = __umulsidi3 (m0, m1); \ - ph = (UWtype) (__ll >> W_TYPE_SIZE); \ - pl = (UWtype) __ll; \ - } -#endif - -#if !defined (__umulsidi3) -#define __umulsidi3(u, v) \ - ({UWtype __hi, __lo; \ - umul_ppmm (__hi, __lo, u, v); \ - ((UDWtype) __hi << W_TYPE_SIZE) | __lo; }) -#endif - - -/* Note the prototypes are under !define(umul_ppmm) etc too, since the HPPA - versions above are different and we don't want to conflict. */ - -#if ! defined (umul_ppmm) && HAVE_NATIVE_mpn_umul_ppmm -#define mpn_umul_ppmm __MPN(umul_ppmm) -extern mp_limb_t mpn_umul_ppmm _PROTO ((mp_limb_t *, mp_limb_t, mp_limb_t)); -#define umul_ppmm(wh, wl, u, v) \ - do { \ - mp_limb_t __umul_ppmm__p0; \ - (wh) = __MPN(umul_ppmm) (&__umul_ppmm__p0, \ - (mp_limb_t) (u), (mp_limb_t) (v)); \ - (wl) = __umul_ppmm__p0; \ - } while (0) -#endif - -#if ! defined (udiv_qrnnd) && HAVE_NATIVE_mpn_udiv_qrnnd -#define mpn_udiv_qrnnd __MPN(udiv_qrnnd) -extern mp_limb_t mpn_udiv_qrnnd _PROTO ((mp_limb_t *, - mp_limb_t, mp_limb_t, mp_limb_t)); -#define udiv_qrnnd(q, r, n1, n0, d) \ - do { \ - mp_limb_t __udiv_qrnnd__r; \ - (q) = mpn_udiv_qrnnd (&__udiv_qrnnd__r, \ - (mp_limb_t) (n1), (mp_limb_t) (n0), (mp_limb_t) d); \ - (r) = __udiv_qrnnd__r; \ - } while (0) -#endif - - -/* If this machine has no inline assembler, use C macros. */ - -#if !defined (add_ssaaaa) -#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ - do { \ - UWtype __x; \ - __x = (al) + (bl); \ - (sh) = (ah) + (bh) + (__x < (al)); \ - (sl) = __x; \ - } while (0) -#endif - -#if !defined (sub_ddmmss) -#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ - do { \ - UWtype __x; \ - __x = (al) - (bl); \ - (sh) = (ah) - (bh) - (__x > (al)); \ - (sl) = __x; \ - } while (0) -#endif - -/* If we lack umul_ppmm but have smul_ppmm, define umul_ppmm in terms of - smul_ppmm. */ -#if !defined (umul_ppmm) && defined (smul_ppmm) -#define umul_ppmm(w1, w0, u, v) \ - do { \ - UWtype __w1; \ - UWtype __xm0 = (u), __xm1 = (v); \ - smul_ppmm (__w1, w0, __xm0, __xm1); \ - (w1) = __w1 + (-(__xm0 >> (W_TYPE_SIZE - 1)) & __xm1) \ - + (-(__xm1 >> (W_TYPE_SIZE - 1)) & __xm0); \ - } while (0) -#endif - -/* If we still don't have umul_ppmm, define it using plain C. */ -#if !defined (umul_ppmm) -#define umul_ppmm(w1, w0, u, v) \ - do { \ - UWtype __x0, __x1, __x2, __x3; \ - UHWtype __ul, __vl, __uh, __vh; \ - UWtype __u = (u), __v = (v); \ - \ - __ul = __ll_lowpart (__u); \ - __uh = __ll_highpart (__u); \ - __vl = __ll_lowpart (__v); \ - __vh = __ll_highpart (__v); \ - \ - __x0 = (UWtype) __ul * __vl; \ - __x1 = (UWtype) __ul * __vh; \ - __x2 = (UWtype) __uh * __vl; \ - __x3 = (UWtype) __uh * __vh; \ - \ - __x1 += __ll_highpart (__x0);/* this can't give carry */ \ - __x1 += __x2; /* but this indeed can */ \ - if (__x1 < __x2) /* did we get it? */ \ - __x3 += __ll_B; /* yes, add it in the proper pos. */ \ - \ - (w1) = __x3 + __ll_highpart (__x1); \ - (w0) = (__x1 << W_TYPE_SIZE/2) + __ll_lowpart (__x0); \ - } while (0) -#endif - -/* If we don't have smul_ppmm, define it using umul_ppmm (which surely will - exist in one form or another. */ -#if !defined (smul_ppmm) -#define smul_ppmm(w1, w0, u, v) \ - do { \ - UWtype __w1; \ - UWtype __xm0 = (u), __xm1 = (v); \ - umul_ppmm (__w1, w0, __xm0, __xm1); \ - (w1) = __w1 - (-(__xm0 >> (W_TYPE_SIZE - 1)) & __xm1) \ - - (-(__xm1 >> (W_TYPE_SIZE - 1)) & __xm0); \ - } while (0) -#endif - -/* Define this unconditionally, so it can be used for debugging. */ -#define __udiv_qrnnd_c(q, r, n1, n0, d) \ - do { \ - UWtype __d1, __d0, __q1, __q0, __r1, __r0, __m; \ - __d1 = __ll_highpart (d); \ - __d0 = __ll_lowpart (d); \ - \ - __q1 = (n1) / __d1; \ - __r1 = (n1) - __q1 * __d1; \ - __m = (UWtype) __q1 * __d0; \ - __r1 = __r1 * __ll_B | __ll_highpart (n0); \ - if (__r1 < __m) \ - { \ - __q1--, __r1 += (d); \ - if (__r1 >= (d)) /* i.e. we didn't get carry when adding to __r1 */\ - if (__r1 < __m) \ - __q1--, __r1 += (d); \ - } \ - __r1 -= __m; \ - \ - __q0 = __r1 / __d1; \ - __r0 = __r1 - __q0 * __d1; \ - __m = (UWtype) __q0 * __d0; \ - __r0 = __r0 * __ll_B | __ll_lowpart (n0); \ - if (__r0 < __m) \ - { \ - __q0--, __r0 += (d); \ - if (__r0 >= (d)) \ - if (__r0 < __m) \ - __q0--, __r0 += (d); \ - } \ - __r0 -= __m; \ - \ - (q) = (UWtype) __q1 * __ll_B | __q0; \ - (r) = __r0; \ - } while (0) - -/* If the processor has no udiv_qrnnd but sdiv_qrnnd, go through - __udiv_w_sdiv (defined in libgcc or elsewhere). */ -#if !defined (udiv_qrnnd) && defined (sdiv_qrnnd) -#define udiv_qrnnd(q, r, nh, nl, d) \ - do { \ - UWtype __r; \ - (q) = __MPN(udiv_w_sdiv) (&__r, nh, nl, d); \ - (r) = __r; \ - } while (0) -#endif - -/* If udiv_qrnnd was not defined for this processor, use __udiv_qrnnd_c. */ -#if !defined (udiv_qrnnd) -#define UDIV_NEEDS_NORMALIZATION 1 -#define udiv_qrnnd __udiv_qrnnd_c -#endif - -#if !defined (count_leading_zeros) -extern -#if __STDC__ -const -#endif -unsigned char __clz_tab[]; -#define count_leading_zeros(count, x) \ - do { \ - UWtype __xr = (x); \ - UWtype __a; \ - \ - if (W_TYPE_SIZE <= 32) \ - { \ - __a = __xr < ((UWtype) 1 << 2*__BITS4) \ - ? (__xr < ((UWtype) 1 << __BITS4) ? 0 : __BITS4) \ - : (__xr < ((UWtype) 1 << 3*__BITS4) ? 2*__BITS4 : 3*__BITS4);\ - } \ - else \ - { \ - for (__a = W_TYPE_SIZE - 8; __a > 0; __a -= 8) \ - if (((__xr >> __a) & 0xff) != 0) \ - break; \ - } \ - \ - (count) = W_TYPE_SIZE - (__clz_tab[__xr >> __a] + __a); \ - } while (0) -/* This version gives a well-defined value for zero. */ -#define COUNT_LEADING_ZEROS_0 W_TYPE_SIZE -#define COUNT_LEADING_ZEROS_NEED_CLZ_TAB -#endif - -#if !defined (count_trailing_zeros) -/* Define count_trailing_zeros using count_leading_zeros. The latter might be - defined in asm, but if it is not, the C version above is good enough. */ -#define count_trailing_zeros(count, x) \ - do { \ - UWtype __ctz_x = (x); \ - UWtype __ctz_c; \ - count_leading_zeros (__ctz_c, __ctz_x & -__ctz_x); \ - (count) = W_TYPE_SIZE - 1 - __ctz_c; \ - } while (0) -#endif - -#ifndef UDIV_NEEDS_NORMALIZATION -#define UDIV_NEEDS_NORMALIZATION 0 -#endif - -/* Give defaults for UMUL_TIME and UDIV_TIME. */ -#ifndef UMUL_TIME -#define UMUL_TIME 1 -#endif - -#ifndef UDIV_TIME -#define UDIV_TIME UMUL_TIME -#endif - -/* count_trailing_zeros is often on the slow side, so make that the default */ -#ifndef COUNT_TRAILING_ZEROS_TIME -#define COUNT_TRAILING_ZEROS_TIME 15 /* cycles */ -#endif - - diff --git a/rts/gmp/ltconfig b/rts/gmp/ltconfig deleted file mode 100644 index 6d8cf33..0000000 --- a/rts/gmp/ltconfig +++ /dev/null @@ -1,3109 +0,0 @@ -#! /bin/sh - -# ltconfig - Create a system-specific libtool. -# Copyright (C) 1996-2000 Free Software Foundation, Inc. -# Originally by Gordon Matzigkeit , 1996 -# -# This file is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# A lot of this script is taken from autoconf-2.10. - -# Check that we are running under the correct shell. -SHELL=${CONFIG_SHELL-/bin/sh} -echo=echo -if test "X$1" = X--no-reexec; then - # Discard the --no-reexec flag, and continue. - shift -elif test "X$1" = X--fallback-echo; then - # Avoid inline document here, it may be left over - : -elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then - # Yippee, $echo works! - : -else - # Restart under the correct shell. - exec "$SHELL" "$0" --no-reexec ${1+"$@"} -fi - -if test "X$1" = X--fallback-echo; then - # used as fallback echo - shift - cat </dev/null`} - case X$UNAME in - *-DOS) PATH_SEPARATOR=';' ;; - *) PATH_SEPARATOR=':' ;; - esac -fi - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -if test "X${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi - -if test "X${echo_test_string+set}" != Xset; then - # find a string as large as possible, as long as the shell can cope with it - for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do - # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... - if (echo_test_string="`eval $cmd`") 2>/dev/null && - echo_test_string="`eval $cmd`" && - (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null; then - break - fi - done -fi - -if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && - echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - : -else - # The Solaris, AIX, and Digital Unix default echo programs unquote - # backslashes. This makes it impossible to quote backslashes using - # echo "$something" | sed 's/\\/\\\\/g' - # - # So, first we look for a working echo in the user's PATH. - - IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" - for dir in $PATH /usr/ucb; do - if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && - test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && - echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - echo="$dir/echo" - break - fi - done - IFS="$save_ifs" - - if test "X$echo" = Xecho; then - # We didn't find a better echo, so look for alternatives. - if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && - echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - # This shell has a builtin print -r that does the trick. - echo='print -r' - elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && - test "X$CONFIG_SHELL" != X/bin/ksh; then - # If we have ksh, try running ltconfig again with it. - ORIGINAL_CONFIG_SHELL="${CONFIG_SHELL-/bin/sh}" - export ORIGINAL_CONFIG_SHELL - CONFIG_SHELL=/bin/ksh - export CONFIG_SHELL - exec "$CONFIG_SHELL" "$0" --no-reexec ${1+"$@"} - else - # Try using printf. - echo='printf "%s\n"' - if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && - echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - # Cool, printf works - : - elif echo_testing_string=`("$ORIGINAL_CONFIG_SHELL" "$0" --fallback-echo '\t') 2>/dev/null` && - test "X$echo_testing_string" = 'X\t' && - echo_testing_string=`("$ORIGINAL_CONFIG_SHELL" "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - CONFIG_SHELL="$ORIGINAL_CONFIG_SHELL" - export CONFIG_SHELL - SHELL="$CONFIG_SHELL" - export SHELL - echo="$CONFIG_SHELL $0 --fallback-echo" - elif echo_testing_string=`("$CONFIG_SHELL" "$0" --fallback-echo '\t') 2>/dev/null` && - test "X$echo_testing_string" = 'X\t' && - echo_testing_string=`("$CONFIG_SHELL" "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - echo="$CONFIG_SHELL $0 --fallback-echo" - else - # maybe with a smaller string... - prev=: - - for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do - if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null; then - break - fi - prev="$cmd" - done - - if test "$prev" != 'sed 50q "$0"'; then - echo_test_string=`eval $prev` - export echo_test_string - exec "${ORIGINAL_CONFIG_SHELL}" "$0" ${1+"$@"} - else - # Oops. We lost completely, so just stick with echo. - echo=echo - fi - fi - fi - fi -fi - -# Sed substitution that helps us do robust quoting. It backslashifies -# metacharacters that are still active within double-quoted strings. -Xsed='sed -e s/^X//' -sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g' - -# Same as above, but do not quote variable references. -double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g' - -# Sed substitution to delay expansion of an escaped shell variable in a -# double_quote_subst'ed string. -delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' - -# The name of this program. -progname=`$echo "X$0" | $Xsed -e 's%^.*/%%'` - -# Constants: -PROGRAM=ltconfig -PACKAGE=libtool -VERSION=1.3c -TIMESTAMP=" (1.696 2000/03/14 20:22:42)" -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -rm="rm -f" - -help="Try \`$progname --help' for more information." - -# Global variables: -default_ofile=libtool -can_build_shared=yes -enable_shared=yes -# All known linkers require a `.a' archive for static linking (except M$VC, -# which needs '.lib'). -enable_static=yes -enable_fast_install=yes -enable_dlopen=unknown -enable_win32_dll=no -pic_mode=default -ltmain= -silent= -srcdir= -ac_config_guess= -ac_config_sub= -host= -build=NONE -nonopt=NONE -ofile="$default_ofile" -verify_host=yes -with_gcc=no -with_gnu_ld=no -need_locks=yes -ac_ext=c -libext=a -cache_file= - -old_AR="$AR" -old_CC="$CC" -old_CFLAGS="$CFLAGS" -old_CPPFLAGS="$CPPFLAGS" -old_LDFLAGS="$LDFLAGS" -old_LIBS="$LIBS" -old_MAGIC="$MAGIC" -old_LD="$LD" -old_LN_S="$LN_S" -old_NM="$NM" -old_RANLIB="$RANLIB" -old_STRIP="$STRIP" -old_AS="$AS" -old_DLLTOOL="$DLLTOOL" -old_OBJDUMP="$OBJDUMP" -old_OBJEXT="$OBJEXT" -old_EXEEXT="$EXEEXT" -old_reload_Flag="$reload_flag" -old_deplibs_check_method="$deplibs_check_method" -old_file_magic_cmd="$file_magic_cmd" - -# Parse the command line options. -args= -prev= -for option -do - case "$option" in - -*=*) optarg=`echo "$option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; - *) optarg= ;; - esac - - # If the previous option needs an argument, assign it. - if test -n "$prev"; then - eval "$prev=\$option" - prev= - continue - fi - - case "$option" in - --help) cat <&2 - echo "$help" 1>&2 - exit 1 - ;; - - *) - if test -z "$ltmain"; then - ltmain="$option" - elif test -z "$host"; then -# This generates an unnecessary warning for sparc-sun-solaris4.1.3_U1 -# if test -n "`echo $option| sed 's/[-a-z0-9.]//g'`"; then -# echo "$progname: warning \`$option' is not a valid host type" 1>&2 -# fi - host="$option" - else - echo "$progname: too many arguments" 1>&2 - echo "$help" 1>&2 - exit 1 - fi ;; - esac -done - -if test -z "$ltmain"; then - echo "$progname: you must specify a LTMAIN file" 1>&2 - echo "$help" 1>&2 - exit 1 -fi - -if test ! -f "$ltmain"; then - echo "$progname: \`$ltmain' does not exist" 1>&2 - echo "$help" 1>&2 - exit 1 -fi - -# Quote any args containing shell metacharacters. -ltconfig_args= -for arg -do - case "$arg" in - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) - ltconfig_args="$ltconfig_args '$arg'" ;; - *) ltconfig_args="$ltconfig_args $arg" ;; - esac -done - -# A relevant subset of AC_INIT. - -# File descriptor usage: -# 0 standard input -# 1 file creation -# 2 errors and warnings -# 3 some systems may open it to /dev/tty -# 4 used on the Kubota Titan -# 5 compiler messages saved in config.log -# 6 checking for... messages and results -if test "$silent" = yes; then - exec 6>/dev/null -else - exec 6>&1 -fi -exec 5>>./config.log - -# NLS nuisances. -# Only set LANG and LC_ALL to C if already set. -# These must not be set unconditionally because not all systems understand -# e.g. LANG=C (notably SCO). -if test "X${LC_ALL+set}" = Xset; then LC_ALL=C; export LC_ALL; fi -if test "X${LANG+set}" = Xset; then LANG=C; export LANG; fi - -if test -n "$cache_file" && test -r "$cache_file"; then - echo "loading cache $cache_file within ltconfig" - . $cache_file -fi - -if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then - # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. - if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then - ac_n= ac_c=' -' ac_t=' ' - else - ac_n=-n ac_c= ac_t= - fi -else - ac_n= ac_c='\c' ac_t= -fi - -if test -z "$srcdir"; then - # Assume the source directory is the same one as the path to LTMAIN. - srcdir=`$echo "X$ltmain" | $Xsed -e 's%/[^/]*$%%'` - test "$srcdir" = "$ltmain" && srcdir=. -fi - -trap "$rm conftest*; exit 1" 1 2 15 -if test "$verify_host" = yes; then - # Check for config.guess and config.sub. - ac_aux_dir= - for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do - if test -f $ac_dir/config.guess; then - ac_aux_dir=$ac_dir - break - fi - done - if test -z "$ac_aux_dir"; then - echo "$progname: cannot find config.guess in $srcdir $srcdir/.. $srcdir/../.." 1>&2 - echo "$help" 1>&2 - exit 1 - fi - ac_config_guess=$ac_aux_dir/config.guess - ac_config_sub=$ac_aux_dir/config.sub - - # Make sure we can run config.sub. - if $SHELL $ac_config_sub sun4 >/dev/null 2>&1; then : - else - echo "$progname: cannot run $ac_config_sub" 1>&2 - echo "$help" 1>&2 - exit 1 - fi - - echo $ac_n "checking host system type""... $ac_c" 1>&6 - - host_alias=$host - case "$host_alias" in - "") - if host_alias=`$SHELL $ac_config_guess`; then : - else - echo "$progname: cannot guess host type; you must specify one" 1>&2 - echo "$help" 1>&2 - exit 1 - fi ;; - esac - host=`$SHELL $ac_config_sub $host_alias` - echo "$ac_t$host" 1>&6 - - # Make sure the host verified. - test -z "$host" && exit 1 - - # Check for the build system type - echo $ac_n "checking build system type... $ac_c" 1>&6 - - build_alias=$build - case "$build_alias" in - NONE) - case $nonopt in - NONE) build_alias=$host_alias ;; - *) build_alias=$nonopt ;; - esac ;; - esac - - build=`$SHELL $ac_config_sub $build_alias` - build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` - build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` - build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` - echo "$ac_t""$build" 1>&6 - -elif test -z "$host"; then - echo "$progname: you must specify a host type if you use \`--no-verify'" 1>&2 - echo "$help" 1>&2 - exit 1 -else - host_alias=$host - build_alias=$host_alias - build=$host -fi - -if test x"$host" != x"$build"; then - ac_tool_prefix=${host_alias}- -else - ac_tool_prefix= -fi - -host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` -host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` -host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` - -# Transform linux* to *-*-linux-gnu*, to support old configure scripts. -case "$host_os" in -linux-gnu*) ;; -linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` -esac - -case "$host_os" in -aix3*) - # AIX sometimes has problems with the GCC collect2 program. For some - # reason, if we set the COLLECT_NAMES environment variable, the problems - # vanish in a puff of smoke. - if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES - fi - ;; -esac - -# Determine commands to create old-style static archives. -old_archive_cmds='$AR cru $oldlib$oldobjs$old_deplibs' -old_postinstall_cmds='chmod 644 $oldlib' -old_postuninstall_cmds= - -# Set sane defaults for various variables -test -z "$AR" && AR=ar -test -z "$AS" && AS=as -test -z "$CC" && CC=cc -test -z "$DLLTOOL" && DLLTOOL=dlltool -test -z "$MAGIC" && MAGIC=file -test -z "$LD" && LD=ld -test -z "$LN_S" && LN_S="ln -s" -test -z "$NM" && NM=nm -test -z "$OBJDUMP" && OBJDUMP=objdump -test -z "$RANLIB" && RANLIB=: -test -z "$STRIP" && STRIP=: -test -z "$objext" && objext=o - -echo $ac_n "checking for objdir... $ac_c" 1>&6 -rm -f .libs 2>/dev/null -mkdir .libs 2>/dev/null -if test -d .libs; then - objdir=.libs -else - # MS-DOS does not allow filenames that begin with a dot. - objdir=_libs -fi -rmdir .libs 2>/dev/null -echo "$ac_t$objdir" 1>&6 - -# Allow CC to be a program name with arguments. -set dummy $CC -compiler="$2" - -# We assume here that the value for ac_cv_prog_cc_pic will not be cached -# in isolation, and that seeing it set (from the cache) indicates that -# the associated values are set (in the cache) correctly too. -echo $ac_n "checking for $compiler option to produce PIC... $ac_c" 1>&6 -echo "$progname:563:checking for $compiler option to produce PIC" 1>&5 -if test "X${ac_cv_prog_cc_pic+set}" = Xset; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_cv_prog_cc_pic= - ac_cv_prog_cc_shlib= - ac_cv_prog_cc_wl= - ac_cv_prog_cc_static= - ac_cv_prog_cc_no_builtin= - ac_cv_prog_cc_can_build_shared=$can_build_shared - - if test "$with_gcc" = yes; then - ac_cv_prog_cc_wl='-Wl,' - ac_cv_prog_cc_static='-static' - - case "$host_os" in - beos* | irix5* | irix6* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - aix*) - # Below there is a dirty hack to force normal static linking with -ldl - # The problem is because libdl dynamically linked with both libc and - # libC (AIX C++ library), which obviously doesn't included in libraries - # list by gcc. This cause undefined symbols with -static flags. - # This hack allows C programs to be linked with "-static -ldl", but - # we not sure about C++ programs. - ac_cv_prog_cc_static="$ac_cv_prog_cc_static ${ac_cv_prog_cc_wl}-lC" - ;; - cygwin* | mingw* | os2*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - ac_cv_prog_cc_pic='-DDLL_EXPORT' - ;; - amigaos*) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - ac_cv_prog_cc_pic='-m68020 -resident32 -malways-restore-a4' - ;; - sysv4*MP*) - if test -d /usr/nec; then - ac_cv_prog_cc_pic=-Kconform_pic - fi - ;; - *) - ac_cv_prog_cc_pic='-fPIC' - ;; - esac - else - # PORTME Check for PIC flags for the system compiler. - case "$host_os" in - aix3* | aix4*) - # All AIX code is PIC. - ac_cv_prog_cc_static='-bnso -bI:/lib/syscalls.exp' - ;; - - hpux9* | hpux10* | hpux11*) - # Is there a better ac_cv_prog_cc_static that works with the bundled CC? - ac_cv_prog_cc_wl='-Wl,' - ac_cv_prog_cc_static="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" - ac_cv_prog_cc_pic='+Z' - ;; - - irix5* | irix6*) - ac_cv_prog_cc_wl='-Wl,' - ac_cv_prog_cc_static='-non_shared' - # PIC (with -KPIC) is the default. - ;; - - cygwin* | mingw* | os2*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - ac_cv_prog_cc_pic='-DDLL_EXPORT' - ;; - - osf3* | osf4* | osf5*) - # All OSF/1 code is PIC. - ac_cv_prog_cc_wl='-Wl,' - ac_cv_prog_cc_static='-non_shared' - ;; - - sco3.2v5*) - ac_cv_prog_cc_pic='-Kpic' - ac_cv_prog_cc_static='-dn' - ac_cv_prog_cc_shlib='-belf' - ;; - - solaris*) - ac_cv_prog_cc_pic='-KPIC' - ac_cv_prog_cc_static='-Bstatic' - ac_cv_prog_cc_wl='-Wl,' - ;; - - sunos4*) - ac_cv_prog_cc_pic='-PIC' - ac_cv_prog_cc_static='-Bstatic' - ac_cv_prog_cc_wl='-Qoption ld ' - ;; - - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - ac_cv_prog_cc_pic='-KPIC' - ac_cv_prog_cc_static='-Bstatic' - ac_cv_prog_cc_wl='-Wl,' - ;; - - uts4*) - ac_cv_prog_cc_pic='-pic' - ac_cv_prog_cc_static='-Bstatic' - ;; - - sysv4*MP*) - if test -d /usr/nec ;then - ac_cv_prog_cc_pic='-Kconform_pic' - ac_cv_prog_cc_static='-Bstatic' - fi - ;; - - *) - ac_cv_prog_cc_can_build_shared=no - ;; - esac - fi -fi -if test -z "$ac_cv_prog_cc_pic"; then - echo "$ac_t"none 1>&6 -else - echo "$ac_t""$ac_cv_prog_cc_pic" 1>&6 - - # Check to make sure the pic_flag actually works. - echo $ac_n "checking if $compiler PIC flag $ac_cv_prog_cc_pic works... $ac_c" 1>&6 - echo "$progname:693:checking that $compiler PIC flag $ac_cv_prog_cc_pic works." 1>&5 - if test "X${ac_cv_prog_cc_pic_works+set}" = Xset; then - echo $ac_n "(cached) $ac_c" 1>&6 - else - ac_cv_prog_cc_pic_works=yes - $rm conftest* - echo "int some_variable = 0;" > conftest.c - save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $ac_cv_prog_cc_pic -DPIC" - if { (eval echo $progname:702: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.$objext; then - # Append any warnings to the config.log. - cat conftest.err 1>&5 - - case "$host_os" in - hpux9* | hpux10* | hpux11*) - # On HP-UX, both CC and GCC only warn that PIC is supported... then - # they create non-PIC objects. So, if there were any warnings, we - # assume that PIC is not supported. - if test -s conftest.err; then - ac_cv_prog_cc_pic_works=no - ac_cv_prog_cc_can_build_shared=no - ac_cv_prog_cc_pic= - else - ac_cv_prog_cc_pic_works=yes - ac_cv_prog_cc_pic=" $ac_cv_prog_cc_pic" - fi - ;; - *) - ac_cv_prog_cc_pic_works=yes - ac_cv_prog_cc_pic=" $ac_cv_prog_cc_pic" - ;; - esac - else - # Append any errors to the config.log. - cat conftest.err 1>&5 - ac_cv_prog_cc_pic_works=no - ac_cv_prog_cc_can_build_shared=no - ac_cv_prog_cc_pic= - fi - CFLAGS="$save_CFLAGS" - $rm conftest* - fi - # Belt *and* braces to stop my trousers falling down: - if test "X$ac_cv_prog_cc_pic_works" = Xno; then - ac_cv_prog_cc_pic= - ac_cv_prog_cc_can_build_shared=no - fi - echo "$ac_t""$ac_cv_prog_cc_pic_works" 1>&6 -fi - -# Check for any special shared library compilation flags. -if test -n "$ac_cv_prog_cc_shlib"; then - echo "$progname: warning: \`$CC' requires \`$ac_cv_prog_cc_shlib' to build shared libraries" 1>&2 - if echo "$old_CC $old_CFLAGS " | egrep -e "[ ]$ac_cv_prog_cc_shlib[ ]" >/dev/null; then : - else - echo "$progname: add \`$ac_cv_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" 1>&2 - ac_cv_prog_cc_can_build_shared=no - fi -fi - -echo $ac_n "checking if $compiler static flag $ac_cv_prog_cc_static works... $ac_c" 1>&6 -echo "$progname:754: checking if $compiler static flag $ac_cv_prog_cc_static works" >&5 -if test "X${ac_cv_prog_cc_static_works+set}" = Xset; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - $rm conftest* - echo 'main(){return(0);}' > conftest.c - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $ac_cv_prog_cc_static" - if { (eval echo $progname:762: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then - ac_cv_prog_cc_static_works=yes - else - ac_cv_prog_cc_static_works=no - ac_cv_prog_cc_static= - fi - LDFLAGS="$save_LDFLAGS" - $rm conftest* -fi -# Belt *and* braces to stop my trousers falling down: -if test "X$ac_cv_prog_cc_static_works" = Xno; then - ac_cv_prog_cc_static= -fi -echo "$ac_t""$ac_cv_prog_cc_static_works" 1>&6 -pic_flag="$ac_cv_prog_cc_pic" -special_shlib_compile_flags="$ac_cv_prog_cc_shlib" -wl="$ac_cv_prog_cc_wl" -link_static_flag="$ac_cv_prog_cc_static" -no_builtin_flag="$ac_cv_prog_cc_no_builtin" -can_build_shared="$ac_cv_prog_cc_can_build_shared" - -# Check to see if options -o and -c are simultaneously supported by compiler -echo $ac_n "checking if $compiler supports -c -o file.o... $ac_c" 1>&6 -$rm -r conftest 2>/dev/null -mkdir conftest -cd conftest -$rm conftest* -echo "int some_variable = 0;" > conftest.c -mkdir out -# According to Tom Tromey, Ian Lance Taylor reported there are C compilers -# that will create temporary files in the current directory regardless of -# the output directory. Thus, making CWD read-only will cause this test -# to fail, enabling locking or at least warning the user not to do parallel -# builds. -chmod -w . -save_CFLAGS="$CFLAGS" -CFLAGS="$CFLAGS -o out/conftest2.o" -echo "$progname:799: checking if $compiler supports -c -o file.o" >&5 -if { (eval echo $progname:800: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.o; then - - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s out/conftest.err; then - echo "$ac_t"no 1>&6 - compiler_c_o=no - else - echo "$ac_t"yes 1>&6 - compiler_c_o=yes - fi -else - # Append any errors to the config.log. - cat out/conftest.err 1>&5 - compiler_c_o=no - echo "$ac_t"no 1>&6 -fi -CFLAGS="$save_CFLAGS" -chmod u+w . -$rm conftest* out/* -rmdir out -cd .. -rmdir conftest -$rm -r conftest 2>/dev/null - -if test x"$compiler_c_o" = x"yes"; then - # Check to see if we can write to a .lo - echo $ac_n "checking if $compiler supports -c -o file.lo... $ac_c" 1>&6 - $rm conftest* - echo "int some_variable = 0;" > conftest.c - save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -c -o conftest.lo" - echo "$progname:832: checking if $compiler supports -c -o file.lo" >&5 -if { (eval echo $progname:833: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.lo; then - - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - echo "$ac_t"no 1>&6 - compiler_o_lo=no - else - echo "$ac_t"yes 1>&6 - compiler_o_lo=yes - fi - else - # Append any errors to the config.log. - cat conftest.err 1>&5 - compiler_o_lo=no - echo "$ac_t"no 1>&6 - fi - CFLAGS="$save_CFLAGS" - $rm conftest* -else - compiler_o_lo=no -fi - -# Check to see if we can do hard links to lock some files if needed -hard_links="nottested" -if test "$compiler_c_o" = no && test "$need_locks" != no; then - # do not overwrite the value of need_locks provided by the user - echo $ac_n "checking if we can lock with hard links... $ac_c" 1>&6 - hard_links=yes - $rm conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - echo "$ac_t$hard_links" 1>&6 - $rm conftest* - if test "$hard_links" = no; then - echo "*** WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2 - need_locks=warn - fi -else - need_locks=no -fi - -if test "$with_gcc" = yes; then - # Check to see if options -fno-rtti -fno-exceptions are supported by compiler - echo $ac_n "checking if $compiler supports -fno-rtti -fno-exceptions ... $ac_c" 1>&6 - $rm conftest* - echo "int some_variable = 0;" > conftest.c - save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -fno-rtti -fno-exceptions -c conftest.c" - echo "$progname:884: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 - if { (eval echo $progname:885: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.o; then - - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - echo "$ac_t"no 1>&6 - compiler_rtti_exceptions=no - else - echo "$ac_t"yes 1>&6 - compiler_rtti_exceptions=yes - fi - else - # Append any errors to the config.log. - cat conftest.err 1>&5 - compiler_rtti_exceptions=no - echo "$ac_t"no 1>&6 - fi - CFLAGS="$save_CFLAGS" - $rm conftest* - - if test "$compiler_rtti_exceptions" = "yes"; then - no_builtin_flag=' -fno-builtin -fno-rtti -fno-exceptions' - else - no_builtin_flag=' -fno-builtin' - fi - -fi - -# See if the linker supports building shared libraries. -echo $ac_n "checking whether the linker ($LD) supports shared libraries... $ac_c" 1>&6 - -allow_undefined_flag= -no_undefined_flag= -need_lib_prefix=unknown -need_version=unknown -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -archive_cmds= -archive_expsym_cmds= -old_archive_from_new_cmds= -old_archive_from_expsyms_cmds= -striplib= -old_striplib= -export_dynamic_flag_spec= -whole_archive_flag_spec= -thread_safe_flag_spec= -hardcode_into_libs=no -hardcode_libdir_flag_spec= -hardcode_libdir_separator= -hardcode_direct=no -hardcode_minus_L=no -hardcode_shlibpath_var=unsupported -runpath_var= -link_all_deplibs=unknown -always_export_symbols=no -export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | sed '\''s/.* //'\'' | sort | uniq > $export_symbols' -# include_expsyms should be a list of space-separated symbols to be *always* -# included in the symbol list -include_expsyms= -# exclude_expsyms can be an egrep regular expression of symbols to exclude -# it will be wrapped by ` (' and `)$', so one must not match beginning or -# end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', -# as well as any symbol that contains `d'. -exclude_expsyms="_GLOBAL_OFFSET_TABLE_" -# Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out -# platforms (ab)use it in PIC code, but their linkers get confused if -# the symbol is explicitly referenced. Since portable code cannot -# rely on this symbol name, it's probably fine to never include it in -# preloaded symbol tables. -extract_expsyms_cmds= - -case "$host_os" in -cygwin* | mingw*) - # FIXME: the MSVC++ port hasn't been tested in a loooong time - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - if test "$with_gcc" != yes; then - with_gnu_ld=no - fi - ;; - -esac - -ld_shlibs=yes -if test "$with_gnu_ld" = yes; then - # If archive_cmds runs LD, not CC, wlarc should be empty - wlarc='${wl}' - - # See if GNU ld supports shared libraries. - case "$host_os" in - aix3* | aix4*) - # On AIX, the GNU linker is very broken - ld_shlibs=no - cat <&2 - -*** Warning: the GNU linker, at least up to release 2.9.1, is reported -*** to be unable to reliably create shared libraries on AIX. -*** Therefore, libtool is disabling shared libraries support. If you -*** really care for shared libraries, you may want to modify your PATH -*** so that a non-GNU linker is found, and then restart. - -EOF - ;; - - amigaos*) - archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR cru $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - - # Samuel A. Falvo II reports - # that the semantics of dynamic libraries on AmigaOS, at least up - # to version 4, is to share data among multiple programs linked - # with the same dynamic library. Since this doesn't match the - # behavior of shared libraries on other platforms, we can use - # them. - ld_shlibs=no - ;; - - beos*) - if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then - allow_undefined_flag=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - archive_cmds='$CC -nostart $libobjs $deplibs $linker_flags ${wl}-soname $wl$soname -o $lib' - else - ld_shlibs=no - fi - ;; - - cygwin* | mingw*) - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - hardcode_libdir_flag_spec='-L$libdir' - allow_undefined_flag=unsupported - always_export_symbols=yes - - extract_expsyms_cmds='test -f $output_objdir/impgen.c || \ - sed -e "/^# \/\* impgen\.c starts here \*\//,/^# \/\* impgen.c ends here \*\// { s/^# //; p; }" -e d < $0 > $output_objdir/impgen.c~ - test -f $output_objdir/impgen.exe || (cd $output_objdir && \ - if test "x$HOST_CC" != "x" ; then $HOST_CC -o impgen impgen.c ; \ - else $CC -o impgen impgen.c ; fi)~ - $output_objdir/impgen $dir/$soname > $output_objdir/$soname-def' - - old_archive_from_expsyms_cmds='$DLLTOOL --as=$AS --dllname $soname --def $output_objdir/$soname-def --output-lib $output_objdir/$newlib' - - # cygwin and mingw dlls have different entry points and sets of symbols - # to exclude. - # FIXME: what about values for MSVC? - dll_entry=__cygwin_dll_entry@12 - dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12~ - case "$host_os" in - mingw*) - # mingw values - dll_entry=_DllMainCRTStartup@12 - dll_exclude_symbols=DllMain@12,DllMainCRTStartup@12,DllEntryPoint@12~ - ;; - esac - - # mingw and cygwin differ, and it's simplest to just exclude the union - # of the two symbol sets. - dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12,DllMainCRTStartup@12,DllEntryPoint@12 - - # recent cygwin and mingw systems supply a stub DllMain which the user - # can override, but on older systems we have to supply one (in ltdll.c) - if test "x$lt_cv_need_dllmain" = "xyes"; then - ltdll_obj='$output_objdir/$soname-ltdll.'"$objext " - ltdll_cmds='test -f $output_objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $0 > $output_objdir/$soname-ltdll.c~ - test -f $output_objdir/$soname-ltdll.$objext || (cd $output_objdir && $CC -c $soname-ltdll.c)~' - else - ltdll_obj= - ltdll_cmds= - fi - - # Extract the symbol export list from an `--export-all' def file, - # then regenerate the def file from the symbol export list, so that - # the compiled dll only exports the symbol export list. - # Be careful not to strip the DATA tag left be newer dlltools. - export_symbols_cmds="$ltdll_cmds"' - $DLLTOOL --export-all --exclude-symbols '$dll_exclude_symbols' --output-def $output_objdir/$soname-def '$ltdll_obj'$libobjs $convenience~ - sed -e "1,/EXPORTS/d" -e "s/ @ [0-9]*//" -e "s/ *;.*$//" < $output_objdir/$soname-def > $export_symbols' - - # If DATA tags from a recent dlltool are present, honour them! - archive_expsym_cmds='echo EXPORTS > $output_objdir/$soname-def~ - _lt_hint=1; - cat $export_symbols | while read symbol; do - set dummy \$symbol; - case \$# in - 2) echo " \$2 @ \$_lt_hint ; " >> $output_objdir/$soname-def;; - *) echo " \$2 @ \$_lt_hint \$3 ; " >> $output_objdir/$soname-def;; - esac; - _lt_hint=`expr 1 + \$_lt_hint`; - done~ - '"$ltdll_cmds"' - $CC -Wl,--base-file,$output_objdir/$soname-base '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $lib '$ltdll_obj'$libobjs $deplibs $compiler_flags~ - $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp~ - $CC -Wl,--base-file,$output_objdir/$soname-base $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $lib '$ltdll_obj'$libobjs $deplibs $compiler_flags~ - $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp~ - $CC $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $lib '$ltdll_obj'$libobjs $deplibs $compiler_flags' - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' - fi - ;; - - solaris* | sysv5*) - if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then - ld_shlibs=no - cat <&2 - -*** Warning: The releases 2.8.* of the GNU linker cannot reliably -*** create shared libraries on Solaris systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.9.1 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -EOF - elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $linker_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $linker_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - - sunos4*) - archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' - wlarc= - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - *) - if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - esac - - if test "$ld_shlibs" = yes; then - runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' - export_dynamic_flag_spec='${wl}--export-dynamic' - case $host_os in - cygwin* | mingw*) - # dlltool doesn't understand --whole-archive et. al. - whole_archive_flag_spec= - ;; - *) - # ancient GNU ld didn't support --whole-archive et. al. - if $LD --help 2>&1 | egrep 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - whole_archive_flag_spec= - fi - ;; - esac - fi -else - # PORTME fill in a description of your system's linker (not GNU ld) - case "$host_os" in - aix3*) - allow_undefined_flag=unsupported - always_export_symbols=yes - archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR cru $lib $output_objdir/$soname' - # Note: this linker hardcodes the directories in LIBPATH if there - # are no directories specified by -L. - hardcode_minus_L=yes - if test "$with_gcc" = yes && test -z "$link_static_flag"; then - # Neither direct hardcoding nor static linking is supported with a - # broken collect2. - hardcode_direct=unsupported - fi - ;; - - aix4*) - hardcode_libdir_flag_spec='${wl}-b ${wl}nolibpath ${wl}-b ${wl}libpath:$libdir:/usr/lib:/lib' - hardcode_libdir_separator=':' - if test "$with_gcc" = yes; then - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && \ - strings "$collect2name" | grep resolve_lib_name >/dev/null - then - # We have reworked collect2 - hardcode_direct=yes - else - # We have old collect2 - hardcode_direct=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - hardcode_minus_L=yes - hardcode_libdir_flag_spec='-L$libdir' - hardcode_libdir_separator= - fi - shared_flag='-shared' - else - shared_flag='${wl}-bM:SRE' - hardcode_direct=yes - fi - allow_undefined_flag=' ${wl}-berok' - archive_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bexpall ${wl}-bnoentry${allow_undefined_flag}' - archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}' - case "$host_os" in aix4.[01]|aix4.[01].*) - # According to Greg Wooledge, -bexpall is only supported from AIX 4.2 on - always_export_symbols=yes ;; - esac - ;; - - amigaos*) - archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR cru $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - # see comment about different semantics on the GNU ld section - ld_shlibs=no - ;; - - cygwin* | mingw*) - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - hardcode_libdir_flag_spec=' ' - allow_undefined_flag=unsupported - # Tell ltmain to make .lib files, not .a files. - libext=lib - # FIXME: Setting linknames here is a bad hack. - archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | sed -e '\''s/ -lc$//'\''` -link -dll~linknames=' - # The linker will automatically build a .lib file if we build a DLL. - old_archive_from_new_cmds='true' - # FIXME: Should let the user specify the lib program. - old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs' - fix_srcfile_path='`cygpath -w $srcfile`' - ;; - - freebsd1*) - ld_shlibs=no - ;; - - # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor - # support. Future versions do this automatically, but an explicit c++rt0.o - # does not break anything, and helps significantly (at the cost of a little - # extra space). - freebsd2.2*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - # Unfortunately, older versions of FreeBSD 2 do not have this feature. - freebsd2*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes - hardcode_minus_L=yes - hardcode_shlibpath_var=no - ;; - - # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd*) - archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - hpux9* | hpux10* | hpux11*) - case "$host_os" in - hpux9*) archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' ;; - *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ;; - esac - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_direct=yes - hardcode_minus_L=yes # Not in the search PATH, but as the default - # location of the library. - export_dynamic_flag_spec='${wl}-E' - ;; - - irix5* | irix6*) - if test "$with_gcc" = yes; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - fi - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - link_all_deplibs=yes - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out - else - archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF - fi - hardcode_libdir_flag_spec='${wl}-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - openbsd*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - os2*) - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - allow_undefined_flag=unsupported - archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' - old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' - ;; - - osf3*) - if test "$with_gcc" = yes; then - allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - fi - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - ;; - - osf4* | osf5*) # as osf3* with the addition of -msym flag - if test "$with_gcc" = yes; then - allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - fi - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - ;; - - sco3.2v5*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var=no - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - ;; - - solaris*) - no_undefined_flag=' -z text' - # $CC -shared without GNU ld will not create a library from C++ - # object files and a static libstdc++, better avoid it by now - archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_shlibpath_var=no - case "$host_os" in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) # Supported since Solaris 2.6 (maybe 2.5.1?) - whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; - esac - link_all_deplibs=yes - ;; - - sunos4*) - archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_direct=yes - hardcode_minus_L=yes - hardcode_shlibpath_var=no - ;; - - sysv4) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - runpath_var='LD_RUN_PATH' - hardcode_shlibpath_var=no - hardcode_direct=no #Motorola manual says yes, but my tests say they lie - ;; - - sysv4.3*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var=no - export_dynamic_flag_spec='-Bexport' - ;; - - sysv5*) - no_undefined_flag=' -z text' - # $CC -shared without GNU ld will not create a library from C++ - # object files and a static libstdc++, better avoid it by now - archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' - hardcode_libdir_flag_spec= - hardcode_shlibpath_var=no - runpath_var='LD_RUN_PATH' - ;; - - uts4*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_shlibpath_var=no - ;; - - dgux*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_shlibpath_var=no - ;; - - sysv4*MP*) - if test -d /usr/nec; then - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var=no - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - ld_shlibs=yes - fi - ;; - - sysv4.2uw2*) - archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes - hardcode_minus_L=no - hardcode_shlibpath_var=no - hardcode_runpath_var=yes - runpath_var=LD_RUN_PATH - ;; - - unixware7*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - runpath_var='LD_RUN_PATH' - hardcode_shlibpath_var=no - ;; - - *) - ld_shlibs=no - ;; - esac -fi -echo "$ac_t$ld_shlibs" 1>&6 -test "$ld_shlibs" = no && can_build_shared=no - -# Check hardcoding attributes. -echo $ac_n "checking how to hardcode library paths into programs... $ac_c" 1>&6 -hardcode_action= -if test -n "$hardcode_libdir_flag_spec" || \ - test -n "$runpath_var"; then - - # We can hardcode non-existant directories. - if test "$hardcode_direct" != no && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test "$hardcode_shlibpath_var" != no && - test "$hardcode_minus_L" != no; then - # Linking always hardcodes the temporary library directory. - hardcode_action=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - hardcode_action=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - hardcode_action=unsupported -fi -echo "$ac_t$hardcode_action" 1>&6 - -echo $ac_n "checking whether stripping libraries is possible... $ac_c" 1>&6 -if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then - test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" - test -z "$striplib" && striplib="$STRIP --strip-unneeded" - echo "${ac_t}yes" 1>&6 -else - echo "${ac_t}no" 1>&6 -fi - -reload_cmds='$LD$reload_flag -o $output$reload_objs' -test -z "$deplibs_check_method" && deplibs_check_method=unknown - -# PORTME Fill in your ld.so characteristics -library_names_spec= -libname_spec='lib$name' -soname_spec= -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" - -echo $ac_n "checking dynamic linker characteristics... $ac_c" 1>&6 -case "$host_os" in -aix3*) - version_type=linux - library_names_spec='${libname}${release}.so$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}.so$major' - ;; - -aix4*) - version_type=linux - # AIX has no versioning support, so currently we can not hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - # We preserve .a as extension for shared libraries though AIX4.2 - # and later linker supports .so - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.a' - shlibpath_var=LIBPATH - ;; - -amigaos*) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done' - ;; - -beos*) - library_names_spec='${libname}.so' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - lt_cv_dlopen="load_add_on" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ;; - -bsdi4*) - version_type=linux - need_version=no - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' - soname_spec='${libname}${release}.so$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - export_dynamic_flag_spec=-rdynamic - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw*) - version_type=windows - need_version=no - need_lib_prefix=no - if test "$with_gcc" = yes; then - library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll' - else - library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.lib' - fi - dynamic_linker='Win32 ld.exe' - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - lt_cv_dlopen="LoadLibrary" - lt_cv_dlopen_libs= - ;; - -freebsd1*) - dynamic_linker=no - ;; - -freebsd*) - objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` - version_type=freebsd-$objformat - case "$version_type" in - freebsd-elf*) - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='${libname}${release}.so$versuffix $libname.so$versuffix' - need_version=yes - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case "$host_os" in - freebsd2*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.[01]* | freebsdelf3.[01]*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - *) # from 3.2 on - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - esac - ;; - -gnu*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so${major} ${libname}.so' - soname_spec='${libname}${release}.so$major' - shlibpath_var=LD_LIBRARY_PATH - hardcode_into_libs=yes - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - dynamic_linker="$host_os dld.sl" - version_type=sunos - need_lib_prefix=no - need_version=no - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}.sl$versuffix ${libname}${release}.sl$major $libname.sl' - soname_spec='${libname}${release}.sl$major' - # HP-UX runs *really* slowly unless shared libraries are mode 555. - postinstall_cmds='chmod 555 $lib' - ;; - -irix5* | irix6*) - version_type=irix - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}.so.$major' - library_names_spec='${libname}${release}.so.$versuffix ${libname}${release}.so.$major ${libname}${release}.so $libname.so' - case "$host_os" in - irix5*) - libsuff= shlibsuff= - ;; - *) - case "$LD" in # libtool.m4 will add one of these switches to LD - *-32|*"-32 ") libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 ") libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux-gnuoldld* | linux-gnuaout* | linux-gnucoff*) - dynamic_linker=no - ;; - -# This must be Linux ELF. -linux-gnu*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' - soname_spec='${libname}${release}.so$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - if test -f /lib/ld.so.1; then - dynamic_linker='GNU ld.so' - else - # Only the GNU ld.so supports shared libraries on MkLinux. - case "$host_cpu" in - powerpc*) dynamic_linker=no ;; - *) dynamic_linker='Linux ld.so' ;; - esac - fi - ;; - -netbsd*) - version_type=sunos - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so ${libname}.so' - soname_spec='${libname}${release}.so$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - ;; - -openbsd*) - version_type=sunos - if test "$with_gnu_ld" = yes; then - need_lib_prefix=no - need_version=no - fi - library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - ;; - -os2*) - libname_spec='$name' - need_lib_prefix=no - library_names_spec='$libname.dll $libname.a' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH - ;; - -osf3* | osf4* | osf5*) - version_type=osf - need_version=no - soname_spec='${libname}${release}.so' - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" - ;; - -sco3.2v5*) - version_type=osf - soname_spec='${libname}${release}.so$major' - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' - shlibpath_var=LD_LIBRARY_PATH - ;; - -solaris*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' - soname_spec='${libname}${release}.so$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; - -sunos4*) - version_type=sunos - library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then - need_lib_prefix=no - fi - need_version=yes - ;; - -sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - version_type=linux - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' - soname_spec='${libname}${release}.so$major' - shlibpath_var=LD_LIBRARY_PATH - case "$host_vendor" in - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - ;; - esac - ;; - -uts4*) - version_type=linux - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' - soname_spec='${libname}${release}.so$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -dgux*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' - soname_spec='${libname}${release}.so$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -sysv4*MP*) - if test -d /usr/nec ;then - version_type=linux - library_names_spec='$libname.so.$versuffix $libname.so.$major $libname.so' - soname_spec='$libname.so.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; - -*) - dynamic_linker=no - ;; -esac -echo "$ac_t$dynamic_linker" 1>&6 -test "$dynamic_linker" = no && can_build_shared=no - -# Check for command to grab the raw symbol name followed by C symbol from nm. -echo $ac_n "checking command to parse $NM output... $ac_c" 1>&6 - -# These are sane defaults that work on at least a few old systems. -# [They come from Ultrix. What could be older than Ultrix?!! ;)] - -# Character class describing NM global symbol codes. -symcode='[BCDEGRST]' - -# Regexp to match symbols that can be accessed directly from C. -sympat='\([_A-Za-z][_A-Za-z0-9]*\)' - -# Transform the above into a raw symbol and a C symbol. -symxfrm='\1 \2\3 \3' - -# Transform an extracted symbol line into a proper C declaration -global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'" - -# Define system-specific variables. -case "$host_os" in -aix*) - symcode='[BCDT]' - ;; -cygwin* | mingw*) - symcode='[ABCDGISTW]' - ;; -hpux*) # Its linker distinguishes data from code symbols - global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^. .* \(.*\)$/extern char \1;/p'" - ;; -irix*) - symcode='[BCDEGRST]' - ;; -solaris* | sysv5*) - symcode='[BDT]' - ;; -sysv4) - symcode='[DFNSTU]' - ;; -esac - -# Handle CRLF in mingw too chain -opt_cr= -case "$host_os" in -mingw*) - opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp - ;; -esac - -# If we're using GNU nm, then use its standard symbol codes. -if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then - symcode='[ABCDGISTW]' -fi - -# Try without a prefix undercore, then with it. -for ac_symprfx in "" "_"; do - - # Write the raw and C identifiers. -global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode\)[ ][ ]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" - - # Check to see that the pipe works correctly. - pipe_works=no - $rm conftest* - cat > conftest.c <&5 - if { (eval echo $progname:1868: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; } && test -s conftest.$objext; then - # Now try to grab the symbols. - nlist=conftest.nm - if { echo "$progname:1871: eval \"$NM conftest.$objext | $global_symbol_pipe > $nlist\"" >&5; eval "$NM conftest.$objext | $global_symbol_pipe > $nlist 2>&5"; } && test -s "$nlist"; then - - # Try sorting and uniquifying the output. - if sort "$nlist" | uniq > "$nlist"T; then - mv -f "$nlist"T "$nlist" - else - rm -f "$nlist"T - fi - - # Make sure that we snagged all the symbols we need. - if egrep ' nm_test_var$' "$nlist" >/dev/null; then - if egrep ' nm_test_func$' "$nlist" >/dev/null; then - cat < conftest.c -#ifdef __cplusplus -extern "C" { -#endif - -EOF - # Now generate the symbol file. - eval "$global_symbol_to_cdecl"' < "$nlist" >> conftest.c' - - cat <> conftest.c -#if defined (__STDC__) && __STDC__ -# define lt_ptr_t void * -#else -# define lt_ptr_t char * -# define const -#endif - -/* The mapping between symbol names and symbols. */ -const struct { - const char *name; - lt_ptr_t address; -} -lt_preloaded_symbols[] = -{ -EOF - sed 's/^. \(.*\) \(.*\)$/ {"\2", (lt_ptr_t) \&\2},/' < "$nlist" >> conftest.c - cat <<\EOF >> conftest.c - {0, (lt_ptr_t) 0} -}; - -#ifdef __cplusplus -} -#endif -EOF - # Now try linking the two files. - mv conftest.$objext conftstm.$objext - save_LIBS="$LIBS" - save_CFLAGS="$CFLAGS" - LIBS="conftstm.$objext" - CFLAGS="$CFLAGS$no_builtin_flag" - if { (eval echo $progname:1923: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then - pipe_works=yes - else - echo "$progname: failed program was:" >&5 - cat conftest.c >&5 - fi - LIBS="$save_LIBS" - else - echo "cannot find nm_test_func in $nlist" >&5 - fi - else - echo "cannot find nm_test_var in $nlist" >&5 - fi - else - echo "cannot run $global_symbol_pipe" >&5 - fi - else - echo "$progname: failed program was:" >&5 - cat conftest.c >&5 - fi - $rm conftest* conftst* - - # Do not use the global_symbol_pipe unless it works. - if test "$pipe_works" = yes; then - break - else - global_symbol_pipe= - fi -done -if test "$pipe_works" = yes; then - echo "${ac_t}ok" 1>&6 -else - echo "${ac_t}failed" 1>&6 -fi - -if test -z "$global_symbol_pipe"; then - global_symbol_to_cdecl= -fi - -# Report the final consequences. -echo "checking if libtool supports shared libraries... $can_build_shared" 1>&6 - -# Only try to build win32 dlls if AC_LIBTOOL_WIN32_DLL was used in -# configure.in, otherwise build static only libraries. -case "$host_os" in -cygwin* | mingw* | os2*) - if test x$can_build_shared = xyes; then - test x$enable_win32_dll = xno && can_build_shared=no - echo "checking if package supports dlls... $can_build_shared" 1>&6 - fi -;; -esac - -echo $ac_n "checking whether to build shared libraries... $ac_c" 1>&6 -test "$can_build_shared" = "no" && enable_shared=no - -# On AIX, shared libraries and static libraries use the same namespace, and -# are all built from PIC. -case "$host_os" in -aix3*) - test "$enable_shared" = yes && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi - ;; - -aix4*) - test "$enable_shared" = yes && enable_static=no - ;; -esac - -echo "$ac_t$enable_shared" 1>&6 - -# Make sure either enable_shared or enable_static is yes. -test "$enable_shared" = yes || enable_static=yes - -echo "checking whether to build static libraries... $enable_static" 1>&6 - -if test "$hardcode_action" = relink || test "$hardcode_into_libs" = all; then - # Fast installation is not supported - enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then - # Fast installation is not necessary - enable_fast_install=needless -fi - -# Check whether we must set pic_mode to default -test -z "$pic_flag" && pic_mode=default -# On Cygwin there's no "real" PIC flag so we must build both object types -case "$host_os" in -cygwin* | mingw* | os2*) - pic_mode=default - ;; -esac -if test $pic_mode = no && test "$deplibs_check_method" != pass_all; then - # non-PIC code in shared libraries is not supported - pic_mode=default -fi - -if test "x$enable_dlopen" != xyes; then - enable_dlopen=unknown - enable_dlopen_self=unknown - enable_dlopen_self_static=unknown -else -if test "X${lt_cv_dlopen+set}" != Xset; then - lt_cv_dlopen=no lt_cv_dlopen_libs= -echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6 -echo "$progname:2032: checking for dlopen in -ldl" >&5 -if test "X${ac_cv_lib_dl_dlopen+set}" = Xset; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-ldl $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - ac_cv_lib_dl_dlopen=yes -else - echo "$progname: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_lib_dl_dlopen=no -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if test "X$ac_cv_lib_dl_dlopen" = Xyes; then - echo "$ac_t""yes" 1>&6 - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else - echo "$ac_t""no" 1>&6 -echo $ac_n "checking for dlopen""... $ac_c" 1>&6 -echo "$progname:2071: checking for dlopen" >&5 -if test "X${ac_cv_func_dlopen+set}" = Xset; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_dlopen) || defined (__stub___dlopen) -choke me -#else -dlopen(); -#endif - -; return 0; } -EOF -if { (eval echo $progname:2101: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - ac_cv_func_dlopen=yes -else - echo "$progname: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_func_dlopen=no -fi -rm -f conftest* -fi -if test "X$ac_cv_func_dlopen" = Xyes; then - echo "$ac_t""yes" 1>&6 - lt_cv_dlopen="dlopen" -else - echo "$ac_t""no" 1>&6 -echo $ac_n "checking for dld_link in -ldld""... $ac_c" 1>&6 -echo "$progname:2118: checking for dld_link in -ldld" >&5 -if test "X${ac_cv_lib_dld_dld_link+set}" = Xset; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-ldld $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - ac_cv_lib_dld_dld_link=yes -else - echo "$progname: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_lib_dld_dld_link=no -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if test "X$ac_cv_lib_dld_dld_link" = Xyes; then - echo "$ac_t""yes" 1>&6 - lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" -else - echo "$ac_t""no" 1>&6 -echo $ac_n "checking for shl_load""... $ac_c" 1>&6 -echo "$progname:2157: checking for shl_load" >&5 -if test "X${ac_cv_func_shl_load+set}" = Xset; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char shl_load(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_shl_load) || defined (__stub___shl_load) -choke me -#else -shl_load(); -#endif - -; return 0; } -EOF -if { (eval echo $progname:2187: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - ac_cv_func_shl_load=yes -else - echo "$progname: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_func_shl_load=no -fi -rm -f conftest* -fi - -if test "X$ac_cv_func_shl_load" = Xyes; then - echo "$ac_t""yes" 1>&6 - lt_cv_dlopen="shl_load" -else - echo "$ac_t""no" 1>&6 -echo $ac_n "checking for shl_load in -ldld""... $ac_c" 1>&6 -echo "$progname:2205: checking for shl_load in -ldld" >&5 -if test "X${ac_cv_lib_dld_shl_load+set}" = Xset; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-ldld $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - ac_cv_lib_dld_shl_load=yes -else - echo "$progname: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_lib_dld_shl_load=no -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if test "X$ac_cv_lib_dld_shl_load" = Xyes; then - echo "$ac_t""yes" 1>&6 - lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" -else - echo "$ac_t""no" 1>&6 -fi - - -fi - - -fi - - -fi - - -fi - -fi - - if test "x$lt_cv_dlopen" != xno; then - enable_dlopen=yes - fi - - case "$lt_cv_dlopen" in - dlopen) -for ac_hdr in dlfcn.h; do -ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` -echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "$progname:2269: checking for $ac_hdr" >&5 -if eval "test \"`echo 'X$''{'ac_cv_header_$ac_safe'+set}'`\" = Xset"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -int fnord = 0; -int main () { } -EOF -ac_try="$ac_compile >/dev/null 2>conftest.out" -{ (eval echo $progname:2280: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&5 - echo "$progname: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_header_$ac_safe=no" -fi -rm -f conftest* -fi -if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then - echo "$ac_t""yes" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi -done - - if test "x$ac_cv_header_dlfcn_h" = xyes; then - CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" - fi - eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" - LIBS="$lt_cv_dlopen_libs $LIBS" - - echo $ac_n "checking whether a program can dlopen itself""... $ac_c" 1>&6 -echo "$progname:2308: checking whether a program can dlopen itself" >&5 -if test "X${lt_cv_dlopen_self+set}" = Xset; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test "$cross_compiling" = yes; then - lt_cv_dlopen_self=cross - else - cat > conftest.c < -#endif - -#include - -#ifdef RTLD_GLOBAL -# define LTDL_GLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LTDL_GLOBAL DL_GLOBAL -# else -# define LTDL_GLOBAL 0 -# endif -#endif - -/* We may have to define LTDL_LAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LTDL_LAZY_OR_NOW -# ifdef RTLD_LAZY -# define LTDL_LAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LTDL_LAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LTDL_LAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LTDL_LAZY_OR_NOW DL_NOW -# else -# define LTDL_LAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -fnord() { int i=42;} -main() { void *self, *ptr1, *ptr2; self=dlopen(0,LTDL_GLOBAL|LTDL_LAZY_OR_NOW); - if(self) { ptr1=dlsym(self,"fnord"); ptr2=dlsym(self,"_fnord"); - if(ptr1 || ptr2) { dlclose(self); exit(0); } } exit(1); } - -EOF -if { (eval echo $progname:2362: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null -then - lt_cv_dlopen_self=yes -else - echo "$progname: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -fr conftest* - lt_cv_dlopen_self=no -fi -rm -fr conftest* -fi - -fi - -echo "$ac_t""$lt_cv_dlopen_self" 1>&6 - - if test "$lt_cv_dlopen_self" = yes; then - LDFLAGS="$LDFLAGS $link_static_flag" - echo $ac_n "checking whether a statically linked program can dlopen itself""... $ac_c" 1>&6 -echo "$progname:2381: checking whether a statically linked program can dlopen itself" >&5 -if test "X${lt_cv_dlopen_self_static+set}" = Xset; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test "$cross_compiling" = yes; then - lt_cv_dlopen_self_static=cross - else - cat > conftest.c < -#endif - -#include - -#ifdef RTLD_GLOBAL -# define LTDL_GLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LTDL_GLOBAL DL_GLOBAL -# else -# define LTDL_GLOBAL 0 -# endif -#endif - -/* We may have to define LTDL_LAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LTDL_LAZY_OR_NOW -# ifdef RTLD_LAZY -# define LTDL_LAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LTDL_LAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LTDL_LAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LTDL_LAZY_OR_NOW DL_NOW -# else -# define LTDL_LAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -fnord() { int i=42;} -main() { void *self, *ptr1, *ptr2; self=dlopen(0,LTDL_GLOBAL|LTDL_LAZY_OR_NOW); - if(self) { ptr1=dlsym(self,"fnord"); ptr2=dlsym(self,"_fnord"); - if(ptr1 || ptr2) { dlclose(self); exit(0); } } exit(1); } - -EOF -if { (eval echo $progname:2435: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null -then - lt_cv_dlopen_self_static=yes -else - echo "$progname: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -fr conftest* - lt_cv_dlopen_self_static=no -fi -rm -fr conftest* -fi - -fi - -echo "$ac_t""$lt_cv_dlopen_self_static" 1>&6 -fi - ;; - esac - - case "$lt_cv_dlopen_self" in - yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; - *) enable_dlopen_self=unknown ;; - esac - - case "$lt_cv_dlopen_self_static" in - yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; - *) enable_dlopen_self_static=unknown ;; - esac -fi - -# Copy echo and quote the copy, instead of the original, because it is -# used later. -ltecho="$echo" -if test "X$ltecho" = "X$CONFIG_SHELL $0 --fallback-echo"; then - ltecho="$CONFIG_SHELL \$0 --fallback-echo" -fi -LTSHELL="$SHELL" - -LTCONFIG_VERSION="$VERSION" - -# Only quote variables if we're using ltmain.sh. -case "$ltmain" in -*.sh) - # Now quote all the things that may contain metacharacters. - for var in ltecho old_AR old_CC old_CFLAGS old_CPPFLAGS \ - old_MAGIC old_LD old_LDFLAGS old_LIBS \ - old_LN_S old_NM old_RANLIB old_STRIP \ - old_AS old_DLLTOOL old_OBJDUMP \ - old_OBJEXT old_EXEEXT old_reload_flag \ - old_deplibs_check_method old_file_magic_cmd \ - AR CC LD LN_S NM LTSHELL LTCONFIG_VERSION \ - reload_flag reload_cmds wl \ - pic_flag link_static_flag no_builtin_flag export_dynamic_flag_spec \ - thread_safe_flag_spec whole_archive_flag_spec libname_spec \ - library_names_spec soname_spec \ - RANLIB old_archive_cmds old_archive_from_new_cmds old_postinstall_cmds \ - old_postuninstall_cmds archive_cmds archive_expsym_cmds postinstall_cmds \ - postuninstall_cmds extract_expsyms_cmds old_archive_from_expsyms_cmds \ - old_striplib striplib file_magic_cmd export_symbols_cmds \ - deplibs_check_method allow_undefined_flag no_undefined_flag \ - finish_cmds finish_eval global_symbol_pipe global_symbol_to_cdecl \ - hardcode_libdir_flag_spec hardcode_libdir_separator \ - sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ - compiler_c_o compiler_o_lo need_locks exclude_expsyms include_expsyms; do - - case "$var" in - reload_cmds | old_archive_cmds | old_archive_from_new_cmds | \ - old_postinstall_cmds | old_postuninstall_cmds | \ - export_symbols_cmds | archive_cmds | archive_expsym_cmds | \ - extract_expsyms_cmds | old_archive_from_expsyms_cmds | \ - postinstall_cmds | postuninstall_cmds | \ - finish_cmds | sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) - # Double-quote double-evaled strings. - eval "$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ### testsuite: skip nested quoting test - ;; - *) - eval "$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ### testsuite: skip nested quoting test - ;; - esac - done - - case "$ltecho" in - *'\$0 --fallback-echo"') - ltecho=`$echo "X$ltecho" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` - ;; - esac - - trap "$rm \"$ofile\"; exit 1" 1 2 15 - echo "creating $ofile" - $rm "$ofile" - cat < "$ofile" -#! $SHELL - -# `$echo "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. -# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) -# NOTE: Changes made to this file will be lost: look at ltconfig or ltmain.sh. -# -# Copyright (C) 1996-2000 Free Software Foundation, Inc. -# Originally by Gordon Matzigkeit , 1996 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# Sed that helps us avoid accidentally triggering echo(1) options like -n. -Xsed="sed -e s/^X//" - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi - -### BEGIN LIBTOOL CONFIG -EOF - cfgfile="$ofile" - ;; - -*) - # Double-quote the variables that need it (for aesthetics). - for var in old_AR old_CC old_CFLAGS old_CPPFLAGS \ - old_MAGIC old_LD old_LDFLAGS old_LIBS \ - old_LN_S old_NM old_RANLIB old_STRIP \ - old_AS old_DLLTOOL old_OBJDUMP \ - old_OBJEXT old_EXEEXT old_reload_flag \ - old_deplibs_check_method old_file_magic_cmd; do - eval "$var=\\\"\$var\\\"" - done - - # Just create a config file. - cfgfile="$ofile.cfg" - trap "$rm \"$cfgfile\"; exit 1" 1 2 15 - echo "creating $cfgfile" - $rm "$cfgfile" - cat < "$cfgfile" -# `$echo "$cfgfile" | sed 's%^.*/%%'` - Libtool configuration file. -# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) -EOF - ;; -esac - -cat <> "$cfgfile" -# Libtool was configured as follows, on host `(hostname || uname -n) 2>/dev/null | sed 1q`: -# -# AR=$old_AR CC=$old_CC CFLAGS=$old_CFLAGS CPPFLAGS=$old_CPPFLAGS \\ -# MAGIC=$old_MAGIC LD=$old_LD LDFLAGS=$old_LDFLAGS LIBS=$old_LIBS \\ -# LN_S=$old_LN_S NM=$old_NM RANLIB=$old_RANLIB STRIP=$old_STRIP \\ -# AS=$old_AS DLLTOOL=$old_DLLTOOL OBJDUMP=$old_OBJDUMP \\ -# objext=$old_OBJEXT exeext=$old_EXEEXT reload_flag=$old_reload_flag \\ -# deplibs_check_method=$old_deplibs_check_method file_magic_cmd=$old_file_magic_cmd \\ -# $0$ltconfig_args -# -# Compiler and other test output produced by $progname, useful for -# debugging $progname, is in ./config.log if it exists. -# The version of $progname that generated this script. -LTCONFIG_VERSION=$LTCONFIG_VERSION - -# Shell to use when invoking shell scripts. -SHELL=$LTSHELL - -# Whether or not to build shared libraries. -build_libtool_libs=$enable_shared - -# Whether or not to build static libraries. -build_old_libs=$enable_static - -# Whether or not to optimize for fast installation. -fast_install=$enable_fast_install - -# The host system. -host_alias=$host_alias -host=$host - -# An echo program that does not interpret backslashes. -echo=$ltecho - -# The archiver. -AR=$AR - -# The default C compiler. -CC=$CC - -# The linker used to build libraries. -LD=$LD - -# Whether we need hard or soft links. -LN_S=$LN_S - -# A BSD-compatible nm program. -NM=$NM - -# A symbol stripping program -STRIP=$STRIP - -# Used to examine libraries when file_magic_cmd begins "file" -MAGIC=$MAGIC - -# Used on cygwin: DLL creation program. -DLLTOOL="$DLLTOOL" - -# Used on cygwin: object dumper. -OBJDUMP="$OBJDUMP" - -# Used on cygwin: assembler. -AS="$AS" - -# The name of the directory that contains temporary libtool files. -objdir=$objdir - -# How to create reloadable object files. -reload_flag=$reload_flag -reload_cmds=$reload_cmds - -# How to pass a linker flag through the compiler. -wl=$wl - -# Object file suffix (normally "o"). -objext="$objext" - -# Old archive suffix (normally "a"). -libext="$libext" - -# Executable file suffix (normally ""). -exeext="$exeext" - -# Additional compiler flags for building library objects. -pic_flag=$pic_flag -pic_mode=$pic_mode - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$compiler_c_o - -# Can we write directly to a .lo ? -compiler_o_lo=$compiler_o_lo - -# Must we lock files when doing compilation ? -need_locks=$need_locks - -# Do we need the lib prefix for modules? -need_lib_prefix=$need_lib_prefix - -# Do we need a version for libraries? -need_version=$need_version - -# Whether dlopen is supported. -dlopen_support=$enable_dlopen - -# Whether dlopen of programs is supported. -dlopen_self=$enable_dlopen_self - -# Whether dlopen of statically linked programs is supported. -dlopen_self_static=$enable_dlopen_self_static - -# Compiler flag to prevent dynamic linking. -link_static_flag=$link_static_flag - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$no_builtin_flag - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$export_dynamic_flag_spec - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$whole_archive_flag_spec - -# Compiler flag to generate thread-safe objects. -thread_safe_flag_spec=$thread_safe_flag_spec - -# Library versioning type. -version_type=$version_type - -# Format of library name prefix. -libname_spec=$libname_spec - -# List of archive names. First name is the real one, the rest are links. -# The last name is the one that the linker finds with -lNAME. -library_names_spec=$library_names_spec - -# The coded name of the library, if different from the real name. -soname_spec=$soname_spec - -# Commands used to build and install an old-style archive. -RANLIB=$RANLIB -old_archive_cmds=$old_archive_cmds -old_postinstall_cmds=$old_postinstall_cmds -old_postuninstall_cmds=$old_postuninstall_cmds - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$old_archive_from_new_cmds - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds=$old_archive_from_expsyms_cmds - -# Commands used to build and install a shared archive. -archive_cmds=$archive_cmds -archive_expsym_cmds=$archive_expsym_cmds -postinstall_cmds=$postinstall_cmds -postuninstall_cmds=$postuninstall_cmds - -# Commands to strip libraries. -old_striplib=$old_striplib -striplib=$striplib - -# Method to check whether dependent libraries are shared objects. -deplibs_check_method=$deplibs_check_method - -# Command to use when deplibs_check_method == file_magic. -file_magic_cmd=$file_magic_cmd - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$allow_undefined_flag - -# Flag that forces no undefined symbols. -no_undefined_flag=$no_undefined_flag - -# Commands used to finish a libtool library installation in a directory. -finish_cmds=$finish_cmds - -# Same as above, but a single script fragment to be evaled but not shown. -finish_eval=$finish_eval - -# Take the output of nm and produce a listing of raw symbols and C names. -global_symbol_pipe=$global_symbol_pipe - -# Transform the output of nm in a proper C declaration -global_symbol_to_cdecl=$global_symbol_to_cdecl - -# This is the shared library runtime path variable. -runpath_var=$runpath_var - -# This is the shared library path variable. -shlibpath_var=$shlibpath_var - -# Is shlibpath searched before the hard-coded library search path? -shlibpath_overrides_runpath=$shlibpath_overrides_runpath - -# How to hardcode a shared library path into an executable. -hardcode_action=$hardcode_action - -# Whether we should hardcode library paths into libraries. -hardcode_into_libs=$hardcode_into_libs - -# Flag to hardcode \$libdir into a binary during linking. -# This must work even if \$libdir does not exist. -hardcode_libdir_flag_spec=$hardcode_libdir_flag_spec - -# Whether we need a single -rpath flag with a separated argument. -hardcode_libdir_separator=$hardcode_libdir_separator - -# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the -# resulting binary. -hardcode_direct=$hardcode_direct - -# Set to yes if using the -LDIR flag during linking hardcodes DIR into the -# resulting binary. -hardcode_minus_L=$hardcode_minus_L - -# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into -# the resulting binary. -hardcode_shlibpath_var=$hardcode_shlibpath_var - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$link_all_deplibs - -# Compile-time system search path for libraries -sys_lib_search_path_spec=$sys_lib_search_path_spec - -# Run-time system search path for libraries -sys_lib_dlsearch_path_spec=$sys_lib_dlsearch_path_spec - -# Fix the shell variable \$srcfile for the compiler. -fix_srcfile_path="$fix_srcfile_path" - -# Set to yes if exported symbols are required. -always_export_symbols=$always_export_symbols - -# The commands to list exported symbols. -export_symbols_cmds=$export_symbols_cmds - -# The commands to extract the exported symbol list from a shared archive. -extract_expsyms_cmds=$extract_expsyms_cmds - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms=$exclude_expsyms - -# Symbols that must always be exported. -include_expsyms=$include_expsyms - -EOF - -case "$ltmain" in -*.sh) - echo '### END LIBTOOL CONFIG' >> "$ofile" - echo >> "$ofile" - case "$host_os" in - aix3*) - cat <<\EOF >> "$ofile" - -# AIX sometimes has problems with the GCC collect2 program. For some -# reason, if we set the COLLECT_NAMES environment variable, the problems -# vanish in a puff of smoke. -if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES -fi -EOF - ;; - esac - case "$host" in - *-*-cygwin* | *-*-mingw* | *-*-os2*) - cat <<'EOF' >> "$ofile" - # This is a source program that is used to create dlls on Windows - # Don't remove nor modify the starting and closing comments -# /* ltdll.c starts here */ -# #define WIN32_LEAN_AND_MEAN -# #include -# #undef WIN32_LEAN_AND_MEAN -# #include -# -# #ifndef __CYGWIN__ -# # ifdef __CYGWIN32__ -# # define __CYGWIN__ __CYGWIN32__ -# # endif -# #endif -# -# #ifdef __cplusplus -# extern "C" { -# #endif -# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); -# #ifdef __cplusplus -# } -# #endif -# -# #ifdef __CYGWIN__ -# #include -# DECLARE_CYGWIN_DLL( DllMain ); -# #endif -# HINSTANCE __hDllInstance_base; -# -# BOOL APIENTRY -# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) -# { -# __hDllInstance_base = hInst; -# return TRUE; -# } -# /* ltdll.c ends here */ - # This is a source program that is used to create import libraries - # on Windows for dlls which lack them. Don't remove nor modify the - # starting and closing comments -# /* impgen.c starts here */ -# /* Copyright (C) 1999-2000 Free Software Foundation, Inc. -# -# This file is part of GNU libtool. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# */ -# -# #include /* for printf() */ -# #include /* for open(), lseek(), read() */ -# #include /* for O_RDONLY, O_BINARY */ -# #include /* for strdup() */ -# -# /* O_BINARY isn't required (or even defined sometimes) under Unix */ -# #ifndef O_BINARY -# #define O_BINARY 0 -# #endif -# -# static unsigned int -# pe_get16 (fd, offset) -# int fd; -# int offset; -# { -# unsigned char b[2]; -# lseek (fd, offset, SEEK_SET); -# read (fd, b, 2); -# return b[0] + (b[1]<<8); -# } -# -# static unsigned int -# pe_get32 (fd, offset) -# int fd; -# int offset; -# { -# unsigned char b[4]; -# lseek (fd, offset, SEEK_SET); -# read (fd, b, 4); -# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); -# } -# -# static unsigned int -# pe_as32 (ptr) -# void *ptr; -# { -# unsigned char *b = ptr; -# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); -# } -# -# int -# main (argc, argv) -# int argc; -# char *argv[]; -# { -# int dll; -# unsigned long pe_header_offset, opthdr_ofs, num_entries, i; -# unsigned long export_rva, export_size, nsections, secptr, expptr; -# unsigned long name_rvas, nexp; -# unsigned char *expdata, *erva; -# char *filename, *dll_name; -# -# filename = argv[1]; -# -# dll = open(filename, O_RDONLY|O_BINARY); -# if (!dll) -# return 1; -# -# dll_name = filename; -# -# for (i=0; filename[i]; i++) -# if (filename[i] == '/' || filename[i] == '\\' || filename[i] == ':') -# dll_name = filename + i +1; -# -# pe_header_offset = pe_get32 (dll, 0x3c); -# opthdr_ofs = pe_header_offset + 4 + 20; -# num_entries = pe_get32 (dll, opthdr_ofs + 92); -# -# if (num_entries < 1) /* no exports */ -# return 1; -# -# export_rva = pe_get32 (dll, opthdr_ofs + 96); -# export_size = pe_get32 (dll, opthdr_ofs + 100); -# nsections = pe_get16 (dll, pe_header_offset + 4 +2); -# secptr = (pe_header_offset + 4 + 20 + -# pe_get16 (dll, pe_header_offset + 4 + 16)); -# -# expptr = 0; -# for (i = 0; i < nsections; i++) -# { -# char sname[8]; -# unsigned long secptr1 = secptr + 40 * i; -# unsigned long vaddr = pe_get32 (dll, secptr1 + 12); -# unsigned long vsize = pe_get32 (dll, secptr1 + 16); -# unsigned long fptr = pe_get32 (dll, secptr1 + 20); -# lseek(dll, secptr1, SEEK_SET); -# read(dll, sname, 8); -# if (vaddr <= export_rva && vaddr+vsize > export_rva) -# { -# expptr = fptr + (export_rva - vaddr); -# if (export_rva + export_size > vaddr + vsize) -# export_size = vsize - (export_rva - vaddr); -# break; -# } -# } -# -# expdata = (unsigned char*)malloc(export_size); -# lseek (dll, expptr, SEEK_SET); -# read (dll, expdata, export_size); -# erva = expdata - export_rva; -# -# nexp = pe_as32 (expdata+24); -# name_rvas = pe_as32 (expdata+32); -# -# printf ("EXPORTS\n"); -# for (i = 0; i> "$ofile" || (rm -f "$ofile"; exit 1) - # We use sed instead of cat because bash on DJGPP gets confused if - # if finds mixed CR/LF and LF-only lines. Since sed operates in - # text mode, it properly converts lines to CR/LF. This bash problem - # is reportedly fixed, but why not run on old versions too? - - chmod +x "$ofile" - ;; - -*) - # Compile the libtool program. - echo "FIXME: would compile $ltmain" - ;; -esac - -test -n "$cache_file" || exit 0 - -# AC_CACHE_SAVE -trap '' 1 2 15 -cat > confcache <<\EOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs. It is not useful on other systems. -# If it contains results you don't want to keep, you may remove or edit it. -# -# By default, configure uses ./config.cache as the cache file, -# creating it if it does not exist already. You can give configure -# the --cache-file=FILE option to use a different cache file; that is -# what configure does when it calls configure scripts in -# subdirectories, so they share the cache. -# Giving --cache-file=/dev/null disables caching, for debugging configure. -# config.status only pays attention to the cache file if you give it the -# --recheck option to rerun configure. -# -EOF -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, don't put newlines in cache variables' values. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -(set) 2>&1 | - case `(ac_space=' '; set | grep ac_space) 2>&1` in - *ac_space=\ *) - # `set' does not quote correctly, so add quotes (double-quote substitution - # turns \\\\ into \\, and sed turns \\ into \). - sed -n \ - -e "s/'/'\\\\''/g" \ - -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" - ;; - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' - ;; - esac >> confcache -if cmp -s $cache_file confcache; then - : -else - if test -w $cache_file; then - echo "updating cache $cache_file" - cat confcache > $cache_file - else - echo "not updating unwritable cache $cache_file" - fi -fi -rm -f confcache - -exit 0 - -# Local Variables: -# mode:shell-script -# sh-indentation:2 -# End: diff --git a/rts/gmp/ltmain.sh b/rts/gmp/ltmain.sh deleted file mode 100644 index d81d89f..0000000 --- a/rts/gmp/ltmain.sh +++ /dev/null @@ -1,4692 +0,0 @@ -# ltmain.sh - Provide generalized library-building support services. -# NOTE: Changing this file will not affect anything until you rerun ltconfig. -# -# Copyright (C) 1996-2000 Free Software Foundation, Inc. -# Originally by Gordon Matzigkeit , 1996 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# Check that we have a working $echo. -if test "X$1" = X--no-reexec; then - # Discard the --no-reexec flag, and continue. - shift -elif test "X$1" = X--fallback-echo; then - # Avoid inline document here, it may be left over - : -elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then - # Yippee, $echo works! - : -else - # Restart under the correct shell, and then maybe $echo will work. - exec $SHELL "$0" --no-reexec ${1+"$@"} -fi - -if test "X$1" = X--fallback-echo; then - # used as fallback echo - shift - cat <&2 - echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 - exit 1 -fi - -if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then - echo "$modename: not configured to build any kind of library" 1>&2 - echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 - exit 1 -fi - -# Global variables. -mode=$default_mode -nonopt= -prev= -prevopt= -run= -show="$echo" -show_help= -execute_dlfiles= -lo2o="s/\\.lo\$/.${objext}/" -o2lo="s/\\.${objext}\$/.lo/" - -# Parse our command line options once, thoroughly. -while test $# -gt 0 -do - arg="$1" - shift - - case "$arg" in - -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;; - *) optarg= ;; - esac - - # If the previous option needs an argument, assign it. - if test -n "$prev"; then - case "$prev" in - execute_dlfiles) - eval "$prev=\"\$$prev \$arg\"" - ;; - *) - eval "$prev=\$arg" - ;; - esac - - prev= - prevopt= - continue - fi - - # Have we seen a non-optional argument yet? - case "$arg" in - --help) - show_help=yes - ;; - - --version) - echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP" - exit 0 - ;; - - --config) - sed -e '1,/^### BEGIN LIBTOOL CONFIG/d' -e '/^### END LIBTOOL CONFIG/,$d' $0 - exit 0 - ;; - - --debug) - echo "$progname: enabling shell trace mode" - set -x - ;; - - --dry-run | -n) - run=: - ;; - - --features) - echo "host: $host" - if test "$build_libtool_libs" = yes; then - echo "enable shared libraries" - else - echo "disable shared libraries" - fi - if test "$build_old_libs" = yes; then - echo "enable static libraries" - else - echo "disable static libraries" - fi - exit 0 - ;; - - --finish) mode="finish" ;; - - --mode) prevopt="--mode" prev=mode ;; - --mode=*) mode="$optarg" ;; - - --quiet | --silent) - show=: - ;; - - -dlopen) - prevopt="-dlopen" - prev=execute_dlfiles - ;; - - -*) - $echo "$modename: unrecognized option \`$arg'" 1>&2 - $echo "$help" 1>&2 - exit 1 - ;; - - *) - nonopt="$arg" - break - ;; - esac -done - -if test -n "$prevopt"; then - $echo "$modename: option \`$prevopt' requires an argument" 1>&2 - $echo "$help" 1>&2 - exit 1 -fi - -if test -z "$show_help"; then - - # Infer the operation mode. - if test -z "$mode"; then - case "$nonopt" in - *cc | *++ | gcc* | *-gcc*) - mode=link - for arg - do - case "$arg" in - -c) - mode=compile - break - ;; - esac - done - ;; - *db | *dbx | *strace | *truss) - mode=execute - ;; - *install*|cp|mv) - mode=install - ;; - *rm) - mode=uninstall - ;; - *) - # If we have no mode, but dlfiles were specified, then do execute mode. - test -n "$execute_dlfiles" && mode=execute - - # Just use the default operation mode. - if test -z "$mode"; then - if test -n "$nonopt"; then - $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2 - else - $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2 - fi - fi - ;; - esac - fi - - # Only execute mode is allowed to have -dlopen flags. - if test -n "$execute_dlfiles" && test "$mode" != execute; then - $echo "$modename: unrecognized option \`-dlopen'" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - - # Change the help message to a mode-specific one. - generic_help="$help" - help="Try \`$modename --help --mode=$mode' for more information." - - # These modes are in order of execution frequency so that they run quickly. - case "$mode" in - # libtool compile mode - compile) - modename="$modename: compile" - # Get the compilation command and the source file. - base_compile= - prev= - lastarg= - srcfile="$nonopt" - suppress_output= - - user_target=no - for arg - do - case "$prev" in - "") ;; - xcompiler) - # Aesthetically quote the previous argument. - prev= - lastarg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` - - case "$arg" in - # Double-quote args containing other shell metacharacters. - # Many Bourne shells cannot handle close brackets correctly - # in scan sets, so we specify it separately. - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - arg="\"$arg\"" - ;; - esac - - # Add the previous argument to base_compile. - if test -z "$base_compile"; then - base_compile="$lastarg" - else - base_compile="$base_compile $lastarg" - fi - continue - ;; - esac - - # Accept any command-line options. - case "$arg" in - -o) - if test "$user_target" != "no"; then - $echo "$modename: you cannot specify \`-o' more than once" 1>&2 - exit 1 - fi - user_target=next - ;; - - -static) - build_old_libs=yes - continue - ;; - - -Xcompiler) - prev=xcompiler - continue - ;; - - -Wc,*) - args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"` - lastarg= - IFS="${IFS= }"; save_ifs="$IFS"; IFS=',' - for arg in $args; do - IFS="$save_ifs" - - # Double-quote args containing other shell metacharacters. - # Many Bourne shells cannot handle close brackets correctly - # in scan sets, so we specify it separately. - case "$arg" in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - arg="\"$arg\"" - ;; - esac - lastarg="$lastarg $arg" - done - IFS="$save_ifs" - lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"` - - # Add the arguments to base_compile. - if test -z "$base_compile"; then - base_compile="$lastarg" - else - base_compile="$base_compile $lastarg" - fi - continue - ;; - esac - - case "$user_target" in - next) - # The next one is the -o target name - user_target=yes - continue - ;; - yes) - # We got the output file - user_target=set - libobj="$arg" - continue - ;; - esac - - # Accept the current argument as the source file. - lastarg="$srcfile" - srcfile="$arg" - - # Aesthetically quote the previous argument. - - # Backslashify any backslashes, double quotes, and dollar signs. - # These are the only characters that are still specially - # interpreted inside of double-quoted scrings. - lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` - - # Double-quote args containing other shell metacharacters. - # Many Bourne shells cannot handle close brackets correctly - # in scan sets, so we specify it separately. - case "$lastarg" in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - lastarg="\"$lastarg\"" - ;; - esac - - # Add the previous argument to base_compile. - if test -z "$base_compile"; then - base_compile="$lastarg" - else - base_compile="$base_compile $lastarg" - fi - done - - case "$user_target" in - set) - ;; - no) - # Get the name of the library object. - libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` - ;; - *) - $echo "$modename: you must specify a target with \`-o'" 1>&2 - exit 1 - ;; - esac - - # Recognize several different file suffixes. - # If the user specifies -o file.o, it is replaced with file.lo - xform='[cCFSfmso]' - case "$libobj" in - *.ada) xform=ada ;; - *.adb) xform=adb ;; - *.ads) xform=ads ;; - *.asm) xform=asm ;; - *.c++) xform=c++ ;; - *.cc) xform=cc ;; - *.cpp) xform=cpp ;; - *.cxx) xform=cxx ;; - *.f90) xform=f90 ;; - *.for) xform=for ;; - esac - - libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` - - case "$libobj" in - *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;; - *) - $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2 - exit 1 - ;; - esac - - if test -z "$base_compile"; then - $echo "$modename: you must specify a compilation command" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - - # Delete any leftover library objects. - if test "$build_old_libs" = yes; then - removelist="$obj $libobj" - else - removelist="$libobj" - fi - - $run $rm $removelist - trap "$run $rm $removelist; exit 1" 1 2 15 - - # Calculate the filename of the output object if compiler does - # not support -o with -c - if test "$compiler_c_o" = no; then - output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\..*$%%'`.${objext} - lockfile="$output_obj.lock" - removelist="$removelist $output_obj $lockfile" - trap "$run $rm $removelist; exit 1" 1 2 15 - else - need_locks=no - lockfile= - fi - - # Lock this critical section if it is needed - # We use this script file to make the link, it avoids creating a new file - if test "$need_locks" = yes; then - until ln "$0" "$lockfile" 2>/dev/null; do - $show "Waiting for $lockfile to be removed" - sleep 2 - done - elif test "$need_locks" = warn; then - if test -f "$lockfile"; then - echo "\ -*** ERROR, $lockfile exists and contains: -`cat $lockfile 2>/dev/null` - -This indicates that another process is trying to use the same -temporary object file, and libtool could not work around it because -your compiler does not support \`-c' and \`-o' together. If you -repeat this compilation, it may succeed, by chance, but you had better -avoid parallel builds (make -j) in this platform, or get a better -compiler." - - $run $rm $removelist - exit 1 - fi - echo $srcfile > "$lockfile" - fi - - if test -n "$fix_srcfile_path"; then - eval srcfile=\"$fix_srcfile_path\" - fi - - # Only build a PIC object if we are building libtool libraries. - if test "$build_libtool_libs" = yes; then - # Without this assignment, base_compile gets emptied. - fbsd_hideous_sh_bug=$base_compile - - if test "$pic_mode" != no; then - # All platforms use -DPIC, to notify preprocessed assembler code. - command="$base_compile $srcfile $pic_flag -DPIC" - else - # Don't build PIC code - command="$base_compile $srcfile" - fi - if test "$build_old_libs" = yes; then - lo_libobj="$libobj" - dir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'` - if test "X$dir" = "X$libobj"; then - dir="$objdir" - else - dir="$dir/$objdir" - fi - libobj="$dir/"`$echo "X$libobj" | $Xsed -e 's%^.*/%%'` - - if test -d "$dir"; then - $show "$rm $libobj" - $run $rm $libobj - else - $show "$mkdir $dir" - $run $mkdir $dir - status=$? - if test $status -ne 0 && test ! -d $dir; then - exit $status - fi - fi - fi - if test "$compiler_o_lo" = yes; then - output_obj="$libobj" - command="$command -o $output_obj" - elif test "$compiler_c_o" = yes; then - output_obj="$obj" - command="$command -o $output_obj" - fi - - $run $rm "$output_obj" - $show "$command" - if $run eval "$command"; then : - else - test -n "$output_obj" && $run $rm $removelist - exit 1 - fi - - if test "$need_locks" = warn && - test x"`cat $lockfile 2>/dev/null`" != x"$srcfile"; then - echo "\ -*** ERROR, $lockfile contains: -`cat $lockfile 2>/dev/null` - -but it should contain: -$srcfile - -This indicates that another process is trying to use the same -temporary object file, and libtool could not work around it because -your compiler does not support \`-c' and \`-o' together. If you -repeat this compilation, it may succeed, by chance, but you had better -avoid parallel builds (make -j) in this platform, or get a better -compiler." - - $run $rm $removelist - exit 1 - fi - - # Just move the object if needed, then go on to compile the next one - if test x"$output_obj" != x"$libobj"; then - $show "$mv $output_obj $libobj" - if $run $mv $output_obj $libobj; then : - else - error=$? - $run $rm $removelist - exit $error - fi - fi - - # If we have no pic_flag, then copy the object into place and finish. - if (test -z "$pic_flag" || test "$pic_mode" != default) && - test "$build_old_libs" = yes; then - # Rename the .lo from within objdir to obj - if test -f $obj; then - $show $rm $obj - $run $rm $obj - fi - - $show "$mv $libobj $obj" - if $run $mv $libobj $obj; then : - else - error=$? - $run $rm $removelist - exit $error - fi - - xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` - if test "X$xdir" = "X$obj"; then - xdir="." - else - xdir="$xdir" - fi - baseobj=`$echo "X$obj" | $Xsed -e "s%.*/%%"` - libobj=`$echo "X$baseobj" | $Xsed -e "$o2lo"` - # Now arrange that obj and lo_libobj become the same file - $show "(cd $xdir && $LN_S $baseobj $libobj)" - if $run eval '(cd $xdir && $LN_S $baseobj $libobj)'; then - exit 0 - else - error=$? - $run $rm $removelist - exit $error - fi - fi - - # Allow error messages only from the first compilation. - suppress_output=' >/dev/null 2>&1' - fi - - # Only build a position-dependent object if we build old libraries. - if test "$build_old_libs" = yes; then - if test "$pic_mode" != yes; then - # Don't build PIC code - command="$base_compile $srcfile" - else - # All platforms use -DPIC, to notify preprocessed assembler code. - command="$base_compile $srcfile $pic_flag -DPIC" - fi - if test "$compiler_c_o" = yes; then - command="$command -o $obj" - output_obj="$obj" - fi - - # Suppress compiler output if we already did a PIC compilation. - command="$command$suppress_output" - $run $rm "$output_obj" - $show "$command" - if $run eval "$command"; then : - else - $run $rm $removelist - exit 1 - fi - - if test "$need_locks" = warn && - test x"`cat $lockfile 2>/dev/null`" != x"$srcfile"; then - echo "\ -*** ERROR, $lockfile contains: -`cat $lockfile 2>/dev/null` - -but it should contain: -$srcfile - -This indicates that another process is trying to use the same -temporary object file, and libtool could not work around it because -your compiler does not support \`-c' and \`-o' together. If you -repeat this compilation, it may succeed, by chance, but you had better -avoid parallel builds (make -j) in this platform, or get a better -compiler." - - $run $rm $removelist - exit 1 - fi - - # Just move the object if needed - if test x"$output_obj" != x"$obj"; then - $show "$mv $output_obj $obj" - if $run $mv $output_obj $obj; then : - else - error=$? - $run $rm $removelist - exit $error - fi - fi - - # Create an invalid libtool object if no PIC, so that we do not - # accidentally link it into a program. - if test "$build_libtool_libs" != yes; then - $show "echo timestamp > $libobj" - $run eval "echo timestamp > \$libobj" || exit $? - else - # Move the .lo from within objdir - $show "$mv $libobj $lo_libobj" - if $run $mv $libobj $lo_libobj; then : - else - error=$? - $run $rm $removelist - exit $error - fi - fi - fi - - # Unlock the critical section if it was locked - if test "$need_locks" != no; then - $rm "$lockfile" - fi - - exit 0 - ;; - - # libtool link mode - link | relink) - modename="$modename: link" - case "$host" in - *-*-cygwin* | *-*-mingw* | *-*-os2*) - # It is impossible to link a dll without this setting, and - # we shouldn't force the makefile maintainer to figure out - # which system we are compiling for in order to pass an extra - # flag for every libtool invokation. - # allow_undefined=no - - # FIXME: Unfortunately, there are problems with the above when trying - # to make a dll which has undefined symbols, in which case not - # even a static library is built. For now, we need to specify - # -no-undefined on the libtool link line when we can be certain - # that all symbols are satisfied, otherwise we get a static library. - allow_undefined=yes - ;; - *) - allow_undefined=yes - ;; - esac - libtool_args="$nonopt" - compile_command="$nonopt" - finalize_command="$nonopt" - - compile_rpath= - finalize_rpath= - compile_shlibpath= - finalize_shlibpath= - convenience= - old_convenience= - deplibs= - old_deplibs= - compiler_flags= - linker_flags= - dllsearchpath= - lib_search_path=`pwd` - - avoid_version=no - dlfiles= - dlprefiles= - dlself=no - export_dynamic=no - export_symbols= - export_symbols_regex= - generated= - libobjs= - ltlibs= - module=no - no_install=no - objs= - prefer_static_libs=no - preload=no - prev= - prevarg= - release= - rpath= - xrpath= - perm_rpath= - temp_rpath= - thread_safe=no - vinfo= - - # We need to know -static, to get the right output filenames. - for arg - do - case "$arg" in - -all-static | -static) - if test "X$arg" = "X-all-static"; then - if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then - $echo "$modename: warning: complete static linking is impossible in this configuration" 1>&2 - fi - if test -n "$link_static_flag"; then - dlopen_self=$dlopen_self_static - fi - else - if test -z "$pic_flag" && test -n "$link_static_flag"; then - dlopen_self=$dlopen_self_static - fi - fi - build_libtool_libs=no - build_old_libs=yes - prefer_static_libs=yes - break - ;; - esac - done - - # See if our shared archives depend on static archives. - test -n "$old_archive_from_new_cmds" && build_old_libs=yes - - # Go through the arguments, transforming them on the way. - while test $# -gt 0; do - arg="$1" - shift - case "$arg" in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test - ;; - *) qarg=$arg ;; - esac - libtool_args="$libtool_args $qarg" - - # If the previous option needs an argument, assign it. - if test -n "$prev"; then - case "$prev" in - output) - compile_command="$compile_command @OUTPUT@" - finalize_command="$finalize_command @OUTPUT@" - ;; - esac - - case "$prev" in - dlfiles|dlprefiles) - if test "$preload" = no; then - # Add the symbol object into the linking commands. - compile_command="$compile_command @SYMFILE@" - finalize_command="$finalize_command @SYMFILE@" - preload=yes - fi - case "$arg" in - *.la | *.lo) ;; # We handle these cases below. - force) - if test "$dlself" = no; then - dlself=needless - export_dynamic=yes - fi - prev= - continue - ;; - self) - if test "$prev" = dlprefiles; then - dlself=yes - elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then - dlself=yes - else - dlself=needless - export_dynamic=yes - fi - prev= - continue - ;; - *) - if test "$prev" = dlfiles; then - dlfiles="$dlfiles $arg" - else - dlprefiles="$dlprefiles $arg" - fi - prev= - continue - ;; - esac - ;; - expsyms) - export_symbols="$arg" - if test ! -f "$arg"; then - $echo "$modename: symbol file \`$arg' does not exist" - exit 1 - fi - prev= - continue - ;; - expsyms_regex) - export_symbols_regex="$arg" - prev= - continue - ;; - release) - release="-$arg" - prev= - continue - ;; - rpath | xrpath) - # We need an absolute path. - case "$arg" in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - $echo "$modename: only absolute run-paths are allowed" 1>&2 - exit 1 - ;; - esac - if test "$prev" = rpath; then - case "$rpath " in - *" $arg "*) ;; - *) rpath="$rpath $arg" ;; - esac - else - case "$xrpath " in - *" $arg "*) ;; - *) xrpath="$xrpath $arg" ;; - esac - fi - prev= - continue - ;; - xcompiler) - compiler_flags="$compiler_flags $qarg" - prev= - compile_command="$compile_command $qarg" - finalize_command="$finalize_command $qarg" - continue - ;; - xlinker) - linker_flags="$linker_flags $qarg" - compiler_flags="$compiler_flags $wl$qarg" - prev= - compile_command="$compile_command $wl$qarg" - finalize_command="$finalize_command $wl$qarg" - continue - ;; - *) - eval "$prev=\"\$arg\"" - prev= - continue - ;; - esac - fi - - prevarg="$arg" - - case "$arg" in - -all-static) - if test -n "$link_static_flag"; then - compile_command="$compile_command $link_static_flag" - finalize_command="$finalize_command $link_static_flag" - fi - continue - ;; - - -allow-undefined) - # FIXME: remove this flag sometime in the future. - $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2 - continue - ;; - - -avoid-version) - avoid_version=yes - continue - ;; - - -dlopen) - prev=dlfiles - continue - ;; - - -dlpreopen) - prev=dlprefiles - continue - ;; - - -export-dynamic) - export_dynamic=yes - continue - ;; - - -export-symbols | -export-symbols-regex) - if test -n "$export_symbols" || test -n "$export_symbols_regex"; then - $echo "$modename: not more than one -exported-symbols argument allowed" - exit 1 - fi - if test "X$arg" = "X-export-symbols"; then - prev=expsyms - else - prev=expsyms_regex - fi - continue - ;; - - -L*) - dir=`$echo "X$arg" | $Xsed -e 's/^-L//'` - # We need an absolute path. - case "$dir" in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - absdir=`cd "$dir" && pwd` - if test -z "$absdir"; then - $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2 - exit 1 - fi - dir="$absdir" - ;; - esac - case "$deplibs " in - *" -L$dir "*) ;; - *) - deplibs="$deplibs -L$dir" - lib_search_path="$lib_search_path $dir" - ;; - esac - case "$host" in - *-*-cygwin* | *-*-mingw* | *-*-os2*) - case ":$dllsearchpath:" in - *":$dir:"*) ;; - *) dllsearchpath="$dllsearchpath:$dir";; - esac - ;; - esac - continue - ;; - - -l*) - if test "$arg" = "-lc"; then - case "$host" in - *-*-cygwin* | *-*-mingw* | *-*-os2* | *-*-beos*) - # These systems don't actually have c library (as such) - continue - ;; - esac - elif test "$arg" = "-lm"; then - case "$host" in - *-*-cygwin* | *-*-beos*) - # These systems don't actually have math library (as such) - continue - ;; - esac - fi - deplibs="$deplibs $arg" - continue - ;; - - -module) - module=yes - continue - ;; - - -no-fast-install) - fast_install=no - continue - ;; - - -no-install) - case "$host" in - *-*-cygwin* | *-*-mingw* | *-*-os2*) - # The PATH hackery in wrapper scripts is required on Windows - # in order for the loader to find any dlls it needs. - $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2 - $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2 - fast_install=no - ;; - *) - no_install=yes - ;; - esac - continue - ;; - - -no-undefined) - allow_undefined=no - continue - ;; - - -o) prev=output ;; - - -release) - prev=release - continue - ;; - - -rpath) - prev=rpath - continue - ;; - - -R) - prev=xrpath - continue - ;; - - -R*) - dir=`$echo "X$arg" | $Xsed -e 's/^-R//'` - # We need an absolute path. - case "$dir" in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - $echo "$modename: only absolute run-paths are allowed" 1>&2 - exit 1 - ;; - esac - case "$xrpath " in - *" $dir "*) ;; - *) xrpath="$xrpath $dir" ;; - esac - continue - ;; - - -static) - # If we have no pic_flag, then this is the same as -all-static. - if test -z "$pic_flag" && test -n "$link_static_flag"; then - compile_command="$compile_command $link_static_flag" - finalize_command="$finalize_command $link_static_flag" - fi - continue - ;; - - -thread-safe) - thread_safe=yes - continue - ;; - - -version-info) - prev=vinfo - continue - ;; - - -Wc,*) - args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'` - arg= - IFS="${IFS= }"; save_ifs="$IFS"; IFS=',' - for flag in $args; do - IFS="$save_ifs" - case "$flag" in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - flag="\"$flag\"" - ;; - esac - arg="$arg $wl$flag" - compiler_flags="$compiler_flags $flag" - done - IFS="$save_ifs" - arg=`$echo "X$arg" | $Xsed -e "s/^ //"` - ;; - - -Wl,*) - args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'` - arg= - IFS="${IFS= }"; save_ifs="$IFS"; IFS=',' - for flag in $args; do - IFS="$save_ifs" - case "$flag" in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - flag="\"$flag\"" - ;; - esac - arg="$arg $wl$flag" - compiler_flags="$compiler_flags $wl$flag" - linker_flags="$linker_flags $flag" - done - IFS="$save_ifs" - arg=`$echo "X$arg" | $Xsed -e "s/^ //"` - ;; - - -Xcompiler) - prev=xcompiler - continue - ;; - - -Xlinker) - prev=xlinker - continue - ;; - - # Some other compiler flag. - -* | +*) - # Unknown arguments in both finalize_command and compile_command need - # to be aesthetically quoted because they are evaled later. - arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` - case "$arg" in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - arg="\"$arg\"" - ;; - esac - ;; - - *.$objext) - # A standard object. - objs="$objs $arg" - ;; - - *.lo) - # A library object. - if test "$prev" = dlfiles; then - # This file was specified with -dlopen. - if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then - dlfiles="$dlfiles $arg" - prev= - continue - else - # If libtool objects are unsupported, then we need to preload. - prev=dlprefiles - fi - fi - - if test "$prev" = dlprefiles; then - # Preload the old-style object. - dlprefiles="$dlprefiles "`$echo "X$arg" | $Xsed -e "$lo2o"` - prev= - else - libobjs="$libobjs $arg" - fi - ;; - - *.$libext) - # An archive. - deplibs="$deplibs $arg" - old_deplibs="$old_deplibs $arg" - continue - ;; - - *.la) - # A libtool-controlled library. - - if test "$prev" = dlfiles; then - # This library was specified with -dlopen. - dlfiles="$dlfiles $arg" - prev= - elif test "$prev" = dlprefiles; then - # The library was specified with -dlpreopen. - dlprefiles="$dlprefiles $arg" - prev= - else - deplibs="$deplibs $arg" - fi - continue - ;; - - # Some other compiler argument. - *) - # Unknown arguments in both finalize_command and compile_command need - # to be aesthetically quoted because they are evaled later. - arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` - case "$arg" in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - arg="\"$arg\"" - ;; - esac - ;; - esac - - # Now actually substitute the argument into the commands. - if test -n "$arg"; then - compile_command="$compile_command $arg" - finalize_command="$finalize_command $arg" - fi - done - - if test -n "$prev"; then - $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - - if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then - eval arg=\"$export_dynamic_flag_spec\" - compile_command="$compile_command $arg" - finalize_command="$finalize_command $arg" - fi - - oldlibs= - # calculate the name of the file, without its directory - outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` - libobjs_save="$libobjs" - - if test -n "$shlibpath_var"; then - # get the directories listed in $shlibpath_var - eval shlib_search_path=\`\$echo \"X \${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\` - else - shlib_search_path= - fi - eval sys_lib_search_path=\"$sys_lib_search_path_spec\" - eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" - lib_search_path="$lib_search_path $sys_lib_search_path $shlib_search_path" - - output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` - if test "X$output_objdir" = "X$output"; then - output_objdir="$objdir" - else - output_objdir="$output_objdir/$objdir" - fi - # Create the object directory. - if test ! -d $output_objdir; then - $show "$mkdir $output_objdir" - $run $mkdir $output_objdir - status=$? - if test $status -ne 0 && test ! -d $output_objdir; then - exit $status - fi - fi - - case "$output" in - "") - $echo "$modename: you must specify an output file" 1>&2 - $echo "$help" 1>&2 - exit 1 - ;; - *.$libext) - linkmode=oldlib ;; - *.lo | *.$objext) - linkmode=obj ;; - *.la) - linkmode=lib ;; - *) # Anything else should be a program. - linkmode=prog ;; - esac - - specialdeplibs= - libs= - # Find all interdependent deplibs that - # are linked more than once (e.g. -la -lb -la) - for deplib in $deplibs; do - case "$libs " in - *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; - esac - libs="$libs $deplib" - done - deplibs= - newdependency_libs= - uninst_path= # paths that contain uninstalled libtool libraries - new_lib_search_path= - need_relink=no # whether we're linking any uninstalled libtool libraries - case $linkmode in - lib) - passes="link" - for file in $dlfiles $dlprefiles; do - case "$file" in - *.la) ;; - *) - $echo "$modename: libraries can \`-dlopen' only libtool libraries" 1>&2 - exit 1 - ;; - esac - done - ;; - prog) - compile_deplibs= - finalize_deplibs= - alldeplibs=no - newdlfiles= - newdlprefiles= - link_against_libtool_libs= - passes="scan dlopen dlpreopen link" - ;; - *) passes="link" - ;; - esac - for pass in $passes; do - if test $linkmode = prog; then - case $pass in - dlopen) libs="$dlfiles" ;; - dlpreopen) libs="$dlprefiles" ;; - link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; - esac - fi - if test $pass = dlopen; then - # Collect dlpreopened libraries - save_deplibs="$deplibs" - deplibs= - fi - for deplib in $libs; do - lib= - found=no - case "$deplib" in - -l*) - if test $linkmode != lib && test $linkmode != prog; then - $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2 - continue - fi - name=`$echo "X$deplib" | $Xsed -e 's/^-l//'` - for searchdir in $lib_search_path; do - # Search the libtool library - lib="$searchdir/lib${name}.la" - if test -f "$lib"; then - found=yes - break - fi - done - if test "$found" != yes; then - if test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - deplibs="$deplib $deplibs" - test $linkmode = lib && newdependency_libs="$deplib $newdependency_libs" - fi - continue - fi - ;; - -L*) - case $linkmode in - lib) - deplibs="$deplib $deplibs" - newdependency_libs="$deplib $newdependency_libs" - new_lib_search_path="$new_lib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` - ;; - prog) - if test $pass = scan; then - deplibs="$deplib $deplibs" - new_lib_search_path="$new_lib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` - else - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - fi - ;; - *) - $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2 - ;; - esac - continue - ;; - -R*) - if test "$linkmode,$pass" = "prog,link"; then - dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'` - # Make sure the xrpath contains only unique directories. - case "$xrpath " in - *" $dir "*) ;; - *) xrpath="$xrpath $dir" ;; - esac - fi - continue - ;; - *.la) lib="$deplib" ;; - *.$libext) - case $linkmode in - lib) - if test "$deplibs_check_method" != pass_all; then - echo - echo "*** Warning: This library needs some functionality provided by $deplib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have." - else - echo - echo "*** Warning: Linking the shared library $output against the" - echo "*** static library $deplib is not portable!" - deplibs="$deplib $deplibs" - fi - continue - ;; - prog) - if test $pass != link; then - deplibs="$deplib $deplibs" - else - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - fi - continue - ;; - esac - ;; - *.lo | *.$objext) - if test $linkmode = prog; then - if test $pass = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then - # If there is no dlopen support or we're linking statically, - # we need to preload. - newdlprefiles="$newdlprefiles $deplib" - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - newdlfiles="$newdlfiles $deplib" - fi - fi - continue - ;; - %DEPLIBS%) - alldeplibs=yes - continue - ;; - esac - if test $found = yes || test -f "$lib"; then : - else - $echo "$modename: cannot find the library \`$lib'" 1>&2 - exit 1 - fi - - # Check to see that this really is a libtool archive. - if (sed -e '2q' $lib | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : - else - $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 - exit 1 - fi - - ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` - test "X$ladir" = "X$lib" && ladir="." - - dlname= - dlopen= - dlpreopen= - libdir= - library_names= - old_library= - # If the library was installed with an old release of libtool, - # it will not redefine variable installed. - installed=yes - - # Read the .la file - case "$lib" in - */* | *\\*) . $lib ;; - *) . ./$lib ;; - esac - - if test $linkmode = lib || test "$linkmode,$pass" = "prog,scan"; then - test -n "$dlopen" && dlfiles="$dlfiles $dlopen" - test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" - fi - - if test $linkmode != lib && test $linkmode != prog; then - # only check for convenience libraries - if test -z "$old_library"; then - $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 - exit 1 - fi - if test -n "$libdir"; then - $echo "$modename: \`$lib' is not a convenience library" 1>&2 - exit 1 - fi - # It is a libtool convenience library, so add in its objects. - convenience="$convenience $ladir/$objdir/$old_library" - old_convenience="$old_convenience $ladir/$objdir/$old_library" - continue - fi - - # Get the name of the library we link against. - linklib= - for l in $old_library $library_names; do - linklib="$l" - done - if test -z "$linklib"; then - $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 - exit 1 - fi - - # This library was specified with -dlopen. - if test $pass = dlopen; then - if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then - # If there is no dlname, no dlopen support or we're linking statically, - # we need to preload. - dlprefiles="$dlprefiles $lib" - else - newdlfiles="$newdlfiles $lib" - fi - continue - fi - - # We need an absolute path. - case "$ladir" in - [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; - *) - abs_ladir=`cd "$ladir" && pwd` - if test -z "$abs_ladir"; then - $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2 - $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 - abs_ladir="$ladir" - fi - ;; - esac - laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` - - # Find the relevant object directory and library name. - if test "X$installed" = Xyes; then - if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then - $echo "$modename: warning: library \`$lib' was moved." 1>&2 - dir="$ladir" - absdir="$abs_ladir" - libdir="$abs_ladir" - else - dir="$libdir" - absdir="$libdir" - fi - else - dir="$ladir/$objdir" - absdir="$abs_ladir/$objdir" - # Remove this search path later - uninst_path="$uninst_path $abs_ladir" - fi - name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` - - # This library was specified with -dlpreopen. - if test $pass = dlpreopen; then - # Prefer using a static library (so that no silly _DYNAMIC symbols - # are required to link). - if test -n "$old_library"; then - newdlprefiles="$newdlprefiles $dir/$old_library" - else - newdlprefiles="$newdlprefiles $dir/$linklib" - fi - fi - - if test $linkmode = prog && test $pass != link; then - new_lib_search_path="$new_lib_search_path $ladir" - deplibs="$lib $deplibs" - - linkalldeplibs=no - if test "$link_all_deplibs" != no || test "$fast_install" != no || \ - test "$build_libtool_libs" = no || test -z "$library_names"; then - linkalldeplibs=yes - fi - - tmp_libs= - for deplib in $dependency_libs; do - case "$deplib" in - -L*) new_lib_search_path="$new_lib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test - esac - # Need to link against all dependency_libs? - if test $linkalldeplibs = yes; then - deplibs="$deplib $deplibs" - else - # Need to hardcode shared library paths - # or/and link against static libraries - newdependency_libs="$deplib $newdependency_libs" - fi - case "$tmp_libs " in - *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; - esac - tmp_libs="$tmp_libs $deplib" - done - continue - fi - - if test -z "$libdir"; then - # It is a libtool convenience library, so add in its objects. - convenience="$convenience $dir/$old_library" - old_convenience="$old_convenience $dir/$old_library" - if test $linkmode = lib; then - deplibs="$dir/$old_library $deplibs" - tmp_libs= - for deplib in $dependency_libs; do - newdependency_libs="$deplib $newdependency_libs" - case "$tmp_libs " in - *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; - esac - tmp_libs="$tmp_libs $deplib" - done - elif test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$dir/$old_library $compile_deplibs" - finalize_deplibs="$dir/$old_library $finalize_deplibs" - fi - continue - fi - - if test "$linkmode,$pass" = "prog,link"; then - if test -n "$library_names" && - { test "$hardcode_into_libs" != all || test "$alldeplibs" != yes; } && - { test "$prefer_static_libs" = no || test -z "$old_library"; }; then - # We need to hardcode the library path - if test -n "$shlibpath_var"; then - # Make sure the rpath contains only unique directories. - case "$temp_rpath " in - *" $dir "*) ;; - *" $absdir "*) ;; - *) temp_rpath="$temp_rpath $dir" ;; - esac - fi - - # Hardcode the library path. - # Skip directories that are in the system default run-time - # search path. - case " $sys_lib_dlsearch_path " in - *" $absdir "*) ;; - *) - case "$compile_rpath " in - *" $absdir "*) ;; - *) compile_rpath="$compile_rpath $absdir" - esac - ;; - esac - - case " $sys_lib_dlsearch_path " in - *" $libdir "*) ;; - *) - case "$finalize_rpath " in - *" $libdir "*) ;; - *) finalize_rpath="$finalize_rpath $libdir" - esac - ;; - esac - fi - - if test "$alldeplibs" = yes && - { test "$deplibs_check_method" = pass_all || - { test "$build_libtool_libs" = yes && - test -n "$library_names"; }; }; then - # Do we only need to link against static libraries? - continue - fi - fi - - link_static=no # Whether this library is linked statically - if test -n "$library_names" && - { test "$prefer_static_libs" = no || test -z "$old_library"; }; then - link_against_libtool_libs="$link_against_libtool_libs $lib" - test "X$installed" = xno && need_relink=yes - # This is a shared library - if test $linkmode = lib && test "$hardcode_into_libs" = all; then - # Hardcode the library path. - # Skip directories that are in the system default run-time - # search path. - case " $sys_lib_dlsearch_path " in - *" $absdir "*) ;; - *) - case "$compile_rpath " in - *" $absdir "*) ;; - *) compile_rpath="$compile_rpath $absdir" - esac - ;; - esac - case " $sys_lib_dlsearch_path " in - *" $libdir "*) ;; - *) - case "$finalize_rpath " in - *" $libdir "*) ;; - *) finalize_rpath="$finalize_rpath $libdir" - esac - ;; - esac - fi - - if test -n "$old_archive_from_expsyms_cmds"; then - # figure out the soname - set dummy $library_names - realname="$2" - shift; shift - libname=`eval \\$echo \"$libname_spec\"` - if test -n "$soname_spec"; then - eval soname=\"$soname_spec\" - else - soname="$realname" - fi - - # Make a new name for the extract_expsyms_cmds to use - newlib="libimp-`echo $soname | sed 's/^lib//;s/\.dll$//'`.a" - - # If the library has no export list, then create one now - if test -f "$output_objdir/$soname-def"; then : - else - $show "extracting exported symbol list from \`$soname'" - IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' - eval cmds=\"$extract_expsyms_cmds\" - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - fi - - # Create $newlib - if test -f "$output_objdir/$newlib"; then :; else - $show "generating import library for \`$soname'" - IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' - eval cmds=\"$old_archive_from_expsyms_cmds\" - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - fi - # make sure the library variables are pointing to the new library - dir=$output_objdir - linklib=$newlib - fi - - if test $linkmode = prog || test "$mode" != relink; then - add_shlibpath= - add_dir= - add= - lib_linked=yes - case "$hardcode_action" in - immediate | unsupported) - if test "$hardcode_direct" = no; then - add="$dir/$linklib" - elif test "$hardcode_minus_L" = no; then - case "$host" in - *-*-sunos*) add_shlibpath="$dir" ;; - esac - add_dir="-L$dir" - add="-l$name" - elif test "$hardcode_shlibpath_var" = no; then - add_shlibpath="$dir" - add="-l$name" - else - lib_linked=no - fi - ;; - relink) - if test "$hardcode_direct" = yes; then - add="$dir/$linklib" - elif test "$hardcode_minus_L" = yes; then - add_dir="-L$dir" - add="-l$name" - elif test "$hardcode_shlibpath_var" = yes; then - add_shlibpath="$dir" - add="-l$name" - else - lib_linked=no - fi - ;; - *) lib_linked=no ;; - esac - - if test "$lib_linked" != yes; then - $echo "$modename: configuration error: unsupported hardcode properties" - exit 1 - fi - - if test -n "$add_shlibpath"; then - case ":$compile_shlibpath:" in - *":$add_shlibpath:"*) ;; - *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; - esac - fi - if test $linkmode = prog; then - test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" - test -n "$add" && compile_deplibs="$add $compile_deplibs" - else - test -n "$add_dir" && deplibs="$add_dir $deplibs" - test -n "$add" && deplibs="$add $deplibs" - if test "$hardcode_direct" != yes && \ - test "$hardcode_minus_L" != yes && \ - test "$hardcode_shlibpath_var" = yes; then - case ":$finalize_shlibpath:" in - *":$libdir:"*) ;; - *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; - esac - fi - fi - fi - - if test $linkmode = prog || test "$mode" = relink; then - add_shlibpath= - add_dir= - add= - # Finalize command for both is simple: just hardcode it. - if test "$hardcode_direct" = yes; then - add="$libdir/$linklib" - elif test "$hardcode_minus_L" = yes; then - add_dir="-L$libdir" - add="-l$name" - elif test "$hardcode_shlibpath_var" = yes; then - case ":$finalize_shlibpath:" in - *":$libdir:"*) ;; - *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; - esac - add="-l$name" - else - # We cannot seem to hardcode it, guess we'll fake it. - add_dir="-L$libdir" - add="-l$name" - fi - - if test $linkmode = prog; then - test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" - test -n "$add" && finalize_deplibs="$add $finalize_deplibs" - else - test -n "$add_dir" && deplibs="$add_dir $deplibs" - test -n "$add" && deplibs="$add deplibs" - fi - fi - elif test $linkmode = prog; then - # Here we assume that one of hardcode_direct or hardcode_minus_L - # is not unsupported. This is valid on all known static and - # shared platforms. - if test "$hardcode_direct" != unsupported; then - test -n "$old_library" && linklib="$old_library" - compile_deplibs="$dir/$linklib $compile_deplibs" - finalize_deplibs="$dir/$linklib $finalize_deplibs" - else - compile_deplibs="-l$name -L$dir $compile_deplibs" - finalize_deplibs="-l$name -L$dir $finalize_deplibs" - fi - elif test "$build_libtool_libs" = yes; then - # Not a shared library - if test "$deplibs_check_method" != pass_all; then - # We're trying link a shared library against a static one - # but the system doesn't support it. - # Just print a warning and add the library to dependency_libs so - # that the program can be linked against the static library. - echo - echo "*** Warning: This library needs some functionality provided by $lib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have." - else - convenience="$convenience $dir/$old_library" - old_convenience="$old_convenience $dir/$old_library" - deplibs="$dir/$old_library $deplibs" - link_static=yes - fi - fi - - if test $linkmode = lib; then - if test -n "$dependency_libs" && - { test "$hardcode_into_libs" = no || test $build_old_libs = yes || - test $link_static = yes; }; then - # Extract -R from dependency_libs - temp_deplibs= - for libdir in $dependency_libs; do - case "$libdir" in - -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'` - case " $xrpath " in - *" $temp_xrpath "*) ;; - *) xrpath="$xrpath $temp_xrpath";; - esac;; - *) temp_deplibs="$temp_deplibs $libdir";; - esac - done - dependency_libs="$temp_deplibs" - fi - - new_lib_search_path="$new_lib_search_path $absdir" - # Link against this library - test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" - # ... and its dependency_libs - tmp_libs= - for deplib in $dependency_libs; do - newdependency_libs="$deplib $newdependency_libs" - case "$tmp_libs " in - *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; - esac - tmp_libs="$tmp_libs $deplib" - done - - if test $link_all_deplibs != no; then - # Add the search paths of all dependency libraries - for deplib in $dependency_libs; do - case "$deplib" in - -L*) path="$deplib" ;; - *.la) - dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'` - test "X$dir" = "X$deplib" && dir="." - # We need an absolute path. - case "$dir" in - [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; - *) - absdir=`cd "$dir" && pwd` - if test -z "$absdir"; then - $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 - absdir="$dir" - fi - ;; - esac - if grep "^installed=no" $deplib > /dev/null; then - path="-L$absdir/$objdir" - else - eval libdir=`sed -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` - if test -z "$libdir"; then - $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 - exit 1 - fi - if test "$absdir" != "$libdir"; then - $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2 - fi - path="-L$absdir" - fi - ;; - *) continue ;; - esac - case " $deplibs " in - *" $path "*) ;; - *) deplibs="$deplibs $path" ;; - esac - done - fi - fi - done - dependency_libs="$newdependency_libs" - if test $pass = dlpreopen; then - # Link the dlpreopened libraries before other libraries - deplibs="$deplibs $save_deplibs" - elif test $pass != dlopen; then - # Make sure lib_search_path contains only unique directories. - lib_search_path= - for dir in $new_lib_search_path; do - case "$lib_search_path " in - *" $dir "*) ;; - *) lib_search_path="$lib_search_path $dir" ;; - esac - done - lib_search_path="$lib_search_path $sys_lib_search_path" - - if test "$linkmode,$pass" != "prog,link"; then - vars="deplibs" - else - vars="compile_deplibs finalize_deplibs" - fi - for var in $vars dependency_libs; do - # Make sure that $var contains only unique libraries - # and add them in reverse order - eval tmp_libs=\"\$$var\" - new_libs= - for deplib in $tmp_libs; do - case "$deplib" in - -L*) new_libs="$deplib $new_libs" ;; - *) - case " $specialdeplibs " in - *" $deplib "*) new_libs="$deplib $new_libs" ;; - *) - case " $new_libs " in - *" $deplib "*) ;; - *) new_libs="$deplib $new_libs" ;; - esac - ;; - esac - ;; - esac - done - tmp_libs= - for deplib in $new_libs; do - case "$deplib" in - -L*) - case " $tmp_libs " in - *" $deplib "*) ;; - *) tmp_libs="$tmp_libs $deplib" ;; - esac - ;; - *) tmp_libs="$tmp_libs $deplib" ;; - esac - done - eval $var=\"$tmp_libs\" - done - fi - done - if test $linkmode = prog; then - dlfiles="$newdlfiles" - dlprefiles="$newdlprefiles" - fi - - case $linkmode in - oldlib) - if test -n "$deplibs"; then - $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 - fi - - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 - fi - - if test -n "$rpath"; then - $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2 - fi - - if test -n "$xrpath"; then - $echo "$modename: warning: \`-R' is ignored for archives" 1>&2 - fi - - if test -n "$vinfo"; then - $echo "$modename: warning: \`-version-info' is ignored for archives" 1>&2 - fi - - if test -n "$release"; then - $echo "$modename: warning: \`-release' is ignored for archives" 1>&2 - fi - - if test -n "$export_symbols" || test -n "$export_symbols_regex"; then - $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2 - fi - - # Now set the variables for building old libraries. - build_libtool_libs=no - oldlibs="$output" - objs="$objs$old_deplibs" - ;; - - lib) - # Make sure we only generate libraries of the form `libNAME.la'. - case "$outputname" in - lib*) - name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` - eval libname=\"$libname_spec\" - ;; - *) - if test "$module" = no; then - $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - if test "$need_lib_prefix" != no; then - # Add the "lib" prefix for modules if required - name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` - eval libname=\"$libname_spec\" - else - libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` - fi - ;; - esac - - if test -n "$objs"; then - if test "$deplibs_check_method" != pass_all; then - $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1 - exit 1 - else - echo - echo "*** Warning: Linking the shared library $output against the non-libtool" - echo "*** objects $objs is not portable!" - libobjs="$libobjs $objs" - fi - fi - - if test "$dlself" != no; then - $echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2 - fi - - set dummy $rpath - if test $# -gt 2; then - $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2 - fi - install_libdir="$2" - - oldlibs= - if test -z "$rpath"; then - if test "$build_libtool_libs" = yes; then - # Building a libtool convenience library. - libext=al - oldlibs="$output_objdir/$libname.$libext $oldlibs" - build_libtool_libs=convenience - build_old_libs=yes - fi - - if test -n "$vinfo"; then - $echo "$modename: warning: \`-version-info' is ignored for convenience libraries" 1>&2 - fi - - if test -n "$release"; then - $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2 - fi - else - - # Parse the version information argument. - IFS="${IFS= }"; save_ifs="$IFS"; IFS=':' - set dummy $vinfo 0 0 0 - IFS="$save_ifs" - - if test -n "$8"; then - $echo "$modename: too many parameters to \`-version-info'" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - - current="$2" - revision="$3" - age="$4" - - # Check that each of the things are valid numbers. - case "$current" in - 0 | [1-9] | [1-9][0-9]*) ;; - *) - $echo "$modename: CURRENT \`$current' is not a nonnegative integer" 1>&2 - $echo "$modename: \`$vinfo' is not valid version information" 1>&2 - exit 1 - ;; - esac - - case "$revision" in - 0 | [1-9] | [1-9][0-9]*) ;; - *) - $echo "$modename: REVISION \`$revision' is not a nonnegative integer" 1>&2 - $echo "$modename: \`$vinfo' is not valid version information" 1>&2 - exit 1 - ;; - esac - - case "$age" in - 0 | [1-9] | [1-9][0-9]*) ;; - *) - $echo "$modename: AGE \`$age' is not a nonnegative integer" 1>&2 - $echo "$modename: \`$vinfo' is not valid version information" 1>&2 - exit 1 - ;; - esac - - if test $age -gt $current; then - $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 - $echo "$modename: \`$vinfo' is not valid version information" 1>&2 - exit 1 - fi - - # Calculate the version variables. - major= - versuffix= - verstring= - case "$version_type" in - none) ;; - - irix) - major=`expr $current - $age + 1` - versuffix="$major.$revision" - verstring="sgi$major.$revision" - - # Add in all the interfaces that we are compatible with. - loop=$revision - while test $loop != 0; do - iface=`expr $revision - $loop` - loop=`expr $loop - 1` - verstring="sgi$major.$iface:$verstring" - done - ;; - - linux) - major=.`expr $current - $age` - versuffix="$major.$age.$revision" - ;; - - osf) - major=`expr $current - $age` - versuffix=".$current.$age.$revision" - verstring="$current.$age.$revision" - - # Add in all the interfaces that we are compatible with. - loop=$age - while test $loop != 0; do - iface=`expr $current - $loop` - loop=`expr $loop - 1` - verstring="$verstring:${iface}.0" - done - - # Make executables depend on our current version. - verstring="$verstring:${current}.0" - ;; - - sunos) - major=".$current" - versuffix=".$current.$revision" - ;; - - freebsd-aout) - major=".$current" - versuffix=".$current.$revision"; - ;; - - freebsd-elf) - major=".$current" - versuffix=".$current"; - ;; - - windows) - # Like Linux, but with '-' rather than '.', since we only - # want one extension on Windows 95. - major=`expr $current - $age` - versuffix="-$major-$age-$revision" - ;; - - *) - $echo "$modename: unknown library version type \`$version_type'" 1>&2 - echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 - exit 1 - ;; - esac - - # Clear the version info if we defaulted, and they specified a release. - if test -z "$vinfo" && test -n "$release"; then - major= - verstring="0.0" - if test "$need_version" = no; then - versuffix= - else - versuffix=".0.0" - fi - fi - - # Remove version info from name if versioning should be avoided - if test "$avoid_version" = yes && test "$need_version" = no; then - major= - versuffix= - verstring="" - fi - - # Check to see if the archive will have undefined symbols. - if test "$allow_undefined" = yes; then - if test "$allow_undefined_flag" = unsupported; then - $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2 - build_libtool_libs=no - build_old_libs=yes - fi - else - # Don't allow undefined symbols. - allow_undefined_flag="$no_undefined_flag" - fi - fi - - if test "$mode" != relink; then - # Remove our outputs. - $show "${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.*" - $run ${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.* - fi - - # Now set the variables for building old libraries. - if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then - oldlibs="$oldlibs $output_objdir/$libname.$libext" - - # Transform .lo files to .o files. - oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` - fi - - # Eliminate all temporary directories. - for path in $uninst_path; do - lib_search_path=`echo "$lib_search_path " | sed -e 's% $path % %g'` - deplibs=`echo "$deplibs " | sed -e 's% -L$path % %g'` - dependency_libs=`echo "$dependency_libs " | sed -e 's% -L$path % %g'` - done - - if test -n "$xrpath"; then - # If the user specified any rpath flags, then add them. - temp_xrpath= - for libdir in $xrpath; do - temp_xrpath="$temp_xrpath -R$libdir" - case "$finalize_rpath " in - *" $libdir "*) ;; - *) finalize_rpath="$finalize_rpath $libdir" ;; - esac - done - if test "$hardcode_into_libs" = no || test $build_old_libs = yes; then - dependency_libs="$temp_xrpath $dependency_libs" - fi - fi - - # Make sure dlfiles contains only unique files that won't be dlpreopened - old_dlfiles="$dlfiles" - dlfiles= - for lib in $old_dlfiles; do - case " $dlprefiles $dlfiles " in - *" $lib "*) ;; - *) dlfiles="$dlfiles $lib" ;; - esac - done - - # Make sure dlprefiles contains only unique files - old_dlprefiles="$dlprefiles" - dlprefiles= - for lib in $old_dlprefiles; do - case "$dlprefiles " in - *" $lib "*) ;; - *) dlprefiles="$dlprefiles $lib" ;; - esac - done - - if test "$build_libtool_libs" = yes; then - if test -n "$rpath"; then - case "$host" in - *-*-cygwin* | *-*-mingw* | *-*-os2* | *-*-beos*) - # these systems don't actually have a c library (as such)! - ;; - *) - # Add libc to deplibs on all other systems. - deplibs="$deplibs -lc" - ;; - esac - fi - - # Transform deplibs into only deplibs that can be linked in shared. - name_save=$name - libname_save=$libname - release_save=$release - versuffix_save=$versuffix - major_save=$major - # I'm not sure if I'm treating the release correctly. I think - # release should show up in the -l (ie -lgmp5) so we don't want to - # add it in twice. Is that correct? - release="" - versuffix="" - major="" - newdeplibs= - droppeddeps=no - case "$deplibs_check_method" in - pass_all) - # Don't check for shared/static. Everything works. - # This might be a little naive. We might want to check - # whether the library exists or not. But this is on - # osf3 & osf4 and I'm not really sure... Just - # implementing what was already the behaviour. - newdeplibs=$deplibs - ;; - test_compile) - # This code stresses the "libraries are programs" paradigm to its - # limits. Maybe even breaks it. We compile a program, linking it - # against the deplibs as a proxy for the library. Then we can check - # whether they linked in statically or dynamically with ldd. - $rm conftest.c - cat > conftest.c </dev/null` - for potent_lib in $potential_libs; do - # Follow soft links. - if ls -lLd "$potent_lib" 2>/dev/null \ - | grep " -> " >/dev/null; then - continue - fi - # The statement above tries to avoid entering an - # endless loop below, in case of cyclic links. - # We might still enter an endless loop, since a link - # loop can be closed while we follow links, - # but so what? - potlib="$potent_lib" - while test -h "$potlib" 2>/dev/null; do - potliblink=`ls -ld $potlib | sed 's/.* -> //'` - case "$potliblink" in - [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; - *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; - esac - done - if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \ - | sed 10q \ - | egrep "$file_magic_regex" > /dev/null; then - newdeplibs="$newdeplibs $a_deplib" - a_deplib="" - break 2 - fi - done - done - if test -n "$a_deplib" ; then - droppeddeps=yes - echo - echo "*** Warning: This library needs some functionality provided by $a_deplib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have." - fi - else - # Add a -L argument. - newdeplibs="$newdeplibs $a_deplib" - fi - done # Gone through all deplibs. - ;; - none | unknown | *) - newdeplibs="" - if $echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ - -e 's/ -[LR][^ ]*//g' -e 's/[ ]//g' | - grep . >/dev/null; then - echo - if test "X$deplibs_check_method" = "Xnone"; then - echo "*** Warning: inter-library dependencies are not supported in this platform." - else - echo "*** Warning: inter-library dependencies are not known to be supported." - fi - echo "*** All declared inter-library dependencies are being dropped." - droppeddeps=yes - fi - ;; - esac - versuffix=$versuffix_save - major=$major_save - release=$release_save - libname=$libname_save - name=$name_save - - if test "$droppeddeps" = yes; then - if test "$module" = yes; then - echo - echo "*** Warning: libtool could not satisfy all declared inter-library" - echo "*** dependencies of module $libname. Therefore, libtool will create" - echo "*** a static module, that should work as long as the dlopening" - echo "*** application is linked with the -dlopen flag." - if test -z "$global_symbol_pipe"; then - echo - echo "*** However, this would only work if libtool was able to extract symbol" - echo "*** lists from a program, using \`nm' or equivalent, but libtool could" - echo "*** not find such a program. So, this module is probably useless." - echo "*** \`nm' from GNU binutils and a full rebuild may help." - fi - if test "$build_old_libs" = no; then - oldlibs="$output_objdir/$libname.$libext" - build_libtool_libs=module - build_old_libs=yes - else - build_libtool_libs=no - fi - else - echo "*** The inter-library dependencies that have been dropped here will be" - echo "*** automatically added whenever a program is linked with this library" - echo "*** or is declared to -dlopen it." - fi - fi - # Done checking deplibs! - deplibs=$newdeplibs - fi - - # All the library-specific variables (install_libdir is set above). - library_names= - old_library= - dlname= - - # Test again, we may have decided not to build it any more - if test "$build_libtool_libs" = yes; then - if test "$hardcode_into_libs" != no; then - # Hardcode the library paths - hardcode_libdirs= - dep_rpath= - rpath="$finalize_rpath" - test "$mode" != relink && rpath="$compile_rpath$rpath" - for libdir in $rpath; do - if test -n "$hardcode_libdir_flag_spec"; then - if test -n "$hardcode_libdir_separator"; then - if test -z "$hardcode_libdirs"; then - hardcode_libdirs="$libdir" - else - # Just accumulate the unique libdirs. - case "$hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator" in - *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) - ;; - *) - hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag=\"$hardcode_libdir_flag_spec\" - dep_rpath="$dep_rpath $flag" - fi - elif test -n "$runpath_var"; then - case "$perm_rpath " in - *" $libdir "*) ;; - *) perm_rpath="$perm_rpath $libdir" ;; - esac - fi - done - # Substitute the hardcoded libdirs into the rpath. - if test -n "$hardcode_libdir_separator" && - test -n "$hardcode_libdirs"; then - libdir="$hardcode_libdirs" - eval dep_rpath=\"$hardcode_libdir_flag_spec\" - fi - if test -n "$runpath_var" && test -n "$perm_rpath"; then - # We should set the runpath_var. - rpath= - for dir in $perm_rpath; do - rpath="$rpath$dir:" - done - eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" - fi - test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" - fi - - shlibpath="$finalize_shlibpath" - test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath" - if test -n "$shlibpath"; then - eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" - fi - - # Get the real and link names of the library. - eval library_names=\"$library_names_spec\" - set dummy $library_names - realname="$2" - shift; shift - - if test -n "$soname_spec"; then - eval soname=\"$soname_spec\" - else - soname="$realname" - fi - - lib="$output_objdir/$realname" - for link - do - linknames="$linknames $link" - done - - # Ensure that we have .o objects for linkers which dislike .lo - # (e.g. aix) in case we are running --disable-static - for obj in $libobjs; do - xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` - if test "X$xdir" = "X$obj"; then - xdir="." - else - xdir="$xdir" - fi - baseobj=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` - oldobj=`$echo "X$baseobj" | $Xsed -e "$lo2o"` - if test ! -f $xdir/$oldobj; then - $show "(cd $xdir && ${LN_S} $baseobj $oldobj)" - $run eval '(cd $xdir && ${LN_S} $baseobj $oldobj)' || exit $? - fi - done - - # Use standard objects if they are pic - test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` - - # Prepare the list of exported symbols - if test -z "$export_symbols"; then - if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then - $show "generating symbol list for \`$libname.la'" - export_symbols="$output_objdir/$libname.exp" - $run $rm $export_symbols - eval cmds=\"$export_symbols_cmds\" - IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - if test -n "$export_symbols_regex"; then - $show "egrep -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" - $run eval 'egrep -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' - $show "$mv \"${export_symbols}T\" \"$export_symbols\"" - $run eval '$mv "${export_symbols}T" "$export_symbols"' - fi - fi - fi - - if test -n "$export_symbols" && test -n "$include_expsyms"; then - $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"' - fi - - if test -n "$convenience"; then - if test -n "$whole_archive_flag_spec"; then - eval libobjs=\"\$libobjs $whole_archive_flag_spec\" - else - gentop="$output_objdir/${outputname}x" - $show "${rm}r $gentop" - $run ${rm}r "$gentop" - $show "mkdir $gentop" - $run mkdir "$gentop" - status=$? - if test $status -ne 0 && test ! -d "$gentop"; then - exit $status - fi - generated="$generated $gentop" - - for xlib in $convenience; do - # Extract the objects. - case "$xlib" in - [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; - *) xabs=`pwd`"/$xlib" ;; - esac - xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` - xdir="$gentop/$xlib" - - $show "${rm}r $xdir" - $run ${rm}r "$xdir" - $show "mkdir $xdir" - $run mkdir "$xdir" - status=$? - if test $status -ne 0 && test ! -d "$xdir"; then - exit $status - fi - $show "(cd $xdir && $AR x $xabs)" - $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? - - libobjs="$libobjs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP` - done - fi - fi - - if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then - eval flag=\"$thread_safe_flag_spec\" - linker_flags="$linker_flags $flag" - fi - - # Make a backup of the uninstalled library when relinking - if test "$mode" = relink && test "$hardcode_into_libs" = all; then - $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $? - fi - - # Do each of the archive commands. - if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then - eval cmds=\"$archive_expsym_cmds\" - else - eval cmds=\"$archive_cmds\" - fi - IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - - # Restore the uninstalled library and exit - if test "$mode" = relink && test "$hardcode_into_libs" = all; then - $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $? - exit 0 - fi - - # Create links to the real library. - for linkname in $linknames; do - if test "$realname" != "$linkname"; then - $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)" - $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $? - fi - done - - # If -module or -export-dynamic was specified, set the dlname. - if test "$module" = yes || test "$export_dynamic" = yes; then - # On all known operating systems, these are identical. - dlname="$soname" - fi - fi - ;; - - obj) - if test -n "$deplibs"; then - $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 - fi - - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2 - fi - - if test -n "$rpath"; then - $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2 - fi - - if test -n "$xrpath"; then - $echo "$modename: warning: \`-R' is ignored for objects" 1>&2 - fi - - if test -n "$vinfo"; then - $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2 - fi - - if test -n "$release"; then - $echo "$modename: warning: \`-release' is ignored for objects" 1>&2 - fi - - case "$output" in - *.lo) - if test -n "$objs$old_deplibs"; then - $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2 - exit 1 - fi - libobj="$output" - obj=`$echo "X$output" | $Xsed -e "$lo2o"` - ;; - *) - libobj= - obj="$output" - ;; - esac - - # Delete the old objects. - $run $rm $obj $libobj - - # Objects from convenience libraries. This assumes - # single-version convenience libraries. Whenever we create - # different ones for PIC/non-PIC, this we'll have to duplicate - # the extraction. - reload_conv_objs= - gentop= - # reload_cmds runs $LD directly, so let us get rid of - # -Wl from whole_archive_flag_spec - wl= - - if test -n "$convenience"; then - if test -n "$whole_archive_flag_spec"; then - eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\" - else - gentop="$output_objdir/${obj}x" - $show "${rm}r $gentop" - $run ${rm}r "$gentop" - $show "mkdir $gentop" - $run mkdir "$gentop" - status=$? - if test $status -ne 0 && test ! -d "$gentop"; then - exit $status - fi - generated="$generated $gentop" - - for xlib in $convenience; do - # Extract the objects. - case "$xlib" in - [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; - *) xabs=`pwd`"/$xlib" ;; - esac - xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` - xdir="$gentop/$xlib" - - $show "${rm}r $xdir" - $run ${rm}r "$xdir" - $show "mkdir $xdir" - $run mkdir "$xdir" - status=$? - if test $status -ne 0 && test ! -d "$xdir"; then - exit $status - fi - $show "(cd $xdir && $AR x $xabs)" - $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? - - reload_conv_objs="$reload_objs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP` - done - fi - fi - - # Create the old-style object. - reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test - - output="$obj" - eval cmds=\"$reload_cmds\" - IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - - # Exit if we aren't doing a library object file. - if test -z "$libobj"; then - if test -n "$gentop"; then - $show "${rm}r $gentop" - $run ${rm}r $gentop - fi - - exit 0 - fi - - if test "$build_libtool_libs" != yes; then - if test -n "$gentop"; then - $show "${rm}r $gentop" - $run ${rm}r $gentop - fi - - # Create an invalid libtool object if no PIC, so that we don't - # accidentally link it into a program. - $show "echo timestamp > $libobj" - $run eval "echo timestamp > $libobj" || exit $? - exit 0 - fi - - if test -n "$pic_flag" || test "$pic_mode" != default; then - # Only do commands if we really have different PIC objects. - reload_objs="$libobjs $reload_conv_objs" - output="$libobj" - eval cmds=\"$reload_cmds\" - IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - else - # Just create a symlink. - $show $rm $libobj - $run $rm $libobj - xdir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'` - if test "X$xdir" = "X$libobj"; then - xdir="." - else - xdir="$xdir" - fi - baseobj=`$echo "X$libobj" | $Xsed -e 's%^.*/%%'` - oldobj=`$echo "X$baseobj" | $Xsed -e "$lo2o"` - $show "(cd $xdir && $LN_S $oldobj $baseobj)" - $run eval '(cd $xdir && $LN_S $oldobj $baseobj)' || exit $? - fi - - if test -n "$gentop"; then - $show "${rm}r $gentop" - $run ${rm}r $gentop - fi - - exit 0 - ;; - - prog) - if test -n "$vinfo"; then - $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2 - fi - - if test -n "$release"; then - $echo "$modename: warning: \`-release' is ignored for programs" 1>&2 - fi - - if test "$preload" = yes; then - if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown && - test "$dlopen_self_static" = unknown; then - $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support." - fi - fi - - compile_command="$compile_command $compile_deplibs" - finalize_command="$finalize_command $finalize_deplibs" - - if test -n "$rpath$xrpath"; then - # If the user specified any rpath flags, then add them. - for libdir in $rpath $xrpath; do - # This is the magic to use -rpath. - case "$finalize_rpath " in - *" $libdir "*) ;; - *) finalize_rpath="$finalize_rpath $libdir" ;; - esac - done - fi - - # Now hardcode the library paths - rpath= - hardcode_libdirs= - for libdir in $compile_rpath $finalize_rpath; do - if test -n "$hardcode_libdir_flag_spec"; then - if test -n "$hardcode_libdir_separator"; then - if test -z "$hardcode_libdirs"; then - hardcode_libdirs="$libdir" - else - # Just accumulate the unique libdirs. - case "$hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator" in - *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) - ;; - *) - hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag=\"$hardcode_libdir_flag_spec\" - rpath="$rpath $flag" - fi - elif test -n "$runpath_var"; then - case "$perm_rpath " in - *" $libdir "*) ;; - *) perm_rpath="$perm_rpath $libdir" ;; - esac - fi - case "$host" in - *-*-cygwin* | *-*-mingw* | *-*-os2*) - case ":$dllsearchpath:" in - *":$libdir:"*) ;; - *) dllsearchpath="$dllsearchpath:$libdir";; - esac - ;; - esac - done - # Substitute the hardcoded libdirs into the rpath. - if test -n "$hardcode_libdir_separator" && - test -n "$hardcode_libdirs"; then - libdir="$hardcode_libdirs" - eval rpath=\" $hardcode_libdir_flag_spec\" - fi - compile_rpath="$rpath" - - rpath= - hardcode_libdirs= - for libdir in $finalize_rpath; do - if test -n "$hardcode_libdir_flag_spec"; then - if test -n "$hardcode_libdir_separator"; then - if test -z "$hardcode_libdirs"; then - hardcode_libdirs="$libdir" - else - # Just accumulate the unique libdirs. - case "$hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator" in - *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) - ;; - *) - hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag=\"$hardcode_libdir_flag_spec\" - rpath="$rpath $flag" - fi - elif test -n "$runpath_var"; then - case "$finalize_perm_rpath " in - *" $libdir "*) ;; - *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; - esac - fi - done - # Substitute the hardcoded libdirs into the rpath. - if test -n "$hardcode_libdir_separator" && - test -n "$hardcode_libdirs"; then - libdir="$hardcode_libdirs" - eval rpath=\" $hardcode_libdir_flag_spec\" - fi - finalize_rpath="$rpath" - - if test -n "$libobjs" && test "$build_old_libs" = yes; then - # Transform all the library objects into standard objects. - compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` - finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` - fi - - dlsyms= - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - if test -n "$NM" && test -n "$global_symbol_pipe"; then - dlsyms="${outputname}S.c" - else - $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2 - fi - fi - - if test -n "$dlsyms"; then - case "$dlsyms" in - "") ;; - *.c) - # Discover the nlist of each of the dlfiles. - nlist="$output_objdir/${outputname}.nm" - - $show "$rm $nlist ${nlist}S ${nlist}T" - $run $rm "$nlist" "${nlist}S" "${nlist}T" - - # Parse the name list into a source file. - $show "creating $output_objdir/$dlsyms" - - test -z "$run" && $echo > "$output_objdir/$dlsyms" "\ -/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */ -/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */ - -#ifdef __cplusplus -extern \"C\" { -#endif - -/* Prevent the only kind of declaration conflicts we can make. */ -#define lt_preloaded_symbols some_other_symbol - -/* External symbol declarations for the compiler. */\ -" - - if test "$dlself" = yes; then - $show "generating symbol list for \`$output'" - - test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist" - - # Add our own program objects to the symbol list. - progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` - for arg in $progfiles; do - $show "extracting global C symbols from \`$arg'" - $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" - done - - if test -n "$exclude_expsyms"; then - $run eval 'egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' - $run eval '$mv "$nlist"T "$nlist"' - fi - - if test -n "$export_symbols_regex"; then - $run eval 'egrep -e "$export_symbols_regex" "$nlist" > "$nlist"T' - $run eval '$mv "$nlist"T "$nlist"' - fi - - # Prepare the list of exported symbols - if test -z "$export_symbols"; then - export_symbols="$output_objdir/$output.exp" - $run $rm $export_symbols - $run eval "sed -n -e '/^: @PROGRAM@$/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' - else - $run eval "sed -e 's/\([][.*^$]\)/\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$output.exp"' - $run eval 'grep -f "$output_objdir/$output.exp" < "$nlist" > "$nlist"T' - $run eval 'mv "$nlist"T "$nlist"' - fi - fi - - for arg in $dlprefiles; do - $show "extracting global C symbols from \`$arg'" - name=`echo "$arg" | sed -e 's%^.*/%%'` - $run eval 'echo ": $name " >> "$nlist"' - $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" - done - - if test -z "$run"; then - # Make sure we have at least an empty file. - test -f "$nlist" || : > "$nlist" - - if test -n "$exclude_expsyms"; then - egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T - $mv "$nlist"T "$nlist" - fi - - # Try sorting and uniquifying the output. - if grep -v "^: " < "$nlist" | sort +2 | uniq > "$nlist"S; then - : - else - grep -v "^: " < "$nlist" > "$nlist"S - fi - - if test -f "$nlist"S; then - eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"' - else - echo '/* NONE */' >> "$output_objdir/$dlsyms" - fi - - $echo >> "$output_objdir/$dlsyms" "\ - -#undef lt_preloaded_symbols - -#if defined (__STDC__) && __STDC__ -# define lt_ptr_t void * -#else -# define lt_ptr_t char * -# define const -#endif - -/* The mapping between symbol names and symbols. */ -const struct { - const char *name; - lt_ptr_t address; -} -lt_preloaded_symbols[] = -{\ -" - - sed -n -e 's/^: \([^ ]*\) $/ {\"\1\", (lt_ptr_t) 0},/p' \ - -e 's/^. \([^ ]*\) \([^ ]*\)$/ {"\2", (lt_ptr_t) \&\2},/p' \ - < "$nlist" >> "$output_objdir/$dlsyms" - - $echo >> "$output_objdir/$dlsyms" "\ - {0, (lt_ptr_t) 0} -}; - -/* This works around a problem in FreeBSD linker */ -#ifdef FREEBSD_WORKAROUND -static const void *lt_preloaded_setup() { - return lt_preloaded_symbols; -} -#endif - -#ifdef __cplusplus -} -#endif\ -" - fi - - pic_flag_for_symtable= - case "$host" in - # compiling the symbol table file with pic_flag works around - # a FreeBSD bug that causes programs to crash when -lm is - # linked before any other PIC object. But we must not use - # pic_flag when linking with -static. The problem exists in - # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. - *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) - case "$compile_command " in - *" -static "*) ;; - *) pic_flag_for_symtable=" $pic_flag -DPIC -DFREEBSD_WORKAROUND";; - esac;; - *-*-hpux*) - case "$compile_command " in - *" -static "*) ;; - *) pic_flag_for_symtable=" $pic_flag -DPIC";; - esac - esac - - # Now compile the dynamic symbol file. - $show "(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" - $run eval '(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? - - # Clean up the generated files. - $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T" - $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T" - - # Transform the symbol file into the correct name. - compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` - finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` - ;; - *) - $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 - exit 1 - ;; - esac - else - # We keep going just in case the user didn't refer to - # lt_preloaded_symbols. The linker will fail if global_symbol_pipe - # really was required. - - # Nullify the symbol file. - compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"` - finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"` - fi - - if test -z "$link_against_libtool_libs" || test "$build_libtool_libs" != yes; then - # Replace the output file specification. - compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` - link_command="$compile_command$compile_rpath" - - # We have no uninstalled library dependencies, so finalize right now. - $show "$link_command" - $run eval "$link_command" - status=$? - - # Delete the generated files. - if test -n "$dlsyms"; then - $show "$rm $output_objdir/${outputname}S.${objext}" - $run $rm "$output_objdir/${outputname}S.${objext}" - fi - - exit $status - fi - - if test -n "$shlibpath_var"; then - # We should set the shlibpath_var - rpath= - for dir in $temp_rpath; do - case "$dir" in - [\\/]* | [A-Za-z]:[\\/]*) - # Absolute path. - rpath="$rpath$dir:" - ;; - *) - # Relative path: add a thisdir entry. - rpath="$rpath\$thisdir/$dir:" - ;; - esac - done - temp_rpath="$rpath" - fi - - if test -n "$compile_shlibpath$finalize_shlibpath"; then - compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" - fi - if test -n "$finalize_shlibpath"; then - finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" - fi - - compile_var= - finalize_var= - if test -n "$runpath_var"; then - if test -n "$perm_rpath"; then - # We should set the runpath_var. - rpath= - for dir in $perm_rpath; do - rpath="$rpath$dir:" - done - compile_var="$runpath_var=\"$rpath\$$runpath_var\" " - fi - if test -n "$finalize_perm_rpath"; then - # We should set the runpath_var. - rpath= - for dir in $finalize_perm_rpath; do - rpath="$rpath$dir:" - done - finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " - fi - fi - - if test "$no_install" = yes; then - # We don't need to create a wrapper script. - link_command="$compile_var$compile_command$compile_rpath" - # Replace the output file specification. - link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` - # Delete the old output file. - $run $rm $output - # Link the executable and exit - $show "$link_command" - $run eval "$link_command" || exit $? - exit 0 - fi - - if test "$hardcode_action" = relink || test "$hardcode_into_libs" = all; then - # Fast installation is not supported - link_command="$compile_var$compile_command$compile_rpath" - relink_command="$finalize_var$finalize_command$finalize_rpath" - - $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2 - $echo "$modename: \`$output' will be relinked during installation" 1>&2 - else - if test "$fast_install" != no; then - link_command="$finalize_var$compile_command$finalize_rpath" - if test "$fast_install" = yes; then - relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'` - else - # fast_install is set to needless - relink_command= - fi - else - link_command="$compile_var$compile_command$compile_rpath" - relink_command="$finalize_var$finalize_command$finalize_rpath" - fi - fi - - # Replace the output file specification. - link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` - - # Delete the old output files. - $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname - - $show "$link_command" - $run eval "$link_command" || exit $? - - # Now create the wrapper script. - $show "creating $output" - - # Quote the relink command for shipping. - if test -n "$relink_command"; then - relink_command="cd `pwd`; $relink_command" - relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` - fi - - # Quote $echo for shipping. - if test "X$echo" = "X$SHELL $0 --fallback-echo"; then - case "$0" in - [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $0 --fallback-echo";; - *) qecho="$SHELL `pwd`/$0 --fallback-echo";; - esac - qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"` - else - qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"` - fi - - # Only actually do things if our run command is non-null. - if test -z "$run"; then - # win32 will think the script is a binary if it has - # a .exe suffix, so we strip it off here. - case $output in - *.exe) output=`echo $output|sed 's,.exe$,,'` ;; - esac - $rm $output - trap "$rm $output; exit 1" 1 2 15 - - $echo > $output "\ -#! $SHELL - -# $output - temporary wrapper script for $objdir/$outputname -# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP -# -# The $output program cannot be directly executed until all the libtool -# libraries that it depends on are installed. -# -# This wrapper script should never be moved out of the build directory. -# If it is, it will not operate correctly. - -# Sed substitution that helps us do robust quoting. It backslashifies -# metacharacters that are still active within double-quoted strings. -Xsed='sed -e 1s/^X//' -sed_quote_subst='$sed_quote_subst' - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -if test \"\${CDPATH+set}\" = set; then CDPATH=:; export CDPATH; fi - -relink_command=\"$relink_command\" - -# This environment variable determines our operation mode. -if test \"\$libtool_install_magic\" = \"$magic\"; then - # install mode needs the following variable: - link_against_libtool_libs='$link_against_libtool_libs' -else - # When we are sourced in execute mode, \$file and \$echo are already set. - if test \"\$libtool_execute_magic\" != \"$magic\"; then - echo=\"$qecho\" - file=\"\$0\" - # Make sure echo works. - if test \"X\$1\" = X--no-reexec; then - # Discard the --no-reexec flag, and continue. - shift - elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then - # Yippee, \$echo works! - : - else - # Restart under the correct shell, and then maybe \$echo will work. - exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} - fi - fi\ -" - $echo >> $output "\ - - # Find the directory that this script lives in. - thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` - test \"x\$thisdir\" = \"x\$file\" && thisdir=. - - # Follow symbolic links until we get to the real thisdir. - file=\`ls -ld \"\$file\" | sed -n 's/.*-> //p'\` - while test -n \"\$file\"; do - destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` - - # If there was a directory component, then change thisdir. - if test \"x\$destdir\" != \"x\$file\"; then - case \"\$destdir\" in - [\\/]* | [A-Za-z]:[\\/]*) thisdir=\"\$destdir\" ;; - *) thisdir=\"\$thisdir/\$destdir\" ;; - esac - fi - - file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\` - file=\`ls -ld \"\$thisdir/\$file\" | sed -n 's/.*-> //p'\` - done - - # Try to get the absolute directory name. - absdir=\`cd \"\$thisdir\" && pwd\` - test -n \"\$absdir\" && thisdir=\"\$absdir\" -" - - if test "$fast_install" = yes; then - echo >> $output "\ - program=lt-'$outputname' - progdir=\"\$thisdir/$objdir\" - - if test ! -f \"\$progdir/\$program\" || \\ - { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | sed 1q\`; \\ - test \"X\$file\" != \"X\$progdir/\$program\"; }; then - - file=\"\$\$-\$program\" - - if test ! -d \"\$progdir\"; then - $mkdir \"\$progdir\" - else - $rm \"\$progdir/\$file\" - fi" - - echo >> $output "\ - - # relink executable if necessary - if test -n \"\$relink_command\"; then - if (eval \$relink_command); then : - else - $rm \"\$progdir/\$file\" - exit 1 - fi - fi - - $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || - { $rm \"\$progdir/\$program\"; - $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; } - $rm \"\$progdir/\$file\" - fi" - else - echo >> $output "\ - program='$outputname' - progdir=\"\$thisdir/$objdir\" -" - fi - - echo >> $output "\ - - if test -f \"\$progdir/\$program\"; then" - - # Export our shlibpath_var if we have one. - if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then - $echo >> $output "\ - # Add our own library path to $shlibpath_var - $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" - - # Some systems cannot cope with colon-terminated $shlibpath_var - # The second colon is a workaround for a bug in BeOS R4 sed - $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` - - export $shlibpath_var -" - fi - - # fixup the dll searchpath if we need to. - if test -n "$dllsearchpath"; then - $echo >> $output "\ - # Add the dll search path components to the executable PATH - PATH=$dllsearchpath:\$PATH -" - fi - - $echo >> $output "\ - if test \"\$libtool_execute_magic\" != \"$magic\"; then - # Run the actual program with our arguments. -" - case $host in - *-*-cygwin* | *-*-mingw | *-*-os2*) - # win32 systems need to use the prog path for dll - # lookup to work - $echo >> $output "\ - exec \$progdir\\\\\$program \${1+\"\$@\"} -" - ;; - *) - $echo >> $output "\ - # Export the path to the program. - PATH=\"\$progdir:\$PATH\" - export PATH - - exec \$program \${1+\"\$@\"} -" - ;; - esac - $echo >> $output "\ - \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\" - exit 1 - fi - else - # The program doesn't exist. - \$echo \"\$0: error: \$progdir/\$program does not exist\" 1>&2 - \$echo \"This script is just a wrapper for \$program.\" 1>&2 - echo \"See the $PACKAGE documentation for more information.\" 1>&2 - exit 1 - fi -fi\ -" - chmod +x $output - fi - exit 0 - ;; - esac - - # See if we need to build an old-fashioned archive. - for oldlib in $oldlibs; do - - if test "$build_libtool_libs" = convenience; then - oldobjs="$libobjs_save" - addlibs="$convenience" - build_libtool_libs=no - else - if test "$build_libtool_libs" = module; then - oldobjs="$libobjs_save" - build_libtool_libs=no - else - oldobjs="$objs$old_deplibs "`$echo "X$libobjs_save" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP` - fi - addlibs="$old_convenience" - fi - - if test -n "$addlibs"; then - gentop="$output_objdir/${outputname}x" - $show "${rm}r $gentop" - $run ${rm}r "$gentop" - $show "mkdir $gentop" - $run mkdir "$gentop" - status=$? - if test $status -ne 0 && test ! -d "$gentop"; then - exit $status - fi - generated="$generated $gentop" - - # Add in members from convenience archives. - for xlib in $addlibs; do - # Extract the objects. - case "$xlib" in - [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; - *) xabs=`pwd`"/$xlib" ;; - esac - xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` - xdir="$gentop/$xlib" - - $show "${rm}r $xdir" - $run ${rm}r "$xdir" - $show "mkdir $xdir" - $run mkdir "$xdir" - status=$? - if test $status -ne 0 && test ! -d "$xdir"; then - exit $status - fi - $show "(cd $xdir && $AR x $xabs)" - $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? - - oldobjs="$oldobjs "`find $xdir -name \*.${objext} -print -o -name \*.lo -print | $NL2SP` - done - fi - - # Do each command in the archive commands. - if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then - eval cmds=\"$old_archive_from_new_cmds\" - else - # Ensure that we have .o objects in place in case we decided - # not to build a shared library, and have fallen back to building - # static libs even though --disable-static was passed! - for oldobj in $oldobjs; do - if test ! -f $oldobj; then - xdir=`$echo "X$oldobj" | $Xsed -e 's%/[^/]*$%%'` - if test "X$xdir" = "X$oldobj"; then - xdir="." - else - xdir="$xdir" - fi - baseobj=`$echo "X$oldobj" | $Xsed -e 's%^.*/%%'` - obj=`$echo "X$baseobj" | $Xsed -e "$o2lo"` - $show "(cd $xdir && ${LN_S} $obj $baseobj)" - $run eval '(cd $xdir && ${LN_S} $obj $baseobj)' || exit $? - fi - done - - eval cmds=\"$old_archive_cmds\" - fi - IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - done - - if test -n "$generated"; then - $show "${rm}r$generated" - $run ${rm}r$generated - fi - - # Now create the libtool archive. - case "$output" in - *.la) - old_library= - test "$build_old_libs" = yes && old_library="$libname.$libext" - $show "creating $output" - - # Quote the link command for shipping. - relink_command="cd `pwd`; $SHELL $0 --mode=relink $libtool_args" - relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` - - # Only create the output if not a dry run. - if test -z "$run"; then - for installed in no yes; do - if test "$installed" = yes; then - if test -z "$install_libdir"; then - break - fi - output="$output_objdir/$outputname"i - # Replace all uninstalled libtool libraries with the installed ones - newdependency_libs= - for deplib in $dependency_libs; do - case "$deplib" in - *.la) - name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'` - eval libdir=`sed -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` - if test -z "$libdir"; then - $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 - exit 1 - fi - newdependency_libs="$newdependency_libs $libdir/$name" - ;; - *) newdependency_libs="$newdependency_libs $deplib" ;; - esac - done - dependency_libs="$newdependency_libs" - newdlfiles= - for lib in $dlfiles; do - name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` - eval libdir=`sed -n -e 's/^libdir=\(.*\)$/\1/p' $lib` - if test -z "$libdir"; then - $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 - exit 1 - fi - newdlfiles="$newdlfiles $libdir/$name" - done - dlfiles="$newdlfiles" - newdlprefiles= - for lib in $dlprefiles; do - name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` - eval libdir=`sed -n -e 's/^libdir=\(.*\)$/\1/p' $lib` - if test -z "$libdir"; then - $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 - exit 1 - fi - newdlprefiles="$newdlprefiles $libdir/$name" - done - dlprefiles="$newdlprefiles" - fi - $rm $output - $echo > $output "\ -# $outputname - a libtool library file -# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='$dlname' - -# Names of this library. -library_names='$library_names' - -# The name of the static archive. -old_library='$old_library' - -# Libraries that this one depends upon. -dependency_libs='$dependency_libs' - -# Version information for $libname. -current=$current -age=$age -revision=$revision - -# Is this an already installed library? -installed=$installed - -# Files to dlopen/dlpreopen -dlopen='$dlfiles' -dlpreopen='$dlprefiles' - -# Directory that this library needs to be installed in: -libdir='$install_libdir'" - if test "$installed" = no; then - $echo >> $output "\ -relink_command=\"$relink_command\"" - fi - done - fi - - # Do a symbolic link so that the libtool archive can be found in - # LD_LIBRARY_PATH before the program is installed. - $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" - $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $? - ;; - esac - exit 0 - ;; - - # libtool install mode - install) - modename="$modename: install" - - # There may be an optional sh(1) argument at the beginning of - # install_prog (especially on Windows NT). - if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh; then - # Aesthetically quote it. - arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"` - case "$arg" in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) - arg="\"$arg\"" - ;; - esac - install_prog="$arg " - arg="$1" - shift - else - install_prog= - arg="$nonopt" - fi - - # The real first argument should be the name of the installation program. - # Aesthetically quote it. - arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` - case "$arg" in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) - arg="\"$arg\"" - ;; - esac - install_prog="$install_prog$arg" - - # We need to accept at least all the BSD install flags. - dest= - files= - opts= - prev= - install_type= - isdir=no - stripme= - for arg - do - if test -n "$dest"; then - files="$files $dest" - dest="$arg" - continue - fi - - case "$arg" in - -d) isdir=yes ;; - -f) prev="-f" ;; - -g) prev="-g" ;; - -m) prev="-m" ;; - -o) prev="-o" ;; - -s) - stripme=" -s" - continue - ;; - -*) ;; - - *) - # If the previous option needed an argument, then skip it. - if test -n "$prev"; then - prev= - else - dest="$arg" - continue - fi - ;; - esac - - # Aesthetically quote the argument. - arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` - case "$arg" in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) - arg="\"$arg\"" - ;; - esac - install_prog="$install_prog $arg" - done - - if test -z "$install_prog"; then - $echo "$modename: you must specify an install program" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - - if test -n "$prev"; then - $echo "$modename: the \`$prev' option requires an argument" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - - if test -z "$files"; then - if test -z "$dest"; then - $echo "$modename: no file or destination specified" 1>&2 - else - $echo "$modename: you must specify a destination" 1>&2 - fi - $echo "$help" 1>&2 - exit 1 - fi - - # Strip any trailing slash from the destination. - dest=`$echo "X$dest" | $Xsed -e 's%/$%%'` - - # Check to see that the destination is a directory. - test -d "$dest" && isdir=yes - if test "$isdir" = yes; then - destdir="$dest" - destname= - else - destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'` - test "X$destdir" = "X$dest" && destdir=. - destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'` - - # Not a directory, so check to see that there is only one file specified. - set dummy $files - if test $# -gt 2; then - $echo "$modename: \`$dest' is not a directory" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - fi - case "$destdir" in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - for file in $files; do - case "$file" in - *.lo) ;; - *) - $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2 - $echo "$help" 1>&2 - exit 1 - ;; - esac - done - ;; - esac - - # This variable tells wrapper scripts just to set variables rather - # than running their programs. - libtool_install_magic="$magic" - - staticlibs= - future_libdirs= - current_libdirs= - for file in $files; do - - # Do each installation. - case "$file" in - *.$libext) - # Do the static libraries later. - staticlibs="$staticlibs $file" - ;; - - *.la) - # Check to see that this really is a libtool archive. - if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : - else - $echo "$modename: \`$file' is not a valid libtool archive" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - - library_names= - old_library= - relink_command= - # If there is no directory component, then add one. - case "$file" in - */* | *\\*) . $file ;; - *) . ./$file ;; - esac - - # Add the libdir to current_libdirs if it is the destination. - if test "X$destdir" = "X$libdir"; then - case "$current_libdirs " in - *" $libdir "*) ;; - *) current_libdirs="$current_libdirs $libdir" ;; - esac - else - # Note the libdir as a future libdir. - case "$future_libdirs " in - *" $libdir "*) ;; - *) future_libdirs="$future_libdirs $libdir" ;; - esac - fi - - dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/ - test "X$dir" = "X$file/" && dir= - dir="$dir$objdir" - - if test "$hardcode_into_libs" = all; then - if test -z "$relink_command"; then - $echo "$modename: invalid libtool pseudo library \`$file'" 1>&2 - exit 1 - fi - $echo "$modename: warning: relinking \`$file'" 1>&2 - $show "$relink_command" - if $run eval "$relink_command"; then : - else - $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 - continue - fi - fi - - # See the names of the shared library. - set dummy $library_names - if test -n "$2"; then - realname="$2" - shift - shift - - srcname="$realname" - test "$hardcode_into_libs" = all && srcname="$realname"T - - # Install the shared library and build the symlinks. - $show "$install_prog $dir/$srcname $destdir/$realname" - $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $? - if test -n "$stripme" && test -n "$striplib"; then - $show "$striplib $destdir/$realname" - $run eval "$striplib $destdir/$realname" || exit $? - fi - - if test $# -gt 0; then - # Delete the old symlinks, and create new ones. - for linkname - do - if test "$linkname" != "$realname"; then - $show "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)" - $run eval "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)" - fi - done - fi - - # Do each command in the postinstall commands. - lib="$destdir/$realname" - eval cmds=\"$postinstall_cmds\" - IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - fi - - # Install the pseudo-library for information purposes. - name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` - instname="$dir/$name"i - $show "$install_prog $instname $destdir/$name" - $run eval "$install_prog $instname $destdir/$name" || exit $? - - # Maybe install the static library, too. - test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" - ;; - - *.lo) - # Install (i.e. copy) a libtool object. - - # Figure out destination file name, if it wasn't already specified. - if test -n "$destname"; then - destfile="$destdir/$destname" - else - destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` - destfile="$destdir/$destfile" - fi - - # Deduce the name of the destination old-style object file. - case "$destfile" in - *.lo) - staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"` - ;; - *.$objext) - staticdest="$destfile" - destfile= - ;; - *) - $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2 - $echo "$help" 1>&2 - exit 1 - ;; - esac - - # Install the libtool object if requested. - if test -n "$destfile"; then - $show "$install_prog $file $destfile" - $run eval "$install_prog $file $destfile" || exit $? - fi - - # Install the old object if enabled. - if test "$build_old_libs" = yes; then - # Deduce the name of the old-style object file. - staticobj=`$echo "X$file" | $Xsed -e "$lo2o"` - - $show "$install_prog $staticobj $staticdest" - $run eval "$install_prog \$staticobj \$staticdest" || exit $? - fi - exit 0 - ;; - - *) - # Figure out destination file name, if it wasn't already specified. - if test -n "$destname"; then - destfile="$destdir/$destname" - else - destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` - destfile="$destdir/$destfile" - fi - - # Do a test to see if this is really a libtool program. - if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then - link_against_libtool_libs= - relink_command= - - # If there is no directory component, then add one. - case "$file" in - */* | *\\*) . $file ;; - *) . ./$file ;; - esac - - # Check the variables that should have been set. - if test -z "$link_against_libtool_libs"; then - $echo "$modename: invalid libtool wrapper script \`$file'" 1>&2 - exit 1 - fi - - finalize=yes - for lib in $link_against_libtool_libs; do - # Check to see that each library is installed. - libdir= - if test -f "$lib"; then - # If there is no directory component, then add one. - case "$lib" in - */* | *\\*) . $lib ;; - *) . ./$lib ;; - esac - fi - libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test - if test -n "$libdir" && test ! -f "$libfile"; then - $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2 - finalize=no - fi - done - - relink_command= - # If there is no directory component, then add one. - case "$file" in - */* | *\\*) . $file ;; - *) . ./$file ;; - esac - - outputname= - if test "$fast_install" = no && test -n "$relink_command"; then - if test "$finalize" = yes && test -z "$run"; then - tmpdir="/tmp" - test -n "$TMPDIR" && tmpdir="$TMPDIR" - tmpdir="$tmpdir/libtool-$$" - if $mkdir -p "$tmpdir" && chmod 700 "$tmpdir"; then : - else - $echo "$modename: error: cannot create temporary directory \`$tmpdir'" 1>&2 - continue - fi - outputname="$tmpdir/$file" - # Replace the output file specification. - relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` - - $show "$relink_command" - if $run eval "$relink_command"; then : - else - $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 - ${rm}r "$tmpdir" - continue - fi - file="$outputname" - else - $echo "$modename: warning: cannot relink \`$file'" 1>&2 - fi - else - # Install the binary that we compiled earlier. - file=`$echo "X$file" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` - fi - fi - - $show "$install_prog$stripme $file $destfile" - $run eval "$install_prog\$stripme \$file \$destfile" || exit $? - test -n "$outputname" && ${rm}r "$tmpdir" - ;; - esac - done - - for file in $staticlibs; do - name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` - - # Set up the ranlib parameters. - oldlib="$destdir/$name" - - $show "$install_prog $file $oldlib" - $run eval "$install_prog \$file \$oldlib" || exit $? - - if test -n "$stripme" && test -n "$striplib"; then - $show "$old_striplib $oldlib" - $run eval "$old_striplib $oldlib" || exit $? - fi - - # Do each command in the postinstall commands. - eval cmds=\"$old_postinstall_cmds\" - IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - done - - if test -n "$future_libdirs"; then - $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2 - fi - - if test -n "$current_libdirs"; then - # Maybe just do a dry run. - test -n "$run" && current_libdirs=" -n$current_libdirs" - exec $SHELL $0 --finish$current_libdirs - exit 1 - fi - - exit 0 - ;; - - # libtool finish mode - finish) - modename="$modename: finish" - libdirs="$nonopt" - admincmds= - - if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then - for dir - do - libdirs="$libdirs $dir" - done - - for libdir in $libdirs; do - if test -n "$finish_cmds"; then - # Do each command in the finish commands. - eval cmds=\"$finish_cmds\" - IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || admincmds="$admincmds - $cmd" - done - IFS="$save_ifs" - fi - if test -n "$finish_eval"; then - # Do the single finish_eval. - eval cmds=\"$finish_eval\" - $run eval "$cmds" || admincmds="$admincmds - $cmds" - fi - done - fi - - # Exit here if they wanted silent mode. - test "$show" = : && exit 0 - - echo "----------------------------------------------------------------------" - echo "Libraries have been installed in:" - for libdir in $libdirs; do - echo " $libdir" - done - echo - echo "If you ever happen to want to link against installed libraries" - echo "in a given directory, LIBDIR, you must either use libtool, and" - echo "specify the full pathname of the library, or use \`-LLIBDIR'" - echo "flag during linking and do at least one of the following:" - if test -n "$shlibpath_var"; then - echo " - add LIBDIR to the \`$shlibpath_var' environment variable" - echo " during execution" - fi - if test -n "$runpath_var"; then - echo " - add LIBDIR to the \`$runpath_var' environment variable" - echo " during linking" - fi - if test -n "$hardcode_libdir_flag_spec"; then - libdir=LIBDIR - eval flag=\"$hardcode_libdir_flag_spec\" - - echo " - use the \`$flag' linker flag" - fi - if test -n "$admincmds"; then - echo " - have your system administrator run these commands:$admincmds" - fi - if test -f /etc/ld.so.conf; then - echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" - fi - echo - echo "See any operating system documentation about shared libraries for" - echo "more information, such as the ld(1) and ld.so(8) manual pages." - echo "----------------------------------------------------------------------" - exit 0 - ;; - - # libtool execute mode - execute) - modename="$modename: execute" - - # The first argument is the command name. - cmd="$nonopt" - if test -z "$cmd"; then - $echo "$modename: you must specify a COMMAND" 1>&2 - $echo "$help" - exit 1 - fi - - # Handle -dlopen flags immediately. - for file in $execute_dlfiles; do - if test ! -f "$file"; then - $echo "$modename: \`$file' is not a file" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - - dir= - case "$file" in - *.la) - # Check to see that this really is a libtool archive. - if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : - else - $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - - # Read the libtool library. - dlname= - library_names= - - # If there is no directory component, then add one. - case "$file" in - */* | *\\*) . $file ;; - *) . ./$file ;; - esac - - # Skip this library if it cannot be dlopened. - if test -z "$dlname"; then - # Warn if it was a shared library. - test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'" - continue - fi - - dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` - test "X$dir" = "X$file" && dir=. - - if test -f "$dir/$objdir/$dlname"; then - dir="$dir/$objdir" - else - $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2 - exit 1 - fi - ;; - - *.lo) - # Just add the directory containing the .lo file. - dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` - test "X$dir" = "X$file" && dir=. - ;; - - *) - $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2 - continue - ;; - esac - - # Get the absolute pathname. - absdir=`cd "$dir" && pwd` - test -n "$absdir" && dir="$absdir" - - # Now add the directory to shlibpath_var. - if eval "test -z \"\$$shlibpath_var\""; then - eval "$shlibpath_var=\"\$dir\"" - else - eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" - fi - done - - # This variable tells wrapper scripts just to set shlibpath_var - # rather than running their programs. - libtool_execute_magic="$magic" - - # Check if any of the arguments is a wrapper script. - args= - for file - do - case "$file" in - -*) ;; - *) - # Do a test to see if this is really a libtool program. - if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then - # If there is no directory component, then add one. - case "$file" in - */* | *\\*) . $file ;; - *) . ./$file ;; - esac - - # Transform arg to wrapped name. - file="$progdir/$program" - fi - ;; - esac - # Quote arguments (to preserve shell metacharacters). - file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"` - args="$args \"$file\"" - done - - if test -z "$run"; then - if test -n "$shlibpath_var"; then - # Export the shlibpath_var. - eval "export $shlibpath_var" - fi - - # Restore saved enviroment variables - if test "${save_LC_ALL+set}" = set; then - LC_ALL="$save_LC_ALL"; export LC_ALL - fi - if test "${save_LANG+set}" = set; then - LANG="$save_LANG"; export LANG - fi - - # Now actually exec the command. - eval "exec \$cmd$args" - - $echo "$modename: cannot exec \$cmd$args" - exit 1 - else - # Display what would be done. - if test -n "$shlibpath_var"; then - eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\"" - $echo "export $shlibpath_var" - fi - $echo "$cmd$args" - exit 0 - fi - ;; - - # libtool clean and uninstall mode - clean | uninstall) - modename="$modename: $mode" - rm="$nonopt" - files= - - # This variable tells wrapper scripts just to set variables rather - # than running their programs. - libtool_install_magic="$magic" - - for arg - do - case "$arg" in - -*) rm="$rm $arg" ;; - *) files="$files $arg" ;; - esac - done - - if test -z "$rm"; then - $echo "$modename: you must specify an RM program" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - - for file in $files; do - dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` - if test "X$dir" = "X$file"; then - dir=. - objdir="$objdir" - else - objdir="$dir/$objdir" - fi - name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` - test $mode = uninstall && objdir="$dir" - - rmfiles="$file" - - case "$name" in - *.la) - # Possibly a libtool archive, so verify it. - if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then - . $dir/$name - - # Delete the libtool libraries and symlinks. - for n in $library_names; do - rmfiles="$rmfiles $objdir/$n" - done - test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" - test $mode = clean && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" - - if test $mode = uninstall; then - if test -n "$library_names"; then - # Do each command in the postuninstall commands. - eval cmds=\"$postuninstall_cmds\" - IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" - done - IFS="$save_ifs" - fi - - if test -n "$old_library"; then - # Do each command in the old_postuninstall commands. - eval cmds=\"$old_postuninstall_cmds\" - IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" - done - IFS="$save_ifs" - fi - # FIXME: should reinstall the best remaining shared library. - fi - fi - ;; - - *.lo) - if test "$build_old_libs" = yes; then - oldobj=`$echo "X$name" | $Xsed -e "$lo2o"` - rmfiles="$rmfiles $dir/$oldobj" - fi - ;; - - *) - # Do a test to see if this is a libtool program. - if test $mode = clean && - (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then - relink_command= - . $dir/$file - - rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" - if test "$fast_install" = yes && test -n "$relink_command"; then - rmfiles="$rmfiles $objdir/lt-$name" - fi - fi - ;; - esac - $show "$rm $rmfiles" - $run $rm $rmfiles - done - exit 0 - ;; - - "") - $echo "$modename: you must specify a MODE" 1>&2 - $echo "$generic_help" 1>&2 - exit 1 - ;; - esac - - $echo "$modename: invalid operation mode \`$mode'" 1>&2 - $echo "$generic_help" 1>&2 - exit 1 -fi # test -z "$show_help" - -# We need to display help for each of the modes. -case "$mode" in -"") $echo \ -"Usage: $modename [OPTION]... [MODE-ARG]... - -Provide generalized library-building support services. - - --config show all configuration variables - --debug enable verbose shell tracing --n, --dry-run display commands without modifying any files - --features display basic configuration information and exit - --finish same as \`--mode=finish' - --help display this help message and exit - --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS] - --quiet same as \`--silent' - --silent don't print informational messages - --version print version information - -MODE must be one of the following: - - clean remove files from the build directory - compile compile a source file into a libtool object - execute automatically set library path, then run a program - finish complete the installation of libtool libraries - install install libraries or executables - link create a library or an executable - uninstall remove libraries from an installed directory - -MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for -a more detailed description of MODE." - exit 0 - ;; - -clean) - $echo \ -"Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE... - -Remove files from the build directory. - -RM is the name of the program to use to delete files associated with each FILE -(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed -to RM. - -If FILE is a libtool library, object or program, all the files associated -with it are deleted. Otherwise, only FILE itself is deleted using RM." - ;; - -compile) - $echo \ -"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE - -Compile a source file into a libtool library object. - -This mode accepts the following additional options: - - -o OUTPUT-FILE set the output file name to OUTPUT-FILE - -static always build a \`.o' file suitable for static linking - -COMPILE-COMMAND is a command to be used in creating a \`standard' object file -from the given SOURCEFILE. - -The output file name is determined by removing the directory component from -SOURCEFILE, then substituting the C source code suffix \`.c' with the -library object suffix, \`.lo'." - ;; - -execute) - $echo \ -"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]... - -Automatically set library path, then run a program. - -This mode accepts the following additional options: - - -dlopen FILE add the directory containing FILE to the library path - -This mode sets the library path environment variable according to \`-dlopen' -flags. - -If any of the ARGS are libtool executable wrappers, then they are translated -into their corresponding uninstalled binary, and any of their required library -directories are added to the library path. - -Then, COMMAND is executed, with ARGS as arguments." - ;; - -finish) - $echo \ -"Usage: $modename [OPTION]... --mode=finish [LIBDIR]... - -Complete the installation of libtool libraries. - -Each LIBDIR is a directory that contains libtool libraries. - -The commands that this mode executes may require superuser privileges. Use -the \`--dry-run' option if you just want to see what would be executed." - ;; - -install) - $echo \ -"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND... - -Install executables or libraries. - -INSTALL-COMMAND is the installation command. The first component should be -either the \`install' or \`cp' program. - -The rest of the components are interpreted as arguments to that command (only -BSD-compatible install options are recognized)." - ;; - -link) - $echo \ -"Usage: $modename [OPTION]... --mode=link LINK-COMMAND... - -Link object files or libraries together to form another library, or to -create an executable program. - -LINK-COMMAND is a command using the C compiler that you would use to create -a program from several object files. - -The following components of LINK-COMMAND are treated specially: - - -all-static do not do any dynamic linking at all - -avoid-version do not add a version suffix if possible - -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime - -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols - -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) - -export-symbols SYMFILE - try to export only the symbols listed in SYMFILE - -export-symbols-regex REGEX - try to export only the symbols matching REGEX - -LLIBDIR search LIBDIR for required installed libraries - -lNAME OUTPUT-FILE requires the installed library libNAME - -module build a library that can dlopened - -no-fast-install disable the fast-install mode - -no-install link a not-installable executable - -no-undefined declare that a library does not refer to external symbols - -o OUTPUT-FILE create OUTPUT-FILE from the specified objects - -release RELEASE specify package release information - -rpath LIBDIR the created library will eventually be installed in LIBDIR - -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries - -static do not do any dynamic linking of libtool libraries - -version-info CURRENT[:REVISION[:AGE]] - specify library version info [each variable defaults to 0] - -All other options (arguments beginning with \`-') are ignored. - -Every other argument is treated as a filename. Files ending in \`.la' are -treated as uninstalled libtool libraries, other files are standard or library -object files. - -If the OUTPUT-FILE ends in \`.la', then a libtool library is created, -only library objects (\`.lo' files) may be specified, and \`-rpath' is -required, except when creating a convenience library. - -If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created -using \`ar' and \`ranlib', or on Windows using \`lib'. - -If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file -is created, otherwise an executable program is created." - ;; - -uninstall) - $echo \ -"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... - -Remove libraries from an installation directory. - -RM is the name of the program to use to delete files associated with each FILE -(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed -to RM. - -If FILE is a libtool library, all the files associated with it are deleted. -Otherwise, only FILE itself is deleted using RM." - ;; - -*) - $echo "$modename: invalid operation mode \`$mode'" 1>&2 - $echo "$help" 1>&2 - exit 1 - ;; -esac - -echo -$echo "Try \`$modename --help' for more information about other modes." - -exit 0 - -# Local Variables: -# mode:shell-script -# sh-indentation:2 -# End: diff --git a/rts/gmp/mdate-sh b/rts/gmp/mdate-sh deleted file mode 100644 index 37171f2..0000000 --- a/rts/gmp/mdate-sh +++ /dev/null @@ -1,92 +0,0 @@ -#!/bin/sh -# Get modification time of a file or directory and pretty-print it. -# Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. -# written by Ulrich Drepper , June 1995 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Prevent date giving response in another language. -LANG=C -export LANG -LC_ALL=C -export LC_ALL -LC_TIME=C -export LC_TIME - -# Get the extended ls output of the file or directory. -# On HPUX /bin/sh, "set" interprets "-rw-r--r--" as options, so the "x" below. -if ls -L /dev/null 1>/dev/null 2>&1; then - set - x`ls -L -l -d $1` -else - set - x`ls -l -d $1` -fi -# The month is at least the fourth argument -# (3 shifts here, the next inside the loop). -shift -shift -shift - -# Find the month. Next argument is day, followed by the year or time. -month= -until test $month -do - shift - case $1 in - Jan) month=January; nummonth=1;; - Feb) month=February; nummonth=2;; - Mar) month=March; nummonth=3;; - Apr) month=April; nummonth=4;; - May) month=May; nummonth=5;; - Jun) month=June; nummonth=6;; - Jul) month=July; nummonth=7;; - Aug) month=August; nummonth=8;; - Sep) month=September; nummonth=9;; - Oct) month=October; nummonth=10;; - Nov) month=November; nummonth=11;; - Dec) month=December; nummonth=12;; - esac -done - -day=$2 - -# Here we have to deal with the problem that the ls output gives either -# the time of day or the year. -case $3 in - *:*) set `date`; eval year=\$$# - case $2 in - Jan) nummonthtod=1;; - Feb) nummonthtod=2;; - Mar) nummonthtod=3;; - Apr) nummonthtod=4;; - May) nummonthtod=5;; - Jun) nummonthtod=6;; - Jul) nummonthtod=7;; - Aug) nummonthtod=8;; - Sep) nummonthtod=9;; - Oct) nummonthtod=10;; - Nov) nummonthtod=11;; - Dec) nummonthtod=12;; - esac - # For the first six month of the year the time notation can also - # be used for files modified in the last year. - if (expr $nummonth \> $nummonthtod) > /dev/null; - then - year=`expr $year - 1` - fi;; - *) year=$3;; -esac - -# The result. -echo $day $month $year diff --git a/rts/gmp/memory.c b/rts/gmp/memory.c deleted file mode 100644 index 9df440c..0000000 --- a/rts/gmp/memory.c +++ /dev/null @@ -1,160 +0,0 @@ -/* Memory allocation routines. - -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 -#include /* for malloc, realloc, free */ - -#include "gmp.h" -#include "gmp-impl.h" - -#ifdef __NeXT__ -#define static -#endif - - -void * (*_mp_allocate_func) _PROTO ((size_t)) = _mp_default_allocate; -void * (*_mp_reallocate_func) _PROTO ((void *, size_t, size_t)) - = _mp_default_reallocate; -void (*_mp_free_func) _PROTO ((void *, size_t)) = _mp_default_free; - - -/* Default allocation functions. In case of failure to allocate/reallocate - an error message is written to stderr and the program aborts. */ - -void * -#if __STDC__ -_mp_default_allocate (size_t size) -#else -_mp_default_allocate (size) - size_t size; -#endif -{ - void *ret; -#ifdef DEBUG - size_t req_size = size; - size += 2 * BYTES_PER_MP_LIMB; -#endif - ret = malloc (size); - if (ret == 0) - { - perror ("cannot allocate in gmp"); - abort (); - } - -#ifdef DEBUG - { - mp_ptr p = ret; - p++; - p[-1] = (0xdeadbeef << 31) + 0xdeafdeed; - if (req_size % BYTES_PER_MP_LIMB == 0) - p[req_size / BYTES_PER_MP_LIMB] = ~((0xdeadbeef << 31) + 0xdeafdeed); - ret = p; - } -#endif - return ret; -} - -void * -#if __STDC__ -_mp_default_reallocate (void *oldptr, size_t old_size, size_t new_size) -#else -_mp_default_reallocate (oldptr, old_size, new_size) - void *oldptr; - size_t old_size; - size_t new_size; -#endif -{ - void *ret; - -#ifdef DEBUG - size_t req_size = new_size; - - if (old_size != 0) - { - mp_ptr p = oldptr; - if (p[-1] != (0xdeadbeef << 31) + 0xdeafdeed) - { - fprintf (stderr, "gmp: (realloc) data clobbered before allocation block\n"); - abort (); - } - if (old_size % BYTES_PER_MP_LIMB == 0) - if (p[old_size / BYTES_PER_MP_LIMB] != ~((0xdeadbeef << 31) + 0xdeafdeed)) - { - fprintf (stderr, "gmp: (realloc) data clobbered after allocation block\n"); - abort (); - } - oldptr = p - 1; - } - - new_size += 2 * BYTES_PER_MP_LIMB; -#endif - - ret = realloc (oldptr, new_size); - if (ret == 0) - { - perror ("cannot allocate in gmp"); - abort (); - } - -#ifdef DEBUG - { - mp_ptr p = ret; - p++; - p[-1] = (0xdeadbeef << 31) + 0xdeafdeed; - if (req_size % BYTES_PER_MP_LIMB == 0) - p[req_size / BYTES_PER_MP_LIMB] = ~((0xdeadbeef << 31) + 0xdeafdeed); - ret = p; - } -#endif - return ret; -} - -void -#if __STDC__ -_mp_default_free (void *blk_ptr, size_t blk_size) -#else -_mp_default_free (blk_ptr, blk_size) - void *blk_ptr; - size_t blk_size; -#endif -{ -#ifdef DEBUG - { - mp_ptr p = blk_ptr; - if (blk_size != 0) - { - if (p[-1] != (0xdeadbeef << 31) + 0xdeafdeed) - { - fprintf (stderr, "gmp: (free) data clobbered before allocation block\n"); - abort (); - } - if (blk_size % BYTES_PER_MP_LIMB == 0) - if (p[blk_size / BYTES_PER_MP_LIMB] != ~((0xdeadbeef << 31) + 0xdeafdeed)) - { - fprintf (stderr, "gmp: (free) data clobbered after allocation block\n"); - abort (); - } - } - blk_ptr = p - 1; - } -#endif - free (blk_ptr); -} diff --git a/rts/gmp/missing b/rts/gmp/missing deleted file mode 100644 index c60e9d7..0000000 --- a/rts/gmp/missing +++ /dev/null @@ -1,244 +0,0 @@ -#! /bin/sh -# Common stub for a few missing GNU programs while installing. -# Copyright (C) 1996, 1997, 1999 Free Software Foundation, Inc. -# Originally by Fran,cois Pinard , 1996. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -if test $# -eq 0; then - echo 1>&2 "Try \`$0 --help' for more information" - exit 1 -fi - -run=: - -case "$1" in ---run) - # Try to run requested program, and just exit if it succeeds. - run= - shift - "$@" && exit 0 - ;; -esac - -# If it does not exist, or fails to run (possibly an outdated version), -# try to emulate it. -case "$1" in - - -h|--h|--he|--hel|--help) - echo "\ -$0 [OPTION]... PROGRAM [ARGUMENT]... - -Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an -error status if there is no known handling for PROGRAM. - -Options: - -h, --help display this help and exit - -v, --version output version information and exit - --run try to run the given command, and emulate it if it fails - -Supported PROGRAM values: - aclocal touch file \`aclocal.m4' - autoconf touch file \`configure' - autoheader touch file \`config.h.in' - automake touch all \`Makefile.in' files - bison create \`y.tab.[ch]', if possible, from existing .[ch] - flex create \`lex.yy.c', if possible, from existing .c - lex create \`lex.yy.c', if possible, from existing .c - makeinfo touch the output file - tar try tar, gnutar, gtar, then tar without non-portable flags - yacc create \`y.tab.[ch]', if possible, from existing .[ch]" - ;; - - -v|--v|--ve|--ver|--vers|--versi|--versio|--version) - echo "missing 0.2 - GNU automake" - ;; - - -*) - echo 1>&2 "$0: Unknown \`$1' option" - echo 1>&2 "Try \`$0 --help' for more information" - exit 1 - ;; - - aclocal) - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. You should only need it if - you modified \`acinclude.m4' or \`configure.in'. You might want - to install the \`Automake' and \`Perl' packages. Grab them from - any GNU archive site." - touch aclocal.m4 - ;; - - autoconf) - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. You should only need it if - you modified \`configure.in'. You might want to install the - \`Autoconf' and \`GNU m4' packages. Grab them from any GNU - archive site." - touch configure - ;; - - autoheader) - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. You should only need it if - you modified \`acconfig.h' or \`configure.in'. You might want - to install the \`Autoconf' and \`GNU m4' packages. Grab them - from any GNU archive site." - files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' configure.in` - test -z "$files" && files="config.h" - touch_files= - for f in $files; do - case "$f" in - *:*) touch_files="$touch_files "`echo "$f" | - sed -e 's/^[^:]*://' -e 's/:.*//'`;; - *) touch_files="$touch_files $f.in";; - esac - done - touch $touch_files - ;; - - automake) - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. You should only need it if - you modified \`Makefile.am', \`acinclude.m4' or \`configure.in'. - You might want to install the \`Automake' and \`Perl' packages. - Grab them from any GNU archive site." - find . -type f -name Makefile.am -print | - sed 's/\.am$/.in/' | - while read f; do touch "$f"; done - ;; - - bison|yacc) - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. You should only need it if - you modified a \`.y' file. You may need the \`Bison' package - in order for those modifications to take effect. You can get - \`Bison' from any GNU archive site." - rm -f y.tab.c y.tab.h - if [ $# -ne 1 ]; then - eval LASTARG="\${$#}" - case "$LASTARG" in - *.y) - SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` - if [ -f "$SRCFILE" ]; then - cp "$SRCFILE" y.tab.c - fi - SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` - if [ -f "$SRCFILE" ]; then - cp "$SRCFILE" y.tab.h - fi - ;; - esac - fi - if [ ! -f y.tab.h ]; then - echo >y.tab.h - fi - if [ ! -f y.tab.c ]; then - echo 'main() { return 0; }' >y.tab.c - fi - ;; - - lex|flex) - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. You should only need it if - you modified a \`.l' file. You may need the \`Flex' package - in order for those modifications to take effect. You can get - \`Flex' from any GNU archive site." - rm -f lex.yy.c - if [ $# -ne 1 ]; then - eval LASTARG="\${$#}" - case "$LASTARG" in - *.l) - SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` - if [ -f "$SRCFILE" ]; then - cp "$SRCFILE" lex.yy.c - fi - ;; - esac - fi - if [ ! -f lex.yy.c ]; then - echo 'main() { return 0; }' >lex.yy.c - fi - ;; - - makeinfo) - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. You should only need it if - you modified a \`.texi' or \`.texinfo' file, or any other file - indirectly affecting the aspect of the manual. The spurious - call might also be the consequence of using a buggy \`make' (AIX, - DU, IRIX). You might want to install the \`Texinfo' package or - the \`GNU make' package. Grab either from any GNU archive site." - file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` - if test -z "$file"; then - file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` - file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` - fi - touch $file - ;; - - tar) - shift - if test -n "$run"; then - echo 1>&2 "ERROR: \`tar' requires --run" - exit 1 - fi - - # We have already tried tar in the generic part. - # Look for gnutar/gtar before invocation to avoid ugly error - # messages. - if (gnutar --version > /dev/null 2>&1); then - gnutar ${1+"$@"} && exit 0 - fi - if (gtar --version > /dev/null 2>&1); then - gtar ${1+"$@"} && exit 0 - fi - firstarg="$1" - if shift; then - case "$firstarg" in - *o*) - firstarg=`echo "$firstarg" | sed s/o//` - tar "$firstarg" ${1+"$@"} && exit 0 - ;; - esac - case "$firstarg" in - *h*) - firstarg=`echo "$firstarg" | sed s/h//` - tar "$firstarg" ${1+"$@"} && exit 0 - ;; - esac - fi - - echo 1>&2 "\ -WARNING: I can't seem to be able to run \`tar' with the given arguments. - You may want to install GNU tar or Free paxutils, or check the - command line arguments." - exit 1 - ;; - - *) - echo 1>&2 "\ -WARNING: \`$1' is needed, and you do not seem to have it handy on your - system. You might have modified some files without having the - proper tools for further handling them. Check the \`README' file, - it often tells you about the needed prerequirements for installing - this package. You may also peek at any GNU archive site, in case - some other package would contain this missing \`$1' program." - exit 1 - ;; -esac - -exit 0 diff --git a/rts/gmp/mkinstalldirs b/rts/gmp/mkinstalldirs deleted file mode 100644 index 5e17cd3..0000000 --- a/rts/gmp/mkinstalldirs +++ /dev/null @@ -1,38 +0,0 @@ -#! /bin/sh -# mkinstalldirs --- make directory hierarchy -# Author: Noah Friedman -# Created: 1993-05-16 -# Public domain - -errstatus=0 - -for file -do - set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` - shift - - pathcomp= - for d - do - pathcomp="$pathcomp$d" - case "$pathcomp" in - -* ) pathcomp=./$pathcomp ;; - esac - - if test ! -d "$pathcomp"; then - echo "mkdir $pathcomp" - - mkdir "$pathcomp" || lasterr=$? - - if test ! -d "$pathcomp"; then - errstatus=$lasterr - fi - fi - - pathcomp="$pathcomp/" - done -done - -exit $errstatus - -# mkinstalldirs ends here diff --git a/rts/gmp/mp.h b/rts/gmp/mp.h deleted file mode 100644 index ffab4cb..0000000 --- a/rts/gmp/mp.h +++ /dev/null @@ -1,124 +0,0 @@ -/* mp.h -- Definitions for Berkeley compatible multiple precision functions. - -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. */ - -#ifndef __MP_H__ - -#ifndef __GNU_MP__ /* to allow inclusion of both gmp.h and mp.h */ -#define __GNU_MP__ 3 -#define __need_size_t -#include -#undef __need_size_t - -#if defined (__STDC__) || defined (__cplusplus) -#define __gmp_const const -#else -#define __gmp_const -#endif - -#if defined (__GNUC__) -#define __gmp_inline __inline__ -#else -#define __gmp_inline -#endif - -#ifndef _EXTERN_INLINE -#ifdef __GNUC__ -#define _EXTERN_INLINE extern __inline__ -#else -#define _EXTERN_INLINE static -#endif -#endif - -#ifdef _SHORT_LIMB -typedef unsigned int mp_limb_t; -typedef int mp_limb_signed_t; -#else -#ifdef _LONG_LONG_LIMB -typedef unsigned long long int mp_limb_t; -typedef long long int mp_limb_signed_t; -#else -typedef unsigned long int mp_limb_t; -typedef long int mp_limb_signed_t; -#endif -#endif - -typedef mp_limb_t * mp_ptr; -typedef __gmp_const mp_limb_t * mp_srcptr; -typedef int mp_size_t; -typedef long int mp_exp_t; - -typedef struct -{ - int _mp_alloc; /* Number of *limbs* allocated and pointed - to by the D field. */ - int _mp_size; /* abs(SIZE) is the number of limbs - the last field points to. If SIZE - is negative this is a negative - number. */ - mp_limb_t *_mp_d; /* Pointer to the limbs. */ -} __mpz_struct; -#endif /* __GNU_MP__ */ - -/* User-visible types. */ -typedef __mpz_struct MINT; - - -#ifndef _PROTO -#if (__STDC__-0) || defined (__cplusplus) -#define _PROTO(x) x -#else -#define _PROTO(x) () -#endif -#endif - -#if defined (__cplusplus) -extern "C" { -#endif - -#define mp_set_memory_functions __gmp_set_memory_functions -void mp_set_memory_functions _PROTO ((void *(*) (size_t), - void *(*) (void *, size_t, size_t), - void (*) (void *, size_t))); -MINT *itom _PROTO ((signed short int)); -MINT *xtom _PROTO ((const char *)); -void move _PROTO ((const MINT *, MINT *)); -void madd _PROTO ((const MINT *, const MINT *, MINT *)); -void msub _PROTO ((const MINT *, const MINT *, MINT *)); -void mult _PROTO ((const MINT *, const MINT *, MINT *)); -void mdiv _PROTO ((const MINT *, const MINT *, MINT *, MINT *)); -void sdiv _PROTO ((const MINT *, signed short int, MINT *, signed short int *)); -void msqrt _PROTO ((const MINT *, MINT *, MINT *)); -void pow _PROTO ((const MINT *, const MINT *, const MINT *, MINT *)); -void rpow _PROTO ((const MINT *, signed short int, MINT *)); -void gcd _PROTO ((const MINT *, const MINT *, MINT *)); -int mcmp _PROTO ((const MINT *, const MINT *)); -void min _PROTO ((MINT *)); -void mout _PROTO ((const MINT *)); -char *mtox _PROTO ((const MINT *)); -void mfree _PROTO ((MINT *)); - -#if defined (__cplusplus) -} -#endif - -#define __MP_H__ -#endif /* __MP_H__ */ diff --git a/rts/gmp/mp_bpl.c b/rts/gmp/mp_bpl.c deleted file mode 100644 index df8b03e..0000000 --- a/rts/gmp/mp_bpl.c +++ /dev/null @@ -1,27 +0,0 @@ -/* -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" - -const int mp_bits_per_limb = BITS_PER_MP_LIMB; -const int __gmp_0 = 0; -int __gmp_junk; diff --git a/rts/gmp/mp_clz_tab.c b/rts/gmp/mp_clz_tab.c deleted file mode 100644 index 1bbd1d6..0000000 --- a/rts/gmp/mp_clz_tab.c +++ /dev/null @@ -1,36 +0,0 @@ -/* __clz_tab -- support for longlong.h - -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. */ - -#include "gmp.h" -#include "gmp-impl.h" - -const -unsigned char __clz_tab[] = -{ - 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, -}; diff --git a/rts/gmp/mp_minv_tab.c b/rts/gmp/mp_minv_tab.c deleted file mode 100644 index 4afff85..0000000 --- a/rts/gmp/mp_minv_tab.c +++ /dev/null @@ -1,50 +0,0 @@ -/* A table of data supporting modlimb_invert(). - - THE CONTENTS OF THIS FILE ARE FOR INTERNAL USE AND MAY CHANGE - INCOMPATIBLY OR DISAPPEAR IN A FUTURE GNU MP RELEASE. */ - -/* -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" - - -/* modlimb_invert_table[i] is the multiplicative inverse of 2*i+1 mod 256, - ie. (modlimb_invert_table[i] * (2*i+1)) % 256 == 1 */ - -const unsigned char modlimb_invert_table[128] = { - 0x01, 0xAB, 0xCD, 0xB7, 0x39, 0xA3, 0xC5, 0xEF, - 0xF1, 0x1B, 0x3D, 0xA7, 0x29, 0x13, 0x35, 0xDF, - 0xE1, 0x8B, 0xAD, 0x97, 0x19, 0x83, 0xA5, 0xCF, - 0xD1, 0xFB, 0x1D, 0x87, 0x09, 0xF3, 0x15, 0xBF, - 0xC1, 0x6B, 0x8D, 0x77, 0xF9, 0x63, 0x85, 0xAF, - 0xB1, 0xDB, 0xFD, 0x67, 0xE9, 0xD3, 0xF5, 0x9F, - 0xA1, 0x4B, 0x6D, 0x57, 0xD9, 0x43, 0x65, 0x8F, - 0x91, 0xBB, 0xDD, 0x47, 0xC9, 0xB3, 0xD5, 0x7F, - 0x81, 0x2B, 0x4D, 0x37, 0xB9, 0x23, 0x45, 0x6F, - 0x71, 0x9B, 0xBD, 0x27, 0xA9, 0x93, 0xB5, 0x5F, - 0x61, 0x0B, 0x2D, 0x17, 0x99, 0x03, 0x25, 0x4F, - 0x51, 0x7B, 0x9D, 0x07, 0x89, 0x73, 0x95, 0x3F, - 0x41, 0xEB, 0x0D, 0xF7, 0x79, 0xE3, 0x05, 0x2F, - 0x31, 0x5B, 0x7D, 0xE7, 0x69, 0x53, 0x75, 0x1F, - 0x21, 0xCB, 0xED, 0xD7, 0x59, 0xC3, 0xE5, 0x0F, - 0x11, 0x3B, 0x5D, 0xC7, 0x49, 0x33, 0x55, 0xFF -}; diff --git a/rts/gmp/mp_set_fns.c b/rts/gmp/mp_set_fns.c deleted file mode 100644 index 55d4d9d..0000000 --- a/rts/gmp/mp_set_fns.c +++ /dev/null @@ -1,48 +0,0 @@ -/* mp_set_memory_functions -- Set the allocate, reallocate, and free functions - for use by the mp package. - -Copyright (C) 1991, 1993, 1994 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__ -mp_set_memory_functions (void *(*alloc_func) (size_t), - void *(*realloc_func) (void *, size_t, size_t), - void (*free_func) (void *, size_t)) -#else -mp_set_memory_functions (alloc_func, realloc_func, free_func) - void *(*alloc_func) (); - void *(*realloc_func) (); - void (*free_func) (); -#endif -{ - if (alloc_func == 0) - alloc_func = _mp_default_allocate; - if (realloc_func == 0) - realloc_func = _mp_default_reallocate; - if (free_func == 0) - free_func = _mp_default_free; - - _mp_allocate_func = alloc_func; - _mp_reallocate_func = realloc_func; - _mp_free_func = free_func; -} diff --git a/rts/gmp/mpn/Makefile.am b/rts/gmp/mpn/Makefile.am deleted file mode 100644 index 1c49ccd..0000000 --- a/rts/gmp/mpn/Makefile.am +++ /dev/null @@ -1,94 +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 - -CPP = @CPP@ - -# -DOPERATION_$* tells multi-function files which function to produce. -INCLUDES = -I$(top_srcdir) -DOPERATION_$* - -GENERIC_SOURCES = mp_bases.c -OFILES = @mpn_objects@ - -noinst_LTLIBRARIES = libmpn.la -libmpn_la_SOURCES = $(GENERIC_SOURCES) -libmpn_la_LIBADD = $(OFILES) -libmpn_la_DEPENDENCIES = $(OFILES) - -TARG_DIST = a29k alpha arm clipper cray generic hppa i960 lisp m68k m88k \ - mips2 mips3 ns32k pa64 pa64w power powerpc32 powerpc64 pyr sh sparc32 \ - sparc64 thumb vax x86 z8000 z8000x - -EXTRA_DIST = underscore.h asm-defs.m4 $(TARG_DIST) - -# COMPILE minus CC. FIXME: Really pass *_CFLAGS to CPP? -COMPILE_FLAGS = \ - $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) - -SUFFIXES = .s .S .asm - -# *.s are not preprocessed at all. -.s.o: - $(CCAS) $(COMPILE_FLAGS) $< -.s.obj: - $(CCAS) $(COMPILE_FLAGS) `cygpath -w $<` -.s.lo: - $(LIBTOOL) --mode=compile $(CCAS) $(COMPILE_FLAGS) $< - -# *.S are preprocessed with CPP. -.S.o: - $(CPP) $(COMPILE_FLAGS) $< | grep -v '^#' >tmp-$*.s - $(CCAS) $(COMPILE_FLAGS) tmp-$*.s -o $@ - rm -f tmp-$*.s -.S.obj: - $(CPP) $(COMPILE_FLAGS) `cygpath -w $<` | grep -v '^#' >tmp-$*.s - $(CCAS) $(COMPILE_FLAGS) tmp-$*.s -o $@ - rm -f tmp-$*.s - -# We have to rebuild the static object file without passing -DPIC to -# preprocessor. The overhead cost is one extra assemblation. FIXME: -# Teach libtool how to assemble with a preprocessor pass (CPP or m4). - -.S.lo: - $(CPP) $(COMPILE_FLAGS) -DPIC $< | grep -v '^#' >tmp-$*.s - $(LIBTOOL) --mode=compile $(CCAS) $(COMPILE_FLAGS) tmp-$*.s -o $@ - $(CPP) $(COMPILE_FLAGS) $< | grep -v '^#' >tmp-$*.s - $(CCAS) $(COMPILE_FLAGS) tmp-$*.s -o $*.o - rm -f tmp-$*.s - -# *.m4 are preprocessed with m4. -.asm.o: - $(M4) -DOPERATION_$* $< >tmp-$*.s - $(CCAS) $(COMPILE_FLAGS) tmp-$*.s -o $@ - rm -f tmp-$*.s -.asm.obj: - $(M4) -DOPERATION_$* `cygpath -w $<` >tmp-$*.s - $(CCAS) $(COMPILE_FLAGS) tmp-$*.s -o $@ - rm -f tmp-$*.s -.asm.lo: - $(M4) -DPIC -DOPERATION_$* $< >tmp-$*.s - $(LIBTOOL) --mode=compile $(CCAS) $(COMPILE_FLAGS) tmp-$*.s -o $@ - $(M4) -DOPERATION_$* $< >tmp-$*.s - $(CCAS) $(COMPILE_FLAGS) tmp-$*.s -o $*.o - rm -f tmp-$*.s diff --git a/rts/gmp/mpn/Makefile.in b/rts/gmp/mpn/Makefile.in deleted file mode 100644 index 59ee958..0000000 --- a/rts/gmp/mpn/Makefile.in +++ /dev/null @@ -1,472 +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 = - -CPP = @CPP@ - -# -DOPERATION_$* tells multi-function files which function to produce. -INCLUDES = -I$(top_srcdir) -DOPERATION_$* - -GENERIC_SOURCES = mp_bases.c -OFILES = @mpn_objects@ - -noinst_LTLIBRARIES = libmpn.la -libmpn_la_SOURCES = $(GENERIC_SOURCES) -libmpn_la_LIBADD = $(OFILES) -libmpn_la_DEPENDENCIES = $(OFILES) - -TARG_DIST = a29k alpha arm clipper cray generic hppa i960 lisp m68k m88k \ - mips2 mips3 ns32k pa64 pa64w power powerpc32 powerpc64 pyr sh sparc32 \ - sparc64 thumb vax x86 z8000 z8000x - - -EXTRA_DIST = underscore.h asm-defs.m4 $(TARG_DIST) - -# COMPILE minus CC. FIXME: Really pass *_CFLAGS to CPP? -COMPILE_FLAGS = \ - $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) - - -SUFFIXES = .s .S .asm -subdir = mpn -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@ -libmpn_la_LDFLAGS = -am_libmpn_la_OBJECTS = mp_bases.lo -libmpn_la_OBJECTS = $(am_libmpn_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 = $(libmpn_la_SOURCES) -DIST_COMMON = README Makefile.am Makefile.in - - -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) - -GZIP_ENV = --best -depcomp = -SOURCES = $(libmpn_la_SOURCES) -OBJECTS = $(am_libmpn_la_OBJECTS) - -all: all-redirect -.SUFFIXES: -.SUFFIXES: .S .asm .c .lo .o .obj .s -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) - cd $(top_srcdir) && $(AUTOMAKE) --gnu mpn/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: - -libmpn.la: $(libmpn_la_OBJECTS) $(libmpn_la_DEPENDENCIES) - $(LINK) $(libmpn_la_LDFLAGS) $(libmpn_la_OBJECTS) $(libmpn_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: - -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 - - -# *.s are not preprocessed at all. -.s.o: - $(CCAS) $(COMPILE_FLAGS) $< -.s.obj: - $(CCAS) $(COMPILE_FLAGS) `cygpath -w $<` -.s.lo: - $(LIBTOOL) --mode=compile $(CCAS) $(COMPILE_FLAGS) $< - -# *.S are preprocessed with CPP. -.S.o: - $(CPP) $(COMPILE_FLAGS) $< | grep -v '^#' >tmp-$*.s - $(CCAS) $(COMPILE_FLAGS) tmp-$*.s -o $@ - rm -f tmp-$*.s -.S.obj: - $(CPP) $(COMPILE_FLAGS) `cygpath -w $<` | grep -v '^#' >tmp-$*.s - $(CCAS) $(COMPILE_FLAGS) tmp-$*.s -o $@ - rm -f tmp-$*.s - -# We have to rebuild the static object file without passing -DPIC to -# preprocessor. The overhead cost is one extra assemblation. FIXME: -# Teach libtool how to assemble with a preprocessor pass (CPP or m4). - -.S.lo: - $(CPP) $(COMPILE_FLAGS) -DPIC $< | grep -v '^#' >tmp-$*.s - $(LIBTOOL) --mode=compile $(CCAS) $(COMPILE_FLAGS) tmp-$*.s -o $@ - $(CPP) $(COMPILE_FLAGS) $< | grep -v '^#' >tmp-$*.s - $(CCAS) $(COMPILE_FLAGS) tmp-$*.s -o $*.o - rm -f tmp-$*.s - -# *.m4 are preprocessed with m4. -.asm.o: - $(M4) -DOPERATION_$* $< >tmp-$*.s - $(CCAS) $(COMPILE_FLAGS) tmp-$*.s -o $@ - rm -f tmp-$*.s -.asm.obj: - $(M4) -DOPERATION_$* `cygpath -w $<` >tmp-$*.s - $(CCAS) $(COMPILE_FLAGS) tmp-$*.s -o $@ - rm -f tmp-$*.s -.asm.lo: - $(M4) -DPIC -DOPERATION_$* $< >tmp-$*.s - $(LIBTOOL) --mode=compile $(CCAS) $(COMPILE_FLAGS) tmp-$*.s -o $@ - $(M4) -DOPERATION_$* $< >tmp-$*.s - $(CCAS) $(COMPILE_FLAGS) tmp-$*.s -o $*.o - rm -f tmp-$*.s - -# 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/mpn/README b/rts/gmp/mpn/README deleted file mode 100644 index 7453c9d..0000000 --- a/rts/gmp/mpn/README +++ /dev/null @@ -1,13 +0,0 @@ -This directory contains all code for the mpn layer of GMP. - -Most subdirectories contain machine-dependent code, written in assembly or C. -The `generic' subdirectory contains default code, used when there is no -machine-dependent replacement for a particular machine. - -There is one subdirectory for each ISA family. Note that e.g., 32-bit SPARC -and 64-bit SPARC are very different ISA's, and thus cannot share any code. - -A particular compile will only use code from one subdirectory, and the -`generic' subdirectory. The ISA-specific subdirectories contain hierachies of -directories for various architecture variants and implementations; the -top-most level contains code that runs correctly on all variants. diff --git a/rts/gmp/mpn/a29k/add_n.s b/rts/gmp/mpn/a29k/add_n.s deleted file mode 100644 index e3ee6df..0000000 --- a/rts/gmp/mpn/a29k/add_n.s +++ /dev/null @@ -1,120 +0,0 @@ -; 29000 __gmpn_add -- Add two limb vectors of the same length > 0 and store -; sum in a third limb vector. - -; Copyright (C) 1992, 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. - - -; INPUT PARAMETERS -; res_ptr lr2 -; s1_ptr lr3 -; s2_ptr lr4 -; size lr5 - -; We use the loadm/storem instructions and operate on chunks of 8 -; limbs/per iteration, until less than 8 limbs remain. - -; The 29k has no addition or subtraction instructions that doesn't -; affect carry, so we need to save and restore that as soon as we -; adjust the pointers. gr116 is used for this purpose. Note that -; gr116==0 means that carry should be set. - - .sect .lit,lit - .text - .align 4 - .global ___gmpn_add_n - .word 0x60000 -___gmpn_add_n: - srl gr117,lr5,3 - sub gr118,gr117,1 - jmpt gr118,Ltail - constn gr116,-1 ; init cy reg - sub gr117,gr117,2 ; count for jmpfdec - -; Main loop working 8 limbs/iteration. -Loop: mtsrim cr,(8-1) - loadm 0,0,gr96,lr3 - add lr3,lr3,32 - mtsrim cr,(8-1) - loadm 0,0,gr104,lr4 - add lr4,lr4,32 - - subr gr116,gr116,0 ; restore carry - addc gr96,gr96,gr104 - addc gr97,gr97,gr105 - addc gr98,gr98,gr106 - addc gr99,gr99,gr107 - addc gr100,gr100,gr108 - addc gr101,gr101,gr109 - addc gr102,gr102,gr110 - addc gr103,gr103,gr111 - subc gr116,gr116,gr116 ; gr116 = not(cy) - - mtsrim cr,(8-1) - storem 0,0,gr96,lr2 - jmpfdec gr117,Loop - add lr2,lr2,32 - -; Code for the last up-to-7 limbs. -; This code might look very strange, but it's hard to write it -; differently without major slowdown. - - and lr5,lr5,(8-1) -Ltail: sub gr118,lr5,1 ; count for CR - jmpt gr118,Lend - sub gr117,lr5,2 ; count for jmpfdec - - mtsr cr,gr118 - loadm 0,0,gr96,lr3 - mtsr cr,gr118 - loadm 0,0,gr104,lr4 - - subr gr116,gr116,0 ; restore carry - - jmpfdec gr117,L1 - addc gr96,gr96,gr104 - jmp Lstore - mtsr cr,gr118 -L1: jmpfdec gr117,L2 - addc gr97,gr97,gr105 - jmp Lstore - mtsr cr,gr118 -L2: jmpfdec gr117,L3 - addc gr98,gr98,gr106 - jmp Lstore - mtsr cr,gr118 -L3: jmpfdec gr117,L4 - addc gr99,gr99,gr107 - jmp Lstore - mtsr cr,gr118 -L4: jmpfdec gr117,L5 - addc gr100,gr100,gr108 - jmp Lstore - mtsr cr,gr118 -L5: jmpfdec gr117,L6 - addc gr101,gr101,gr109 - jmp Lstore - mtsr cr,gr118 -L6: addc gr102,gr102,gr110 - -Lstore: storem 0,0,gr96,lr2 - subc gr116,gr116,gr116 ; gr116 = not(cy) - -Lend: jmpi lr0 - add gr96,gr116,1 diff --git a/rts/gmp/mpn/a29k/addmul_1.s b/rts/gmp/mpn/a29k/addmul_1.s deleted file mode 100644 index f51b6d7..0000000 --- a/rts/gmp/mpn/a29k/addmul_1.s +++ /dev/null @@ -1,113 +0,0 @@ -; 29000 __gmpn_addmul_1 -- Multiply a limb vector with a single limb and -; add the product to a second limb vector. - -; Copyright (C) 1992, 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. - - -; INPUT PARAMETERS -; res_ptr lr2 -; s1_ptr lr3 -; size lr4 -; s2_limb lr5 - - .cputype 29050 - .sect .lit,lit - .text - .align 4 - .global ___gmpn_addmul_1 - .word 0x60000 -___gmpn_addmul_1: - sub lr4,lr4,8 - jmpt lr4,Ltail - const gr120,0 ; init cylimb reg - - srl gr117,lr4,3 ; divide by 8 - sub gr117,gr117,1 ; count for jmpfdec - -Loop: mtsrim cr,(8-1) - loadm 0,0,gr96,lr3 - add lr3,lr3,32 - - multiplu gr104,gr96,lr5 - multmu gr96,gr96,lr5 - multiplu gr105,gr97,lr5 - multmu gr97,gr97,lr5 - multiplu gr106,gr98,lr5 - multmu gr98,gr98,lr5 - multiplu gr107,gr99,lr5 - multmu gr99,gr99,lr5 - multiplu gr108,gr100,lr5 - multmu gr100,gr100,lr5 - multiplu gr109,gr101,lr5 - multmu gr101,gr101,lr5 - multiplu gr110,gr102,lr5 - multmu gr102,gr102,lr5 - multiplu gr111,gr103,lr5 - multmu gr103,gr103,lr5 - - add gr104,gr104,gr120 - addc gr105,gr105,gr96 - addc gr106,gr106,gr97 - addc gr107,gr107,gr98 - addc gr108,gr108,gr99 - addc gr109,gr109,gr100 - addc gr110,gr110,gr101 - addc gr111,gr111,gr102 - addc gr120,gr103,0 - - mtsrim cr,(8-1) - loadm 0,0,gr96,lr2 - - add gr104,gr96,gr104 - addc gr105,gr97,gr105 - addc gr106,gr98,gr106 - addc gr107,gr99,gr107 - addc gr108,gr100,gr108 - addc gr109,gr101,gr109 - addc gr110,gr102,gr110 - addc gr111,gr103,gr111 - addc gr120,gr120,0 - - mtsrim cr,(8-1) - storem 0,0,gr104,lr2 - jmpfdec gr117,Loop - add lr2,lr2,32 - -Ltail: and lr4,lr4,(8-1) - sub gr118,lr4,1 ; count for CR - jmpt gr118,Lend - sub lr4,lr4,2 - sub lr2,lr2,4 ; offset res_ptr by one limb - -Loop2: load 0,0,gr116,lr3 - add lr3,lr3,4 - multiplu gr117,gr116,lr5 - multmu gr118,gr116,lr5 - add lr2,lr2,4 - load 0,0,gr119,lr2 - add gr117,gr117,gr120 - addc gr118,gr118,0 - add gr117,gr117,gr119 - store 0,0,gr117,lr2 - jmpfdec lr4,Loop2 - addc gr120,gr118,0 - -Lend: jmpi lr0 - or gr96,gr120,0 ; copy diff --git a/rts/gmp/mpn/a29k/lshift.s b/rts/gmp/mpn/a29k/lshift.s deleted file mode 100644 index 93e1917..0000000 --- a/rts/gmp/mpn/a29k/lshift.s +++ /dev/null @@ -1,93 +0,0 @@ -; 29000 __gmpn_lshift -- - -; Copyright (C) 1992, 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. - - -; INPUT PARAMETERS -; res_ptr lr2 -; s1_ptr lr3 -; s2_ptr lr4 -; size lr5 - -; We use the loadm/storem instructions and operate on chunks of 8 -; limbs/per iteration, until less than 8 limbs remain. - - .sect .lit,lit - .text - .align 4 - .global ___gmpn_lshift - .word 0x60000 -___gmpn_lshift: - sll gr116,lr4,2 - add lr3,gr116,lr3 - add lr2,gr116,lr2 - sub lr3,lr3,4 - load 0,0,gr119,lr3 - - subr gr116,lr5,32 - srl gr96,gr119,gr116 ; return value - sub lr4,lr4,1 ; actual loop count is SIZE - 1 - - srl gr117,lr4,3 ; chuck count = (actual count) / 8 - cpeq gr118,gr117,0 - jmpt gr118,Ltail - mtsr fc,lr5 - - sub gr117,gr117,2 ; count for jmpfdec - -; Main loop working 8 limbs/iteration. -Loop: sub lr3,lr3,32 - mtsrim cr,(8-1) - loadm 0,0,gr100,lr3 - - extract gr109,gr119,gr107 - extract gr108,gr107,gr106 - extract gr107,gr106,gr105 - extract gr106,gr105,gr104 - extract gr105,gr104,gr103 - extract gr104,gr103,gr102 - extract gr103,gr102,gr101 - extract gr102,gr101,gr100 - - sub lr2,lr2,32 - mtsrim cr,(8-1) - storem 0,0,gr102,lr2 - jmpfdec gr117,Loop - or gr119,gr100,0 - -; Code for the last up-to-7 limbs. - - and lr4,lr4,(8-1) -Ltail: cpeq gr118,lr4,0 - jmpt gr118,Lend - sub lr4,lr4,2 ; count for jmpfdec - -Loop2: sub lr3,lr3,4 - load 0,0,gr116,lr3 - extract gr117,gr119,gr116 - sub lr2,lr2,4 - store 0,0,gr117,lr2 - jmpfdec lr4,Loop2 - or gr119,gr116,0 - -Lend: extract gr117,gr119,0 - sub lr2,lr2,4 - jmpi lr0 - store 0,0,gr117,lr2 diff --git a/rts/gmp/mpn/a29k/mul_1.s b/rts/gmp/mpn/a29k/mul_1.s deleted file mode 100644 index 6bcf7ce..0000000 --- a/rts/gmp/mpn/a29k/mul_1.s +++ /dev/null @@ -1,97 +0,0 @@ -; 29000 __gmpn_mul_1 -- Multiply a limb vector with a single limb and -; store the product in a second limb vector. - -; Copyright (C) 1992, 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. - - -; INPUT PARAMETERS -; res_ptr lr2 -; s1_ptr lr3 -; size lr4 -; s2_limb lr5 - - .cputype 29050 - .sect .lit,lit - .text - .align 4 - .global ___gmpn_mul_1 - .word 0x60000 -___gmpn_mul_1: - sub lr4,lr4,8 - jmpt lr4,Ltail - const gr120,0 ; init cylimb reg - - srl gr117,lr4,3 ; divide by 8 - sub gr117,gr117,1 ; count for jmpfdec - -Loop: mtsrim cr,(8-1) - loadm 0,0,gr96,lr3 - add lr3,lr3,32 - - multiplu gr104,gr96,lr5 - multmu gr96,gr96,lr5 - multiplu gr105,gr97,lr5 - multmu gr97,gr97,lr5 - multiplu gr106,gr98,lr5 - multmu gr98,gr98,lr5 - multiplu gr107,gr99,lr5 - multmu gr99,gr99,lr5 - multiplu gr108,gr100,lr5 - multmu gr100,gr100,lr5 - multiplu gr109,gr101,lr5 - multmu gr101,gr101,lr5 - multiplu gr110,gr102,lr5 - multmu gr102,gr102,lr5 - multiplu gr111,gr103,lr5 - multmu gr103,gr103,lr5 - - add gr104,gr104,gr120 - addc gr105,gr105,gr96 - addc gr106,gr106,gr97 - addc gr107,gr107,gr98 - addc gr108,gr108,gr99 - addc gr109,gr109,gr100 - addc gr110,gr110,gr101 - addc gr111,gr111,gr102 - addc gr120,gr103,0 - - mtsrim cr,(8-1) - storem 0,0,gr104,lr2 - jmpfdec gr117,Loop - add lr2,lr2,32 - -Ltail: and lr4,lr4,(8-1) - sub gr118,lr4,1 ; count for CR - jmpt gr118,Lend - sub lr4,lr4,2 - sub lr2,lr2,4 ; offset res_ptr by one limb - -Loop2: load 0,0,gr116,lr3 - add lr3,lr3,4 - multiplu gr117,gr116,lr5 - multmu gr118,gr116,lr5 - add lr2,lr2,4 - add gr117,gr117,gr120 - store 0,0,gr117,lr2 - jmpfdec lr4,Loop2 - addc gr120,gr118,0 - -Lend: jmpi lr0 - or gr96,gr120,0 ; copy diff --git a/rts/gmp/mpn/a29k/rshift.s b/rts/gmp/mpn/a29k/rshift.s deleted file mode 100644 index ea163bf..0000000 --- a/rts/gmp/mpn/a29k/rshift.s +++ /dev/null @@ -1,89 +0,0 @@ -; 29000 __gmpn_rshift -- - -; Copyright (C) 1992, 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. - - -; INPUT PARAMETERS -; res_ptr lr2 -; s1_ptr lr3 -; s2_ptr lr4 -; size lr5 - -; We use the loadm/storem instructions and operate on chunks of 8 -; limbs/per iteration, until less than 8 limbs remain. - - .sect .lit,lit - .text - .align 4 - .global ___gmpn_rshift - .word 0x60000 -___gmpn_rshift: - load 0,0,gr119,lr3 - add lr3,lr3,4 - - subr gr116,lr5,32 - sll gr96,gr119,gr116 ; return value - sub lr4,lr4,1 ; actual loop count is SIZE - 1 - - srl gr117,lr4,3 ; chuck count = (actual count) / 8 - cpeq gr118,gr117,0 - jmpt gr118,Ltail - mtsr fc,gr116 - - sub gr117,gr117,2 ; count for jmpfdec - -; Main loop working 8 limbs/iteration. -Loop: mtsrim cr,(8-1) - loadm 0,0,gr100,lr3 - add lr3,lr3,32 - - extract gr98,gr100,gr119 - extract gr99,gr101,gr100 - extract gr100,gr102,gr101 - extract gr101,gr103,gr102 - extract gr102,gr104,gr103 - extract gr103,gr105,gr104 - extract gr104,gr106,gr105 - extract gr105,gr107,gr106 - - mtsrim cr,(8-1) - storem 0,0,gr98,lr2 - add lr2,lr2,32 - jmpfdec gr117,Loop - or gr119,gr107,0 - -; Code for the last up-to-7 limbs. - - and lr4,lr4,(8-1) -Ltail: cpeq gr118,lr4,0 - jmpt gr118,Lend - sub lr4,lr4,2 ; count for jmpfdec - -Loop2: load 0,0,gr100,lr3 - add lr3,lr3,4 - extract gr117,gr100,gr119 - store 0,0,gr117,lr2 - add lr2,lr2,4 - jmpfdec lr4,Loop2 - or gr119,gr100,0 - -Lend: srl gr117,gr119,lr5 - jmpi lr0 - store 0,0,gr117,lr2 diff --git a/rts/gmp/mpn/a29k/sub_n.s b/rts/gmp/mpn/a29k/sub_n.s deleted file mode 100644 index c6b64c5..0000000 --- a/rts/gmp/mpn/a29k/sub_n.s +++ /dev/null @@ -1,120 +0,0 @@ -; 29000 __gmpn_sub -- Subtract two limb vectors of the same length > 0 and -; store difference in a third limb vector. - -; Copyright (C) 1992, 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. - - -; INPUT PARAMETERS -; res_ptr lr2 -; s1_ptr lr3 -; s2_ptr lr4 -; size lr5 - -; We use the loadm/storem instructions and operate on chunks of 8 -; limbs/per iteration, until less than 8 limbs remain. - -; The 29k has no addition or subtraction instructions that doesn't -; affect carry, so we need to save and restore that as soon as we -; adjust the pointers. gr116 is used for this purpose. Note that -; gr116==0 means that carry should be set. - - .sect .lit,lit - .text - .align 4 - .global ___gmpn_sub_n - .word 0x60000 -___gmpn_sub_n: - srl gr117,lr5,3 - sub gr118,gr117,1 - jmpt gr118,Ltail - constn gr116,-1 ; init cy reg - sub gr117,gr117,2 ; count for jmpfdec - -; Main loop working 8 limbs/iteration. -Loop: mtsrim cr,(8-1) - loadm 0,0,gr96,lr3 - add lr3,lr3,32 - mtsrim cr,(8-1) - loadm 0,0,gr104,lr4 - add lr4,lr4,32 - - subr gr116,gr116,0 ; restore carry - subc gr96,gr96,gr104 - subc gr97,gr97,gr105 - subc gr98,gr98,gr106 - subc gr99,gr99,gr107 - subc gr100,gr100,gr108 - subc gr101,gr101,gr109 - subc gr102,gr102,gr110 - subc gr103,gr103,gr111 - subc gr116,gr116,gr116 ; gr116 = not(cy) - - mtsrim cr,(8-1) - storem 0,0,gr96,lr2 - jmpfdec gr117,Loop - add lr2,lr2,32 - -; Code for the last up-to-7 limbs. -; This code might look very strange, but it's hard to write it -; differently without major slowdown. - - and lr5,lr5,(8-1) -Ltail: sub gr118,lr5,1 ; count for CR - jmpt gr118,Lend - sub gr117,lr5,2 ; count for jmpfdec - - mtsr cr,gr118 - loadm 0,0,gr96,lr3 - mtsr cr,gr118 - loadm 0,0,gr104,lr4 - - subr gr116,gr116,0 ; restore carry - - jmpfdec gr117,L1 - subc gr96,gr96,gr104 - jmp Lstore - mtsr cr,gr118 -L1: jmpfdec gr117,L2 - subc gr97,gr97,gr105 - jmp Lstore - mtsr cr,gr118 -L2: jmpfdec gr117,L3 - subc gr98,gr98,gr106 - jmp Lstore - mtsr cr,gr118 -L3: jmpfdec gr117,L4 - subc gr99,gr99,gr107 - jmp Lstore - mtsr cr,gr118 -L4: jmpfdec gr117,L5 - subc gr100,gr100,gr108 - jmp Lstore - mtsr cr,gr118 -L5: jmpfdec gr117,L6 - subc gr101,gr101,gr109 - jmp Lstore - mtsr cr,gr118 -L6: subc gr102,gr102,gr110 - -Lstore: storem 0,0,gr96,lr2 - subc gr116,gr116,gr116 ; gr116 = not(cy) - -Lend: jmpi lr0 - add gr96,gr116,1 diff --git a/rts/gmp/mpn/a29k/submul_1.s b/rts/gmp/mpn/a29k/submul_1.s deleted file mode 100644 index ef97d8d..0000000 --- a/rts/gmp/mpn/a29k/submul_1.s +++ /dev/null @@ -1,116 +0,0 @@ -; 29000 __gmpn_submul_1 -- Multiply a limb vector with a single limb and -; subtract the product from a second limb vector. - -; Copyright (C) 1992, 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. - - -; INPUT PARAMETERS -; res_ptr lr2 -; s1_ptr lr3 -; size lr4 -; s2_limb lr5 - - .cputype 29050 - .sect .lit,lit - .text - .align 4 - .global ___gmpn_submul_1 - .word 0x60000 -___gmpn_submul_1: - sub lr4,lr4,8 - jmpt lr4,Ltail - const gr120,0 ; init cylimb reg - - srl gr117,lr4,3 ; divide by 8 - sub gr117,gr117,1 ; count for jmpfdec - -Loop: mtsrim cr,(8-1) - loadm 0,0,gr96,lr3 - add lr3,lr3,32 - - multiplu gr104,gr96,lr5 - multmu gr96,gr96,lr5 - multiplu gr105,gr97,lr5 - multmu gr97,gr97,lr5 - multiplu gr106,gr98,lr5 - multmu gr98,gr98,lr5 - multiplu gr107,gr99,lr5 - multmu gr99,gr99,lr5 - multiplu gr108,gr100,lr5 - multmu gr100,gr100,lr5 - multiplu gr109,gr101,lr5 - multmu gr101,gr101,lr5 - multiplu gr110,gr102,lr5 - multmu gr102,gr102,lr5 - multiplu gr111,gr103,lr5 - multmu gr103,gr103,lr5 - - add gr104,gr104,gr120 - addc gr105,gr105,gr96 - addc gr106,gr106,gr97 - addc gr107,gr107,gr98 - addc gr108,gr108,gr99 - addc gr109,gr109,gr100 - addc gr110,gr110,gr101 - addc gr111,gr111,gr102 - addc gr120,gr103,0 - - mtsrim cr,(8-1) - loadm 0,0,gr96,lr2 - - sub gr96,gr96,gr104 - subc gr97,gr97,gr105 - subc gr98,gr98,gr106 - subc gr99,gr99,gr107 - subc gr100,gr100,gr108 - subc gr101,gr101,gr109 - subc gr102,gr102,gr110 - subc gr103,gr103,gr111 - - add gr104,gr103,gr111 ; invert carry from previus sub - addc gr120,gr120,0 - - mtsrim cr,(8-1) - storem 0,0,gr96,lr2 - jmpfdec gr117,Loop - add lr2,lr2,32 - -Ltail: and lr4,lr4,(8-1) - sub gr118,lr4,1 ; count for CR - jmpt gr118,Lend - sub lr4,lr4,2 - sub lr2,lr2,4 ; offset res_ptr by one limb - -Loop2: load 0,0,gr116,lr3 - add lr3,lr3,4 - multiplu gr117,gr116,lr5 - multmu gr118,gr116,lr5 - add lr2,lr2,4 - load 0,0,gr119,lr2 - add gr117,gr117,gr120 - addc gr118,gr118,0 - sub gr119,gr119,gr117 - add gr104,gr119,gr117 ; invert carry from previus sub - store 0,0,gr119,lr2 - jmpfdec lr4,Loop2 - addc gr120,gr118,0 - -Lend: jmpi lr0 - or gr96,gr120,0 ; copy diff --git a/rts/gmp/mpn/a29k/udiv.s b/rts/gmp/mpn/a29k/udiv.s deleted file mode 100644 index fdd53a9..0000000 --- a/rts/gmp/mpn/a29k/udiv.s +++ /dev/null @@ -1,30 +0,0 @@ -; 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. - - .sect .lit,lit - .text - .align 4 - .global ___udiv_qrnnd - .word 0x60000 -___udiv_qrnnd: - mtsr q,lr3 - dividu gr96,lr4,lr5 - mfsr gr116,q - jmpi lr0 - store 0,0,gr116,lr2 diff --git a/rts/gmp/mpn/a29k/umul.s b/rts/gmp/mpn/a29k/umul.s deleted file mode 100644 index 7741981..0000000 --- a/rts/gmp/mpn/a29k/umul.s +++ /dev/null @@ -1,29 +0,0 @@ -; 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. - - .sect .lit,lit - .text - .align 4 - .global ___umul_ppmm - .word 0x50000 -___umul_ppmm: - multiplu gr116,lr3,lr4 - multmu gr96,lr3,lr4 - jmpi lr0 - store 0,0,gr116,lr2 diff --git a/rts/gmp/mpn/alpha/README b/rts/gmp/mpn/alpha/README deleted file mode 100644 index 744260c..0000000 --- a/rts/gmp/mpn/alpha/README +++ /dev/null @@ -1,224 +0,0 @@ -This directory contains mpn functions optimized for DEC Alpha processors. - -ALPHA ASSEMBLY RULES AND REGULATIONS - -The `.prologue N' pseudo op marks the end of instruction that needs -special handling by unwinding. It also says whether $27 is really -needed for computing the gp. The `.mask M' pseudo op says which -registers are saved on the stack, and at what offset in the frame. - -Cray code is very very different... - - -RELEVANT OPTIMIZATION ISSUES - -EV4 - -1. This chip has very limited store bandwidth. The on-chip L1 cache is - write-through, and a cache line is transfered from the store buffer to - the off-chip L2 in as much 15 cycles on most systems. This delay hurts - mpn_add_n, mpn_sub_n, mpn_lshift, and mpn_rshift. - -2. Pairing is possible between memory instructions and integer arithmetic - instructions. - -3. mulq and umulh are documented to have a latency of 23 cycles, but 2 of - these cycles are pipelined. Thus, multiply instructions can be issued at - a rate of one each 21st cycle. - -EV5 - -1. The memory bandwidth of this chip seems excellent, both for loads and - stores. Even when the working set is larger than the on-chip L1 and L2 - caches, the performance remain almost unaffected. - -2. mulq has a latency of 12 cycles and an issue rate of 1 each 8th cycle. - umulh has a measured latency of 14 cycles and an issue rate of 1 each - 10th cycle. But the exact timing is somewhat confusing. - -3. mpn_add_n. With 4-fold unrolling, we need 37 instructions, whereof 12 - are memory operations. This will take at least - ceil(37/2) [dual issue] + 1 [taken branch] = 19 cycles - We have 12 memory cycles, plus 4 after-store conflict cycles, or 16 data - cache cycles, which should be completely hidden in the 19 issue cycles. - The computation is inherently serial, with these dependencies: - - ldq ldq - \ /\ - (or) addq | - |\ / \ | - | addq cmpult - \ | | - cmpult | - \ / - or - - I.e., 3 operations are needed between carry-in and carry-out, making 12 - cycles the absolute minimum for the 4 limbs. We could replace the `or' - with a cmoveq/cmovne, which could issue one cycle earlier that the `or', - but that might waste a cycle on EV4. The total depth remain unaffected, - since cmov has a latency of 2 cycles. - - addq - / \ - addq cmpult - | \ - cmpult -> cmovne - -Montgomery has a slightly different way of computing carry that requires one -less instruction, but has depth 4 (instead of the current 3). Since the -code is currently instruction issue bound, Montgomery's idea should save us -1/2 cycle per limb, or bring us down to a total of 17 cycles or 4.25 -cycles/limb. Unfortunately, this method will not be good for the EV6. - -EV6 - -Here we have a really parallel pipeline, capable of issuing up to 4 integer -instructions per cycle. One integer multiply instruction can issue each -cycle. To get optimal speed, we need to pretend we are vectorizing the code, -i.e., minimize the iterative dependencies. - -There are two dependencies to watch out for. 1) Address arithmetic -dependencies, and 2) carry propagation dependencies. - -We can avoid serializing due to address arithmetic by unrolling the loop, so -that addresses don't depend heavily on an index variable. Avoiding -serializing because of carry propagation is trickier; the ultimate performance -of the code will be determined of the number of latency cycles it takes from -accepting carry-in to a vector point until we can generate carry-out. - -Most integer instructions can execute in either the L0, U0, L1, or U1 -pipelines. Shifts only execute in U0 and U1, and multiply only in U1. - -CMOV instructions split into two internal instructions, CMOV1 and CMOV2, but -the execute efficiently. But CMOV split the mapping process (see pg 2-26 in -cmpwrgd.pdf), suggesting the CMOV should always be placed as the last -instruction of an aligned 4 instruction block (?). - -Perhaps the most important issue is the latency between the L0/U0 and L1/U1 -clusters; a result obtained on either cluster has an extra cycle of latency -for consumers in the opposite cluster. Because of the dynamic nature of the -implementation, it is hard to predict where an instruction will execute. - -The shift loops need (per limb): - 1 load (Lx pipes) - 1 store (Lx pipes) - 2 shift (Ux pipes) - 1 iaddlog (Lx pipes, Ux pipes) -Obviously, since the pipes are very equally loaded, we should get 4 insn/cycle, or 1.25 cycles/limb. - -For mpn_add_n, we currently have - 2 load (Lx pipes) - 1 store (Lx pipes) - 5 iaddlog (Lx pipes, Ux pipes) - -Again, we have a perfect balance and will be limited by carry propagation -delays, currently three cycles. The superoptimizer indicates that ther -might be sequences that--using a final cmov--have a carry propagation delay -of just two. Montgomery's subtraction sequence could perhaps be used, by -complementing some operands. All in all, we should get down to 2 cycles -without much problems. - -For mpn_mul_1, we could do, just like for mpn_add_n: - not newlo,notnewlo - addq cylimb,newlo,newlo || cmpult cylimb,notnewlo,cyout - addq cyout,newhi,cylimb -and get 2-cycle carry propagation. The instructions needed will be - 1 ld (Lx pipes) - 1 st (Lx pipes) - 2 mul (U1 pipe) - 4 iaddlog (Lx pipes, Ux pipes) -issue1: addq not mul ld -issue2: cmpult addq mul st -Conclusion: no cluster delays and 2-cycle carry delays will give us 2 cycles/limb! - -Last, we have mpn_addmul_1. Almost certainly, we will get down to 3 -cycles/limb, which would be absolutely awesome. - -Old, perhaps obsolete addmul_1 dependency diagram (needs 175 columns wide screen): - - i - s - s i - u n - e s - d t - r - i u -l n c -i s t -v t i -e r o - u n -v c -a t t -l i y -u o p -e n e -s s s - issue - in - cycle - -1 ldq - / \ - 0 | \ - | \ - 1 | | - | | - 2 | | ldq - | | / \ - 3 | mulq | \ - | \ | \ - 4 umulh \ | | - | | | | - 5 | | | | ldq - | | | | / \ - 4calm 6 | | ldq | mulq | \ - | | / | \ | \ - 4casm 7 | | / umulh \ | | -6 | || | | | | - 3aal 8 | || | | | | ldq -7 | || | | | | / \ - 4calm 9 | || | | ldq | mulq | \ -9 | || | | / | \ | \ - 4casm 10 | || | | / umulh \ | | -9 | || | || | | | | - 3aal 11 | addq | || | | | | ldq -9 | // \ | || | | | | / \ - 4calm 12 \ cmpult addq<-cy | || | | ldq | mulq | \ -13 \ / // \ | || | | / | \ | \ - 4casm 13 addq cmpult stq | || | | / umulh \ | | -11 \ / | || | || | | | | - 3aal 14 addq | addq | || | | | | ldq -10 \ | // \ | || | | | | / \ - 4calm 15 cy ----> \ cmpult addq<-cy | || | | ldq | mulq | \ -13 \ / // \ | || | | / | \ | \ - 4casm 16 addq cmpult stq | || | | / umulh \ | | -11 \ / | || | || | | | | - 3aal 17 addq | addq | || | | | | -10 \ | // \ | || | | | | - 4calm 18 cy ----> \ cmpult addq<-cy | || | | ldq | mulq -13 \ / // \ | || | | / | \ - 4casm 19 addq cmpult stq | || | | / umulh \ -11 \ / | || | || | | - 3aal 20 addq | addq | || | | -10 \ | // \ | || | | - 4calm 21 cy ----> \ cmpult addq<-cy | || | | ldq - \ / // \ | || | | / - 22 addq cmpult stq | || | | / - \ / | || | || - 23 addq | addq | || - \ | // \ | || - 24 cy ----> \ cmpult addq<-cy | || - \ / // \ | || - 25 addq cmpult stq | || - \ / | || - 26 addq | addq - \ | // \ - 27 cy ----> \ cmpult addq<-cy - \ / // \ - 28 addq cmpult stq - \ / -As many as 6 consecutive points will be under execution simultaneously, or if we addq -schedule loads even further away, maybe 7 or 8. But the number of live quantities \ -is reasonable, and can easily be satisfied. cy ----> diff --git a/rts/gmp/mpn/alpha/add_n.asm b/rts/gmp/mpn/alpha/add_n.asm deleted file mode 100644 index 08d6a9f..0000000 --- a/rts/gmp/mpn/alpha/add_n.asm +++ /dev/null @@ -1,114 +0,0 @@ -dnl Alpha mpn_add_n -- Add two limb vectors of the same length > 0 and -dnl store sum in a third limb vector. - -dnl Copyright (C) 1995, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published by -dnl the Free Software Foundation; either version 2.1 of the License, or (at your -dnl option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - -include(`../config.m4') - -dnl INPUT PARAMETERS -dnl res_ptr r16 -dnl s1_ptr r17 -dnl s2_ptr r18 -dnl size r19 - -ASM_START() -PROLOGUE(mpn_add_n) - ldq r3,0(r17) - ldq r4,0(r18) - - subq r19,1,r19 - and r19,4-1,r2 C number of limbs in first loop - bis r31,r31,r0 - beq r2,$L0 C if multiple of 4 limbs, skip first loop - - subq r19,r2,r19 - -$Loop0: subq r2,1,r2 - ldq r5,8(r17) - addq r4,r0,r4 - ldq r6,8(r18) - cmpult r4,r0,r1 - addq r3,r4,r4 - cmpult r4,r3,r0 - stq r4,0(r16) - bis r0,r1,r0 - - addq r17,8,r17 - addq r18,8,r18 - bis r5,r5,r3 - bis r6,r6,r4 - addq r16,8,r16 - bne r2,$Loop0 - -$L0: beq r19,$Lend - - ALIGN(8) -$Loop: subq r19,4,r19 - - ldq r5,8(r17) - addq r4,r0,r4 - ldq r6,8(r18) - cmpult r4,r0,r1 - addq r3,r4,r4 - cmpult r4,r3,r0 - stq r4,0(r16) - bis r0,r1,r0 - - ldq r3,16(r17) - addq r6,r0,r6 - ldq r4,16(r18) - cmpult r6,r0,r1 - addq r5,r6,r6 - cmpult r6,r5,r0 - stq r6,8(r16) - bis r0,r1,r0 - - ldq r5,24(r17) - addq r4,r0,r4 - ldq r6,24(r18) - cmpult r4,r0,r1 - addq r3,r4,r4 - cmpult r4,r3,r0 - stq r4,16(r16) - bis r0,r1,r0 - - ldq r3,32(r17) - addq r6,r0,r6 - ldq r4,32(r18) - cmpult r6,r0,r1 - addq r5,r6,r6 - cmpult r6,r5,r0 - stq r6,24(r16) - bis r0,r1,r0 - - addq r17,32,r17 - addq r18,32,r18 - addq r16,32,r16 - bne r19,$Loop - -$Lend: addq r4,r0,r4 - cmpult r4,r0,r1 - addq r3,r4,r4 - cmpult r4,r3,r0 - stq r4,0(r16) - bis r0,r1,r0 - ret r31,(r26),1 -EPILOGUE(mpn_add_n) -ASM_END() diff --git a/rts/gmp/mpn/alpha/addmul_1.asm b/rts/gmp/mpn/alpha/addmul_1.asm deleted file mode 100644 index 4ea900b..0000000 --- a/rts/gmp/mpn/alpha/addmul_1.asm +++ /dev/null @@ -1,87 +0,0 @@ -dnl Alpha __gmpn_addmul_1 -- Multiply a limb vector with a limb and add -dnl the result to a second limb vector. - -dnl Copyright (C) 1992, 1994, 1995, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published -dnl by the Free Software Foundation; either version 2.1 of the License, or (at -dnl your option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - -include(`../config.m4') - -dnl INPUT PARAMETERS -dnl res_ptr r16 -dnl s1_ptr r17 -dnl size r18 -dnl s2_limb r19 - -dnl This code runs at 42 cycles/limb on EV4, 18 cycles/limb on EV5, and 7 -dnl cycles/limb on EV6. - -ASM_START() -PROLOGUE(mpn_addmul_1) - ldq r2,0(r17) C r2 = s1_limb - addq r17,8,r17 C s1_ptr++ - subq r18,1,r18 C size-- - mulq r2,r19,r3 C r3 = prod_low - ldq r5,0(r16) C r5 = *res_ptr - umulh r2,r19,r0 C r0 = prod_high - beq r18,$Lend1 C jump if size was == 1 - ldq r2,0(r17) C r2 = s1_limb - addq r17,8,r17 C s1_ptr++ - subq r18,1,r18 C size-- - addq r5,r3,r3 - cmpult r3,r5,r4 - stq r3,0(r16) - addq r16,8,r16 C res_ptr++ - beq r18,$Lend2 C jump if size was == 2 - - ALIGN(8) -$Loop: mulq r2,r19,r3 C r3 = prod_low - ldq r5,0(r16) C r5 = *res_ptr - addq r4,r0,r0 C cy_limb = cy_limb + 'cy' - subq r18,1,r18 C size-- - umulh r2,r19,r4 C r4 = cy_limb - ldq r2,0(r17) C r2 = s1_limb - addq r17,8,r17 C s1_ptr++ - addq r3,r0,r3 C r3 = cy_limb + prod_low - cmpult r3,r0,r0 C r0 = carry from (cy_limb + prod_low) - addq r5,r3,r3 - cmpult r3,r5,r5 - stq r3,0(r16) - addq r16,8,r16 C res_ptr++ - addq r5,r0,r0 C combine carries - bne r18,$Loop - -$Lend2: mulq r2,r19,r3 C r3 = prod_low - ldq r5,0(r16) C r5 = *res_ptr - addq r4,r0,r0 C cy_limb = cy_limb + 'cy' - umulh r2,r19,r4 C r4 = cy_limb - addq r3,r0,r3 C r3 = cy_limb + prod_low - cmpult r3,r0,r0 C r0 = carry from (cy_limb + prod_low) - addq r5,r3,r3 - cmpult r3,r5,r5 - stq r3,0(r16) - addq r5,r0,r0 C combine carries - addq r4,r0,r0 C cy_limb = prod_high + cy - ret r31,(r26),1 -$Lend1: addq r5,r3,r3 - cmpult r3,r5,r5 - stq r3,0(r16) - addq r0,r5,r0 - ret r31,(r26),1 -EPILOGUE(mpn_addmul_1) -ASM_END() diff --git a/rts/gmp/mpn/alpha/cntlz.asm b/rts/gmp/mpn/alpha/cntlz.asm deleted file mode 100644 index febb3b7..0000000 --- a/rts/gmp/mpn/alpha/cntlz.asm +++ /dev/null @@ -1,68 +0,0 @@ -dnl Alpha auxiliary for longlong.h's count_leading_zeros - -dnl Copyright (C) 1997, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published by -dnl the Free Software Foundation; either version 2.1 of the License, or (at your -dnl option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - -include(`../config.m4') - -dnl DISCUSSION: - -dnl Other methods have been tried, and using a 128-entry table actually trims -dnl about 10% of the execution time (on a 21164) when the table is in the L1 -dnl cache. But under non-benchmarking conditions, the table will hardly be in -dnl the L1 cache. Tricky bit-fiddling methods with multiplies and magic tables -dnl are also possible, but they require many more instructions than the current -dnl code. (But for count_trailing_zeros, such tricks are beneficial.) -dnl Finally, converting to floating-point and extracting the exponent is much -dnl slower. - -ASM_START() -PROLOGUE(MPN(count_leading_zeros)) - bis r31,63,r0 C initialize partial result count - - srl r16,32,r1 C shift down 32 steps -> r1 - cmovne r1,r1,r16 C select r1 if non-zero - cmovne r1,31,r0 C if r1 is nonzero choose smaller count - - srl r16,16,r1 C shift down 16 steps -> r1 - subq r0,16,r2 C generate new partial result count - cmovne r1,r1,r16 C choose new r1 if non-zero - cmovne r1,r2,r0 C choose new count if r1 was non-zero - - srl r16,8,r1 - subq r0,8,r2 - cmovne r1,r1,r16 - cmovne r1,r2,r0 - - srl r16,4,r1 - subq r0,4,r2 - cmovne r1,r1,r16 - cmovne r1,r2,r0 - - srl r16,2,r1 - subq r0,2,r2 - cmovne r1,r1,r16 - cmovne r1,r2,r0 - - srl r16,1,r1 C extract bit 1 - subq r0,r1,r0 C subtract it from partial result - - ret r31,(r26),1 -EPILOGUE(MPN(count_leading_zeros)) -ASM_END() diff --git a/rts/gmp/mpn/alpha/default.m4 b/rts/gmp/mpn/alpha/default.m4 deleted file mode 100644 index 5f4c48d..0000000 --- a/rts/gmp/mpn/alpha/default.m4 +++ /dev/null @@ -1,77 +0,0 @@ -divert(-1) - - -dnl Copyright (C) 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -define(`ASM_START', - ` - .set noreorder - .set noat') - -define(`X',`0x$1') -define(`FLOAT64', - ` - .align 3 -$1: .t_floating $2') - -define(`PROLOGUE', - ` - .text - .align 3 - .globl $1 - .ent $1 -$1: - .frame r30,0,r26 - .prologue 0') - -define(`PROLOGUE_GP', - ` - .text - .align 3 - .globl $1 - .ent $1 -$1: - ldgp r29,0(r27) - .frame r30,0,r26 - .prologue 1') - -define(`EPILOGUE', - ` - .end $1') - -dnl Map register names r0, r1, etc, to `$0', `$1', etc. -dnl This is needed on all systems but Unicos -forloop(i,0,31, -`define(`r'i,``$''i)' -) -forloop(i,0,31, -`define(`f'i,``$f''i)' -) - -define(`DATASTART', - `dnl - DATA -$1:') -define(`DATAEND',`dnl') - -define(`ASM_END',`dnl') - -divert diff --git a/rts/gmp/mpn/alpha/ev5/add_n.asm b/rts/gmp/mpn/alpha/ev5/add_n.asm deleted file mode 100644 index 716d640..0000000 --- a/rts/gmp/mpn/alpha/ev5/add_n.asm +++ /dev/null @@ -1,143 +0,0 @@ -dnl Alpha EV5 __gmpn_add_n -- Add two limb vectors of the same length > 0 and -dnl store sum in a third limb vector. - -dnl Copyright (C) 1995, 1999, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published by -dnl the Free Software Foundation; either version 2.1 of the License, or (at your -dnl option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - -include(`../config.m4') - -dnl INPUT PARAMETERS -dnl res_ptr r16 -dnl s1_ptr r17 -dnl s2_ptr r18 -dnl size r19 - -ASM_START() -PROLOGUE(mpn_add_n) - bis r31,r31,r25 C clear cy - subq r19,4,r19 C decr loop cnt - blt r19,$Lend2 C if less than 4 limbs, goto 2nd loop -C Start software pipeline for 1st loop - ldq r0,0(r18) - ldq r4,0(r17) - ldq r1,8(r18) - ldq r5,8(r17) - addq r17,32,r17 C update s1_ptr - ldq r2,16(r18) - addq r0,r4,r20 C 1st main add - ldq r3,24(r18) - subq r19,4,r19 C decr loop cnt - ldq r6,-16(r17) - cmpult r20,r0,r25 C compute cy from last add - ldq r7,-8(r17) - addq r1,r5,r28 C 2nd main add - addq r18,32,r18 C update s2_ptr - addq r28,r25,r21 C 2nd carry add - cmpult r28,r5,r8 C compute cy from last add - blt r19,$Lend1 C if less than 4 limbs remain, jump -C 1st loop handles groups of 4 limbs in a software pipeline - ALIGN(16) -$Loop: cmpult r21,r28,r25 C compute cy from last add - ldq r0,0(r18) - bis r8,r25,r25 C combine cy from the two adds - ldq r1,8(r18) - addq r2,r6,r28 C 3rd main add - ldq r4,0(r17) - addq r28,r25,r22 C 3rd carry add - ldq r5,8(r17) - cmpult r28,r6,r8 C compute cy from last add - cmpult r22,r28,r25 C compute cy from last add - stq r20,0(r16) - bis r8,r25,r25 C combine cy from the two adds - stq r21,8(r16) - addq r3,r7,r28 C 4th main add - addq r28,r25,r23 C 4th carry add - cmpult r28,r7,r8 C compute cy from last add - cmpult r23,r28,r25 C compute cy from last add - addq r17,32,r17 C update s1_ptr - bis r8,r25,r25 C combine cy from the two adds - addq r16,32,r16 C update res_ptr - addq r0,r4,r28 C 1st main add - ldq r2,16(r18) - addq r25,r28,r20 C 1st carry add - ldq r3,24(r18) - cmpult r28,r4,r8 C compute cy from last add - ldq r6,-16(r17) - cmpult r20,r28,r25 C compute cy from last add - ldq r7,-8(r17) - bis r8,r25,r25 C combine cy from the two adds - subq r19,4,r19 C decr loop cnt - stq r22,-16(r16) - addq r1,r5,r28 C 2nd main add - stq r23,-8(r16) - addq r25,r28,r21 C 2nd carry add - addq r18,32,r18 C update s2_ptr - cmpult r28,r5,r8 C compute cy from last add - bge r19,$Loop -C Finish software pipeline for 1st loop -$Lend1: cmpult r21,r28,r25 C compute cy from last add - bis r8,r25,r25 C combine cy from the two adds - addq r2,r6,r28 C 3rd main add - addq r28,r25,r22 C 3rd carry add - cmpult r28,r6,r8 C compute cy from last add - cmpult r22,r28,r25 C compute cy from last add - stq r20,0(r16) - bis r8,r25,r25 C combine cy from the two adds - stq r21,8(r16) - addq r3,r7,r28 C 4th main add - addq r28,r25,r23 C 4th carry add - cmpult r28,r7,r8 C compute cy from last add - cmpult r23,r28,r25 C compute cy from last add - bis r8,r25,r25 C combine cy from the two adds - addq r16,32,r16 C update res_ptr - stq r22,-16(r16) - stq r23,-8(r16) -$Lend2: addq r19,4,r19 C restore loop cnt - beq r19,$Lret -C Start software pipeline for 2nd loop - ldq r0,0(r18) - ldq r4,0(r17) - subq r19,1,r19 - beq r19,$Lend0 -C 2nd loop handles remaining 1-3 limbs - ALIGN(16) -$Loop0: addq r0,r4,r28 C main add - ldq r0,8(r18) - cmpult r28,r4,r8 C compute cy from last add - ldq r4,8(r17) - addq r28,r25,r20 C carry add - addq r18,8,r18 - addq r17,8,r17 - stq r20,0(r16) - cmpult r20,r28,r25 C compute cy from last add - subq r19,1,r19 C decr loop cnt - bis r8,r25,r25 C combine cy from the two adds - addq r16,8,r16 - bne r19,$Loop0 -$Lend0: addq r0,r4,r28 C main add - addq r28,r25,r20 C carry add - cmpult r28,r4,r8 C compute cy from last add - cmpult r20,r28,r25 C compute cy from last add - stq r20,0(r16) - bis r8,r25,r25 C combine cy from the two adds - -$Lret: bis r25,r31,r0 C return cy - ret r31,(r26),1 -EPILOGUE(mpn_add_n) -ASM_END() diff --git a/rts/gmp/mpn/alpha/ev5/lshift.asm b/rts/gmp/mpn/alpha/ev5/lshift.asm deleted file mode 100644 index cb181dd..0000000 --- a/rts/gmp/mpn/alpha/ev5/lshift.asm +++ /dev/null @@ -1,169 +0,0 @@ -dnl Alpha EV5 __gmpn_lshift -- Shift a number left. - -dnl Copyright (C) 1994, 1995, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published by -dnl the Free Software Foundation; either version 2.1 of the License, or (at your -dnl option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - -include(`../config.m4') - -dnl INPUT PARAMETERS -dnl res_ptr r16 -dnl s1_ptr r17 -dnl size r18 -dnl cnt r19 - -dnl This code runs at 3.25 cycles/limb on the EV5. - -ASM_START() -PROLOGUE(mpn_lshift) - s8addq r18,r17,r17 C make r17 point at end of s1 - ldq r4,-8(r17) C load first limb - subq r31,r19,r20 - s8addq r18,r16,r16 C make r16 point at end of RES - subq r18,1,r18 - and r18,4-1,r28 C number of limbs in first loop - srl r4,r20,r0 C compute function result - - beq r28,$L0 - subq r18,r28,r18 - - ALIGN(8) -$Loop0: ldq r3,-16(r17) - subq r16,8,r16 - sll r4,r19,r5 - subq r17,8,r17 - subq r28,1,r28 - srl r3,r20,r6 - bis r3,r3,r4 - bis r5,r6,r8 - stq r8,0(r16) - bne r28,$Loop0 - -$L0: sll r4,r19,r24 - beq r18,$Lend -C warm up phase 1 - ldq r1,-16(r17) - subq r18,4,r18 - ldq r2,-24(r17) - ldq r3,-32(r17) - ldq r4,-40(r17) - beq r18,$Lend1 -C warm up phase 2 - srl r1,r20,r7 - sll r1,r19,r21 - srl r2,r20,r8 - ldq r1,-48(r17) - sll r2,r19,r22 - ldq r2,-56(r17) - srl r3,r20,r5 - bis r7,r24,r7 - sll r3,r19,r23 - bis r8,r21,r8 - srl r4,r20,r6 - ldq r3,-64(r17) - sll r4,r19,r24 - ldq r4,-72(r17) - subq r18,4,r18 - beq r18,$Lend2 - ALIGN(16) -C main loop -$Loop: stq r7,-8(r16) - bis r5,r22,r5 - stq r8,-16(r16) - bis r6,r23,r6 - - srl r1,r20,r7 - subq r18,4,r18 - sll r1,r19,r21 - unop C ldq r31,-96(r17) - - srl r2,r20,r8 - ldq r1,-80(r17) - sll r2,r19,r22 - ldq r2,-88(r17) - - stq r5,-24(r16) - bis r7,r24,r7 - stq r6,-32(r16) - bis r8,r21,r8 - - srl r3,r20,r5 - unop C ldq r31,-96(r17) - sll r3,r19,r23 - subq r16,32,r16 - - srl r4,r20,r6 - ldq r3,-96(r17) - sll r4,r19,r24 - ldq r4,-104(r17) - - subq r17,32,r17 - bne r18,$Loop -C cool down phase 2/1 -$Lend2: stq r7,-8(r16) - bis r5,r22,r5 - stq r8,-16(r16) - bis r6,r23,r6 - srl r1,r20,r7 - sll r1,r19,r21 - srl r2,r20,r8 - sll r2,r19,r22 - stq r5,-24(r16) - bis r7,r24,r7 - stq r6,-32(r16) - bis r8,r21,r8 - srl r3,r20,r5 - sll r3,r19,r23 - srl r4,r20,r6 - sll r4,r19,r24 -C cool down phase 2/2 - stq r7,-40(r16) - bis r5,r22,r5 - stq r8,-48(r16) - bis r6,r23,r6 - stq r5,-56(r16) - stq r6,-64(r16) -C cool down phase 2/3 - stq r24,-72(r16) - ret r31,(r26),1 - -C cool down phase 1/1 -$Lend1: srl r1,r20,r7 - sll r1,r19,r21 - srl r2,r20,r8 - sll r2,r19,r22 - srl r3,r20,r5 - bis r7,r24,r7 - sll r3,r19,r23 - bis r8,r21,r8 - srl r4,r20,r6 - sll r4,r19,r24 -C cool down phase 1/2 - stq r7,-8(r16) - bis r5,r22,r5 - stq r8,-16(r16) - bis r6,r23,r6 - stq r5,-24(r16) - stq r6,-32(r16) - stq r24,-40(r16) - ret r31,(r26),1 - -$Lend: stq r24,-8(r16) - ret r31,(r26),1 -EPILOGUE(mpn_lshift) -ASM_END() diff --git a/rts/gmp/mpn/alpha/ev5/rshift.asm b/rts/gmp/mpn/alpha/ev5/rshift.asm deleted file mode 100644 index 9940d83..0000000 --- a/rts/gmp/mpn/alpha/ev5/rshift.asm +++ /dev/null @@ -1,167 +0,0 @@ -dnl Alpha EV5 __gmpn_rshift -- Shift a number right. - -dnl Copyright (C) 1994, 1995, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published by -dnl the Free Software Foundation; either version 2.1 of the License, or (at your -dnl option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - -include(`../config.m4') - -dnl INPUT PARAMETERS -dnl res_ptr r16 -dnl s1_ptr r17 -dnl size r18 -dnl cnt r19 - -dnl This code runs at 3.25 cycles/limb on the EV5. - -ASM_START() -PROLOGUE(mpn_rshift) - ldq r4,0(r17) C load first limb - subq r31,r19,r20 - subq r18,1,r18 - and r18,4-1,r28 C number of limbs in first loop - sll r4,r20,r0 C compute function result - - beq r28,$L0 - subq r18,r28,r18 - - ALIGN(8) -$Loop0: ldq r3,8(r17) - addq r16,8,r16 - srl r4,r19,r5 - addq r17,8,r17 - subq r28,1,r28 - sll r3,r20,r6 - bis r3,r3,r4 - bis r5,r6,r8 - stq r8,-8(r16) - bne r28,$Loop0 - -$L0: srl r4,r19,r24 - beq r18,$Lend -C warm up phase 1 - ldq r1,8(r17) - subq r18,4,r18 - ldq r2,16(r17) - ldq r3,24(r17) - ldq r4,32(r17) - beq r18,$Lend1 -C warm up phase 2 - sll r1,r20,r7 - srl r1,r19,r21 - sll r2,r20,r8 - ldq r1,40(r17) - srl r2,r19,r22 - ldq r2,48(r17) - sll r3,r20,r5 - bis r7,r24,r7 - srl r3,r19,r23 - bis r8,r21,r8 - sll r4,r20,r6 - ldq r3,56(r17) - srl r4,r19,r24 - ldq r4,64(r17) - subq r18,4,r18 - beq r18,$Lend2 - ALIGN(16) -C main loop -$Loop: stq r7,0(r16) - bis r5,r22,r5 - stq r8,8(r16) - bis r6,r23,r6 - - sll r1,r20,r7 - subq r18,4,r18 - srl r1,r19,r21 - unop C ldq r31,-96(r17) - - sll r2,r20,r8 - ldq r1,72(r17) - srl r2,r19,r22 - ldq r2,80(r17) - - stq r5,16(r16) - bis r7,r24,r7 - stq r6,24(r16) - bis r8,r21,r8 - - sll r3,r20,r5 - unop C ldq r31,-96(r17) - srl r3,r19,r23 - addq r16,32,r16 - - sll r4,r20,r6 - ldq r3,88(r17) - srl r4,r19,r24 - ldq r4,96(r17) - - addq r17,32,r17 - bne r18,$Loop -C cool down phase 2/1 -$Lend2: stq r7,0(r16) - bis r5,r22,r5 - stq r8,8(r16) - bis r6,r23,r6 - sll r1,r20,r7 - srl r1,r19,r21 - sll r2,r20,r8 - srl r2,r19,r22 - stq r5,16(r16) - bis r7,r24,r7 - stq r6,24(r16) - bis r8,r21,r8 - sll r3,r20,r5 - srl r3,r19,r23 - sll r4,r20,r6 - srl r4,r19,r24 -C cool down phase 2/2 - stq r7,32(r16) - bis r5,r22,r5 - stq r8,40(r16) - bis r6,r23,r6 - stq r5,48(r16) - stq r6,56(r16) -C cool down phase 2/3 - stq r24,64(r16) - ret r31,(r26),1 - -C cool down phase 1/1 -$Lend1: sll r1,r20,r7 - srl r1,r19,r21 - sll r2,r20,r8 - srl r2,r19,r22 - sll r3,r20,r5 - bis r7,r24,r7 - srl r3,r19,r23 - bis r8,r21,r8 - sll r4,r20,r6 - srl r4,r19,r24 -C cool down phase 1/2 - stq r7,0(r16) - bis r5,r22,r5 - stq r8,8(r16) - bis r6,r23,r6 - stq r5,16(r16) - stq r6,24(r16) - stq r24,32(r16) - ret r31,(r26),1 - -$Lend: stq r24,0(r16) - ret r31,(r26),1 -EPILOGUE(mpn_rshift) -ASM_END() diff --git a/rts/gmp/mpn/alpha/ev5/sub_n.asm b/rts/gmp/mpn/alpha/ev5/sub_n.asm deleted file mode 100644 index 5248a2a..0000000 --- a/rts/gmp/mpn/alpha/ev5/sub_n.asm +++ /dev/null @@ -1,143 +0,0 @@ -dnl Alpha EV5 __gmpn_sub_n -- Subtract two limb vectors of the same length > 0 -dnl and store difference in a third limb vector. - -dnl Copyright (C) 1995, 1999, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published by -dnl the Free Software Foundation; either version 2.1 of the License, or (at your -dnl option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - -include(`../config.m4') - -dnl INPUT PARAMETERS -dnl res_ptr r16 -dnl s1_ptr r17 -dnl s2_ptr r18 -dnl size r19 - -ASM_START() -PROLOGUE(mpn_sub_n) - bis r31,r31,r25 C clear cy - subq r19,4,r19 C decr loop cnt - blt r19,$Lend2 C if less than 4 limbs, goto 2nd loop -C Start software pipeline for 1st loop - ldq r0,0(r18) - ldq r4,0(r17) - ldq r1,8(r18) - ldq r5,8(r17) - addq r17,32,r17 C update s1_ptr - ldq r2,16(r18) - subq r4,r0,r20 C 1st main subtract - ldq r3,24(r18) - subq r19,4,r19 C decr loop cnt - ldq r6,-16(r17) - cmpult r4,r0,r25 C compute cy from last subtract - ldq r7,-8(r17) - subq r5,r1,r28 C 2nd main subtract - addq r18,32,r18 C update s2_ptr - subq r28,r25,r21 C 2nd carry subtract - cmpult r5,r1,r8 C compute cy from last subtract - blt r19,$Lend1 C if less than 4 limbs remain, jump -C 1st loop handles groups of 4 limbs in a software pipeline - ALIGN(16) -$Loop: cmpult r28,r25,r25 C compute cy from last subtract - ldq r0,0(r18) - bis r8,r25,r25 C combine cy from the two subtracts - ldq r1,8(r18) - subq r6,r2,r28 C 3rd main subtract - ldq r4,0(r17) - subq r28,r25,r22 C 3rd carry subtract - ldq r5,8(r17) - cmpult r6,r2,r8 C compute cy from last subtract - cmpult r28,r25,r25 C compute cy from last subtract - stq r20,0(r16) - bis r8,r25,r25 C combine cy from the two subtracts - stq r21,8(r16) - subq r7,r3,r28 C 4th main subtract - subq r28,r25,r23 C 4th carry subtract - cmpult r7,r3,r8 C compute cy from last subtract - cmpult r28,r25,r25 C compute cy from last subtract - addq r17,32,r17 C update s1_ptr - bis r8,r25,r25 C combine cy from the two subtracts - addq r16,32,r16 C update res_ptr - subq r4,r0,r28 C 1st main subtract - ldq r2,16(r18) - subq r28,r25,r20 C 1st carry subtract - ldq r3,24(r18) - cmpult r4,r0,r8 C compute cy from last subtract - ldq r6,-16(r17) - cmpult r28,r25,r25 C compute cy from last subtract - ldq r7,-8(r17) - bis r8,r25,r25 C combine cy from the two subtracts - subq r19,4,r19 C decr loop cnt - stq r22,-16(r16) - subq r5,r1,r28 C 2nd main subtract - stq r23,-8(r16) - subq r28,r25,r21 C 2nd carry subtract - addq r18,32,r18 C update s2_ptr - cmpult r5,r1,r8 C compute cy from last subtract - bge r19,$Loop -C Finish software pipeline for 1st loop -$Lend1: cmpult r28,r25,r25 C compute cy from last subtract - bis r8,r25,r25 C combine cy from the two subtracts - subq r6,r2,r28 C cy add - subq r28,r25,r22 C 3rd main subtract - cmpult r6,r2,r8 C compute cy from last subtract - cmpult r28,r25,r25 C compute cy from last subtract - stq r20,0(r16) - bis r8,r25,r25 C combine cy from the two subtracts - stq r21,8(r16) - subq r7,r3,r28 C cy add - subq r28,r25,r23 C 4th main subtract - cmpult r7,r3,r8 C compute cy from last subtract - cmpult r28,r25,r25 C compute cy from last subtract - bis r8,r25,r25 C combine cy from the two subtracts - addq r16,32,r16 C update res_ptr - stq r22,-16(r16) - stq r23,-8(r16) -$Lend2: addq r19,4,r19 C restore loop cnt - beq r19,$Lret -C Start software pipeline for 2nd loop - ldq r0,0(r18) - ldq r4,0(r17) - subq r19,1,r19 - beq r19,$Lend0 -C 2nd loop handles remaining 1-3 limbs - ALIGN(16) -$Loop0: subq r4,r0,r28 C main subtract - cmpult r4,r0,r8 C compute cy from last subtract - ldq r0,8(r18) - ldq r4,8(r17) - subq r28,r25,r20 C carry subtract - addq r18,8,r18 - addq r17,8,r17 - stq r20,0(r16) - cmpult r28,r25,r25 C compute cy from last subtract - subq r19,1,r19 C decr loop cnt - bis r8,r25,r25 C combine cy from the two subtracts - addq r16,8,r16 - bne r19,$Loop0 -$Lend0: subq r4,r0,r28 C main subtract - subq r28,r25,r20 C carry subtract - cmpult r4,r0,r8 C compute cy from last subtract - cmpult r28,r25,r25 C compute cy from last subtract - stq r20,0(r16) - bis r8,r25,r25 C combine cy from the two subtracts - -$Lret: bis r25,r31,r0 C return cy - ret r31,(r26),1 -EPILOGUE(mpn_sub_n) -ASM_END() diff --git a/rts/gmp/mpn/alpha/ev6/addmul_1.asm b/rts/gmp/mpn/alpha/ev6/addmul_1.asm deleted file mode 100644 index 2f58862..0000000 --- a/rts/gmp/mpn/alpha/ev6/addmul_1.asm +++ /dev/null @@ -1,474 +0,0 @@ -dnl Alpha ev6 mpn_addmul_1 -- Multiply a limb vector with a limb and add -dnl the result to a second limb vector. - -dnl Copyright (C) 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published -dnl by the Free Software Foundation; either version 2.1 of the License, or (at -dnl your option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - -include(`../config.m4') - -dnl INPUT PARAMETERS -dnl res_ptr r16 -dnl s1_ptr r17 -dnl size r18 -dnl s2_limb r19 - -dnl This code runs at 42 cycles/limb on EV4, 18 cycles/limb on EV5, and -dnl exactly 3.625 cycles/limb on EV6... - -dnl This code was written in close cooperation with ev6 pipeline expert -dnl Steve Root (root@toober.hlo.dec.com). Any errors are tege's fault, though. -dnl -dnl Register usages for unrolled loop: -dnl 0-3 mul's -dnl 4-7 acc's -dnl 8-15 mul results -dnl 20,21 carry's -dnl 22,23 save for stores - -dnl Sustains 8 mul-adds in 29 cycles in the unrolled inner loop. - -dnl The stores can issue a cycle late so we have paired no-op's to 'catch' -dnl them, so that further disturbance to the schedule is damped. - -dnl We couldn't pair the loads, because the entangled schedule of the -dnl carry's has to happen on one side {0} of the machine. Note, the total -dnl use of U0, and the total use of L0 (after attending to the stores). -dnl which is part of the reason why.... - -dnl This is a great schedule for the d_cache, a poor schedule for the -dnl b_cache. The lockup on U0 means that any stall can't be recovered -dnl from. Consider a ldq in L1. say that load gets stalled because it -dnl collides with a fill from the b_Cache. On the next cycle, this load -dnl gets priority. If first looks at L0, and goes there. The instruction -dnl we intended for L0 gets to look at L1, which is NOT where we want -dnl it. It either stalls 1, because it can't go in L0, or goes there, and -dnl causes a further instruction to stall. - -dnl So for b_cache, we're likely going to want to put one or more cycles -dnl back into the code! And, of course, put in prefetches. For the -dnl accumulator, lds, intent to modify. For the multiplier, you might -dnl want ldq, evict next, if you're not wanting to use it again soon. Use -dnl 256 ahead of present pointer value. At a place where we have an mt -dnl followed by a bookkeeping, put the bookkeeping in upper, and the -dnl prefetch into lower. - -dnl Note, the usage of physical registers per cycle is smoothed off, as -dnl much as possible. - -dnl Note, the ldq's and stq's are at the end of the quadpacks. note, we'd -dnl like not to have a ldq or stq to preceded a conditional branch in a -dnl quadpack. The conditional branch moves the retire pointer one cycle -dnl later. - -dnl Optimization notes: -dnl Callee-saves regs: r9 r10 r11 r12 r13 r14 r15 r26 ?r27? -dnl Reserved regs: r29 r30 r31 -dnl Free caller-saves regs in unrolled code: r24 r25 r28 -dnl We should swap some of the callee-saves regs for some of the free -dnl caller-saves regs, saving some overhead cycles. -dnl Most importantly, we should write fast code for the 0-7 case. -dnl The code we use there are for the 21164, and runs at 7 cycles/limb -dnl on the 21264. Should not be hard, if we write specialized code for -dnl 1-7 limbs (the one for 0 limbs should be straightforward). We then just -dnl need a jump table indexed by the low 3 bits of the count argument. - - -ASM_START() -PROLOGUE(mpn_addmul_1) - cmpult r18, 8, r1 - beq r1, $Large - - ldq r2, 0(r17) C r2 = s1_limb - addq r17, 8, r17 C s1_ptr++ - subq r18, 1, r18 C size-- - mulq r2, r19, r3 C r3 = prod_low - ldq r5, 0(r16) C r5 = *res_ptr - umulh r2, r19, r0 C r0 = prod_high - beq r18, $Lend0b C jump if size was == 1 - ldq r2, 0(r17) C r2 = s1_limb - addq r17, 8, r17 C s1_ptr++ - subq r18, 1, r18 C size-- - addq r5, r3, r3 - cmpult r3, r5, r4 - stq r3, 0(r16) - addq r16, 8, r16 C res_ptr++ - beq r18, $Lend0a C jump if size was == 2 - - ALIGN(8) -$Loop0: mulq r2, r19, r3 C r3 = prod_low - ldq r5, 0(r16) C r5 = *res_ptr - addq r4, r0, r0 C cy_limb = cy_limb + 'cy' - subq r18, 1, r18 C size-- - umulh r2, r19, r4 C r4 = cy_limb - ldq r2, 0(r17) C r2 = s1_limb - addq r17, 8, r17 C s1_ptr++ - addq r3, r0, r3 C r3 = cy_limb + prod_low - cmpult r3, r0, r0 C r0 = carry from (cy_limb + prod_low) - addq r5, r3, r3 - cmpult r3, r5, r5 - stq r3, 0(r16) - addq r16, 8, r16 C res_ptr++ - addq r5, r0, r0 C combine carries - bne r18, $Loop0 -$Lend0a: - mulq r2, r19, r3 C r3 = prod_low - ldq r5, 0(r16) C r5 = *res_ptr - addq r4, r0, r0 C cy_limb = cy_limb + 'cy' - umulh r2, r19, r4 C r4 = cy_limb - addq r3, r0, r3 C r3 = cy_limb + prod_low - cmpult r3, r0, r0 C r0 = carry from (cy_limb + prod_low) - addq r5, r3, r3 - cmpult r3, r5, r5 - stq r3, 0(r16) - addq r5, r0, r0 C combine carries - addq r4, r0, r0 C cy_limb = prod_high + cy - ret r31, (r26), 1 -$Lend0b: - addq r5, r3, r3 - cmpult r3, r5, r5 - stq r3, 0(r16) - addq r0, r5, r0 - ret r31, (r26), 1 - -$Large: - lda $30, -240($30) - stq $9, 8($30) - stq $10, 16($30) - stq $11, 24($30) - stq $12, 32($30) - stq $13, 40($30) - stq $14, 48($30) - stq $15, 56($30) - - and r18, 7, r20 C count for the first loop, 0-7 - srl r18, 3, r18 C count for unrolled loop - bis r31, r31, r0 - beq r20, $Lunroll - ldq r2, 0(r17) C r2 = s1_limb - addq r17, 8, r17 C s1_ptr++ - subq r20, 1, r20 C size-- - mulq r2, r19, r3 C r3 = prod_low - ldq r5, 0(r16) C r5 = *res_ptr - umulh r2, r19, r0 C r0 = prod_high - beq r20, $Lend1b C jump if size was == 1 - ldq r2, 0(r17) C r2 = s1_limb - addq r17, 8, r17 C s1_ptr++ - subq r20, 1, r20 C size-- - addq r5, r3, r3 - cmpult r3, r5, r4 - stq r3, 0(r16) - addq r16, 8, r16 C res_ptr++ - beq r20, $Lend1a C jump if size was == 2 - - ALIGN(8) -$Loop1: mulq r2, r19, r3 C r3 = prod_low - ldq r5, 0(r16) C r5 = *res_ptr - addq r4, r0, r0 C cy_limb = cy_limb + 'cy' - subq r20, 1, r20 C size-- - umulh r2, r19, r4 C r4 = cy_limb - ldq r2, 0(r17) C r2 = s1_limb - addq r17, 8, r17 C s1_ptr++ - addq r3, r0, r3 C r3 = cy_limb + prod_low - cmpult r3, r0, r0 C r0 = carry from (cy_limb + prod_low) - addq r5, r3, r3 - cmpult r3, r5, r5 - stq r3, 0(r16) - addq r16, 8, r16 C res_ptr++ - addq r5, r0, r0 C combine carries - bne r20, $Loop1 - -$Lend1a: - mulq r2, r19, r3 C r3 = prod_low - ldq r5, 0(r16) C r5 = *res_ptr - addq r4, r0, r0 C cy_limb = cy_limb + 'cy' - umulh r2, r19, r4 C r4 = cy_limb - addq r3, r0, r3 C r3 = cy_limb + prod_low - cmpult r3, r0, r0 C r0 = carry from (cy_limb + prod_low) - addq r5, r3, r3 - cmpult r3, r5, r5 - stq r3, 0(r16) - addq r16, 8, r16 C res_ptr++ - addq r5, r0, r0 C combine carries - addq r4, r0, r0 C cy_limb = prod_high + cy - br r31, $Lunroll -$Lend1b: - addq r5, r3, r3 - cmpult r3, r5, r5 - stq r3, 0(r16) - addq r16, 8, r16 C res_ptr++ - addq r0, r5, r0 - -$Lunroll: - lda r17, -16(r17) C L1 bookkeeping - lda r16, -16(r16) C L1 bookkeeping - bis r0, r31, r12 - -C ____ UNROLLED LOOP SOFTWARE PIPELINE STARTUP ____ - - ldq r2, 16(r17) C L1 - ldq r3, 24(r17) C L1 - lda r18, -1(r18) C L1 bookkeeping - ldq r6, 16(r16) C L1 - ldq r7, 24(r16) C L1 - ldq r0, 32(r17) C L1 - mulq r19, r2, r13 C U1 - ldq r1, 40(r17) C L1 - umulh r19, r2, r14 C U1 - mulq r19, r3, r15 C U1 - lda r17, 64(r17) C L1 bookkeeping - ldq r4, 32(r16) C L1 - ldq r5, 40(r16) C L1 - umulh r19, r3, r8 C U1 - ldq r2, -16(r17) C L1 - mulq r19, r0, r9 C U1 - ldq r3, -8(r17) C L1 - umulh r19, r0, r10 C U1 - addq r6, r13, r6 C L0 lo + acc - mulq r19, r1, r11 C U1 - cmpult r6, r13, r20 C L0 lo add => carry - lda r16, 64(r16) C L1 bookkeeping - addq r6, r12, r22 C U0 hi add => answer - cmpult r22, r12, r21 C L0 hi add => carry - addq r14, r20, r14 C U0 hi mul + carry - ldq r6, -16(r16) C L1 - addq r7, r15, r23 C L0 lo + acc - addq r14, r21, r14 C U0 hi mul + carry - ldq r7, -8(r16) C L1 - umulh r19, r1, r12 C U1 - cmpult r23, r15, r20 C L0 lo add => carry - addq r23, r14, r23 C U0 hi add => answer - ldq r0, 0(r17) C L1 - mulq r19, r2, r13 C U1 - cmpult r23, r14, r21 C L0 hi add => carry - addq r8, r20, r8 C U0 hi mul + carry - ldq r1, 8(r17) C L1 - umulh r19, r2, r14 C U1 - addq r4, r9, r4 C L0 lo + acc - stq r22, -48(r16) C L0 - stq r23, -40(r16) C L1 - mulq r19, r3, r15 C U1 - addq r8, r21, r8 C U0 hi mul + carry - cmpult r4, r9, r20 C L0 lo add => carry - addq r4, r8, r22 C U0 hi add => answer - ble r18, $Lend C U1 bookkeeping - -C ____ MAIN UNROLLED LOOP ____ - ALIGN(16) -$Loop: - bis r31, r31, r31 C U1 mt - cmpult r22, r8, r21 C L0 hi add => carry - addq r10, r20, r10 C U0 hi mul + carry - ldq r4, 0(r16) C L1 - - bis r31, r31, r31 C U1 mt - addq r5, r11, r23 C L0 lo + acc - addq r10, r21, r10 C L0 hi mul + carry - ldq r5, 8(r16) C L1 - - umulh r19, r3, r8 C U1 - cmpult r23, r11, r20 C L0 lo add => carry - addq r23, r10, r23 C U0 hi add => answer - ldq r2, 16(r17) C L1 - - mulq r19, r0, r9 C U1 - cmpult r23, r10, r21 C L0 hi add => carry - addq r12, r20, r12 C U0 hi mul + carry - ldq r3, 24(r17) C L1 - - umulh r19, r0, r10 C U1 - addq r6, r13, r6 C L0 lo + acc - stq r22, -32(r16) C L0 - stq r23, -24(r16) C L1 - - bis r31, r31, r31 C L0 st slosh - mulq r19, r1, r11 C U1 - bis r31, r31, r31 C L1 st slosh - addq r12, r21, r12 C U0 hi mul + carry - - cmpult r6, r13, r20 C L0 lo add => carry - bis r31, r31, r31 C U1 mt - lda r18, -1(r18) C L1 bookkeeping - addq r6, r12, r22 C U0 hi add => answer - - bis r31, r31, r31 C U1 mt - cmpult r22, r12, r21 C L0 hi add => carry - addq r14, r20, r14 C U0 hi mul + carry - ldq r6, 16(r16) C L1 - - bis r31, r31, r31 C U1 mt - addq r7, r15, r23 C L0 lo + acc - addq r14, r21, r14 C U0 hi mul + carry - ldq r7, 24(r16) C L1 - - umulh r19, r1, r12 C U1 - cmpult r23, r15, r20 C L0 lo add => carry - addq r23, r14, r23 C U0 hi add => answer - ldq r0, 32(r17) C L1 - - mulq r19, r2, r13 C U1 - cmpult r23, r14, r21 C L0 hi add => carry - addq r8, r20, r8 C U0 hi mul + carry - ldq r1, 40(r17) C L1 - - umulh r19, r2, r14 C U1 - addq r4, r9, r4 C U0 lo + acc - stq r22, -16(r16) C L0 - stq r23, -8(r16) C L1 - - bis r31, r31, r31 C L0 st slosh - mulq r19, r3, r15 C U1 - bis r31, r31, r31 C L1 st slosh - addq r8, r21, r8 C L0 hi mul + carry - - cmpult r4, r9, r20 C L0 lo add => carry - bis r31, r31, r31 C U1 mt - lda r17, 64(r17) C L1 bookkeeping - addq r4, r8, r22 C U0 hi add => answer - - bis r31, r31, r31 C U1 mt - cmpult r22, r8, r21 C L0 hi add => carry - addq r10, r20, r10 C U0 hi mul + carry - ldq r4, 32(r16) C L1 - - bis r31, r31, r31 C U1 mt - addq r5, r11, r23 C L0 lo + acc - addq r10, r21, r10 C L0 hi mul + carry - ldq r5, 40(r16) C L1 - - umulh r19, r3, r8 C U1 - cmpult r23, r11, r20 C L0 lo add => carry - addq r23, r10, r23 C U0 hi add => answer - ldq r2, -16(r17) C L1 - - mulq r19, r0, r9 C U1 - cmpult r23, r10, r21 C L0 hi add => carry - addq r12, r20, r12 C U0 hi mul + carry - ldq r3, -8(r17) C L1 - - umulh r19, r0, r10 C U1 - addq r6, r13, r6 C L0 lo + acc - stq r22, 0(r16) C L0 - stq r23, 8(r16) C L1 - - bis r31, r31, r31 C L0 st slosh - mulq r19, r1, r11 C U1 - bis r31, r31, r31 C L1 st slosh - addq r12, r21, r12 C U0 hi mul + carry - - cmpult r6, r13, r20 C L0 lo add => carry - bis r31, r31, r31 C U1 mt - lda r16, 64(r16) C L1 bookkeeping - addq r6, r12, r22 C U0 hi add => answer - - bis r31, r31, r31 C U1 mt - cmpult r22, r12, r21 C L0 hi add => carry - addq r14, r20, r14 C U0 hi mul + carry - ldq r6, -16(r16) C L1 - - bis r31, r31, r31 C U1 mt - addq r7, r15, r23 C L0 lo + acc - addq r14, r21, r14 C U0 hi mul + carry - ldq r7, -8(r16) C L1 - - umulh r19, r1, r12 C U1 - cmpult r23, r15, r20 C L0 lo add => carry - addq r23, r14, r23 C U0 hi add => answer - ldq r0, 0(r17) C L1 - - mulq r19, r2, r13 C U1 - cmpult r23, r14, r21 C L0 hi add => carry - addq r8, r20, r8 C U0 hi mul + carry - ldq r1, 8(r17) C L1 - - umulh r19, r2, r14 C U1 - addq r4, r9, r4 C L0 lo + acc - stq r22, -48(r16) C L0 - stq r23, -40(r16) C L1 - - bis r31, r31, r31 C L0 st slosh - mulq r19, r3, r15 C U1 - bis r31, r31, r31 C L1 st slosh - addq r8, r21, r8 C U0 hi mul + carry - - cmpult r4, r9, r20 C L0 lo add => carry - addq r4, r8, r22 C U0 hi add => answer - bis r31, r31, r31 C L1 mt - bgt r18, $Loop C U1 bookkeeping - -C ____ UNROLLED LOOP SOFTWARE PIPELINE FINISH ____ -$Lend: - cmpult r22, r8, r21 C L0 hi add => carry - addq r10, r20, r10 C U0 hi mul + carry - ldq r4, 0(r16) C L1 - addq r5, r11, r23 C L0 lo + acc - addq r10, r21, r10 C L0 hi mul + carry - ldq r5, 8(r16) C L1 - umulh r19, r3, r8 C U1 - cmpult r23, r11, r20 C L0 lo add => carry - addq r23, r10, r23 C U0 hi add => answer - mulq r19, r0, r9 C U1 - cmpult r23, r10, r21 C L0 hi add => carry - addq r12, r20, r12 C U0 hi mul + carry - umulh r19, r0, r10 C U1 - addq r6, r13, r6 C L0 lo + acc - stq r22, -32(r16) C L0 - stq r23, -24(r16) C L1 - mulq r19, r1, r11 C U1 - addq r12, r21, r12 C U0 hi mul + carry - cmpult r6, r13, r20 C L0 lo add => carry - addq r6, r12, r22 C U0 hi add => answer - cmpult r22, r12, r21 C L0 hi add => carry - addq r14, r20, r14 C U0 hi mul + carry - addq r7, r15, r23 C L0 lo + acc - addq r14, r21, r14 C U0 hi mul + carry - umulh r19, r1, r12 C U1 - cmpult r23, r15, r20 C L0 lo add => carry - addq r23, r14, r23 C U0 hi add => answer - cmpult r23, r14, r21 C L0 hi add => carry - addq r8, r20, r8 C U0 hi mul + carry - addq r4, r9, r4 C U0 lo + acc - stq r22, -16(r16) C L0 - stq r23, -8(r16) C L1 - bis r31, r31, r31 C L0 st slosh - addq r8, r21, r8 C L0 hi mul + carry - cmpult r4, r9, r20 C L0 lo add => carry - addq r4, r8, r22 C U0 hi add => answer - cmpult r22, r8, r21 C L0 hi add => carry - addq r10, r20, r10 C U0 hi mul + carry - addq r5, r11, r23 C L0 lo + acc - addq r10, r21, r10 C L0 hi mul + carry - cmpult r23, r11, r20 C L0 lo add => carry - addq r23, r10, r23 C U0 hi add => answer - cmpult r23, r10, r21 C L0 hi add => carry - addq r12, r20, r12 C U0 hi mul + carry - stq r22, 0(r16) C L0 - stq r23, 8(r16) C L1 - addq r12, r21, r0 C U0 hi mul + carry - - ldq $9, 8($30) - ldq $10, 16($30) - ldq $11, 24($30) - ldq $12, 32($30) - ldq $13, 40($30) - ldq $14, 48($30) - ldq $15, 56($30) - lda $30, 240($30) - ret r31, (r26), 1 -EPILOGUE(mpn_addmul_1) -ASM_END() diff --git a/rts/gmp/mpn/alpha/ev6/gmp-mparam.h b/rts/gmp/mpn/alpha/ev6/gmp-mparam.h deleted file mode 100644 index 7ea2057..0000000 --- a/rts/gmp/mpn/alpha/ev6/gmp-mparam.h +++ /dev/null @@ -1,62 +0,0 @@ -/* gmp-mparam.h -- Compiler/machine parameter header file. - -Copyright (C) 1991, 1993, 1994 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. */ - -#define BITS_PER_MP_LIMB 64 -#define BYTES_PER_MP_LIMB 8 -#define BITS_PER_LONGINT 64 -#define BITS_PER_INT 32 -#define BITS_PER_SHORTINT 16 -#define BITS_PER_CHAR 8 - -/* Generated by tuneup.c, 2000-08-02. */ - -#ifndef KARATSUBA_MUL_THRESHOLD -#define KARATSUBA_MUL_THRESHOLD 47 -#endif -#ifndef TOOM3_MUL_THRESHOLD -#define TOOM3_MUL_THRESHOLD 70 -#endif - -#ifndef KARATSUBA_SQR_THRESHOLD -#define KARATSUBA_SQR_THRESHOLD 94 -#endif -#ifndef TOOM3_SQR_THRESHOLD -#define TOOM3_SQR_THRESHOLD 101 -#endif - -#ifndef BZ_THRESHOLD -#define BZ_THRESHOLD 33 -#endif - -#ifndef FIB_THRESHOLD -#define FIB_THRESHOLD 70 -#endif - -#ifndef POWM_THRESHOLD -#define POWM_THRESHOLD 29 -#endif - -#ifndef GCD_ACCEL_THRESHOLD -#define GCD_ACCEL_THRESHOLD 46 -#endif -#ifndef GCDEXT_THRESHOLD -#define GCDEXT_THRESHOLD 33 -#endif diff --git a/rts/gmp/mpn/alpha/gmp-mparam.h b/rts/gmp/mpn/alpha/gmp-mparam.h deleted file mode 100644 index 054ff2f..0000000 --- a/rts/gmp/mpn/alpha/gmp-mparam.h +++ /dev/null @@ -1,64 +0,0 @@ -/* gmp-mparam.h -- Compiler/machine parameter header file. - -Copyright (C) 1991, 1993, 1994, 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. */ - -#define BITS_PER_MP_LIMB 64 -#define BYTES_PER_MP_LIMB 8 -#define BITS_PER_LONGINT 64 -#define BITS_PER_INT 32 -#define BITS_PER_SHORTINT 16 -#define BITS_PER_CHAR 8 - -/* These values are for the 21164 family. The 21264 will require - different values, since it has such quick multiplication. */ -/* Generated by tuneup.c, 2000-07-19. */ - -#ifndef KARATSUBA_MUL_THRESHOLD -#define KARATSUBA_MUL_THRESHOLD 22 -#endif -#ifndef TOOM3_MUL_THRESHOLD -#define TOOM3_MUL_THRESHOLD 53 -#endif - -#ifndef KARATSUBA_SQR_THRESHOLD -#define KARATSUBA_SQR_THRESHOLD 31 -#endif -#ifndef TOOM3_SQR_THRESHOLD -#define TOOM3_SQR_THRESHOLD 47 -#endif - -#ifndef BZ_THRESHOLD -#define BZ_THRESHOLD 64 -#endif - -#ifndef FIB_THRESHOLD -#define FIB_THRESHOLD 98 -#endif - -#ifndef POWM_THRESHOLD -#define POWM_THRESHOLD 17 -#endif - -#ifndef GCD_ACCEL_THRESHOLD -#define GCD_ACCEL_THRESHOLD 4 -#endif -#ifndef GCDEXT_THRESHOLD -#define GCDEXT_THRESHOLD 4 -#endif diff --git a/rts/gmp/mpn/alpha/invert_limb.asm b/rts/gmp/mpn/alpha/invert_limb.asm deleted file mode 100644 index a921b32..0000000 --- a/rts/gmp/mpn/alpha/invert_limb.asm +++ /dev/null @@ -1,345 +0,0 @@ -dnl Alpha mpn_invert_limb -- Invert a normalized limb. - -dnl Copyright (C) 1996, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published by -dnl the Free Software Foundation; either version 2.1 of the License, or (at your -dnl option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - -dnl -dnl This is based on sophie:/gmp-stuff/dbg-inv-limb.c. -dnl The ideas are due to Peter L. Montgomery -dnl -dnl The table below uses 4096 bytes. The file mentioned above has an -dnl alternative function that doesn't require the table, but it runs 50% -dnl slower than this. - -include(`../config.m4') - -ASM_START() - -FLOAT64($C36,9223372036854775808.0) C 2^63 - -PROLOGUE_GP(mpn_invert_limb) - lda r30,-16(r30) - addq r16,r16,r1 - bne r1,$73 - lda r0,-1 - br r31,$Lend -$73: - srl r16,1,r1 - stq r1,0(r30) - ldt f11,0(r30) - cvtqt f11,f1 - lda r1,$C36 - ldt f10,0(r1) - divt f10,f1,f10 - lda r2,$invtab-4096 - srl r16,52,r1 - addq r1,r1,r1 - addq r1,r2,r1 - bic r1,6,r2 - ldq r2,0(r2) - bic r1,1,r1 - extwl r2,r1,r2 - sll r2,48,r0 - umulh r16,r0,r1 - addq r16,r1,r3 - stq r3,0(r30) - ldt f11,0(r30) - cvtqt f11,f1 - mult f1,f10,f1 - cvttqc f1,f1 - stt f1,0(r30) - ldq r4,0(r30) - subq r0,r4,r0 - umulh r16,r0,r1 - mulq r16,r0,r2 - addq r16,r1,r3 - bge r3,$Loop2 -$Loop1: addq r2,r16,r2 - cmpult r2,r16,r1 - addq r3,r1,r3 - addq r0,1,r0 - blt r3,$Loop1 -$Loop2: cmpult r2,r16,r1 - subq r0,1,r0 - subq r3,r1,r3 - subq r2,r16,r2 - bge r3,$Loop2 -$Lend: - lda r30,16(r30) - ret r31,(r26),1 -EPILOGUE(mpn_invert_limb) -DATASTART(`$invtab',4) - .word 0xffff,0xffc0,0xff80,0xff40,0xff00,0xfec0,0xfe81,0xfe41 - .word 0xfe01,0xfdc2,0xfd83,0xfd43,0xfd04,0xfcc5,0xfc86,0xfc46 - .word 0xfc07,0xfbc8,0xfb8a,0xfb4b,0xfb0c,0xfacd,0xfa8e,0xfa50 - .word 0xfa11,0xf9d3,0xf994,0xf956,0xf918,0xf8d9,0xf89b,0xf85d - .word 0xf81f,0xf7e1,0xf7a3,0xf765,0xf727,0xf6ea,0xf6ac,0xf66e - .word 0xf631,0xf5f3,0xf5b6,0xf578,0xf53b,0xf4fd,0xf4c0,0xf483 - .word 0xf446,0xf409,0xf3cc,0xf38f,0xf352,0xf315,0xf2d8,0xf29c - .word 0xf25f,0xf222,0xf1e6,0xf1a9,0xf16d,0xf130,0xf0f4,0xf0b8 - .word 0xf07c,0xf03f,0xf003,0xefc7,0xef8b,0xef4f,0xef14,0xeed8 - .word 0xee9c,0xee60,0xee25,0xede9,0xedae,0xed72,0xed37,0xecfb - .word 0xecc0,0xec85,0xec4a,0xec0e,0xebd3,0xeb98,0xeb5d,0xeb22 - .word 0xeae8,0xeaad,0xea72,0xea37,0xe9fd,0xe9c2,0xe988,0xe94d - .word 0xe913,0xe8d8,0xe89e,0xe864,0xe829,0xe7ef,0xe7b5,0xe77b - .word 0xe741,0xe707,0xe6cd,0xe694,0xe65a,0xe620,0xe5e6,0xe5ad - .word 0xe573,0xe53a,0xe500,0xe4c7,0xe48d,0xe454,0xe41b,0xe3e2 - .word 0xe3a9,0xe370,0xe336,0xe2fd,0xe2c5,0xe28c,0xe253,0xe21a - .word 0xe1e1,0xe1a9,0xe170,0xe138,0xe0ff,0xe0c7,0xe08e,0xe056 - .word 0xe01e,0xdfe5,0xdfad,0xdf75,0xdf3d,0xdf05,0xdecd,0xde95 - .word 0xde5d,0xde25,0xdded,0xddb6,0xdd7e,0xdd46,0xdd0f,0xdcd7 - .word 0xdca0,0xdc68,0xdc31,0xdbf9,0xdbc2,0xdb8b,0xdb54,0xdb1d - .word 0xdae6,0xdaae,0xda78,0xda41,0xda0a,0xd9d3,0xd99c,0xd965 - .word 0xd92f,0xd8f8,0xd8c1,0xd88b,0xd854,0xd81e,0xd7e8,0xd7b1 - .word 0xd77b,0xd745,0xd70e,0xd6d8,0xd6a2,0xd66c,0xd636,0xd600 - .word 0xd5ca,0xd594,0xd55f,0xd529,0xd4f3,0xd4bd,0xd488,0xd452 - .word 0xd41d,0xd3e7,0xd3b2,0xd37c,0xd347,0xd312,0xd2dd,0xd2a7 - .word 0xd272,0xd23d,0xd208,0xd1d3,0xd19e,0xd169,0xd134,0xd100 - .word 0xd0cb,0xd096,0xd061,0xd02d,0xcff8,0xcfc4,0xcf8f,0xcf5b - .word 0xcf26,0xcef2,0xcebe,0xce89,0xce55,0xce21,0xcded,0xcdb9 - .word 0xcd85,0xcd51,0xcd1d,0xcce9,0xccb5,0xcc81,0xcc4e,0xcc1a - .word 0xcbe6,0xcbb3,0xcb7f,0xcb4c,0xcb18,0xcae5,0xcab1,0xca7e - .word 0xca4b,0xca17,0xc9e4,0xc9b1,0xc97e,0xc94b,0xc918,0xc8e5 - .word 0xc8b2,0xc87f,0xc84c,0xc819,0xc7e7,0xc7b4,0xc781,0xc74f - .word 0xc71c,0xc6e9,0xc6b7,0xc684,0xc652,0xc620,0xc5ed,0xc5bb - .word 0xc589,0xc557,0xc524,0xc4f2,0xc4c0,0xc48e,0xc45c,0xc42a - .word 0xc3f8,0xc3c7,0xc395,0xc363,0xc331,0xc300,0xc2ce,0xc29c - .word 0xc26b,0xc239,0xc208,0xc1d6,0xc1a5,0xc174,0xc142,0xc111 - .word 0xc0e0,0xc0af,0xc07e,0xc04d,0xc01c,0xbfeb,0xbfba,0xbf89 - .word 0xbf58,0xbf27,0xbef6,0xbec5,0xbe95,0xbe64,0xbe33,0xbe03 - .word 0xbdd2,0xbda2,0xbd71,0xbd41,0xbd10,0xbce0,0xbcb0,0xbc80 - .word 0xbc4f,0xbc1f,0xbbef,0xbbbf,0xbb8f,0xbb5f,0xbb2f,0xbaff - .word 0xbacf,0xba9f,0xba6f,0xba40,0xba10,0xb9e0,0xb9b1,0xb981 - .word 0xb951,0xb922,0xb8f2,0xb8c3,0xb894,0xb864,0xb835,0xb806 - .word 0xb7d6,0xb7a7,0xb778,0xb749,0xb71a,0xb6eb,0xb6bc,0xb68d - .word 0xb65e,0xb62f,0xb600,0xb5d1,0xb5a2,0xb574,0xb545,0xb516 - .word 0xb4e8,0xb4b9,0xb48a,0xb45c,0xb42e,0xb3ff,0xb3d1,0xb3a2 - .word 0xb374,0xb346,0xb318,0xb2e9,0xb2bb,0xb28d,0xb25f,0xb231 - .word 0xb203,0xb1d5,0xb1a7,0xb179,0xb14b,0xb11d,0xb0f0,0xb0c2 - .word 0xb094,0xb067,0xb039,0xb00b,0xafde,0xafb0,0xaf83,0xaf55 - .word 0xaf28,0xaefb,0xaecd,0xaea0,0xae73,0xae45,0xae18,0xadeb - .word 0xadbe,0xad91,0xad64,0xad37,0xad0a,0xacdd,0xacb0,0xac83 - .word 0xac57,0xac2a,0xabfd,0xabd0,0xaba4,0xab77,0xab4a,0xab1e - .word 0xaaf1,0xaac5,0xaa98,0xaa6c,0xaa40,0xaa13,0xa9e7,0xa9bb - .word 0xa98e,0xa962,0xa936,0xa90a,0xa8de,0xa8b2,0xa886,0xa85a - .word 0xa82e,0xa802,0xa7d6,0xa7aa,0xa77e,0xa753,0xa727,0xa6fb - .word 0xa6d0,0xa6a4,0xa678,0xa64d,0xa621,0xa5f6,0xa5ca,0xa59f - .word 0xa574,0xa548,0xa51d,0xa4f2,0xa4c6,0xa49b,0xa470,0xa445 - .word 0xa41a,0xa3ef,0xa3c4,0xa399,0xa36e,0xa343,0xa318,0xa2ed - .word 0xa2c2,0xa297,0xa26d,0xa242,0xa217,0xa1ed,0xa1c2,0xa197 - .word 0xa16d,0xa142,0xa118,0xa0ed,0xa0c3,0xa098,0xa06e,0xa044 - .word 0xa01a,0x9fef,0x9fc5,0x9f9b,0x9f71,0x9f47,0x9f1c,0x9ef2 - .word 0x9ec8,0x9e9e,0x9e74,0x9e4b,0x9e21,0x9df7,0x9dcd,0x9da3 - .word 0x9d79,0x9d50,0x9d26,0x9cfc,0x9cd3,0x9ca9,0x9c80,0x9c56 - .word 0x9c2d,0x9c03,0x9bda,0x9bb0,0x9b87,0x9b5e,0x9b34,0x9b0b - .word 0x9ae2,0x9ab9,0x9a8f,0x9a66,0x9a3d,0x9a14,0x99eb,0x99c2 - .word 0x9999,0x9970,0x9947,0x991e,0x98f6,0x98cd,0x98a4,0x987b - .word 0x9852,0x982a,0x9801,0x97d8,0x97b0,0x9787,0x975f,0x9736 - .word 0x970e,0x96e5,0x96bd,0x9695,0x966c,0x9644,0x961c,0x95f3 - .word 0x95cb,0x95a3,0x957b,0x9553,0x952b,0x9503,0x94db,0x94b3 - .word 0x948b,0x9463,0x943b,0x9413,0x93eb,0x93c3,0x939b,0x9374 - .word 0x934c,0x9324,0x92fd,0x92d5,0x92ad,0x9286,0x925e,0x9237 - .word 0x920f,0x91e8,0x91c0,0x9199,0x9172,0x914a,0x9123,0x90fc - .word 0x90d4,0x90ad,0x9086,0x905f,0x9038,0x9011,0x8fea,0x8fc3 - .word 0x8f9c,0x8f75,0x8f4e,0x8f27,0x8f00,0x8ed9,0x8eb2,0x8e8b - .word 0x8e65,0x8e3e,0x8e17,0x8df1,0x8dca,0x8da3,0x8d7d,0x8d56 - .word 0x8d30,0x8d09,0x8ce3,0x8cbc,0x8c96,0x8c6f,0x8c49,0x8c23 - .word 0x8bfc,0x8bd6,0x8bb0,0x8b8a,0x8b64,0x8b3d,0x8b17,0x8af1 - .word 0x8acb,0x8aa5,0x8a7f,0x8a59,0x8a33,0x8a0d,0x89e7,0x89c1 - .word 0x899c,0x8976,0x8950,0x892a,0x8904,0x88df,0x88b9,0x8893 - .word 0x886e,0x8848,0x8823,0x87fd,0x87d8,0x87b2,0x878d,0x8767 - .word 0x8742,0x871d,0x86f7,0x86d2,0x86ad,0x8687,0x8662,0x863d - .word 0x8618,0x85f3,0x85ce,0x85a9,0x8583,0x855e,0x8539,0x8514 - .word 0x84f0,0x84cb,0x84a6,0x8481,0x845c,0x8437,0x8412,0x83ee - .word 0x83c9,0x83a4,0x8380,0x835b,0x8336,0x8312,0x82ed,0x82c9 - .word 0x82a4,0x8280,0x825b,0x8237,0x8212,0x81ee,0x81ca,0x81a5 - .word 0x8181,0x815d,0x8138,0x8114,0x80f0,0x80cc,0x80a8,0x8084 - .word 0x8060,0x803c,0x8018,0x7ff4,0x7fd0,0x7fac,0x7f88,0x7f64 - .word 0x7f40,0x7f1c,0x7ef8,0x7ed4,0x7eb1,0x7e8d,0x7e69,0x7e45 - .word 0x7e22,0x7dfe,0x7ddb,0x7db7,0x7d93,0x7d70,0x7d4c,0x7d29 - .word 0x7d05,0x7ce2,0x7cbf,0x7c9b,0x7c78,0x7c55,0x7c31,0x7c0e - .word 0x7beb,0x7bc7,0x7ba4,0x7b81,0x7b5e,0x7b3b,0x7b18,0x7af5 - .word 0x7ad2,0x7aaf,0x7a8c,0x7a69,0x7a46,0x7a23,0x7a00,0x79dd - .word 0x79ba,0x7997,0x7975,0x7952,0x792f,0x790c,0x78ea,0x78c7 - .word 0x78a4,0x7882,0x785f,0x783c,0x781a,0x77f7,0x77d5,0x77b2 - .word 0x7790,0x776e,0x774b,0x7729,0x7706,0x76e4,0x76c2,0x76a0 - .word 0x767d,0x765b,0x7639,0x7617,0x75f5,0x75d2,0x75b0,0x758e - .word 0x756c,0x754a,0x7528,0x7506,0x74e4,0x74c2,0x74a0,0x747e - .word 0x745d,0x743b,0x7419,0x73f7,0x73d5,0x73b4,0x7392,0x7370 - .word 0x734f,0x732d,0x730b,0x72ea,0x72c8,0x72a7,0x7285,0x7264 - .word 0x7242,0x7221,0x71ff,0x71de,0x71bc,0x719b,0x717a,0x7158 - .word 0x7137,0x7116,0x70f5,0x70d3,0x70b2,0x7091,0x7070,0x704f - .word 0x702e,0x700c,0x6feb,0x6fca,0x6fa9,0x6f88,0x6f67,0x6f46 - .word 0x6f26,0x6f05,0x6ee4,0x6ec3,0x6ea2,0x6e81,0x6e60,0x6e40 - .word 0x6e1f,0x6dfe,0x6dde,0x6dbd,0x6d9c,0x6d7c,0x6d5b,0x6d3a - .word 0x6d1a,0x6cf9,0x6cd9,0x6cb8,0x6c98,0x6c77,0x6c57,0x6c37 - .word 0x6c16,0x6bf6,0x6bd6,0x6bb5,0x6b95,0x6b75,0x6b54,0x6b34 - .word 0x6b14,0x6af4,0x6ad4,0x6ab4,0x6a94,0x6a73,0x6a53,0x6a33 - .word 0x6a13,0x69f3,0x69d3,0x69b3,0x6993,0x6974,0x6954,0x6934 - .word 0x6914,0x68f4,0x68d4,0x68b5,0x6895,0x6875,0x6855,0x6836 - .word 0x6816,0x67f6,0x67d7,0x67b7,0x6798,0x6778,0x6758,0x6739 - .word 0x6719,0x66fa,0x66db,0x66bb,0x669c,0x667c,0x665d,0x663e - .word 0x661e,0x65ff,0x65e0,0x65c0,0x65a1,0x6582,0x6563,0x6544 - .word 0x6524,0x6505,0x64e6,0x64c7,0x64a8,0x6489,0x646a,0x644b - .word 0x642c,0x640d,0x63ee,0x63cf,0x63b0,0x6391,0x6373,0x6354 - .word 0x6335,0x6316,0x62f7,0x62d9,0x62ba,0x629b,0x627c,0x625e - .word 0x623f,0x6221,0x6202,0x61e3,0x61c5,0x61a6,0x6188,0x6169 - .word 0x614b,0x612c,0x610e,0x60ef,0x60d1,0x60b3,0x6094,0x6076 - .word 0x6058,0x6039,0x601b,0x5ffd,0x5fdf,0x5fc0,0x5fa2,0x5f84 - .word 0x5f66,0x5f48,0x5f2a,0x5f0b,0x5eed,0x5ecf,0x5eb1,0x5e93 - .word 0x5e75,0x5e57,0x5e39,0x5e1b,0x5dfd,0x5de0,0x5dc2,0x5da4 - .word 0x5d86,0x5d68,0x5d4a,0x5d2d,0x5d0f,0x5cf1,0x5cd3,0x5cb6 - .word 0x5c98,0x5c7a,0x5c5d,0x5c3f,0x5c21,0x5c04,0x5be6,0x5bc9 - .word 0x5bab,0x5b8e,0x5b70,0x5b53,0x5b35,0x5b18,0x5afb,0x5add - .word 0x5ac0,0x5aa2,0x5a85,0x5a68,0x5a4b,0x5a2d,0x5a10,0x59f3 - .word 0x59d6,0x59b8,0x599b,0x597e,0x5961,0x5944,0x5927,0x590a - .word 0x58ed,0x58d0,0x58b3,0x5896,0x5879,0x585c,0x583f,0x5822 - .word 0x5805,0x57e8,0x57cb,0x57ae,0x5791,0x5775,0x5758,0x573b - .word 0x571e,0x5702,0x56e5,0x56c8,0x56ac,0x568f,0x5672,0x5656 - .word 0x5639,0x561c,0x5600,0x55e3,0x55c7,0x55aa,0x558e,0x5571 - .word 0x5555,0x5538,0x551c,0x5500,0x54e3,0x54c7,0x54aa,0x548e - .word 0x5472,0x5456,0x5439,0x541d,0x5401,0x53e5,0x53c8,0x53ac - .word 0x5390,0x5374,0x5358,0x533c,0x5320,0x5304,0x52e8,0x52cb - .word 0x52af,0x5293,0x5277,0x525c,0x5240,0x5224,0x5208,0x51ec - .word 0x51d0,0x51b4,0x5198,0x517c,0x5161,0x5145,0x5129,0x510d - .word 0x50f2,0x50d6,0x50ba,0x509f,0x5083,0x5067,0x504c,0x5030 - .word 0x5015,0x4ff9,0x4fdd,0x4fc2,0x4fa6,0x4f8b,0x4f6f,0x4f54 - .word 0x4f38,0x4f1d,0x4f02,0x4ee6,0x4ecb,0x4eb0,0x4e94,0x4e79 - .word 0x4e5e,0x4e42,0x4e27,0x4e0c,0x4df0,0x4dd5,0x4dba,0x4d9f - .word 0x4d84,0x4d69,0x4d4d,0x4d32,0x4d17,0x4cfc,0x4ce1,0x4cc6 - .word 0x4cab,0x4c90,0x4c75,0x4c5a,0x4c3f,0x4c24,0x4c09,0x4bee - .word 0x4bd3,0x4bb9,0x4b9e,0x4b83,0x4b68,0x4b4d,0x4b32,0x4b18 - .word 0x4afd,0x4ae2,0x4ac7,0x4aad,0x4a92,0x4a77,0x4a5d,0x4a42 - .word 0x4a27,0x4a0d,0x49f2,0x49d8,0x49bd,0x49a3,0x4988,0x496e - .word 0x4953,0x4939,0x491e,0x4904,0x48e9,0x48cf,0x48b5,0x489a - .word 0x4880,0x4865,0x484b,0x4831,0x4817,0x47fc,0x47e2,0x47c8 - .word 0x47ae,0x4793,0x4779,0x475f,0x4745,0x472b,0x4711,0x46f6 - .word 0x46dc,0x46c2,0x46a8,0x468e,0x4674,0x465a,0x4640,0x4626 - .word 0x460c,0x45f2,0x45d8,0x45be,0x45a5,0x458b,0x4571,0x4557 - .word 0x453d,0x4523,0x4509,0x44f0,0x44d6,0x44bc,0x44a2,0x4489 - .word 0x446f,0x4455,0x443c,0x4422,0x4408,0x43ef,0x43d5,0x43bc - .word 0x43a2,0x4388,0x436f,0x4355,0x433c,0x4322,0x4309,0x42ef - .word 0x42d6,0x42bc,0x42a3,0x428a,0x4270,0x4257,0x423d,0x4224 - .word 0x420b,0x41f2,0x41d8,0x41bf,0x41a6,0x418c,0x4173,0x415a - .word 0x4141,0x4128,0x410e,0x40f5,0x40dc,0x40c3,0x40aa,0x4091 - .word 0x4078,0x405f,0x4046,0x402d,0x4014,0x3ffb,0x3fe2,0x3fc9 - .word 0x3fb0,0x3f97,0x3f7e,0x3f65,0x3f4c,0x3f33,0x3f1a,0x3f01 - .word 0x3ee8,0x3ed0,0x3eb7,0x3e9e,0x3e85,0x3e6c,0x3e54,0x3e3b - .word 0x3e22,0x3e0a,0x3df1,0x3dd8,0x3dc0,0x3da7,0x3d8e,0x3d76 - .word 0x3d5d,0x3d45,0x3d2c,0x3d13,0x3cfb,0x3ce2,0x3cca,0x3cb1 - .word 0x3c99,0x3c80,0x3c68,0x3c50,0x3c37,0x3c1f,0x3c06,0x3bee - .word 0x3bd6,0x3bbd,0x3ba5,0x3b8d,0x3b74,0x3b5c,0x3b44,0x3b2b - .word 0x3b13,0x3afb,0x3ae3,0x3acb,0x3ab2,0x3a9a,0x3a82,0x3a6a - .word 0x3a52,0x3a3a,0x3a22,0x3a09,0x39f1,0x39d9,0x39c1,0x39a9 - .word 0x3991,0x3979,0x3961,0x3949,0x3931,0x3919,0x3901,0x38ea - .word 0x38d2,0x38ba,0x38a2,0x388a,0x3872,0x385a,0x3843,0x382b - .word 0x3813,0x37fb,0x37e3,0x37cc,0x37b4,0x379c,0x3785,0x376d - .word 0x3755,0x373e,0x3726,0x370e,0x36f7,0x36df,0x36c8,0x36b0 - .word 0x3698,0x3681,0x3669,0x3652,0x363a,0x3623,0x360b,0x35f4 - .word 0x35dc,0x35c5,0x35ae,0x3596,0x357f,0x3567,0x3550,0x3539 - .word 0x3521,0x350a,0x34f3,0x34db,0x34c4,0x34ad,0x3496,0x347e - .word 0x3467,0x3450,0x3439,0x3422,0x340a,0x33f3,0x33dc,0x33c5 - .word 0x33ae,0x3397,0x3380,0x3368,0x3351,0x333a,0x3323,0x330c - .word 0x32f5,0x32de,0x32c7,0x32b0,0x3299,0x3282,0x326c,0x3255 - .word 0x323e,0x3227,0x3210,0x31f9,0x31e2,0x31cb,0x31b5,0x319e - .word 0x3187,0x3170,0x3159,0x3143,0x312c,0x3115,0x30fe,0x30e8 - .word 0x30d1,0x30ba,0x30a4,0x308d,0x3076,0x3060,0x3049,0x3033 - .word 0x301c,0x3005,0x2fef,0x2fd8,0x2fc2,0x2fab,0x2f95,0x2f7e - .word 0x2f68,0x2f51,0x2f3b,0x2f24,0x2f0e,0x2ef8,0x2ee1,0x2ecb - .word 0x2eb4,0x2e9e,0x2e88,0x2e71,0x2e5b,0x2e45,0x2e2e,0x2e18 - .word 0x2e02,0x2dec,0x2dd5,0x2dbf,0x2da9,0x2d93,0x2d7c,0x2d66 - .word 0x2d50,0x2d3a,0x2d24,0x2d0e,0x2cf8,0x2ce1,0x2ccb,0x2cb5 - .word 0x2c9f,0x2c89,0x2c73,0x2c5d,0x2c47,0x2c31,0x2c1b,0x2c05 - .word 0x2bef,0x2bd9,0x2bc3,0x2bad,0x2b97,0x2b81,0x2b6c,0x2b56 - .word 0x2b40,0x2b2a,0x2b14,0x2afe,0x2ae8,0x2ad3,0x2abd,0x2aa7 - .word 0x2a91,0x2a7c,0x2a66,0x2a50,0x2a3a,0x2a25,0x2a0f,0x29f9 - .word 0x29e4,0x29ce,0x29b8,0x29a3,0x298d,0x2977,0x2962,0x294c - .word 0x2937,0x2921,0x290c,0x28f6,0x28e0,0x28cb,0x28b5,0x28a0 - .word 0x288b,0x2875,0x2860,0x284a,0x2835,0x281f,0x280a,0x27f5 - .word 0x27df,0x27ca,0x27b4,0x279f,0x278a,0x2774,0x275f,0x274a - .word 0x2735,0x271f,0x270a,0x26f5,0x26e0,0x26ca,0x26b5,0x26a0 - .word 0x268b,0x2676,0x2660,0x264b,0x2636,0x2621,0x260c,0x25f7 - .word 0x25e2,0x25cd,0x25b8,0x25a2,0x258d,0x2578,0x2563,0x254e - .word 0x2539,0x2524,0x250f,0x24fa,0x24e5,0x24d1,0x24bc,0x24a7 - .word 0x2492,0x247d,0x2468,0x2453,0x243e,0x2429,0x2415,0x2400 - .word 0x23eb,0x23d6,0x23c1,0x23ad,0x2398,0x2383,0x236e,0x235a - .word 0x2345,0x2330,0x231c,0x2307,0x22f2,0x22dd,0x22c9,0x22b4 - .word 0x22a0,0x228b,0x2276,0x2262,0x224d,0x2239,0x2224,0x2210 - .word 0x21fb,0x21e6,0x21d2,0x21bd,0x21a9,0x2194,0x2180,0x216c - .word 0x2157,0x2143,0x212e,0x211a,0x2105,0x20f1,0x20dd,0x20c8 - .word 0x20b4,0x20a0,0x208b,0x2077,0x2063,0x204e,0x203a,0x2026 - .word 0x2012,0x1ffd,0x1fe9,0x1fd5,0x1fc1,0x1fac,0x1f98,0x1f84 - .word 0x1f70,0x1f5c,0x1f47,0x1f33,0x1f1f,0x1f0b,0x1ef7,0x1ee3 - .word 0x1ecf,0x1ebb,0x1ea7,0x1e93,0x1e7f,0x1e6a,0x1e56,0x1e42 - .word 0x1e2e,0x1e1a,0x1e06,0x1df3,0x1ddf,0x1dcb,0x1db7,0x1da3 - .word 0x1d8f,0x1d7b,0x1d67,0x1d53,0x1d3f,0x1d2b,0x1d18,0x1d04 - .word 0x1cf0,0x1cdc,0x1cc8,0x1cb5,0x1ca1,0x1c8d,0x1c79,0x1c65 - .word 0x1c52,0x1c3e,0x1c2a,0x1c17,0x1c03,0x1bef,0x1bdb,0x1bc8 - .word 0x1bb4,0x1ba0,0x1b8d,0x1b79,0x1b66,0x1b52,0x1b3e,0x1b2b - .word 0x1b17,0x1b04,0x1af0,0x1add,0x1ac9,0x1ab6,0x1aa2,0x1a8f - .word 0x1a7b,0x1a68,0x1a54,0x1a41,0x1a2d,0x1a1a,0x1a06,0x19f3 - .word 0x19e0,0x19cc,0x19b9,0x19a5,0x1992,0x197f,0x196b,0x1958 - .word 0x1945,0x1931,0x191e,0x190b,0x18f8,0x18e4,0x18d1,0x18be - .word 0x18ab,0x1897,0x1884,0x1871,0x185e,0x184b,0x1837,0x1824 - .word 0x1811,0x17fe,0x17eb,0x17d8,0x17c4,0x17b1,0x179e,0x178b - .word 0x1778,0x1765,0x1752,0x173f,0x172c,0x1719,0x1706,0x16f3 - .word 0x16e0,0x16cd,0x16ba,0x16a7,0x1694,0x1681,0x166e,0x165b - .word 0x1648,0x1635,0x1623,0x1610,0x15fd,0x15ea,0x15d7,0x15c4 - .word 0x15b1,0x159f,0x158c,0x1579,0x1566,0x1553,0x1541,0x152e - .word 0x151b,0x1508,0x14f6,0x14e3,0x14d0,0x14bd,0x14ab,0x1498 - .word 0x1485,0x1473,0x1460,0x144d,0x143b,0x1428,0x1416,0x1403 - .word 0x13f0,0x13de,0x13cb,0x13b9,0x13a6,0x1394,0x1381,0x136f - .word 0x135c,0x1349,0x1337,0x1325,0x1312,0x1300,0x12ed,0x12db - .word 0x12c8,0x12b6,0x12a3,0x1291,0x127f,0x126c,0x125a,0x1247 - .word 0x1235,0x1223,0x1210,0x11fe,0x11ec,0x11d9,0x11c7,0x11b5 - .word 0x11a3,0x1190,0x117e,0x116c,0x1159,0x1147,0x1135,0x1123 - .word 0x1111,0x10fe,0x10ec,0x10da,0x10c8,0x10b6,0x10a4,0x1091 - .word 0x107f,0x106d,0x105b,0x1049,0x1037,0x1025,0x1013,0x1001 - .word 0x0fef,0x0fdc,0x0fca,0x0fb8,0x0fa6,0x0f94,0x0f82,0x0f70 - .word 0x0f5e,0x0f4c,0x0f3a,0x0f28,0x0f17,0x0f05,0x0ef3,0x0ee1 - .word 0x0ecf,0x0ebd,0x0eab,0x0e99,0x0e87,0x0e75,0x0e64,0x0e52 - .word 0x0e40,0x0e2e,0x0e1c,0x0e0a,0x0df9,0x0de7,0x0dd5,0x0dc3 - .word 0x0db2,0x0da0,0x0d8e,0x0d7c,0x0d6b,0x0d59,0x0d47,0x0d35 - .word 0x0d24,0x0d12,0x0d00,0x0cef,0x0cdd,0x0ccb,0x0cba,0x0ca8 - .word 0x0c97,0x0c85,0x0c73,0x0c62,0x0c50,0x0c3f,0x0c2d,0x0c1c - .word 0x0c0a,0x0bf8,0x0be7,0x0bd5,0x0bc4,0x0bb2,0x0ba1,0x0b8f - .word 0x0b7e,0x0b6c,0x0b5b,0x0b4a,0x0b38,0x0b27,0x0b15,0x0b04 - .word 0x0af2,0x0ae1,0x0ad0,0x0abe,0x0aad,0x0a9c,0x0a8a,0x0a79 - .word 0x0a68,0x0a56,0x0a45,0x0a34,0x0a22,0x0a11,0x0a00,0x09ee - .word 0x09dd,0x09cc,0x09bb,0x09a9,0x0998,0x0987,0x0976,0x0965 - .word 0x0953,0x0942,0x0931,0x0920,0x090f,0x08fe,0x08ec,0x08db - .word 0x08ca,0x08b9,0x08a8,0x0897,0x0886,0x0875,0x0864,0x0853 - .word 0x0842,0x0831,0x081f,0x080e,0x07fd,0x07ec,0x07db,0x07ca - .word 0x07b9,0x07a8,0x0798,0x0787,0x0776,0x0765,0x0754,0x0743 - .word 0x0732,0x0721,0x0710,0x06ff,0x06ee,0x06dd,0x06cd,0x06bc - .word 0x06ab,0x069a,0x0689,0x0678,0x0668,0x0657,0x0646,0x0635 - .word 0x0624,0x0614,0x0603,0x05f2,0x05e1,0x05d1,0x05c0,0x05af - .word 0x059e,0x058e,0x057d,0x056c,0x055c,0x054b,0x053a,0x052a - .word 0x0519,0x0508,0x04f8,0x04e7,0x04d6,0x04c6,0x04b5,0x04a5 - .word 0x0494,0x0484,0x0473,0x0462,0x0452,0x0441,0x0431,0x0420 - .word 0x0410,0x03ff,0x03ef,0x03de,0x03ce,0x03bd,0x03ad,0x039c - .word 0x038c,0x037b,0x036b,0x035b,0x034a,0x033a,0x0329,0x0319 - .word 0x0309,0x02f8,0x02e8,0x02d7,0x02c7,0x02b7,0x02a6,0x0296 - .word 0x0286,0x0275,0x0265,0x0255,0x0245,0x0234,0x0224,0x0214 - .word 0x0204,0x01f3,0x01e3,0x01d3,0x01c3,0x01b2,0x01a2,0x0192 - .word 0x0182,0x0172,0x0161,0x0151,0x0141,0x0131,0x0121,0x0111 - .word 0x0101,0x00f0,0x00e0,0x00d0,0x00c0,0x00b0,0x00a0,0x0090 - .word 0x0080,0x0070,0x0060,0x0050,0x0040,0x0030,0x0020,0x0010 -DATAEND() -ASM_END() diff --git a/rts/gmp/mpn/alpha/lshift.asm b/rts/gmp/mpn/alpha/lshift.asm deleted file mode 100644 index 87c46f6..0000000 --- a/rts/gmp/mpn/alpha/lshift.asm +++ /dev/null @@ -1,104 +0,0 @@ -dnl Alpha mpn_lshift -- Shift a number left. - -dnl Copyright (C) 1994, 1995, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published by -dnl the Free Software Foundation; either version 2.1 of the License, or (at your -dnl option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - -include(`../config.m4') - -dnl INPUT PARAMETERS -dnl res_ptr r16 -dnl s1_ptr r17 -dnl size r18 -dnl cnt r19 - -dnl This code runs at 4.8 cycles/limb on the 21064. With infinite unrolling, -dnl it would take 4 cycles/limb. It should be possible to get down to 3 -dnl cycles/limb since both ldq and stq can be paired with the other used -dnl instructions. But there are many restrictions in the 21064 pipeline that -dnl makes it hard, if not impossible, to get down to 3 cycles/limb: - -dnl 1. ldq has a 3 cycle delay, srl and sll have a 2 cycle delay. -dnl 2. Only aligned instruction pairs can be paired. -dnl 3. The store buffer or silo might not be able to deal with the bandwidth. - -ASM_START() -PROLOGUE(mpn_lshift) - s8addq r18,r17,r17 C make r17 point at end of s1 - ldq r4,-8(r17) C load first limb - subq r17,8,r17 - subq r31,r19,r7 - s8addq r18,r16,r16 C make r16 point at end of RES - subq r18,1,r18 - and r18,4-1,r20 C number of limbs in first loop - srl r4,r7,r0 C compute function result - - beq r20,$L0 - subq r18,r20,r18 - - ALIGN(8) -$Loop0: - ldq r3,-8(r17) - subq r16,8,r16 - subq r17,8,r17 - subq r20,1,r20 - sll r4,r19,r5 - srl r3,r7,r6 - bis r3,r3,r4 - bis r5,r6,r8 - stq r8,0(r16) - bne r20,$Loop0 - -$L0: beq r18,$Lend - - ALIGN(8) -$Loop: ldq r3,-8(r17) - subq r16,32,r16 - subq r18,4,r18 - sll r4,r19,r5 - srl r3,r7,r6 - - ldq r4,-16(r17) - sll r3,r19,r1 - bis r5,r6,r8 - stq r8,24(r16) - srl r4,r7,r2 - - ldq r3,-24(r17) - sll r4,r19,r5 - bis r1,r2,r8 - stq r8,16(r16) - srl r3,r7,r6 - - ldq r4,-32(r17) - sll r3,r19,r1 - bis r5,r6,r8 - stq r8,8(r16) - srl r4,r7,r2 - - subq r17,32,r17 - bis r1,r2,r8 - stq r8,0(r16) - - bgt r18,$Loop - -$Lend: sll r4,r19,r8 - stq r8,-8(r16) - ret r31,(r26),1 -EPILOGUE(mpn_lshift) -ASM_END() diff --git a/rts/gmp/mpn/alpha/mul_1.asm b/rts/gmp/mpn/alpha/mul_1.asm deleted file mode 100644 index 46b8df3..0000000 --- a/rts/gmp/mpn/alpha/mul_1.asm +++ /dev/null @@ -1,71 +0,0 @@ -dnl Alpha __gmpn_mul_1 -- Multiply a limb vector with a limb and store -dnl the result in a second limb vector. - -dnl Copyright (C) 1992, 1994, 1995, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published by -dnl the Free Software Foundation; either version 2.1 of the License, or (at your -dnl option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - -include(`../config.m4') - -dnl INPUT PARAMETERS -dnl res_ptr r16 -dnl s1_ptr r17 -dnl size r18 -dnl s2_limb r19 - -dnl This code runs at 42 cycles/limb on EV4, 18 cycles/limb on EV5, and 7 -dnl cycles/limb on EV6. - -ASM_START() -PROLOGUE(mpn_mul_1) - ldq r2,0(r17) C r2 = s1_limb - subq r18,1,r18 C size-- - mulq r2,r19,r3 C r3 = prod_low - bic r31,r31,r4 C clear cy_limb - umulh r2,r19,r0 C r0 = prod_high - beq r18,$Lend1 C jump if size was == 1 - ldq r2,8(r17) C r2 = s1_limb - subq r18,1,r18 C size-- - stq r3,0(r16) - beq r18,$Lend2 C jump if size was == 2 - - ALIGN(8) -$Loop: mulq r2,r19,r3 C r3 = prod_low - addq r4,r0,r0 C cy_limb = cy_limb + 'cy' - subq r18,1,r18 C size-- - umulh r2,r19,r4 C r4 = cy_limb - ldq r2,16(r17) C r2 = s1_limb - addq r17,8,r17 C s1_ptr++ - addq r3,r0,r3 C r3 = cy_limb + prod_low - stq r3,8(r16) - cmpult r3,r0,r0 C r0 = carry from (cy_limb + prod_low) - addq r16,8,r16 C res_ptr++ - bne r18,$Loop - -$Lend2: mulq r2,r19,r3 C r3 = prod_low - addq r4,r0,r0 C cy_limb = cy_limb + 'cy' - umulh r2,r19,r4 C r4 = cy_limb - addq r3,r0,r3 C r3 = cy_limb + prod_low - cmpult r3,r0,r0 C r0 = carry from (cy_limb + prod_low) - stq r3,8(r16) - addq r4,r0,r0 C cy_limb = prod_high + cy - ret r31,(r26),1 -$Lend1: stq r3,0(r16) - ret r31,(r26),1 -EPILOGUE(mpn_mul_1) -ASM_END() diff --git a/rts/gmp/mpn/alpha/rshift.asm b/rts/gmp/mpn/alpha/rshift.asm deleted file mode 100644 index aa25eda..0000000 --- a/rts/gmp/mpn/alpha/rshift.asm +++ /dev/null @@ -1,102 +0,0 @@ -dnl Alpha mpn_rshift -- Shift a number right. - -dnl Copyright (C) 1994, 1995, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published by -dnl the Free Software Foundation; either version 2.1 of the License, or (at your -dnl option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - -include(`../config.m4') - -dnl INPUT PARAMETERS -dnl res_ptr r16 -dnl s1_ptr r17 -dnl size r18 -dnl cnt r19 - -dnl This code runs at 4.8 cycles/limb on the 21064. With infinite unrolling, -dnl it would take 4 cycles/limb. It should be possible to get down to 3 -dnl cycles/limb since both ldq and stq can be paired with the other used -dnl instructions. But there are many restrictions in the 21064 pipeline that -dnl makes it hard, if not impossible, to get down to 3 cycles/limb: - -dnl 1. ldq has a 3 cycle delay, srl and sll have a 2 cycle delay. -dnl 2. Only aligned instruction pairs can be paired. -dnl 3. The store buffer or silo might not be able to deal with the bandwidth. - -ASM_START() -PROLOGUE(mpn_rshift) - ldq r4,0(r17) C load first limb - addq r17,8,r17 - subq r31,r19,r7 - subq r18,1,r18 - and r18,4-1,r20 C number of limbs in first loop - sll r4,r7,r0 C compute function result - - beq r20,$L0 - subq r18,r20,r18 - - ALIGN(8) -$Loop0: - ldq r3,0(r17) - addq r16,8,r16 - addq r17,8,r17 - subq r20,1,r20 - srl r4,r19,r5 - sll r3,r7,r6 - bis r3,r3,r4 - bis r5,r6,r8 - stq r8,-8(r16) - bne r20,$Loop0 - -$L0: beq r18,$Lend - - ALIGN(8) -$Loop: ldq r3,0(r17) - addq r16,32,r16 - subq r18,4,r18 - srl r4,r19,r5 - sll r3,r7,r6 - - ldq r4,8(r17) - srl r3,r19,r1 - bis r5,r6,r8 - stq r8,-32(r16) - sll r4,r7,r2 - - ldq r3,16(r17) - srl r4,r19,r5 - bis r1,r2,r8 - stq r8,-24(r16) - sll r3,r7,r6 - - ldq r4,24(r17) - srl r3,r19,r1 - bis r5,r6,r8 - stq r8,-16(r16) - sll r4,r7,r2 - - addq r17,32,r17 - bis r1,r2,r8 - stq r8,-8(r16) - - bgt r18,$Loop - -$Lend: srl r4,r19,r8 - stq r8,0(r16) - ret r31,(r26),1 -EPILOGUE(mpn_rshift) -ASM_END() diff --git a/rts/gmp/mpn/alpha/sub_n.asm b/rts/gmp/mpn/alpha/sub_n.asm deleted file mode 100644 index 718f657..0000000 --- a/rts/gmp/mpn/alpha/sub_n.asm +++ /dev/null @@ -1,114 +0,0 @@ -dnl Alpha mpn_sub_n -- Subtract two limb vectors of the same length > 0 and -dnl store difference in a third limb vector. - -dnl Copyright (C) 1995, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published by -dnl the Free Software Foundation; either version 2.1 of the License, or (at your -dnl option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - -include(`../config.m4') - -dnl INPUT PARAMETERS -dnl res_ptr r16 -dnl s1_ptr r17 -dnl s2_ptr r18 -dnl size r19 - -ASM_START() -PROLOGUE(mpn_sub_n) - ldq r3,0(r17) - ldq r4,0(r18) - - subq r19,1,r19 - and r19,4-1,r2 C number of limbs in first loop - bis r31,r31,r0 - beq r2,$L0 C if multiple of 4 limbs, skip first loop - - subq r19,r2,r19 - -$Loop0: subq r2,1,r2 - ldq r5,8(r17) - addq r4,r0,r4 - ldq r6,8(r18) - cmpult r4,r0,r1 - subq r3,r4,r4 - cmpult r3,r4,r0 - stq r4,0(r16) - bis r0,r1,r0 - - addq r17,8,r17 - addq r18,8,r18 - bis r5,r5,r3 - bis r6,r6,r4 - addq r16,8,r16 - bne r2,$Loop0 - -$L0: beq r19,$Lend - - ALIGN(8) -$Loop: subq r19,4,r19 - - ldq r5,8(r17) - addq r4,r0,r4 - ldq r6,8(r18) - cmpult r4,r0,r1 - subq r3,r4,r4 - cmpult r3,r4,r0 - stq r4,0(r16) - bis r0,r1,r0 - - ldq r3,16(r17) - addq r6,r0,r6 - ldq r4,16(r18) - cmpult r6,r0,r1 - subq r5,r6,r6 - cmpult r5,r6,r0 - stq r6,8(r16) - bis r0,r1,r0 - - ldq r5,24(r17) - addq r4,r0,r4 - ldq r6,24(r18) - cmpult r4,r0,r1 - subq r3,r4,r4 - cmpult r3,r4,r0 - stq r4,16(r16) - bis r0,r1,r0 - - ldq r3,32(r17) - addq r6,r0,r6 - ldq r4,32(r18) - cmpult r6,r0,r1 - subq r5,r6,r6 - cmpult r5,r6,r0 - stq r6,24(r16) - bis r0,r1,r0 - - addq r17,32,r17 - addq r18,32,r18 - addq r16,32,r16 - bne r19,$Loop - -$Lend: addq r4,r0,r4 - cmpult r4,r0,r1 - subq r3,r4,r4 - cmpult r3,r4,r0 - stq r4,0(r16) - bis r0,r1,r0 - ret r31,(r26),1 -EPILOGUE(mpn_sub_n) -ASM_END() diff --git a/rts/gmp/mpn/alpha/submul_1.asm b/rts/gmp/mpn/alpha/submul_1.asm deleted file mode 100644 index caec1a7..0000000 --- a/rts/gmp/mpn/alpha/submul_1.asm +++ /dev/null @@ -1,87 +0,0 @@ -dnl Alpha __gmpn_submul_1 -- Multiply a limb vector with a limb and -dnl subtract the result from a second limb vector. - -dnl Copyright (C) 1992, 1994, 1995, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published by -dnl the Free Software Foundation; either version 2.1 of the License, or (at your -dnl option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - -include(`../config.m4') - -dnl INPUT PARAMETERS -dnl res_ptr r16 -dnl s1_ptr r17 -dnl size r18 -dnl s2_limb r19 - -dnl This code runs at 42 cycles/limb on EV4, 18 cycles/limb on EV5, and 7 -dnl cycles/limb on EV6. - -ASM_START() -PROLOGUE(mpn_submul_1) - ldq r2,0(r17) C r2 = s1_limb - addq r17,8,r17 C s1_ptr++ - subq r18,1,r18 C size-- - mulq r2,r19,r3 C r3 = prod_low - ldq r5,0(r16) C r5 = *res_ptr - umulh r2,r19,r0 C r0 = prod_high - beq r18,$Lend1 C jump if size was == 1 - ldq r2,0(r17) C r2 = s1_limb - addq r17,8,r17 C s1_ptr++ - subq r18,1,r18 C size-- - subq r5,r3,r3 - cmpult r5,r3,r4 - stq r3,0(r16) - addq r16,8,r16 C res_ptr++ - beq r18,$Lend2 C jump if size was == 2 - - ALIGN(8) -$Loop: mulq r2,r19,r3 C r3 = prod_low - ldq r5,0(r16) C r5 = *res_ptr - addq r4,r0,r0 C cy_limb = cy_limb + 'cy' - subq r18,1,r18 C size-- - umulh r2,r19,r4 C r4 = cy_limb - ldq r2,0(r17) C r2 = s1_limb - addq r17,8,r17 C s1_ptr++ - addq r3,r0,r3 C r3 = cy_limb + prod_low - cmpult r3,r0,r0 C r0 = carry from (cy_limb + prod_low) - subq r5,r3,r3 - cmpult r5,r3,r5 - stq r3,0(r16) - addq r16,8,r16 C res_ptr++ - addq r5,r0,r0 C combine carries - bne r18,$Loop - -$Lend2: mulq r2,r19,r3 C r3 = prod_low - ldq r5,0(r16) C r5 = *res_ptr - addq r4,r0,r0 C cy_limb = cy_limb + 'cy' - umulh r2,r19,r4 C r4 = cy_limb - addq r3,r0,r3 C r3 = cy_limb + prod_low - cmpult r3,r0,r0 C r0 = carry from (cy_limb + prod_low) - subq r5,r3,r3 - cmpult r5,r3,r5 - stq r3,0(r16) - addq r5,r0,r0 C combine carries - addq r4,r0,r0 C cy_limb = prod_high + cy - ret r31,(r26),1 -$Lend1: subq r5,r3,r3 - cmpult r5,r3,r5 - stq r3,0(r16) - addq r0,r5,r0 - ret r31,(r26),1 -EPILOGUE(mpn_submul_1) -ASM_END() diff --git a/rts/gmp/mpn/alpha/udiv_qrnnd.S b/rts/gmp/mpn/alpha/udiv_qrnnd.S deleted file mode 100644 index 53814bb..0000000 --- a/rts/gmp/mpn/alpha/udiv_qrnnd.S +++ /dev/null @@ -1,151 +0,0 @@ - # Alpha 21064 __udiv_qrnnd - - # Copyright (C) 1992, 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. - - - .set noreorder - .set noat -.text - .align 3 - .globl __gmpn_udiv_qrnnd - .ent __gmpn_udiv_qrnnd -__gmpn_udiv_qrnnd: - .frame $30,0,$26,0 - .prologue 0 -#define cnt $2 -#define tmp $3 -#define rem_ptr $16 -#define n1 $17 -#define n0 $18 -#define d $19 -#define qb $20 - - ldiq cnt,16 - blt d,.Largedivisor - -.Loop1: cmplt n0,0,tmp - addq n1,n1,n1 - bis n1,tmp,n1 - addq n0,n0,n0 - cmpule d,n1,qb - subq n1,d,tmp - cmovne qb,tmp,n1 - bis n0,qb,n0 - cmplt n0,0,tmp - addq n1,n1,n1 - bis n1,tmp,n1 - addq n0,n0,n0 - cmpule d,n1,qb - subq n1,d,tmp - cmovne qb,tmp,n1 - bis n0,qb,n0 - cmplt n0,0,tmp - addq n1,n1,n1 - bis n1,tmp,n1 - addq n0,n0,n0 - cmpule d,n1,qb - subq n1,d,tmp - cmovne qb,tmp,n1 - bis n0,qb,n0 - cmplt n0,0,tmp - addq n1,n1,n1 - bis n1,tmp,n1 - addq n0,n0,n0 - cmpule d,n1,qb - subq n1,d,tmp - cmovne qb,tmp,n1 - bis n0,qb,n0 - subq cnt,1,cnt - bgt cnt,.Loop1 - stq n1,0(rem_ptr) - bis $31,n0,$0 - ret $31,($26),1 - -.Largedivisor: - and n0,1,$4 - - srl n0,1,n0 - sll n1,63,tmp - or tmp,n0,n0 - srl n1,1,n1 - - and d,1,$6 - srl d,1,$5 - addq $5,$6,$5 - -.Loop2: cmplt n0,0,tmp - addq n1,n1,n1 - bis n1,tmp,n1 - addq n0,n0,n0 - cmpule $5,n1,qb - subq n1,$5,tmp - cmovne qb,tmp,n1 - bis n0,qb,n0 - cmplt n0,0,tmp - addq n1,n1,n1 - bis n1,tmp,n1 - addq n0,n0,n0 - cmpule $5,n1,qb - subq n1,$5,tmp - cmovne qb,tmp,n1 - bis n0,qb,n0 - cmplt n0,0,tmp - addq n1,n1,n1 - bis n1,tmp,n1 - addq n0,n0,n0 - cmpule $5,n1,qb - subq n1,$5,tmp - cmovne qb,tmp,n1 - bis n0,qb,n0 - cmplt n0,0,tmp - addq n1,n1,n1 - bis n1,tmp,n1 - addq n0,n0,n0 - cmpule $5,n1,qb - subq n1,$5,tmp - cmovne qb,tmp,n1 - bis n0,qb,n0 - subq cnt,1,cnt - bgt cnt,.Loop2 - - addq n1,n1,n1 - addq $4,n1,n1 - bne $6,.LOdd - stq n1,0(rem_ptr) - bis $31,n0,$0 - ret $31,($26),1 - -.LOdd: - /* q' in n0. r' in n1 */ - addq n1,n0,n1 - cmpult n1,n0,tmp # tmp := carry from addq - beq tmp,.LLp6 - addq n0,1,n0 - subq n1,d,n1 -.LLp6: cmpult n1,d,tmp - bne tmp,.LLp7 - addq n0,1,n0 - subq n1,d,n1 -.LLp7: - stq n1,0(rem_ptr) - bis $31,n0,$0 - ret $31,($26),1 - - .end __gmpn_udiv_qrnnd diff --git a/rts/gmp/mpn/alpha/umul.asm b/rts/gmp/mpn/alpha/umul.asm deleted file mode 100644 index 44428ed..0000000 --- a/rts/gmp/mpn/alpha/umul.asm +++ /dev/null @@ -1,39 +0,0 @@ -dnl Currently unused. - - -dnl Copyright (C) 1999, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published by -dnl the Free Software Foundation; either version 2.1 of the License, or (at your -dnl option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - - .set noreorder - .set volatile - .set noat - -.text - .align 3 - .globl __umul_ppmm - .ent __umul_ppmm -__umul_ppmm: -__umul_ppmm..ng: - .frame $30,0,$26,0 - .prologue 0 - mulq $17,$18,$1 - umulh $17,$18,$0 - stq $1,0($16) - ret $31,($26),1 - .end __umul_ppmm diff --git a/rts/gmp/mpn/alpha/unicos.m4 b/rts/gmp/mpn/alpha/unicos.m4 deleted file mode 100644 index 7ff26c0..0000000 --- a/rts/gmp/mpn/alpha/unicos.m4 +++ /dev/null @@ -1,63 +0,0 @@ -divert(-1) - - -dnl Copyright (C) 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -define(`ASM_START', - `.ident dummy') - -define(`X',`^X$1') -define(`FLOAT64', - `dnl - .psect $1@crud,data -$1: .t_floating $2 - .endp') - -define(`PROLOGUE', - `dnl - .stack 192 ; What does this mean? Only Cray knows. - .psect $1@code,code,cache -$1::') -define(`PROLOGUE_GP', `PROLOGUE($1)') - -define(`EPILOGUE', - `dnl - .endp') - -define(`DATASTART', - `dnl - .psect $1@crud,data -$1:') -define(`DATAEND', - `dnl - .endp') - -define(`ASM_END', - `dnl - .end') - -define(`unop',`bis r31,r31,r31') ; Unicos assembler lacks unop -define(`cvttqc',`cvttq/c') - -define(`ALIGN',`') ; Unicos assembler seems to align using garbage - -divert - diff --git a/rts/gmp/mpn/arm/add_n.S b/rts/gmp/mpn/arm/add_n.S deleted file mode 100644 index fb3f8f7..0000000 --- a/rts/gmp/mpn/arm/add_n.S +++ /dev/null @@ -1,77 +0,0 @@ -@ ARM mpn_add -- Add two limb vectors of the same length > 0 and store sum in -@ a third limb vector. -@ Contributed by Robert Harley. - -@ 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. - -#define s r0 -#define a r1 -#define b r2 -#define n r3 - -#define sl r10 -#define fp r11 -#define ip r12 -#define sp r13 -#define lr r14 -#define pc r15 - -.text - .align 0 - .global __gmpn_add_n - .type __gmpn_add_n,%function -__gmpn_add_n: - stmfd sp!, { r8, r9, lr } - movs n, n, lsr #1 - bcc skip1 - ldr ip, [a], #4 - ldr lr, [b], #4 - adds ip, ip, lr - str ip, [s], #4 -skip1: - tst n, #1 - beq skip2 - ldmia a!, { r8, r9 } - ldmia b!, { ip, lr } - adcs r8, r8, ip - adcs r9, r9, lr - stmia s!, { r8, r9 } -skip2: - bics n, n, #1 - beq return - stmfd sp!, { r4, r5, r6, r7 } -add_n_loop: - ldmia a!, { r4, r5, r6, r7 } - ldmia b!, { r8, r9, ip, lr } - adcs r4, r4, r8 - ldr r8, [s] /* Bring stuff into cache. */ - adcs r5, r5, r9 - adcs r6, r6, ip - adcs r7, r7, lr - stmia s!, { r4, r5, r6, r7 } - sub n, n, #2 - teq n, #0 - bne add_n_loop - ldmfd sp!, { r4, r5, r6, r7 } -return: - adc r0, n, #0 - ldmfd sp!, { r8, r9, pc } -end: - .size __gmpn_add_n, end - __gmpn_add_n diff --git a/rts/gmp/mpn/arm/addmul_1.S b/rts/gmp/mpn/arm/addmul_1.S deleted file mode 100644 index 396fff7..0000000 --- a/rts/gmp/mpn/arm/addmul_1.S +++ /dev/null @@ -1,89 +0,0 @@ -@ ARM mpn_mul_1 -- Multiply a limb vector with a limb and add the result to a -@ second limb vector. -@ Contributed by Robert Harley. - -@ Copyright (C) 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. - -#define p r0 -#define a r1 -#define n r2 -#define w r3 - -#define z r11 - -#define ip r12 -#define sp r13 -#define lr r14 -#define pc r15 - -.text - .align 0 - .global __gmpn_addmul_1 - .type __gmpn_addmul_1,%function -__gmpn_addmul_1: - stmfd sp!, { r8-r11, lr } - mov z, #0 - mov ip, #0 - movs n, n, lsr #1 - bcc skip1 - ldr lr, [a], #4 - ldr r9, [p] - umlal r9, ip, w, lr - str r9, [p], #4 -skip1: - movs n, n, lsr #1 - bcc skip2 - ldmia p, { r9, r10 } - adds r8, ip, r9 - adc r9, z, #0 - ldmia a!, { ip, lr } - umlal r8, r9, w, ip - adds r9, r9, r10 - adc ip, z, #0 - umlal r9, ip, w, lr - stmia p!, { r8, r9 } -skip2: - teq n, #0 - beq return - stmfd sp!, { r4-r7 } -addmul_loop: - ldmia p, { r5, r6, r7, r8 } - adds r4, ip, r5 - adc r5, z, #0 - ldmia a!, { r9, r10, ip, lr } - umlal r4, r5, w, r9 - adds r5, r5, r6 - adc r6, z, #0 - umlal r5, r6, w, r10 - adds r6, r6, r7 - adc r7, z, #0 - umlal r6, r7, w, ip - adds r7, r7, r8 - adc ip, z, #0 - umlal r7, ip, w, lr - subs n, n, #1 - stmia p!, { r4, r5, r6, r7 } - bne addmul_loop - ldmfd sp!, { r4-r7 } -return: - mov r0, ip - ldmfd sp!, { r8-r11, pc } -end: - .size __gmpn_addmul_1, end - __gmpn_addmul_1 diff --git a/rts/gmp/mpn/arm/gmp-mparam.h b/rts/gmp/mpn/arm/gmp-mparam.h deleted file mode 100644 index a35b0c7..0000000 --- a/rts/gmp/mpn/arm/gmp-mparam.h +++ /dev/null @@ -1,34 +0,0 @@ -/* gmp-mparam.h -- Compiler/machine parameter header file. - -Copyright (C) 1991, 1993, 1994, 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. */ - -#define BITS_PER_MP_LIMB 32 -#define BYTES_PER_MP_LIMB 4 -#define BITS_PER_LONGINT 32 -#define BITS_PER_INT 32 -#define BITS_PER_SHORTINT 16 -#define BITS_PER_CHAR 8 - -#ifndef KARATSUBA_MUL_THRESHOLD -#define KARATSUBA_MUL_THRESHOLD 21 -#endif -#ifndef KARATSUBA_SQR_THRESHOLD -#define KARATSUBA_SQR_THRESHOLD 48 -#endif diff --git a/rts/gmp/mpn/arm/mul_1.S b/rts/gmp/mpn/arm/mul_1.S deleted file mode 100644 index bae526a..0000000 --- a/rts/gmp/mpn/arm/mul_1.S +++ /dev/null @@ -1,81 +0,0 @@ -@ ARM mpn_addmul_1 -- Multiply a limb vector with a limb and store the result -@ in a second limb vector. -@ Contributed by Robert Harley. - -@ Copyright (C) 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. - -#define p r0 -#define a r1 -#define n r2 -#define w r3 - -#define sl r10 -#define fp r11 -#define ip r12 -#define sp r13 -#define lr r14 -#define pc r15 - -.text - .align 0 - .global __gmpn_mul_1 - .type __gmpn_mul_1,%function -__gmpn_mul_1: - stmfd sp!, { r8, r9, lr } - ands ip, n, #1 - beq skip1 - ldr lr, [a], #4 - umull r9, ip, w, lr - str r9, [p], #4 -skip1: - tst n, #2 - beq skip2 - mov r8, ip - ldmia a!, { ip, lr } - mov r9, #0 - umlal r8, r9, w, ip - mov ip, #0 - umlal r9, ip, w, lr - stmia p!, { r8, r9 } -skip2: - bics n, n, #3 - beq return - stmfd sp!, { r6, r7 } -mul_1_loop: - mov r6, ip - ldmia a!, { r8, r9, ip, lr } - ldr r7, [p] /* Bring stuff into cache. */ - mov r7, #0 - umlal r6, r7, w, r8 - mov r8, #0 - umlal r7, r8, w, r9 - mov r9, #0 - umlal r8, r9, w, ip - mov ip, #0 - umlal r9, ip, w, lr - subs n, n, #4 - stmia p!, { r6, r7, r8, r9 } - bne mul_1_loop - ldmfd sp!, { r6, r7 } -return: - mov r0, ip - ldmfd sp!, { r8, r9, pc } -end: - .size __gmpn_mul_1, end - __gmpn_mul_1 diff --git a/rts/gmp/mpn/arm/sub_n.S b/rts/gmp/mpn/arm/sub_n.S deleted file mode 100644 index 856505f..0000000 --- a/rts/gmp/mpn/arm/sub_n.S +++ /dev/null @@ -1,79 +0,0 @@ -@ ARM mpn_sub -- Subtract two limb vectors of the same length > 0 and store -@ difference in a third limb vector. -@ Contributed by Robert Harley. - -@ 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. - -#define d r0 -#define a r1 -#define b r2 -#define n r3 - -#define sl r10 -#define fp r11 -#define ip r12 -#define sp r13 -#define lr r14 -#define pc r15 - -.text - .align 0 - .global __gmpn_sub_n - .type __gmpn_sub_n,%function -__gmpn_sub_n: - stmfd sp!, { r8, r9, lr } - subs ip, ip, ip - tst n, #1 - beq skip1 - ldr ip, [a], #4 - ldr lr, [b], #4 - subs ip, ip, lr - str ip, [d], #4 -skip1: - tst n, #2 - beq skip2 - ldmia a!, { r8, r9 } - ldmia b!, { ip, lr } - sbcs r8, r8, ip - sbcs r9, r9, lr - stmia d!, { r8, r9 } -skip2: - bics n, n, #3 - beq return - stmfd sp!, { r4, r5, r6, r7 } -sub_n_loop: - ldmia a!, { r4, r5, r6, r7 } - ldmia b!, { r8, r9, ip, lr } - sbcs r4, r4, r8 - ldr r8, [d] /* Bring stuff into cache. */ - sbcs r5, r5, r9 - sbcs r6, r6, ip - sbcs r7, r7, lr - stmia d!, { r4, r5, r6, r7 } - sub n, n, #4 - teq n, #0 - bne sub_n_loop - ldmfd sp!, { r4, r5, r6, r7 } -return: - sbc r0, r0, r0 - and r0, r0, #1 - ldmfd sp!, { r8, r9, pc } -end: - .size __gmpn_sub_n, end - __gmpn_sub_n diff --git a/rts/gmp/mpn/asm-defs.m4 b/rts/gmp/mpn/asm-defs.m4 deleted file mode 100644 index aa20241..0000000 --- a/rts/gmp/mpn/asm-defs.m4 +++ /dev/null @@ -1,1182 +0,0 @@ -divert(-1) -dnl -dnl m4 macros for gmp assembly code, shared by all CPUs. -dnl -dnl These macros are designed for use with any m4 and have been used on -dnl GNU, FreeBSD, OpenBSD and SysV. -dnl -dnl GNU m4 and OpenBSD 2.7 m4 will give filenames and line numbers in error -dnl messages. - - -dnl Copyright (C) 1999, 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -dnl Macros: -dnl -dnl Most new m4 specific macros have an "m4_" prefix to emphasise they're -dnl m4 expansions. But new defining things like deflit() and defreg() are -dnl named like the builtin define(), and forloop() is named following the -dnl GNU m4 example on which it's based. -dnl -dnl GNU m4 with the -P option uses "m4_" as a prefix for builtins, but that -dnl option isn't going to be used, so there's no conflict or confusion. -dnl -dnl -dnl Comments in output: -dnl -dnl The m4 comment delimiters are left at # and \n, the normal assembler -dnl commenting for most CPUs. m4 passes comment text through without -dnl expanding macros in it, which is generally a good thing since it stops -dnl unexpected expansions and possible resultant errors. -dnl -dnl But note that when a quoted string is being read, a # isn't special, so -dnl apostrophes in comments in quoted strings must be avoided or they'll be -dnl interpreted as a closing quote mark. But when the quoted text is -dnl re-read # will still act like a normal comment, supressing macro -dnl expansion. -dnl -dnl For example, -dnl -dnl # apostrophes in comments that're outside quotes are ok -dnl # and using macro names like PROLOGUE is ok too -dnl ... -dnl ifdef(`PIC',` -dnl # but apostrophes aren't ok inside quotes -dnl # ^--wrong -dnl ... -dnl # though macro names like PROLOGUE are still ok -dnl ... -dnl ') -dnl -dnl If macro expansion in a comment is wanted, use `#' in the .asm (ie. a -dnl quoted hash symbol), which will turn into # in the .s but get -dnl expansions done on that line. This can make the .s more readable to -dnl humans, but it won't make a blind bit of difference to the assembler. -dnl -dnl All the above applies, mutatis mutandis, when changecom() is used to -dnl select @ ! ; or whatever other commenting. -dnl -dnl -dnl Variations in m4 affecting gmp: -dnl -dnl $# - When a macro is called as "foo" with no brackets, BSD m4 sets $# -dnl to 1, whereas GNU or SysV m4 set it to 0. In all cases though -dnl "foo()" sets $# to 1. This is worked around in various places. -dnl -dnl len() - When "len()" is given an empty argument, BSD m4 evaluates to -dnl nothing, whereas GNU, SysV, and the new OpenBSD, evaluate to 0. -dnl See m4_length() below which works around this. -dnl -dnl translit() - GNU m4 accepts character ranges like A-Z, and the new -dnl OpenBSD m4 does under option -g, but basic BSD and SysV don't. -dnl -dnl popdef() - in BSD and SysV m4 popdef() takes multiple arguments and -dnl pops each, but GNU m4 only takes one argument. -dnl -dnl push back - BSD m4 has some limits on the amount of text that can be -dnl pushed back. The limit is reasonably big and so long as macros -dnl don't gratuitously duplicate big arguments it isn't a problem. -dnl Normally an error message is given, but sometimes it just hangs. -dnl -dnl eval() &,|,^ - GNU and SysV m4 have bitwise operators &,|,^ available, -dnl but BSD m4 doesn't (contrary to what the man page suggests) and -dnl instead ^ is exponentiation. -dnl -dnl eval() ?: - The C ternary operator "?:" is available in BSD m4, but not -dnl in SysV or GNU m4 (as of GNU m4 1.4 and betas of 1.5). -dnl -dnl eval() -2^31 - BSD m4 has a bug where an eval() resulting in -2^31 -dnl (ie. -2147483648) gives "-(". Using -2147483648 within an -dnl expression is ok, it just can't be a final result. "-(" will of -dnl course upset parsing, with all sorts of strange effects. -dnl -dnl eval() <<,>> - SysV m4 doesn't support shift operators in eval() (on -dnl SunOS 5.7 /usr/xpg4/m4 has them but /usr/ccs/m4 doesn't). See -dnl m4_lshift() and m4_rshift() below for workarounds. -dnl -dnl m4wrap() - in BSD m4, m4wrap() replaces any previous m4wrap() string, -dnl in SysV m4 it appends to it, and in GNU m4 it prepends. See -dnl m4wrap_prepend() below which brings uniformity to this. -dnl -dnl __file__,__line__ - GNU m4 and OpenBSD 2.7 m4 provide these, and -dnl they're used here to make error messages more informative. GNU m4 -dnl gives an unhelpful "NONE 0" in an m4wrap(), but that's worked -dnl around. -dnl -dnl __file__ quoting - OpenBSD m4, unlike GNU m4, doesn't quote the -dnl filename in __file__, so care should be taken that no macro has -dnl the same name as a file, or an unwanted expansion will occur when -dnl printing an error or warning. -dnl -dnl OpenBSD 2.6 m4 - this m4 rejects decimal constants containing an 8 or 9 -dnl in eval(), making it pretty much unusable. This bug is confined -dnl to version 2.6 (it's not in 2.5, and has been fixed in 2.7). -dnl -dnl SunOS /usr/bin/m4 - this m4 lacks a number of desired features, -dnl including $# and $@, defn(), m4exit(), m4wrap(), pushdef(), -dnl popdef(). /usr/5bin/m4 is a SysV style m4 which should always be -dnl available, and "configure" will reject /usr/bin/m4 in favour of -dnl /usr/5bin/m4 (if necessary). -dnl -dnl The sparc code actually has modest m4 requirements currently and -dnl could manage with /usr/bin/m4, but there's no reason to put our -dnl macros through contortions when /usr/5bin/m4 is available or GNU -dnl m4 can be installed. - - -ifdef(`__ASM_DEFS_M4_INCLUDED__', -`m4_error(`asm-defs.m4 already included, dont include it twice -')m4exit(1)') -define(`__ASM_DEFS_M4_INCLUDED__') - - -dnl Detect and give a message about the unsuitable OpenBSD 2.6 m4. - -ifelse(eval(89),89,, -`errprint( -`This m4 doesnt accept 8 and/or 9 in constants in eval(), making it unusable. -This is probably OpenBSD 2.6 m4 (September 1999). Upgrade to OpenBSD 2.7, -or get a bug fix from the CVS (expr.c rev 1.9), or get GNU m4. Dont forget -to configure with M4=/wherever/m4 if you install one of these in a directory -not in $PATH. -')m4exit(1)') - - -dnl Detect and give a message about the unsuitable SunOS /usr/bin/m4. -dnl -dnl Unfortunately this test doesn't work when m4 is run in the normal way -dnl from mpn/Makefile with "m4 -DOPERATION_foo foo.asm", since the bad m4 -dnl takes "-" in "-D..." to mean read stdin, so it will look like it just -dnl hangs. But running "m4 asm-defs.m4" to try it out will work. -dnl -dnl We'd like to abort immediately on finding a problem, but unfortunately -dnl the bad m4 doesn't have an m4exit(), nor does an invalid eval() kill -dnl it. Unexpanded $#'s in some m4_assert_numargs() later on will comment -dnl out some closing parentheses and kill it with "m4: arg stack overflow". - -define(m4_dollarhash_works_test,``$#'') -ifelse(m4_dollarhash_works_test(x),1,, -`errprint( -`This m4 doesnt support $# and cant be used for GMP asm processing. -If this is on SunOS, ./configure should choose /usr/5bin/m4 if you have that -or can get it, otherwise install GNU m4. Dont forget to configure with -M4=/wherever/m4 if you install in a directory not in $PATH. -')') -undefine(`m4_dollarhash_works_test') - - -dnl -------------------------------------------------------------------------- -dnl Basic error handling things. - - -dnl Usage: m4_dollarhash_1_if_noparen_p -dnl -dnl Expand to 1 if a call "foo" gives $# set to 1 (as opposed to 0 like GNU -dnl and SysV m4 give). - -define(m4_dollarhash_1_if_noparen_test,`$#') -define(m4_dollarhash_1_if_noparen_p, -eval(m4_dollarhash_1_if_noparen_test==1)) -undefine(`m4_dollarhash_1_if_noparen_test') - - -dnl Usage: m4wrap_prepend(string) -dnl -dnl Prepend the given string to what will be exapanded under m4wrap at the -dnl end of input. -dnl -dnl This macro exists to work around variations in m4wrap() behaviour in -dnl the various m4s (notes at the start of this file). Don't use m4wrap() -dnl directly since it will interfere with this scheme. - -define(m4wrap_prepend, -m4_assert_numargs(1) -`define(`m4wrap_string',`$1'defn(`m4wrap_string'))') - -m4wrap(`m4wrap_string') -define(m4wrap_string,`') - - -dnl Usage: m4_file_and_line -dnl -dnl Expand to the current file and line number, if the GNU m4 extensions -dnl __file__ and __line__ are available. -dnl -dnl In GNU m4 1.4 at the end of input when m4wrap text is expanded, -dnl __file__ is NONE and __line__ is 0, which is not a helpful thing to -dnl print. If m4_file_seen() has been called to note the last file seen, -dnl then that file at a big line number is used, otherwise "end of input" -dnl is used (although "end of input" won't parse as an error message). - -define(m4_file_and_line, -`ifdef(`__file__', -`ifelse(__file__`'__line__,`NONE0', -`ifdef(`m4_file_seen_last',`m4_file_seen_last: 999999: ',`end of input: ')', -`__file__: __line__: ')')') - - -dnl Usage: m4_errprint_commas(arg,...) -dnl -dnl The same as errprint(), but commas are printed between arguments -dnl instead of spaces. - -define(m4_errprint_commas, -`errprint(`$1')dnl -ifelse(eval($#>1),1,`errprint(`,')m4_errprint_commas(shift($@))')') - - -dnl Usage: m4_error(args...) -dnl m4_warning(args...) -dnl -dnl Print an error message, using m4_errprint_commas, prefixed with the -dnl current filename and line number (if available). m4_error sets up to -dnl give an error exit at the end of processing, m4_warning just prints. -dnl These macros are the recommended way to print errors. -dnl -dnl The arguments here should be quoted in the usual way to prevent them -dnl being expanded when the macro call is read. (m4_error takes care not -dnl to do any further expansion.) -dnl -dnl For example, -dnl -dnl m4_error(`some error message -dnl ') -dnl -dnl which prints -dnl -dnl foo.asm:123: some error message -dnl -dnl or if __file__ and __line__ aren't available -dnl -dnl some error message -dnl -dnl The "file:line:" format is a basic style, used by gcc and GNU m4, so -dnl emacs and other editors will recognise it in their normal error message -dnl parsing. - -define(m4_warning, -`m4_errprint_commas(m4_file_and_line`'$@)') - -define(m4_error, -`define(`m4_error_occurred',1)m4_warning($@)') - -define(`m4_error_occurred',0) - -dnl This m4wrap_prepend() is first, so it'll be executed last. -m4wrap_prepend( -`ifelse(m4_error_occurred,1, -`m4_error(`Errors occurred during m4 processing -')m4exit(1)')') - - -dnl Usage: m4_assert_numargs(num) -dnl -dnl Put this unquoted on a line on its own at the start of a macro -dnl definition to add some code to check that num many arguments get passed -dnl to the macro. For example, -dnl -dnl define(foo, -dnl m4_assert_numargs(2) -dnl `something `$1' and `$2' blah blah') -dnl -dnl Then a call like foo(one,two,three) will provoke an error like -dnl -dnl file:10: foo expected 2 arguments, got 3 arguments -dnl -dnl Here are some calls and how many arguments they're interpreted as passing. -dnl -dnl foo(abc,def) 2 -dnl foo(xyz) 1 -dnl foo() 0 -dnl foo -1 -dnl -dnl The -1 for no parentheses at all means a macro that's meant to be used -dnl that way can be checked with m4_assert_numargs(-1). For example, -dnl -dnl define(SPECIAL_SUFFIX, -dnl m4_assert_numargs(-1) -dnl `ifdef(`FOO',`_foo',`_bar')') -dnl -dnl But as an alternative see also deflit() below where parenthesized -dnl expressions following a macro are passed through to the output. -dnl -dnl Note that in BSD m4 there's no way to differentiate calls "foo" and -dnl "foo()", so in BSD m4 the distinction between the two isn't enforced. -dnl (In GNU and SysV m4 it can be checked, and is.) - - -dnl m4_assert_numargs is able to check its own arguments by calling -dnl assert_numargs_internal directly. -dnl -dnl m4_doublequote($`'0) expands to ``$0'', whereas ``$`'0'' would expand -dnl to `$`'0' and do the wrong thing, and likewise for $1. The same is -dnl done in other assert macros. -dnl -dnl $`#' leaves $# in the new macro being defined, and stops # being -dnl interpreted as a comment character. -dnl -dnl `dnl ' means an explicit dnl isn't necessary when m4_assert_numargs is -dnl used. The space means that if there is a dnl it'll still work. - -dnl Usage: m4_doublequote(x) expands to ``x'' -define(m4_doublequote, -`m4_assert_numargs_internal(`$0',1,$#,len(`$1'))``$1''') - -define(m4_assert_numargs, -`m4_assert_numargs_internal(`$0',1,$#,len(`$1'))dnl -`m4_assert_numargs_internal'(m4_doublequote($`'0),$1,$`#',`len'(m4_doublequote($`'1)))`dnl '') - -dnl Called: m4_assert_numargs_internal(`macroname',wantargs,$#,len(`$1')) -define(m4_assert_numargs_internal, -`m4_assert_numargs_internal_check(`$1',`$2',m4_numargs_count(`$3',`$4'))') - -dnl Called: m4_assert_numargs_internal_check(`macroname',wantargs,gotargs) -dnl -dnl If m4_dollarhash_1_if_noparen_p (BSD m4) then gotargs can be 0 when it -dnl should be -1. If wantargs is -1 but gotargs is 0 and the two can't be -dnl distinguished then it's allowed to pass. -dnl -define(m4_assert_numargs_internal_check, -`ifelse(eval($2 == $3 - || ($2==-1 && $3==0 && m4_dollarhash_1_if_noparen_p)),0, -`m4_error(`$1 expected 'm4_Narguments(`$2')`, got 'm4_Narguments(`$3') -)')') - -dnl Called: m4_numargs_count($#,len(`$1')) -dnl If $#==0 then -1 args, if $#==1 but len(`$1')==0 then 0 args, otherwise -dnl $# args. -define(m4_numargs_count, -`ifelse($1,0, -1, -`ifelse(eval($1==1 && $2-0==0),1, 0, $1)')') - -dnl Usage: m4_Narguments(N) -dnl "$1 argument" or "$1 arguments" with the plural according to $1. -define(m4_Narguments, -`$1 argument`'ifelse(`$1',1,,s)') - - -dnl -------------------------------------------------------------------------- -dnl Additional error checking things. - - -dnl Usage: m4_file_seen() -dnl -dnl Record __file__ for the benefit of m4_file_and_line in m4wrap text. -dnl The basic __file__ macro comes out quoted, like `foo.asm', and -dnl m4_file_seen_last is defined like that too. -dnl -dnl This only needs to be used with something that could generate an error -dnl message in m4wrap text. The x86 PROLOGUE is the only such at the -dnl moment (at end of input its m4wrap checks for missing EPILOGUE). A few -dnl include()s can easily trick this scheme, but you'd expect an EPILOGUE -dnl in the same file as the PROLOGUE. - -define(m4_file_seen, -m4_assert_numargs(0) -`ifelse(__file__,`NONE',, -`define(`m4_file_seen_last',m4_doublequote(__file__))')') - - -dnl Usage: m4_assert_onearg() -dnl -dnl Put this, unquoted, at the start of a macro definition to add some code -dnl to check that one argument is passed to the macro, but with that -dnl argument allowed to be empty. For example, -dnl -dnl define(foo, -dnl m4_assert_onearg() -dnl `blah blah $1 blah blah') -dnl -dnl Calls "foo(xyz)" or "foo()" are accepted. A call "foo(xyz,abc)" fails. -dnl A call "foo" fails too, but BSD m4 can't detect this case (GNU and SysV -dnl m4 can). - -define(m4_assert_onearg, -m4_assert_numargs(0) -`m4_assert_onearg_internal'(m4_doublequote($`'0),$`#')`dnl ') - -dnl Called: m4_assert_onearg(`macroname',$#) -define(m4_assert_onearg_internal, -`ifelse($2,1,, -`m4_error(`$1 expected 1 argument, got 'm4_Narguments(`$2') -)')') - - -dnl Usage: m4_assert_numargs_range(low,high) -dnl -dnl Put this, unquoted, at the start of a macro definition to add some code -dnl to check that between low and high many arguments get passed to the -dnl macro. For example, -dnl -dnl define(foo, -dnl m4_assert_numargs_range(3,5) -dnl `mandatory $1 $2 $3 optional $4 $5 end') -dnl -dnl See m4_assert_numargs() for more info. - -define(m4_assert_numargs_range, -m4_assert_numargs(2) -``m4_assert_numargs_range_internal'(m4_doublequote($`'0),$1,$2,$`#',`len'(m4_doublequote($`'1)))`dnl '') - -dnl Called: m4_assert_numargs_range_internal(`name',low,high,$#,len(`$1')) -define(m4_assert_numargs_range_internal, -m4_assert_numargs(5) -`m4_assert_numargs_range_check(`$1',`$2',`$3',m4_numargs_count(`$4',`$5'))') - -dnl Called: m4_assert_numargs_range_check(`name',low,high,gotargs) -dnl -dnl If m4_dollarhash_1_if_noparen_p (BSD m4) then gotargs can be 0 when it -dnl should be -1. To ensure a `high' of -1 works, a fudge is applied to -dnl gotargs if it's 0 and the 0 and -1 cases can't be distinguished. -dnl -define(m4_assert_numargs_range_check, -m4_assert_numargs(4) -`ifelse(eval($2 <= $4 && - ($4 - ($4==0 && m4_dollarhash_1_if_noparen_p) <= $3)),0, -`m4_error(`$1 expected $2 to $3 arguments, got 'm4_Narguments(`$4') -)')') - - -dnl Usage: m4_assert_defined(symbol) -dnl -dnl Put this unquoted on a line of its own at the start of a macro -dnl definition to add some code to check that the given symbol is defined -dnl when the macro is used. For example, -dnl -dnl define(foo, -dnl m4_assert_defined(`FOO_PREFIX') -dnl `FOO_PREFIX whatever') -dnl -dnl This is a convenient way to check that the user or ./configure or -dnl whatever has defined the things needed by a macro, as opposed to -dnl silently generating garbage. - -define(m4_assert_defined, -m4_assert_numargs(1) -``m4_assert_defined_internal'(m4_doublequote($`'0),``$1'')`dnl '') - -dnl Called: m4_assert_defined_internal(`macroname',`define_required') -define(m4_assert_defined_internal, -m4_assert_numargs(2) -`ifdef(`$2',, -`m4_error(`$1 needs $2 defined -')')') - - -dnl Usage: m4_not_for_expansion(`SYMBOL') -dnl define_not_for_expansion(`SYMBOL') -dnl -dnl m4_not_for_expansion turns SYMBOL, if defined, into something which -dnl will give an error if expanded. For example, -dnl -dnl m4_not_for_expansion(`PIC') -dnl -dnl define_not_for_expansion is the same, but always makes a definition. -dnl -dnl These are for symbols that should be tested with ifdef(`FOO',...) -dnl rather than be expanded as such. They guard against accidentally -dnl omitting the quotes, as in ifdef(FOO,...). Note though that they only -dnl catches this when FOO is defined, so be sure to test code both with and -dnl without each definition. - -define(m4_not_for_expansion, -m4_assert_numargs(1) -`ifdef(`$1',`define_not_for_expansion(`$1')')') - -define(define_not_for_expansion, -m4_assert_numargs(1) -`ifelse(defn(`$1'),,, -`m4_error(``$1' has a non-empty value, maybe it shouldnt be munged with m4_not_for_expansion() -')')dnl -define(`$1',`m4_not_for_expansion_internal(`$1')')') - -define(m4_not_for_expansion_internal, -`m4_error(``$1' is not meant to be expanded, perhaps you mean `ifdef(`$1',...)' -')') - - -dnl -------------------------------------------------------------------------- -dnl Various generic m4 things. - - -dnl Usage: m4_ifdef_anyof_p(`symbol',...) -dnl -dnl Expand to 1 if any of the symbols in the argument list are defined, or -dnl to 0 if not. - -define(m4_ifdef_anyof_p, -`ifelse(eval($#<=1 && m4_length(`$1')==0),1, 0, -`ifdef(`$1', 1, -`m4_ifdef_anyof_p(shift($@))')')') - - -dnl Usage: m4_length(string) -dnl -dnl Determine the length of a string. This is the same as len(), but -dnl always expands to a number, working around the BSD len() which -dnl evaluates to nothing given an empty argument. - -define(m4_length, -m4_assert_onearg() -`eval(len(`$1')-0)') - - -dnl Usage: m4_stringequal_p(x,y) -dnl -dnl Expand to 1 or 0 according as strings x and y are equal or not. - -define(m4_stringequal_p, -`ifelse(`$1',`$2',1,0)') - - -dnl Usage: m4_incr_or_decr(n,last) -dnl -dnl Do an incr(n) or decr(n), whichever is in the direction of "last". -dnl Both n and last must be numbers of course. - -define(m4_incr_or_decr, -m4_assert_numargs(2) -`ifelse(eval($1<$2),1,incr($1),decr($1))') - - -dnl Usage: forloop(i, first, last, statement) -dnl -dnl Based on GNU m4 examples/forloop.m4, but extended. -dnl -dnl statement is expanded repeatedly, with i successively defined as -dnl -dnl first, first+1, ..., last-1, last -dnl -dnl Or if first > last, then it's -dnl -dnl first, first-1, ..., last+1, last -dnl -dnl If first == last, then one expansion is done. -dnl -dnl A pushdef/popdef of i is done to preserve any previous definition (or -dnl lack of definition). first and last are eval()ed and so can be -dnl expressions. -dnl -dnl forloop_first is defined to 1 on the first iteration, 0 on the rest. -dnl forloop_last is defined to 1 on the last iteration, 0 on the others. -dnl Nested forloops are allowed, in which case forloop_first and -dnl forloop_last apply to the innermost loop that's open. -dnl -dnl A simple example, -dnl -dnl forloop(i, 1, 2*2+1, `dnl -dnl iteration number i ... ifelse(forloop_first,1,FIRST) -dnl ') - - -dnl "i" and "statement" are carefully quoted, but "first" and "last" are -dnl just plain numbers once eval()ed. - -define(`forloop', -m4_assert_numargs(4) -`pushdef(`$1',eval(`$2'))dnl -pushdef(`forloop_first',1)dnl -pushdef(`forloop_last',0)dnl -forloop_internal(`$1',eval(`$3'),`$4')`'dnl -popdef(`forloop_first')dnl -popdef(`forloop_last')dnl -popdef(`$1')') - -dnl Called: forloop_internal(`var',last,statement) -define(`forloop_internal', -m4_assert_numargs(3) -`ifelse($1,$2, -`define(`forloop_last',1)$3', -`$3`'dnl -define(`forloop_first',0)dnl -define(`$1',m4_incr_or_decr($1,$2))dnl -forloop_internal(`$1',$2,`$3')')') - - -dnl Usage: m4_toupper(x) -dnl m4_tolower(x) -dnl -dnl Convert the argument string to upper or lower case, respectively. -dnl Only one argument accepted. -dnl -dnl BSD m4 doesn't take ranges like a-z in translit(), so the full alphabet -dnl is written out. - -define(m4_alphabet_lower, `abcdefghijklmnopqrstuvwxyz') -define(m4_alphabet_upper, `ABCDEFGHIJKLMNOPQRSTUVWXYZ') - -define(m4_toupper, -m4_assert_onearg() -`translit(`$1', m4_alphabet_lower, m4_alphabet_upper)') - -define(m4_tolower, -m4_assert_onearg() -`translit(`$1', m4_alphabet_upper, m4_alphabet_lower)') - - -dnl Usage: m4_empty_if_zero(x) -dnl -dnl Evaluate to x, or to nothing if x is 0. x is eval()ed and so can be an -dnl expression. -dnl -dnl This is useful for x86 addressing mode displacements since forms like -dnl (%ebx) are one byte shorter than 0(%ebx). A macro `foo' for use as -dnl foo(%ebx) could be defined with the following so it'll be empty if the -dnl expression comes out zero. -dnl -dnl deflit(`foo', `m4_empty_if_zero(a+b*4-c)') -dnl -dnl Naturally this shouldn't be done if, say, a computed jump depends on -dnl the code being a particular size. - -define(m4_empty_if_zero, -m4_assert_onearg() -`ifelse(eval($1),0,,eval($1))') - - -dnl Usage: m4_log2(x) -dnl -dnl Calculate a logarithm to base 2. -dnl x must be an integral power of 2, between 2**0 and 2**30. -dnl x is eval()ed, so it can be an expression. -dnl An error results if x is invalid. -dnl -dnl 2**31 isn't supported, because an unsigned 2147483648 is out of range -dnl of a 32-bit signed int. Also, the bug in BSD m4 where an eval() -dnl resulting in 2147483648 (or -2147483648 as the case may be) gives `-(' -dnl means tests like eval(1<<31==(x)) would be necessary, but that then -dnl gives an unattractive explosion of eval() error messages if x isn't -dnl numeric. - -define(m4_log2, -m4_assert_numargs(1) -`m4_log2_internal(0,1,eval(`$1'))') - -dnl Called: m4_log2_internal(n,2**n,target) -define(m4_log2_internal, -m4_assert_numargs(3) -`ifelse($2,$3,$1, -`ifelse($1,30, -`m4_error(`m4_log2() argument too big or not a power of two: $3 -')', -`m4_log2_internal(incr($1),eval(2*$2),$3)')')') - - -dnl Usage: m4_div2_towards_zero -dnl -dnl m4 division is probably whatever a C signed division is, and C doesn't -dnl specify what rounding gets used on negatives, so this expression forces -dnl a rounding towards zero. - -define(m4_div2_towards_zero, -m4_assert_numargs(1) -`eval((($1) + ((($1)<0) & ($1))) / 2)') - - -dnl Usage: m4_lshift(n,count) -dnl m4_rshift(n,count) -dnl -dnl Calculate n shifted left or right by count many bits. Both n and count -dnl are eval()ed and so can be expressions. -dnl -dnl Negative counts are allowed and mean a shift in the opposite direction. -dnl Negative n is allowed and right shifts will be arithmetic (meaning -dnl divide by 2**count, rounding towards zero, also meaning the sign bit is -dnl duplicated). -dnl -dnl Use these macros instead of << and >> in eval() since the basic ccs -dnl SysV m4 doesn't have those operators. - -define(m4_rshift, -m4_assert_numargs(2) -`m4_lshift(`$1',-(`$2'))') - -define(m4_lshift, -m4_assert_numargs(2) -`m4_lshift_internal(eval(`$1'),eval(`$2'))') - -define(m4_lshift_internal, -m4_assert_numargs(2) -`ifelse(eval($2-0==0),1,$1, -`ifelse(eval($2>0),1, -`m4_lshift_internal(eval($1*2),decr($2))', -`m4_lshift_internal(m4_div2_towards_zero($1),incr($2))')')') - - -dnl Usage: deflit(name,value) -dnl -dnl Like define(), but "name" expands like a literal, rather than taking -dnl arguments. For example "name(%eax)" expands to "value(%eax)". -dnl -dnl Limitations: -dnl -dnl $ characters in the value part must have quotes to stop them looking -dnl like macro parameters. For example, deflit(reg,`123+$`'4+567'). See -dnl defreg() below for handling simple register definitions like $7 etc. -dnl -dnl "name()" is turned into "name", unfortunately. In GNU and SysV m4 an -dnl error is generated when this happens, but in BSD m4 it will happen -dnl silently. The problem is that in BSD m4 $# is 1 in both "name" or -dnl "name()", so there's no way to differentiate them. Because we want -dnl plain "name" to turn into plain "value", we end up with "name()" -dnl turning into plain "value" too. -dnl -dnl "name(foo)" will lose any whitespace after commas in "foo", for example -dnl "disp(%eax, %ecx)" would become "128(%eax,%ecx)". -dnl -dnl These parentheses oddities shouldn't matter in assembler text, but if -dnl they do the suggested workaround is to write "name ()" or "name (foo)" -dnl to stop the parentheses looking like a macro argument list. If a space -dnl isn't acceptable in the output, then write "name`'()" or "name`'(foo)". -dnl The `' is stripped when read, but again stops the parentheses looking -dnl like parameters. - -dnl Quoting for deflit_emptyargcheck is similar to m4_assert_numargs. The -dnl stuff in the ifelse gives a $#, $1 and $@ evaluated in the new macro -dnl created, not in deflit. -define(deflit, -m4_assert_numargs(2) -`define(`$1', -`deflit_emptyargcheck'(``$1'',$`#',m4_doublequote($`'1))`dnl -$2`'dnl -ifelse(eval($'`#>1 || m4_length('m4_doublequote($`'1)`)!=0),1,($'`@))')') - -dnl Called: deflit_emptyargcheck(macroname,$#,`$1') -define(deflit_emptyargcheck, -`ifelse(eval($2==1 && !m4_dollarhash_1_if_noparen_p && m4_length(`$3')==0),1, -`m4_error(`dont use a deflit as $1() because it loses the brackets (see deflit in asm-incl.m4 for more information) -')')') - - -dnl Usage: m4_assert(`expr') -dnl -dnl Test a compile-time requirement with an m4 expression. The expression -dnl should be quoted, and will be eval()ed and expected to be non-zero. -dnl For example, -dnl -dnl m4_assert(`FOO*2+6 < 14') - -define(m4_assert, -m4_assert_numargs(1) -`ifelse(eval($1),1,, -`m4_error(`assertion failed: $1 -')')') - - -dnl -------------------------------------------------------------------------- -dnl Various assembler things, not specific to any particular CPU. -dnl - - -dnl Usage: include_mpn(`filename') -dnl -dnl Like include(), but adds a path to the mpn source directory. For -dnl example, -dnl -dnl include_mpn(`sparc64/addmul_1h.asm') - -define(include_mpn, -m4_assert_numargs(1) -m4_assert_defined(`CONFIG_TOP_SRCDIR') -`include(CONFIG_TOP_SRCDIR`/mpn/$1')') - - -dnl Usage: C comment ... -dnl -dnl "C" works like a FORTRAN-style comment character. This can be used for -dnl comments to the right of assembly instructions, where just dnl would -dnl remove the linefeed, and concatenate adjacent lines. -dnl -dnl "C" and/or "dnl" are useful when an assembler doesn't support comments, -dnl or where different assemblers for a particular CPU have different -dnl comment styles. The intermediate ".s" files will end up with no -dnl comments, just code. -dnl -dnl Using "C" is not intended to cause offence to anyone who doesn't like -dnl FORTRAN; but if that happens it's an unexpected bonus. - -define(C, ` -dnl') - - -dnl Various possible defines passed from the Makefile that are to be tested -dnl with ifdef() rather than be expanded. - -m4_not_for_expansion(`PIC') - -dnl aors_n -m4_not_for_expansion(`OPERATION_add_n') -m4_not_for_expansion(`OPERATION_sub_n') - -dnl aorsmul_n -m4_not_for_expansion(`OPERATION_addmul_1') -m4_not_for_expansion(`OPERATION_submul_1') - -dnl logops_n -m4_not_for_expansion(`OPERATION_and_n') -m4_not_for_expansion(`OPERATION_andn_n') -m4_not_for_expansion(`OPERATION_nand_n') -m4_not_for_expansion(`OPERATION_ior_n') -m4_not_for_expansion(`OPERATION_iorn_n') -m4_not_for_expansion(`OPERATION_nior_n') -m4_not_for_expansion(`OPERATION_xor_n') -m4_not_for_expansion(`OPERATION_xnor_n') - -dnl popham -m4_not_for_expansion(`OPERATION_popcount') -m4_not_for_expansion(`OPERATION_hamdist') - - -dnl Usage: m4_config_gmp_mparam(`symbol') -dnl -dnl Check that `symbol' is defined. If it isn't, issue an error and -dnl terminate immediately. The error message explains that the symbol -dnl should be in config.m4, copied from gmp-mparam.h. -dnl -dnl Processing is terminated immediately since missing something like -dnl KARATSUBA_SQR_THRESHOLD can lead to infinite loops with endless error -dnl messages. - -define(m4_config_gmp_mparam, -m4_assert_numargs(1) -`ifdef(`$1',, -`m4_error(`$1 is not defined. - "configure" should have extracted this from gmp-mparam.h and put it - in config.m4, but somehow this has failed. -')m4exit(1)')') - - -dnl Usage: defreg(name,reg) -dnl -dnl Give a name to a $ style register. For example, -dnl -dnl defreg(foo,$12) -dnl -dnl defreg() inserts an extra pair of quotes after the $ so that it's not -dnl interpreted as an m4 macro parameter, ie. foo is actually $`'12. m4 -dnl strips those quotes when foo is expanded. -dnl -dnl deflit() is used to make the new definition, so it will expand -dnl literally even if followed by parentheses ie. foo(99) will become -dnl $12(99). (But there's nowhere that would be used is there?) -dnl -dnl When making further definitions from existing defreg() macros, remember -dnl to use defreg() again to protect the $ in the new definitions too. For -dnl example, -dnl -dnl defreg(a0,$4) -dnl defreg(a1,$5) -dnl ... -dnl -dnl defreg(PARAM_DST,a0) -dnl -dnl This is only because a0 is expanding at the time the PARAM_DST -dnl definition is made, leaving a literal $4 that must be re-quoted. On -dnl the other hand in something like the following ra is only expanded when -dnl ret is used and its $`'31 protection will have its desired effect at -dnl that time. -dnl -dnl defreg(ra,$31) -dnl ... -dnl define(ret,`j ra') -dnl -dnl Note that only $n forms are meant to be used here, and something like -dnl 128($30) doesn't get protected and will come out wrong. - -define(defreg, -m4_assert_numargs(2) -`deflit(`$1', -substr(`$2',0,1)``''substr(`$2',1))') - - -dnl Usage: m4_instruction_wrapper(num) -dnl -dnl Put this, unquoted, on a line on its own, at the start of a macro -dnl that's a wrapper around an assembler instruction. It adds code to give -dnl a descriptive error message if the macro is invoked without arguments. -dnl -dnl For example, suppose jmp needs to be wrapped, -dnl -dnl define(jmp, -dnl m4_instruction_wrapper() -dnl m4_assert_numargs(1) -dnl `.byte 0x42 -dnl .long $1 -dnl nop') -dnl -dnl The point of m4_instruction_wrapper is to get a better error message -dnl than m4_assert_numargs would give if jmp is accidentally used as plain -dnl "jmp foo" instead of the intended "jmp( foo)". "jmp()" with no -dnl argument also provokes the error message. -dnl -dnl m4_instruction_wrapper should only be used with wrapped instructions -dnl that take arguments, since obviously something meant to be used as -dnl plain "ret", say, doesn't want to give an error when used that way. - -define(m4_instruction_wrapper, -m4_assert_numargs(0) -``m4_instruction_wrapper_internal'(m4_doublequote($`'0),dnl -m4_doublequote(ifdef(`__file__',__file__,`the m4 sources')),dnl -$`#',m4_doublequote($`'1))`dnl'') - -dnl Called: m4_instruction_wrapper_internal($0,`filename',$#,$1) -define(m4_instruction_wrapper_internal, -`ifelse(eval($3<=1 && m4_length(`$4')==0),1, -`m4_error(`$1 is a macro replacing that instruction and needs arguments, see $2 for details -')')') - - -dnl Usage: UNROLL_LOG2, UNROLL_MASK, UNROLL_BYTES -dnl CHUNK_LOG2, CHUNK_MASK, CHUNK_BYTES -dnl -dnl When code supports a variable amount of loop unrolling, the convention -dnl is to define UNROLL_COUNT to the number of limbs processed per loop. -dnl When testing code this can be varied to see how much the loop overhead -dnl is costing. For example, -dnl -dnl deflit(UNROLL_COUNT, 32) -dnl -dnl If the forloop() generating the unrolled loop has a pattern processing -dnl more than one limb, the convention is to express this with CHUNK_COUNT. -dnl For example, -dnl -dnl deflit(CHUNK_COUNT, 2) -dnl -dnl The LOG2, MASK and BYTES definitions below are derived from these COUNT -dnl definitions. If COUNT is redefined, the LOG2, MASK and BYTES follow -dnl the new definition automatically. -dnl -dnl LOG2 is the log base 2 of COUNT. MASK is COUNT-1, which can be used as -dnl a bit mask. BYTES is BYTES_PER_MP_LIMB*COUNT, the number of bytes -dnl processed in each unrolled loop. -dnl -dnl BYTES_PER_MP_LIMB is defined in a CPU specific m4 include file. It -dnl exists only so the BYTES definitions here can be common to all CPUs. -dnl In the actual code for a given CPU, an explicit 4 or 8 may as well be -dnl used because the code is only for a particular CPU, it doesn't need to -dnl be general. -dnl -dnl Note that none of these macros do anything except give conventional -dnl names to commonly used things. You still have to write your own -dnl expressions for a forloop() and the resulting address displacements. -dnl Something like the following would be typical for 4 bytes per limb. -dnl -dnl forloop(`i',0,UNROLL_COUNT-1,` -dnl deflit(`disp',eval(i*4)) -dnl ... -dnl ') -dnl -dnl Or when using CHUNK_COUNT, -dnl -dnl forloop(`i',0,UNROLL_COUNT/CHUNK_COUNT-1,` -dnl deflit(`disp0',eval(i*CHUNK_COUNT*4)) -dnl deflit(`disp1',eval(disp0+4)) -dnl ... -dnl ') -dnl -dnl Clearly `i' can be run starting from 1, or from high to low or whatever -dnl best suits. - -deflit(UNROLL_LOG2, -m4_assert_defined(`UNROLL_COUNT') -`m4_log2(UNROLL_COUNT)') - -deflit(UNROLL_MASK, -m4_assert_defined(`UNROLL_COUNT') -`eval(UNROLL_COUNT-1)') - -deflit(UNROLL_BYTES, -m4_assert_defined(`UNROLL_COUNT') -m4_assert_defined(`BYTES_PER_MP_LIMB') -`eval(UNROLL_COUNT * BYTES_PER_MP_LIMB)') - -deflit(CHUNK_LOG2, -m4_assert_defined(`CHUNK_COUNT') -`m4_log2(CHUNK_COUNT)') - -deflit(CHUNK_MASK, -m4_assert_defined(`CHUNK_COUNT') -`eval(CHUNK_COUNT-1)') - -deflit(CHUNK_BYTES, -m4_assert_defined(`CHUNK_COUNT') -m4_assert_defined(`BYTES_PER_MP_LIMB') -`eval(CHUNK_COUNT * BYTES_PER_MP_LIMB)') - - -dnl Usage: MPN(name) -dnl -dnl Add MPN_PREFIX to a name. -dnl MPN_PREFIX defaults to "__gmpn_" if not defined. - -ifdef(`MPN_PREFIX',, -`define(`MPN_PREFIX',`__gmpn_')') - -define(MPN, -m4_assert_numargs(1) -`MPN_PREFIX`'$1') - - -dnl Usage: mpn_add_n, etc -dnl -dnl Convenience definitions using MPN(), like the #defines in gmp.h. Each -dnl function that might be implemented in assembler is here. - -define(define_mpn, -m4_assert_numargs(1) -`define(`mpn_$1',`MPN(`$1')')') - -define_mpn(add) -define_mpn(add_1) -define_mpn(add_n) -define_mpn(add_nc) -define_mpn(addmul_1) -define_mpn(addmul_1c) -define_mpn(addsub_n) -define_mpn(addsub_nc) -define_mpn(and_n) -define_mpn(andn_n) -define_mpn(bdivmod) -define_mpn(cmp) -define_mpn(com_n) -define_mpn(copyd) -define_mpn(copyi) -define_mpn(divexact_by3c) -define_mpn(divrem) -define_mpn(divrem_1) -define_mpn(divrem_1c) -define_mpn(divrem_2) -define_mpn(divrem_classic) -define_mpn(divrem_newton) -define_mpn(dump) -define_mpn(gcd) -define_mpn(gcd_1) -define_mpn(gcdext) -define_mpn(get_str) -define_mpn(hamdist) -define_mpn(invert_limb) -define_mpn(ior_n) -define_mpn(iorn_n) -define_mpn(kara_mul_n) -define_mpn(kara_sqr_n) -define_mpn(lshift) -define_mpn(lshiftc) -define_mpn(mod_1) -define_mpn(mod_1c) -define_mpn(mul) -define_mpn(mul_1) -define_mpn(mul_1c) -define_mpn(mul_basecase) -define_mpn(mul_n) -define_mpn(perfect_square_p) -define_mpn(popcount) -define_mpn(preinv_mod_1) -define_mpn(nand_n) -define_mpn(nior_n) -define_mpn(random) -define_mpn(random2) -define_mpn(rshift) -define_mpn(rshiftc) -define_mpn(scan0) -define_mpn(scan1) -define_mpn(set_str) -define_mpn(sqr_basecase) -define_mpn(sub_n) -define_mpn(sqrtrem) -define_mpn(sub) -define_mpn(sub_1) -define_mpn(sub_n) -define_mpn(sub_nc) -define_mpn(submul_1) -define_mpn(submul_1c) -define_mpn(toom3_mul_n) -define_mpn(toom3_sqr_n) -define_mpn(umul_ppmm) -define_mpn(udiv_qrnnd) -define_mpn(xnor_n) -define_mpn(xor_n) - -define(`ASM_START', - `') - -define(`PROLOGUE', - ` - TEXT - ALIGN(4) - GLOBL GSYM_PREFIX`$1' - TYPE(GSYM_PREFIX`$1',`function') -GSYM_PREFIX`$1':') - -define(`EPILOGUE', - ` - SIZE(GSYM_PREFIX`$1',.-GSYM_PREFIX`$1')') - -dnl LSYM_PREFIX might be L$, so defn() must be used to quote it or the L -dnl will expand as the L macro, an infinite recursion. -define(`L',`defn(`LSYM_PREFIX')$1') - -define(`INT32', - ` - ALIGN(4) -$1: - W32 $2 - ') - -define(`INT64', - ` - ALIGN(8) -$1: - W32 $2 - W32 $3 - ') - - -dnl Usage: ALIGN(bytes) -dnl -dnl Emit a ".align" directive. The alignment is specified in bytes, and -dnl will normally need to be a power of 2. The actual ".align" generated -dnl is either bytes or logarithmic according to what ./configure detects. -dnl -dnl ALIGN_FILL_0x90, if defined and equal to "yes", means a ", 0x90" should -dnl be appended (this is for x86). - -define(ALIGN, -m4_assert_numargs(1) -m4_assert_defined(`ALIGN_LOGARITHMIC') -`.align ifelse(ALIGN_LOGARITHMIC,yes,`m4_log2($1)',`eval($1)')dnl -ifelse(ALIGN_FILL_0x90,yes,`, 0x90')') - - -dnl Usage: MULFUNC_PROLOGUE(function function...) -dnl -dnl A dummy macro which is grepped for by ./configure to know what -dnl functions a multi-function file is providing. Use this if there aren't -dnl explicit PROLOGUE()s for each possible function. -dnl -dnl Multiple MULFUNC_PROLOGUEs can be used, or just one with the function -dnl names separated by spaces. - -define(`MULFUNC_PROLOGUE', -m4_assert_numargs(1) -`') - - -divert`'dnl diff --git a/rts/gmp/mpn/clipper/add_n.s b/rts/gmp/mpn/clipper/add_n.s deleted file mode 100644 index 538a1ca..0000000 --- a/rts/gmp/mpn/clipper/add_n.s +++ /dev/null @@ -1,48 +0,0 @@ -; Clipper __gmpn_add_n -- Add two limb vectors of the same length > 0 and store -; sum in a third limb vector. - -; Copyright (C) 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. - -.text - .align 16 -.globl ___gmpn_add_n -___gmpn_add_n: - subq $8,sp - storw r6,(sp) - loadw 12(sp),r2 - loadw 16(sp),r3 - loadq $0,r6 ; clear carry-save register - -.Loop: loadw (r1),r4 - loadw (r2),r5 - addwc r6,r6 ; restore carry from r6 - addwc r5,r4 - storw r4,(r0) - subwc r6,r6 ; save carry in r6 - addq $4,r0 - addq $4,r1 - addq $4,r2 - subq $1,r3 - brne .Loop - - negw r6,r0 - loadw (sp),r6 - addq $8,sp - ret sp diff --git a/rts/gmp/mpn/clipper/mul_1.s b/rts/gmp/mpn/clipper/mul_1.s deleted file mode 100644 index c0c7564..0000000 --- a/rts/gmp/mpn/clipper/mul_1.s +++ /dev/null @@ -1,47 +0,0 @@ -; Clipper __gmpn_mul_1 -- Multiply a limb vector with a limb and store -; the result in a second limb vector. - -; Copyright (C) 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. - -.text - .align 16 -.globl ___gmpn_mul_1 -___gmpn_mul_1: - subq $8,sp - storw r6,(sp) - loadw 12(sp),r2 - loadw 16(sp),r3 - loadq $0,r6 ; clear carry limb - -.Loop: loadw (r1),r4 - mulwux r3,r4 - addw r6,r4 ; add old carry limb into low product limb - loadq $0,r6 - addwc r5,r6 ; propagate cy into high product limb - storw r4,(r0) - addq $4,r0 - addq $4,r1 - subq $1,r2 - brne .Loop - - movw r6,r0 - loadw 0(sp),r6 - addq $8,sp - ret sp diff --git a/rts/gmp/mpn/clipper/sub_n.s b/rts/gmp/mpn/clipper/sub_n.s deleted file mode 100644 index 44d8797..0000000 --- a/rts/gmp/mpn/clipper/sub_n.s +++ /dev/null @@ -1,48 +0,0 @@ -; Clipper __gmpn_sub_n -- Subtract two limb vectors of the same length > 0 and -; store difference in a third limb vector. - -; Copyright (C) 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. - -.text - .align 16 -.globl ___gmpn_sub_n -___gmpn_sub_n: - subq $8,sp - storw r6,(sp) - loadw 12(sp),r2 - loadw 16(sp),r3 - loadq $0,r6 ; clear carry-save register - -.Loop: loadw (r1),r4 - loadw (r2),r5 - addwc r6,r6 ; restore carry from r6 - subwc r5,r4 - storw r4,(r0) - subwc r6,r6 ; save carry in r6 - addq $4,r0 - addq $4,r1 - addq $4,r2 - subq $1,r3 - brne .Loop - - negw r6,r0 - loadw (sp),r6 - addq $8,sp - ret sp diff --git a/rts/gmp/mpn/cray/README b/rts/gmp/mpn/cray/README deleted file mode 100644 index 8195c67..0000000 --- a/rts/gmp/mpn/cray/README +++ /dev/null @@ -1,14 +0,0 @@ -The (poorly optimized) code in this directory was originally written for a -j90 system, but finished on a c90. It should work on all Cray vector -computers. For the T3E and T3D systems, the `alpha' subdirectory at the -same level as the directory containing this file, is much better. - -* `+' seems to be faster than `|' when combining carries. - -* It is possible that the best multiply performance would be achived by - storing only 24 bits per element, and using lazy carry propagation. Before - calling i24mult, full carry propagation would be needed. - -* Supply tasking versions of the C loops. - - diff --git a/rts/gmp/mpn/cray/add_n.c b/rts/gmp/mpn/cray/add_n.c deleted file mode 100644 index 1fdb394..0000000 --- a/rts/gmp/mpn/cray/add_n.c +++ /dev/null @@ -1,96 +0,0 @@ -/* mpn_add_n -- Add two limb vectors of equal, non-zero length. - For Cray vector processors. - - 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" - -mp_limb_t -mpn_add_n (c, a, b, n) - mp_ptr c; - mp_srcptr a, b; - mp_size_t n; -{ - mp_size_t i; - mp_size_t nm1 = n - 1; - int more_carries = 0; - int carry_out; - - /* For small operands the non-vector code is faster. */ - if (n < 16) - goto sequential; - - if (a == c || b == c) - { - TMP_DECL (marker); - TMP_MARK (marker); - if (c == a) - { - /* allocate temp space for a */ - mp_ptr ax = (mp_ptr) TMP_ALLOC (n * BYTES_PER_MP_LIMB); - MPN_COPY (ax, a, n); - a = (mp_srcptr) ax; - } - if (c == b) - { - /* allocate temp space for b */ - mp_ptr bx = (mp_ptr) TMP_ALLOC (n * BYTES_PER_MP_LIMB); - MPN_COPY (bx, b, n); - b = (mp_srcptr) bx; - } - carry_out = mpn_add_n (c, a, b, n); - TMP_FREE (marker); - return carry_out; - } - - carry_out = a[nm1] + b[nm1] < a[nm1]; - -#pragma _CRI ivdep /* Cray PVP systems */ - for (i = nm1; i > 0; i--) - { - int cy_in; - cy_in = a[i - 1] + b[i - 1] < a[i - 1]; - c[i] = a[i] + b[i] + cy_in; - more_carries += c[i] < cy_in; - } - c[0] = a[0] + b[0]; - - if (more_carries) - { - /* This won't vectorize, but we should come here rarely. */ - int cy; - sequential: - cy = 0; - for (i = 0; i < n; i++) - { - mp_limb_t ai, ci, t; - ai = a[i]; - t = b[i] + cy; - cy = t < cy; - ci = ai + t; - cy += ci < ai; - c[i] = ci; - } - carry_out = cy; - } - - return carry_out; -} diff --git a/rts/gmp/mpn/cray/addmul_1.c b/rts/gmp/mpn/cray/addmul_1.c deleted file mode 100644 index 031b4e8..0000000 --- a/rts/gmp/mpn/cray/addmul_1.c +++ /dev/null @@ -1,46 +0,0 @@ -/* mpn_addmul_1 for Cray PVP. - -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" - -mp_limb_t -mpn_addmul_1 (mp_ptr rp, mp_srcptr up, mp_size_t n, mp_limb_t limb) -{ - mp_ptr p0, p1, tp; - mp_limb_t cy_limb; - TMP_DECL (marker); - TMP_MARK (marker); - - p1 = TMP_ALLOC (n * BYTES_PER_MP_LIMB); - p0 = TMP_ALLOC (n * BYTES_PER_MP_LIMB); - tp = TMP_ALLOC (n * BYTES_PER_MP_LIMB); - - GMPN_MULWW (p1, p0, up, &n, &limb); - cy_limb = mpn_add_n (tp, rp, p0, n); - rp[0] = tp[0]; - cy_limb += mpn_add_n (rp + 1, tp + 1, p1, n - 1); - cy_limb += p1[n - 1]; - - TMP_FREE (marker); - return cy_limb; -} diff --git a/rts/gmp/mpn/cray/gmp-mparam.h b/rts/gmp/mpn/cray/gmp-mparam.h deleted file mode 100644 index 14f7b8e..0000000 --- a/rts/gmp/mpn/cray/gmp-mparam.h +++ /dev/null @@ -1,27 +0,0 @@ -/* gmp-mparam.h -- Compiler/machine parameter header file. - -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. */ - -#define BITS_PER_MP_LIMB 64 -#define BYTES_PER_MP_LIMB 8 -#define BITS_PER_LONGINT 64 -#define BITS_PER_INT 64 -#define BITS_PER_SHORTINT 32 -#define BITS_PER_CHAR 8 diff --git a/rts/gmp/mpn/cray/mul_1.c b/rts/gmp/mpn/cray/mul_1.c deleted file mode 100644 index 0c8750b..0000000 --- a/rts/gmp/mpn/cray/mul_1.c +++ /dev/null @@ -1,44 +0,0 @@ -/* mpn_mul_1 for Cray PVP. - -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" - -mp_limb_t -mpn_mul_1 (mp_ptr rp, mp_srcptr up, mp_size_t n, mp_limb_t limb) -{ - mp_ptr p0, p1; - mp_limb_t cy_limb; - TMP_DECL (marker); - TMP_MARK (marker); - - p1 = TMP_ALLOC (n * BYTES_PER_MP_LIMB); - p0 = TMP_ALLOC (n * BYTES_PER_MP_LIMB); - - GMPN_MULWW (p1, p0, up, &n, &limb); - rp[0] = p0[0]; - cy_limb = mpn_add_n (rp + 1, p0 + 1, p1, n - 1); - cy_limb += p1[n - 1]; - - TMP_FREE (marker); - return cy_limb; -} diff --git a/rts/gmp/mpn/cray/mulww.f b/rts/gmp/mpn/cray/mulww.f deleted file mode 100644 index 99507c1..0000000 --- a/rts/gmp/mpn/cray/mulww.f +++ /dev/null @@ -1,54 +0,0 @@ -c Helper for mpn_mul_1, mpn_addmul_1, and mpn_submul_1 for Cray PVP. - -c Copyright (C) 1996, 2000 Free Software Foundation, Inc. - -c This file is part of the GNU MP Library. - -c The GNU MP Library is free software; you can redistribute it and/or -c modify it under the terms of the GNU Lesser General Public License as -c published by the Free Software Foundation; either version 2.1 of the -c License, or (at your option) any later version. - -c The GNU MP Library is distributed in the hope that it will be useful, -c but WITHOUT ANY WARRANTY; without even the implied warranty of -c MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -c Lesser General Public License for more details. - -c You should have received a copy of the GNU Lesser General Public -c License along with the GNU MP Library; see the file COPYING.LIB. If -c not, write to the Free Software Foundation, Inc., 59 Temple Place - -c Suite 330, Boston, MA 02111-1307, USA. - -c p1[] = hi(a[]*s); the upper limbs of each product -c p0[] = low(a[]*s); the corresponding lower limbs -c n is number of limbs in the vectors - - subroutine gmpn_mulww(p1,p0,a,n,s) - integer*8 p1(0:*),p0(0:*),a(0:*),s - integer n - - integer*8 a0,a1,a2,s0,s1,s2,c - integer*8 ai,t0,t1,t2,t3,t4 - - s0 = shiftl(and(s,4194303),24) - s1 = shiftl(and(shiftr(s,22),4194303),24) - s2 = shiftl(and(shiftr(s,44),4194303),24) - - do i = 0,n-1 - ai = a(i) - a0 = shiftl(and(ai,4194303),24) - a1 = shiftl(and(shiftr(ai,22),4194303),24) - a2 = shiftl(and(shiftr(ai,44),4194303),24) - - t0 = i24mult(a0,s0) - t1 = i24mult(a0,s1)+i24mult(a1,s0) - t2 = i24mult(a0,s2)+i24mult(a1,s1)+i24mult(a2,s0) - t3 = i24mult(a1,s2)+i24mult(a2,s1) - t4 = i24mult(a2,s2) - - p0(i)=shiftl(t2,44)+shiftl(t1,22)+t0 - c=shiftr(shiftr(t0,22)+and(t1,4398046511103)+ - $ shiftl(and(t2,1048575),22),42) - p1(i)=shiftl(t4,24)+shiftl(t3,2)+shiftr(t2,20)+shiftr(t1,42)+c - end do - end diff --git a/rts/gmp/mpn/cray/mulww.s b/rts/gmp/mpn/cray/mulww.s deleted file mode 100644 index 890cdcf..0000000 --- a/rts/gmp/mpn/cray/mulww.s +++ /dev/null @@ -1,245 +0,0 @@ -* Helper for mpn_mul_1, mpn_addmul_1, and mpn_submul_1 for Cray PVP. - -* Copyright (C) 1996, 2000 Free Software Foundation, Inc. -* This file is generated from mulww.f in this same directory. - -* 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. - - IDENT GMPN_MULWW -********************************************** -* Assemble with Cal Version 2.0 * -* * -* Generated by CFT77 6.0.4.19 * -* on 06/27/00 at 04:34:13 * -* * -********************************************** -* ALLOW UNDERSCORES IN IDENTIFIERS - EDIT OFF - FORMAT NEW -@DATA SECTION DATA,CM -@DATA = W.* - CON O'0000000000040000000000 - CON O'0435152404713723252514 ;GMPN_MUL 1 - CON O'0535270000000000000000 ;WW 1 - CON O'0000000000000001200012 ;trbk tbl 1 - VWD 32/0,32/P.GMPN_MULWW ;trbk tbl 1 - CON O'0014003000000000001416 ;trbk tbl 1 - CON O'0000000000000000000011 ;trbk tbl 1 - CON O'0000000000000000000215 ;trbk tbl 1 - BSSZ 1 ;trbk tbl 1 -@CODE SECTION CODE -@CODE = P.* -L3 = P.* ; 1 - A0 A6 ;arg base 1 - A5 6 ;num Darg 1 - B03,A5 0,A0 ;load DAs 1 - A0 A1+A2 ; 1 - A5 1 ;num Ts 1 - 0,A0 T00,A5 ; 1 - B02 A2 ;new base 1 - B66 A3 ;stk top 1 - B01 A6 ;arg base 1 - A7 P.L4 ;ofrn rtn 1 - B00 A7 ;return 1 - A6 @DATA ; 1 - J $STKOFEN ;$STKOFEN 1 -GMPN_MULWW = P.* ; 1 - A0 @DATA+3 ;(trbk) 1 - B77 A0 ;(trbk) 1 - A1 13 ;num Bs 1 - A0 B66 ;stk top 1 - A2 B66 ;stk tmp 1 - A4 B67 ;stk limt 1 - 0,A0 B77,A1 ; 1 - A7 782 ;stk size 1 - A3 A2+A7 ; 1 - A0 A4-A3 ; 1 - JAM L3 ;overflow 1 - A0 A6 ;arg base 1 - A5 6 ;num Darg 1 - B03,A5 0,A0 ;load DAs 1 - A0 A1+A2 ; 1 - A5 1 ;num Ts 1 - 0,A0 T00,A5 ; 1 - B02 A2 ;new base 1 - B66 A3 ;new top 1 - B01 A6 ;arg base 1 -L4 = P.* ;ofrn rtn 1 - A7 B07 ;regs 14 - S7 0,A7 ; 14 - A6 B10 ;regs 9 - S6 0,A6 ; 9 - S5 1 ; 14 - S4 <22 ; 9 - S7 S7-S5 ; 14 - S5 #S7 ; 14 - T00 S6 ;regs 10 - S6 S6>22 ; 10 - S7 T00 ;regs 11 - S7 S7>44 ; 11 - S3 T00 ;regs 9 - S3 S3&S4 ; 9 - S6 S6&S4 ; 10 - S7 S7&S4 ; 11 - S3 S3<24 ; 9 - S6 S6<24 ; 10 - S7 S7<24 ; 11 - S0 S5 ;regs 14 - S4 S5 ;regs 14 - S1 S6 ;regs 14 - S2 S3 ;regs 14 - S3 S7 ;regs 14 - JSP L5 ; 14 -L6 = P.* ; 14 - S7 -S4 ; 14 - A2 S7 ;regs 14 - VL A2 ;regs 14 - A3 B06 ;s_bt_sp 14 - A5 B05 ;s_bt_sp 14 - A4 B04 ;s_bt_sp 14 - A1 VL ; 14 - A2 S4 ;regs 14 -L7 = P.* ; 14 - A0 A3 ;regs 15 - VL A1 ;regs 15 - V7 ,A0,1 ; 15 - B11 A5 ;s_bt_sp 15 - A7 22 ; 17 - B12 A4 ;s_bt_sp 17 - V6 V7>A7 ; 17 - B13 A3 ;s_bt_sp 17 - S7 <22 ; 17 - A3 B02 ;s_bt_sp 17 - V5 S7&V6 ; 17 - A6 24 ; 17 - V4 V5A5 ; 18 - V2 S1*FV1 ; 21 - V3 S7&V5 ; 18 - A0 14 ; 34 - B77 A0 ;regs 34 - A4 B77 ;regs 34 - A0 A4+A3 ; 34 - ,A0,1 V2 ;v_ld_str 34 - V0 V3A7 ; 28 - V2 S2*FV0 ; 22 - V3 V6+V2 ; 22 - S7 <20 ; 28 - V1 S7&V3 ; 28 - A4 270 ; 34 - A0 A4+A3 ; 34 - ,A0,1 V0 ;v_ld_str 34 - A4 14 ; 34 - A0 A4+A3 ; 34 - V7 ,A0,1 ;v_ld_str 34 - V6 V1A5 ; 32 - V0 S1*FV4 ; 23 - A5 654 ; 34 - A0 A5+A3 ; 34 - ,A0,1 V1 ;v_ld_str 34 - V6 V7+V0 ; 23 - A5 2 ; 32 - V2 V6A6 ; 28 - A5 654 ; 34 - CPW ;cmr_vrsp 34 - A0 A5+A3 ; 34 - V1 ,A0,1 ;v_ld_str 34 - A5 398 ; 34 - A0 A5+A3 ; 34 - V3 ,A0,1 ;v_ld_str 34 - V6 V4+V1 ; 32 - V2 V3>A6 ; 32 - V5 V6+V2 ; 32 - A6 B12 ;s_bt_sp 32 - V4 V3 0; i--) - { - int cy_in; mp_limb_t t; - cy_in = a[i - 1] < b[i - 1]; - t = a[i] - b[i]; - more_carries += t < cy_in; - c[i] = t - cy_in; - } - c[0] = a[0] - b[0]; - - if (more_carries) - { - /* This won't vectorize, but we should come here rarely. */ - int cy; - sequential: - cy = 0; - for (i = 0; i < n; i++) - { - mp_limb_t ai, ci, t; - ai = a[i]; - t = b[i] + cy; - cy = t < cy; - ci = ai - t; - cy += ci > ai; - c[i] = ci; - } - carry_out = cy; - } - - return carry_out; -} diff --git a/rts/gmp/mpn/cray/submul_1.c b/rts/gmp/mpn/cray/submul_1.c deleted file mode 100644 index 4d2fb13..0000000 --- a/rts/gmp/mpn/cray/submul_1.c +++ /dev/null @@ -1,46 +0,0 @@ -/* mpn_submul_1 for Cray PVP. - -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" - -mp_limb_t -mpn_submul_1 (mp_ptr rp, mp_srcptr up, mp_size_t n, mp_limb_t limb) -{ - mp_ptr p0, p1, tp; - mp_limb_t cy_limb; - TMP_DECL (marker); - TMP_MARK (marker); - - p1 = TMP_ALLOC (n * BYTES_PER_MP_LIMB); - p0 = TMP_ALLOC (n * BYTES_PER_MP_LIMB); - tp = TMP_ALLOC (n * BYTES_PER_MP_LIMB); - - GMPN_MULWW (p1, p0, up, &n, &limb); - cy_limb = mpn_sub_n (tp, rp, p0, n); - rp[0] = tp[0]; - cy_limb += mpn_sub_n (rp + 1, tp + 1, p1, n - 1); - cy_limb += p1[n - 1]; - - TMP_FREE (marker); - return cy_limb; -} diff --git a/rts/gmp/mpn/generic/add_n.c b/rts/gmp/mpn/generic/add_n.c deleted file mode 100644 index 5fcb7e4..0000000 --- a/rts/gmp/mpn/generic/add_n.c +++ /dev/null @@ -1,62 +0,0 @@ -/* mpn_add_n -- Add two limb vectors of equal, non-zero length. - -Copyright (C) 1992, 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" - -mp_limb_t -#if __STDC__ -mpn_add_n (mp_ptr res_ptr, mp_srcptr s1_ptr, mp_srcptr s2_ptr, mp_size_t size) -#else -mpn_add_n (res_ptr, s1_ptr, s2_ptr, size) - register mp_ptr res_ptr; - register mp_srcptr s1_ptr; - register mp_srcptr s2_ptr; - mp_size_t size; -#endif -{ - register mp_limb_t x, y, cy; - register mp_size_t j; - - /* The loop counter and index J goes from -SIZE to -1. This way - the loop becomes faster. */ - j = -size; - - /* Offset the base pointers to compensate for the negative indices. */ - s1_ptr -= j; - s2_ptr -= j; - res_ptr -= j; - - cy = 0; - do - { - y = s2_ptr[j]; - x = s1_ptr[j]; - y += cy; /* add previous carry to one addend */ - cy = (y < cy); /* get out carry from that addition */ - y = x + y; /* add other addend */ - cy = (y < x) + cy; /* get out carry from that add, combine */ - res_ptr[j] = y; - } - while (++j != 0); - - return cy; -} diff --git a/rts/gmp/mpn/generic/addmul_1.c b/rts/gmp/mpn/generic/addmul_1.c deleted file mode 100644 index 746ae31..0000000 --- a/rts/gmp/mpn/generic/addmul_1.c +++ /dev/null @@ -1,65 +0,0 @@ -/* mpn_addmul_1 -- multiply the S1_SIZE long limb vector pointed to by S1_PTR - by S2_LIMB, add the S1_SIZE least significant limbs of the product to the - limb vector pointed to by RES_PTR. Return the most significant limb of - the product, adjusted for carry-out from the addition. - -Copyright (C) 1992, 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" -#include "longlong.h" - -mp_limb_t -mpn_addmul_1 (res_ptr, s1_ptr, s1_size, s2_limb) - register mp_ptr res_ptr; - register mp_srcptr s1_ptr; - mp_size_t s1_size; - register mp_limb_t s2_limb; -{ - register mp_limb_t cy_limb; - register mp_size_t j; - register mp_limb_t prod_high, prod_low; - register mp_limb_t x; - - /* The loop counter and index J goes from -SIZE to -1. This way - the loop becomes faster. */ - j = -s1_size; - - /* Offset the base pointers to compensate for the negative indices. */ - res_ptr -= j; - s1_ptr -= j; - - cy_limb = 0; - do - { - umul_ppmm (prod_high, prod_low, s1_ptr[j], s2_limb); - - prod_low += cy_limb; - cy_limb = (prod_low < cy_limb) + prod_high; - - x = res_ptr[j]; - prod_low = x + prod_low; - cy_limb += (prod_low < x); - res_ptr[j] = prod_low; - } - while (++j != 0); - - return cy_limb; -} diff --git a/rts/gmp/mpn/generic/addsub_n.c b/rts/gmp/mpn/generic/addsub_n.c deleted file mode 100644 index c9bab3e..0000000 --- a/rts/gmp/mpn/generic/addsub_n.c +++ /dev/null @@ -1,167 +0,0 @@ -/* mpn_addsub_n -- Add and Subtract two limb vectors of equal, non-zero length. - -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" - -#ifndef L1_CACHE_SIZE -#define L1_CACHE_SIZE 8192 /* only 68040 has less than this */ -#endif - -#define PART_SIZE (L1_CACHE_SIZE / BYTES_PER_MP_LIMB / 6) - - -/* mpn_addsub_n. - r1[] = s1[] + s2[] - r2[] = s1[] - s2[] - All operands have n limbs. - In-place operations allowed. */ -mp_limb_t -#if __STDC__ -mpn_addsub_n (mp_ptr r1p, mp_ptr r2p, mp_srcptr s1p, mp_srcptr s2p, mp_size_t n) -#else -mpn_addsub_n (r1p, r2p, s1p, s2p, n) - mp_ptr r1p, r2p; - mp_srcptr s1p, s2p; - mp_size_t n; -#endif -{ - mp_limb_t acyn, acyo; /* carry for add */ - mp_limb_t scyn, scyo; /* carry for subtract */ - mp_size_t off; /* offset in operands */ - mp_size_t this_n; /* size of current chunk */ - - /* We alternatingly add and subtract in chunks that fit into the (L1) - cache. Since the chunks are several hundred limbs, the function call - overhead is insignificant, but we get much better locality. */ - - /* We have three variant of the inner loop, the proper loop is chosen - depending on whether r1 or r2 are the same operand as s1 or s2. */ - - if (r1p != s1p && r1p != s2p) - { - /* r1 is not identical to either input operand. We can therefore write - to r1 directly, without using temporary storage. */ - acyo = 0; - scyo = 0; - for (off = 0; off < n; off += PART_SIZE) - { - this_n = MIN (n - off, PART_SIZE); -#if HAVE_NATIVE_mpn_add_nc || !HAVE_NATIVE_mpn_add_n - acyo = mpn_add_nc (r1p + off, s1p + off, s2p + off, this_n, acyo); -#else - acyn = mpn_add_n (r1p + off, s1p + off, s2p + off, this_n); - acyo = acyn + mpn_add_1 (r1p + off, r1p + off, this_n, acyo); -#endif -#if HAVE_NATIVE_mpn_sub_nc || !HAVE_NATIVE_mpn_sub_n - scyo = mpn_sub_nc (r2p + off, s1p + off, s2p + off, this_n, scyo); -#else - scyn = mpn_sub_n (r2p + off, s1p + off, s2p + off, this_n); - scyo = scyn + mpn_sub_1 (r2p + off, r2p + off, this_n, scyo); -#endif - } - } - else if (r2p != s1p && r2p != s2p) - { - /* r2 is not identical to either input operand. We can therefore write - to r2 directly, without using temporary storage. */ - acyo = 0; - scyo = 0; - for (off = 0; off < n; off += PART_SIZE) - { - this_n = MIN (n - off, PART_SIZE); -#if HAVE_NATIVE_mpn_sub_nc || !HAVE_NATIVE_mpn_sub_n - scyo = mpn_sub_nc (r2p + off, s1p + off, s2p + off, this_n, scyo); -#else - scyn = mpn_sub_n (r2p + off, s1p + off, s2p + off, this_n); - scyo = scyn + mpn_sub_1 (r2p + off, r2p + off, this_n, scyo); -#endif -#if HAVE_NATIVE_mpn_add_nc || !HAVE_NATIVE_mpn_add_n - acyo = mpn_add_nc (r1p + off, s1p + off, s2p + off, this_n, acyo); -#else - acyn = mpn_add_n (r1p + off, s1p + off, s2p + off, this_n); - acyo = acyn + mpn_add_1 (r1p + off, r1p + off, this_n, acyo); -#endif - } - } - else - { - /* r1 and r2 are identical to s1 and s2 (r1==s1 and r2=s2 or vice versa) - Need temporary storage. */ - mp_limb_t tp[PART_SIZE]; - acyo = 0; - scyo = 0; - for (off = 0; off < n; off += PART_SIZE) - { - this_n = MIN (n - off, PART_SIZE); -#if HAVE_NATIVE_mpn_add_nc || !HAVE_NATIVE_mpn_add_n - acyo = mpn_add_nc (tp, s1p + off, s2p + off, this_n, acyo); -#else - acyn = mpn_add_n (tp, s1p + off, s2p + off, this_n); - acyo = acyn + mpn_add_1 (tp, tp, this_n, acyo); -#endif -#if HAVE_NATIVE_mpn_sub_nc || !HAVE_NATIVE_mpn_sub_n - scyo = mpn_sub_nc (r2p + off, s1p + off, s2p + off, this_n, scyo); -#else - scyn = mpn_sub_n (r2p + off, s1p + off, s2p + off, this_n); - scyo = scyn + mpn_sub_1 (r2p + off, r2p + off, this_n, scyo); -#endif - MPN_COPY (r1p + off, tp, this_n); - } - } - - return 2 * acyo + scyo; -} - -#ifdef MAIN -#include -#include -#include "timing.h" - -long cputime (); - -int -main (int argc, char **argv) -{ - mp_ptr r1p, r2p, s1p, s2p; - double t; - mp_size_t n; - - n = strtol (argv[1], 0, 0); - - r1p = malloc (n * BYTES_PER_MP_LIMB); - r2p = malloc (n * BYTES_PER_MP_LIMB); - s1p = malloc (n * BYTES_PER_MP_LIMB); - s2p = malloc (n * BYTES_PER_MP_LIMB); - TIME (t,(mpn_add_n(r1p,s1p,s2p,n),mpn_sub_n(r1p,s1p,s2p,n))); - printf (" separate add and sub: %.3f\n", t); - TIME (t,mpn_addsub_n(r1p,r2p,s1p,s2p,n)); - printf ("combined addsub separate variables: %.3f\n", t); - TIME (t,mpn_addsub_n(r1p,r2p,r1p,s2p,n)); - printf (" combined addsub r1 overlap: %.3f\n", t); - TIME (t,mpn_addsub_n(r1p,r2p,r1p,s2p,n)); - printf (" combined addsub r2 overlap: %.3f\n", t); - TIME (t,mpn_addsub_n(r1p,r2p,r1p,r2p,n)); - printf (" combined addsub in-place: %.3f\n", t); - - return 0; -} -#endif diff --git a/rts/gmp/mpn/generic/bdivmod.c b/rts/gmp/mpn/generic/bdivmod.c deleted file mode 100644 index c4bcb41..0000000 --- a/rts/gmp/mpn/generic/bdivmod.c +++ /dev/null @@ -1,120 +0,0 @@ -/* mpn/bdivmod.c: mpn_bdivmod for computing U/V mod 2^d. - -Copyright (C) 1991, 1993, 1994, 1995, 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. */ - -/* q_high = mpn_bdivmod (qp, up, usize, vp, vsize, d). - - Puts the low d/BITS_PER_MP_LIMB limbs of Q = U / V mod 2^d at qp, and - returns the high d%BITS_PER_MP_LIMB bits of Q as the result. - - Also, U - Q * V mod 2^(usize*BITS_PER_MP_LIMB) is placed at up. Since the - low d/BITS_PER_MP_LIMB limbs of this difference are zero, the code allows - the limb vectors at qp to overwrite the low limbs at up, provided qp <= up. - - Preconditions: - 1. V is odd. - 2. usize * BITS_PER_MP_LIMB >= d. - 3. If Q and U overlap, qp <= up. - - 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. - - K. Weber, The accelerated integer GCD algorithm, ACM Transactions on - Mathematical Software, v. 21 (March), 1995, pp. 111-122. */ - -#include "gmp.h" -#include "gmp-impl.h" -#include "longlong.h" - -mp_limb_t -#if __STDC__ -mpn_bdivmod (mp_ptr qp, mp_ptr up, mp_size_t usize, - mp_srcptr vp, mp_size_t vsize, unsigned long int d) -#else -mpn_bdivmod (qp, up, usize, vp, vsize, d) - mp_ptr qp; - mp_ptr up; - mp_size_t usize; - mp_srcptr vp; - mp_size_t vsize; - unsigned long int d; -#endif -{ - mp_limb_t v_inv; - - /* 1/V mod 2^BITS_PER_MP_LIMB. */ - modlimb_invert (v_inv, vp[0]); - - /* Fast code for two cases previously used by the accel part of mpn_gcd. - (Could probably remove this now it's inlined there.) */ - if (usize == 2 && vsize == 2 && - (d == BITS_PER_MP_LIMB || d == 2*BITS_PER_MP_LIMB)) - { - mp_limb_t hi, lo; - mp_limb_t q = up[0] * v_inv; - umul_ppmm (hi, lo, q, vp[0]); - up[0] = 0, up[1] -= hi + q*vp[1], qp[0] = q; - if (d == 2*BITS_PER_MP_LIMB) - q = up[1] * v_inv, up[1] = 0, qp[1] = q; - return 0; - } - - /* Main loop. */ - while (d >= BITS_PER_MP_LIMB) - { - mp_limb_t q = up[0] * v_inv; - mp_limb_t b = mpn_submul_1 (up, vp, MIN (usize, vsize), q); - if (usize > vsize) - mpn_sub_1 (up + vsize, up + vsize, usize - vsize, b); - d -= BITS_PER_MP_LIMB; - up += 1, usize -= 1; - *qp++ = q; - } - - if (d) - { - mp_limb_t b; - mp_limb_t q = (up[0] * v_inv) & (((mp_limb_t)1< vsize) - mpn_sub_1 (up + vsize, up + vsize, usize - vsize, b); - return q; - } - - return 0; -} diff --git a/rts/gmp/mpn/generic/bz_divrem_n.c b/rts/gmp/mpn/generic/bz_divrem_n.c deleted file mode 100644 index d234b22..0000000 --- a/rts/gmp/mpn/generic/bz_divrem_n.c +++ /dev/null @@ -1,153 +0,0 @@ -/* mpn_bz_divrem_n and auxilliary routines. - - THE FUNCTIONS IN THIS FILE ARE INTERNAL FUNCTIONS WITH MUTABLE - INTERFACES. IT IS ONLY SAFE TO REACH THEM THROUGH DOCUMENTED INTERFACES. - IN FACT, IT IS ALMOST GUARANTEED THAT THEY'LL CHANGE OR DISAPPEAR IN A - FUTURE GNU MP RELEASE. - - -Copyright (C) 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" - -/* -[1] Fast Recursive Division, by Christoph Burnikel and Joachim Ziegler, - Technical report MPI-I-98-1-022, october 1998. - http://www.mpi-sb.mpg.de/~ziegler/TechRep.ps.gz -*/ - -static mp_limb_t mpn_bz_div_3_halves_by_2 - _PROTO ((mp_ptr qp, mp_ptr np, mp_srcptr dp, mp_size_t n)); - - -/* mpn_bz_divrem_n(n) calls 2*mul(n/2)+2*div(n/2), thus to be faster than - div(n) = 4*div(n/2), we need mul(n/2) to be faster than the classic way, - i.e. n/2 >= KARATSUBA_MUL_THRESHOLD */ -#ifndef BZ_THRESHOLD -#define BZ_THRESHOLD (7 * KARATSUBA_MUL_THRESHOLD) -#endif - -#if 0 -static -unused_mpn_divrem (qp, qxn, np, nn, dp, dn) - mp_ptr qp; - mp_size_t qxn; - mp_ptr np; - mp_size_t nn; - mp_srcptr dp; - mp_size_t dn; -{ - /* This might be useful: */ - if (qxn != 0) - { - mp_limb_t c; - mp_ptr tp = alloca ((nn + qxn) * BYTES_PER_MP_LIMB); - MPN_COPY (tp + qxn - nn, np, nn); - MPN_ZERO (tp, qxn); - c = mpn_divrem (qp, 0L, tp, nn + qxn, dp, dn); - /* Maybe copy proper part of tp to np? Documentation is unclear about - the returned np value when qxn != 0 */ - return c; - } -} -#endif - - -/* mpn_bz_divrem_n - Implements algorithm of page 8 in [1]: divides (np,2n) - by (dp,n) and puts the quotient in (qp,n), the remainder in (np,n). - Returns most significant limb of the quotient, which is 0 or 1. - Requires that the most significant bit of the divisor is set. */ - -mp_limb_t -#if __STDC__ -mpn_bz_divrem_n (mp_ptr qp, mp_ptr np, mp_srcptr dp, mp_size_t n) -#else -mpn_bz_divrem_n (qp, np, dp, n) - mp_ptr qp; - mp_ptr np; - mp_srcptr dp; - mp_size_t n; -#endif -{ - mp_limb_t qhl, cc; - - if (n % 2 != 0) - { - qhl = mpn_bz_divrem_n (qp + 1, np + 2, dp + 1, n - 1); - cc = mpn_submul_1 (np + 1, qp + 1, n - 1, dp[0]); - cc = mpn_sub_1 (np + n, np + n, 1, cc); - if (qhl) cc += mpn_sub_1 (np + n, np + n, 1, dp[0]); - while (cc) - { - qhl -= mpn_sub_1 (qp + 1, qp + 1, n - 1, (mp_limb_t) 1); - cc -= mpn_add_n (np + 1, np + 1, dp, n); - } - qhl += mpn_add_1 (qp + 1, qp + 1, n - 1, - mpn_sb_divrem_mn (qp, np, n + 1, dp, n)); - } - else - { - mp_size_t n2 = n/2; - qhl = mpn_bz_div_3_halves_by_2 (qp + n2, np + n2, dp, n2); - qhl += mpn_add_1 (qp + n2, qp + n2, n2, - mpn_bz_div_3_halves_by_2 (qp, np, dp, n2)); - } - return qhl; -} - - -/* divides (np, 3n) by (dp, 2n) and puts the quotient in (qp, n), - the remainder in (np, 2n) */ - -static mp_limb_t -#if __STDC__ -mpn_bz_div_3_halves_by_2 (mp_ptr qp, mp_ptr np, mp_srcptr dp, mp_size_t n) -#else -mpn_bz_div_3_halves_by_2 (qp, np, dp, n) - mp_ptr qp; - mp_ptr np; - mp_srcptr dp; - mp_size_t n; -#endif -{ - mp_size_t twon = n + n; - mp_limb_t qhl, cc; - mp_ptr tmp; - TMP_DECL (marker); - - TMP_MARK (marker); - if (n < BZ_THRESHOLD) - qhl = mpn_sb_divrem_mn (qp, np + n, twon, dp + n, n); - else - qhl = mpn_bz_divrem_n (qp, np + n, dp + n, n); - tmp = (mp_ptr) TMP_ALLOC (twon * BYTES_PER_MP_LIMB); - mpn_mul_n (tmp, qp, dp, n); - cc = mpn_sub_n (np, np, tmp, twon); - TMP_FREE (marker); - if (qhl) cc += mpn_sub_n (np + n, np + n, dp, n); - while (cc) - { - qhl -= mpn_sub_1 (qp, qp, n, (mp_limb_t) 1); - cc -= mpn_add_n (np, np, dp, twon); - } - return qhl; -} diff --git a/rts/gmp/mpn/generic/cmp.c b/rts/gmp/mpn/generic/cmp.c deleted file mode 100644 index 8e9792f..0000000 --- a/rts/gmp/mpn/generic/cmp.c +++ /dev/null @@ -1,56 +0,0 @@ -/* mpn_cmp -- Compare two low-level natural-number integers. - -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" - -/* Compare OP1_PTR/OP1_SIZE with OP2_PTR/OP2_SIZE. - There are no restrictions on the relative sizes of - the two arguments. - Return 1 if OP1 > OP2, 0 if they are equal, and -1 if OP1 < OP2. */ - -int -#if __STDC__ -mpn_cmp (mp_srcptr op1_ptr, mp_srcptr op2_ptr, mp_size_t size) -#else -mpn_cmp (op1_ptr, op2_ptr, size) - mp_srcptr op1_ptr; - mp_srcptr op2_ptr; - mp_size_t size; -#endif -{ - mp_size_t i; - mp_limb_t op1_word, op2_word; - - for (i = size - 1; i >= 0; i--) - { - op1_word = op1_ptr[i]; - op2_word = op2_ptr[i]; - if (op1_word != op2_word) - goto diff; - } - return 0; - diff: - /* This can *not* be simplified to - op2_word - op2_word - since that expression might give signed overflow. */ - return (op1_word > op2_word) ? 1 : -1; -} diff --git a/rts/gmp/mpn/generic/diveby3.c b/rts/gmp/mpn/generic/diveby3.c deleted file mode 100644 index a2fb552..0000000 --- a/rts/gmp/mpn/generic/diveby3.c +++ /dev/null @@ -1,77 +0,0 @@ -/* mpn_divexact_by3 -- mpn division by 3, expecting no remainder. */ - -/* -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" - - -/* Multiplicative inverse of 3, modulo 2^BITS_PER_MP_LIMB. - 0xAAAAAAAB for 32 bits, 0xAAAAAAAAAAAAAAAB for 64 bits. */ -#define INVERSE_3 ((MP_LIMB_T_MAX / 3) * 2 + 1) - - -/* The "c += ..."s are adding the high limb of 3*l to c. That high limb - will be 0, 1 or 2. Doing two separate "+="s seems to turn out better - code on gcc (as of 2.95.2 at least). - - When a subtraction of a 0,1,2 carry value causes a borrow, that leaves a - limb value of either 0xFF...FF or 0xFF...FE and the multiply by INVERSE_3 - gives 0x55...55 or 0xAA...AA respectively, producing a further borrow of - only 0 or 1 respectively. Hence the carry out of each stage and for the - return value is always only 0, 1 or 2. */ - -mp_limb_t -#if __STDC__ -mpn_divexact_by3c (mp_ptr dst, mp_srcptr src, mp_size_t size, mp_limb_t c) -#else -mpn_divexact_by3c (dst, src, size, c) - mp_ptr dst; - mp_srcptr src; - mp_size_t size; - mp_limb_t c; -#endif -{ - mp_size_t i; - - ASSERT (size >= 1); - - i = 0; - do - { - mp_limb_t l, s; - - s = src[i]; - l = s - c; - c = (l > s); - - l *= INVERSE_3; - dst[i] = l; - - c += (l > MP_LIMB_T_MAX/3); - c += (l > (MP_LIMB_T_MAX/3)*2); - } - while (++i < size); - - return c; -} diff --git a/rts/gmp/mpn/generic/divrem.c b/rts/gmp/mpn/generic/divrem.c deleted file mode 100644 index 30673e7..0000000 --- a/rts/gmp/mpn/generic/divrem.c +++ /dev/null @@ -1,101 +0,0 @@ -/* mpn_divrem -- Divide natural numbers, producing both remainder and - quotient. This is now just a middle layer for calling the new - internal mpn_tdiv_qr. - -Copyright (C) 1993, 1994, 1995, 1996, 1997, 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" - -mp_limb_t -#if __STDC__ -mpn_divrem (mp_ptr qp, mp_size_t qxn, - mp_ptr np, mp_size_t nn, - mp_srcptr dp, mp_size_t dn) -#else -mpn_divrem (qp, qxn, np, nn, dp, dn) - mp_ptr qp; - mp_size_t qxn; - mp_ptr np; - mp_size_t nn; - mp_srcptr dp; - mp_size_t dn; -#endif -{ - if (dn == 1) - { - mp_limb_t ret; - mp_ptr q2p; - mp_size_t qn; - TMP_DECL (marker); - - TMP_MARK (marker); - q2p = (mp_ptr) TMP_ALLOC ((nn + qxn) * BYTES_PER_MP_LIMB); - - np[0] = mpn_divrem_1 (q2p, qxn, np, nn, dp[0]); - qn = nn + qxn - 1; - MPN_COPY (qp, q2p, qn); - ret = q2p[qn]; - - TMP_FREE (marker); - return ret; - } - else if (dn == 2) - { - return mpn_divrem_2 (qp, qxn, np, nn, dp); - } - else - { - mp_ptr rp, q2p; - mp_limb_t qhl; - mp_size_t qn; - TMP_DECL (marker); - - TMP_MARK (marker); - if (qxn != 0) - { - mp_ptr n2p; - n2p = (mp_ptr) TMP_ALLOC ((nn + qxn) * BYTES_PER_MP_LIMB); - MPN_ZERO (n2p, qxn); - MPN_COPY (n2p + qxn, np, nn); - q2p = (mp_ptr) TMP_ALLOC ((nn - dn + qxn + 1) * BYTES_PER_MP_LIMB); - rp = (mp_ptr) TMP_ALLOC (dn * BYTES_PER_MP_LIMB); - mpn_tdiv_qr (q2p, rp, 0L, n2p, nn + qxn, dp, dn); - MPN_COPY (np, rp, dn); - qn = nn - dn + qxn; - MPN_COPY (qp, q2p, qn); - qhl = q2p[qn]; - } - else - { - q2p = (mp_ptr) TMP_ALLOC ((nn - dn + 1) * BYTES_PER_MP_LIMB); - rp = (mp_ptr) TMP_ALLOC (dn * BYTES_PER_MP_LIMB); - mpn_tdiv_qr (q2p, rp, 0L, np, nn, dp, dn); - MPN_COPY (np, rp, dn); /* overwrite np area with remainder */ - qn = nn - dn; - MPN_COPY (qp, q2p, qn); - qhl = q2p[qn]; - } - TMP_FREE (marker); - return qhl; - } -} diff --git a/rts/gmp/mpn/generic/divrem_1.c b/rts/gmp/mpn/generic/divrem_1.c deleted file mode 100644 index e93f241..0000000 --- a/rts/gmp/mpn/generic/divrem_1.c +++ /dev/null @@ -1,248 +0,0 @@ -/* mpn_divrem_1(quot_ptr, qsize, dividend_ptr, dividend_size, divisor_limb) -- - Divide (DIVIDEND_PTR,,DIVIDEND_SIZE) by DIVISOR_LIMB. - Write DIVIDEND_SIZE limbs of quotient at QUOT_PTR. - Return the single-limb remainder. - There are no constraints on the value of the divisor. - - QUOT_PTR and DIVIDEND_PTR might point to the same limb. - -Copyright (C) 1991, 1993, 1994, 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. */ - -#include "gmp.h" -#include "gmp-impl.h" -#include "longlong.h" - - - -/* __gmpn_divmod_1_internal(quot_ptr,dividend_ptr,dividend_size,divisor_limb) - Divide (DIVIDEND_PTR,,DIVIDEND_SIZE) by DIVISOR_LIMB. - Write DIVIDEND_SIZE limbs of quotient at QUOT_PTR. - Return the single-limb remainder. - There are no constraints on the value of the divisor. - - QUOT_PTR and DIVIDEND_PTR might point to the same limb. */ - -#ifndef UMUL_TIME -#define UMUL_TIME 1 -#endif - -#ifndef UDIV_TIME -#define UDIV_TIME UMUL_TIME -#endif - -static mp_limb_t -#if __STDC__ -__gmpn_divmod_1_internal (mp_ptr quot_ptr, - mp_srcptr dividend_ptr, mp_size_t dividend_size, - mp_limb_t divisor_limb) -#else -__gmpn_divmod_1_internal (quot_ptr, dividend_ptr, dividend_size, divisor_limb) - mp_ptr quot_ptr; - mp_srcptr dividend_ptr; - mp_size_t dividend_size; - mp_limb_t divisor_limb; -#endif -{ - mp_size_t i; - mp_limb_t n1, n0, r; - int dummy; - - /* ??? Should this be handled at all? Rely on callers? */ - if (dividend_size == 0) - return 0; - - /* If multiplication is much faster than division, and the - dividend is large, pre-invert the divisor, and use - only multiplications in the inner loop. */ - - /* This test should be read: - Does it ever help to use udiv_qrnnd_preinv? - && Does what we save compensate for the inversion overhead? */ - if (UDIV_TIME > (2 * UMUL_TIME + 6) - && (UDIV_TIME - (2 * UMUL_TIME + 6)) * dividend_size > UDIV_TIME) - { - int normalization_steps; - - count_leading_zeros (normalization_steps, divisor_limb); - if (normalization_steps != 0) - { - mp_limb_t divisor_limb_inverted; - - divisor_limb <<= normalization_steps; - invert_limb (divisor_limb_inverted, divisor_limb); - - n1 = dividend_ptr[dividend_size - 1]; - r = n1 >> (BITS_PER_MP_LIMB - normalization_steps); - - /* Possible optimization: - if (r == 0 - && divisor_limb > ((n1 << normalization_steps) - | (dividend_ptr[dividend_size - 2] >> ...))) - ...one division less... */ - - for (i = dividend_size - 2; i >= 0; i--) - { - n0 = dividend_ptr[i]; - udiv_qrnnd_preinv (quot_ptr[i + 1], r, r, - ((n1 << normalization_steps) - | (n0 >> (BITS_PER_MP_LIMB - normalization_steps))), - divisor_limb, divisor_limb_inverted); - n1 = n0; - } - udiv_qrnnd_preinv (quot_ptr[0], r, r, - n1 << normalization_steps, - divisor_limb, divisor_limb_inverted); - return r >> normalization_steps; - } - else - { - mp_limb_t divisor_limb_inverted; - - invert_limb (divisor_limb_inverted, divisor_limb); - - i = dividend_size - 1; - r = dividend_ptr[i]; - - if (r >= divisor_limb) - r = 0; - else - { - quot_ptr[i] = 0; - i--; - } - - for (; i >= 0; i--) - { - n0 = dividend_ptr[i]; - udiv_qrnnd_preinv (quot_ptr[i], r, r, - n0, divisor_limb, divisor_limb_inverted); - } - return r; - } - } - else - { - if (UDIV_NEEDS_NORMALIZATION) - { - int normalization_steps; - - count_leading_zeros (normalization_steps, divisor_limb); - if (normalization_steps != 0) - { - divisor_limb <<= normalization_steps; - - n1 = dividend_ptr[dividend_size - 1]; - r = n1 >> (BITS_PER_MP_LIMB - normalization_steps); - - /* Possible optimization: - if (r == 0 - && divisor_limb > ((n1 << normalization_steps) - | (dividend_ptr[dividend_size - 2] >> ...))) - ...one division less... */ - - for (i = dividend_size - 2; i >= 0; i--) - { - n0 = dividend_ptr[i]; - udiv_qrnnd (quot_ptr[i + 1], r, r, - ((n1 << normalization_steps) - | (n0 >> (BITS_PER_MP_LIMB - normalization_steps))), - divisor_limb); - n1 = n0; - } - udiv_qrnnd (quot_ptr[0], r, r, - n1 << normalization_steps, - divisor_limb); - return r >> normalization_steps; - } - } - /* No normalization needed, either because udiv_qrnnd doesn't require - it, or because DIVISOR_LIMB is already normalized. */ - - i = dividend_size - 1; - r = dividend_ptr[i]; - - if (r >= divisor_limb) - r = 0; - else - { - quot_ptr[i] = 0; - i--; - } - - for (; i >= 0; i--) - { - n0 = dividend_ptr[i]; - udiv_qrnnd (quot_ptr[i], r, r, n0, divisor_limb); - } - return r; - } -} - - - -mp_limb_t -#if __STDC__ -mpn_divrem_1 (mp_ptr qp, mp_size_t qxn, - mp_srcptr np, mp_size_t nn, - mp_limb_t d) -#else -mpn_divrem_1 (qp, qxn, np, nn, d) - mp_ptr qp; - mp_size_t qxn; - mp_srcptr np; - mp_size_t nn; - mp_limb_t d; -#endif -{ - mp_limb_t rlimb; - mp_size_t i; - - /* Develop integer part of quotient. */ - rlimb = __gmpn_divmod_1_internal (qp + qxn, np, nn, d); - - /* Develop fraction part of quotient. This is not as fast as it should; - the preinvert stuff from __gmpn_divmod_1_internal ought to be used here - too. */ - if (UDIV_NEEDS_NORMALIZATION) - { - int normalization_steps; - - count_leading_zeros (normalization_steps, d); - if (normalization_steps != 0) - { - d <<= normalization_steps; - rlimb <<= normalization_steps; - - for (i = qxn - 1; i >= 0; i--) - udiv_qrnnd (qp[i], rlimb, rlimb, 0, d); - - return rlimb >> normalization_steps; - } - else - /* fall out */ - ; - } - - for (i = qxn - 1; i >= 0; i--) - udiv_qrnnd (qp[i], rlimb, rlimb, 0, d); - - return rlimb; -} diff --git a/rts/gmp/mpn/generic/divrem_2.c b/rts/gmp/mpn/generic/divrem_2.c deleted file mode 100644 index 0bc31ae..0000000 --- a/rts/gmp/mpn/generic/divrem_2.c +++ /dev/null @@ -1,151 +0,0 @@ -/* mpn_divrem_2 -- Divide natural numbers, producing both remainder and - quotient. The divisor is two limbs. - - THIS FILE CONTAINS INTERNAL FUNCTIONS WITH MUTABLE INTERFACES. IT IS - ONLY SAFE TO REACH THEM THROUGH DOCUMENTED INTERFACES. IN FACT, IT IS - ALMOST GUARANTEED THAT THEY'LL CHANGE OR DISAPPEAR IN A FUTURE GNU MP - RELEASE. - - -Copyright (C) 1993, 1994, 1995, 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 "gmp.h" -#include "gmp-impl.h" -#include "longlong.h" - -/* Divide num (NP/NSIZE) by den (DP/2) and write - the NSIZE-2 least significant quotient limbs at QP - and the 2 long remainder at NP. If QEXTRA_LIMBS is - non-zero, generate that many fraction bits and append them after the - other quotient limbs. - Return the most significant limb of the quotient, this is always 0 or 1. - - Preconditions: - 0. NSIZE >= 2. - 1. The most significant bit of the divisor must be set. - 2. QP must either not overlap with the input operands at all, or - QP + 2 >= NP must hold true. (This means that it's - possible to put the quotient in the high part of NUM, right after the - remainder in NUM. - 3. NSIZE >= 2, even if QEXTRA_LIMBS is non-zero. */ - -mp_limb_t -#if __STDC__ -mpn_divrem_2 (mp_ptr qp, mp_size_t qxn, - mp_ptr np, mp_size_t nsize, - mp_srcptr dp) -#else -mpn_divrem_2 (qp, qxn, np, nsize, dp) - mp_ptr qp; - mp_size_t qxn; - mp_ptr np; - mp_size_t nsize; - mp_srcptr dp; -#endif -{ - mp_limb_t most_significant_q_limb = 0; - mp_size_t i; - mp_limb_t n1, n0, n2; - mp_limb_t d1, d0; - mp_limb_t d1inv; - int have_preinv; - - np += nsize - 2; - d1 = dp[1]; - d0 = dp[0]; - n1 = np[1]; - n0 = np[0]; - - if (n1 >= d1 && (n1 > d1 || n0 >= d0)) - { - sub_ddmmss (n1, n0, n1, n0, d1, d0); - most_significant_q_limb = 1; - } - - /* If multiplication is much faster than division, preinvert the most - significant divisor limb before entering the loop. */ - if (UDIV_TIME > 2 * UMUL_TIME + 6) - { - have_preinv = 0; - if ((UDIV_TIME - (2 * UMUL_TIME + 6)) * (nsize - 2) > UDIV_TIME) - { - invert_limb (d1inv, d1); - have_preinv = 1; - } - } - - for (i = qxn + nsize - 2 - 1; i >= 0; i--) - { - mp_limb_t q; - mp_limb_t r; - - if (i >= qxn) - np--; - else - np[0] = 0; - - if (n1 == d1) - { - /* Q should be either 111..111 or 111..110. Need special treatment - of this rare case as normal division would give overflow. */ - q = ~(mp_limb_t) 0; - - r = n0 + d1; - if (r < d1) /* Carry in the addition? */ - { - add_ssaaaa (n1, n0, r - d0, np[0], 0, d0); - qp[i] = q; - continue; - } - n1 = d0 - (d0 != 0); - n0 = -d0; - } - else - { - if (UDIV_TIME > 2 * UMUL_TIME + 6 && have_preinv) - udiv_qrnnd_preinv (q, r, n1, n0, d1, d1inv); - else - udiv_qrnnd (q, r, n1, n0, d1); - umul_ppmm (n1, n0, d0, q); - } - - n2 = np[0]; - - q_test: - if (n1 > r || (n1 == r && n0 > n2)) - { - /* The estimated Q was too large. */ - q--; - - sub_ddmmss (n1, n0, n1, n0, 0, d0); - r += d1; - if (r >= d1) /* If not carry, test Q again. */ - goto q_test; - } - - qp[i] = q; - sub_ddmmss (n1, n0, r, n2, n1, n0); - } - np[1] = n1; - np[0] = n0; - - return most_significant_q_limb; -} diff --git a/rts/gmp/mpn/generic/dump.c b/rts/gmp/mpn/generic/dump.c deleted file mode 100644 index 66f375c..0000000 --- a/rts/gmp/mpn/generic/dump.c +++ /dev/null @@ -1,76 +0,0 @@ -/* 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) 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 -#include "gmp.h" -#include "gmp-impl.h" - -void -#if __STDC__ -mpn_dump (mp_srcptr ptr, mp_size_t size) -#else -mpn_dump (ptr, size) - mp_srcptr ptr; - mp_size_t size; -#endif -{ - MPN_NORMALIZE (ptr, size); - - if (size == 0) - printf ("0\n"); - else - { - size--; - if (BYTES_PER_MP_LIMB > sizeof (long)) - { - if ((ptr[size] >> BITS_PER_MP_LIMB/2) != 0) - { - printf ("%lX", - (unsigned long) (ptr[size] >> BITS_PER_MP_LIMB/2)); - printf ("%0*lX", (int) (BYTES_PER_MP_LIMB), - (unsigned long) ptr[size]); - } - else - printf ("%lX", (unsigned long) ptr[size]); - } - else - printf ("%lX", ptr[size]); - - while (size) - { - size--; - if (BYTES_PER_MP_LIMB > sizeof (long)) - { - printf ("%0*lX", (int) (BYTES_PER_MP_LIMB), - (unsigned long) (ptr[size] >> BITS_PER_MP_LIMB/2)); - printf ("%0*lX", (int) (BYTES_PER_MP_LIMB), - (unsigned long) ptr[size]); - } - else - printf ("%0*lX", (int) (2 * BYTES_PER_MP_LIMB), ptr[size]); - } - printf ("\n"); - } -} diff --git a/rts/gmp/mpn/generic/gcd.c b/rts/gmp/mpn/generic/gcd.c deleted file mode 100644 index 059e219..0000000 --- a/rts/gmp/mpn/generic/gcd.c +++ /dev/null @@ -1,414 +0,0 @@ -/* mpn/gcd.c: mpn_gcd for gcd of two odd integers. - -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. */ - -/* Integer greatest common divisor of two unsigned integers, using - the accelerated algorithm (see reference below). - - mp_size_t mpn_gcd (up, usize, vp, vsize). - - Preconditions [U = (up, usize) and V = (vp, vsize)]: - - 1. V is odd. - 2. numbits(U) >= numbits(V). - - Both U and V are destroyed by the operation. The result is left at vp, - and its size is returned. - - 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). - - Refer to - K. Weber, The accelerated integer GCD algorithm, ACM Transactions on - Mathematical Software, v. 21 (March), 1995, pp. 111-122. */ - -#include "gmp.h" -#include "gmp-impl.h" -#include "longlong.h" - -/* If MIN (usize, vsize) >= GCD_ACCEL_THRESHOLD, then the accelerated - algorithm is used, otherwise the binary algorithm is used. This may be - adjusted for different architectures. */ -#ifndef GCD_ACCEL_THRESHOLD -#define GCD_ACCEL_THRESHOLD 5 -#endif - -/* When U and V differ in size by more than BMOD_THRESHOLD, the accelerated - algorithm reduces using the bmod operation. Otherwise, the k-ary reduction - is used. 0 <= BMOD_THRESHOLD < BITS_PER_MP_LIMB. */ -enum - { - BMOD_THRESHOLD = BITS_PER_MP_LIMB/2 - }; - - -/* Use binary algorithm to compute V <-- GCD (V, U) for usize, vsize == 2. - Both U and V must be odd. */ -static __gmp_inline mp_size_t -#if __STDC__ -gcd_2 (mp_ptr vp, mp_srcptr up) -#else -gcd_2 (vp, up) - mp_ptr vp; - mp_srcptr up; -#endif -{ - mp_limb_t u0, u1, v0, v1; - mp_size_t vsize; - - u0 = up[0], u1 = up[1], v0 = vp[0], v1 = vp[1]; - - while (u1 != v1 && u0 != v0) - { - unsigned long int r; - if (u1 > v1) - { - u1 -= v1 + (u0 < v0), u0 -= v0; - count_trailing_zeros (r, u0); - u0 = u1 << (BITS_PER_MP_LIMB - r) | u0 >> r; - u1 >>= r; - } - else /* u1 < v1. */ - { - v1 -= u1 + (v0 < u0), v0 -= u0; - count_trailing_zeros (r, v0); - v0 = v1 << (BITS_PER_MP_LIMB - r) | v0 >> r; - v1 >>= r; - } - } - - vp[0] = v0, vp[1] = v1, vsize = 1 + (v1 != 0); - - /* If U == V == GCD, done. Otherwise, compute GCD (V, |U - V|). */ - if (u1 == v1 && u0 == v0) - return vsize; - - v0 = (u0 == v0) ? (u1 > v1) ? u1-v1 : v1-u1 : (u0 > v0) ? u0-v0 : v0-u0; - vp[0] = mpn_gcd_1 (vp, vsize, v0); - - return 1; -} - -/* The function find_a finds 0 < N < 2^BITS_PER_MP_LIMB such that there exists - 0 < |D| < 2^BITS_PER_MP_LIMB, and N == D * C mod 2^(2*BITS_PER_MP_LIMB). - In the reference article, D was computed along with N, but it is better to - compute D separately as D <-- N / C mod 2^(BITS_PER_MP_LIMB + 1), treating - the result as a twos' complement signed integer. - - Initialize N1 to C mod 2^(2*BITS_PER_MP_LIMB). According to the reference - article, N2 should be initialized to 2^(2*BITS_PER_MP_LIMB), but we use - 2^(2*BITS_PER_MP_LIMB) - N1 to start the calculations within double - precision. If N2 > N1 initially, the first iteration of the while loop - will swap them. In all other situations, N1 >= N2 is maintained. */ - -static -#if ! defined (__i386__) -__gmp_inline /* don't inline this for the x86 */ -#endif -mp_limb_t -#if __STDC__ -find_a (mp_srcptr cp) -#else -find_a (cp) - mp_srcptr cp; -#endif -{ - unsigned long int leading_zero_bits = 0; - - mp_limb_t n1_l = cp[0]; /* N1 == n1_h * 2^BITS_PER_MP_LIMB + n1_l. */ - mp_limb_t n1_h = cp[1]; - - mp_limb_t n2_l = -n1_l; /* N2 == n2_h * 2^BITS_PER_MP_LIMB + n2_l. */ - mp_limb_t n2_h = ~n1_h; - - /* Main loop. */ - while (n2_h) /* While N2 >= 2^BITS_PER_MP_LIMB. */ - { - /* N1 <-- N1 % N2. */ - if ((MP_LIMB_T_HIGHBIT >> leading_zero_bits & n2_h) == 0) - { - unsigned long int i; - count_leading_zeros (i, n2_h); - i -= leading_zero_bits, leading_zero_bits += i; - n2_h = n2_h<>(BITS_PER_MP_LIMB - i), n2_l <<= i; - do - { - if (n1_h > n2_h || (n1_h == n2_h && n1_l >= n2_l)) - n1_h -= n2_h + (n1_l < n2_l), n1_l -= n2_l; - n2_l = n2_l>>1 | n2_h<<(BITS_PER_MP_LIMB - 1), n2_h >>= 1; - i -= 1; - } - while (i); - } - if (n1_h > n2_h || (n1_h == n2_h && n1_l >= n2_l)) - n1_h -= n2_h + (n1_l < n2_l), n1_l -= n2_l; - - MP_LIMB_T_SWAP (n1_h, n2_h); - MP_LIMB_T_SWAP (n1_l, n2_l); - } - - return n2_l; -} - -mp_size_t -#if __STDC__ -mpn_gcd (mp_ptr gp, mp_ptr up, mp_size_t usize, mp_ptr vp, mp_size_t vsize) -#else -mpn_gcd (gp, up, usize, vp, vsize) - mp_ptr gp; - mp_ptr up; - mp_size_t usize; - mp_ptr vp; - mp_size_t vsize; -#endif -{ - mp_ptr orig_vp = vp; - mp_size_t orig_vsize = vsize; - int binary_gcd_ctr; /* Number of times binary gcd will execute. */ - TMP_DECL (marker); - - TMP_MARK (marker); - - /* Use accelerated algorithm if vsize is over GCD_ACCEL_THRESHOLD. - Two EXTRA limbs for U and V are required for kary reduction. */ - if (vsize >= GCD_ACCEL_THRESHOLD) - { - unsigned long int vbitsize, d; - mp_ptr orig_up = up; - mp_size_t orig_usize = usize; - mp_ptr anchor_up = (mp_ptr) TMP_ALLOC ((usize + 2) * BYTES_PER_MP_LIMB); - - MPN_COPY (anchor_up, orig_up, usize); - up = anchor_up; - - count_leading_zeros (d, up[usize-1]); - d = usize * BITS_PER_MP_LIMB - d; - count_leading_zeros (vbitsize, vp[vsize-1]); - vbitsize = vsize * BITS_PER_MP_LIMB - vbitsize; - d = d - vbitsize + 1; - - /* Use bmod reduction to quickly discover whether V divides U. */ - up[usize++] = 0; /* Insert leading zero. */ - mpn_bdivmod (up, up, usize, vp, vsize, d); - - /* Now skip U/V mod 2^d and any low zero limbs. */ - d /= BITS_PER_MP_LIMB, up += d, usize -= d; - while (usize != 0 && up[0] == 0) - up++, usize--; - - if (usize == 0) /* GCD == ORIG_V. */ - goto done; - - vp = (mp_ptr) TMP_ALLOC ((vsize + 2) * BYTES_PER_MP_LIMB); - MPN_COPY (vp, orig_vp, vsize); - - do /* Main loop. */ - { - /* mpn_com_n can't be used here because anchor_up and up may - partially overlap */ - if (up[usize-1] & MP_LIMB_T_HIGHBIT) /* U < 0; take twos' compl. */ - { - mp_size_t i; - anchor_up[0] = -up[0]; - for (i = 1; i < usize; i++) - anchor_up[i] = ~up[i]; - up = anchor_up; - } - - MPN_NORMALIZE_NOT_ZERO (up, usize); - - if ((up[0] & 1) == 0) /* Result even; remove twos. */ - { - unsigned int r; - count_trailing_zeros (r, up[0]); - mpn_rshift (anchor_up, up, usize, r); - usize -= (anchor_up[usize-1] == 0); - } - else if (anchor_up != up) - MPN_COPY_INCR (anchor_up, up, usize); - - MPN_PTR_SWAP (anchor_up,usize, vp,vsize); - up = anchor_up; - - if (vsize <= 2) /* Kary can't handle < 2 limbs and */ - break; /* isn't efficient for == 2 limbs. */ - - d = vbitsize; - count_leading_zeros (vbitsize, vp[vsize-1]); - vbitsize = vsize * BITS_PER_MP_LIMB - vbitsize; - d = d - vbitsize + 1; - - if (d > BMOD_THRESHOLD) /* Bmod reduction. */ - { - up[usize++] = 0; - mpn_bdivmod (up, up, usize, vp, vsize, d); - d /= BITS_PER_MP_LIMB, up += d, usize -= d; - } - else /* Kary reduction. */ - { - mp_limb_t bp[2], cp[2]; - - /* C <-- V/U mod 2^(2*BITS_PER_MP_LIMB). */ - { - mp_limb_t u_inv, hi, lo; - modlimb_invert (u_inv, up[0]); - cp[0] = vp[0] * u_inv; - umul_ppmm (hi, lo, cp[0], up[0]); - cp[1] = (vp[1] - hi - cp[0] * up[1]) * u_inv; - } - - /* U <-- find_a (C) * U. */ - up[usize] = mpn_mul_1 (up, up, usize, find_a (cp)); - usize++; - - /* B <-- A/C == U/V mod 2^(BITS_PER_MP_LIMB + 1). - bp[0] <-- U/V mod 2^BITS_PER_MP_LIMB and - bp[1] <-- ( (U - bp[0] * V)/2^BITS_PER_MP_LIMB ) / V mod 2 - - Like V/U above, but simplified because only the low bit of - bp[1] is wanted. */ - { - mp_limb_t v_inv, hi, lo; - modlimb_invert (v_inv, vp[0]); - bp[0] = up[0] * v_inv; - umul_ppmm (hi, lo, bp[0], vp[0]); - bp[1] = (up[1] + hi + (bp[0]&vp[1])) & 1; - } - - up[usize++] = 0; - if (bp[1]) /* B < 0: U <-- U + (-B) * V. */ - { - mp_limb_t c = mpn_addmul_1 (up, vp, vsize, -bp[0]); - mpn_add_1 (up + vsize, up + vsize, usize - vsize, c); - } - else /* B >= 0: U <-- U - B * V. */ - { - mp_limb_t b = mpn_submul_1 (up, vp, vsize, bp[0]); - mpn_sub_1 (up + vsize, up + vsize, usize - vsize, b); - } - - up += 2, usize -= 2; /* At least two low limbs are zero. */ - } - - /* Must remove low zero limbs before complementing. */ - while (usize != 0 && up[0] == 0) - up++, usize--; - } - while (usize); - - /* Compute GCD (ORIG_V, GCD (ORIG_U, V)). Binary will execute twice. */ - up = orig_up, usize = orig_usize; - binary_gcd_ctr = 2; - } - else - binary_gcd_ctr = 1; - - /* Finish up with the binary algorithm. Executes once or twice. */ - for ( ; binary_gcd_ctr--; up = orig_vp, usize = orig_vsize) - { - if (usize > 2) /* First make U close to V in size. */ - { - unsigned long int vbitsize, d; - count_leading_zeros (d, up[usize-1]); - d = usize * BITS_PER_MP_LIMB - d; - count_leading_zeros (vbitsize, vp[vsize-1]); - vbitsize = vsize * BITS_PER_MP_LIMB - vbitsize; - d = d - vbitsize - 1; - if (d != -(unsigned long int)1 && d > 2) - { - mpn_bdivmod (up, up, usize, vp, vsize, d); /* Result > 0. */ - d /= (unsigned long int)BITS_PER_MP_LIMB, up += d, usize -= d; - } - } - - /* Start binary GCD. */ - do - { - mp_size_t zeros; - - /* Make sure U is odd. */ - MPN_NORMALIZE (up, usize); - while (up[0] == 0) - up += 1, usize -= 1; - if ((up[0] & 1) == 0) - { - unsigned int r; - count_trailing_zeros (r, up[0]); - mpn_rshift (up, up, usize, r); - usize -= (up[usize-1] == 0); - } - - /* Keep usize >= vsize. */ - if (usize < vsize) - MPN_PTR_SWAP (up, usize, vp, vsize); - - if (usize <= 2) /* Double precision. */ - { - if (vsize == 1) - vp[0] = mpn_gcd_1 (up, usize, vp[0]); - else - vsize = gcd_2 (vp, up); - break; /* Binary GCD done. */ - } - - /* Count number of low zero limbs of U - V. */ - for (zeros = 0; up[zeros] == vp[zeros] && ++zeros != vsize; ) - continue; - - /* If U < V, swap U and V; in any case, subtract V from U. */ - if (zeros == vsize) /* Subtract done. */ - up += zeros, usize -= zeros; - else if (usize == vsize) - { - mp_size_t size = vsize; - do - size--; - while (up[size] == vp[size]); - if (up[size] < vp[size]) /* usize == vsize. */ - MP_PTR_SWAP (up, vp); - up += zeros, usize = size + 1 - zeros; - mpn_sub_n (up, up, vp + zeros, usize); - } - else - { - mp_size_t size = vsize - zeros; - up += zeros, usize -= zeros; - if (mpn_sub_n (up, up, vp + zeros, size)) - { - while (up[size] == 0) /* Propagate borrow. */ - up[size++] = -(mp_limb_t)1; - up[size] -= 1; - } - } - } - while (usize); /* End binary GCD. */ - } - -done: - if (vp != gp) - MPN_COPY (gp, vp, vsize); - TMP_FREE (marker); - return vsize; -} diff --git a/rts/gmp/mpn/generic/gcd_1.c b/rts/gmp/mpn/generic/gcd_1.c deleted file mode 100644 index 1832636..0000000 --- a/rts/gmp/mpn/generic/gcd_1.c +++ /dev/null @@ -1,77 +0,0 @@ -/* mpn_gcd_1 -- - -Copyright (C) 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" - -/* Does not work for U == 0 or V == 0. It would be tough to make it work for - V == 0 since gcd(x,0) = x, and U does not generally fit in an mp_limb_t. */ - -mp_limb_t -#if __STDC__ -mpn_gcd_1 (mp_srcptr up, mp_size_t size, mp_limb_t vlimb) -#else -mpn_gcd_1 (up, size, vlimb) - mp_srcptr up; - mp_size_t size; - mp_limb_t vlimb; -#endif -{ - mp_limb_t ulimb; - unsigned long int u_low_zero_bits, v_low_zero_bits; - - if (size > 1) - { - ulimb = mpn_mod_1 (up, size, vlimb); - if (ulimb == 0) - return vlimb; - } - else - ulimb = up[0]; - - /* Need to eliminate low zero bits. */ - count_trailing_zeros (u_low_zero_bits, ulimb); - ulimb >>= u_low_zero_bits; - - count_trailing_zeros (v_low_zero_bits, vlimb); - vlimb >>= v_low_zero_bits; - - while (ulimb != vlimb) - { - if (ulimb > vlimb) - { - ulimb -= vlimb; - do - ulimb >>= 1; - while ((ulimb & 1) == 0); - } - else /* vlimb > ulimb. */ - { - vlimb -= ulimb; - do - vlimb >>= 1; - while ((vlimb & 1) == 0); - } - } - - return ulimb << MIN (u_low_zero_bits, v_low_zero_bits); -} diff --git a/rts/gmp/mpn/generic/gcdext.c b/rts/gmp/mpn/generic/gcdext.c deleted file mode 100644 index fe22d77..0000000 --- a/rts/gmp/mpn/generic/gcdext.c +++ /dev/null @@ -1,700 +0,0 @@ -/* mpn_gcdext -- Extended Greatest Common Divisor. - -Copyright (C) 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 "gmp.h" -#include "gmp-impl.h" -#include "longlong.h" - -#ifndef GCDEXT_THRESHOLD -#define GCDEXT_THRESHOLD 17 -#endif - -#ifndef EXTEND -#define EXTEND 1 -#endif - -#if STAT -int arr[BITS_PER_MP_LIMB]; -#endif - - -/* mpn_gcdext (GP, SP, SSIZE, UP, USIZE, VP, VSIZE) - - Compute the extended GCD of {UP,USIZE} and {VP,VSIZE} and store the - greatest common divisor at GP (unless it is 0), and the first cofactor at - SP. Write the size of the cofactor through the pointer SSIZE. Return the - size of the value at GP. Note that SP might be a negative number; this is - denoted by storing the negative of the size through SSIZE. - - {UP,USIZE} and {VP,VSIZE} are both clobbered. - - The space allocation for all four areas needs to be USIZE+1. - - Preconditions: 1) U >= V. - 2) V > 0. */ - -/* We use Lehmer's algorithm. The idea is to extract the most significant - bits of the operands, and compute the continued fraction for them. We then - apply the gathered cofactors to the full operands. - - Idea 1: After we have performed a full division, don't shift operands back, - but instead account for the extra factors-of-2 thus introduced. - Idea 2: Simple generalization to use divide-and-conquer would give us an - algorithm that runs faster than O(n^2). - Idea 3: The input numbers need less space as the computation progresses, - while the s0 and s1 variables need more space. To save memory, we - could make them share space, and have the latter variables grow - into the former. - Idea 4: We should not do double-limb arithmetic from the start. Instead, - do things in single-limb arithmetic until the quotients differ, - and then switch to double-limb arithmetic. */ - - -/* Division optimized for small quotients. If the quotient is more than one limb, - store 1 in *qh and return 0. */ -static mp_limb_t -#if __STDC__ -div2 (mp_limb_t *qh, mp_limb_t n1, mp_limb_t n0, mp_limb_t d1, mp_limb_t d0) -#else -div2 (qh, n1, n0, d1, d0) - mp_limb_t *qh; - mp_limb_t n1; - mp_limb_t n0; - mp_limb_t d1; - mp_limb_t d0; -#endif -{ - if (d1 == 0) - { - *qh = 1; - return 0; - } - - if ((mp_limb_signed_t) n1 < 0) - { - mp_limb_t q; - int cnt; - for (cnt = 1; (mp_limb_signed_t) d1 >= 0; cnt++) - { - d1 = (d1 << 1) | (d0 >> (BITS_PER_MP_LIMB - 1)); - d0 = d0 << 1; - } - - q = 0; - while (cnt) - { - q <<= 1; - if (n1 > d1 || (n1 == d1 && n0 >= d0)) - { - sub_ddmmss (n1, n0, n1, n0, d1, d0); - q |= 1; - } - d0 = (d1 << (BITS_PER_MP_LIMB - 1)) | (d0 >> 1); - d1 = d1 >> 1; - cnt--; - } - - *qh = 0; - return q; - } - else - { - mp_limb_t q; - int cnt; - for (cnt = 0; n1 > d1 || (n1 == d1 && n0 >= d0); cnt++) - { - d1 = (d1 << 1) | (d0 >> (BITS_PER_MP_LIMB - 1)); - d0 = d0 << 1; - } - - q = 0; - while (cnt) - { - d0 = (d1 << (BITS_PER_MP_LIMB - 1)) | (d0 >> 1); - d1 = d1 >> 1; - q <<= 1; - if (n1 > d1 || (n1 == d1 && n0 >= d0)) - { - sub_ddmmss (n1, n0, n1, n0, d1, d0); - q |= 1; - } - cnt--; - } - - *qh = 0; - return q; - } -} - -mp_size_t -#if EXTEND -#if __STDC__ -mpn_gcdext (mp_ptr gp, mp_ptr s0p, mp_size_t *s0size, - mp_ptr up, mp_size_t size, mp_ptr vp, mp_size_t vsize) -#else -mpn_gcdext (gp, s0p, s0size, up, size, vp, vsize) - mp_ptr gp; - mp_ptr s0p; - mp_size_t *s0size; - mp_ptr up; - mp_size_t size; - mp_ptr vp; - mp_size_t vsize; -#endif -#else -#if __STDC__ -mpn_gcd (mp_ptr gp, - mp_ptr up, mp_size_t size, mp_ptr vp, mp_size_t vsize) -#else -mpn_gcd (gp, up, size, vp, vsize) - mp_ptr gp; - mp_ptr up; - mp_size_t size; - mp_ptr vp; - mp_size_t vsize; -#endif -#endif -{ - mp_limb_t A, B, C, D; - int cnt; - mp_ptr tp, wp; -#if RECORD - mp_limb_t max = 0; -#endif -#if EXTEND - mp_ptr s1p; - mp_ptr orig_s0p = s0p; - mp_size_t ssize; - int sign = 1; -#endif - int use_double_flag; - TMP_DECL (mark); - - TMP_MARK (mark); - - use_double_flag = (size >= GCDEXT_THRESHOLD); - - tp = (mp_ptr) TMP_ALLOC ((size + 1) * BYTES_PER_MP_LIMB); - wp = (mp_ptr) TMP_ALLOC ((size + 1) * BYTES_PER_MP_LIMB); -#if EXTEND - s1p = (mp_ptr) TMP_ALLOC ((size + 1) * BYTES_PER_MP_LIMB); - - MPN_ZERO (s0p, size); - MPN_ZERO (s1p, size); - - s0p[0] = 1; - s1p[0] = 0; - ssize = 1; -#endif - - if (size > vsize) - { - /* Normalize V (and shift up U the same amount). */ - count_leading_zeros (cnt, vp[vsize - 1]); - if (cnt != 0) - { - mp_limb_t cy; - mpn_lshift (vp, vp, vsize, cnt); - cy = mpn_lshift (up, up, size, cnt); - up[size] = cy; - size += cy != 0; - } - - mpn_divmod (up + vsize, up, size, vp, vsize); -#if EXTEND - /* This is really what it boils down to in this case... */ - s0p[0] = 0; - s1p[0] = 1; - sign = -sign; -#endif - size = vsize; - if (cnt != 0) - { - mpn_rshift (up, up, size, cnt); - mpn_rshift (vp, vp, size, cnt); - } - MP_PTR_SWAP (up, vp); - } - - for (;;) - { - mp_limb_t asign; - /* Figure out exact size of V. */ - vsize = size; - MPN_NORMALIZE (vp, vsize); - if (vsize <= 1) - break; - - if (use_double_flag) - { - mp_limb_t uh, vh, ul, vl; - /* Let UH,UL be the most significant limbs of U, and let VH,VL be - the corresponding bits from V. */ - uh = up[size - 1]; - vh = vp[size - 1]; - ul = up[size - 2]; - vl = vp[size - 2]; - count_leading_zeros (cnt, uh); - if (cnt != 0) - { - uh = (uh << cnt) | (ul >> (BITS_PER_MP_LIMB - cnt)); - vh = (vh << cnt) | (vl >> (BITS_PER_MP_LIMB - cnt)); - vl <<= cnt; - ul <<= cnt; - if (size >= 3) - { - ul |= (up[size - 3] >> (BITS_PER_MP_LIMB - cnt)); - vl |= (vp[size - 3] >> (BITS_PER_MP_LIMB - cnt)); - } - } - - A = 1; - B = 0; - C = 0; - D = 1; - - asign = 0; - for (;;) - { - mp_limb_t T; - mp_limb_t qh, q1, q2; - mp_limb_t nh, nl, dh, dl; - mp_limb_t t1, t0; - mp_limb_t Th, Tl; - - sub_ddmmss (dh, dl, vh, vl, 0, C); - if ((dl | dh) == 0) - break; - add_ssaaaa (nh, nl, uh, ul, 0, A); - q1 = div2 (&qh, nh, nl, dh, dl); - if (qh != 0) - break; /* could handle this */ - - add_ssaaaa (dh, dl, vh, vl, 0, D); - if ((dl | dh) == 0) - break; - sub_ddmmss (nh, nl, uh, ul, 0, B); - q2 = div2 (&qh, nh, nl, dh, dl); - if (qh != 0) - break; /* could handle this */ - - if (q1 != q2) - break; - - asign = ~asign; - - T = A + q1 * C; - A = C; - C = T; - T = B + q1 * D; - B = D; - D = T; - umul_ppmm (t1, t0, q1, vl); - t1 += q1 * vh; - sub_ddmmss (Th, Tl, uh, ul, t1, t0); - uh = vh, ul = vl; - vh = Th, vl = Tl; - - add_ssaaaa (dh, dl, vh, vl, 0, C); - sub_ddmmss (nh, nl, uh, ul, 0, A); - q1 = div2 (&qh, nh, nl, dh, dl); - if (qh != 0) - break; /* could handle this */ - - sub_ddmmss (dh, dl, vh, vl, 0, D); - if ((dl | dh) == 0) - break; - add_ssaaaa (nh, nl, uh, ul, 0, B); - q2 = div2 (&qh, nh, nl, dh, dl); - if (qh != 0) - break; /* could handle this */ - - if (q1 != q2) - break; - - asign = ~asign; - - T = A + q1 * C; - A = C; - C = T; - T = B + q1 * D; - B = D; - D = T; - umul_ppmm (t1, t0, q1, vl); - t1 += q1 * vh; - sub_ddmmss (Th, Tl, uh, ul, t1, t0); - uh = vh, ul = vl; - vh = Th, vl = Tl; - } -#if EXTEND - if (asign) - sign = -sign; -#endif - } - else /* Same, but using single-limb calculations. */ - { - mp_limb_t uh, vh; - /* Make UH be the most significant limb of U, and make VH be - corresponding bits from V. */ - uh = up[size - 1]; - vh = vp[size - 1]; - count_leading_zeros (cnt, uh); - if (cnt != 0) - { - uh = (uh << cnt) | (up[size - 2] >> (BITS_PER_MP_LIMB - cnt)); - vh = (vh << cnt) | (vp[size - 2] >> (BITS_PER_MP_LIMB - cnt)); - } - - A = 1; - B = 0; - C = 0; - D = 1; - - asign = 0; - for (;;) - { - mp_limb_t q, T; - if (vh - C == 0 || vh + D == 0) - break; - - q = (uh + A) / (vh - C); - if (q != (uh - B) / (vh + D)) - break; - - asign = ~asign; - - T = A + q * C; - A = C; - C = T; - T = B + q * D; - B = D; - D = T; - T = uh - q * vh; - uh = vh; - vh = T; - - if (vh - D == 0) - break; - - q = (uh - A) / (vh + C); - if (q != (uh + B) / (vh - D)) - break; - - asign = ~asign; - - T = A + q * C; - A = C; - C = T; - T = B + q * D; - B = D; - D = T; - T = uh - q * vh; - uh = vh; - vh = T; - } -#if EXTEND - if (asign) - sign = -sign; -#endif - } - -#if RECORD - max = MAX (A, max); max = MAX (B, max); - max = MAX (C, max); max = MAX (D, max); -#endif - - if (B == 0) - { - mp_limb_t qh; - mp_size_t i; - /* This is quite rare. I.e., optimize something else! */ - - /* Normalize V (and shift up U the same amount). */ - count_leading_zeros (cnt, vp[vsize - 1]); - if (cnt != 0) - { - mp_limb_t cy; - mpn_lshift (vp, vp, vsize, cnt); - cy = mpn_lshift (up, up, size, cnt); - up[size] = cy; - size += cy != 0; - } - - qh = mpn_divmod (up + vsize, up, size, vp, vsize); -#if EXTEND - MPN_COPY (tp, s0p, ssize); - { - mp_size_t qsize; - - qsize = size - vsize; /* size of stored quotient from division */ - if (ssize < qsize) - { - MPN_ZERO (tp + ssize, qsize - ssize); - MPN_ZERO (s1p + ssize, qsize); /* zero s1 too */ - for (i = 0; i < ssize; i++) - { - mp_limb_t cy; - cy = mpn_addmul_1 (tp + i, up + vsize, qsize, s1p[i]); - tp[qsize + i] = cy; - } - if (qh != 0) - { - mp_limb_t cy; - cy = mpn_add_n (tp + qsize, tp + qsize, s1p, ssize); - if (cy != 0) - abort (); - } - } - else - { - MPN_ZERO (s1p + ssize, qsize); /* zero s1 too */ - for (i = 0; i < qsize; i++) - { - mp_limb_t cy; - cy = mpn_addmul_1 (tp + i, s1p, ssize, up[vsize + i]); - tp[ssize + i] = cy; - } - if (qh != 0) - { - mp_limb_t cy; - cy = mpn_add_n (tp + qsize, tp + qsize, s1p, ssize); - if (cy != 0) - { - tp[qsize + ssize] = cy; - s1p[qsize + ssize] = 0; - ssize++; - } - } - } - ssize += qsize; - ssize -= tp[ssize - 1] == 0; - } - - sign = -sign; - MP_PTR_SWAP (s0p, s1p); - MP_PTR_SWAP (s1p, tp); -#endif - size = vsize; - if (cnt != 0) - { - mpn_rshift (up, up, size, cnt); - mpn_rshift (vp, vp, size, cnt); - } - MP_PTR_SWAP (up, vp); - } - else - { -#if EXTEND - mp_size_t tsize, wsize; -#endif - /* T = U*A + V*B - W = U*C + V*D - U = T - V = W */ - -#if STAT - { mp_limb_t x; x = A | B | C | D; count_leading_zeros (cnt, x); - arr[BITS_PER_MP_LIMB - cnt]++; } -#endif - if (A == 0) - { - /* B == 1 and C == 1 (D is arbitrary) */ - mp_limb_t cy; - MPN_COPY (tp, vp, size); - MPN_COPY (wp, up, size); - mpn_submul_1 (wp, vp, size, D); - MP_PTR_SWAP (tp, up); - MP_PTR_SWAP (wp, vp); -#if EXTEND - MPN_COPY (tp, s1p, ssize); - tsize = ssize; - tp[ssize] = 0; /* must zero since wp might spill below */ - MPN_COPY (wp, s0p, ssize); - cy = mpn_addmul_1 (wp, s1p, ssize, D); - wp[ssize] = cy; - wsize = ssize + (cy != 0); - MP_PTR_SWAP (tp, s0p); - MP_PTR_SWAP (wp, s1p); - ssize = MAX (wsize, tsize); -#endif - } - else - { - if (asign) - { - mp_limb_t cy; - mpn_mul_1 (tp, vp, size, B); - mpn_submul_1 (tp, up, size, A); - mpn_mul_1 (wp, up, size, C); - mpn_submul_1 (wp, vp, size, D); - MP_PTR_SWAP (tp, up); - MP_PTR_SWAP (wp, vp); -#if EXTEND - cy = mpn_mul_1 (tp, s1p, ssize, B); - cy += mpn_addmul_1 (tp, s0p, ssize, A); - tp[ssize] = cy; - tsize = ssize + (cy != 0); - cy = mpn_mul_1 (wp, s0p, ssize, C); - cy += mpn_addmul_1 (wp, s1p, ssize, D); - wp[ssize] = cy; - wsize = ssize + (cy != 0); - MP_PTR_SWAP (tp, s0p); - MP_PTR_SWAP (wp, s1p); - ssize = MAX (wsize, tsize); -#endif - } - else - { - mp_limb_t cy; - mpn_mul_1 (tp, up, size, A); - mpn_submul_1 (tp, vp, size, B); - mpn_mul_1 (wp, vp, size, D); - mpn_submul_1 (wp, up, size, C); - MP_PTR_SWAP (tp, up); - MP_PTR_SWAP (wp, vp); -#if EXTEND - cy = mpn_mul_1 (tp, s0p, ssize, A); - cy += mpn_addmul_1 (tp, s1p, ssize, B); - tp[ssize] = cy; - tsize = ssize + (cy != 0); - cy = mpn_mul_1 (wp, s1p, ssize, D); - cy += mpn_addmul_1 (wp, s0p, ssize, C); - wp[ssize] = cy; - wsize = ssize + (cy != 0); - MP_PTR_SWAP (tp, s0p); - MP_PTR_SWAP (wp, s1p); - ssize = MAX (wsize, tsize); -#endif - } - } - - size -= up[size - 1] == 0; - } - } - -#if RECORD - printf ("max: %lx\n", max); -#endif - -#if STAT - {int i; for (i = 0; i < BITS_PER_MP_LIMB; i++) printf ("%d:%d\n", i, arr[i]);} -#endif - - if (vsize == 0) - { - if (gp != up && gp != 0) - MPN_COPY (gp, up, size); -#if EXTEND - MPN_NORMALIZE (s0p, ssize); - if (orig_s0p != s0p) - MPN_COPY (orig_s0p, s0p, ssize); - *s0size = sign >= 0 ? ssize : -ssize; -#endif - TMP_FREE (mark); - return size; - } - else - { - mp_limb_t vl, ul, t; -#if EXTEND - mp_size_t qsize, i; -#endif - vl = vp[0]; -#if EXTEND - t = mpn_divmod_1 (wp, up, size, vl); - - MPN_COPY (tp, s0p, ssize); - - qsize = size - (wp[size - 1] == 0); /* size of quotient from division */ - if (ssize < qsize) - { - MPN_ZERO (tp + ssize, qsize - ssize); - MPN_ZERO (s1p + ssize, qsize); /* zero s1 too */ - for (i = 0; i < ssize; i++) - { - mp_limb_t cy; - cy = mpn_addmul_1 (tp + i, wp, qsize, s1p[i]); - tp[qsize + i] = cy; - } - } - else - { - MPN_ZERO (s1p + ssize, qsize); /* zero s1 too */ - for (i = 0; i < qsize; i++) - { - mp_limb_t cy; - cy = mpn_addmul_1 (tp + i, s1p, ssize, wp[i]); - tp[ssize + i] = cy; - } - } - ssize += qsize; - ssize -= tp[ssize - 1] == 0; - - sign = -sign; - MP_PTR_SWAP (s0p, s1p); - MP_PTR_SWAP (s1p, tp); -#else - t = mpn_mod_1 (up, size, vl); -#endif - ul = vl; - vl = t; - while (vl != 0) - { - mp_limb_t t; -#if EXTEND - mp_limb_t q; - q = ul / vl; - t = ul - q * vl; - - MPN_COPY (tp, s0p, ssize); - - MPN_ZERO (s1p + ssize, 1); /* zero s1 too */ - - { - mp_limb_t cy; - cy = mpn_addmul_1 (tp, s1p, ssize, q); - tp[ssize] = cy; - } - - ssize += 1; - ssize -= tp[ssize - 1] == 0; - - sign = -sign; - MP_PTR_SWAP (s0p, s1p); - MP_PTR_SWAP (s1p, tp); -#else - t = ul % vl; -#endif - ul = vl; - vl = t; - } - if (gp != 0) - gp[0] = ul; -#if EXTEND - MPN_NORMALIZE (s0p, ssize); - if (orig_s0p != s0p) - MPN_COPY (orig_s0p, s0p, ssize); - *s0size = sign >= 0 ? ssize : -ssize; -#endif - TMP_FREE (mark); - return 1; - } -} diff --git a/rts/gmp/mpn/generic/get_str.c b/rts/gmp/mpn/generic/get_str.c deleted file mode 100644 index a713b61..0000000 --- a/rts/gmp/mpn/generic/get_str.c +++ /dev/null @@ -1,216 +0,0 @@ -/* mpn_get_str -- Convert a MSIZE long limb vector pointed to by MPTR - to a printable string in STR in base BASE. - -Copyright (C) 1991, 1992, 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" - -/* Convert the limb vector pointed to by MPTR and MSIZE long to a - char array, using base BASE for the result array. Store the - result in the character array STR. STR must point to an array with - space for the largest possible number represented by a MSIZE long - limb vector + 1 extra character. - - The result is NOT in Ascii, to convert it to printable format, add - '0' or 'A' depending on the base and range. - - Return the number of digits in the result string. - This may include some leading zeros. - - The limb vector pointed to by MPTR is clobbered. */ - -size_t -#if __STDC__ -mpn_get_str (unsigned char *str, int base, mp_ptr mptr, mp_size_t msize) -#else -mpn_get_str (str, base, mptr, msize) - unsigned char *str; - int base; - mp_ptr mptr; - mp_size_t msize; -#endif -{ - mp_limb_t big_base; -#if UDIV_NEEDS_NORMALIZATION || UDIV_TIME > 2 * UMUL_TIME - int normalization_steps; -#endif -#if UDIV_TIME > 2 * UMUL_TIME - mp_limb_t big_base_inverted; -#endif - unsigned int dig_per_u; - mp_size_t out_len; - register unsigned char *s; - - big_base = __mp_bases[base].big_base; - - s = str; - - /* Special case zero, as the code below doesn't handle it. */ - if (msize == 0) - { - s[0] = 0; - return 1; - } - - if ((base & (base - 1)) == 0) - { - /* The base is a power of 2. Make conversion from most - significant side. */ - mp_limb_t n1, n0; - register int bits_per_digit = big_base; - register int x; - register int bit_pos; - register int i; - - n1 = mptr[msize - 1]; - count_leading_zeros (x, n1); - - /* BIT_POS should be R when input ends in least sign. nibble, - R + bits_per_digit * n when input ends in n:th least significant - nibble. */ - - { - int bits; - - bits = BITS_PER_MP_LIMB * msize - x; - x = bits % bits_per_digit; - if (x != 0) - bits += bits_per_digit - x; - bit_pos = bits - (msize - 1) * BITS_PER_MP_LIMB; - } - - /* Fast loop for bit output. */ - i = msize - 1; - for (;;) - { - bit_pos -= bits_per_digit; - while (bit_pos >= 0) - { - *s++ = (n1 >> bit_pos) & ((1 << bits_per_digit) - 1); - bit_pos -= bits_per_digit; - } - i--; - if (i < 0) - break; - n0 = (n1 << -bit_pos) & ((1 << bits_per_digit) - 1); - n1 = mptr[i]; - bit_pos += BITS_PER_MP_LIMB; - *s++ = n0 | (n1 >> bit_pos); - } - - *s = 0; - - return s - str; - } - else - { - /* General case. The base is not a power of 2. Make conversion - from least significant end. */ - - /* If udiv_qrnnd only handles divisors with the most significant bit - set, prepare BIG_BASE for being a divisor by shifting it to the - left exactly enough to set the most significant bit. */ -#if UDIV_NEEDS_NORMALIZATION || UDIV_TIME > 2 * UMUL_TIME - count_leading_zeros (normalization_steps, big_base); - big_base <<= normalization_steps; -#if UDIV_TIME > 2 * UMUL_TIME - /* Get the fixed-point approximation to 1/(BIG_BASE << NORMALIZATION_STEPS). */ - big_base_inverted = __mp_bases[base].big_base_inverted; -#endif -#endif - - dig_per_u = __mp_bases[base].chars_per_limb; - out_len = ((size_t) msize * BITS_PER_MP_LIMB - * __mp_bases[base].chars_per_bit_exactly) + 1; - s += out_len; - - while (msize != 0) - { - int i; - mp_limb_t n0, n1; - -#if UDIV_NEEDS_NORMALIZATION || UDIV_TIME > 2 * UMUL_TIME - /* If we shifted BIG_BASE above, shift the dividend too, to get - the right quotient. We need to do this every loop, - since the intermediate quotients are OK, but the quotient from - one turn in the loop is going to be the dividend in the - next turn, and the dividend needs to be up-shifted. */ - if (normalization_steps != 0) - { - n0 = mpn_lshift (mptr, mptr, msize, normalization_steps); - - /* If the shifting gave a carry out limb, store it and - increase the length. */ - if (n0 != 0) - { - mptr[msize] = n0; - msize++; - } - } -#endif - - /* Divide the number at TP with BIG_BASE to get a quotient and a - remainder. The remainder is our new digit in base BIG_BASE. */ - i = msize - 1; - n1 = mptr[i]; - - if (n1 >= big_base) - n1 = 0; - else - { - msize--; - i--; - } - - for (; i >= 0; i--) - { - n0 = mptr[i]; -#if UDIV_TIME > 2 * UMUL_TIME - udiv_qrnnd_preinv (mptr[i], n1, n1, n0, big_base, big_base_inverted); -#else - udiv_qrnnd (mptr[i], n1, n1, n0, big_base); -#endif - } - -#if UDIV_NEEDS_NORMALIZATION || UDIV_TIME > 2 * UMUL_TIME - /* If we shifted above (at previous UDIV_NEEDS_NORMALIZATION tests) - the remainder will be up-shifted here. Compensate. */ - n1 >>= normalization_steps; -#endif - - /* Convert N1 from BIG_BASE to a string of digits in BASE - using single precision operations. */ - for (i = dig_per_u - 1; i >= 0; i--) - { - *--s = n1 % base; - n1 /= base; - if (n1 == 0 && msize == 0) - break; - } - } - - while (s != str) - *--s = 0; - return out_len; - } -} diff --git a/rts/gmp/mpn/generic/gmp-mparam.h b/rts/gmp/mpn/generic/gmp-mparam.h deleted file mode 100644 index 14bcaec..0000000 --- a/rts/gmp/mpn/generic/gmp-mparam.h +++ /dev/null @@ -1,27 +0,0 @@ -/* gmp-mparam.h -- Compiler/machine parameter header file. - -Copyright (C) 1991, 1993, 1994 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. */ - -#define BITS_PER_MP_LIMB 32 -#define BYTES_PER_MP_LIMB 4 -#define BITS_PER_LONGINT 32 -#define BITS_PER_INT 32 -#define BITS_PER_SHORTINT 16 -#define BITS_PER_CHAR 8 diff --git a/rts/gmp/mpn/generic/hamdist.c b/rts/gmp/mpn/generic/hamdist.c deleted file mode 100644 index 35c10e8..0000000 --- a/rts/gmp/mpn/generic/hamdist.c +++ /dev/null @@ -1,94 +0,0 @@ -/* mpn_hamdist -- - -Copyright (C) 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" - -#if defined __GNUC__ -/* No processor claiming to be SPARC v9 compliant seem to - implement the POPC instruction. Disable pattern for now. */ -#if 0 && defined __sparc_v9__ && BITS_PER_MP_LIMB == 64 -#define popc_limb(a) \ - ({ \ - DItype __res; \ - asm ("popc %1,%0" : "=r" (__res) : "rI" (a)); \ - __res; \ - }) -#endif -#endif - -#ifndef popc_limb - -/* Cool population count of a mp_limb_t. - You have to figure out how this works, I won't tell you! */ - -static inline unsigned int -#if __STDC__ -popc_limb (mp_limb_t x) -#else -popc_limb (x) - mp_limb_t x; -#endif -{ -#if BITS_PER_MP_LIMB == 64 - /* We have to go into some trouble to define these constants. - (For mp_limb_t being `long long'.) */ - mp_limb_t cnst; - cnst = 0xaaaaaaaaL | ((mp_limb_t) 0xaaaaaaaaL << BITS_PER_MP_LIMB/2); - x -= (x & cnst) >> 1; - cnst = 0x33333333L | ((mp_limb_t) 0x33333333L << BITS_PER_MP_LIMB/2); - x = ((x & ~cnst) >> 2) + (x & cnst); - cnst = 0x0f0f0f0fL | ((mp_limb_t) 0x0f0f0f0fL << BITS_PER_MP_LIMB/2); - x = ((x >> 4) + x) & cnst; - x = ((x >> 8) + x); - x = ((x >> 16) + x); - x = ((x >> 32) + x) & 0xff; -#endif -#if BITS_PER_MP_LIMB == 32 - x -= (x & 0xaaaaaaaa) >> 1; - x = ((x >> 2) & 0x33333333L) + (x & 0x33333333L); - x = ((x >> 4) + x) & 0x0f0f0f0fL; - x = ((x >> 8) + x); - x = ((x >> 16) + x) & 0xff; -#endif - return x; -} -#endif - -unsigned long int -#if __STDC__ -mpn_hamdist (mp_srcptr up, mp_srcptr vp, mp_size_t size) -#else -mpn_hamdist (up, vp, size) - register mp_srcptr up; - register mp_srcptr vp; - register mp_size_t size; -#endif -{ - unsigned long int hamdist; - mp_size_t i; - - hamdist = 0; - for (i = 0; i < size; i++) - hamdist += popc_limb (up[i] ^ vp[i]); - - return hamdist; -} diff --git a/rts/gmp/mpn/generic/inlines.c b/rts/gmp/mpn/generic/inlines.c deleted file mode 100644 index 9487e58..0000000 --- a/rts/gmp/mpn/generic/inlines.c +++ /dev/null @@ -1,24 +0,0 @@ -/* -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. -*/ - -#define _FORCE_INLINES -#define _EXTERN_INLINE /* empty */ -#include "gmp.h" diff --git a/rts/gmp/mpn/generic/jacbase.c b/rts/gmp/mpn/generic/jacbase.c deleted file mode 100644 index dd437f1..0000000 --- a/rts/gmp/mpn/generic/jacbase.c +++ /dev/null @@ -1,136 +0,0 @@ -/* mpn_jacobi_base -- limb/limb Jacobi symbol with restricted arguments. - - THIS INTERFACE IS PRELIMINARY AND MIGHT DISAPPEAR OR BE SUBJECT TO - INCOMPATIBLE CHANGES IN A FUTURE RELEASE OF GMP. */ - -/* -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" - - -#if COUNT_TRAILING_ZEROS_TIME <= 7 -/* If count_trailing_zeros is fast, use it. - K7 at 7 cycles and P6 at 2 are good here. K6 at 12-27 and P5 at 18-42 - are not. The default 15 in longlong.h is meant to mean not good here. */ - -#define PROCESS_TWOS_ANY \ - { \ - mp_limb_t twos; \ - count_trailing_zeros (twos, a); \ - result_bit1 ^= JACOBI_TWOS_U_BIT1 (twos, b); \ - a >>= twos; \ - } - -#define PROCESS_TWOS_EVEN PROCESS_TWOS_ANY - -#else -/* Use a loop instead. With "a" uniformly distributed there will usually be - only a few trailing zeros. - - Unfortunately the branch for the while loop here will be on a 50/50 - chance of a 1 or 0, which is bad for branch prediction. */ - -#define PROCESS_TWOS_EVEN \ - { \ - int two; \ - two = JACOBI_TWO_U_BIT1 (b); \ - do \ - { \ - a >>= 1; \ - result_bit1 ^= two; \ - ASSERT (a != 0); \ - } \ - while ((a & 1) == 0); \ - } - -#define PROCESS_TWOS_ANY \ - if ((a & 1) == 0) \ - PROCESS_TWOS_EVEN; - -#endif - - -/* Calculate the value of the Jacobi symbol (a/b) of two mp_limb_t's, but - with a restricted range of inputs accepted, namely b>1, b odd, and a<=b. - - The initial result_bit1 is taken as a parameter for the convenience of - mpz_kronecker_zi_ui() et al. The sign changes both here and in those - routines accumulate nicely in bit 1, see the JACOBI macros. - - The return value here is the normal +1, 0, or -1. Note that +1 and -1 - have bit 1 in the "BIT1" sense, which could be useful if the caller is - accumulating it into some extended calculation. - - Duplicating the loop body to avoid the MP_LIMB_T_SWAP(a,b) would be - possible, but a couple of tests suggest it's not a significant speedup, - and may even be a slowdown, so what's here is good enough for now. - - Future: The code doesn't demand a<=b actually, so maybe this could be - relaxed. All the places this is used currently call with a<=b though. */ - -int -#if __STDC__ -mpn_jacobi_base (mp_limb_t a, mp_limb_t b, int result_bit1) -#else -mpn_jacobi_base (a, b, result_bit1) - mp_limb_t a; - mp_limb_t b; - int result_bit1; -#endif -{ - ASSERT (b & 1); /* b odd */ - ASSERT (b != 1); - ASSERT (a <= b); - - if (a == 0) - return 0; - - PROCESS_TWOS_ANY; - if (a == 1) - goto done; - - for (;;) - { - result_bit1 ^= JACOBI_RECIP_UU_BIT1 (a, b); - MP_LIMB_T_SWAP (a, b); - - do - { - /* working on (a/b), a,b odd, a>=b */ - ASSERT (a & 1); - ASSERT (b & 1); - ASSERT (a >= b); - - if ((a -= b) == 0) - return 0; - - PROCESS_TWOS_EVEN; - if (a == 1) - goto done; - } - while (a >= b); - } - - done: - return JACOBI_BIT1_TO_PN (result_bit1); -} diff --git a/rts/gmp/mpn/generic/lshift.c b/rts/gmp/mpn/generic/lshift.c deleted file mode 100644 index 0b58389..0000000 --- a/rts/gmp/mpn/generic/lshift.c +++ /dev/null @@ -1,87 +0,0 @@ -/* mpn_lshift -- Shift left low level. - -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" - -/* Shift U (pointed to by UP and USIZE digits long) CNT bits to the left - and store the USIZE least significant digits of the result at WP. - Return the bits shifted out from the most significant digit. - - Argument constraints: - 1. 0 < CNT < BITS_PER_MP_LIMB - 2. If the result is to be written over the input, WP must be >= UP. -*/ - -mp_limb_t -#if __STDC__ -mpn_lshift (register mp_ptr wp, - register mp_srcptr up, mp_size_t usize, - register unsigned int cnt) -#else -mpn_lshift (wp, up, usize, cnt) - register mp_ptr wp; - register mp_srcptr up; - mp_size_t usize; - register unsigned int cnt; -#endif -{ - register mp_limb_t high_limb, low_limb; - register unsigned sh_1, sh_2; - register mp_size_t i; - mp_limb_t retval; - -#ifdef DEBUG - if (usize == 0 || cnt == 0) - abort (); -#endif - - sh_1 = cnt; -#if 0 - if (sh_1 == 0) - { - if (wp != up) - { - /* Copy from high end to low end, to allow specified input/output - overlapping. */ - for (i = usize - 1; i >= 0; i--) - wp[i] = up[i]; - } - return 0; - } -#endif - - wp += 1; - sh_2 = BITS_PER_MP_LIMB - sh_1; - i = usize - 1; - low_limb = up[i]; - retval = low_limb >> sh_2; - high_limb = low_limb; - while (--i >= 0) - { - low_limb = up[i]; - wp[i] = (high_limb << sh_1) | (low_limb >> sh_2); - high_limb = low_limb; - } - wp[i] = high_limb << sh_1; - - return retval; -} diff --git a/rts/gmp/mpn/generic/mod_1.c b/rts/gmp/mpn/generic/mod_1.c deleted file mode 100644 index 168ec9d..0000000 --- a/rts/gmp/mpn/generic/mod_1.c +++ /dev/null @@ -1,175 +0,0 @@ -/* mpn_mod_1(dividend_ptr, dividend_size, divisor_limb) -- - Divide (DIVIDEND_PTR,,DIVIDEND_SIZE) by DIVISOR_LIMB. - Return the single-limb remainder. - There are no constraints on the value of the divisor. - -Copyright (C) 1991, 1993, 1994, 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" -#include "longlong.h" - -#ifndef UMUL_TIME -#define UMUL_TIME 1 -#endif - -#ifndef UDIV_TIME -#define UDIV_TIME UMUL_TIME -#endif - -mp_limb_t -#if __STDC__ -mpn_mod_1 (mp_srcptr dividend_ptr, mp_size_t dividend_size, - mp_limb_t divisor_limb) -#else -mpn_mod_1 (dividend_ptr, dividend_size, divisor_limb) - mp_srcptr dividend_ptr; - mp_size_t dividend_size; - mp_limb_t divisor_limb; -#endif -{ - mp_size_t i; - mp_limb_t n1, n0, r; - int dummy; - - /* Botch: Should this be handled at all? Rely on callers? */ - if (dividend_size == 0) - return 0; - - /* If multiplication is much faster than division, and the - dividend is large, pre-invert the divisor, and use - only multiplications in the inner loop. */ - - /* This test should be read: - Does it ever help to use udiv_qrnnd_preinv? - && Does what we save compensate for the inversion overhead? */ - if (UDIV_TIME > (2 * UMUL_TIME + 6) - && (UDIV_TIME - (2 * UMUL_TIME + 6)) * dividend_size > UDIV_TIME) - { - int normalization_steps; - - count_leading_zeros (normalization_steps, divisor_limb); - if (normalization_steps != 0) - { - mp_limb_t divisor_limb_inverted; - - divisor_limb <<= normalization_steps; - invert_limb (divisor_limb_inverted, divisor_limb); - - n1 = dividend_ptr[dividend_size - 1]; - r = n1 >> (BITS_PER_MP_LIMB - normalization_steps); - - /* Possible optimization: - if (r == 0 - && divisor_limb > ((n1 << normalization_steps) - | (dividend_ptr[dividend_size - 2] >> ...))) - ...one division less... */ - - for (i = dividend_size - 2; i >= 0; i--) - { - n0 = dividend_ptr[i]; - udiv_qrnnd_preinv (dummy, r, r, - ((n1 << normalization_steps) - | (n0 >> (BITS_PER_MP_LIMB - normalization_steps))), - divisor_limb, divisor_limb_inverted); - n1 = n0; - } - udiv_qrnnd_preinv (dummy, r, r, - n1 << normalization_steps, - divisor_limb, divisor_limb_inverted); - return r >> normalization_steps; - } - else - { - mp_limb_t divisor_limb_inverted; - - invert_limb (divisor_limb_inverted, divisor_limb); - - i = dividend_size - 1; - r = dividend_ptr[i]; - - if (r >= divisor_limb) - r = 0; - else - i--; - - for (; i >= 0; i--) - { - n0 = dividend_ptr[i]; - udiv_qrnnd_preinv (dummy, r, r, - n0, divisor_limb, divisor_limb_inverted); - } - return r; - } - } - else - { - if (UDIV_NEEDS_NORMALIZATION) - { - int normalization_steps; - - count_leading_zeros (normalization_steps, divisor_limb); - if (normalization_steps != 0) - { - divisor_limb <<= normalization_steps; - - n1 = dividend_ptr[dividend_size - 1]; - r = n1 >> (BITS_PER_MP_LIMB - normalization_steps); - - /* Possible optimization: - if (r == 0 - && divisor_limb > ((n1 << normalization_steps) - | (dividend_ptr[dividend_size - 2] >> ...))) - ...one division less... */ - - for (i = dividend_size - 2; i >= 0; i--) - { - n0 = dividend_ptr[i]; - udiv_qrnnd (dummy, r, r, - ((n1 << normalization_steps) - | (n0 >> (BITS_PER_MP_LIMB - normalization_steps))), - divisor_limb); - n1 = n0; - } - udiv_qrnnd (dummy, r, r, - n1 << normalization_steps, - divisor_limb); - return r >> normalization_steps; - } - } - /* No normalization needed, either because udiv_qrnnd doesn't require - it, or because DIVISOR_LIMB is already normalized. */ - - i = dividend_size - 1; - r = dividend_ptr[i]; - - if (r >= divisor_limb) - r = 0; - else - i--; - - for (; i >= 0; i--) - { - n0 = dividend_ptr[i]; - udiv_qrnnd (dummy, r, r, n0, divisor_limb); - } - return r; - } -} diff --git a/rts/gmp/mpn/generic/mod_1_rs.c b/rts/gmp/mpn/generic/mod_1_rs.c deleted file mode 100644 index 62aaa94..0000000 --- a/rts/gmp/mpn/generic/mod_1_rs.c +++ /dev/null @@ -1,111 +0,0 @@ -/* mpn_mod_1_rshift -- mpn remainder under hypothetical right shift. - - THE FUNCTION IN THIS FILE IS FOR INTERNAL USE AND HAS A MUTABLE - INTERFACE. IT IS ONLY SAFE TO REACH IT THROUGH DOCUMENTED INTERFACES. - IT'S ALMOST GUARANTEED THAT IT'LL 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 "gmp.h" -#include "gmp-impl.h" -#include "longlong.h" - - -/* When testing on a CPU with UDIV_NEEDS_NORMALIZATION equal to 0, it can be - changed to 1 temporarily to test the code under that case too. */ -#if 0 -#undef UDIV_NEEDS_NORMALIZATION -#define UDIV_NEEDS_NORMALIZATION 1 -#endif - - -/* Calculate the remainder "(ptr,size >> shift) % divisor". Note ptr,size - is unchanged, the shift is only for its effect on the remainder. - The shift doesn't even need to be considered until the last limb. - - This function has the normal size!=0 restriction, unlike the basic - mpn_mod_1. */ - -mp_limb_t -#if __STDC__ -mpn_mod_1_rshift (mp_srcptr ptr, mp_size_t size, unsigned shift, - mp_limb_t divisor) -#else -mpn_mod_1_rshift (ptr, size, shift, divisor) - mp_srcptr ptr; - mp_size_t size; - unsigned shift; - mp_limb_t divisor; -#endif -{ - mp_limb_t quot, rem; - - ASSERT (shift >= 1); - ASSERT (shift < BITS_PER_MP_LIMB); - ASSERT (size >= 1); - - if (size == 1) - return (ptr[0] >> shift) % divisor; - -#if UDIV_NEEDS_NORMALIZATION - { - int norm; - int delta; - - count_leading_zeros (norm, divisor); - divisor <<= norm; - - delta = shift - norm; - if (delta == 0) - return mpn_mod_1 (ptr, size, divisor) >> norm; - - if (delta > 0) - { - rem = mpn_mod_1 (ptr+1, size-1, divisor); - udiv_qrnnd (quot, rem, - rem >> delta, - (rem << (BITS_PER_MP_LIMB-delta)) | (ptr[0] >> delta), - divisor); - return rem >> norm; - } - else - { - rem = mpn_mod_1 (ptr, size, divisor); - udiv_qrnnd (quot, rem, - rem >> (BITS_PER_MP_LIMB+delta), - rem << -delta, - divisor); - return rem >> norm; - } - } - -#else /* !UDIV_NEEDS_NORMALIZATION */ - - rem = mpn_mod_1 (ptr+1, size-1, divisor); - udiv_qrnnd (quot, rem, - rem >> shift, - (rem << (BITS_PER_MP_LIMB-shift)) | (ptr[0] >> shift), - divisor); - return rem; - -#endif -} diff --git a/rts/gmp/mpn/generic/mul.c b/rts/gmp/mpn/generic/mul.c deleted file mode 100644 index cecfa19..0000000 --- a/rts/gmp/mpn/generic/mul.c +++ /dev/null @@ -1,190 +0,0 @@ -/* mpn_mul -- Multiply two natural numbers. - - THE HELPER FUNCTIONS IN THIS FILE (meaning everything except mpn_mul) - ARE INTERNAL FUNCTIONS WITH MUTABLE INTERFACES. IT IS ONLY SAFE TO REACH - THEM THROUGH DOCUMENTED INTERFACES. IN FACT, IT IS ALMOST GUARANTEED - THAT THEY'LL CHANGE OR DISAPPEAR IN A FUTURE GNU MP RELEASE. - - -Copyright (C) 1991, 1993, 1994, 1996, 1997, 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" - -/* Multiply the natural numbers u (pointed to by UP, with UN limbs) and v - (pointed to by VP, with VN limbs), and store the result at PRODP. The - result is UN + VN limbs. Return the most significant limb of the result. - - NOTE: The space pointed to by PRODP is overwritten before finished with U - and V, so overlap is an error. - - Argument constraints: - 1. UN >= VN. - 2. PRODP != UP and PRODP != VP, i.e. the destination must be distinct from - the multiplier and the multiplicand. */ - -void -#if __STDC__ -mpn_sqr_n (mp_ptr prodp, - mp_srcptr up, mp_size_t un) -#else -mpn_sqr_n (prodp, up, un) - mp_ptr prodp; - mp_srcptr up; - mp_size_t un; -#endif -{ - if (un < KARATSUBA_SQR_THRESHOLD) - { /* plain schoolbook multiplication */ - if (un == 0) - return; - mpn_sqr_basecase (prodp, up, un); - } - else if (un < TOOM3_SQR_THRESHOLD) - { /* karatsuba multiplication */ - mp_ptr tspace; - TMP_DECL (marker); - TMP_MARK (marker); - tspace = (mp_ptr) TMP_ALLOC (2 * (un + BITS_PER_MP_LIMB) * BYTES_PER_MP_LIMB); - mpn_kara_sqr_n (prodp, up, un, tspace); - TMP_FREE (marker); - } -#if WANT_FFT || TUNE_PROGRAM_BUILD - else if (un < FFT_SQR_THRESHOLD) -#else - else -#endif - { /* toom3 multiplication */ - mp_ptr tspace; - TMP_DECL (marker); - TMP_MARK (marker); - tspace = (mp_ptr) TMP_ALLOC (2 * (un + BITS_PER_MP_LIMB) * BYTES_PER_MP_LIMB); - mpn_toom3_sqr_n (prodp, up, un, tspace); - TMP_FREE (marker); - } -#if WANT_FFT || TUNE_PROGRAM_BUILD - else - { - /* schoenhage multiplication */ - mpn_mul_fft_full (prodp, up, un, up, un); - } -#endif -} - -mp_limb_t -#if __STDC__ -mpn_mul (mp_ptr prodp, - mp_srcptr up, mp_size_t un, - mp_srcptr vp, mp_size_t vn) -#else -mpn_mul (prodp, up, un, vp, vn) - mp_ptr prodp; - mp_srcptr up; - mp_size_t un; - mp_srcptr vp; - mp_size_t vn; -#endif -{ - mp_size_t l; - mp_limb_t c; - - if (up == vp && un == vn) - { - mpn_sqr_n (prodp, up, un); - return prodp[2 * un - 1]; - } - - if (vn < KARATSUBA_MUL_THRESHOLD) - { /* long multiplication */ - mpn_mul_basecase (prodp, up, un, vp, vn); - return prodp[un + vn - 1]; - } - - mpn_mul_n (prodp, up, vp, vn); - if (un != vn) - { mp_limb_t t; - mp_ptr ws; - TMP_DECL (marker); - TMP_MARK (marker); - - prodp += vn; - l = vn; - up += vn; - un -= vn; - - if (un < vn) - { - /* Swap u's and v's. */ - MPN_SRCPTR_SWAP (up,un, vp,vn); - } - - ws = (mp_ptr) TMP_ALLOC (((vn >= KARATSUBA_MUL_THRESHOLD ? vn : un) + vn) - * BYTES_PER_MP_LIMB); - - t = 0; - while (vn >= KARATSUBA_MUL_THRESHOLD) - { - mpn_mul_n (ws, up, vp, vn); - if (l <= 2*vn) - { - t += mpn_add_n (prodp, prodp, ws, l); - if (l != 2*vn) - { - t = mpn_add_1 (prodp + l, ws + l, 2*vn - l, t); - l = 2*vn; - } - } - else - { - c = mpn_add_n (prodp, prodp, ws, 2*vn); - t += mpn_add_1 (prodp + 2*vn, prodp + 2*vn, l - 2*vn, c); - } - prodp += vn; - l -= vn; - up += vn; - un -= vn; - if (un < vn) - { - /* Swap u's and v's. */ - MPN_SRCPTR_SWAP (up,un, vp,vn); - } - } - - if (vn) - { - mpn_mul_basecase (ws, up, un, vp, vn); - if (l <= un + vn) - { - t += mpn_add_n (prodp, prodp, ws, l); - if (l != un + vn) - t = mpn_add_1 (prodp + l, ws + l, un + vn - l, t); - } - else - { - c = mpn_add_n (prodp, prodp, ws, un + vn); - t += mpn_add_1 (prodp + un + vn, prodp + un + vn, l - un - vn, c); - } - } - - TMP_FREE (marker); - } - return prodp[un + vn - 1]; -} diff --git a/rts/gmp/mpn/generic/mul_1.c b/rts/gmp/mpn/generic/mul_1.c deleted file mode 100644 index 1c36b5f..0000000 --- a/rts/gmp/mpn/generic/mul_1.c +++ /dev/null @@ -1,59 +0,0 @@ -/* mpn_mul_1 -- Multiply a limb vector with a single limb and - store the product in a second limb vector. - -Copyright (C) 1991, 1992, 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" -#include "longlong.h" - -mp_limb_t -mpn_mul_1 (res_ptr, s1_ptr, s1_size, s2_limb) - register mp_ptr res_ptr; - register mp_srcptr s1_ptr; - mp_size_t s1_size; - register mp_limb_t s2_limb; -{ - register mp_limb_t cy_limb; - register mp_size_t j; - register mp_limb_t prod_high, prod_low; - - /* The loop counter and index J goes from -S1_SIZE to -1. This way - the loop becomes faster. */ - j = -s1_size; - - /* Offset the base pointers to compensate for the negative indices. */ - s1_ptr -= j; - res_ptr -= j; - - cy_limb = 0; - do - { - umul_ppmm (prod_high, prod_low, s1_ptr[j], s2_limb); - - prod_low += cy_limb; - cy_limb = (prod_low < cy_limb) + prod_high; - - res_ptr[j] = prod_low; - } - while (++j != 0); - - return cy_limb; -} diff --git a/rts/gmp/mpn/generic/mul_basecase.c b/rts/gmp/mpn/generic/mul_basecase.c deleted file mode 100644 index 00c06aa..0000000 --- a/rts/gmp/mpn/generic/mul_basecase.c +++ /dev/null @@ -1,87 +0,0 @@ -/* mpn_mul_basecase -- Internal routine to multiply two natural numbers - of length m and n. - - THIS IS AN INTERNAL FUNCTION WITH A MUTABLE INTERFACE. IT IS ONLY - SAFE TO REACH THIS FUNCTION THROUGH DOCUMENTED INTERFACES. - - -Copyright (C) 1991, 1992, 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" - -/* Handle simple cases with traditional multiplication. - - This is the most critical code of multiplication. All multiplies rely on - this, both small and huge. Small ones arrive here immediately, huge ones - arrive here as this is the base case for Karatsuba's recursive algorithm. */ - -void -#if __STDC__ -mpn_mul_basecase (mp_ptr prodp, - mp_srcptr up, mp_size_t usize, - mp_srcptr vp, mp_size_t vsize) -#else -mpn_mul_basecase (prodp, up, usize, vp, vsize) - mp_ptr prodp; - mp_srcptr up; - mp_size_t usize; - mp_srcptr vp; - mp_size_t vsize; -#endif -{ - /* We first multiply by the low order one or two limbs, as the result can - be stored, not added, to PROD. We also avoid a loop for zeroing this - way. */ -#if HAVE_NATIVE_mpn_mul_2 - if (vsize >= 2) - { - prodp[usize + 1] = mpn_mul_2 (prodp, up, usize, vp[0], vp[1]); - prodp += 2, vp += 2, vsize -= 2; - } - else - { - prodp[usize] = mpn_mul_1 (prodp, up, usize, vp[0]); - return; - } -#else - prodp[usize] = mpn_mul_1 (prodp, up, usize, vp[0]); - prodp += 1, vp += 1, vsize -= 1; -#endif - -#if HAVE_NATIVE_mpn_addmul_2 - while (vsize >= 2) - { - prodp[usize + 1] = mpn_addmul_2 (prodp, up, usize, vp[0], vp[1]); - prodp += 2, vp += 2, vsize -= 2; - } - if (vsize != 0) - prodp[usize] = mpn_addmul_1 (prodp, up, usize, vp[0]); -#else - /* For each iteration in the loop, multiply U with one limb from V, and - add the result to PROD. */ - while (vsize != 0) - { - prodp[usize] = mpn_addmul_1 (prodp, up, usize, vp[0]); - prodp += 1, vp += 1, vsize -= 1; - } -#endif -} diff --git a/rts/gmp/mpn/generic/mul_fft.c b/rts/gmp/mpn/generic/mul_fft.c deleted file mode 100644 index 00fd6d7..0000000 --- a/rts/gmp/mpn/generic/mul_fft.c +++ /dev/null @@ -1,772 +0,0 @@ -/* An implementation in GMP of Scho"nhage's fast multiplication algorithm - modulo 2^N+1, by Paul Zimmermann, INRIA Lorraine, February 1998. - - THE CONTENTS OF THIS FILE ARE FOR INTERNAL USE AND THE FUNCTIONS HAVE - MUTABLE INTERFACES. IT IS ONLY SAFE TO REACH THEM THROUGH DOCUMENTED - INTERFACES. IT IS ALMOST GUARANTEED THAT THEY'LL CHANGE OR DISAPPEAR IN - A FUTURE GNU MP RELEASE. - -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. */ - - -/* References: - - Schnelle Multiplikation grosser Zahlen, by Arnold Scho"nhage and Volker - Strassen, Computing 7, p. 281-292, 1971. - - Asymptotically fast algorithms for the numerical multiplication - and division of polynomials with complex coefficients, by Arnold Scho"nhage, - Computer Algebra, EUROCAM'82, LNCS 144, p. 3-15, 1982. - - Tapes versus Pointers, a study in implementing fast algorithms, - by Arnold Scho"nhage, Bulletin of the EATCS, 30, p. 23-32, 1986. - - See also http://www.loria.fr/~zimmerma/bignum - - - Future: - - K==2 isn't needed in the current uses of this code and the bits specific - for that could be dropped. - - It might be possible to avoid a small number of MPN_COPYs by using a - rotating temporary or two. - - Multiplications of unequal sized operands can be done with this code, but - it needs a tighter test for identifying squaring (same sizes as well as - same pointers). */ - - -#include -#include "gmp.h" -#include "gmp-impl.h" - - -/* Change this to "#define TRACE(x) x" for some traces. */ -#define TRACE(x) - - - -FFT_TABLE_ATTRS mp_size_t mpn_fft_table[2][MPN_FFT_TABLE_SIZE] = { - FFT_MUL_TABLE, - FFT_SQR_TABLE -}; - - -static void mpn_mul_fft_internal -_PROTO ((mp_limb_t *op, mp_srcptr n, mp_srcptr m, mp_size_t pl, - int k, int K, - mp_limb_t **Ap, mp_limb_t **Bp, - mp_limb_t *A, mp_limb_t *B, - mp_size_t nprime, mp_size_t l, mp_size_t Mp, int **_fft_l, - mp_limb_t *T, int rec)); - - -/* Find the best k to use for a mod 2^(n*BITS_PER_MP_LIMB)+1 FFT. - sqr==0 if for a multiply, sqr==1 for a square */ -int -#if __STDC__ -mpn_fft_best_k (mp_size_t n, int sqr) -#else -mpn_fft_best_k (n, sqr) - mp_size_t n; - int sqr; -#endif -{ - mp_size_t t; - int i; - - for (i = 0; mpn_fft_table[sqr][i] != 0; i++) - if (n < mpn_fft_table[sqr][i]) - return i + FFT_FIRST_K; - - /* treat 4*last as one further entry */ - if (i == 0 || n < 4*mpn_fft_table[sqr][i-1]) - return i + FFT_FIRST_K; - else - return i + FFT_FIRST_K + 1; -} - - -/* Returns smallest possible number of limbs >= pl for a fft of size 2^k. - FIXME: Is this simply pl rounded up to the next multiple of 2^k ? */ - -mp_size_t -#if __STDC__ -mpn_fft_next_size (mp_size_t pl, int k) -#else -mpn_fft_next_size (pl, k) - mp_size_t pl; - int k; -#endif -{ - mp_size_t N, M; - int K; - - /* if (k==0) k = mpn_fft_best_k (pl, sqr); */ - N = pl*BITS_PER_MP_LIMB; - K = 1<=0;i--) ap[i] = ~tp[n-d+i]; - cc = 1-mpn_add_1(ap, ap, d, 1); - if (cc) cc=mpn_sub_1(ap+d, tp, n-d, 1); - else MPN_COPY(ap+d, tp, n-d); - if (cc+=mpn_sub_1(ap+d, ap+d, n-d, tp[n])) - ap[n]=mpn_add_1(ap, ap, n, cc); - else ap[n]=0; - } - else if ((ap[n]=mpn_sub_1(ap, tp, n, tp[n]))) { - ap[n]=mpn_add_1(ap, ap, n, 1); - } - if ((e/(n*BITS_PER_MP_LIMB))%2) mpn_fft_neg_modF(ap, n); -} - - -/* a <- a+b mod 2^(n*BITS_PER_MP_LIMB)+1 */ -static void -#if __STDC__ -mpn_fft_add_modF (mp_limb_t *ap, mp_limb_t *bp, int n) -#else -mpn_fft_add_modF (ap, bp, n) - mp_limb_t *ap,*bp; - int n; -#endif -{ - mp_limb_t c; - - c = ap[n] + bp[n] + mpn_add_n(ap, ap, bp, n); - if (c>1) c -= 1+mpn_sub_1(ap,ap,n,1); - ap[n]=c; -} - - -/* input: A[0] ... A[inc*(K-1)] are residues mod 2^N+1 where - N=n*BITS_PER_MP_LIMB - 2^omega is a primitive root mod 2^N+1 - output: A[inc*l[k][i]] <- \sum (2^omega)^(ij) A[inc*j] mod 2^N+1 */ - -static void -#if __STDC__ -mpn_fft_fft_sqr (mp_limb_t **Ap, mp_size_t K, int **ll, - mp_size_t omega, mp_size_t n, mp_size_t inc, mp_limb_t *tp) -#else -mpn_fft_fft_sqr(Ap,K,ll,omega,n,inc,tp) -mp_limb_t **Ap,*tp; -mp_size_t K,omega,n,inc; -int **ll; -#endif -{ - if (K==2) { -#ifdef ADDSUB - if (mpn_addsub_n(Ap[0], Ap[inc], Ap[0], Ap[inc], n+1) & 1) -#else - MPN_COPY(tp, Ap[0], n+1); - mpn_add_n(Ap[0], Ap[0], Ap[inc],n+1); - if (mpn_sub_n(Ap[inc], tp, Ap[inc],n+1)) -#endif - Ap[inc][n] = mpn_add_1(Ap[inc], Ap[inc], n, 1); - } - else { - int j, inc2=2*inc; - int *lk = *ll; - mp_limb_t *tmp; - TMP_DECL(marker); - - TMP_MARK(marker); - tmp = TMP_ALLOC_LIMBS (n+1); - mpn_fft_fft_sqr(Ap, K/2,ll-1,2*omega,n,inc2, tp); - mpn_fft_fft_sqr(Ap+inc, K/2,ll-1,2*omega,n,inc2, tp); - /* A[2*j*inc] <- A[2*j*inc] + omega^l[k][2*j*inc] A[(2j+1)inc] - A[(2j+1)inc] <- A[2*j*inc] + omega^l[k][(2j+1)inc] A[(2j+1)inc] */ - for (j=0;j= (sqr ? FFT_MODF_SQR_THRESHOLD : FFT_MODF_MUL_THRESHOLD)) { - int k, K2,nprime2,Nprime2,M2,maxLK,l,Mp2; - int **_fft_l; - mp_limb_t **Ap,**Bp,*A,*B,*T; - - k = mpn_fft_best_k (n, sqr); - K2 = 1<BITS_PER_MP_LIMB) ? K2 : BITS_PER_MP_LIMB; - M2 = n*BITS_PER_MP_LIMB/K2; - l = n/K2; - Nprime2 = ((2*M2+k+2+maxLK)/maxLK)*maxLK; /* ceil((2*M2+k+3)/maxLK)*maxLK*/ - nprime2 = Nprime2/BITS_PER_MP_LIMB; - Mp2 = Nprime2/K2; - - Ap = TMP_ALLOC_MP_PTRS (K2); - Bp = TMP_ALLOC_MP_PTRS (K2); - A = TMP_ALLOC_LIMBS (2*K2*(nprime2+1)); - T = TMP_ALLOC_LIMBS (nprime2+1); - B = A + K2*(nprime2+1); - _fft_l = TMP_ALLOC_TYPE (k+1, int*); - for (i=0;i<=k;i++) - _fft_l[i] = TMP_ALLOC_TYPE (1< %d times %dx%d (%1.2f)\n", n, - n, K2, nprime2, nprime2, 2.0*(double)n/nprime2/K2)); - - for (i=0;i2*n) { - l = n; - rp[n] = mpn_add_1(rp+an-2*n, ap+an-2*n, 3*n-an, - mpn_add_n(rp,ap,ap+2*n,an-2*n)); - } - else { - l = an-n; - MPN_COPY(rp, ap, n); - rp[n]=0; - } - if (mpn_sub_n(rp,rp,ap+n,l)) { - if (mpn_sub_1(rp+l,rp+l,n+1-l,1)) - rp[n]=mpn_add_1(rp,rp,n,1); - } -} - - -static void -#if __STDC__ -mpn_mul_fft_internal(mp_limb_t *op, mp_srcptr n, mp_srcptr m, mp_size_t pl, - int k, int K, - mp_limb_t **Ap, mp_limb_t **Bp, - mp_limb_t *A, mp_limb_t *B, - mp_size_t nprime, mp_size_t l, mp_size_t Mp, - int **_fft_l, - mp_limb_t *T, int rec) -#else -mpn_mul_fft_internal(op,n,m,pl,k,K,Ap,Bp,A,B,nprime,l,Mp,_fft_l,T,rec) - mp_limb_t *op; - mp_srcptr n, m; - mp_limb_t **Ap,**Bp,*A,*B,*T; - mp_size_t pl,nprime; - int **_fft_l; - int k,K,l,Mp,rec; -#endif -{ - int i, sqr, pla, lo, sh, j; - mp_limb_t *p; - - sqr = (n==m); - - TRACE (printf ("pl=%d k=%d K=%d np=%d l=%d Mp=%d rec=%d sqr=%d\n", - pl,k,K,nprime,l,Mp,rec,sqr)); - - /* decomposition of inputs into arrays Ap[i] and Bp[i] */ - if (rec) for (i=0;i= pla, i.e. enough */ - MPN_ZERO(p, pla); - sqr=0; /* will accumulate the (signed) carry at p[pla] */ - for (i=K-1,lo=l*i+nprime,sh=l*i;i>=0;i--,lo-=l,sh-=l) { - mp_ptr n = p+sh; - j = (K-i)%K; - if (mpn_add_n(n,n,Ap[j],nprime+1)) - sqr += mpn_add_1(n+nprime+1,n+nprime+1,pla-sh-nprime-1,1); - T[2*l]=i+1; /* T = (i+1)*2^(2*M) */ - if (mpn_cmp(Ap[j],T,nprime+1)>0) { /* subtract 2^N'+1 */ - sqr -= mpn_sub_1(n,n,pla-sh,1); - sqr -= mpn_sub_1(p+lo,p+lo,pla-lo,1); - } - } - if (sqr==-1) { - if ((sqr=mpn_add_1(p+pla-pl,p+pla-pl,pl,1))) { - /* p[pla-pl]...p[pla-1] are all zero */ - mpn_sub_1(p+pla-pl-1,p+pla-pl-1,pl+1,1); - mpn_sub_1(p+pla-1,p+pla-1,1,1); - } - } - else if (sqr==1) { - if (pla>=2*pl) - while ((sqr=mpn_add_1(p+pla-2*pl,p+pla-2*pl,2*pl,sqr))); - else { - sqr = mpn_sub_1(p+pla-pl,p+pla-pl,pl,sqr); - ASSERT (sqr == 0); - } - } - else - ASSERT (sqr == 0); - - /* here p < 2^(2M) [K 2^(M(K-1)) + (K-1) 2^(M(K-2)) + ... ] - < K 2^(2M) [2^(M(K-1)) + 2^(M(K-2)) + ... ] - < K 2^(2M) 2^(M(K-1))*2 = 2^(M*K+M+k+1) */ - mpn_fft_norm_modF(op,p,pl,pla); -} - - -/* op <- n*m mod 2^N+1 with fft of size 2^k where N=pl*BITS_PER_MP_LIMB - n and m have respectively nl and ml limbs - op must have space for pl+1 limbs - One must have pl = mpn_fft_next_size(pl, k). -*/ - -void -#if __STDC__ -mpn_mul_fft (mp_ptr op, mp_size_t pl, - mp_srcptr n, mp_size_t nl, - mp_srcptr m, mp_size_t ml, - int k) -#else -mpn_mul_fft (op, pl, n, nl, m, ml, k) - mp_ptr op; - mp_size_t pl; - mp_srcptr n; - mp_size_t nl; - mp_srcptr m; - mp_size_t ml; - int k; -#endif -{ - int K,maxLK,i,j; - mp_size_t N,Nprime,nprime,M,Mp,l; - mp_limb_t **Ap,**Bp,*A,*T,*B; - int **_fft_l; - int sqr = (n==m && nl==ml); - TMP_DECL(marker); - - TRACE (printf ("\nmpn_mul_fft pl=%ld nl=%ld ml=%ld k=%d\n", - pl, nl, ml, k)); - ASSERT_ALWAYS (mpn_fft_next_size(pl, k) == pl); - - TMP_MARK(marker); - N = pl*BITS_PER_MP_LIMB; - _fft_l = TMP_ALLOC_TYPE (k+1, int*); - for (i=0;i<=k;i++) - _fft_l[i] = TMP_ALLOC_TYPE (1<BITS_PER_MP_LIMB) ? K : BITS_PER_MP_LIMB; - - Nprime = ((2*M+k+2+maxLK)/maxLK)*maxLK; /* ceil((2*M+k+3)/maxLK)*maxLK; */ - nprime = Nprime/BITS_PER_MP_LIMB; - TRACE (printf ("N=%d K=%d, M=%d, l=%d, maxLK=%d, Np=%d, np=%d\n", - N, K, M, l, maxLK, Nprime, nprime)); - if (nprime >= (sqr ? FFT_MODF_SQR_THRESHOLD : FFT_MODF_MUL_THRESHOLD)) { - maxLK = (1< %d times %dx%d limbs (%1.2f)\n", - pl,pl,K,nprime,nprime,2.0*(double)N/Nprime/K); - printf(" temp space %ld\n", 2*K*(nprime+1))); - - A = _MP_ALLOCATE_FUNC_LIMBS (2*K*(nprime+1)); - B = A+K*(nprime+1); - Ap = TMP_ALLOC_MP_PTRS (K); - Bp = TMP_ALLOC_MP_PTRS (K); - /* special decomposition for main call */ - for (i=0;i0) { - j = (nl>=l) ? l : nl; /* limbs to store in Ap[i] */ - MPN_COPY(Ap[i], n, j); n+=l; MPN_ZERO(Ap[i]+j, nprime+1-j); - mpn_fft_mul_2exp_modF(Ap[i], i*Mp, nprime, T); - } - else MPN_ZERO(Ap[i], nprime+1); - nl -= l; - if (n!=m) { - if (ml>0) { - j = (ml>=l) ? l : ml; /* limbs to store in Bp[i] */ - MPN_COPY(Bp[i], m, j); m+=l; MPN_ZERO(Bp[i]+j, nprime+1-j); - mpn_fft_mul_2exp_modF(Bp[i], i*Mp, nprime, T); - } - else MPN_ZERO(Bp[i], nprime+1); - } - ml -= l; - } - mpn_mul_fft_internal(op,n,m,pl,k,K,Ap,Bp,A,B,nprime,l,Mp,_fft_l,T,0); - TMP_FREE(marker); - _MP_FREE_FUNC_LIMBS (A, 2*K*(nprime+1)); -} - - -#if WANT_ASSERT -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; -} -#endif - - -/* Multiply {n,nl}*{m,ml} and write the result to {op,nl+ml}. - - FIXME: Duplicating the result like this is wasteful, do something better - perhaps at the norm_modF stage above. */ - -void -#if __STDC__ -mpn_mul_fft_full (mp_ptr op, - mp_srcptr n, mp_size_t nl, - mp_srcptr m, mp_size_t ml) -#else -mpn_mul_fft_full (op, n, nl, m, ml) - mp_ptr op; - mp_srcptr n; - mp_size_t nl; - mp_srcptr m; - mp_size_t ml; -#endif -{ - mp_ptr pad_op; - mp_size_t pl; - int k; - int sqr = (n==m && nl==ml); - - k = mpn_fft_best_k (nl+ml, sqr); - pl = mpn_fft_next_size (nl+ml, k); - - TRACE (printf ("mpn_mul_fft_full nl=%ld ml=%ld -> pl=%ld k=%d\n", - nl, ml, pl, k)); - - pad_op = _MP_ALLOCATE_FUNC_LIMBS (pl+1); - mpn_mul_fft (pad_op, pl, n, nl, m, ml, k); - - ASSERT (mpn_zero_p (pad_op+nl+ml, pl+1-(nl+ml))); - MPN_COPY (op, pad_op, nl+ml); - - _MP_FREE_FUNC_LIMBS (pad_op, pl+1); -} diff --git a/rts/gmp/mpn/generic/mul_n.c b/rts/gmp/mpn/generic/mul_n.c deleted file mode 100644 index b7563be..0000000 --- a/rts/gmp/mpn/generic/mul_n.c +++ /dev/null @@ -1,1343 +0,0 @@ -/* mpn_mul_n and helper function -- Multiply/square natural numbers. - - THE HELPER FUNCTIONS IN THIS FILE (meaning everything except mpn_mul_n) - ARE INTERNAL FUNCTIONS WITH MUTABLE INTERFACES. IT IS ONLY SAFE TO REACH - THEM THROUGH DOCUMENTED INTERFACES. IN FACT, IT IS ALMOST GUARANTEED - THAT THEY'LL CHANGE OR DISAPPEAR IN A FUTURE GNU MP RELEASE. - - -Copyright (C) 1991, 1993, 1994, 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" -#include "longlong.h" - - -/* Multiplicative inverse of 3, modulo 2^BITS_PER_MP_LIMB. - 0xAAAAAAAB for 32 bits, 0xAAAAAAAAAAAAAAAB for 64 bits. */ -#define INVERSE_3 ((MP_LIMB_T_MAX / 3) * 2 + 1) - -#if !defined (__alpha) && !defined (__mips) -/* For all other machines, we want to call mpn functions for the compund - operations instead of open-coding them. */ -#define USE_MORE_MPN -#endif - -/*== Function declarations =================================================*/ - -static void evaluate3 _PROTO ((mp_ptr, mp_ptr, mp_ptr, - mp_ptr, mp_ptr, mp_ptr, - mp_srcptr, mp_srcptr, mp_srcptr, - mp_size_t, mp_size_t)); -static void interpolate3 _PROTO ((mp_srcptr, - mp_ptr, mp_ptr, mp_ptr, - mp_srcptr, - mp_ptr, mp_ptr, mp_ptr, - mp_size_t, mp_size_t)); -static mp_limb_t add2Times _PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); - - -/*-- mpn_kara_mul_n ---------------------------------------------------------------*/ - -/* Multiplies using 3 half-sized mults and so on recursively. - * p[0..2*n-1] := product of a[0..n-1] and b[0..n-1]. - * No overlap of p[...] with a[...] or b[...]. - * ws is workspace. - */ - -void -#if __STDC__ -mpn_kara_mul_n (mp_ptr p, mp_srcptr a, mp_srcptr b, mp_size_t n, mp_ptr ws) -#else -mpn_kara_mul_n(p, a, b, n, ws) - mp_ptr p; - mp_srcptr a; - mp_srcptr b; - mp_size_t n; - mp_ptr ws; -#endif -{ - mp_limb_t i, sign, w, w0, w1; - mp_size_t n2; - mp_srcptr x, y; - - n2 = n >> 1; - ASSERT (n2 > 0); - - if (n & 1) - { - /* Odd length. */ - mp_size_t n1, n3, nm1; - - n3 = n - n2; - - sign = 0; - w = a[n2]; - if (w != 0) - w -= mpn_sub_n (p, a, a + n3, n2); - else - { - i = n2; - do - { - --i; - w0 = a[i]; - w1 = a[n3+i]; - } - while (w0 == w1 && i != 0); - if (w0 < w1) - { - x = a + n3; - y = a; - sign = 1; - } - else - { - x = a; - y = a + n3; - } - mpn_sub_n (p, x, y, n2); - } - p[n2] = w; - - w = b[n2]; - if (w != 0) - w -= mpn_sub_n (p + n3, b, b + n3, n2); - else - { - i = n2; - do - { - --i; - w0 = b[i]; - w1 = b[n3+i]; - } - while (w0 == w1 && i != 0); - if (w0 < w1) - { - x = b + n3; - y = b; - sign ^= 1; - } - else - { - x = b; - y = b + n3; - } - mpn_sub_n (p + n3, x, y, n2); - } - p[n] = w; - - n1 = n + 1; - if (n2 < KARATSUBA_MUL_THRESHOLD) - { - if (n3 < KARATSUBA_MUL_THRESHOLD) - { - mpn_mul_basecase (ws, p, n3, p + n3, n3); - mpn_mul_basecase (p, a, n3, b, n3); - } - else - { - mpn_kara_mul_n (ws, p, p + n3, n3, ws + n1); - mpn_kara_mul_n (p, a, b, n3, ws + n1); - } - mpn_mul_basecase (p + n1, a + n3, n2, b + n3, n2); - } - else - { - mpn_kara_mul_n (ws, p, p + n3, n3, ws + n1); - mpn_kara_mul_n (p, a, b, n3, ws + n1); - mpn_kara_mul_n (p + n1, a + n3, b + n3, n2, ws + n1); - } - - if (sign) - mpn_add_n (ws, p, ws, n1); - else - mpn_sub_n (ws, p, ws, n1); - - nm1 = n - 1; - if (mpn_add_n (ws, p + n1, ws, nm1)) - { - mp_limb_t x = ws[nm1] + 1; - ws[nm1] = x; - if (x == 0) - ++ws[n]; - } - if (mpn_add_n (p + n3, p + n3, ws, n1)) - { - mp_limb_t x; - i = n1 + n3; - do - { - x = p[i] + 1; - p[i] = x; - ++i; - } while (x == 0); - } - } - else - { - /* Even length. */ - mp_limb_t t; - - i = n2; - do - { - --i; - w0 = a[i]; - w1 = a[n2+i]; - } - while (w0 == w1 && i != 0); - sign = 0; - if (w0 < w1) - { - x = a + n2; - y = a; - sign = 1; - } - else - { - x = a; - y = a + n2; - } - mpn_sub_n (p, x, y, n2); - - i = n2; - do - { - --i; - w0 = b[i]; - w1 = b[n2+i]; - } - while (w0 == w1 && i != 0); - if (w0 < w1) - { - x = b + n2; - y = b; - sign ^= 1; - } - else - { - x = b; - y = b + n2; - } - mpn_sub_n (p + n2, x, y, n2); - - /* Pointwise products. */ - if (n2 < KARATSUBA_MUL_THRESHOLD) - { - mpn_mul_basecase (ws, p, n2, p + n2, n2); - mpn_mul_basecase (p, a, n2, b, n2); - mpn_mul_basecase (p + n, a + n2, n2, b + n2, n2); - } - else - { - mpn_kara_mul_n (ws, p, p + n2, n2, ws + n); - mpn_kara_mul_n (p, a, b, n2, ws + n); - mpn_kara_mul_n (p + n, a + n2, b + n2, n2, ws + n); - } - - /* Interpolate. */ - if (sign) - w = mpn_add_n (ws, p, ws, n); - else - w = -mpn_sub_n (ws, p, ws, n); - w += mpn_add_n (ws, p + n, ws, n); - w += mpn_add_n (p + n2, p + n2, ws, n); - /* TO DO: could put "if (w) { ... }" here. - * Less work but badly predicted branch. - * No measurable difference in speed on Alpha. - */ - i = n + n2; - t = p[i] + w; - p[i] = t; - if (t < w) - { - do - { - ++i; - w = p[i] + 1; - p[i] = w; - } - while (w == 0); - } - } -} - -void -#if __STDC__ -mpn_kara_sqr_n (mp_ptr p, mp_srcptr a, mp_size_t n, mp_ptr ws) -#else -mpn_kara_sqr_n (p, a, n, ws) - mp_ptr p; - mp_srcptr a; - mp_size_t n; - mp_ptr ws; -#endif -{ - mp_limb_t i, sign, w, w0, w1; - mp_size_t n2; - mp_srcptr x, y; - - n2 = n >> 1; - ASSERT (n2 > 0); - - if (n & 1) - { - /* Odd length. */ - mp_size_t n1, n3, nm1; - - n3 = n - n2; - - sign = 0; - w = a[n2]; - if (w != 0) - w -= mpn_sub_n (p, a, a + n3, n2); - else - { - i = n2; - do - { - --i; - w0 = a[i]; - w1 = a[n3+i]; - } - while (w0 == w1 && i != 0); - if (w0 < w1) - { - x = a + n3; - y = a; - sign = 1; - } - else - { - x = a; - y = a + n3; - } - mpn_sub_n (p, x, y, n2); - } - p[n2] = w; - - w = a[n2]; - if (w != 0) - w -= mpn_sub_n (p + n3, a, a + n3, n2); - else - { - i = n2; - do - { - --i; - w0 = a[i]; - w1 = a[n3+i]; - } - while (w0 == w1 && i != 0); - if (w0 < w1) - { - x = a + n3; - y = a; - sign ^= 1; - } - else - { - x = a; - y = a + n3; - } - mpn_sub_n (p + n3, x, y, n2); - } - p[n] = w; - - n1 = n + 1; - if (n2 < KARATSUBA_SQR_THRESHOLD) - { - if (n3 < KARATSUBA_SQR_THRESHOLD) - { - mpn_sqr_basecase (ws, p, n3); - mpn_sqr_basecase (p, a, n3); - } - else - { - mpn_kara_sqr_n (ws, p, n3, ws + n1); - mpn_kara_sqr_n (p, a, n3, ws + n1); - } - mpn_sqr_basecase (p + n1, a + n3, n2); - } - else - { - mpn_kara_sqr_n (ws, p, n3, ws + n1); - mpn_kara_sqr_n (p, a, n3, ws + n1); - mpn_kara_sqr_n (p + n1, a + n3, n2, ws + n1); - } - - if (sign) - mpn_add_n (ws, p, ws, n1); - else - mpn_sub_n (ws, p, ws, n1); - - nm1 = n - 1; - if (mpn_add_n (ws, p + n1, ws, nm1)) - { - mp_limb_t x = ws[nm1] + 1; - ws[nm1] = x; - if (x == 0) - ++ws[n]; - } - if (mpn_add_n (p + n3, p + n3, ws, n1)) - { - mp_limb_t x; - i = n1 + n3; - do - { - x = p[i] + 1; - p[i] = x; - ++i; - } while (x == 0); - } - } - else - { - /* Even length. */ - mp_limb_t t; - - i = n2; - do - { - --i; - w0 = a[i]; - w1 = a[n2+i]; - } - while (w0 == w1 && i != 0); - sign = 0; - if (w0 < w1) - { - x = a + n2; - y = a; - sign = 1; - } - else - { - x = a; - y = a + n2; - } - mpn_sub_n (p, x, y, n2); - - i = n2; - do - { - --i; - w0 = a[i]; - w1 = a[n2+i]; - } - while (w0 == w1 && i != 0); - if (w0 < w1) - { - x = a + n2; - y = a; - sign ^= 1; - } - else - { - x = a; - y = a + n2; - } - mpn_sub_n (p + n2, x, y, n2); - - /* Pointwise products. */ - if (n2 < KARATSUBA_SQR_THRESHOLD) - { - mpn_sqr_basecase (ws, p, n2); - mpn_sqr_basecase (p, a, n2); - mpn_sqr_basecase (p + n, a + n2, n2); - } - else - { - mpn_kara_sqr_n (ws, p, n2, ws + n); - mpn_kara_sqr_n (p, a, n2, ws + n); - mpn_kara_sqr_n (p + n, a + n2, n2, ws + n); - } - - /* Interpolate. */ - if (sign) - w = mpn_add_n (ws, p, ws, n); - else - w = -mpn_sub_n (ws, p, ws, n); - w += mpn_add_n (ws, p + n, ws, n); - w += mpn_add_n (p + n2, p + n2, ws, n); - /* TO DO: could put "if (w) { ... }" here. - * Less work but badly predicted branch. - * No measurable difference in speed on Alpha. - */ - i = n + n2; - t = p[i] + w; - p[i] = t; - if (t < w) - { - do - { - ++i; - w = p[i] + 1; - p[i] = w; - } - while (w == 0); - } - } -} - -/*-- add2Times -------------------------------------------------------------*/ - -/* z[] = x[] + 2 * y[] - Note that z and x might point to the same vectors. */ -#ifdef USE_MORE_MPN -static inline mp_limb_t -#if __STDC__ -add2Times (mp_ptr z, mp_srcptr x, mp_srcptr y, mp_size_t n) -#else -add2Times (z, x, y, n) - mp_ptr z; - mp_srcptr x; - mp_srcptr y; - mp_size_t n; -#endif -{ - mp_ptr t; - mp_limb_t c; - TMP_DECL (marker); - TMP_MARK (marker); - t = (mp_ptr) TMP_ALLOC (n * BYTES_PER_MP_LIMB); - c = mpn_lshift (t, y, n, 1); - c += mpn_add_n (z, x, t, n); - TMP_FREE (marker); - return c; -} -#else - -static mp_limb_t -#if __STDC__ -add2Times (mp_ptr z, mp_srcptr x, mp_srcptr y, mp_size_t n) -#else -add2Times (z, x, y, n) - mp_ptr z; - mp_srcptr x; - mp_srcptr y; - mp_size_t n; -#endif -{ - mp_limb_t c, v, w; - - ASSERT (n > 0); - v = *x; w = *y; - c = w >> (BITS_PER_MP_LIMB - 1); - w <<= 1; - v += w; - c += v < w; - *z = v; - ++x; ++y; ++z; - while (--n) - { - v = *x; - w = *y; - v += c; - c = v < c; - c += w >> (BITS_PER_MP_LIMB - 1); - w <<= 1; - v += w; - c += v < w; - *z = v; - ++x; ++y; ++z; - } - - return c; -} -#endif - -/*-- evaluate3 -------------------------------------------------------------*/ - -/* Evaluates: - * ph := 4*A+2*B+C - * p1 := A+B+C - * p2 := A+2*B+4*C - * where: - * ph[], p1[], p2[], A[] and B[] all have length len, - * C[] has length len2 with len-len2 = 0, 1 or 2. - * Returns top words (overflow) at pth, pt1 and pt2 respectively. - */ -#ifdef USE_MORE_MPN -static void -#if __STDC__ -evaluate3 (mp_ptr ph, mp_ptr p1, mp_ptr p2, mp_ptr pth, mp_ptr pt1, mp_ptr pt2, - mp_srcptr A, mp_srcptr B, mp_srcptr C, mp_size_t len, mp_size_t len2) -#else -evaluate3 (ph, p1, p2, pth, pt1, pt2, - A, B, C, len, len2) - mp_ptr ph; - mp_ptr p1; - mp_ptr p2; - mp_ptr pth; - mp_ptr pt1; - mp_ptr pt2; - mp_srcptr A; - mp_srcptr B; - mp_srcptr C; - mp_size_t len; - mp_size_t len2; -#endif -{ - mp_limb_t c, d, e; - - ASSERT (len - len2 <= 2); - - e = mpn_lshift (p1, B, len, 1); - - c = mpn_lshift (ph, A, len, 2); - c += e + mpn_add_n (ph, ph, p1, len); - d = mpn_add_n (ph, ph, C, len2); - if (len2 == len) c += d; else c += mpn_add_1 (ph + len2, ph + len2, len-len2, d); - ASSERT (c < 7); - *pth = c; - - c = mpn_lshift (p2, C, len2, 2); -#if 1 - if (len2 != len) { p2[len-1] = 0; p2[len2] = c; c = 0; } - c += e + mpn_add_n (p2, p2, p1, len); -#else - d = mpn_add_n (p2, p2, p1, len2); - c += d; - if (len2 != len) c = mpn_add_1 (p2+len2, p1+len2, len-len2, c); - c += e; -#endif - c += mpn_add_n (p2, p2, A, len); - ASSERT (c < 7); - *pt2 = c; - - c = mpn_add_n (p1, A, B, len); - d = mpn_add_n (p1, p1, C, len2); - if (len2 == len) c += d; - else c += mpn_add_1 (p1+len2, p1+len2, len-len2, d); - ASSERT (c < 3); - *pt1 = c; - -} - -#else - -static void -#if __STDC__ -evaluate3 (mp_ptr ph, mp_ptr p1, mp_ptr p2, mp_ptr pth, mp_ptr pt1, mp_ptr pt2, - mp_srcptr A, mp_srcptr B, mp_srcptr C, mp_size_t l, mp_size_t ls) -#else -evaluate3 (ph, p1, p2, pth, pt1, pt2, - A, B, C, l, ls) - mp_ptr ph; - mp_ptr p1; - mp_ptr p2; - mp_ptr pth; - mp_ptr pt1; - mp_ptr pt2; - mp_srcptr A; - mp_srcptr B; - mp_srcptr C; - mp_size_t l; - mp_size_t ls; -#endif -{ - mp_limb_t a,b,c, i, t, th,t1,t2, vh,v1,v2; - - ASSERT (l - ls <= 2); - - th = t1 = t2 = 0; - for (i = 0; i < l; ++i) - { - a = *A; - b = *B; - c = i < ls ? *C : 0; - - /* TO DO: choose one of the following alternatives. */ -#if 0 - t = a << 2; - vh = th + t; - th = vh < t; - th += a >> (BITS_PER_MP_LIMB - 2); - t = b << 1; - vh += t; - th += vh < t; - th += b >> (BITS_PER_MP_LIMB - 1); - vh += c; - th += vh < c; -#else - vh = th + c; - th = vh < c; - t = b << 1; - vh += t; - th += vh < t; - th += b >> (BITS_PER_MP_LIMB - 1); - t = a << 2; - vh += t; - th += vh < t; - th += a >> (BITS_PER_MP_LIMB - 2); -#endif - - v1 = t1 + a; - t1 = v1 < a; - v1 += b; - t1 += v1 < b; - v1 += c; - t1 += v1 < c; - - v2 = t2 + a; - t2 = v2 < a; - t = b << 1; - v2 += t; - t2 += v2 < t; - t2 += b >> (BITS_PER_MP_LIMB - 1); - t = c << 2; - v2 += t; - t2 += v2 < t; - t2 += c >> (BITS_PER_MP_LIMB - 2); - - *ph = vh; - *p1 = v1; - *p2 = v2; - - ++A; ++B; ++C; - ++ph; ++p1; ++p2; - } - - ASSERT (th < 7); - ASSERT (t1 < 3); - ASSERT (t2 < 7); - - *pth = th; - *pt1 = t1; - *pt2 = t2; -} -#endif - - -/*-- interpolate3 ----------------------------------------------------------*/ - -/* Interpolates B, C, D (in-place) from: - * 16*A+8*B+4*C+2*D+E - * A+B+C+D+E - * A+2*B+4*C+8*D+16*E - * where: - * A[], B[], C[] and D[] all have length l, - * E[] has length ls with l-ls = 0, 2 or 4. - * - * Reads top words (from earlier overflow) from ptb, ptc and ptd, - * and returns new top words there. - */ - -#ifdef USE_MORE_MPN -static void -#if __STDC__ -interpolate3 (mp_srcptr A, mp_ptr B, mp_ptr C, mp_ptr D, mp_srcptr E, - mp_ptr ptb, mp_ptr ptc, mp_ptr ptd, mp_size_t len, mp_size_t len2) -#else -interpolate3 (A, B, C, D, E, - ptb, ptc, ptd, len, len2) - mp_srcptr A; - mp_ptr B; - mp_ptr C; - mp_ptr D; - mp_srcptr E; - mp_ptr ptb; - mp_ptr ptc; - mp_ptr ptd; - mp_size_t len; - mp_size_t len2; -#endif -{ - mp_ptr ws; - mp_limb_t t, tb,tc,td; - TMP_DECL (marker); - TMP_MARK (marker); - - ASSERT (len - len2 == 0 || len - len2 == 2 || len - len2 == 4); - - /* Let x1, x2, x3 be the values to interpolate. We have: - * b = 16*a + 8*x1 + 4*x2 + 2*x3 + e - * c = a + x1 + x2 + x3 + e - * d = a + 2*x1 + 4*x2 + 8*x3 + 16*e - */ - - ws = (mp_ptr) TMP_ALLOC (len * BYTES_PER_MP_LIMB); - - tb = *ptb; tc = *ptc; td = *ptd; - - - /* b := b - 16*a - e - * c := c - a - e - * d := d - a - 16*e - */ - - t = mpn_lshift (ws, A, len, 4); - tb -= t + mpn_sub_n (B, B, ws, len); - t = mpn_sub_n (B, B, E, len2); - if (len2 == len) tb -= t; - else tb -= mpn_sub_1 (B+len2, B+len2, len-len2, t); - - tc -= mpn_sub_n (C, C, A, len); - t = mpn_sub_n (C, C, E, len2); - if (len2 == len) tc -= t; - else tc -= mpn_sub_1 (C+len2, C+len2, len-len2, t); - - t = mpn_lshift (ws, E, len2, 4); - t += mpn_add_n (ws, ws, A, len2); -#if 1 - if (len2 != len) t = mpn_add_1 (ws+len2, A+len2, len-len2, t); - td -= t + mpn_sub_n (D, D, ws, len); -#else - t += mpn_sub_n (D, D, ws, len2); - if (len2 != len) { - t = mpn_sub_1 (D+len2, D+len2, len-len2, t); - t += mpn_sub_n (D+len2, D+len2, A+len2, len-len2); - } /* end if/else */ - td -= t; -#endif - - - /* b, d := b + d, b - d */ - -#ifdef HAVE_MPN_ADD_SUB_N - /* #error TO DO ... */ -#else - t = tb + td + mpn_add_n (ws, B, D, len); - td = tb - td - mpn_sub_n (D, B, D, len); - tb = t; - MPN_COPY (B, ws, len); -#endif - - /* b := b-8*c */ - t = 8 * tc + mpn_lshift (ws, C, len, 3); - tb -= t + mpn_sub_n (B, B, ws, len); - - /* c := 2*c - b */ - tc = 2 * tc + mpn_lshift (C, C, len, 1); - tc -= tb + mpn_sub_n (C, C, B, len); - - /* d := d/3 */ - td = (td - mpn_divexact_by3 (D, D, len)) * INVERSE_3; - - /* b, d := b + d, b - d */ -#ifdef HAVE_MPN_ADD_SUB_N - /* #error TO DO ... */ -#else - t = tb + td + mpn_add_n (ws, B, D, len); - td = tb - td - mpn_sub_n (D, B, D, len); - tb = t; - MPN_COPY (B, ws, len); -#endif - - /* Now: - * b = 4*x1 - * c = 2*x2 - * d = 4*x3 - */ - - ASSERT(!(*B & 3)); - mpn_rshift (B, B, len, 2); - B[len-1] |= tb<<(BITS_PER_MP_LIMB-2); - ASSERT((long)tb >= 0); - tb >>= 2; - - ASSERT(!(*C & 1)); - mpn_rshift (C, C, len, 1); - C[len-1] |= tc<<(BITS_PER_MP_LIMB-1); - ASSERT((long)tc >= 0); - tc >>= 1; - - ASSERT(!(*D & 3)); - mpn_rshift (D, D, len, 2); - D[len-1] |= td<<(BITS_PER_MP_LIMB-2); - ASSERT((long)td >= 0); - td >>= 2; - -#if WANT_ASSERT - ASSERT (tb < 2); - if (len == len2) - { - ASSERT (tc < 3); - ASSERT (td < 2); - } - else - { - ASSERT (tc < 2); - ASSERT (!td); - } -#endif - - *ptb = tb; - *ptc = tc; - *ptd = td; - - TMP_FREE (marker); -} - -#else - -static void -#if __STDC__ -interpolate3 (mp_srcptr A, mp_ptr B, mp_ptr C, mp_ptr D, mp_srcptr E, - mp_ptr ptb, mp_ptr ptc, mp_ptr ptd, mp_size_t l, mp_size_t ls) -#else -interpolate3 (A, B, C, D, E, - ptb, ptc, ptd, l, ls) - mp_srcptr A; - mp_ptr B; - mp_ptr C; - mp_ptr D; - mp_srcptr E; - mp_ptr ptb; - mp_ptr ptc; - mp_ptr ptd; - mp_size_t l; - mp_size_t ls; -#endif -{ - mp_limb_t a,b,c,d,e,t, i, sb,sc,sd, ob,oc,od; - const mp_limb_t maskOffHalf = (~(mp_limb_t) 0) << (BITS_PER_MP_LIMB >> 1); - -#if WANT_ASSERT - t = l - ls; - ASSERT (t == 0 || t == 2 || t == 4); -#endif - - sb = sc = sd = 0; - for (i = 0; i < l; ++i) - { - mp_limb_t tb, tc, td, tt; - - a = *A; - b = *B; - c = *C; - d = *D; - e = i < ls ? *E : 0; - - /* Let x1, x2, x3 be the values to interpolate. We have: - * b = 16*a + 8*x1 + 4*x2 + 2*x3 + e - * c = a + x1 + x2 + x3 + e - * d = a + 2*x1 + 4*x2 + 8*x3 + 16*e - */ - - /* b := b - 16*a - e - * c := c - a - e - * d := d - a - 16*e - */ - t = a << 4; - tb = -(a >> (BITS_PER_MP_LIMB - 4)) - (b < t); - b -= t; - tb -= b < e; - b -= e; - tc = -(c < a); - c -= a; - tc -= c < e; - c -= e; - td = -(d < a); - d -= a; - t = e << 4; - td = td - (e >> (BITS_PER_MP_LIMB - 4)) - (d < t); - d -= t; - - /* b, d := b + d, b - d */ - t = b + d; - tt = tb + td + (t < b); - td = tb - td - (b < d); - d = b - d; - b = t; - tb = tt; - - /* b := b-8*c */ - t = c << 3; - tb = tb - (tc << 3) - (c >> (BITS_PER_MP_LIMB - 3)) - (b < t); - b -= t; - - /* c := 2*c - b */ - t = c << 1; - tc = (tc << 1) + (c >> (BITS_PER_MP_LIMB - 1)) - tb - (t < b); - c = t - b; - - /* d := d/3 */ - d *= INVERSE_3; - td = td - (d >> (BITS_PER_MP_LIMB - 1)) - (d*3 < d); - td *= INVERSE_3; - - /* b, d := b + d, b - d */ - t = b + d; - tt = tb + td + (t < b); - td = tb - td - (b < d); - d = b - d; - b = t; - tb = tt; - - /* Now: - * b = 4*x1 - * c = 2*x2 - * d = 4*x3 - */ - - /* sb has period 2. */ - b += sb; - tb += b < sb; - sb &= maskOffHalf; - sb |= sb >> (BITS_PER_MP_LIMB >> 1); - sb += tb; - - /* sc has period 1. */ - c += sc; - tc += c < sc; - /* TO DO: choose one of the following alternatives. */ -#if 1 - sc = (mp_limb_t)((long)sc >> (BITS_PER_MP_LIMB - 1)); - sc += tc; -#else - sc = tc - ((long)sc < 0L); -#endif - - /* sd has period 2. */ - d += sd; - td += d < sd; - sd &= maskOffHalf; - sd |= sd >> (BITS_PER_MP_LIMB >> 1); - sd += td; - - if (i != 0) - { - B[-1] = ob | b << (BITS_PER_MP_LIMB - 2); - C[-1] = oc | c << (BITS_PER_MP_LIMB - 1); - D[-1] = od | d << (BITS_PER_MP_LIMB - 2); - } - ob = b >> 2; - oc = c >> 1; - od = d >> 2; - - ++A; ++B; ++C; ++D; ++E; - } - - /* Handle top words. */ - b = *ptb; - c = *ptc; - d = *ptd; - - t = b + d; - d = b - d; - b = t; - b -= c << 3; - c = (c << 1) - b; - d *= INVERSE_3; - t = b + d; - d = b - d; - b = t; - - b += sb; - c += sc; - d += sd; - - B[-1] = ob | b << (BITS_PER_MP_LIMB - 2); - C[-1] = oc | c << (BITS_PER_MP_LIMB - 1); - D[-1] = od | d << (BITS_PER_MP_LIMB - 2); - - b >>= 2; - c >>= 1; - d >>= 2; - -#if WANT_ASSERT - ASSERT (b < 2); - if (l == ls) - { - ASSERT (c < 3); - ASSERT (d < 2); - } - else - { - ASSERT (c < 2); - ASSERT (!d); - } -#endif - - *ptb = b; - *ptc = c; - *ptd = d; -} -#endif - - -/*-- mpn_toom3_mul_n --------------------------------------------------------------*/ - -/* Multiplies using 5 mults of one third size and so on recursively. - * p[0..2*n-1] := product of a[0..n-1] and b[0..n-1]. - * No overlap of p[...] with a[...] or b[...]. - * ws is workspace. - */ - -/* TO DO: If TOOM3_MUL_THRESHOLD is much bigger than KARATSUBA_MUL_THRESHOLD then the - * recursion in mpn_toom3_mul_n() will always bottom out with mpn_kara_mul_n() - * because the "n < KARATSUBA_MUL_THRESHOLD" test here will always be false. - */ - -#define TOOM3_MUL_REC(p, a, b, n, ws) \ - do { \ - if (n < KARATSUBA_MUL_THRESHOLD) \ - mpn_mul_basecase (p, a, n, b, n); \ - else if (n < TOOM3_MUL_THRESHOLD) \ - mpn_kara_mul_n (p, a, b, n, ws); \ - else \ - mpn_toom3_mul_n (p, a, b, n, ws); \ - } while (0) - -void -#if __STDC__ -mpn_toom3_mul_n (mp_ptr p, mp_srcptr a, mp_srcptr b, mp_size_t n, mp_ptr ws) -#else -mpn_toom3_mul_n (p, a, b, n, ws) - mp_ptr p; - mp_srcptr a; - mp_srcptr b; - mp_size_t n; - mp_ptr ws; -#endif -{ - mp_limb_t cB,cC,cD, dB,dC,dD, tB,tC,tD; - mp_limb_t *A,*B,*C,*D,*E, *W; - mp_size_t l,l2,l3,l4,l5,ls; - - /* Break n words into chunks of size l, l and ls. - * n = 3*k => l = k, ls = k - * n = 3*k+1 => l = k+1, ls = k-1 - * n = 3*k+2 => l = k+1, ls = k - */ - { - mp_limb_t m; - - ASSERT (n >= TOOM3_MUL_THRESHOLD); - l = ls = n / 3; - m = n - l * 3; - if (m != 0) - ++l; - if (m == 1) - --ls; - - l2 = l * 2; - l3 = l * 3; - l4 = l * 4; - l5 = l * 5; - A = p; - B = ws; - C = p + l2; - D = ws + l2; - E = p + l4; - W = ws + l4; - } - - /** First stage: evaluation at points 0, 1/2, 1, 2, oo. **/ - evaluate3 (A, B, C, &cB, &cC, &cD, a, a + l, a + l2, l, ls); - evaluate3 (A + l, B + l, C + l, &dB, &dC, &dD, b, b + l, b + l2, l, ls); - - /** Second stage: pointwise multiplies. **/ - TOOM3_MUL_REC(D, C, C + l, l, W); - tD = cD*dD; - if (cD) tD += mpn_addmul_1 (D + l, C + l, l, cD); - if (dD) tD += mpn_addmul_1 (D + l, C, l, dD); - ASSERT (tD < 49); - TOOM3_MUL_REC(C, B, B + l, l, W); - tC = cC*dC; - /* TO DO: choose one of the following alternatives. */ -#if 0 - if (cC) tC += mpn_addmul_1 (C + l, B + l, l, cC); - if (dC) tC += mpn_addmul_1 (C + l, B, l, dC); -#else - if (cC) - { - if (cC == 1) tC += mpn_add_n (C + l, C + l, B + l, l); - else tC += add2Times (C + l, C + l, B + l, l); - } - if (dC) - { - if (dC == 1) tC += mpn_add_n (C + l, C + l, B, l); - else tC += add2Times (C + l, C + l, B, l); - } -#endif - ASSERT (tC < 9); - TOOM3_MUL_REC(B, A, A + l, l, W); - tB = cB*dB; - if (cB) tB += mpn_addmul_1 (B + l, A + l, l, cB); - if (dB) tB += mpn_addmul_1 (B + l, A, l, dB); - ASSERT (tB < 49); - TOOM3_MUL_REC(A, a, b, l, W); - TOOM3_MUL_REC(E, a + l2, b + l2, ls, W); - - /** Third stage: interpolation. **/ - interpolate3 (A, B, C, D, E, &tB, &tC, &tD, l2, ls << 1); - - /** Final stage: add up the coefficients. **/ - { - mp_limb_t i, x, y; - tB += mpn_add_n (p + l, p + l, B, l2); - tD += mpn_add_n (p + l3, p + l3, D, l2); - mpn_incr_u (p + l3, tB); - mpn_incr_u (p + l4, tC); - mpn_incr_u (p + l5, tD); - } -} - -/*-- mpn_toom3_sqr_n --------------------------------------------------------------*/ - -/* Like previous function but for squaring */ - -#define TOOM3_SQR_REC(p, a, n, ws) \ - do { \ - if (n < KARATSUBA_SQR_THRESHOLD) \ - mpn_sqr_basecase (p, a, n); \ - else if (n < TOOM3_SQR_THRESHOLD) \ - mpn_kara_sqr_n (p, a, n, ws); \ - else \ - mpn_toom3_sqr_n (p, a, n, ws); \ - } while (0) - -void -#if __STDC__ -mpn_toom3_sqr_n (mp_ptr p, mp_srcptr a, mp_size_t n, mp_ptr ws) -#else -mpn_toom3_sqr_n (p, a, n, ws) - mp_ptr p; - mp_srcptr a; - mp_size_t n; - mp_ptr ws; -#endif -{ - mp_limb_t cB,cC,cD, tB,tC,tD; - mp_limb_t *A,*B,*C,*D,*E, *W; - mp_size_t l,l2,l3,l4,l5,ls; - - /* Break n words into chunks of size l, l and ls. - * n = 3*k => l = k, ls = k - * n = 3*k+1 => l = k+1, ls = k-1 - * n = 3*k+2 => l = k+1, ls = k - */ - { - mp_limb_t m; - - ASSERT (n >= TOOM3_MUL_THRESHOLD); - l = ls = n / 3; - m = n - l * 3; - if (m != 0) - ++l; - if (m == 1) - --ls; - - l2 = l * 2; - l3 = l * 3; - l4 = l * 4; - l5 = l * 5; - A = p; - B = ws; - C = p + l2; - D = ws + l2; - E = p + l4; - W = ws + l4; - } - - /** First stage: evaluation at points 0, 1/2, 1, 2, oo. **/ - evaluate3 (A, B, C, &cB, &cC, &cD, a, a + l, a + l2, l, ls); - - /** Second stage: pointwise multiplies. **/ - TOOM3_SQR_REC(D, C, l, W); - tD = cD*cD; - if (cD) tD += mpn_addmul_1 (D + l, C, l, 2*cD); - ASSERT (tD < 49); - TOOM3_SQR_REC(C, B, l, W); - tC = cC*cC; - /* TO DO: choose one of the following alternatives. */ -#if 0 - if (cC) tC += mpn_addmul_1 (C + l, B, l, 2*cC); -#else - if (cC >= 1) - { - tC += add2Times (C + l, C + l, B, l); - if (cC == 2) - tC += add2Times (C + l, C + l, B, l); - } -#endif - ASSERT (tC < 9); - TOOM3_SQR_REC(B, A, l, W); - tB = cB*cB; - if (cB) tB += mpn_addmul_1 (B + l, A, l, 2*cB); - ASSERT (tB < 49); - TOOM3_SQR_REC(A, a, l, W); - TOOM3_SQR_REC(E, a + l2, ls, W); - - /** Third stage: interpolation. **/ - interpolate3 (A, B, C, D, E, &tB, &tC, &tD, l2, ls << 1); - - /** Final stage: add up the coefficients. **/ - { - mp_limb_t i, x, y; - tB += mpn_add_n (p + l, p + l, B, l2); - tD += mpn_add_n (p + l3, p + l3, D, l2); - mpn_incr_u (p + l3, tB); - mpn_incr_u (p + l4, tC); - mpn_incr_u (p + l5, tD); - } -} - -void -#if __STDC__ -mpn_mul_n (mp_ptr p, mp_srcptr a, mp_srcptr b, mp_size_t n) -#else -mpn_mul_n (p, a, b, n) - mp_ptr p; - mp_srcptr a; - mp_srcptr b; - mp_size_t n; -#endif -{ - if (n < KARATSUBA_MUL_THRESHOLD) - mpn_mul_basecase (p, a, n, b, n); - else if (n < TOOM3_MUL_THRESHOLD) - { - /* Allocate workspace of fixed size on stack: fast! */ -#if TUNE_PROGRAM_BUILD - mp_limb_t ws[2 * (TOOM3_MUL_THRESHOLD_LIMIT-1) + 2 * BITS_PER_MP_LIMB]; -#else - mp_limb_t ws[2 * (TOOM3_MUL_THRESHOLD-1) + 2 * BITS_PER_MP_LIMB]; -#endif - mpn_kara_mul_n (p, a, b, n, ws); - } -#if WANT_FFT || TUNE_PROGRAM_BUILD - else if (n < FFT_MUL_THRESHOLD) -#else - else -#endif - { - /* Use workspace of unknown size in heap, as stack space may - * be limited. Since n is at least TOOM3_MUL_THRESHOLD, the - * multiplication will take much longer than malloc()/free(). */ - mp_limb_t wsLen, *ws; - wsLen = 2 * n + 3 * BITS_PER_MP_LIMB; - ws = (mp_ptr) (*_mp_allocate_func) ((size_t) wsLen * sizeof (mp_limb_t)); - mpn_toom3_mul_n (p, a, b, n, ws); - (*_mp_free_func) (ws, (size_t) wsLen * sizeof (mp_limb_t)); - } -#if WANT_FFT || TUNE_PROGRAM_BUILD - else - { - mpn_mul_fft_full (p, a, n, b, n); - } -#endif -} diff --git a/rts/gmp/mpn/generic/perfsqr.c b/rts/gmp/mpn/generic/perfsqr.c deleted file mode 100644 index 42ee340..0000000 --- a/rts/gmp/mpn/generic/perfsqr.c +++ /dev/null @@ -1,123 +0,0 @@ -/* mpn_perfect_square_p(u,usize) -- Return non-zero if U is a perfect square, - zero otherwise. - -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 /* for NULL */ -#include "gmp.h" -#include "gmp-impl.h" -#include "longlong.h" - - -/* sq_res_0x100[x mod 0x100] == 1 iff x mod 0x100 is a quadratic residue - modulo 0x100. */ -static unsigned char const sq_res_0x100[0x100] = -{ - 1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0, - 0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0, - 1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0, - 0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0, - 0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0, - 0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0, - 0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0, - 0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0, -}; - -int -#if __STDC__ -mpn_perfect_square_p (mp_srcptr up, mp_size_t usize) -#else -mpn_perfect_square_p (up, usize) - mp_srcptr up; - mp_size_t usize; -#endif -{ - mp_limb_t rem; - mp_ptr root_ptr; - int res; - TMP_DECL (marker); - - /* The first test excludes 55/64 (85.9%) of the perfect square candidates - in O(1) time. */ - if ((sq_res_0x100[(unsigned int) up[0] % 0x100] & 1) == 0) - return 0; - -#if defined (PP) - /* The second test excludes 30652543/30808063 (99.5%) of the remaining - perfect square candidates in O(n) time. */ - - /* Firstly, compute REM = A mod PP. */ - if (UDIV_TIME > (2 * UMUL_TIME + 6)) - rem = mpn_preinv_mod_1 (up, usize, (mp_limb_t) PP, (mp_limb_t) PP_INVERTED); - else - rem = mpn_mod_1 (up, usize, (mp_limb_t) PP); - - /* Now decide if REM is a quadratic residue modulo the factors in PP. */ - - /* If A is just a few limbs, computing the square root does not take long - time, so things might run faster if we limit this loop according to the - size of A. */ - -#if BITS_PER_MP_LIMB == 64 - if (((CNST_LIMB(0x12DD703303AED3) >> rem % 53) & 1) == 0) - return 0; - if (((CNST_LIMB(0x4351B2753DF) >> rem % 47) & 1) == 0) - return 0; - if (((CNST_LIMB(0x35883A3EE53) >> rem % 43) & 1) == 0) - return 0; - if (((CNST_LIMB(0x1B382B50737) >> rem % 41) & 1) == 0) - return 0; - if (((CNST_LIMB(0x165E211E9B) >> rem % 37) & 1) == 0) - return 0; - if (((CNST_LIMB(0x121D47B7) >> rem % 31) & 1) == 0) - return 0; -#endif - if (((0x13D122F3L >> rem % 29) & 1) == 0) - return 0; - if (((0x5335FL >> rem % 23) & 1) == 0) - return 0; - if (((0x30AF3L >> rem % 19) & 1) == 0) - return 0; - if (((0x1A317L >> rem % 17) & 1) == 0) - return 0; - if (((0x161BL >> rem % 13) & 1) == 0) - return 0; - if (((0x23BL >> rem % 11) & 1) == 0) - return 0; - if (((0x017L >> rem % 7) & 1) == 0) - return 0; - if (((0x13L >> rem % 5) & 1) == 0) - return 0; - if (((0x3L >> rem % 3) & 1) == 0) - return 0; -#endif - - TMP_MARK (marker); - - /* For the third and last test, we finally compute the square root, - to make sure we've really got a perfect square. */ - root_ptr = (mp_ptr) TMP_ALLOC ((usize + 1) / 2 * BYTES_PER_MP_LIMB); - - /* Iff mpn_sqrtrem returns zero, the square is perfect. */ - res = ! mpn_sqrtrem (root_ptr, NULL, up, usize); - TMP_FREE (marker); - return res; -} diff --git a/rts/gmp/mpn/generic/popcount.c b/rts/gmp/mpn/generic/popcount.c deleted file mode 100644 index 387be95..0000000 --- a/rts/gmp/mpn/generic/popcount.c +++ /dev/null @@ -1,93 +0,0 @@ -/* popcount.c - -Copyright (C) 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" - -#if defined __GNUC__ -/* No processor claiming to be SPARC v9 compliant seem to - implement the POPC instruction. Disable pattern for now. */ -#if 0 && defined __sparc_v9__ && BITS_PER_MP_LIMB == 64 -#define popc_limb(a) \ - ({ \ - DItype __res; \ - asm ("popc %1,%0" : "=r" (__res) : "rI" (a)); \ - __res; \ - }) -#endif -#endif - -#ifndef popc_limb - -/* Cool population count of a mp_limb_t. - You have to figure out how this works, I won't tell you! */ - -static inline unsigned int -#if __STDC__ -popc_limb (mp_limb_t x) -#else -popc_limb (x) - mp_limb_t x; -#endif -{ -#if BITS_PER_MP_LIMB == 64 - /* We have to go into some trouble to define these constants. - (For mp_limb_t being `long long'.) */ - mp_limb_t cnst; - cnst = 0xaaaaaaaaL | ((mp_limb_t) 0xaaaaaaaaL << BITS_PER_MP_LIMB/2); - x -= (x & cnst) >> 1; - cnst = 0x33333333L | ((mp_limb_t) 0x33333333L << BITS_PER_MP_LIMB/2); - x = ((x & ~cnst) >> 2) + (x & cnst); - cnst = 0x0f0f0f0fL | ((mp_limb_t) 0x0f0f0f0fL << BITS_PER_MP_LIMB/2); - x = ((x >> 4) + x) & cnst; - x = ((x >> 8) + x); - x = ((x >> 16) + x); - x = ((x >> 32) + x) & 0xff; -#endif -#if BITS_PER_MP_LIMB == 32 - x -= (x & 0xaaaaaaaa) >> 1; - x = ((x >> 2) & 0x33333333L) + (x & 0x33333333L); - x = ((x >> 4) + x) & 0x0f0f0f0fL; - x = ((x >> 8) + x); - x = ((x >> 16) + x) & 0xff; -#endif - return x; -} -#endif - -unsigned long int -#if __STDC__ -mpn_popcount (register mp_srcptr p, register mp_size_t size) -#else -mpn_popcount (p, size) - register mp_srcptr p; - register mp_size_t size; -#endif -{ - unsigned long int popcnt; - mp_size_t i; - - popcnt = 0; - for (i = 0; i < size; i++) - popcnt += popc_limb (p[i]); - - return popcnt; -} diff --git a/rts/gmp/mpn/generic/pre_mod_1.c b/rts/gmp/mpn/generic/pre_mod_1.c deleted file mode 100644 index 2717968..0000000 --- a/rts/gmp/mpn/generic/pre_mod_1.c +++ /dev/null @@ -1,69 +0,0 @@ -/* mpn_preinv_mod_1 (dividend_ptr, dividend_size, divisor_limb, - divisor_limb_inverted) -- - Divide (DIVIDEND_PTR,,DIVIDEND_SIZE) by the normalized DIVISOR_LIMB. - DIVISOR_LIMB_INVERTED should be 2^(2*BITS_PER_MP_LIMB) / DIVISOR_LIMB + - - 2^BITS_PER_MP_LIMB. - Return the single-limb remainder. - -Copyright (C) 1991, 1993, 1994, 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" - -#ifndef UMUL_TIME -#define UMUL_TIME 1 -#endif - -#ifndef UDIV_TIME -#define UDIV_TIME UMUL_TIME -#endif - -mp_limb_t -#if __STDC__ -mpn_preinv_mod_1 (mp_srcptr dividend_ptr, mp_size_t dividend_size, - mp_limb_t divisor_limb, mp_limb_t divisor_limb_inverted) -#else -mpn_preinv_mod_1 (dividend_ptr, dividend_size, divisor_limb, divisor_limb_inverted) - mp_srcptr dividend_ptr; - mp_size_t dividend_size; - mp_limb_t divisor_limb; - mp_limb_t divisor_limb_inverted; -#endif -{ - mp_size_t i; - mp_limb_t n0, r; - int dummy; - - i = dividend_size - 1; - r = dividend_ptr[i]; - - if (r >= divisor_limb) - r = 0; - else - i--; - - for (; i >= 0; i--) - { - n0 = dividend_ptr[i]; - udiv_qrnnd_preinv (dummy, r, r, n0, divisor_limb, divisor_limb_inverted); - } - return r; -} diff --git a/rts/gmp/mpn/generic/random.c b/rts/gmp/mpn/generic/random.c deleted file mode 100644 index dea4e20..0000000 --- a/rts/gmp/mpn/generic/random.c +++ /dev/null @@ -1,43 +0,0 @@ -/* mpn_random -- Generate random numbers. - -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 "urandom.h" - -void -#if __STDC__ -mpn_random (mp_ptr res_ptr, mp_size_t size) -#else -mpn_random (res_ptr, size) - mp_ptr res_ptr; - mp_size_t size; -#endif -{ - mp_size_t i; - - for (i = 0; i < size; i++) - res_ptr[i] = urandom (); - - /* Make sure the most significant limb is non-zero. */ - while (res_ptr[size - 1] == 0) - res_ptr[size - 1] = urandom (); -} diff --git a/rts/gmp/mpn/generic/random2.c b/rts/gmp/mpn/generic/random2.c deleted file mode 100644 index 86682f8..0000000 --- a/rts/gmp/mpn/generic/random2.c +++ /dev/null @@ -1,105 +0,0 @@ -/* mpn_random2 -- Generate random numbers with relatively long strings - of ones and zeroes. Suitable for border testing. - -Copyright (C) 1992, 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" - -#if defined (__hpux) || defined (__alpha) || defined (__svr4__) || defined (__SVR4) -/* HPUX lacks random(). DEC OSF/1 1.2 random() returns a double. */ -long mrand48 (); -static inline long -random () -{ - return mrand48 (); -} -#elif defined(_WIN32) && !(defined(__CYGWIN__) || defined(__CYGWIN32__)) -/* MS CRT supplies just the poxy rand(), with an upper bound of 0x7fff */ -static inline unsigned long -random () -{ - return rand () ^ (rand () << 16) ^ (rand() << 32); -} - -#else -long random (); -#endif - -/* It's a bit tricky to get this right, so please test the code well - if you hack with it. Some early versions of the function produced - random numbers with the leading limb == 0, and some versions never - made the most significant bit set. */ - -void -#if __STDC__ -mpn_random2 (mp_ptr res_ptr, mp_size_t size) -#else -mpn_random2 (res_ptr, size) - mp_ptr res_ptr; - mp_size_t size; -#endif -{ - int n_bits; - int bit_pos; - mp_size_t limb_pos; - unsigned int ran; - mp_limb_t limb; - - limb = 0; - - /* Start off in a random bit position in the most significant limb. */ - bit_pos = random () & (BITS_PER_MP_LIMB - 1); - - /* Least significant bit of RAN chooses string of ones/string of zeroes. - Make most significant limb be non-zero by setting bit 0 of RAN. */ - ran = random () | 1; - - for (limb_pos = size - 1; limb_pos >= 0; ) - { - n_bits = (ran >> 1) % BITS_PER_MP_LIMB + 1; - if ((ran & 1) != 0) - { - /* Generate a string of ones. */ - if (n_bits >= bit_pos) - { - res_ptr[limb_pos--] = limb | ((((mp_limb_t) 2) << bit_pos) - 1); - bit_pos += BITS_PER_MP_LIMB; - limb = (~(mp_limb_t) 0) << (bit_pos - n_bits); - } - else - { - limb |= ((((mp_limb_t) 1) << n_bits) - 1) << (bit_pos - n_bits + 1); - } - } - else - { - /* Generate a string of zeroes. */ - if (n_bits >= bit_pos) - { - res_ptr[limb_pos--] = limb; - limb = 0; - bit_pos += BITS_PER_MP_LIMB; - } - } - bit_pos -= n_bits; - ran = random (); - } -} diff --git a/rts/gmp/mpn/generic/rshift.c b/rts/gmp/mpn/generic/rshift.c deleted file mode 100644 index 59caf73..0000000 --- a/rts/gmp/mpn/generic/rshift.c +++ /dev/null @@ -1,88 +0,0 @@ -/* mpn_rshift -- Shift right a low-level natural-number 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" - -/* Shift U (pointed to by UP and USIZE limbs long) CNT bits to the right - and store the USIZE least significant limbs of the result at WP. - The bits shifted out to the right are returned. - - Argument constraints: - 1. 0 < CNT < BITS_PER_MP_LIMB - 2. If the result is to be written over the input, WP must be <= UP. -*/ - -mp_limb_t -#if __STDC__ -mpn_rshift (register mp_ptr wp, - register mp_srcptr up, mp_size_t usize, - register unsigned int cnt) -#else -mpn_rshift (wp, up, usize, cnt) - register mp_ptr wp; - register mp_srcptr up; - mp_size_t usize; - register unsigned int cnt; -#endif -{ - register mp_limb_t high_limb, low_limb; - register unsigned sh_1, sh_2; - register mp_size_t i; - mp_limb_t retval; - -#ifdef DEBUG - if (usize == 0 || cnt == 0) - abort (); -#endif - - sh_1 = cnt; - -#if 0 - if (sh_1 == 0) - { - if (wp != up) - { - /* Copy from low end to high end, to allow specified input/output - overlapping. */ - for (i = 0; i < usize; i++) - wp[i] = up[i]; - } - return usize; - } -#endif - - wp -= 1; - sh_2 = BITS_PER_MP_LIMB - sh_1; - high_limb = up[0]; - retval = high_limb << sh_2; - low_limb = high_limb; - - for (i = 1; i < usize; i++) - { - high_limb = up[i]; - wp[i] = (low_limb >> sh_1) | (high_limb << sh_2); - low_limb = high_limb; - } - wp[i] = low_limb >> sh_1; - - return retval; -} diff --git a/rts/gmp/mpn/generic/sb_divrem_mn.c b/rts/gmp/mpn/generic/sb_divrem_mn.c deleted file mode 100644 index a269e34..0000000 --- a/rts/gmp/mpn/generic/sb_divrem_mn.c +++ /dev/null @@ -1,201 +0,0 @@ -/* mpn_sb_divrem_mn -- Divide natural numbers, producing both remainder and - quotient. - - THE FUNCTIONS IN THIS FILE ARE INTERNAL FUNCTIONS WITH MUTABLE - INTERFACES. IT IS ONLY SAFE TO REACH THEM THROUGH DOCUMENTED INTERFACES. - IN FACT, IT IS ALMOST GUARANTEED THAT THEY'LL CHANGE OR DISAPPEAR IN A - FUTURE GNU MP RELEASE. - - -Copyright (C) 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" -#include "longlong.h" - -/* Divide num (NP/NSIZE) by den (DP/DSIZE) and write - the NSIZE-DSIZE least significant quotient limbs at QP - and the DSIZE long remainder at NP. If QEXTRA_LIMBS is - non-zero, generate that many fraction bits and append them after the - other quotient limbs. - Return the most significant limb of the quotient, this is always 0 or 1. - - Preconditions: - 0. NSIZE >= DSIZE. - 1. The most significant bit of the divisor must be set. - 2. QP must either not overlap with the input operands at all, or - QP + DSIZE >= NP must hold true. (This means that it's - possible to put the quotient in the high part of NUM, right after the - remainder in NUM. - 3. NSIZE >= DSIZE, even if QEXTRA_LIMBS is non-zero. - 4. DSIZE >= 2. */ - - -#define PREINVERT_VIABLE \ - (UDIV_TIME > 2 * UMUL_TIME + 6 /* && ! TARGET_REGISTER_STARVED */) - -mp_limb_t -#if __STDC__ -mpn_sb_divrem_mn (mp_ptr qp, - mp_ptr np, mp_size_t nsize, - mp_srcptr dp, mp_size_t dsize) -#else -mpn_sb_divrem_mn (qp, np, nsize, dp, dsize) - mp_ptr qp; - mp_ptr np; - mp_size_t nsize; - mp_srcptr dp; - mp_size_t dsize; -#endif -{ - mp_limb_t most_significant_q_limb = 0; - mp_size_t i; - mp_limb_t dx, d1, n0; - mp_limb_t dxinv; - int have_preinv; - - ASSERT_ALWAYS (dsize > 2); - - np += nsize - dsize; - dx = dp[dsize - 1]; - d1 = dp[dsize - 2]; - n0 = np[dsize - 1]; - - if (n0 >= dx) - { - if (n0 > dx || mpn_cmp (np, dp, dsize - 1) >= 0) - { - mpn_sub_n (np, np, dp, dsize); - most_significant_q_limb = 1; - } - } - - /* If multiplication is much faster than division, preinvert the - most significant divisor limb before entering the loop. */ - if (PREINVERT_VIABLE) - { - have_preinv = 0; - if ((UDIV_TIME - (2 * UMUL_TIME + 6)) * (nsize - dsize) > UDIV_TIME) - { - invert_limb (dxinv, dx); - have_preinv = 1; - } - } - - for (i = nsize - dsize - 1; i >= 0; i--) - { - mp_limb_t q; - mp_limb_t nx; - mp_limb_t cy_limb; - - nx = np[dsize - 1]; - np--; - - if (nx == dx) - { - /* This might over-estimate q, but it's probably not worth - the extra code here to find out. */ - q = ~(mp_limb_t) 0; - -#if 1 - cy_limb = mpn_submul_1 (np, dp, dsize, q); -#else - /* This should be faster on many machines */ - cy_limb = mpn_sub_n (np + 1, np + 1, dp, dsize); - cy = mpn_add_n (np, np, dp, dsize); - np[dsize] += cy; -#endif - - if (nx != cy_limb) - { - mpn_add_n (np, np, dp, dsize); - q--; - } - - qp[i] = q; - } - else - { - mp_limb_t rx, r1, r0, p1, p0; - - /* "workaround" avoids a problem with gcc 2.7.2.3 i386 register - usage when np[dsize-1] is used in an asm statement like - umul_ppmm in udiv_qrnnd_preinv. The symptom is seg faults due - to registers being clobbered. gcc 2.95 i386 doesn't have the - problem. */ - { - mp_limb_t workaround = np[dsize - 1]; - if (PREINVERT_VIABLE && have_preinv) - udiv_qrnnd_preinv (q, r1, nx, workaround, dx, dxinv); - else - udiv_qrnnd (q, r1, nx, workaround, dx); - } - umul_ppmm (p1, p0, d1, q); - - r0 = np[dsize - 2]; - rx = 0; - if (r1 < p1 || (r1 == p1 && r0 < p0)) - { - p1 -= p0 < d1; - p0 -= d1; - q--; - r1 += dx; - rx = r1 < dx; - } - - p1 += r0 < p0; /* cannot carry! */ - rx -= r1 < p1; /* may become 11..1 if q is still too large */ - r1 -= p1; - r0 -= p0; - - cy_limb = mpn_submul_1 (np, dp, dsize - 2, q); - - { - mp_limb_t cy1, cy2; - cy1 = r0 < cy_limb; - r0 -= cy_limb; - cy2 = r1 < cy1; - r1 -= cy1; - np[dsize - 1] = r1; - np[dsize - 2] = r0; - if (cy2 != rx) - { - mpn_add_n (np, np, dp, dsize); - q--; - } - } - qp[i] = q; - } - } - - /* ______ ______ ______ - |__rx__|__r1__|__r0__| partial remainder - ______ ______ - - |__p1__|__p0__| partial product to subtract - ______ ______ - - |______|cylimb| - - rx is -1, 0 or 1. If rx=1, then q is correct (it should match - carry out). If rx=-1 then q is too large. If rx=0, then q might - be too large, but it is most likely correct. - */ - - return most_significant_q_limb; -} diff --git a/rts/gmp/mpn/generic/scan0.c b/rts/gmp/mpn/generic/scan0.c deleted file mode 100644 index 96f05ce..0000000 --- a/rts/gmp/mpn/generic/scan0.c +++ /dev/null @@ -1,62 +0,0 @@ -/* mpn_scan0 -- Scan from a given bit position for the next clear bit. - -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" -#include "longlong.h" - -/* Design issues: - 1. What if starting_bit is not within U? Caller's problem? - 2. Bit index should be 'unsigned'? - - Argument constraints: - 1. U must sooner ot later have a limb with a clear bit. - */ - -unsigned long int -#if __STDC__ -mpn_scan0 (register mp_srcptr up, - register unsigned long int starting_bit) -#else -mpn_scan0 (up, starting_bit) - register mp_srcptr up; - register unsigned long int starting_bit; -#endif -{ - mp_size_t starting_word; - mp_limb_t alimb; - int cnt; - mp_srcptr p; - - /* Start at the word implied by STARTING_BIT. */ - starting_word = starting_bit / BITS_PER_MP_LIMB; - p = up + starting_word; - alimb = ~*p++; - - /* Mask off any bits before STARTING_BIT in the first limb. */ - alimb &= - (mp_limb_t) 1 << (starting_bit % BITS_PER_MP_LIMB); - - while (alimb == 0) - alimb = ~*p++; - - count_leading_zeros (cnt, alimb & -alimb); - return (p - up) * BITS_PER_MP_LIMB - 1 - cnt; -} diff --git a/rts/gmp/mpn/generic/scan1.c b/rts/gmp/mpn/generic/scan1.c deleted file mode 100644 index 98e2e0d..0000000 --- a/rts/gmp/mpn/generic/scan1.c +++ /dev/null @@ -1,62 +0,0 @@ -/* mpn_scan1 -- Scan from a given bit position for the next set bit. - -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" -#include "longlong.h" - -/* Design issues: - 1. What if starting_bit is not within U? Caller's problem? - 2. Bit index should be 'unsigned'? - - Argument constraints: - 1. U must sooner ot later have a limb != 0. - */ - -unsigned long int -#if __STDC__ -mpn_scan1 (register mp_srcptr up, - register unsigned long int starting_bit) -#else -mpn_scan1 (up, starting_bit) - register mp_srcptr up; - register unsigned long int starting_bit; -#endif -{ - mp_size_t starting_word; - mp_limb_t alimb; - int cnt; - mp_srcptr p; - - /* Start at the word implied by STARTING_BIT. */ - starting_word = starting_bit / BITS_PER_MP_LIMB; - p = up + starting_word; - alimb = *p++; - - /* Mask off any bits before STARTING_BIT in the first limb. */ - alimb &= - (mp_limb_t) 1 << (starting_bit % BITS_PER_MP_LIMB); - - while (alimb == 0) - alimb = *p++; - - count_leading_zeros (cnt, alimb & -alimb); - return (p - up) * BITS_PER_MP_LIMB - 1 - cnt; -} diff --git a/rts/gmp/mpn/generic/set_str.c b/rts/gmp/mpn/generic/set_str.c deleted file mode 100644 index e6ccc92..0000000 --- a/rts/gmp/mpn/generic/set_str.c +++ /dev/null @@ -1,159 +0,0 @@ -/* mpn_set_str (mp_ptr res_ptr, const char *str, size_t str_len, int base) - -- Convert a STR_LEN long base BASE byte string pointed to by STR to a - limb vector pointed to by RES_PTR. Return the number of limbs in - RES_PTR. - -Copyright (C) 1991, 1992, 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" - -mp_size_t -#if __STDC__ -mpn_set_str (mp_ptr xp, const unsigned char *str, size_t str_len, int base) -#else -mpn_set_str (xp, str, str_len, base) - mp_ptr xp; - const unsigned char *str; - size_t str_len; - int base; -#endif -{ - mp_size_t size; - mp_limb_t big_base; - int indigits_per_limb; - mp_limb_t res_digit; - - big_base = __mp_bases[base].big_base; - indigits_per_limb = __mp_bases[base].chars_per_limb; - -/* size = str_len / indigits_per_limb + 1; */ - - size = 0; - - if ((base & (base - 1)) == 0) - { - /* The base is a power of 2. Read the input string from - least to most significant character/digit. */ - - const unsigned char *s; - int next_bitpos; - int bits_per_indigit = big_base; - - res_digit = 0; - next_bitpos = 0; - - for (s = str + str_len - 1; s >= str; s--) - { - int inp_digit = *s; - - res_digit |= (mp_limb_t) inp_digit << next_bitpos; - next_bitpos += bits_per_indigit; - if (next_bitpos >= BITS_PER_MP_LIMB) - { - xp[size++] = res_digit; - next_bitpos -= BITS_PER_MP_LIMB; - res_digit = inp_digit >> (bits_per_indigit - next_bitpos); - } - } - - if (res_digit != 0) - xp[size++] = res_digit; - } - else - { - /* General case. The base is not a power of 2. */ - - size_t i; - int j; - mp_limb_t cy_limb; - - for (i = indigits_per_limb; i < str_len; i += indigits_per_limb) - { - res_digit = *str++; - if (base == 10) - { /* This is a common case. - Help the compiler to avoid multiplication. */ - for (j = 1; j < indigits_per_limb; j++) - res_digit = res_digit * 10 + *str++; - } - else - { - for (j = 1; j < indigits_per_limb; j++) - res_digit = res_digit * base + *str++; - } - - if (size == 0) - { - if (res_digit != 0) - { - xp[0] = res_digit; - size = 1; - } - } - else - { - cy_limb = mpn_mul_1 (xp, xp, size, big_base); - cy_limb += mpn_add_1 (xp, xp, size, res_digit); - if (cy_limb != 0) - xp[size++] = cy_limb; - } - } - - big_base = base; - res_digit = *str++; - if (base == 10) - { /* This is a common case. - Help the compiler to avoid multiplication. */ - for (j = 1; j < str_len - (i - indigits_per_limb); j++) - { - res_digit = res_digit * 10 + *str++; - big_base *= 10; - } - } - else - { - for (j = 1; j < str_len - (i - indigits_per_limb); j++) - { - res_digit = res_digit * base + *str++; - big_base *= base; - } - } - - if (size == 0) - { - if (res_digit != 0) - { - xp[0] = res_digit; - size = 1; - } - } - else - { - cy_limb = mpn_mul_1 (xp, xp, size, big_base); - cy_limb += mpn_add_1 (xp, xp, size, res_digit); - if (cy_limb != 0) - xp[size++] = cy_limb; - } - } - - return size; -} diff --git a/rts/gmp/mpn/generic/sqr_basecase.c b/rts/gmp/mpn/generic/sqr_basecase.c deleted file mode 100644 index 760258a..0000000 --- a/rts/gmp/mpn/generic/sqr_basecase.c +++ /dev/null @@ -1,83 +0,0 @@ -/* mpn_sqr_basecase -- Internal routine to square two natural numbers - of length m and n. - - THIS IS AN INTERNAL FUNCTION WITH A MUTABLE INTERFACE. IT IS ONLY - SAFE TO REACH THIS FUNCTION THROUGH DOCUMENTED INTERFACES. - - -Copyright (C) 1991, 1992, 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" - -void -#if __STDC__ -mpn_sqr_basecase (mp_ptr prodp, mp_srcptr up, mp_size_t n) -#else -mpn_sqr_basecase (prodp, up, n) - mp_ptr prodp; - mp_srcptr up; - mp_size_t n; -#endif -{ - mp_size_t i; - - { - /* N.B.! We need the superfluous indirection through argh to work around - a reloader bug in GCC 2.7.*. */ - mp_limb_t x; - mp_limb_t argh; - x = up[0]; - umul_ppmm (argh, prodp[0], x, x); - prodp[1] = argh; - } - if (n > 1) - { - mp_limb_t tarr[2 * KARATSUBA_SQR_THRESHOLD]; - mp_ptr tp = tarr; - mp_limb_t cy; - - /* must fit 2*n limbs in tarr */ - ASSERT (n <= KARATSUBA_SQR_THRESHOLD); - - cy = mpn_mul_1 (tp, up + 1, n - 1, up[0]); - tp[n - 1] = cy; - for (i = 2; i < n; i++) - { - mp_limb_t cy; - cy = mpn_addmul_1 (tp + 2 * i - 2, up + i, n - i, up[i - 1]); - tp[n + i - 2] = cy; - } - for (i = 1; i < n; i++) - { - mp_limb_t x; - x = up[i]; - umul_ppmm (prodp[2 * i + 1], prodp[2 * i], x, x); - } - { - mp_limb_t cy; - cy = mpn_lshift (tp, tp, 2 * n - 2, 1); - cy += mpn_add_n (prodp + 1, prodp + 1, tp, 2 * n - 2); - prodp[2 * n - 1] += cy; - } - } -} diff --git a/rts/gmp/mpn/generic/sqrtrem.c b/rts/gmp/mpn/generic/sqrtrem.c deleted file mode 100644 index ee3b514..0000000 --- a/rts/gmp/mpn/generic/sqrtrem.c +++ /dev/null @@ -1,509 +0,0 @@ -/* mpn_sqrtrem (root_ptr, rem_ptr, op_ptr, op_size) - - Write the square root of {OP_PTR, OP_SIZE} at ROOT_PTR. - Write the remainder at REM_PTR, if REM_PTR != NULL. - Return the size of the remainder. - (The size of the root is always half of the size of the operand.) - - OP_PTR and ROOT_PTR may not point to the same object. - OP_PTR and REM_PTR may point to the same object. - - If REM_PTR is NULL, only the root is computed and the return value of - the function is 0 if OP is a perfect square, and *any* non-zero number - otherwise. - -Copyright (C) 1993, 1994, 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. */ - -/* This code is just correct if "unsigned char" has at least 8 bits. It - doesn't help to use CHAR_BIT from limits.h, as the real problem is - the static arrays. */ - -#include /* for NULL */ -#include "gmp.h" -#include "gmp-impl.h" -#include "longlong.h" - -/* Square root algorithm: - - 1. Shift OP (the input) to the left an even number of bits s.t. there - are an even number of words and either (or both) of the most - significant bits are set. This way, sqrt(OP) has exactly half as - many words as OP, and has its most significant bit set. - - 2. Get a 9-bit approximation to sqrt(OP) using the pre-computed tables. - This approximation is used for the first single-precision - iterations of Newton's method, yielding a full-word approximation - to sqrt(OP). - - 3. Perform multiple-precision Newton iteration until we have the - exact result. Only about half of the input operand is used in - this calculation, as the square root is perfectly determinable - from just the higher half of a number. */ - -/* Define this macro for IEEE P854 machines with a fast sqrt instruction. */ -#if defined __GNUC__ && ! defined __SOFT_FLOAT - -#if defined (__sparc__) && BITS_PER_MP_LIMB == 32 -#define SQRT(a) \ - ({ \ - double __sqrt_res; \ - asm ("fsqrtd %1,%0" : "=f" (__sqrt_res) : "f" (a)); \ - __sqrt_res; \ - }) -#endif - -#if defined (__HAVE_68881__) -#define SQRT(a) \ - ({ \ - double __sqrt_res; \ - asm ("fsqrtx %1,%0" : "=f" (__sqrt_res) : "f" (a)); \ - __sqrt_res; \ - }) -#endif - -#if defined (__hppa) && BITS_PER_MP_LIMB == 32 -#define SQRT(a) \ - ({ \ - double __sqrt_res; \ - asm ("fsqrt,dbl %1,%0" : "=fx" (__sqrt_res) : "fx" (a)); \ - __sqrt_res; \ - }) -#endif - -#if defined (_ARCH_PWR2) && BITS_PER_MP_LIMB == 32 -#define SQRT(a) \ - ({ \ - double __sqrt_res; \ - asm ("fsqrt %0,%1" : "=f" (__sqrt_res) : "f" (a)); \ - __sqrt_res; \ - }) -#endif - -#if 0 -#if defined (__i386__) || defined (__i486__) -#define SQRT(a) \ - ({ \ - double __sqrt_res; \ - asm ("fsqrt" : "=t" (__sqrt_res) : "0" (a)); \ - __sqrt_res; \ - }) -#endif -#endif - -#endif - -#ifndef SQRT - -/* Tables for initial approximation of the square root. These are - indexed with bits 1-8 of the operand for which the square root is - calculated, where bit 0 is the most significant non-zero bit. I.e. - the most significant one-bit is not used, since that per definition - is one. Likewise, the tables don't return the highest bit of the - result. That bit must be inserted by or:ing the returned value with - 0x100. This way, we get a 9-bit approximation from 8-bit tables! */ - -/* Table to be used for operands with an even total number of bits. - (Exactly as in the decimal system there are similarities between the - square root of numbers with the same initial digits and an even - difference in the total number of digits. Consider the square root - of 1, 10, 100, 1000, ...) */ -static const unsigned char even_approx_tab[256] = -{ - 0x6a, 0x6a, 0x6b, 0x6c, 0x6c, 0x6d, 0x6e, 0x6e, - 0x6f, 0x70, 0x71, 0x71, 0x72, 0x73, 0x73, 0x74, - 0x75, 0x75, 0x76, 0x77, 0x77, 0x78, 0x79, 0x79, - 0x7a, 0x7b, 0x7b, 0x7c, 0x7d, 0x7d, 0x7e, 0x7f, - 0x80, 0x80, 0x81, 0x81, 0x82, 0x83, 0x83, 0x84, - 0x85, 0x85, 0x86, 0x87, 0x87, 0x88, 0x89, 0x89, - 0x8a, 0x8b, 0x8b, 0x8c, 0x8d, 0x8d, 0x8e, 0x8f, - 0x8f, 0x90, 0x90, 0x91, 0x92, 0x92, 0x93, 0x94, - 0x94, 0x95, 0x96, 0x96, 0x97, 0x97, 0x98, 0x99, - 0x99, 0x9a, 0x9b, 0x9b, 0x9c, 0x9c, 0x9d, 0x9e, - 0x9e, 0x9f, 0xa0, 0xa0, 0xa1, 0xa1, 0xa2, 0xa3, - 0xa3, 0xa4, 0xa4, 0xa5, 0xa6, 0xa6, 0xa7, 0xa7, - 0xa8, 0xa9, 0xa9, 0xaa, 0xaa, 0xab, 0xac, 0xac, - 0xad, 0xad, 0xae, 0xaf, 0xaf, 0xb0, 0xb0, 0xb1, - 0xb2, 0xb2, 0xb3, 0xb3, 0xb4, 0xb5, 0xb5, 0xb6, - 0xb6, 0xb7, 0xb7, 0xb8, 0xb9, 0xb9, 0xba, 0xba, - 0xbb, 0xbb, 0xbc, 0xbd, 0xbd, 0xbe, 0xbe, 0xbf, - 0xc0, 0xc0, 0xc1, 0xc1, 0xc2, 0xc2, 0xc3, 0xc3, - 0xc4, 0xc5, 0xc5, 0xc6, 0xc6, 0xc7, 0xc7, 0xc8, - 0xc9, 0xc9, 0xca, 0xca, 0xcb, 0xcb, 0xcc, 0xcc, - 0xcd, 0xce, 0xce, 0xcf, 0xcf, 0xd0, 0xd0, 0xd1, - 0xd1, 0xd2, 0xd3, 0xd3, 0xd4, 0xd4, 0xd5, 0xd5, - 0xd6, 0xd6, 0xd7, 0xd7, 0xd8, 0xd9, 0xd9, 0xda, - 0xda, 0xdb, 0xdb, 0xdc, 0xdc, 0xdd, 0xdd, 0xde, - 0xde, 0xdf, 0xe0, 0xe0, 0xe1, 0xe1, 0xe2, 0xe2, - 0xe3, 0xe3, 0xe4, 0xe4, 0xe5, 0xe5, 0xe6, 0xe6, - 0xe7, 0xe7, 0xe8, 0xe8, 0xe9, 0xea, 0xea, 0xeb, - 0xeb, 0xec, 0xec, 0xed, 0xed, 0xee, 0xee, 0xef, - 0xef, 0xf0, 0xf0, 0xf1, 0xf1, 0xf2, 0xf2, 0xf3, - 0xf3, 0xf4, 0xf4, 0xf5, 0xf5, 0xf6, 0xf6, 0xf7, - 0xf7, 0xf8, 0xf8, 0xf9, 0xf9, 0xfa, 0xfa, 0xfb, - 0xfb, 0xfc, 0xfc, 0xfd, 0xfd, 0xfe, 0xfe, 0xff, -}; - -/* Table to be used for operands with an odd total number of bits. - (Further comments before previous table.) */ -static const unsigned char odd_approx_tab[256] = -{ - 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, - 0x03, 0x04, 0x04, 0x05, 0x05, 0x06, 0x06, 0x07, - 0x07, 0x08, 0x08, 0x09, 0x09, 0x0a, 0x0a, 0x0b, - 0x0b, 0x0c, 0x0c, 0x0d, 0x0d, 0x0e, 0x0e, 0x0f, - 0x0f, 0x10, 0x10, 0x10, 0x11, 0x11, 0x12, 0x12, - 0x13, 0x13, 0x14, 0x14, 0x15, 0x15, 0x16, 0x16, - 0x16, 0x17, 0x17, 0x18, 0x18, 0x19, 0x19, 0x1a, - 0x1a, 0x1b, 0x1b, 0x1b, 0x1c, 0x1c, 0x1d, 0x1d, - 0x1e, 0x1e, 0x1f, 0x1f, 0x20, 0x20, 0x20, 0x21, - 0x21, 0x22, 0x22, 0x23, 0x23, 0x23, 0x24, 0x24, - 0x25, 0x25, 0x26, 0x26, 0x27, 0x27, 0x27, 0x28, - 0x28, 0x29, 0x29, 0x2a, 0x2a, 0x2a, 0x2b, 0x2b, - 0x2c, 0x2c, 0x2d, 0x2d, 0x2d, 0x2e, 0x2e, 0x2f, - 0x2f, 0x30, 0x30, 0x30, 0x31, 0x31, 0x32, 0x32, - 0x32, 0x33, 0x33, 0x34, 0x34, 0x35, 0x35, 0x35, - 0x36, 0x36, 0x37, 0x37, 0x37, 0x38, 0x38, 0x39, - 0x39, 0x39, 0x3a, 0x3a, 0x3b, 0x3b, 0x3b, 0x3c, - 0x3c, 0x3d, 0x3d, 0x3d, 0x3e, 0x3e, 0x3f, 0x3f, - 0x40, 0x40, 0x40, 0x41, 0x41, 0x41, 0x42, 0x42, - 0x43, 0x43, 0x43, 0x44, 0x44, 0x45, 0x45, 0x45, - 0x46, 0x46, 0x47, 0x47, 0x47, 0x48, 0x48, 0x49, - 0x49, 0x49, 0x4a, 0x4a, 0x4b, 0x4b, 0x4b, 0x4c, - 0x4c, 0x4c, 0x4d, 0x4d, 0x4e, 0x4e, 0x4e, 0x4f, - 0x4f, 0x50, 0x50, 0x50, 0x51, 0x51, 0x51, 0x52, - 0x52, 0x53, 0x53, 0x53, 0x54, 0x54, 0x54, 0x55, - 0x55, 0x56, 0x56, 0x56, 0x57, 0x57, 0x57, 0x58, - 0x58, 0x59, 0x59, 0x59, 0x5a, 0x5a, 0x5a, 0x5b, - 0x5b, 0x5b, 0x5c, 0x5c, 0x5d, 0x5d, 0x5d, 0x5e, - 0x5e, 0x5e, 0x5f, 0x5f, 0x60, 0x60, 0x60, 0x61, - 0x61, 0x61, 0x62, 0x62, 0x62, 0x63, 0x63, 0x63, - 0x64, 0x64, 0x65, 0x65, 0x65, 0x66, 0x66, 0x66, - 0x67, 0x67, 0x67, 0x68, 0x68, 0x68, 0x69, 0x69, -}; -#endif - - -mp_size_t -#if __STDC__ -mpn_sqrtrem (mp_ptr root_ptr, mp_ptr rem_ptr, mp_srcptr op_ptr, mp_size_t op_size) -#else -mpn_sqrtrem (root_ptr, rem_ptr, op_ptr, op_size) - mp_ptr root_ptr; - mp_ptr rem_ptr; - mp_srcptr op_ptr; - mp_size_t op_size; -#endif -{ - /* R (root result) */ - mp_ptr rp; /* Pointer to least significant word */ - mp_size_t rsize; /* The size in words */ - - /* T (OP shifted to the left a.k.a. normalized) */ - mp_ptr tp; /* Pointer to least significant word */ - mp_size_t tsize; /* The size in words */ - mp_ptr t_end_ptr; /* Pointer right beyond most sign. word */ - mp_limb_t t_high0, t_high1; /* The two most significant words */ - - /* TT (temporary for numerator/remainder) */ - mp_ptr ttp; /* Pointer to least significant word */ - - /* X (temporary for quotient in main loop) */ - mp_ptr xp; /* Pointer to least significant word */ - mp_size_t xsize; /* The size in words */ - - unsigned cnt; - mp_limb_t initial_approx; /* Initially made approximation */ - mp_size_t tsizes[BITS_PER_MP_LIMB]; /* Successive calculation precisions */ - mp_size_t tmp; - mp_size_t i; - - mp_limb_t cy_limb; - TMP_DECL (marker); - - /* If OP is zero, both results are zero. */ - if (op_size == 0) - return 0; - - count_leading_zeros (cnt, op_ptr[op_size - 1]); - tsize = op_size; - if ((tsize & 1) != 0) - { - cnt += BITS_PER_MP_LIMB; - tsize++; - } - - rsize = tsize / 2; - rp = root_ptr; - - TMP_MARK (marker); - - /* Shift OP an even number of bits into T, such that either the most or - the second most significant bit is set, and such that the number of - words in T becomes even. This way, the number of words in R=sqrt(OP) - is exactly half as many as in OP, and the most significant bit of R - is set. - - Also, the initial approximation is simplified by this up-shifted OP. - - Finally, the Newtonian iteration which is the main part of this - program performs division by R. The fast division routine expects - the divisor to be "normalized" in exactly the sense of having the - most significant bit set. */ - - tp = (mp_ptr) TMP_ALLOC (tsize * BYTES_PER_MP_LIMB); - - if ((cnt & ~1) % BITS_PER_MP_LIMB != 0) - t_high0 = mpn_lshift (tp + cnt / BITS_PER_MP_LIMB, op_ptr, op_size, - (cnt & ~1) % BITS_PER_MP_LIMB); - else - MPN_COPY (tp + cnt / BITS_PER_MP_LIMB, op_ptr, op_size); - - if (cnt >= BITS_PER_MP_LIMB) - tp[0] = 0; - - t_high0 = tp[tsize - 1]; - t_high1 = tp[tsize - 2]; /* Never stray. TSIZE is >= 2. */ - -/* Is there a fast sqrt instruction defined for this machine? */ -#ifdef SQRT - { - initial_approx = SQRT (t_high0 * MP_BASE_AS_DOUBLE + t_high1); - /* If t_high0,,t_high1 is big, the result in INITIAL_APPROX might have - become incorrect due to overflow in the conversion from double to - mp_limb_t above. It will typically be zero in that case, but might be - a small number on some machines. The most significant bit of - INITIAL_APPROX should be set, so that bit is a good overflow - indication. */ - if ((mp_limb_signed_t) initial_approx >= 0) - initial_approx = ~(mp_limb_t)0; - } -#else - /* Get a 9 bit approximation from the tables. The tables expect to - be indexed with the 8 high bits right below the highest bit. - Also, the highest result bit is not returned by the tables, and - must be or:ed into the result. The scheme gives 9 bits of start - approximation with just 256-entry 8 bit tables. */ - - if ((cnt & 1) == 0) - { - /* The most significant bit of t_high0 is set. */ - initial_approx = t_high0 >> (BITS_PER_MP_LIMB - 8 - 1); - initial_approx &= 0xff; - initial_approx = even_approx_tab[initial_approx]; - } - else - { - /* The most significant bit of t_high0 is unset, - the second most significant is set. */ - initial_approx = t_high0 >> (BITS_PER_MP_LIMB - 8 - 2); - initial_approx &= 0xff; - initial_approx = odd_approx_tab[initial_approx]; - } - initial_approx |= 0x100; - initial_approx <<= BITS_PER_MP_LIMB - 8 - 1; - - /* Perform small precision Newtonian iterations to get a full word - approximation. For small operands, these iterations will do the - entire job. */ - if (t_high0 == ~(mp_limb_t)0) - initial_approx = t_high0; - else - { - mp_limb_t quot; - - if (t_high0 >= initial_approx) - initial_approx = t_high0 + 1; - - /* First get about 18 bits with pure C arithmetics. */ - quot = t_high0 / (initial_approx >> BITS_PER_MP_LIMB/2) << BITS_PER_MP_LIMB/2; - initial_approx = (initial_approx + quot) / 2; - initial_approx |= (mp_limb_t) 1 << (BITS_PER_MP_LIMB - 1); - - /* Now get a full word by one (or for > 36 bit machines) several - iterations. */ - for (i = 18; i < BITS_PER_MP_LIMB; i <<= 1) - { - mp_limb_t ignored_remainder; - - udiv_qrnnd (quot, ignored_remainder, - t_high0, t_high1, initial_approx); - initial_approx = (initial_approx + quot) / 2; - initial_approx |= (mp_limb_t) 1 << (BITS_PER_MP_LIMB - 1); - } - } -#endif - - rp[0] = initial_approx; - rsize = 1; - -#ifdef SQRT_DEBUG - printf ("\n\nT = "); - mpn_dump (tp, tsize); -#endif - - if (tsize > 2) - { - /* Determine the successive precisions to use in the iteration. We - minimize the precisions, beginning with the highest (i.e. last - iteration) to the lowest (i.e. first iteration). */ - - xp = (mp_ptr) TMP_ALLOC (tsize * BYTES_PER_MP_LIMB); - ttp = (mp_ptr) TMP_ALLOC (tsize * BYTES_PER_MP_LIMB); - - t_end_ptr = tp + tsize; - - tmp = tsize / 2; - for (i = 0;; i++) - { - tsize = (tmp + 1) / 2; - if (tmp == tsize) - break; - tsizes[i] = tsize + tmp; - tmp = tsize; - } - - /* Main Newton iteration loop. For big arguments, most of the - time is spent here. */ - - /* It is possible to do a great optimization here. The successive - divisors in the mpn_divmod call below have more and more leading - words equal to its predecessor. Therefore the beginning of - each division will repeat the same work as did the last - division. If we could guarantee that the leading words of two - consecutive divisors are the same (i.e. in this case, a later - divisor has just more digits at the end) it would be a simple - matter of just using the old remainder of the last division in - a subsequent division, to take care of this optimization. This - idea would surely make a difference even for small arguments. */ - - /* Loop invariants: - - R <= shiftdown_to_same_size(floor(sqrt(OP))) < R + 1. - X - 1 < shiftdown_to_same_size(floor(sqrt(OP))) <= X. - R <= shiftdown_to_same_size(X). */ - - while (--i >= 0) - { - mp_limb_t cy; -#ifdef SQRT_DEBUG - mp_limb_t old_least_sign_r = rp[0]; - mp_size_t old_rsize = rsize; - - printf ("R = "); - mpn_dump (rp, rsize); -#endif - tsize = tsizes[i]; - - /* Need to copy the numerator into temporary space, as - mpn_divmod overwrites its numerator argument with the - remainder (which we currently ignore). */ - MPN_COPY (ttp, t_end_ptr - tsize, tsize); - cy = mpn_divmod (xp, ttp, tsize, rp, rsize); - xsize = tsize - rsize; - -#ifdef SQRT_DEBUG - printf ("X =%d ", cy); - mpn_dump (xp, xsize); -#endif - - /* Add X and R with the most significant limbs aligned, - temporarily ignoring at least one limb at the low end of X. */ - tmp = xsize - rsize; - cy += mpn_add_n (xp + tmp, rp, xp + tmp, rsize); - - /* If T begins with more than 2 x BITS_PER_MP_LIMB of ones, we get - intermediate roots that'd need an extra bit. We don't want to - handle that since it would make the subsequent divisor - non-normalized, so round such roots down to be only ones in the - current precision. */ - if (cy == 2) - { - mp_size_t j; - for (j = xsize; j >= 0; j--) - xp[j] = ~(mp_limb_t)0; - } - - /* Divide X by 2 and put the result in R. This is the new - approximation. Shift in the carry from the addition. */ - mpn_rshift (rp, xp, xsize, 1); - rp[xsize - 1] |= ((mp_limb_t) 1 << (BITS_PER_MP_LIMB - 1)); - rsize = xsize; -#ifdef SQRT_DEBUG - if (old_least_sign_r != rp[rsize - old_rsize]) - printf (">>>>>>>> %d: %0*lX, %0*lX <<<<<<<<\n", - i, 2 * BYTES_PER_MP_LIMB, old_least_sign_r, - 2 * BYTES_PER_MP_LIMB, rp[rsize - old_rsize]); -#endif - } - } - -#ifdef SQRT_DEBUG - printf ("(final) R = "); - mpn_dump (rp, rsize); -#endif - - /* We computed the square root of OP * 2**(2*floor(cnt/2)). - This has resulted in R being 2**floor(cnt/2) to large. - Shift it down here to fix that. */ - if (cnt / 2 != 0) - { - mpn_rshift (rp, rp, rsize, cnt/2); - rsize -= rp[rsize - 1] == 0; - } - - /* Calculate the remainder. */ - mpn_mul_n (tp, rp, rp, rsize); - tsize = rsize + rsize; - tsize -= tp[tsize - 1] == 0; - if (op_size < tsize - || (op_size == tsize && mpn_cmp (op_ptr, tp, op_size) < 0)) - { - /* R is too large. Decrement it. */ - - /* These operations can't overflow. */ - cy_limb = mpn_sub_n (tp, tp, rp, rsize); - cy_limb += mpn_sub_n (tp, tp, rp, rsize); - mpn_decr_u (tp + rsize, cy_limb); - mpn_incr_u (tp, (mp_limb_t) 1); - - mpn_decr_u (rp, (mp_limb_t) 1); - -#ifdef SQRT_DEBUG - printf ("(adjusted) R = "); - mpn_dump (rp, rsize); -#endif - } - - if (rem_ptr != NULL) - { - cy_limb = mpn_sub (rem_ptr, op_ptr, op_size, tp, tsize); - MPN_NORMALIZE (rem_ptr, op_size); - TMP_FREE (marker); - return op_size; - } - else - { - int res; - res = op_size != tsize || mpn_cmp (op_ptr, tp, op_size); - TMP_FREE (marker); - return res; - } -} diff --git a/rts/gmp/mpn/generic/sub_n.c b/rts/gmp/mpn/generic/sub_n.c deleted file mode 100644 index 4f2f060..0000000 --- a/rts/gmp/mpn/generic/sub_n.c +++ /dev/null @@ -1,62 +0,0 @@ -/* mpn_sub_n -- Subtract two limb vectors of equal, non-zero length. - -Copyright (C) 1992, 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" - -mp_limb_t -#if __STDC__ -mpn_sub_n (mp_ptr res_ptr, mp_srcptr s1_ptr, mp_srcptr s2_ptr, mp_size_t size) -#else -mpn_sub_n (res_ptr, s1_ptr, s2_ptr, size) - register mp_ptr res_ptr; - register mp_srcptr s1_ptr; - register mp_srcptr s2_ptr; - mp_size_t size; -#endif -{ - register mp_limb_t x, y, cy; - register mp_size_t j; - - /* The loop counter and index J goes from -SIZE to -1. This way - the loop becomes faster. */ - j = -size; - - /* Offset the base pointers to compensate for the negative indices. */ - s1_ptr -= j; - s2_ptr -= j; - res_ptr -= j; - - cy = 0; - do - { - y = s2_ptr[j]; - x = s1_ptr[j]; - y += cy; /* add previous carry to subtrahend */ - cy = (y < cy); /* get out carry from that addition */ - y = x - y; /* main subtract */ - cy = (y > x) + cy; /* get out carry from the subtract, combine */ - res_ptr[j] = y; - } - while (++j != 0); - - return cy; -} diff --git a/rts/gmp/mpn/generic/submul_1.c b/rts/gmp/mpn/generic/submul_1.c deleted file mode 100644 index c7c08ee..0000000 --- a/rts/gmp/mpn/generic/submul_1.c +++ /dev/null @@ -1,65 +0,0 @@ -/* mpn_submul_1 -- multiply the S1_SIZE long limb vector pointed to by S1_PTR - by S2_LIMB, subtract the S1_SIZE least significant limbs of the product - from the limb vector pointed to by RES_PTR. Return the most significant - limb of the product, adjusted for carry-out from the subtraction. - -Copyright (C) 1992, 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" -#include "longlong.h" - -mp_limb_t -mpn_submul_1 (res_ptr, s1_ptr, s1_size, s2_limb) - register mp_ptr res_ptr; - register mp_srcptr s1_ptr; - mp_size_t s1_size; - register mp_limb_t s2_limb; -{ - register mp_limb_t cy_limb; - register mp_size_t j; - register mp_limb_t prod_high, prod_low; - register mp_limb_t x; - - /* The loop counter and index J goes from -SIZE to -1. This way - the loop becomes faster. */ - j = -s1_size; - - /* Offset the base pointers to compensate for the negative indices. */ - res_ptr -= j; - s1_ptr -= j; - - cy_limb = 0; - do - { - umul_ppmm (prod_high, prod_low, s1_ptr[j], s2_limb); - - prod_low += cy_limb; - cy_limb = (prod_low < cy_limb) + prod_high; - - x = res_ptr[j]; - prod_low = x - prod_low; - cy_limb += (prod_low > x); - res_ptr[j] = prod_low; - } - while (++j != 0); - - return cy_limb; -} diff --git a/rts/gmp/mpn/generic/tdiv_qr.c b/rts/gmp/mpn/generic/tdiv_qr.c deleted file mode 100644 index b748b5d..0000000 --- a/rts/gmp/mpn/generic/tdiv_qr.c +++ /dev/null @@ -1,401 +0,0 @@ -/* mpn_tdiv_qr -- Divide the numerator (np,nn) by the denominator (dp,dn) and - write the nn-dn+1 quotient limbs at qp and the dn remainder limbs at rp. If - qxn is non-zero, generate that many fraction limbs and append them after the - other quotient limbs, and update the remainder accordningly. The input - operands are unaffected. - - Preconditions: - 1. The most significant limb of of the divisor must be non-zero. - 2. No argument overlap is permitted. (??? relax this ???) - 3. nn >= dn, even if qxn is non-zero. (??? relax this ???) - - The time complexity of this is O(qn*qn+M(dn,qn)), where M(m,n) is the time - complexity of multiplication. - -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" -#include "longlong.h" - -#ifndef BZ_THRESHOLD -#define BZ_THRESHOLD (7 * KARATSUBA_MUL_THRESHOLD) -#endif - -/* Extract the middle limb from ((h,,l) << cnt) */ -#define SHL(h,l,cnt) \ - ((h << cnt) | ((l >> 1) >> ((~cnt) & (BITS_PER_MP_LIMB - 1)))) - -void -#if __STDC__ -mpn_tdiv_qr (mp_ptr qp, mp_ptr rp, mp_size_t qxn, - mp_srcptr np, mp_size_t nn, mp_srcptr dp, mp_size_t dn) -#else -mpn_tdiv_qr (qp, rp, qxn, np, nn, dp, dn) - mp_ptr qp; - mp_ptr rp; - mp_size_t qxn; - mp_srcptr np; - mp_size_t nn; - mp_srcptr dp; - mp_size_t dn; -#endif -{ - /* FIXME: - 1. qxn - 2. pass allocated storage in additional parameter? - */ - if (qxn != 0) - abort (); - - switch (dn) - { - case 0: - DIVIDE_BY_ZERO; - - case 1: - { - rp[0] = mpn_divmod_1 (qp, np, nn, dp[0]); - return; - } - - case 2: - { - int cnt; - mp_ptr n2p, d2p; - mp_limb_t qhl, cy; - TMP_DECL (marker); - TMP_MARK (marker); - count_leading_zeros (cnt, dp[dn - 1]); - if (cnt != 0) - { - d2p = (mp_ptr) TMP_ALLOC (dn * BYTES_PER_MP_LIMB); - mpn_lshift (d2p, dp, dn, cnt); - n2p = (mp_ptr) TMP_ALLOC ((nn + 1) * BYTES_PER_MP_LIMB); - cy = mpn_lshift (n2p, np, nn, cnt); - n2p[nn] = cy; - qhl = mpn_divrem_2 (qp, 0L, n2p, nn + (cy != 0), d2p); - if (cy == 0) - qp[nn - 2] = qhl; /* always store nn-dn+1 quotient limbs */ - } - else - { - d2p = (mp_ptr) dp; - n2p = (mp_ptr) TMP_ALLOC (nn * BYTES_PER_MP_LIMB); - MPN_COPY (n2p, np, nn); - qhl = mpn_divrem_2 (qp, 0L, n2p, nn, d2p); - qp[nn - 2] = qhl; /* always store nn-dn+1 quotient limbs */ - } - - if (cnt != 0) - mpn_rshift (rp, n2p, dn, cnt); - else - MPN_COPY (rp, n2p, dn); - TMP_FREE (marker); - return; - } - - default: - { - int adjust; - TMP_DECL (marker); - TMP_MARK (marker); - adjust = np[nn - 1] >= dp[dn - 1]; /* conservative tests for quotient size */ - if (nn + adjust >= 2 * dn) - { - mp_ptr n2p, d2p; - mp_limb_t cy; - int cnt; - count_leading_zeros (cnt, dp[dn - 1]); - - qp[nn - dn] = 0; /* zero high quotient limb */ - if (cnt != 0) /* normalize divisor if needed */ - { - d2p = (mp_ptr) TMP_ALLOC (dn * BYTES_PER_MP_LIMB); - mpn_lshift (d2p, dp, dn, cnt); - n2p = (mp_ptr) TMP_ALLOC ((nn + 1) * BYTES_PER_MP_LIMB); - cy = mpn_lshift (n2p, np, nn, cnt); - n2p[nn] = cy; - nn += adjust; - } - else - { - d2p = (mp_ptr) dp; - n2p = (mp_ptr) TMP_ALLOC ((nn + 1) * BYTES_PER_MP_LIMB); - MPN_COPY (n2p, np, nn); - n2p[nn] = 0; - nn += adjust; - } - - if (dn == 2) - mpn_divrem_2 (qp, 0L, n2p, nn, d2p); - else if (dn < BZ_THRESHOLD) - mpn_sb_divrem_mn (qp, n2p, nn, d2p, dn); - else - { - /* Perform 2*dn / dn limb divisions as long as the limbs - in np last. */ - mp_ptr q2p = qp + nn - 2 * dn; - n2p += nn - 2 * dn; - mpn_bz_divrem_n (q2p, n2p, d2p, dn); - nn -= dn; - while (nn >= 2 * dn) - { - mp_limb_t c; - q2p -= dn; n2p -= dn; - c = mpn_bz_divrem_n (q2p, n2p, d2p, dn); - ASSERT_ALWAYS (c == 0); - nn -= dn; - } - - if (nn != dn) - { - n2p -= nn - dn; - /* In theory, we could fall out to the cute code below - since we now have exactly the situation that code - is designed to handle. We botch this badly and call - the basic mpn_sb_divrem_mn! */ - if (dn == 2) - mpn_divrem_2 (qp, 0L, n2p, nn, d2p); - else - mpn_sb_divrem_mn (qp, n2p, nn, d2p, dn); - } - } - - - if (cnt != 0) - mpn_rshift (rp, n2p, dn, cnt); - else - MPN_COPY (rp, n2p, dn); - TMP_FREE (marker); - return; - } - - /* When we come here, the numerator/partial remainder is less - than twice the size of the denominator. */ - - { - /* Problem: - - Divide a numerator N with nn limbs by a denominator D with dn - limbs forming a quotient of nn-dn+1 limbs. When qn is small - compared to dn, conventional division algorithms perform poorly. - We want an algorithm that has an expected running time that is - dependent only on qn. It is assumed that the most significant - limb of the numerator is smaller than the most significant limb - of the denominator. - - Algorithm (very informally stated): - - 1) Divide the 2 x qn most significant limbs from the numerator - by the qn most significant limbs from the denominator. Call - the result qest. This is either the correct quotient, but - might be 1 or 2 too large. Compute the remainder from the - division. (This step is implemented by a mpn_divrem call.) - - 2) Is the most significant limb from the remainder < p, where p - is the product of the most significant limb from the quotient - and the next(d). (Next(d) denotes the next ignored limb from - the denominator.) If it is, decrement qest, and adjust the - remainder accordingly. - - 3) Is the remainder >= qest? If it is, qest is the desired - quotient. The algorithm terminates. - - 4) Subtract qest x next(d) from the remainder. If there is - borrow out, decrement qest, and adjust the remainder - accordingly. - - 5) Skip one word from the denominator (i.e., let next(d) denote - the next less significant limb. */ - - mp_size_t qn; - mp_ptr n2p, d2p; - mp_ptr tp; - mp_limb_t cy; - mp_size_t in, rn; - mp_limb_t quotient_too_large; - int cnt; - - qn = nn - dn; - qp[qn] = 0; /* zero high quotient limb */ - qn += adjust; /* qn cannot become bigger */ - - if (qn == 0) - { - MPN_COPY (rp, np, dn); - TMP_FREE (marker); - return; - } - - in = dn - qn; /* (at least partially) ignored # of limbs in ops */ - /* Normalize denominator by shifting it to the left such that its - most significant bit is set. Then shift the numerator the same - amount, to mathematically preserve quotient. */ - count_leading_zeros (cnt, dp[dn - 1]); - if (cnt != 0) - { - d2p = (mp_ptr) TMP_ALLOC (qn * BYTES_PER_MP_LIMB); - - mpn_lshift (d2p, dp + in, qn, cnt); - d2p[0] |= dp[in - 1] >> (BITS_PER_MP_LIMB - cnt); - - n2p = (mp_ptr) TMP_ALLOC ((2 * qn + 1) * BYTES_PER_MP_LIMB); - cy = mpn_lshift (n2p, np + nn - 2 * qn, 2 * qn, cnt); - if (adjust) - { - n2p[2 * qn] = cy; - n2p++; - } - else - { - n2p[0] |= np[nn - 2 * qn - 1] >> (BITS_PER_MP_LIMB - cnt); - } - } - else - { - d2p = (mp_ptr) dp + in; - - n2p = (mp_ptr) TMP_ALLOC ((2 * qn + 1) * BYTES_PER_MP_LIMB); - MPN_COPY (n2p, np + nn - 2 * qn, 2 * qn); - if (adjust) - { - n2p[2 * qn] = 0; - n2p++; - } - } - - /* Get an approximate quotient using the extracted operands. */ - if (qn == 1) - { - mp_limb_t q0, r0; - mp_limb_t gcc272bug_n1, gcc272bug_n0, gcc272bug_d0; - /* Due to a gcc 2.7.2.3 reload pass bug, we have to use some - temps here. This doesn't hurt code quality on any machines - so we do it unconditionally. */ - gcc272bug_n1 = n2p[1]; - gcc272bug_n0 = n2p[0]; - gcc272bug_d0 = d2p[0]; - udiv_qrnnd (q0, r0, gcc272bug_n1, gcc272bug_n0, gcc272bug_d0); - n2p[0] = r0; - qp[0] = q0; - } - else if (qn == 2) - mpn_divrem_2 (qp, 0L, n2p, 4L, d2p); - else if (qn < BZ_THRESHOLD) - mpn_sb_divrem_mn (qp, n2p, qn * 2, d2p, qn); - else - mpn_bz_divrem_n (qp, n2p, d2p, qn); - - rn = qn; - /* Multiply the first ignored divisor limb by the most significant - quotient limb. If that product is > the partial remainder's - most significant limb, we know the quotient is too large. This - test quickly catches most cases where the quotient is too large; - it catches all cases where the quotient is 2 too large. */ - { - mp_limb_t dl, x; - mp_limb_t h, l; - - if (in - 2 < 0) - dl = 0; - else - dl = dp[in - 2]; - - x = SHL (dp[in - 1], dl, cnt); - umul_ppmm (h, l, x, qp[qn - 1]); - - if (n2p[qn - 1] < h) - { - mp_limb_t cy; - - mpn_decr_u (qp, (mp_limb_t) 1); - cy = mpn_add_n (n2p, n2p, d2p, qn); - if (cy) - { - /* The partial remainder is safely large. */ - n2p[qn] = cy; - ++rn; - } - } - } - - quotient_too_large = 0; - if (cnt != 0) - { - mp_limb_t cy1, cy2; - - /* Append partially used numerator limb to partial remainder. */ - cy1 = mpn_lshift (n2p, n2p, rn, BITS_PER_MP_LIMB - cnt); - n2p[0] |= np[in - 1] & (~(mp_limb_t) 0 >> cnt); - - /* Update partial remainder with partially used divisor limb. */ - cy2 = mpn_submul_1 (n2p, qp, qn, dp[in - 1] & (~(mp_limb_t) 0 >> cnt)); - if (qn != rn) - { - if (n2p[qn] < cy2) - abort (); - n2p[qn] -= cy2; - } - else - { - n2p[qn] = cy1 - cy2; - - quotient_too_large = (cy1 < cy2); - ++rn; - } - --in; - } - /* True: partial remainder now is neutral, i.e., it is not shifted up. */ - - tp = (mp_ptr) TMP_ALLOC (dn * BYTES_PER_MP_LIMB); - - if (in < qn) - { - if (in == 0) - { - MPN_COPY (rp, n2p, rn); - if (rn != dn) - abort (); - goto foo; - } - mpn_mul (tp, qp, qn, dp, in); - } - else - mpn_mul (tp, dp, in, qp, qn); - - cy = mpn_sub (n2p, n2p, rn, tp + in, qn); - MPN_COPY (rp + in, n2p, dn - in); - quotient_too_large |= cy; - cy = mpn_sub_n (rp, np, tp, in); - cy = mpn_sub_1 (rp + in, rp + in, rn, cy); - quotient_too_large |= cy; - foo: - if (quotient_too_large) - { - mpn_decr_u (qp, (mp_limb_t) 1); - mpn_add_n (rp, rp, dp, dn); - } - } - TMP_FREE (marker); - return; - } - } -} diff --git a/rts/gmp/mpn/generic/udiv_w_sdiv.c b/rts/gmp/mpn/generic/udiv_w_sdiv.c deleted file mode 100644 index 061cce8..0000000 --- a/rts/gmp/mpn/generic/udiv_w_sdiv.c +++ /dev/null @@ -1,131 +0,0 @@ -/* mpn_udiv_w_sdiv -- implement udiv_qrnnd on machines with only signed - division. - - Contributed by Peter L. Montgomery. - - THIS IS AN INTERNAL FUNCTION WITH A MUTABLE INTERFACE. IT IS ONLY SAFE - TO REACH THIS FUNCTION THROUGH DOCUMENTED INTERFACES. IN FACT, IT IS - ALMOST GUARANTEED THAT THIS FUNCTION WILL CHANGE OR DISAPPEAR IN A FUTURE - GNU MP RELEASE. - - -Copyright (C) 1992, 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" - -mp_limb_t -mpn_udiv_w_sdiv (rp, a1, a0, d) - mp_limb_t *rp, a1, a0, d; -{ - mp_limb_t q, r; - mp_limb_t c0, c1, b1; - - if ((mp_limb_signed_t) d >= 0) - { - if (a1 < d - a1 - (a0 >> (BITS_PER_MP_LIMB - 1))) - { - /* dividend, divisor, and quotient are nonnegative */ - sdiv_qrnnd (q, r, a1, a0, d); - } - else - { - /* Compute c1*2^32 + c0 = a1*2^32 + a0 - 2^31*d */ - sub_ddmmss (c1, c0, a1, a0, d >> 1, d << (BITS_PER_MP_LIMB - 1)); - /* Divide (c1*2^32 + c0) by d */ - sdiv_qrnnd (q, r, c1, c0, d); - /* Add 2^31 to quotient */ - q += (mp_limb_t) 1 << (BITS_PER_MP_LIMB - 1); - } - } - else - { - b1 = d >> 1; /* d/2, between 2^30 and 2^31 - 1 */ - c1 = a1 >> 1; /* A/2 */ - c0 = (a1 << (BITS_PER_MP_LIMB - 1)) + (a0 >> 1); - - if (a1 < b1) /* A < 2^32*b1, so A/2 < 2^31*b1 */ - { - sdiv_qrnnd (q, r, c1, c0, b1); /* (A/2) / (d/2) */ - - r = 2*r + (a0 & 1); /* Remainder from A/(2*b1) */ - if ((d & 1) != 0) - { - if (r >= q) - r = r - q; - else if (q - r <= d) - { - r = r - q + d; - q--; - } - else - { - r = r - q + 2*d; - q -= 2; - } - } - } - else if (c1 < b1) /* So 2^31 <= (A/2)/b1 < 2^32 */ - { - c1 = (b1 - 1) - c1; - c0 = ~c0; /* logical NOT */ - - sdiv_qrnnd (q, r, c1, c0, b1); /* (A/2) / (d/2) */ - - q = ~q; /* (A/2)/b1 */ - r = (b1 - 1) - r; - - r = 2*r + (a0 & 1); /* A/(2*b1) */ - - if ((d & 1) != 0) - { - if (r >= q) - r = r - q; - else if (q - r <= d) - { - r = r - q + d; - q--; - } - else - { - r = r - q + 2*d; - q -= 2; - } - } - } - else /* Implies c1 = b1 */ - { /* Hence a1 = d - 1 = 2*b1 - 1 */ - if (a0 >= -d) - { - q = -1; - r = a0 + d; - } - else - { - q = -2; - r = a0 + 2*d; - } - } - } - - *rp = r; - return q; -} diff --git a/rts/gmp/mpn/hppa/README b/rts/gmp/mpn/hppa/README deleted file mode 100644 index 97e7abe..0000000 --- a/rts/gmp/mpn/hppa/README +++ /dev/null @@ -1,91 +0,0 @@ -This directory contains mpn functions for various HP PA-RISC chips. Code -that runs faster on the PA7100 and later implementations, is in the pa7100 -directory. - -RELEVANT OPTIMIZATION ISSUES - - Load and Store timing - -On the PA7000 no memory instructions can issue the two cycles after a store. -For the PA7100, this is reduced to one cycle. - -The PA7100 has a lookup-free cache, so it helps to schedule loads and the -dependent instruction really far from each other. - -STATUS - -1. mpn_mul_1 could be improved to 6.5 cycles/limb on the PA7100, using the - instructions below (but some sw pipelining is needed to avoid the - xmpyu-fstds delay): - - fldds s1_ptr - - xmpyu - fstds N(%r30) - xmpyu - fstds N(%r30) - - ldws N(%r30) - ldws N(%r30) - ldws N(%r30) - ldws N(%r30) - - addc - stws res_ptr - addc - stws res_ptr - - addib Loop - -2. mpn_addmul_1 could be improved from the current 10 to 7.5 cycles/limb - (asymptotically) on the PA7100, using the instructions below. With proper - sw pipelining and the unrolling level below, the speed becomes 8 - cycles/limb. - - fldds s1_ptr - fldds s1_ptr - - xmpyu - fstds N(%r30) - xmpyu - fstds N(%r30) - xmpyu - fstds N(%r30) - xmpyu - fstds N(%r30) - - ldws N(%r30) - ldws N(%r30) - ldws N(%r30) - ldws N(%r30) - ldws N(%r30) - ldws N(%r30) - ldws N(%r30) - ldws N(%r30) - addc - addc - addc - addc - addc %r0,%r0,cy-limb - - ldws res_ptr - ldws res_ptr - ldws res_ptr - ldws res_ptr - add - stws res_ptr - addc - stws res_ptr - addc - stws res_ptr - addc - stws res_ptr - - addib - -3. For the PA8000 we have to stick to using 32-bit limbs before compiler - support emerges. But we want to use 64-bit operations whenever possible, - in particular for loads and stores. It is possible to handle mpn_add_n - efficiently by rotating (when s1/s2 are aligned), masking+bit field - inserting when (they are not). The speed should double compared to the - code used today. diff --git a/rts/gmp/mpn/hppa/add_n.s b/rts/gmp/mpn/hppa/add_n.s deleted file mode 100644 index c53b2f7..0000000 --- a/rts/gmp/mpn/hppa/add_n.s +++ /dev/null @@ -1,58 +0,0 @@ -; HP-PA __gmpn_add_n -- Add two limb vectors of the same length > 0 and store -; sum in a third limb vector. - -; Copyright (C) 1992, 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. - - -; INPUT PARAMETERS -; res_ptr gr26 -; s1_ptr gr25 -; s2_ptr gr24 -; size gr23 - -; One might want to unroll this as for other processors, but it turns -; out that the data cache contention after a store makes such -; unrolling useless. We can't come under 5 cycles/limb anyway. - - .code - .export __gmpn_add_n -__gmpn_add_n - .proc - .callinfo frame=0,no_calls - .entry - - ldws,ma 4(0,%r25),%r20 - ldws,ma 4(0,%r24),%r19 - - addib,= -1,%r23,L$end ; check for (SIZE == 1) - add %r20,%r19,%r28 ; add first limbs ignoring cy - -L$loop ldws,ma 4(0,%r25),%r20 - ldws,ma 4(0,%r24),%r19 - stws,ma %r28,4(0,%r26) - addib,<> -1,%r23,L$loop - addc %r20,%r19,%r28 - -L$end stws %r28,0(0,%r26) - bv 0(%r2) - addc %r0,%r0,%r28 - - .exit - .procend diff --git a/rts/gmp/mpn/hppa/gmp-mparam.h b/rts/gmp/mpn/hppa/gmp-mparam.h deleted file mode 100644 index 98b6d9c..0000000 --- a/rts/gmp/mpn/hppa/gmp-mparam.h +++ /dev/null @@ -1,63 +0,0 @@ -/* gmp-mparam.h -- Compiler/machine parameter header file. - -Copyright (C) 1991, 1993, 1994, 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. */ - -#define BITS_PER_MP_LIMB 32 -#define BYTES_PER_MP_LIMB 4 -#define BITS_PER_LONGINT 32 -#define BITS_PER_INT 32 -#define BITS_PER_SHORTINT 16 -#define BITS_PER_CHAR 8 - -/* These values are for the PA7100 using GCC. */ -/* Generated by tuneup.c, 2000-07-25. */ - -#ifndef KARATSUBA_MUL_THRESHOLD -#define KARATSUBA_MUL_THRESHOLD 30 -#endif -#ifndef TOOM3_MUL_THRESHOLD -#define TOOM3_MUL_THRESHOLD 172 -#endif - -#ifndef KARATSUBA_SQR_THRESHOLD -#define KARATSUBA_SQR_THRESHOLD 59 -#endif -#ifndef TOOM3_SQR_THRESHOLD -#define TOOM3_SQR_THRESHOLD 185 -#endif - -#ifndef BZ_THRESHOLD -#define BZ_THRESHOLD 96 -#endif - -#ifndef FIB_THRESHOLD -#define FIB_THRESHOLD 122 -#endif - -#ifndef POWM_THRESHOLD -#define POWM_THRESHOLD 18 -#endif - -#ifndef GCD_ACCEL_THRESHOLD -#define GCD_ACCEL_THRESHOLD 46 -#endif -#ifndef GCDEXT_THRESHOLD -#define GCDEXT_THRESHOLD 33 -#endif diff --git a/rts/gmp/mpn/hppa/hppa1_1/addmul_1.s b/rts/gmp/mpn/hppa/hppa1_1/addmul_1.s deleted file mode 100644 index c7d218f..0000000 --- a/rts/gmp/mpn/hppa/hppa1_1/addmul_1.s +++ /dev/null @@ -1,102 +0,0 @@ -; HP-PA-1.1 __gmpn_addmul_1 -- Multiply a limb vector with a limb and -; add the result to a second limb vector. - -; Copyright (C) 1992, 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. - - -; INPUT PARAMETERS -; res_ptr r26 -; s1_ptr r25 -; size r24 -; s2_limb r23 - -; This runs at 11 cycles/limb on a PA7000. With the used instructions, it -; can not become faster due to data cache contention after a store. On the -; PA7100 it runs at 10 cycles/limb, and that can not be improved either, -; since only the xmpyu does not need the integer pipeline, so the only -; dual-issue we will get are addc+xmpyu. Unrolling could gain a cycle/limb -; on the PA7100. - -; There are some ideas described in mul_1.s that applies to this code too. - - .code - .export __gmpn_addmul_1 -__gmpn_addmul_1 - .proc - .callinfo frame=64,no_calls - .entry - - ldo 64(%r30),%r30 - fldws,ma 4(%r25),%fr5 - stw %r23,-16(%r30) ; move s2_limb ... - addib,= -1,%r24,L$just_one_limb - fldws -16(%r30),%fr4 ; ... into fr4 - add %r0,%r0,%r0 ; clear carry - xmpyu %fr4,%fr5,%fr6 - fldws,ma 4(%r25),%fr7 - fstds %fr6,-16(%r30) - xmpyu %fr4,%fr7,%fr8 - ldw -12(%r30),%r19 ; least significant limb in product - ldw -16(%r30),%r28 - - fstds %fr8,-16(%r30) - addib,= -1,%r24,L$end - ldw -12(%r30),%r1 - -; Main loop -L$loop ldws 0(%r26),%r29 - fldws,ma 4(%r25),%fr5 - add %r29,%r19,%r19 - stws,ma %r19,4(%r26) - addc %r28,%r1,%r19 - xmpyu %fr4,%fr5,%fr6 - ldw -16(%r30),%r28 - fstds %fr6,-16(%r30) - addc %r0,%r28,%r28 - addib,<> -1,%r24,L$loop - ldw -12(%r30),%r1 - -L$end ldw 0(%r26),%r29 - add %r29,%r19,%r19 - stws,ma %r19,4(%r26) - addc %r28,%r1,%r19 - ldw -16(%r30),%r28 - ldws 0(%r26),%r29 - addc %r0,%r28,%r28 - add %r29,%r19,%r19 - stws,ma %r19,4(%r26) - addc %r0,%r28,%r28 - bv 0(%r2) - ldo -64(%r30),%r30 - -L$just_one_limb - xmpyu %fr4,%fr5,%fr6 - ldw 0(%r26),%r29 - fstds %fr6,-16(%r30) - ldw -12(%r30),%r1 - ldw -16(%r30),%r28 - add %r29,%r1,%r19 - stw %r19,0(%r26) - addc %r0,%r28,%r28 - bv 0(%r2) - ldo -64(%r30),%r30 - - .exit - .procend diff --git a/rts/gmp/mpn/hppa/hppa1_1/mul_1.s b/rts/gmp/mpn/hppa/hppa1_1/mul_1.s deleted file mode 100644 index 4512fdd..0000000 --- a/rts/gmp/mpn/hppa/hppa1_1/mul_1.s +++ /dev/null @@ -1,98 +0,0 @@ -; HP-PA-1.1 __gmpn_mul_1 -- Multiply a limb vector with a limb and store -; the result in a second limb vector. - -; Copyright (C) 1992, 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. - - -; INPUT PARAMETERS -; res_ptr r26 -; s1_ptr r25 -; size r24 -; s2_limb r23 - -; This runs at 9 cycles/limb on a PA7000. With the used instructions, it can -; not become faster due to data cache contention after a store. On the -; PA7100 it runs at 7 cycles/limb, and that can not be improved either, since -; only the xmpyu does not need the integer pipeline, so the only dual-issue -; we will get are addc+xmpyu. Unrolling would not help either CPU. - -; We could use fldds to read two limbs at a time from the S1 array, and that -; could bring down the times to 8.5 and 6.5 cycles/limb for the PA7000 and -; PA7100, respectively. We don't do that since it does not seem worth the -; (alignment) troubles... - -; At least the PA7100 is rumored to be able to deal with cache-misses -; without stalling instruction issue. If this is true, and the cache is -; actually also lockup-free, we should use a deeper software pipeline, and -; load from S1 very early! (The loads and stores to -12(sp) will surely be -; in the cache.) - - .code - .export __gmpn_mul_1 -__gmpn_mul_1 - .proc - .callinfo frame=64,no_calls - .entry - - ldo 64(%r30),%r30 - fldws,ma 4(%r25),%fr5 - stw %r23,-16(%r30) ; move s2_limb ... - addib,= -1,%r24,L$just_one_limb - fldws -16(%r30),%fr4 ; ... into fr4 - add %r0,%r0,%r0 ; clear carry - xmpyu %fr4,%fr5,%fr6 - fldws,ma 4(%r25),%fr7 - fstds %fr6,-16(%r30) - xmpyu %fr4,%fr7,%fr8 - ldw -12(%r30),%r19 ; least significant limb in product - ldw -16(%r30),%r28 - - fstds %fr8,-16(%r30) - addib,= -1,%r24,L$end - ldw -12(%r30),%r1 - -; Main loop -L$loop fldws,ma 4(%r25),%fr5 - stws,ma %r19,4(%r26) - addc %r28,%r1,%r19 - xmpyu %fr4,%fr5,%fr6 - ldw -16(%r30),%r28 - fstds %fr6,-16(%r30) - addib,<> -1,%r24,L$loop - ldw -12(%r30),%r1 - -L$end stws,ma %r19,4(%r26) - addc %r28,%r1,%r19 - ldw -16(%r30),%r28 - stws,ma %r19,4(%r26) - addc %r0,%r28,%r28 - bv 0(%r2) - ldo -64(%r30),%r30 - -L$just_one_limb - xmpyu %fr4,%fr5,%fr6 - fstds %fr6,-16(%r30) - ldw -16(%r30),%r28 - ldo -64(%r30),%r30 - bv 0(%r2) - fstws %fr6R,0(%r26) - - .exit - .procend diff --git a/rts/gmp/mpn/hppa/hppa1_1/pa7100/add_n.s b/rts/gmp/mpn/hppa/hppa1_1/pa7100/add_n.s deleted file mode 100644 index 4f4be08..0000000 --- a/rts/gmp/mpn/hppa/hppa1_1/pa7100/add_n.s +++ /dev/null @@ -1,75 +0,0 @@ -; HP-PA __gmpn_add_n -- Add two limb vectors of the same length > 0 and store -; sum in a third limb vector. -; This is optimized for the PA7100, where is runs at 4.25 cycles/limb - -; Copyright (C) 1992, 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. - - -; INPUT PARAMETERS -; res_ptr gr26 -; s1_ptr gr25 -; s2_ptr gr24 -; size gr23 - - .code - .export __gmpn_add_n -__gmpn_add_n - .proc - .callinfo frame=0,no_calls - .entry - - ldws,ma 4(0,%r25),%r20 - ldws,ma 4(0,%r24),%r19 - - addib,<= -5,%r23,L$rest - add %r20,%r19,%r28 ; add first limbs ignoring cy - -L$loop ldws,ma 4(0,%r25),%r20 - ldws,ma 4(0,%r24),%r19 - stws,ma %r28,4(0,%r26) - addc %r20,%r19,%r28 - ldws,ma 4(0,%r25),%r20 - ldws,ma 4(0,%r24),%r19 - stws,ma %r28,4(0,%r26) - addc %r20,%r19,%r28 - ldws,ma 4(0,%r25),%r20 - ldws,ma 4(0,%r24),%r19 - stws,ma %r28,4(0,%r26) - addc %r20,%r19,%r28 - ldws,ma 4(0,%r25),%r20 - ldws,ma 4(0,%r24),%r19 - stws,ma %r28,4(0,%r26) - addib,> -4,%r23,L$loop - addc %r20,%r19,%r28 - -L$rest addib,= 4,%r23,L$end - nop -L$eloop ldws,ma 4(0,%r25),%r20 - ldws,ma 4(0,%r24),%r19 - stws,ma %r28,4(0,%r26) - addib,> -1,%r23,L$eloop - addc %r20,%r19,%r28 - -L$end stws %r28,0(0,%r26) - bv 0(%r2) - addc %r0,%r0,%r28 - - .exit - .procend diff --git a/rts/gmp/mpn/hppa/hppa1_1/pa7100/addmul_1.S b/rts/gmp/mpn/hppa/hppa1_1/pa7100/addmul_1.S deleted file mode 100644 index 04db068..0000000 --- a/rts/gmp/mpn/hppa/hppa1_1/pa7100/addmul_1.S +++ /dev/null @@ -1,189 +0,0 @@ -; HP-PA 7100/7200 __gmpn_addmul_1 -- Multiply a limb vector with a limb and -; add the result to a second limb vector. - -; Copyright (C) 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. - -; INPUT PARAMETERS -#define res_ptr %r26 -#define s1_ptr %r25 -#define size %r24 -#define s2_limb %r23 - -#define cylimb %r28 -#define s0 %r19 -#define s1 %r20 -#define s2 %r3 -#define s3 %r4 -#define lo0 %r21 -#define lo1 %r5 -#define lo2 %r6 -#define lo3 %r7 -#define hi0 %r22 -#define hi1 %r23 /* safe to reuse */ -#define hi2 %r29 -#define hi3 %r1 - - .code - .export __gmpn_addmul_1 -__gmpn_addmul_1 - .proc - .callinfo frame=128,no_calls - .entry - - ldo 128(%r30),%r30 - stws s2_limb,-16(%r30) - add %r0,%r0,cylimb ; clear cy and cylimb - addib,< -4,size,L$few_limbs - fldws -16(%r30),%fr31R - - ldo -112(%r30),%r31 - stw %r3,-96(%r30) - stw %r4,-92(%r30) - stw %r5,-88(%r30) - stw %r6,-84(%r30) - stw %r7,-80(%r30) - - bb,>=,n s1_ptr,29,L$0 - - fldws,ma 4(s1_ptr),%fr4 - ldws 0(res_ptr),s0 - xmpyu %fr4,%fr31R,%fr5 - fstds %fr5,-16(%r31) - ldws -16(%r31),cylimb - ldws -12(%r31),lo0 - add s0,lo0,s0 - addib,< -1,size,L$few_limbs - stws,ma s0,4(res_ptr) - -; start software pipeline ---------------------------------------------------- -L$0 fldds,ma 8(s1_ptr),%fr4 - fldds,ma 8(s1_ptr),%fr8 - - xmpyu %fr4L,%fr31R,%fr5 - xmpyu %fr4R,%fr31R,%fr6 - xmpyu %fr8L,%fr31R,%fr9 - xmpyu %fr8R,%fr31R,%fr10 - - fstds %fr5,-16(%r31) - fstds %fr6,-8(%r31) - fstds %fr9,0(%r31) - fstds %fr10,8(%r31) - - ldws -16(%r31),hi0 - ldws -12(%r31),lo0 - ldws -8(%r31),hi1 - ldws -4(%r31),lo1 - ldws 0(%r31),hi2 - ldws 4(%r31),lo2 - ldws 8(%r31),hi3 - ldws 12(%r31),lo3 - - addc lo0,cylimb,lo0 - addc lo1,hi0,lo1 - addc lo2,hi1,lo2 - addc lo3,hi2,lo3 - - addib,< -4,size,L$end - addc %r0,hi3,cylimb ; propagate carry into cylimb -; main loop ------------------------------------------------------------------ -L$loop fldds,ma 8(s1_ptr),%fr4 - fldds,ma 8(s1_ptr),%fr8 - - ldws 0(res_ptr),s0 - xmpyu %fr4L,%fr31R,%fr5 - ldws 4(res_ptr),s1 - xmpyu %fr4R,%fr31R,%fr6 - ldws 8(res_ptr),s2 - xmpyu %fr8L,%fr31R,%fr9 - ldws 12(res_ptr),s3 - xmpyu %fr8R,%fr31R,%fr10 - - fstds %fr5,-16(%r31) - add s0,lo0,s0 - fstds %fr6,-8(%r31) - addc s1,lo1,s1 - fstds %fr9,0(%r31) - addc s2,lo2,s2 - fstds %fr10,8(%r31) - addc s3,lo3,s3 - - ldws -16(%r31),hi0 - ldws -12(%r31),lo0 - ldws -8(%r31),hi1 - ldws -4(%r31),lo1 - ldws 0(%r31),hi2 - ldws 4(%r31),lo2 - ldws 8(%r31),hi3 - ldws 12(%r31),lo3 - - addc lo0,cylimb,lo0 - stws,ma s0,4(res_ptr) - addc lo1,hi0,lo1 - stws,ma s1,4(res_ptr) - addc lo2,hi1,lo2 - stws,ma s2,4(res_ptr) - addc lo3,hi2,lo3 - stws,ma s3,4(res_ptr) - - addib,>= -4,size,L$loop - addc %r0,hi3,cylimb ; propagate carry into cylimb -; finish software pipeline --------------------------------------------------- -L$end ldws 0(res_ptr),s0 - ldws 4(res_ptr),s1 - ldws 8(res_ptr),s2 - ldws 12(res_ptr),s3 - - add s0,lo0,s0 - stws,ma s0,4(res_ptr) - addc s1,lo1,s1 - stws,ma s1,4(res_ptr) - addc s2,lo2,s2 - stws,ma s2,4(res_ptr) - addc s3,lo3,s3 - stws,ma s3,4(res_ptr) - -; restore callee-saves registers --------------------------------------------- - ldw -96(%r30),%r3 - ldw -92(%r30),%r4 - ldw -88(%r30),%r5 - ldw -84(%r30),%r6 - ldw -80(%r30),%r7 - -L$few_limbs - addib,=,n 4,size,L$ret -L$loop2 fldws,ma 4(s1_ptr),%fr4 - ldws 0(res_ptr),s0 - xmpyu %fr4,%fr31R,%fr5 - fstds %fr5,-16(%r30) - ldws -16(%r30),hi0 - ldws -12(%r30),lo0 - addc lo0,cylimb,lo0 - addc %r0,hi0,cylimb - add s0,lo0,s0 - stws,ma s0,4(res_ptr) - addib,<> -1,size,L$loop2 - nop - -L$ret addc %r0,cylimb,cylimb - bv 0(%r2) - ldo -128(%r30),%r30 - - .exit - .procend diff --git a/rts/gmp/mpn/hppa/hppa1_1/pa7100/lshift.s b/rts/gmp/mpn/hppa/hppa1_1/pa7100/lshift.s deleted file mode 100644 index 31669b1..0000000 --- a/rts/gmp/mpn/hppa/hppa1_1/pa7100/lshift.s +++ /dev/null @@ -1,83 +0,0 @@ -; HP-PA __gmpn_lshift -- -; This is optimized for the PA7100, where is runs at 3.25 cycles/limb - -; Copyright (C) 1992, 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. - - -; INPUT PARAMETERS -; res_ptr gr26 -; s_ptr gr25 -; size gr24 -; cnt gr23 - - .code - .export __gmpn_lshift -__gmpn_lshift - .proc - .callinfo frame=64,no_calls - .entry - - sh2add %r24,%r25,%r25 - sh2add %r24,%r26,%r26 - ldws,mb -4(0,%r25),%r22 - subi 32,%r23,%r1 - mtsar %r1 - addib,= -1,%r24,L$0004 - vshd %r0,%r22,%r28 ; compute carry out limb - ldws,mb -4(0,%r25),%r29 - addib,<= -5,%r24,L$rest - vshd %r22,%r29,%r20 - -L$loop ldws,mb -4(0,%r25),%r22 - stws,mb %r20,-4(0,%r26) - vshd %r29,%r22,%r20 - ldws,mb -4(0,%r25),%r29 - stws,mb %r20,-4(0,%r26) - vshd %r22,%r29,%r20 - ldws,mb -4(0,%r25),%r22 - stws,mb %r20,-4(0,%r26) - vshd %r29,%r22,%r20 - ldws,mb -4(0,%r25),%r29 - stws,mb %r20,-4(0,%r26) - addib,> -4,%r24,L$loop - vshd %r22,%r29,%r20 - -L$rest addib,= 4,%r24,L$end1 - nop -L$eloop ldws,mb -4(0,%r25),%r22 - stws,mb %r20,-4(0,%r26) - addib,<= -1,%r24,L$end2 - vshd %r29,%r22,%r20 - ldws,mb -4(0,%r25),%r29 - stws,mb %r20,-4(0,%r26) - addib,> -1,%r24,L$eloop - vshd %r22,%r29,%r20 - -L$end1 stws,mb %r20,-4(0,%r26) - vshd %r29,%r0,%r20 - bv 0(%r2) - stw %r20,-4(0,%r26) -L$end2 stws,mb %r20,-4(0,%r26) -L$0004 vshd %r22,%r0,%r20 - bv 0(%r2) - stw %r20,-4(0,%r26) - - .exit - .procend diff --git a/rts/gmp/mpn/hppa/hppa1_1/pa7100/rshift.s b/rts/gmp/mpn/hppa/hppa1_1/pa7100/rshift.s deleted file mode 100644 index d32b10b..0000000 --- a/rts/gmp/mpn/hppa/hppa1_1/pa7100/rshift.s +++ /dev/null @@ -1,80 +0,0 @@ -; HP-PA __gmpn_rshift -- -; This is optimized for the PA7100, where is runs at 3.25 cycles/limb - -; Copyright (C) 1992, 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. - - -; INPUT PARAMETERS -; res_ptr gr26 -; s_ptr gr25 -; size gr24 -; cnt gr23 - - .code - .export __gmpn_rshift -__gmpn_rshift - .proc - .callinfo frame=64,no_calls - .entry - - ldws,ma 4(0,%r25),%r22 - mtsar %r23 - addib,= -1,%r24,L$0004 - vshd %r22,%r0,%r28 ; compute carry out limb - ldws,ma 4(0,%r25),%r29 - addib,<= -5,%r24,L$rest - vshd %r29,%r22,%r20 - -L$loop ldws,ma 4(0,%r25),%r22 - stws,ma %r20,4(0,%r26) - vshd %r22,%r29,%r20 - ldws,ma 4(0,%r25),%r29 - stws,ma %r20,4(0,%r26) - vshd %r29,%r22,%r20 - ldws,ma 4(0,%r25),%r22 - stws,ma %r20,4(0,%r26) - vshd %r22,%r29,%r20 - ldws,ma 4(0,%r25),%r29 - stws,ma %r20,4(0,%r26) - addib,> -4,%r24,L$loop - vshd %r29,%r22,%r20 - -L$rest addib,= 4,%r24,L$end1 - nop -L$eloop ldws,ma 4(0,%r25),%r22 - stws,ma %r20,4(0,%r26) - addib,<= -1,%r24,L$end2 - vshd %r22,%r29,%r20 - ldws,ma 4(0,%r25),%r29 - stws,ma %r20,4(0,%r26) - addib,> -1,%r24,L$eloop - vshd %r29,%r22,%r20 - -L$end1 stws,ma %r20,4(0,%r26) - vshd %r0,%r29,%r20 - bv 0(%r2) - stw %r20,0(0,%r26) -L$end2 stws,ma %r20,4(0,%r26) -L$0004 vshd %r0,%r22,%r20 - bv 0(%r2) - stw %r20,0(0,%r26) - - .exit - .procend diff --git a/rts/gmp/mpn/hppa/hppa1_1/pa7100/sub_n.s b/rts/gmp/mpn/hppa/hppa1_1/pa7100/sub_n.s deleted file mode 100644 index 0eec41c..0000000 --- a/rts/gmp/mpn/hppa/hppa1_1/pa7100/sub_n.s +++ /dev/null @@ -1,76 +0,0 @@ -; HP-PA __gmpn_sub_n -- Subtract two limb vectors of the same length > 0 and -; store difference in a third limb vector. -; This is optimized for the PA7100, where is runs at 4.25 cycles/limb - -; Copyright (C) 1992, 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. - - -; INPUT PARAMETERS -; res_ptr gr26 -; s1_ptr gr25 -; s2_ptr gr24 -; size gr23 - - .code - .export __gmpn_sub_n -__gmpn_sub_n - .proc - .callinfo frame=0,no_calls - .entry - - ldws,ma 4(0,%r25),%r20 - ldws,ma 4(0,%r24),%r19 - - addib,<= -5,%r23,L$rest - sub %r20,%r19,%r28 ; subtract first limbs ignoring cy - -L$loop ldws,ma 4(0,%r25),%r20 - ldws,ma 4(0,%r24),%r19 - stws,ma %r28,4(0,%r26) - subb %r20,%r19,%r28 - ldws,ma 4(0,%r25),%r20 - ldws,ma 4(0,%r24),%r19 - stws,ma %r28,4(0,%r26) - subb %r20,%r19,%r28 - ldws,ma 4(0,%r25),%r20 - ldws,ma 4(0,%r24),%r19 - stws,ma %r28,4(0,%r26) - subb %r20,%r19,%r28 - ldws,ma 4(0,%r25),%r20 - ldws,ma 4(0,%r24),%r19 - stws,ma %r28,4(0,%r26) - addib,> -4,%r23,L$loop - subb %r20,%r19,%r28 - -L$rest addib,= 4,%r23,L$end - nop -L$eloop ldws,ma 4(0,%r25),%r20 - ldws,ma 4(0,%r24),%r19 - stws,ma %r28,4(0,%r26) - addib,> -1,%r23,L$eloop - subb %r20,%r19,%r28 - -L$end stws %r28,0(0,%r26) - addc %r0,%r0,%r28 - bv 0(%r2) - subi 1,%r28,%r28 - - .exit - .procend diff --git a/rts/gmp/mpn/hppa/hppa1_1/pa7100/submul_1.S b/rts/gmp/mpn/hppa/hppa1_1/pa7100/submul_1.S deleted file mode 100644 index 0fba21d..0000000 --- a/rts/gmp/mpn/hppa/hppa1_1/pa7100/submul_1.S +++ /dev/null @@ -1,195 +0,0 @@ -; HP-PA 7100/7200 __gmpn_submul_1 -- Multiply a limb vector with a limb and -; subtract the result from a second limb vector. - -; Copyright (C) 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. - -; INPUT PARAMETERS -#define res_ptr %r26 -#define s1_ptr %r25 -#define size %r24 -#define s2_limb %r23 - -#define cylimb %r28 -#define s0 %r19 -#define s1 %r20 -#define s2 %r3 -#define s3 %r4 -#define lo0 %r21 -#define lo1 %r5 -#define lo2 %r6 -#define lo3 %r7 -#define hi0 %r22 -#define hi1 %r23 /* safe to reuse */ -#define hi2 %r29 -#define hi3 %r1 - - .code - .export __gmpn_submul_1 -__gmpn_submul_1 - .proc - .callinfo frame=128,no_calls - .entry - - ldo 128(%r30),%r30 - stws s2_limb,-16(%r30) - add %r0,%r0,cylimb ; clear cy and cylimb - addib,< -4,size,L$few_limbs - fldws -16(%r30),%fr31R - - ldo -112(%r30),%r31 - stw %r3,-96(%r30) - stw %r4,-92(%r30) - stw %r5,-88(%r30) - stw %r6,-84(%r30) - stw %r7,-80(%r30) - - bb,>=,n s1_ptr,29,L$0 - - fldws,ma 4(s1_ptr),%fr4 - ldws 0(res_ptr),s0 - xmpyu %fr4,%fr31R,%fr5 - fstds %fr5,-16(%r31) - ldws -16(%r31),cylimb - ldws -12(%r31),lo0 - sub s0,lo0,s0 - add s0,lo0,%r0 ; invert cy - addib,< -1,size,L$few_limbs - stws,ma s0,4(res_ptr) - -; start software pipeline ---------------------------------------------------- -L$0 fldds,ma 8(s1_ptr),%fr4 - fldds,ma 8(s1_ptr),%fr8 - - xmpyu %fr4L,%fr31R,%fr5 - xmpyu %fr4R,%fr31R,%fr6 - xmpyu %fr8L,%fr31R,%fr9 - xmpyu %fr8R,%fr31R,%fr10 - - fstds %fr5,-16(%r31) - fstds %fr6,-8(%r31) - fstds %fr9,0(%r31) - fstds %fr10,8(%r31) - - ldws -16(%r31),hi0 - ldws -12(%r31),lo0 - ldws -8(%r31),hi1 - ldws -4(%r31),lo1 - ldws 0(%r31),hi2 - ldws 4(%r31),lo2 - ldws 8(%r31),hi3 - ldws 12(%r31),lo3 - - addc lo0,cylimb,lo0 - addc lo1,hi0,lo1 - addc lo2,hi1,lo2 - addc lo3,hi2,lo3 - - addib,< -4,size,L$end - addc %r0,hi3,cylimb ; propagate carry into cylimb -; main loop ------------------------------------------------------------------ -L$loop fldds,ma 8(s1_ptr),%fr4 - fldds,ma 8(s1_ptr),%fr8 - - ldws 0(res_ptr),s0 - xmpyu %fr4L,%fr31R,%fr5 - ldws 4(res_ptr),s1 - xmpyu %fr4R,%fr31R,%fr6 - ldws 8(res_ptr),s2 - xmpyu %fr8L,%fr31R,%fr9 - ldws 12(res_ptr),s3 - xmpyu %fr8R,%fr31R,%fr10 - - fstds %fr5,-16(%r31) - sub s0,lo0,s0 - fstds %fr6,-8(%r31) - subb s1,lo1,s1 - fstds %fr9,0(%r31) - subb s2,lo2,s2 - fstds %fr10,8(%r31) - subb s3,lo3,s3 - subb %r0,%r0,lo0 ; these two insns ... - add lo0,lo0,%r0 ; ... just invert cy - - ldws -16(%r31),hi0 - ldws -12(%r31),lo0 - ldws -8(%r31),hi1 - ldws -4(%r31),lo1 - ldws 0(%r31),hi2 - ldws 4(%r31),lo2 - ldws 8(%r31),hi3 - ldws 12(%r31),lo3 - - addc lo0,cylimb,lo0 - stws,ma s0,4(res_ptr) - addc lo1,hi0,lo1 - stws,ma s1,4(res_ptr) - addc lo2,hi1,lo2 - stws,ma s2,4(res_ptr) - addc lo3,hi2,lo3 - stws,ma s3,4(res_ptr) - - addib,>= -4,size,L$loop - addc %r0,hi3,cylimb ; propagate carry into cylimb -; finish software pipeline --------------------------------------------------- -L$end ldws 0(res_ptr),s0 - ldws 4(res_ptr),s1 - ldws 8(res_ptr),s2 - ldws 12(res_ptr),s3 - - sub s0,lo0,s0 - stws,ma s0,4(res_ptr) - subb s1,lo1,s1 - stws,ma s1,4(res_ptr) - subb s2,lo2,s2 - stws,ma s2,4(res_ptr) - subb s3,lo3,s3 - stws,ma s3,4(res_ptr) - subb %r0,%r0,lo0 ; these two insns ... - add lo0,lo0,%r0 ; ... invert cy - -; restore callee-saves registers --------------------------------------------- - ldw -96(%r30),%r3 - ldw -92(%r30),%r4 - ldw -88(%r30),%r5 - ldw -84(%r30),%r6 - ldw -80(%r30),%r7 - -L$few_limbs - addib,=,n 4,size,L$ret -L$loop2 fldws,ma 4(s1_ptr),%fr4 - ldws 0(res_ptr),s0 - xmpyu %fr4,%fr31R,%fr5 - fstds %fr5,-16(%r30) - ldws -16(%r30),hi0 - ldws -12(%r30),lo0 - addc lo0,cylimb,lo0 - addc %r0,hi0,cylimb - sub s0,lo0,s0 - add s0,lo0,%r0 ; invert cy - stws,ma s0,4(res_ptr) - addib,<> -1,size,L$loop2 - nop - -L$ret addc %r0,cylimb,cylimb - bv 0(%r2) - ldo -128(%r30),%r30 - - .exit - .procend diff --git a/rts/gmp/mpn/hppa/hppa1_1/submul_1.s b/rts/gmp/mpn/hppa/hppa1_1/submul_1.s deleted file mode 100644 index 20a5b5c..0000000 --- a/rts/gmp/mpn/hppa/hppa1_1/submul_1.s +++ /dev/null @@ -1,111 +0,0 @@ -; HP-PA-1.1 __gmpn_submul_1 -- Multiply a limb vector with a limb and -; subtract the result from a second limb vector. - -; Copyright (C) 1992, 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. - - -; INPUT PARAMETERS -; res_ptr r26 -; s1_ptr r25 -; size r24 -; s2_limb r23 - -; This runs at 12 cycles/limb on a PA7000. With the used instructions, it -; can not become faster due to data cache contention after a store. On the -; PA7100 it runs at 11 cycles/limb, and that can not be improved either, -; since only the xmpyu does not need the integer pipeline, so the only -; dual-issue we will get are addc+xmpyu. Unrolling could gain a cycle/limb -; on the PA7100. - -; There are some ideas described in mul_1.s that applies to this code too. - -; It seems possible to make this run as fast as __gmpn_addmul_1, if we use -; sub,>>= %r29,%r19,%r22 -; addi 1,%r28,%r28 -; but that requires reworking the hairy software pipeline... - - .code - .export __gmpn_submul_1 -__gmpn_submul_1 - .proc - .callinfo frame=64,no_calls - .entry - - ldo 64(%r30),%r30 - fldws,ma 4(%r25),%fr5 - stw %r23,-16(%r30) ; move s2_limb ... - addib,= -1,%r24,L$just_one_limb - fldws -16(%r30),%fr4 ; ... into fr4 - add %r0,%r0,%r0 ; clear carry - xmpyu %fr4,%fr5,%fr6 - fldws,ma 4(%r25),%fr7 - fstds %fr6,-16(%r30) - xmpyu %fr4,%fr7,%fr8 - ldw -12(%r30),%r19 ; least significant limb in product - ldw -16(%r30),%r28 - - fstds %fr8,-16(%r30) - addib,= -1,%r24,L$end - ldw -12(%r30),%r1 - -; Main loop -L$loop ldws 0(%r26),%r29 - fldws,ma 4(%r25),%fr5 - sub %r29,%r19,%r22 - add %r22,%r19,%r0 - stws,ma %r22,4(%r26) - addc %r28,%r1,%r19 - xmpyu %fr4,%fr5,%fr6 - ldw -16(%r30),%r28 - fstds %fr6,-16(%r30) - addc %r0,%r28,%r28 - addib,<> -1,%r24,L$loop - ldw -12(%r30),%r1 - -L$end ldw 0(%r26),%r29 - sub %r29,%r19,%r22 - add %r22,%r19,%r0 - stws,ma %r22,4(%r26) - addc %r28,%r1,%r19 - ldw -16(%r30),%r28 - ldws 0(%r26),%r29 - addc %r0,%r28,%r28 - sub %r29,%r19,%r22 - add %r22,%r19,%r0 - stws,ma %r22,4(%r26) - addc %r0,%r28,%r28 - bv 0(%r2) - ldo -64(%r30),%r30 - -L$just_one_limb - xmpyu %fr4,%fr5,%fr6 - ldw 0(%r26),%r29 - fstds %fr6,-16(%r30) - ldw -12(%r30),%r1 - ldw -16(%r30),%r28 - sub %r29,%r1,%r22 - add %r22,%r1,%r0 - stw %r22,0(%r26) - addc %r0,%r28,%r28 - bv 0(%r2) - ldo -64(%r30),%r30 - - .exit - .procend diff --git a/rts/gmp/mpn/hppa/hppa1_1/udiv_qrnnd.S b/rts/gmp/mpn/hppa/hppa1_1/udiv_qrnnd.S deleted file mode 100644 index b83d6f4..0000000 --- a/rts/gmp/mpn/hppa/hppa1_1/udiv_qrnnd.S +++ /dev/null @@ -1,80 +0,0 @@ -; HP-PA __udiv_qrnnd division support, used from longlong.h. -; This version runs fast on PA 7000 and later. - -; Copyright (C) 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. - - -; INPUT PARAMETERS -; rem_ptr gr26 -; n1 gr25 -; n0 gr24 -; d gr23 - - .code -L$0000 .word 0x43f00000 ; 2^64 - .word 0x0 - .export __gmpn_udiv_qrnnd -__gmpn_udiv_qrnnd - .proc - .callinfo frame=64,no_calls - .entry - ldo 64(%r30),%r30 - - stws %r25,-16(0,%r30) ; n_hi - stws %r24,-12(0,%r30) ; n_lo -#ifdef PIC - addil LT%L$0000,%r19 - ldo RT%L$0000(%r1),%r19 -#else - ldil L%L$0000,%r19 - ldo R%L$0000(%r19),%r19 -#endif - fldds -16(0,%r30),%fr5 - stws %r23,-12(0,%r30) - comib,<= 0,%r25,L$1 - fcnvxf,dbl,dbl %fr5,%fr5 - fldds 0(0,%r19),%fr4 - fadd,dbl %fr4,%fr5,%fr5 -L$1 - fcpy,sgl %fr0,%fr6L - fldws -12(0,%r30),%fr6R - fcnvxf,dbl,dbl %fr6,%fr4 - - fdiv,dbl %fr5,%fr4,%fr5 - - fcnvfx,dbl,dbl %fr5,%fr4 - fstws %fr4R,-16(%r30) - xmpyu %fr4R,%fr6R,%fr6 - ldws -16(%r30),%r28 - fstds %fr6,-16(0,%r30) - ldws -12(0,%r30),%r21 - ldws -16(0,%r30),%r20 - sub %r24,%r21,%r22 - subb %r25,%r20,%r19 - comib,= 0,%r19,L$2 - ldo -64(%r30),%r30 - - add %r22,%r23,%r22 - ldo -1(%r28),%r28 -L$2 bv 0(%r2) - stws %r22,0(0,%r26) - - .exit - .procend diff --git a/rts/gmp/mpn/hppa/hppa1_1/umul.s b/rts/gmp/mpn/hppa/hppa1_1/umul.s deleted file mode 100644 index 1f1300a..0000000 --- a/rts/gmp/mpn/hppa/hppa1_1/umul.s +++ /dev/null @@ -1,42 +0,0 @@ -; Copyright (C) 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. - - .code - .export __umul_ppmm - .align 4 -__umul_ppmm - .proc - .callinfo frame=64,no_calls - .entry - - ldo 64(%r30),%r30 - stw %r25,-16(0,%r30) - fldws -16(0,%r30),%fr22R - stw %r24,-16(0,%r30) - fldws -16(0,%r30),%fr22L - xmpyu %fr22R,%fr22L,%fr22 - fstds %fr22,-16(0,%r30) - ldw -16(0,%r30),%r28 - ldw -12(0,%r30),%r29 - stw %r29,0(0,%r26) - bv 0(%r2) - ldo -64(%r30),%r30 - - .exit - .procend diff --git a/rts/gmp/mpn/hppa/hppa2_0/add_n.s b/rts/gmp/mpn/hppa/hppa2_0/add_n.s deleted file mode 100644 index 6e97278..0000000 --- a/rts/gmp/mpn/hppa/hppa2_0/add_n.s +++ /dev/null @@ -1,88 +0,0 @@ -; HP-PA 2.0 32-bit __gmpn_add_n -- Add two limb vectors of the same length > 0 -; and store sum in a third limb vector. - -; Copyright (C) 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. - - -; INPUT PARAMETERS -; res_ptr gr26 -; s1_ptr gr25 -; s2_ptr gr24 -; size gr23 - -; This runs at 2 cycles/limb on PA8000. - - .code - .export __gmpn_add_n -__gmpn_add_n - .proc - .callinfo frame=0,no_calls - .entry - - sub %r0,%r23,%r22 - zdep %r22,30,3,%r28 ; r28 = 2 * (-n & 7) - zdep %r22,29,3,%r22 ; r22 = 4 * (-n & 7) - sub %r25,%r22,%r25 ; offset s1_ptr - sub %r24,%r22,%r24 ; offset s2_ptr - sub %r26,%r22,%r26 ; offset res_ptr - blr %r28,%r0 ; branch into loop - add %r0,%r0,%r0 ; reset carry - -L$loop ldw 0(%r25),%r20 - ldw 0(%r24),%r31 - addc %r20,%r31,%r20 - stw %r20,0(%r26) -L$7 ldw 4(%r25),%r21 - ldw 4(%r24),%r19 - addc %r21,%r19,%r21 - stw %r21,4(%r26) -L$6 ldw 8(%r25),%r20 - ldw 8(%r24),%r31 - addc %r20,%r31,%r20 - stw %r20,8(%r26) -L$5 ldw 12(%r25),%r21 - ldw 12(%r24),%r19 - addc %r21,%r19,%r21 - stw %r21,12(%r26) -L$4 ldw 16(%r25),%r20 - ldw 16(%r24),%r31 - addc %r20,%r31,%r20 - stw %r20,16(%r26) -L$3 ldw 20(%r25),%r21 - ldw 20(%r24),%r19 - addc %r21,%r19,%r21 - stw %r21,20(%r26) -L$2 ldw 24(%r25),%r20 - ldw 24(%r24),%r31 - addc %r20,%r31,%r20 - stw %r20,24(%r26) -L$1 ldw 28(%r25),%r21 - ldo 32(%r25),%r25 - ldw 28(%r24),%r19 - addc %r21,%r19,%r21 - stw %r21,28(%r26) - ldo 32(%r24),%r24 - addib,> -8,%r23,L$loop - ldo 32(%r26),%r26 - - bv (%r2) - .exit - addc %r0,%r0,%r28 - .procend diff --git a/rts/gmp/mpn/hppa/hppa2_0/sub_n.s b/rts/gmp/mpn/hppa/hppa2_0/sub_n.s deleted file mode 100644 index 7d9b50f..0000000 --- a/rts/gmp/mpn/hppa/hppa2_0/sub_n.s +++ /dev/null @@ -1,88 +0,0 @@ -; HP-PA 2.0 32-bit __gmpn_sub_n -- Subtract two limb vectors of the same -; length > 0 and store difference in a third limb vector. - -; Copyright (C) 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. - - -; INPUT PARAMETERS -; res_ptr gr26 -; s1_ptr gr25 -; s2_ptr gr24 -; size gr23 - -; This runs at 2 cycles/limb on PA8000. - - .code - .export __gmpn_sub_n -__gmpn_sub_n - .proc - .callinfo frame=0,no_calls - .entry - - sub %r0,%r23,%r22 - zdep %r22,30,3,%r28 ; r28 = 2 * (-n & 7) - zdep %r22,29,3,%r22 ; r22 = 4 * (-n & 7) - sub %r25,%r22,%r25 ; offset s1_ptr - sub %r24,%r22,%r24 ; offset s2_ptr - blr %r28,%r0 ; branch into loop - sub %r26,%r22,%r26 ; offset res_ptr and set carry - -L$loop ldw 0(%r25),%r20 - ldw 0(%r24),%r31 - subb %r20,%r31,%r20 - stw %r20,0(%r26) -L$7 ldw 4(%r25),%r21 - ldw 4(%r24),%r19 - subb %r21,%r19,%r21 - stw %r21,4(%r26) -L$6 ldw 8(%r25),%r20 - ldw 8(%r24),%r31 - subb %r20,%r31,%r20 - stw %r20,8(%r26) -L$5 ldw 12(%r25),%r21 - ldw 12(%r24),%r19 - subb %r21,%r19,%r21 - stw %r21,12(%r26) -L$4 ldw 16(%r25),%r20 - ldw 16(%r24),%r31 - subb %r20,%r31,%r20 - stw %r20,16(%r26) -L$3 ldw 20(%r25),%r21 - ldw 20(%r24),%r19 - subb %r21,%r19,%r21 - stw %r21,20(%r26) -L$2 ldw 24(%r25),%r20 - ldw 24(%r24),%r31 - subb %r20,%r31,%r20 - stw %r20,24(%r26) -L$1 ldw 28(%r25),%r21 - ldo 32(%r25),%r25 - ldw 28(%r24),%r19 - subb %r21,%r19,%r21 - stw %r21,28(%r26) - ldo 32(%r24),%r24 - addib,> -8,%r23,L$loop - ldo 32(%r26),%r26 - - addc %r0,%r0,%r28 - bv (%r2) - .exit - subi 1,%r28,%r28 - .procend diff --git a/rts/gmp/mpn/hppa/lshift.s b/rts/gmp/mpn/hppa/lshift.s deleted file mode 100644 index f5a2daa..0000000 --- a/rts/gmp/mpn/hppa/lshift.s +++ /dev/null @@ -1,66 +0,0 @@ -; HP-PA __gmpn_lshift -- - -; Copyright (C) 1992, 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. - - -; INPUT PARAMETERS -; res_ptr gr26 -; s_ptr gr25 -; size gr24 -; cnt gr23 - - .code - .export __gmpn_lshift -__gmpn_lshift - .proc - .callinfo frame=64,no_calls - .entry - - sh2add %r24,%r25,%r25 - sh2add %r24,%r26,%r26 - ldws,mb -4(0,%r25),%r22 - subi 32,%r23,%r1 - mtsar %r1 - addib,= -1,%r24,L$0004 - vshd %r0,%r22,%r28 ; compute carry out limb - ldws,mb -4(0,%r25),%r29 - addib,= -1,%r24,L$0002 - vshd %r22,%r29,%r20 - -L$loop ldws,mb -4(0,%r25),%r22 - stws,mb %r20,-4(0,%r26) - addib,= -1,%r24,L$0003 - vshd %r29,%r22,%r20 - ldws,mb -4(0,%r25),%r29 - stws,mb %r20,-4(0,%r26) - addib,<> -1,%r24,L$loop - vshd %r22,%r29,%r20 - -L$0002 stws,mb %r20,-4(0,%r26) - vshd %r29,%r0,%r20 - bv 0(%r2) - stw %r20,-4(0,%r26) -L$0003 stws,mb %r20,-4(0,%r26) -L$0004 vshd %r22,%r0,%r20 - bv 0(%r2) - stw %r20,-4(0,%r26) - - .exit - .procend diff --git a/rts/gmp/mpn/hppa/rshift.s b/rts/gmp/mpn/hppa/rshift.s deleted file mode 100644 index e05e2f1..0000000 --- a/rts/gmp/mpn/hppa/rshift.s +++ /dev/null @@ -1,63 +0,0 @@ -; HP-PA __gmpn_rshift -- - -; Copyright (C) 1992, 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. - - -; INPUT PARAMETERS -; res_ptr gr26 -; s_ptr gr25 -; size gr24 -; cnt gr23 - - .code - .export __gmpn_rshift -__gmpn_rshift - .proc - .callinfo frame=64,no_calls - .entry - - ldws,ma 4(0,%r25),%r22 - mtsar %r23 - addib,= -1,%r24,L$0004 - vshd %r22,%r0,%r28 ; compute carry out limb - ldws,ma 4(0,%r25),%r29 - addib,= -1,%r24,L$0002 - vshd %r29,%r22,%r20 - -L$loop ldws,ma 4(0,%r25),%r22 - stws,ma %r20,4(0,%r26) - addib,= -1,%r24,L$0003 - vshd %r22,%r29,%r20 - ldws,ma 4(0,%r25),%r29 - stws,ma %r20,4(0,%r26) - addib,<> -1,%r24,L$loop - vshd %r29,%r22,%r20 - -L$0002 stws,ma %r20,4(0,%r26) - vshd %r0,%r29,%r20 - bv 0(%r2) - stw %r20,0(0,%r26) -L$0003 stws,ma %r20,4(0,%r26) -L$0004 vshd %r0,%r22,%r20 - bv 0(%r2) - stw %r20,0(0,%r26) - - .exit - .procend diff --git a/rts/gmp/mpn/hppa/sub_n.s b/rts/gmp/mpn/hppa/sub_n.s deleted file mode 100644 index 8f770ad..0000000 --- a/rts/gmp/mpn/hppa/sub_n.s +++ /dev/null @@ -1,59 +0,0 @@ -; HP-PA __gmpn_sub_n -- Subtract two limb vectors of the same length > 0 and -; store difference in a third limb vector. - -; Copyright (C) 1992, 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. - - -; INPUT PARAMETERS -; res_ptr gr26 -; s1_ptr gr25 -; s2_ptr gr24 -; size gr23 - -; One might want to unroll this as for other processors, but it turns -; out that the data cache contention after a store makes such -; unrolling useless. We can't come under 5 cycles/limb anyway. - - .code - .export __gmpn_sub_n -__gmpn_sub_n - .proc - .callinfo frame=0,no_calls - .entry - - ldws,ma 4(0,%r25),%r20 - ldws,ma 4(0,%r24),%r19 - - addib,= -1,%r23,L$end ; check for (SIZE == 1) - sub %r20,%r19,%r28 ; subtract first limbs ignoring cy - -L$loop ldws,ma 4(0,%r25),%r20 - ldws,ma 4(0,%r24),%r19 - stws,ma %r28,4(0,%r26) - addib,<> -1,%r23,L$loop - subb %r20,%r19,%r28 - -L$end stws %r28,0(0,%r26) - addc %r0,%r0,%r28 - bv 0(%r2) - subi 1,%r28,%r28 - - .exit - .procend diff --git a/rts/gmp/mpn/hppa/udiv_qrnnd.s b/rts/gmp/mpn/hppa/udiv_qrnnd.s deleted file mode 100644 index 9aa3b8a..0000000 --- a/rts/gmp/mpn/hppa/udiv_qrnnd.s +++ /dev/null @@ -1,286 +0,0 @@ -; HP-PA __udiv_qrnnd division support, used from longlong.h. -; This version runs fast on pre-PA7000 CPUs. - -; Copyright (C) 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. - - -; INPUT PARAMETERS -; rem_ptr gr26 -; n1 gr25 -; n0 gr24 -; d gr23 - -; The code size is a bit excessive. We could merge the last two ds;addc -; sequences by simply moving the "bb,< Odd" instruction down. The only -; trouble is the FFFFFFFF code that would need some hacking. - - .code - .export __gmpn_udiv_qrnnd -__gmpn_udiv_qrnnd - .proc - .callinfo frame=0,no_calls - .entry - - comb,< %r23,0,L$largedivisor - sub %r0,%r23,%r1 ; clear cy as side-effect - ds %r0,%r1,%r0 - addc %r24,%r24,%r24 - ds %r25,%r23,%r25 - addc %r24,%r24,%r24 - ds %r25,%r23,%r25 - addc %r24,%r24,%r24 - ds %r25,%r23,%r25 - addc %r24,%r24,%r24 - ds %r25,%r23,%r25 - addc %r24,%r24,%r24 - ds %r25,%r23,%r25 - addc %r24,%r24,%r24 - ds %r25,%r23,%r25 - addc %r24,%r24,%r24 - ds %r25,%r23,%r25 - addc %r24,%r24,%r24 - ds %r25,%r23,%r25 - addc %r24,%r24,%r24 - ds %r25,%r23,%r25 - addc %r24,%r24,%r24 - ds %r25,%r23,%r25 - addc %r24,%r24,%r24 - ds %r25,%r23,%r25 - addc %r24,%r24,%r24 - ds %r25,%r23,%r25 - addc %r24,%r24,%r24 - ds %r25,%r23,%r25 - addc %r24,%r24,%r24 - ds %r25,%r23,%r25 - addc %r24,%r24,%r24 - ds %r25,%r23,%r25 - addc %r24,%r24,%r24 - ds %r25,%r23,%r25 - addc %r24,%r24,%r24 - ds %r25,%r23,%r25 - addc %r24,%r24,%r24 - ds %r25,%r23,%r25 - addc %r24,%r24,%r24 - ds %r25,%r23,%r25 - addc %r24,%r24,%r24 - ds %r25,%r23,%r25 - addc %r24,%r24,%r24 - ds %r25,%r23,%r25 - addc %r24,%r24,%r24 - ds %r25,%r23,%r25 - addc %r24,%r24,%r24 - ds %r25,%r23,%r25 - addc %r24,%r24,%r24 - ds %r25,%r23,%r25 - addc %r24,%r24,%r24 - ds %r25,%r23,%r25 - addc %r24,%r24,%r24 - ds %r25,%r23,%r25 - addc %r24,%r24,%r24 - ds %r25,%r23,%r25 - addc %r24,%r24,%r24 - ds %r25,%r23,%r25 - addc %r24,%r24,%r24 - ds %r25,%r23,%r25 - addc %r24,%r24,%r24 - ds %r25,%r23,%r25 - addc %r24,%r24,%r24 - ds %r25,%r23,%r25 - addc %r24,%r24,%r28 - ds %r25,%r23,%r25 - comclr,>= %r25,%r0,%r0 - addl %r25,%r23,%r25 - stws %r25,0(0,%r26) - bv 0(%r2) - addc %r28,%r28,%r28 - -L$largedivisor - extru %r24,31,1,%r19 ; r19 = n0 & 1 - bb,< %r23,31,L$odd - extru %r23,30,31,%r22 ; r22 = d >> 1 - shd %r25,%r24,1,%r24 ; r24 = new n0 - extru %r25,30,31,%r25 ; r25 = new n1 - sub %r0,%r22,%r21 - ds %r0,%r21,%r0 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - comclr,>= %r25,%r0,%r0 - addl %r25,%r22,%r25 - sh1addl %r25,%r19,%r25 - stws %r25,0(0,%r26) - bv 0(%r2) - addc %r24,%r24,%r28 - -L$odd addib,sv,n 1,%r22,L$FF.. ; r22 = (d / 2 + 1) - shd %r25,%r24,1,%r24 ; r24 = new n0 - extru %r25,30,31,%r25 ; r25 = new n1 - sub %r0,%r22,%r21 - ds %r0,%r21,%r0 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r24 - ds %r25,%r22,%r25 - addc %r24,%r24,%r28 - comclr,>= %r25,%r0,%r0 - addl %r25,%r22,%r25 - sh1addl %r25,%r19,%r25 -; We have computed (n1,,n0) / (d + 1), q' = r28, r' = r25 - add,nuv %r28,%r25,%r25 - addl %r25,%r1,%r25 - addc %r0,%r28,%r28 - sub,<< %r25,%r23,%r0 - addl %r25,%r1,%r25 - stws %r25,0(0,%r26) - bv 0(%r2) - addc %r0,%r28,%r28 - -; This is just a special case of the code above. -; We come here when d == 0xFFFFFFFF -L$FF.. add,uv %r25,%r24,%r24 - sub,<< %r24,%r23,%r0 - ldo 1(%r24),%r24 - stws %r24,0(0,%r26) - bv 0(%r2) - addc %r0,%r25,%r28 - - .exit - .procend diff --git a/rts/gmp/mpn/i960/README b/rts/gmp/mpn/i960/README deleted file mode 100644 index d68a0a8..0000000 --- a/rts/gmp/mpn/i960/README +++ /dev/null @@ -1,9 +0,0 @@ -This directory contains mpn functions for Intel i960 processors. - -RELEVANT OPTIMIZATION ISSUES - -The code in this directory is not well optimized. - -STATUS - -The code in this directory has not been tested. diff --git a/rts/gmp/mpn/i960/add_n.s b/rts/gmp/mpn/i960/add_n.s deleted file mode 100644 index 387317a..0000000 --- a/rts/gmp/mpn/i960/add_n.s +++ /dev/null @@ -1,43 +0,0 @@ -# I960 __gmpn_add_n -- Add two limb vectors of the same length > 0 and store -# sum in a third limb vector. - -# Copyright (C) 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. - -.text - .align 4 - .globl ___gmpn_add_n -___gmpn_add_n: - mov 0,g6 # clear carry-save register - cmpo 1,0 # clear cy - -Loop: subo 1,g3,g3 # update loop counter - ld (g1),g5 # load from s1_ptr - addo 4,g1,g1 # s1_ptr++ - ld (g2),g4 # load from s2_ptr - addo 4,g2,g2 # s2_ptr++ - cmpo g6,1 # restore cy from g6, relies on cy being 0 - addc g4,g5,g4 # main add - subc 0,0,g6 # save cy in g6 - st g4,(g0) # store result to res_ptr - addo 4,g0,g0 # res_ptr++ - cmpobne 0,g3,Loop # when branch is taken, clears C bit - - mov g6,g0 - ret diff --git a/rts/gmp/mpn/i960/addmul_1.s b/rts/gmp/mpn/i960/addmul_1.s deleted file mode 100644 index 7df1418..0000000 --- a/rts/gmp/mpn/i960/addmul_1.s +++ /dev/null @@ -1,48 +0,0 @@ -# I960 __gmpn_addmul_1 -- Multiply a limb vector with a limb and add -# the result to a second limb vector. - -# Copyright (C) 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. - -.text - .align 4 - .globl ___gmpn_mul_1 -___gmpn_mul_1: - subo g2,0,g2 - shlo 2,g2,g4 - subo g4,g1,g1 - subo g4,g0,g13 - mov 0,g0 - - cmpo 1,0 # clear C bit on AC.cc - -Loop: ld (g1)[g2*4],g5 - emul g3,g5,g6 - ld (g13)[g2*4],g5 - - addc g0,g6,g6 # relies on that C bit is clear - addc 0,g7,g7 - addc g5,g6,g6 # relies on that C bit is clear - st g6,(g13)[g2*4] - addc 0,g7,g0 - - addo g2,1,g2 - cmpobne 0,g2,Loop # when branch is taken, clears C bit - - ret diff --git a/rts/gmp/mpn/i960/mul_1.s b/rts/gmp/mpn/i960/mul_1.s deleted file mode 100644 index 5c0c985..0000000 --- a/rts/gmp/mpn/i960/mul_1.s +++ /dev/null @@ -1,45 +0,0 @@ -# I960 __gmpn_mul_1 -- Multiply a limb vector with a limb and store -# the result in a second limb vector. - -# Copyright (C) 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. - -.text - .align 4 - .globl ___gmpn_mul_1 -___gmpn_mul_1: - subo g2,0,g2 - shlo 2,g2,g4 - subo g4,g1,g1 - subo g4,g0,g13 - mov 0,g0 - - cmpo 1,0 # clear C bit on AC.cc - -Loop: ld (g1)[g2*4],g5 - emul g3,g5,g6 - - addc g0,g6,g6 # relies on that C bit is clear - st g6,(g13)[g2*4] - addc 0,g7,g0 - - addo g2,1,g2 - cmpobne 0,g2,Loop # when branch is taken, clears C bit - - ret diff --git a/rts/gmp/mpn/i960/sub_n.s b/rts/gmp/mpn/i960/sub_n.s deleted file mode 100644 index 2db2d46..0000000 --- a/rts/gmp/mpn/i960/sub_n.s +++ /dev/null @@ -1,43 +0,0 @@ -# I960 __gmpn_sub_n -- Subtract two limb vectors of the same length > 0 and -# store difference in a third limb vector. - -# Copyright (C) 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. - -.text - .align 4 - .globl ___gmpn_sub_n -___gmpn_sub_n: - mov 1,g6 # set carry-save register - cmpo 1,0 # clear cy - -Loop: subo 1,g3,g3 # update loop counter - ld (g1),g5 # load from s1_ptr - addo 4,g1,g1 # s1_ptr++ - ld (g2),g4 # load from s2_ptr - addo 4,g2,g2 # s2_ptr++ - cmpo g6,1 # restore cy from g6, relies on cy being 0 - subc g4,g5,g4 # main subtract - subc 0,0,g6 # save cy in g6 - st g4,(g0) # store result to res_ptr - addo 4,g0,g0 # res_ptr++ - cmpobne 0,g3,Loop # when branch is taken, cy will be 0 - - mov g6,g0 - ret diff --git a/rts/gmp/mpn/lisp/gmpasm-mode.el b/rts/gmp/mpn/lisp/gmpasm-mode.el deleted file mode 100644 index 5d9da7f..0000000 --- a/rts/gmp/mpn/lisp/gmpasm-mode.el +++ /dev/null @@ -1,351 +0,0 @@ -;;; gmpasm-mode.el -- GNU MP asm and m4 editing mode. - - -;; 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. - - -;;; Commentary: -;; -;; gmpasm-mode is an editing mode for m4 processed assembler code and m4 -;; macro files in GMP. It's similar to m4-mode, but has a number of -;; settings better suited to GMP. -;; -;; -;; Install -;; ------- -;; -;; To make M-x gmpasm-mode available, put gmpasm-mode.el somewhere in the -;; load-path and the following in .emacs -;; -;; (autoload 'gmpasm-mode "gmpasm-mode" nil t) -;; -;; To use gmpasm-mode automatically on all .asm and .m4 files, put the -;; following in .emacs -;; -;; (add-to-list 'auto-mode-alist '("\\.asm\\'" . gmpasm-mode)) -;; (add-to-list 'auto-mode-alist '("\\.m4\\'" . gmpasm-mode)) -;; -;; To have gmpasm-mode only on gmp files, try instead something like the -;; following, which uses it only in a directory starting with "gmp", or a -;; sub-directory of such. -;; -;; (add-to-list 'auto-mode-alist -;; '("/gmp.*/.*\\.\\(asm\\|m4\\)\\'" . gmpasm-mode)) -;; -;; Byte compiling will slightly speed up loading. If you want a docstring -;; in the autoload you can use M-x update-file-autoloads if you set it up -;; right. -;; -;; -;; Emacsen -;; ------- -;; -;; FSF Emacs 20.x - gmpasm-mode is designed for this. -;; XEmacs 20.x - seems to work. -;; -;; FSF Emacs 19.x - should work if replacements for some 20.x-isms are -;; available. comment-region with "C" won't really do the right thing -;; though. - - -;;; Code: - -(defgroup gmpasm nil - "GNU MP m4 and asm editing." - :prefix "gmpasm-" - :group 'languages) - -(defcustom gmpasm-mode-hook nil - "*Hook called by `gmpasm-mode'." - :type 'hook - :group 'gmpasm) - -(defcustom gmpasm-comment-start-regexp "[#;!@C]" - "*Regexp matching possible comment styles. -See `gmpasm-mode' docstring for how this is used." - :type 'regexp - :group 'gmpasm) - - -(defun gmpasm-add-to-list-second (list-var element) - "(gmpasm-add-to-list-second LIST-VAR ELEMENT) - -Add ELEMENT to LIST-VAR as the second element in the list, if it isn't -already in the list. If LIST-VAR is nil, then ELEMENT is just added as the -sole element in the list. - -This is like `add-to-list', but it puts the new value second in the list. - -The first cons cell is copied rather than changed in-place, so references to -the list elsewhere won't be affected." - - (if (member element (symbol-value list-var)) - (symbol-value list-var) - (set list-var - (if (symbol-value list-var) - (cons (car (symbol-value list-var)) - (cons element - (cdr (symbol-value list-var)))) - (list element))))) - - -(defun gmpasm-delete-from-list (list-var element) - "(gmpasm-delete-from-list LIST-VAR ELEMENT) - -Delete ELEMENT from LIST-VAR, using `delete'. -This is like `add-to-list', but the element is deleted from the list. -The list is copied rather than changed in-place, so references to it elsewhere -won't be affected." - - (set list-var (delete element (copy-sequence (symbol-value list-var))))) - - -(defvar gmpasm-mode-map - (let ((map (make-sparse-keymap))) - - ;; assembler and dnl commenting - (define-key map "\C-c\C-c" 'comment-region) - (define-key map "\C-c\C-d" 'gmpasm-comment-region-dnl) - - ;; kill an M-x compile, since it's not hard to put m4 into an infinite - ;; loop - (define-key map "\C-c\C-k" 'kill-compilation) - - map) - "Keymap for `gmpasm-mode'.") - - -(defvar gmpasm-mode-syntax-table - (let ((table (make-syntax-table))) - ;; underscore left as a symbol char, like C mode - - ;; m4 quotes - (modify-syntax-entry ?` "('" table) - (modify-syntax-entry ?' ")`" table) - - table) - "Syntax table used in `gmpasm-mode'. - -m4 ignores quote marks in # comments at the top level, but inside quotes # -isn't special and all quotes are active. There seems no easy way to express -this in the syntax table, so nothing is done for comments. Usually this is -best, since it picks up invalid apostrophes in comments inside quotes.") - - -(defvar gmpasm-font-lock-keywords - (eval-when-compile - (list - (cons - (concat - "\\b" - (regexp-opt - '("deflit" "defreg" "defframe" "defframe_pushl" - "define_not_for_expansion" - "ASM_START" "ASM_END" "PROLOGUE" "EPILOGUE" - "forloop" - "TEXT" "DATA" "ALIGN" "W32" - "builtin" "changecom" "changequote" "changeword" "debugfile" - "debugmode" "decr" "define" "defn" "divert" "divnum" "dumpdef" - "errprint" "esyscmd" "eval" "__file__" "format" "gnu" "ifdef" - "ifelse" "include" "incr" "index" "indir" "len" "__line__" - "m4exit" "m4wrap" "maketemp" "patsubst" "popdef" "pushdef" - "regexp" "shift" "sinclude" "substr" "syscmd" "sysval" - "traceoff" "traceon" "translit" "undefine" "undivert" "unix") - t) - "\\b") 'font-lock-keyword-face))) - - "`font-lock-keywords' for `gmpasm-mode'. - -The keywords are m4 builtins and some of the GMP macros used in asm files. -L and LF don't look good fontified, so they're omitted. - -The right assembler comment regexp is added dynamically buffer-local (with -dnl too).") - - -;; Initialized if gmpasm-mode finds filladapt loaded. -(defvar gmpasm-filladapt-token-table nil - "Filladapt token table used in `gmpasm-mode'.") -(defvar gmpasm-filladapt-token-match-table nil - "Filladapt token match table used in `gmpasm-mode'.") -(defvar gmpasm-filladapt-token-conversion-table nil - "Filladapt token conversion table used in `gmpasm-mode'.") - - -;;;###autoload -(defun gmpasm-mode () - "A major mode for editing GNU MP asm and m4 files. - -\\{gmpasm-mode-map} -`comment-start' and `comment-end' are set buffer-local to assembler -commenting appropriate for the CPU by looking for something matching -`gmpasm-comment-start-regexp' at the start of a line, or \"#\" is used if -there's no match (if \"#\" isn't what you want, type in a desired comment -and do \\[gmpasm-mode] to reinitialize). - -`adaptive-fill-regexp' is set buffer-local to the standard regexp with -`comment-start' and dnl added. If filladapt.el has been loaded it similarly -gets `comment-start' and dnl added as buffer-local fill prefixes. - -Font locking has the m4 builtins, some of the GMP macros, m4 dnl commenting, -and assembler commenting (based on the `comment-start' determined). - -Note that `gmpasm-comment-start-regexp' is only matched as a whole word, so -the `C' in it is only matched as a whole word, not on something that happens -to start with `C'. Also it's only the particular `comment-start' determined -that's added for filling etc, not the whole `gmpasm-comment-start-regexp'. - -`gmpasm-mode-hook' is run after initializations are complete. -" - - (interactive) - (kill-all-local-variables) - (setq major-mode 'gmpasm-mode - mode-name "gmpasm") - (use-local-map gmpasm-mode-map) - (set-syntax-table gmpasm-mode-syntax-table) - (setq fill-column 76) - - ;; Short instructions might fit with 32, but anything with labels or - ;; expressions soon needs the comments pushed out to column 40. - (setq comment-column 40) - - ;; Don't want to find out the hard way which dumb assemblers don't like a - ;; missing final newline. - (set (make-local-variable 'require-final-newline) t) - - ;; The first match of gmpasm-comment-start-regexp at the start of a line - ;; determines comment-start, or "#" if no match. - (set (make-local-variable 'comment-start) - (save-excursion - (goto-char (point-min)) - (if (re-search-forward - (concat "^\\(" gmpasm-comment-start-regexp "\\)\\(\\s-\\|$\\)") - nil t) - (match-string 1) - "#"))) - (set (make-local-variable 'comment-end) "") - - ;; If comment-start ends in an alphanumeric then \b is used to match it - ;; only as a separate word. The test is for an alphanumeric rather than - ;; \w since we might try # or ! as \w characters but without wanting \b. - (let ((comment-regexp - (concat (regexp-quote comment-start) - (if (string-match "[a-zA-Z0-9]\\'" comment-start) "\\b")))) - - ;; Whitespace is required before a comment-start so m4 $# doesn't match - ;; when comment-start is "#". - ;; Only spaces or tabs match after, so newline isn't included in the - ;; font lock below. - (set (make-local-variable 'comment-start-skip) - (concat "\\(^\\|\\s-\\)" comment-regexp "[ \t]*")) - - ;; Comment fontification based on comment-start, matching through to the - ;; end of the line. - (add-to-list (make-local-variable 'gmpasm-font-lock-keywords) - (cons (concat - "\\(\\bdnl\\b\\|" comment-start-skip "\\).*$") - 'font-lock-comment-face)) - - (set (make-local-variable 'font-lock-defaults) - '(gmpasm-font-lock-keywords - t ; no syntactic fontification (of strings etc) - nil ; no case-fold - ((?_ . "w")) ; _ part of a word while fontifying - )) - - ;; Paragraphs are separated by blank lines, or lines with only dnl or - ;; comment-start. - (set (make-local-variable 'paragraph-separate) - (concat "[ \t\f]*\\(\\(" comment-regexp "\\|dnl\\)[ \t]*\\)*$")) - (set (make-local-variable 'paragraph-start) - (concat "\f\\|" paragraph-separate)) - - ;; Adaptive fill gets dnl and comment-start as comment style prefixes on - ;; top of the standard regexp (which has # and ; already actually). - (set (make-local-variable 'adaptive-fill-regexp) - (concat "[ \t]*\\(\\(" - comment-regexp - "\\|dnl\\|[-|#;>*]+\\|(?[0-9]+[.)]\\)[ \t]*\\)*")) - (set (make-local-variable 'adaptive-fill-first-line-regexp) - "\\`\\([ \t]*dnl\\)?[ \t]*\\'") - - (when (fboundp 'filladapt-mode) - (when (not gmpasm-filladapt-token-table) - (setq gmpasm-filladapt-token-table - filladapt-token-table) - (setq gmpasm-filladapt-token-match-table - filladapt-token-match-table) - (setq gmpasm-filladapt-token-conversion-table - filladapt-token-conversion-table) - - ;; Numbered bullet points like "2.1" get matched at the start of a - ;; line when it's really something like "2.1 cycles/limb", so delete - ;; this from the list. The regexp for "1.", "2." etc is left - ;; though. - (gmpasm-delete-from-list 'gmpasm-filladapt-token-table - '("[0-9]+\\(\\.[0-9]+\\)+[ \t]" - bullet)) - - ;; "%" as a comment prefix interferes with x86 register names - ;; like %eax, so delete this. - (gmpasm-delete-from-list 'gmpasm-filladapt-token-table - '("%+" postscript-comment)) - - (add-to-list 'gmpasm-filladapt-token-match-table - '(gmpasm-comment gmpasm-comment)) - (add-to-list 'gmpasm-filladapt-token-conversion-table - '(gmpasm-comment . exact)) - ) - - (set (make-local-variable 'filladapt-token-table) - gmpasm-filladapt-token-table) - (set (make-local-variable 'filladapt-token-match-table) - gmpasm-filladapt-token-match-table) - (set (make-local-variable 'filladapt-token-conversion-table) - gmpasm-filladapt-token-conversion-table) - - ;; Add dnl and comment-start as fill prefixes. - ;; Comments in filladapt.el say filladapt-token-table must begin - ;; with ("^" beginning-of-line), so put our addition second. - (gmpasm-add-to-list-second 'filladapt-token-table - (list (concat "dnl[ \t]\\|" comment-regexp) - 'gmpasm-comment)) - )) - - (run-hooks 'gmpasm-mode-hook)) - - -(defun gmpasm-comment-region-dnl (beg end &optional arg) - "(gmpasm-comment-region BEG END &option ARG) - -Comment or uncomment each line in the region using `dnl'. -With \\[universal-argument] prefix arg, uncomment each line in region. -This is `comment-region', but using \"dnl\"." - - (interactive "r\nP") - (let ((comment-start "dnl") - (comment-end "")) - (comment-region beg end arg))) - - -(provide 'gmpasm-mode) - -;;; gmpasm-mode.el ends here diff --git a/rts/gmp/mpn/m68k/add_n.S b/rts/gmp/mpn/m68k/add_n.S deleted file mode 100644 index 9e1d89d..0000000 --- a/rts/gmp/mpn/m68k/add_n.S +++ /dev/null @@ -1,79 +0,0 @@ -/* mc68020 __gmpn_add_n -- Add two limb vectors of the same length > 0 and store - sum in a third limb vector. - -Copyright (C) 1992, 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. */ - -/* - INPUT PARAMETERS - res_ptr (sp + 4) - s1_ptr (sp + 8) - s2_ptr (sp + 16) - size (sp + 12) -*/ - -#include "asm-syntax.h" - - TEXT - ALIGN - GLOBL C_SYMBOL_NAME(__gmpn_add_n) - -C_SYMBOL_NAME(__gmpn_add_n:) -PROLOG(__gmpn_add_n) -/* Save used registers on the stack. */ - movel R(d2),MEM_PREDEC(sp) - movel R(a2),MEM_PREDEC(sp) - -/* Copy the arguments to registers. Better use movem? */ - movel MEM_DISP(sp,12),R(a2) - movel MEM_DISP(sp,16),R(a0) - movel MEM_DISP(sp,20),R(a1) - movel MEM_DISP(sp,24),R(d2) - - eorw #1,R(d2) - lsrl #1,R(d2) - bcc L(L1) - subql #1,R(d2) /* clears cy as side effect */ - -L(Loop:) - movel MEM_POSTINC(a0),R(d0) - movel MEM_POSTINC(a1),R(d1) - addxl R(d1),R(d0) - movel R(d0),MEM_POSTINC(a2) -L(L1:) movel MEM_POSTINC(a0),R(d0) - movel MEM_POSTINC(a1),R(d1) - addxl R(d1),R(d0) - movel R(d0),MEM_POSTINC(a2) - - dbf R(d2),L(Loop) /* loop until 16 lsb of %4 == -1 */ - subxl R(d0),R(d0) /* d0 <= -cy; save cy as 0 or -1 in d0 */ - subl #0x10000,R(d2) - bcs L(L2) - addl R(d0),R(d0) /* restore cy */ - bra L(Loop) - -L(L2:) - negl R(d0) - -/* Restore used registers from stack frame. */ - movel MEM_POSTINC(sp),R(a2) - movel MEM_POSTINC(sp),R(d2) - - rts -EPILOG(__gmpn_add_n) diff --git a/rts/gmp/mpn/m68k/lshift.S b/rts/gmp/mpn/m68k/lshift.S deleted file mode 100644 index a539d5d..0000000 --- a/rts/gmp/mpn/m68k/lshift.S +++ /dev/null @@ -1,150 +0,0 @@ -/* mc68020 __gmpn_lshift -- Shift left a low-level natural-number integer. - -Copyright (C) 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. */ - -/* - INPUT PARAMETERS - res_ptr (sp + 4) - s_ptr (sp + 8) - s_size (sp + 16) - cnt (sp + 12) -*/ - -#include "asm-syntax.h" - -#define res_ptr a1 -#define s_ptr a0 -#define s_size d6 -#define cnt d4 - - TEXT - ALIGN - GLOBL C_SYMBOL_NAME(__gmpn_lshift) - -C_SYMBOL_NAME(__gmpn_lshift:) -PROLOG(__gmpn_lshift) - -/* Save used registers on the stack. */ - moveml R(d2)-R(d6)/R(a2),MEM_PREDEC(sp) - -/* Copy the arguments to registers. */ - movel MEM_DISP(sp,28),R(res_ptr) - movel MEM_DISP(sp,32),R(s_ptr) - movel MEM_DISP(sp,36),R(s_size) - movel MEM_DISP(sp,40),R(cnt) - - moveql #1,R(d5) - cmpl R(d5),R(cnt) - bne L(Lnormal) - cmpl R(s_ptr),R(res_ptr) - bls L(Lspecial) /* jump if s_ptr >= res_ptr */ -#if (defined (__mc68020__) || defined (__NeXT__) || defined(mc68020)) - lea MEM_INDX1(s_ptr,s_size,l,4),R(a2) -#else /* not mc68020 */ - movel R(s_size),R(d0) - asll #2,R(d0) - lea MEM_INDX(s_ptr,d0,l),R(a2) -#endif - cmpl R(res_ptr),R(a2) - bls L(Lspecial) /* jump if res_ptr >= s_ptr + s_size */ - -L(Lnormal:) - moveql #32,R(d5) - subl R(cnt),R(d5) - -#if (defined (__mc68020__) || defined (__NeXT__) || defined(mc68020)) - lea MEM_INDX1(s_ptr,s_size,l,4),R(s_ptr) - lea MEM_INDX1(res_ptr,s_size,l,4),R(res_ptr) -#else /* not mc68000 */ - movel R(s_size),R(d0) - asll #2,R(d0) - addl R(s_size),R(s_ptr) - addl R(s_size),R(res_ptr) -#endif - movel MEM_PREDEC(s_ptr),R(d2) - movel R(d2),R(d0) - lsrl R(d5),R(d0) /* compute carry limb */ - - lsll R(cnt),R(d2) - movel R(d2),R(d1) - subql #1,R(s_size) - beq L(Lend) - lsrl #1,R(s_size) - bcs L(L1) - subql #1,R(s_size) - -L(Loop:) - movel MEM_PREDEC(s_ptr),R(d2) - movel R(d2),R(d3) - lsrl R(d5),R(d3) - orl R(d3),R(d1) - movel R(d1),MEM_PREDEC(res_ptr) - lsll R(cnt),R(d2) -L(L1:) - movel MEM_PREDEC(s_ptr),R(d1) - movel R(d1),R(d3) - lsrl R(d5),R(d3) - orl R(d3),R(d2) - movel R(d2),MEM_PREDEC(res_ptr) - lsll R(cnt),R(d1) - - dbf R(s_size),L(Loop) - subl #0x10000,R(s_size) - bcc L(Loop) - -L(Lend:) - movel R(d1),MEM_PREDEC(res_ptr) /* store least significant limb */ - -/* Restore used registers from stack frame. */ - moveml MEM_POSTINC(sp),R(d2)-R(d6)/R(a2) - rts - -/* We loop from least significant end of the arrays, which is only - permissable if the source and destination don't overlap, since the - function is documented to work for overlapping source and destination. */ - -L(Lspecial:) - clrl R(d0) /* initialize carry */ - eorw #1,R(s_size) - lsrl #1,R(s_size) - bcc L(LL1) - subql #1,R(s_size) - -L(LLoop:) - movel MEM_POSTINC(s_ptr),R(d2) - addxl R(d2),R(d2) - movel R(d2),MEM_POSTINC(res_ptr) -L(LL1:) - movel MEM_POSTINC(s_ptr),R(d2) - addxl R(d2),R(d2) - movel R(d2),MEM_POSTINC(res_ptr) - - dbf R(s_size),L(LLoop) - addxl R(d0),R(d0) /* save cy in lsb */ - subl #0x10000,R(s_size) - bcs L(LLend) - lsrl #1,R(d0) /* restore cy */ - bra L(LLoop) - -L(LLend:) -/* Restore used registers from stack frame. */ - moveml MEM_POSTINC(sp),R(d2)-R(d6)/R(a2) - rts -EPILOG(__gmpn_lshift) diff --git a/rts/gmp/mpn/m68k/mc68020/addmul_1.S b/rts/gmp/mpn/m68k/mc68020/addmul_1.S deleted file mode 100644 index 6638115..0000000 --- a/rts/gmp/mpn/m68k/mc68020/addmul_1.S +++ /dev/null @@ -1,83 +0,0 @@ -/* mc68020 __gmpn_addmul_1 -- Multiply a limb vector with a limb and add - the result to a second limb vector. - -Copyright (C) 1992, 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. */ - -/* - INPUT PARAMETERS - res_ptr (sp + 4) - s1_ptr (sp + 8) - s1_size (sp + 12) - s2_limb (sp + 16) -*/ - -#include "asm-syntax.h" - - TEXT - ALIGN - GLOBL C_SYMBOL_NAME(__gmpn_addmul_1) - -C_SYMBOL_NAME(__gmpn_addmul_1:) -PROLOG(__gmpn_addmul_1) - -#define res_ptr a0 -#define s1_ptr a1 -#define s1_size d2 -#define s2_limb d4 - -/* Save used registers on the stack. */ - moveml R(d2)-R(d5),MEM_PREDEC(sp) - -/* Copy the arguments to registers. Better use movem? */ - movel MEM_DISP(sp,20),R(res_ptr) - movel MEM_DISP(sp,24),R(s1_ptr) - movel MEM_DISP(sp,28),R(s1_size) - movel MEM_DISP(sp,32),R(s2_limb) - - eorw #1,R(s1_size) - clrl R(d1) - clrl R(d5) - lsrl #1,R(s1_size) - bcc L(L1) - subql #1,R(s1_size) - subl R(d0),R(d0) /* (d0,cy) <= (0,0) */ - -L(Loop:) - movel MEM_POSTINC(s1_ptr),R(d3) - mulul R(s2_limb),R(d1):R(d3) - addxl R(d0),R(d3) - addxl R(d5),R(d1) - addl R(d3),MEM_POSTINC(res_ptr) -L(L1:) movel MEM_POSTINC(s1_ptr),R(d3) - mulul R(s2_limb),R(d0):R(d3) - addxl R(d1),R(d3) - addxl R(d5),R(d0) - addl R(d3),MEM_POSTINC(res_ptr) - - dbf R(s1_size),L(Loop) - addxl R(d5),R(d0) - subl #0x10000,R(s1_size) - bcc L(Loop) - -/* Restore used registers from stack frame. */ - moveml MEM_POSTINC(sp),R(d2)-R(d5) - - rts -EPILOG(__gmpn_addmul_1) diff --git a/rts/gmp/mpn/m68k/mc68020/mul_1.S b/rts/gmp/mpn/m68k/mc68020/mul_1.S deleted file mode 100644 index fdd4c39..0000000 --- a/rts/gmp/mpn/m68k/mc68020/mul_1.S +++ /dev/null @@ -1,90 +0,0 @@ -/* mc68020 __gmpn_mul_1 -- Multiply a limb vector with a limb and store - the result in a second limb vector. - -Copyright (C) 1992, 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. */ - -/* - INPUT PARAMETERS - res_ptr (sp + 4) - s1_ptr (sp + 8) - s1_size (sp + 12) - s2_limb (sp + 16) -*/ - -#include "asm-syntax.h" - - TEXT - ALIGN - GLOBL C_SYMBOL_NAME(__gmpn_mul_1) - -C_SYMBOL_NAME(__gmpn_mul_1:) -PROLOG(__gmpn_mul_1) - -#define res_ptr a0 -#define s1_ptr a1 -#define s1_size d2 -#define s2_limb d4 - -/* Save used registers on the stack. */ - moveml R(d2)-R(d4),MEM_PREDEC(sp) -#if 0 - movel R(d2),MEM_PREDEC(sp) - movel R(d3),MEM_PREDEC(sp) - movel R(d4),MEM_PREDEC(sp) -#endif - -/* Copy the arguments to registers. Better use movem? */ - movel MEM_DISP(sp,16),R(res_ptr) - movel MEM_DISP(sp,20),R(s1_ptr) - movel MEM_DISP(sp,24),R(s1_size) - movel MEM_DISP(sp,28),R(s2_limb) - - eorw #1,R(s1_size) - clrl R(d1) - lsrl #1,R(s1_size) - bcc L(L1) - subql #1,R(s1_size) - subl R(d0),R(d0) /* (d0,cy) <= (0,0) */ - -L(Loop:) - movel MEM_POSTINC(s1_ptr),R(d3) - mulul R(s2_limb),R(d1):R(d3) - addxl R(d0),R(d3) - movel R(d3),MEM_POSTINC(res_ptr) -L(L1:) movel MEM_POSTINC(s1_ptr),R(d3) - mulul R(s2_limb),R(d0):R(d3) - addxl R(d1),R(d3) - movel R(d3),MEM_POSTINC(res_ptr) - - dbf R(s1_size),L(Loop) - clrl R(d3) - addxl R(d3),R(d0) - subl #0x10000,R(s1_size) - bcc L(Loop) - -/* Restore used registers from stack frame. */ - moveml MEM_POSTINC(sp),R(d2)-R(d4) -#if 0 - movel MEM_POSTINC(sp),R(d4) - movel MEM_POSTINC(sp),R(d3) - movel MEM_POSTINC(sp),R(d2) -#endif - rts -EPILOG(__gmpn_mul_1) diff --git a/rts/gmp/mpn/m68k/mc68020/submul_1.S b/rts/gmp/mpn/m68k/mc68020/submul_1.S deleted file mode 100644 index 3c36b70..0000000 --- a/rts/gmp/mpn/m68k/mc68020/submul_1.S +++ /dev/null @@ -1,83 +0,0 @@ -/* mc68020 __gmpn_submul_1 -- Multiply a limb vector with a limb and subtract - the result from a second limb vector. - -Copyright (C) 1992, 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. */ - -/* - INPUT PARAMETERS - res_ptr (sp + 4) - s1_ptr (sp + 8) - s1_size (sp + 12) - s2_limb (sp + 16) -*/ - -#include "asm-syntax.h" - - TEXT - ALIGN - GLOBL C_SYMBOL_NAME(__gmpn_submul_1) - -C_SYMBOL_NAME(__gmpn_submul_1:) -PROLOG(__gmpn_submul_1) - -#define res_ptr a0 -#define s1_ptr a1 -#define s1_size d2 -#define s2_limb d4 - -/* Save used registers on the stack. */ - moveml R(d2)-R(d5),MEM_PREDEC(sp) - -/* Copy the arguments to registers. Better use movem? */ - movel MEM_DISP(sp,20),R(res_ptr) - movel MEM_DISP(sp,24),R(s1_ptr) - movel MEM_DISP(sp,28),R(s1_size) - movel MEM_DISP(sp,32),R(s2_limb) - - eorw #1,R(s1_size) - clrl R(d1) - clrl R(d5) - lsrl #1,R(s1_size) - bcc L(L1) - subql #1,R(s1_size) - subl R(d0),R(d0) /* (d0,cy) <= (0,0) */ - -L(Loop:) - movel MEM_POSTINC(s1_ptr),R(d3) - mulul R(s2_limb),R(d1):R(d3) - addxl R(d0),R(d3) - addxl R(d5),R(d1) - subl R(d3),MEM_POSTINC(res_ptr) -L(L1:) movel MEM_POSTINC(s1_ptr),R(d3) - mulul R(s2_limb),R(d0):R(d3) - addxl R(d1),R(d3) - addxl R(d5),R(d0) - subl R(d3),MEM_POSTINC(res_ptr) - - dbf R(s1_size),L(Loop) - addxl R(d5),R(d0) - subl #0x10000,R(s1_size) - bcc L(Loop) - -/* Restore used registers from stack frame. */ - moveml MEM_POSTINC(sp),R(d2)-R(d5) - - rts -EPILOG(__gmpn_submul_1) diff --git a/rts/gmp/mpn/m68k/mc68020/udiv.S b/rts/gmp/mpn/m68k/mc68020/udiv.S deleted file mode 100644 index d00cf13..0000000 --- a/rts/gmp/mpn/m68k/mc68020/udiv.S +++ /dev/null @@ -1,31 +0,0 @@ -/* -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. -*/ - -.text - .even -.globl ___udiv_qrnnd -___udiv_qrnnd: - movel sp@(4),a0 - movel sp@(8),d1 - movel sp@(12),d0 - divul sp@(16),d1:d0 - movel d1,a0@ - rts diff --git a/rts/gmp/mpn/m68k/mc68020/umul.S b/rts/gmp/mpn/m68k/mc68020/umul.S deleted file mode 100644 index a34ae6c..0000000 --- a/rts/gmp/mpn/m68k/mc68020/umul.S +++ /dev/null @@ -1,31 +0,0 @@ -/* -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. -*/ - -.text - .even -.globl ___umul_ppmm -___umul_ppmm: - movel sp@(4),a0 - movel sp@(8),d1 - movel sp@(12),d0 - mulul d0,d0:d1 - movel d1,a0@ - rts diff --git a/rts/gmp/mpn/m68k/rshift.S b/rts/gmp/mpn/m68k/rshift.S deleted file mode 100644 index b47a48e..0000000 --- a/rts/gmp/mpn/m68k/rshift.S +++ /dev/null @@ -1,149 +0,0 @@ -/* mc68020 __gmpn_rshift -- Shift right a low-level natural-number integer. - -Copyright (C) 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. */ - -/* - INPUT PARAMETERS - res_ptr (sp + 4) - s_ptr (sp + 8) - s_size (sp + 16) - cnt (sp + 12) -*/ - -#include "asm-syntax.h" - -#define res_ptr a1 -#define s_ptr a0 -#define s_size d6 -#define cnt d4 - - TEXT - ALIGN - GLOBL C_SYMBOL_NAME(__gmpn_rshift) - -C_SYMBOL_NAME(__gmpn_rshift:) -PROLOG(__gmpn_rshift) -/* Save used registers on the stack. */ - moveml R(d2)-R(d6)/R(a2),MEM_PREDEC(sp) - -/* Copy the arguments to registers. */ - movel MEM_DISP(sp,28),R(res_ptr) - movel MEM_DISP(sp,32),R(s_ptr) - movel MEM_DISP(sp,36),R(s_size) - movel MEM_DISP(sp,40),R(cnt) - - moveql #1,R(d5) - cmpl R(d5),R(cnt) - bne L(Lnormal) - cmpl R(res_ptr),R(s_ptr) - bls L(Lspecial) /* jump if res_ptr >= s_ptr */ -#if (defined (__mc68020__) || defined (__NeXT__) || defined(mc68020)) - lea MEM_INDX1(res_ptr,s_size,l,4),R(a2) -#else /* not mc68020 */ - movel R(s_size),R(d0) - asll #2,R(d0) - lea MEM_INDX(res_ptr,d0,l),R(a2) -#endif - cmpl R(s_ptr),R(a2) - bls L(Lspecial) /* jump if s_ptr >= res_ptr + s_size */ - -L(Lnormal:) - moveql #32,R(d5) - subl R(cnt),R(d5) - movel MEM_POSTINC(s_ptr),R(d2) - movel R(d2),R(d0) - lsll R(d5),R(d0) /* compute carry limb */ - - lsrl R(cnt),R(d2) - movel R(d2),R(d1) - subql #1,R(s_size) - beq L(Lend) - lsrl #1,R(s_size) - bcs L(L1) - subql #1,R(s_size) - -L(Loop:) - movel MEM_POSTINC(s_ptr),R(d2) - movel R(d2),R(d3) - lsll R(d5),R(d3) - orl R(d3),R(d1) - movel R(d1),MEM_POSTINC(res_ptr) - lsrl R(cnt),R(d2) -L(L1:) - movel MEM_POSTINC(s_ptr),R(d1) - movel R(d1),R(d3) - lsll R(d5),R(d3) - orl R(d3),R(d2) - movel R(d2),MEM_POSTINC(res_ptr) - lsrl R(cnt),R(d1) - - dbf R(s_size),L(Loop) - subl #0x10000,R(s_size) - bcc L(Loop) - -L(Lend:) - movel R(d1),MEM(res_ptr) /* store most significant limb */ - -/* Restore used registers from stack frame. */ - moveml MEM_POSTINC(sp),R(d2)-R(d6)/R(a2) - rts - -/* We loop from most significant end of the arrays, which is only - permissable if the source and destination don't overlap, since the - function is documented to work for overlapping source and destination. */ - -L(Lspecial:) -#if (defined (__mc68020__) || defined (__NeXT__) || defined(mc68020)) - lea MEM_INDX1(s_ptr,s_size,l,4),R(s_ptr) - lea MEM_INDX1(res_ptr,s_size,l,4),R(res_ptr) -#else /* not mc68000 */ - movel R(s_size),R(d0) - asll #2,R(d0) - addl R(s_size),R(s_ptr) - addl R(s_size),R(res_ptr) -#endif - - clrl R(d0) /* initialize carry */ - eorw #1,R(s_size) - lsrl #1,R(s_size) - bcc L(LL1) - subql #1,R(s_size) - -L(LLoop:) - movel MEM_PREDEC(s_ptr),R(d2) - roxrl #1,R(d2) - movel R(d2),MEM_PREDEC(res_ptr) -L(LL1:) - movel MEM_PREDEC(s_ptr),R(d2) - roxrl #1,R(d2) - movel R(d2),MEM_PREDEC(res_ptr) - - dbf R(s_size),L(LLoop) - roxrl #1,R(d0) /* save cy in msb */ - subl #0x10000,R(s_size) - bcs L(LLend) - addl R(d0),R(d0) /* restore cy */ - bra L(LLoop) - -L(LLend:) -/* Restore used registers from stack frame. */ - moveml MEM_POSTINC(sp),R(d2)-R(d6)/R(a2) - rts -EPILOG(__gmpn_rshift) diff --git a/rts/gmp/mpn/m68k/sub_n.S b/rts/gmp/mpn/m68k/sub_n.S deleted file mode 100644 index ce45b24..0000000 --- a/rts/gmp/mpn/m68k/sub_n.S +++ /dev/null @@ -1,79 +0,0 @@ -/* mc68020 __gmpn_sub_n -- Subtract two limb vectors of the same length > 0 and - store difference in a third limb vector. - -Copyright (C) 1992, 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. */ - -/* - INPUT PARAMETERS - res_ptr (sp + 4) - s1_ptr (sp + 8) - s2_ptr (sp + 16) - size (sp + 12) -*/ - -#include "asm-syntax.h" - - TEXT - ALIGN - GLOBL C_SYMBOL_NAME(__gmpn_sub_n) - -C_SYMBOL_NAME(__gmpn_sub_n:) -PROLOG(__gmpn_sub_n) -/* Save used registers on the stack. */ - movel R(d2),MEM_PREDEC(sp) - movel R(a2),MEM_PREDEC(sp) - -/* Copy the arguments to registers. Better use movem? */ - movel MEM_DISP(sp,12),R(a2) - movel MEM_DISP(sp,16),R(a0) - movel MEM_DISP(sp,20),R(a1) - movel MEM_DISP(sp,24),R(d2) - - eorw #1,R(d2) - lsrl #1,R(d2) - bcc L(L1) - subql #1,R(d2) /* clears cy as side effect */ - -L(Loop:) - movel MEM_POSTINC(a0),R(d0) - movel MEM_POSTINC(a1),R(d1) - subxl R(d1),R(d0) - movel R(d0),MEM_POSTINC(a2) -L(L1:) movel MEM_POSTINC(a0),R(d0) - movel MEM_POSTINC(a1),R(d1) - subxl R(d1),R(d0) - movel R(d0),MEM_POSTINC(a2) - - dbf R(d2),L(Loop) /* loop until 16 lsb of %4 == -1 */ - subxl R(d0),R(d0) /* d0 <= -cy; save cy as 0 or -1 in d0 */ - subl #0x10000,R(d2) - bcs L(L2) - addl R(d0),R(d0) /* restore cy */ - bra L(Loop) - -L(L2:) - negl R(d0) - -/* Restore used registers from stack frame. */ - movel MEM_POSTINC(sp),R(a2) - movel MEM_POSTINC(sp),R(d2) - - rts -EPILOG(__gmpn_sub_n) diff --git a/rts/gmp/mpn/m68k/syntax.h b/rts/gmp/mpn/m68k/syntax.h deleted file mode 100644 index 9eec279..0000000 --- a/rts/gmp/mpn/m68k/syntax.h +++ /dev/null @@ -1,177 +0,0 @@ -/* asm.h -- Definitions for 68k syntax variations. - -Copyright (C) 1992, 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. */ - -#undef ALIGN - -#ifdef MIT_SYNTAX -#define PROLOG(name) -#define EPILOG(name) -#define R(r)r -#define MEM(base)base@ -#define MEM_DISP(base,displacement)base@(displacement) -#define MEM_INDX(base,idx,size_suffix)base@(idx:size_suffix) -#define MEM_INDX1(base,idx,size_suffix,scale)base@(idx:size_suffix:scale) -#define MEM_PREDEC(memory_base)memory_base@- -#define MEM_POSTINC(memory_base)memory_base@+ -#define L(label) label -#define TEXT .text -#define ALIGN .even -#define GLOBL .globl -#define moveql moveq -/* Use variable sized opcodes. */ -#define bcc jcc -#define bcs jcs -#define bls jls -#define beq jeq -#define bne jne -#define bra jra -#endif - -#ifdef SONY_SYNTAX -#define PROLOG(name) -#define EPILOG(name) -#define R(r)r -#define MEM(base)(base) -#define MEM_DISP(base,displacement)(displacement,base) -#define MEM_INDX(base,idx,size_suffix)(base,idx.size_suffix) -#define MEM_INDX1(base,idx,size_suffix,scale)(base,idx.size_suffix*scale) -#define MEM_PREDEC(memory_base)-(memory_base) -#define MEM_POSTINC(memory_base)(memory_base)+ -#define L(label) label -#define TEXT .text -#define ALIGN .even -#define GLOBL .globl -#endif - -#ifdef MOTOROLA_SYNTAX -#define PROLOG(name) -#define EPILOG(name) -#define R(r)r -#define MEM(base)(base) -#define MEM_DISP(base,displacement)(displacement,base) -#define MEM_INDX(base,idx,size_suffix)(base,idx.size_suffix) -#define MEM_INDX1(base,idx,size_suffix,scale)(base,idx.size_suffix*scale) -#define MEM_PREDEC(memory_base)-(memory_base) -#define MEM_POSTINC(memory_base)(memory_base)+ -#define L(label) label -#define TEXT -#define ALIGN -#define GLOBL XDEF -#define lea LEA -#define movel MOVE.L -#define moveml MOVEM.L -#define moveql MOVEQ.L -#define cmpl CMP.L -#define orl OR.L -#define clrl CLR.L -#define eorw EOR.W -#define lsrl LSR.L -#define lsll LSL.L -#define roxrl ROXR.L -#define roxll ROXL.L -#define addl ADD.L -#define addxl ADDX.L -#define addql ADDQ.L -#define subl SUB.L -#define subxl SUBX.L -#define subql SUBQ.L -#define negl NEG.L -#define mulul MULU.L -#define bcc BCC -#define bcs BCS -#define bls BLS -#define beq BEQ -#define bne BNE -#define bra BRA -#define dbf DBF -#define rts RTS -#define d0 D0 -#define d1 D1 -#define d2 D2 -#define d3 D3 -#define d4 D4 -#define d5 D5 -#define d6 D6 -#define d7 D7 -#define a0 A0 -#define a1 A1 -#define a2 A2 -#define a3 A3 -#define a4 A4 -#define a5 A5 -#define a6 A6 -#define a7 A7 -#define sp SP -#endif - -#ifdef ELF_SYNTAX -#define PROLOG(name) .type name,@function -#define EPILOG(name) .size name,.-name -#define MEM(base)(R(base)) -#define MEM_DISP(base,displacement)(displacement,R(base)) -#define MEM_PREDEC(memory_base)-(R(memory_base)) -#define MEM_POSTINC(memory_base)(R(memory_base))+ -#ifdef __STDC__ -#define R_(r)%##r -#define R(r)R_(r) -#define MEM_INDX_(base,idx,size_suffix)(R(base),R(idx##.##size_suffix)) -#define MEM_INDX(base,idx,size_suffix)MEM_INDX_(base,idx,size_suffix) -#define MEM_INDX1_(base,idx,size_suffix,scale)(R(base),R(idx##.##size_suffix*scale)) -#define MEM_INDX1(base,idx,size_suffix,scale)MEM_INDX1_(base,idx,size_suffix,scale) -#define L(label) .##label -#else -#define R(r)%/**/r -#define MEM_INDX(base,idx,size_suffix)(R(base),R(idx).size_suffix) -#define MEM_INDX1(base,idx,size_suffix,scale)(R(base),R(idx).size_suffix*scale) -#define L(label) ./**/label -#endif -#define TEXT .text -#define ALIGN .align 2 -#define GLOBL .globl -#define bcc jbcc -#define bcs jbcs -#define bls jbls -#define beq jbeq -#define bne jbne -#define bra jbra -#endif - -#if defined (SONY_SYNTAX) || defined (ELF_SYNTAX) -#define movel move.l -#define moveml movem.l -#define moveql moveq.l -#define cmpl cmp.l -#define orl or.l -#define clrl clr.l -#define eorw eor.w -#define lsrl lsr.l -#define lsll lsl.l -#define roxrl roxr.l -#define roxll roxl.l -#define addl add.l -#define addxl addx.l -#define addql addq.l -#define subl sub.l -#define subxl subx.l -#define subql subq.l -#define negl neg.l -#define mulul mulu.l -#endif diff --git a/rts/gmp/mpn/m88k/add_n.s b/rts/gmp/mpn/m88k/add_n.s deleted file mode 100644 index 0b776c6..0000000 --- a/rts/gmp/mpn/m88k/add_n.s +++ /dev/null @@ -1,104 +0,0 @@ -; mc88100 __gmpn_add -- Add two limb vectors of the same length > 0 and store -; sum in a third limb vector. - -; Copyright (C) 1992, 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. - - -; INPUT PARAMETERS -; res_ptr r2 -; s1_ptr r3 -; s2_ptr r4 -; size r5 - -; This code has been optimized to run one instruction per clock, avoiding -; load stalls and writeback contention. As a result, the instruction -; order is not always natural. - -; The speed is about 4.6 clocks/limb + 18 clocks/limb-vector on an 88100, -; but on the 88110, it seems to run much slower, 6.6 clocks/limb. - - text - align 16 - global ___gmpn_add_n -___gmpn_add_n: - ld r6,r3,0 ; read first limb from s1_ptr - extu r10,r5,3 - ld r7,r4,0 ; read first limb from s2_ptr - - subu.co r5,r0,r5 ; (clear carry as side effect) - mak r5,r5,3<4> - bcnd eq0,r5,Lzero - - or r12,r0,lo16(Lbase) - or.u r12,r12,hi16(Lbase) - addu r12,r12,r5 ; r12 is address for entering in loop - - extu r5,r5,2 ; divide by 4 - subu r2,r2,r5 ; adjust res_ptr - subu r3,r3,r5 ; adjust s1_ptr - subu r4,r4,r5 ; adjust s2_ptr - - or r8,r6,r0 - - jmp.n r12 - or r9,r7,r0 - -Loop: addu r3,r3,32 - st r8,r2,28 - addu r4,r4,32 - ld r6,r3,0 - addu r2,r2,32 - ld r7,r4,0 -Lzero: subu r10,r10,1 ; add 0 + 8r limbs (adj loop cnt) -Lbase: ld r8,r3,4 - addu.cio r6,r6,r7 - ld r9,r4,4 - st r6,r2,0 - ld r6,r3,8 ; add 7 + 8r limbs - addu.cio r8,r8,r9 - ld r7,r4,8 - st r8,r2,4 - ld r8,r3,12 ; add 6 + 8r limbs - addu.cio r6,r6,r7 - ld r9,r4,12 - st r6,r2,8 - ld r6,r3,16 ; add 5 + 8r limbs - addu.cio r8,r8,r9 - ld r7,r4,16 - st r8,r2,12 - ld r8,r3,20 ; add 4 + 8r limbs - addu.cio r6,r6,r7 - ld r9,r4,20 - st r6,r2,16 - ld r6,r3,24 ; add 3 + 8r limbs - addu.cio r8,r8,r9 - ld r7,r4,24 - st r8,r2,20 - ld r8,r3,28 ; add 2 + 8r limbs - addu.cio r6,r6,r7 - ld r9,r4,28 - st r6,r2,24 - bcnd.n ne0,r10,Loop ; add 1 + 8r limbs - addu.cio r8,r8,r9 - - st r8,r2,28 ; store most significant limb - - jmp.n r1 - addu.ci r2,r0,r0 ; return carry-out from most sign. limb diff --git a/rts/gmp/mpn/m88k/mc88110/add_n.S b/rts/gmp/mpn/m88k/mc88110/add_n.S deleted file mode 100644 index 843a50d..0000000 --- a/rts/gmp/mpn/m88k/mc88110/add_n.S +++ /dev/null @@ -1,200 +0,0 @@ -; mc88110 __gmpn_add_n -- Add two limb vectors of the same length > 0 and store -; sum in a third limb vector. - -; 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. - - -; INPUT PARAMETERS -#define res_ptr r2 -#define s1_ptr r3 -#define s2_ptr r4 -#define size r5 - -#include "sysdep.h" - - text - align 16 - global C_SYMBOL_NAME(__gmpn_add_n) -C_SYMBOL_NAME(__gmpn_add_n): - addu.co r0,r0,r0 ; clear cy flag - xor r12,s2_ptr,res_ptr - bb1 2,r12,L1 -; ** V1a ** -L0: bb0 2,res_ptr,L_v1 ; branch if res_ptr is aligned? -/* Add least significant limb separately to align res_ptr and s2_ptr */ - ld r10,s1_ptr,0 - addu s1_ptr,s1_ptr,4 - ld r8,s2_ptr,0 - addu s2_ptr,s2_ptr,4 - subu size,size,1 - addu.co r6,r10,r8 - st r6,res_ptr,0 - addu res_ptr,res_ptr,4 -L_v1: cmp r12,size,2 - bb1 lt,r12,Lend2 - - ld r10,s1_ptr,0 - ld r12,s1_ptr,4 - ld.d r8,s2_ptr,0 - subu size,size,10 - bcnd lt0,size,Lfin1 -/* Add blocks of 8 limbs until less than 8 limbs remain */ - align 8 -Loop1: subu size,size,8 - addu.cio r6,r10,r8 - ld r10,s1_ptr,8 - addu.cio r7,r12,r9 - ld r12,s1_ptr,12 - ld.d r8,s2_ptr,8 - st.d r6,res_ptr,0 - addu.cio r6,r10,r8 - ld r10,s1_ptr,16 - addu.cio r7,r12,r9 - ld r12,s1_ptr,20 - ld.d r8,s2_ptr,16 - st.d r6,res_ptr,8 - addu.cio r6,r10,r8 - ld r10,s1_ptr,24 - addu.cio r7,r12,r9 - ld r12,s1_ptr,28 - ld.d r8,s2_ptr,24 - st.d r6,res_ptr,16 - addu.cio r6,r10,r8 - ld r10,s1_ptr,32 - addu.cio r7,r12,r9 - ld r12,s1_ptr,36 - addu s1_ptr,s1_ptr,32 - ld.d r8,s2_ptr,32 - addu s2_ptr,s2_ptr,32 - st.d r6,res_ptr,24 - addu res_ptr,res_ptr,32 - bcnd ge0,size,Loop1 - -Lfin1: addu size,size,8-2 - bcnd lt0,size,Lend1 -/* Add blocks of 2 limbs until less than 2 limbs remain */ -Loope1: addu.cio r6,r10,r8 - ld r10,s1_ptr,8 - addu.cio r7,r12,r9 - ld r12,s1_ptr,12 - ld.d r8,s2_ptr,8 - st.d r6,res_ptr,0 - subu size,size,2 - addu s1_ptr,s1_ptr,8 - addu s2_ptr,s2_ptr,8 - addu res_ptr,res_ptr,8 - bcnd ge0,size,Loope1 -Lend1: addu.cio r6,r10,r8 - addu.cio r7,r12,r9 - st.d r6,res_ptr,0 - - bb0 0,size,Lret1 -/* Add last limb */ - ld r10,s1_ptr,8 - ld r8,s2_ptr,8 - addu.cio r6,r10,r8 - st r6,res_ptr,8 - -Lret1: jmp.n r1 - addu.ci r2,r0,r0 ; return carry-out from most sign. limb - -L1: xor r12,s1_ptr,res_ptr - bb1 2,r12,L2 -; ** V1b ** - or r12,r0,s2_ptr - or s2_ptr,r0,s1_ptr - or s1_ptr,r0,r12 - br L0 - -; ** V2 ** -/* If we come here, the alignment of s1_ptr and res_ptr as well as the - alignment of s2_ptr and res_ptr differ. Since there are only two ways - things can be aligned (that we care about) we now know that the alignment - of s1_ptr and s2_ptr are the same. */ - -L2: cmp r12,size,1 - bb1 eq,r12,Ljone - bb0 2,s1_ptr,L_v2 ; branch if s1_ptr is aligned -/* Add least significant limb separately to align res_ptr and s2_ptr */ - ld r10,s1_ptr,0 - addu s1_ptr,s1_ptr,4 - ld r8,s2_ptr,0 - addu s2_ptr,s2_ptr,4 - subu size,size,1 - addu.co r6,r10,r8 - st r6,res_ptr,0 - addu res_ptr,res_ptr,4 - -L_v2: subu size,size,8 - bcnd lt0,size,Lfin2 -/* Add blocks of 8 limbs until less than 8 limbs remain */ - align 8 -Loop2: subu size,size,8 - ld.d r8,s1_ptr,0 - ld.d r6,s2_ptr,0 - addu.cio r8,r8,r6 - st r8,res_ptr,0 - addu.cio r9,r9,r7 - st r9,res_ptr,4 - ld.d r8,s1_ptr,8 - ld.d r6,s2_ptr,8 - addu.cio r8,r8,r6 - st r8,res_ptr,8 - addu.cio r9,r9,r7 - st r9,res_ptr,12 - ld.d r8,s1_ptr,16 - ld.d r6,s2_ptr,16 - addu.cio r8,r8,r6 - st r8,res_ptr,16 - addu.cio r9,r9,r7 - st r9,res_ptr,20 - ld.d r8,s1_ptr,24 - ld.d r6,s2_ptr,24 - addu.cio r8,r8,r6 - st r8,res_ptr,24 - addu.cio r9,r9,r7 - st r9,res_ptr,28 - addu s1_ptr,s1_ptr,32 - addu s2_ptr,s2_ptr,32 - addu res_ptr,res_ptr,32 - bcnd ge0,size,Loop2 - -Lfin2: addu size,size,8-2 - bcnd lt0,size,Lend2 -Loope2: ld.d r8,s1_ptr,0 - ld.d r6,s2_ptr,0 - addu.cio r8,r8,r6 - st r8,res_ptr,0 - addu.cio r9,r9,r7 - st r9,res_ptr,4 - subu size,size,2 - addu s1_ptr,s1_ptr,8 - addu s2_ptr,s2_ptr,8 - addu res_ptr,res_ptr,8 - bcnd ge0,size,Loope2 -Lend2: bb0 0,size,Lret2 -/* Add last limb */ -Ljone: ld r10,s1_ptr,0 - ld r8,s2_ptr,0 - addu.cio r6,r10,r8 - st r6,res_ptr,0 - -Lret2: jmp.n r1 - addu.ci r2,r0,r0 ; return carry-out from most sign. limb diff --git a/rts/gmp/mpn/m88k/mc88110/addmul_1.s b/rts/gmp/mpn/m88k/mc88110/addmul_1.s deleted file mode 100644 index 7d97c87..0000000 --- a/rts/gmp/mpn/m88k/mc88110/addmul_1.s +++ /dev/null @@ -1,61 +0,0 @@ -; mc88110 __gmpn_addmul_1 -- Multiply a limb vector with a single limb and -; store the product in a second limb vector. - -; 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. - - -; INPUT PARAMETERS -; res_ptr r2 -; s1_ptr r3 -; size r4 -; s2_limb r5 - - text - align 16 - global ___gmpn_addmul_1 -___gmpn_addmul_1: - lda r3,r3[r4] - lda r8,r2[r4] ; RES_PTR in r8 since r2 is retval - subu r4,r0,r4 - addu.co r2,r0,r0 ; r2 = cy = 0 - - ld r6,r3[r4] - addu r4,r4,1 - subu r8,r8,4 - bcnd.n eq0,r4,Lend - mulu.d r10,r6,r5 - -Loop: ld r7,r8[r4] - ld r6,r3[r4] - addu.cio r9,r11,r2 - addu.ci r2,r10,r0 - addu.co r9,r9,r7 - st r9,r8[r4] - addu r4,r4,1 - mulu.d r10,r6,r5 - bcnd ne0,r4,Loop - -Lend: ld r7,r8,0 - addu.cio r9,r11,r2 - addu.ci r2,r10,r0 - addu.co r9,r9,r7 - st r9,r8,0 - jmp.n r1 - addu.ci r2,r2,r0 diff --git a/rts/gmp/mpn/m88k/mc88110/mul_1.s b/rts/gmp/mpn/m88k/mc88110/mul_1.s deleted file mode 100644 index b8483af..0000000 --- a/rts/gmp/mpn/m88k/mc88110/mul_1.s +++ /dev/null @@ -1,59 +0,0 @@ -; mc88110 __gmpn_mul_1 -- Multiply a limb vector with a single limb and -; store the product in a second limb vector. - -; Copyright (C) 1992, 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. - - -; INPUT PARAMETERS -; res_ptr r2 -; s1_ptr r3 -; size r4 -; s2_limb r5 - - text - align 16 - global ___gmpn_mul_1 -___gmpn_mul_1: - ; Make S1_PTR and RES_PTR point at the end of their blocks - ; and negate SIZE. - lda r3,r3[r4] - lda r8,r2[r4] ; RES_PTR in r8 since r2 is retval - subu r4,r0,r4 - - addu.co r2,r0,r0 ; r2 = cy = 0 - - ld r6,r3[r4] - addu r4,r4,1 - mulu.d r10,r6,r5 - bcnd.n eq0,r4,Lend - subu r8,r8,8 - -Loop: ld r6,r3[r4] - addu.cio r9,r11,r2 - or r2,r10,r0 ; could be avoided if unrolled - addu r4,r4,1 - mulu.d r10,r6,r5 - bcnd.n ne0,r4,Loop - st r9,r8[r4] - -Lend: addu.cio r9,r11,r2 - st r9,r8,4 - jmp.n r1 - addu.ci r2,r10,r0 diff --git a/rts/gmp/mpn/m88k/mc88110/sub_n.S b/rts/gmp/mpn/m88k/mc88110/sub_n.S deleted file mode 100644 index 715a3fa..0000000 --- a/rts/gmp/mpn/m88k/mc88110/sub_n.S +++ /dev/null @@ -1,276 +0,0 @@ -; mc88110 __gmpn_sub_n -- Subtract two limb vectors of the same length > 0 and -; store difference in a third limb vector. - -; 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. - - -; INPUT PARAMETERS -#define res_ptr r2 -#define s1_ptr r3 -#define s2_ptr r4 -#define size r5 - -#include "sysdep.h" - - text - align 16 - global C_SYMBOL_NAME(__gmpn_sub_n) -C_SYMBOL_NAME(__gmpn_sub_n): - subu.co r0,r0,r0 ; set cy flag - xor r12,s2_ptr,res_ptr - bb1 2,r12,L1 -; ** V1a ** -L0: bb0 2,res_ptr,L_v1 ; branch if res_ptr is aligned -/* Add least significant limb separately to align res_ptr and s2_ptr */ - ld r10,s1_ptr,0 - addu s1_ptr,s1_ptr,4 - ld r8,s2_ptr,0 - addu s2_ptr,s2_ptr,4 - subu size,size,1 - subu.co r6,r10,r8 - st r6,res_ptr,0 - addu res_ptr,res_ptr,4 -L_v1: cmp r12,size,2 - bb1 lt,r12,Lend2 - - ld r10,s1_ptr,0 - ld r12,s1_ptr,4 - ld.d r8,s2_ptr,0 - subu size,size,10 - bcnd lt0,size,Lfin1 -/* Add blocks of 8 limbs until less than 8 limbs remain */ - align 8 -Loop1: subu size,size,8 - subu.cio r6,r10,r8 - ld r10,s1_ptr,8 - subu.cio r7,r12,r9 - ld r12,s1_ptr,12 - ld.d r8,s2_ptr,8 - st.d r6,res_ptr,0 - subu.cio r6,r10,r8 - ld r10,s1_ptr,16 - subu.cio r7,r12,r9 - ld r12,s1_ptr,20 - ld.d r8,s2_ptr,16 - st.d r6,res_ptr,8 - subu.cio r6,r10,r8 - ld r10,s1_ptr,24 - subu.cio r7,r12,r9 - ld r12,s1_ptr,28 - ld.d r8,s2_ptr,24 - st.d r6,res_ptr,16 - subu.cio r6,r10,r8 - ld r10,s1_ptr,32 - subu.cio r7,r12,r9 - ld r12,s1_ptr,36 - addu s1_ptr,s1_ptr,32 - ld.d r8,s2_ptr,32 - addu s2_ptr,s2_ptr,32 - st.d r6,res_ptr,24 - addu res_ptr,res_ptr,32 - bcnd ge0,size,Loop1 - -Lfin1: addu size,size,8-2 - bcnd lt0,size,Lend1 -/* Add blocks of 2 limbs until less than 2 limbs remain */ -Loope1: subu.cio r6,r10,r8 - ld r10,s1_ptr,8 - subu.cio r7,r12,r9 - ld r12,s1_ptr,12 - ld.d r8,s2_ptr,8 - st.d r6,res_ptr,0 - subu size,size,2 - addu s1_ptr,s1_ptr,8 - addu s2_ptr,s2_ptr,8 - addu res_ptr,res_ptr,8 - bcnd ge0,size,Loope1 -Lend1: subu.cio r6,r10,r8 - subu.cio r7,r12,r9 - st.d r6,res_ptr,0 - - bb0 0,size,Lret1 -/* Add last limb */ - ld r10,s1_ptr,8 - ld r8,s2_ptr,8 - subu.cio r6,r10,r8 - st r6,res_ptr,8 - -Lret1: addu.ci r2,r0,r0 ; return carry-out from most sign. limb - jmp.n r1 - xor r2,r2,1 - -L1: xor r12,s1_ptr,res_ptr - bb1 2,r12,L2 -; ** V1b ** - bb0 2,res_ptr,L_v1b ; branch if res_ptr is aligned -/* Add least significant limb separately to align res_ptr and s1_ptr */ - ld r10,s2_ptr,0 - addu s2_ptr,s2_ptr,4 - ld r8,s1_ptr,0 - addu s1_ptr,s1_ptr,4 - subu size,size,1 - subu.co r6,r8,r10 - st r6,res_ptr,0 - addu res_ptr,res_ptr,4 -L_v1b: cmp r12,size,2 - bb1 lt,r12,Lend2 - - ld r10,s2_ptr,0 - ld r12,s2_ptr,4 - ld.d r8,s1_ptr,0 - subu size,size,10 - bcnd lt0,size,Lfin1b -/* Add blocks of 8 limbs until less than 8 limbs remain */ - align 8 -Loop1b: subu size,size,8 - subu.cio r6,r8,r10 - ld r10,s2_ptr,8 - subu.cio r7,r9,r12 - ld r12,s2_ptr,12 - ld.d r8,s1_ptr,8 - st.d r6,res_ptr,0 - subu.cio r6,r8,r10 - ld r10,s2_ptr,16 - subu.cio r7,r9,r12 - ld r12,s2_ptr,20 - ld.d r8,s1_ptr,16 - st.d r6,res_ptr,8 - subu.cio r6,r8,r10 - ld r10,s2_ptr,24 - subu.cio r7,r9,r12 - ld r12,s2_ptr,28 - ld.d r8,s1_ptr,24 - st.d r6,res_ptr,16 - subu.cio r6,r8,r10 - ld r10,s2_ptr,32 - subu.cio r7,r9,r12 - ld r12,s2_ptr,36 - addu s2_ptr,s2_ptr,32 - ld.d r8,s1_ptr,32 - addu s1_ptr,s1_ptr,32 - st.d r6,res_ptr,24 - addu res_ptr,res_ptr,32 - bcnd ge0,size,Loop1b - -Lfin1b: addu size,size,8-2 - bcnd lt0,size,Lend1b -/* Add blocks of 2 limbs until less than 2 limbs remain */ -Loope1b:subu.cio r6,r8,r10 - ld r10,s2_ptr,8 - subu.cio r7,r9,r12 - ld r12,s2_ptr,12 - ld.d r8,s1_ptr,8 - st.d r6,res_ptr,0 - subu size,size,2 - addu s1_ptr,s1_ptr,8 - addu s2_ptr,s2_ptr,8 - addu res_ptr,res_ptr,8 - bcnd ge0,size,Loope1b -Lend1b: subu.cio r6,r8,r10 - subu.cio r7,r9,r12 - st.d r6,res_ptr,0 - - bb0 0,size,Lret1b -/* Add last limb */ - ld r10,s2_ptr,8 - ld r8,s1_ptr,8 - subu.cio r6,r8,r10 - st r6,res_ptr,8 - -Lret1b: addu.ci r2,r0,r0 ; return carry-out from most sign. limb - jmp.n r1 - xor r2,r2,1 - -; ** V2 ** -/* If we come here, the alignment of s1_ptr and res_ptr as well as the - alignment of s2_ptr and res_ptr differ. Since there are only two ways - things can be aligned (that we care about) we now know that the alignment - of s1_ptr and s2_ptr are the same. */ - -L2: cmp r12,size,1 - bb1 eq,r12,Ljone - bb0 2,s1_ptr,L_v2 ; branch if s1_ptr is aligned -/* Add least significant limb separately to align res_ptr and s2_ptr */ - ld r10,s1_ptr,0 - addu s1_ptr,s1_ptr,4 - ld r8,s2_ptr,0 - addu s2_ptr,s2_ptr,4 - subu size,size,1 - subu.co r6,r10,r8 - st r6,res_ptr,0 - addu res_ptr,res_ptr,4 - -L_v2: subu size,size,8 - bcnd lt0,size,Lfin2 -/* Add blocks of 8 limbs until less than 8 limbs remain */ - align 8 -Loop2: subu size,size,8 - ld.d r8,s1_ptr,0 - ld.d r6,s2_ptr,0 - subu.cio r8,r8,r6 - st r8,res_ptr,0 - subu.cio r9,r9,r7 - st r9,res_ptr,4 - ld.d r8,s1_ptr,8 - ld.d r6,s2_ptr,8 - subu.cio r8,r8,r6 - st r8,res_ptr,8 - subu.cio r9,r9,r7 - st r9,res_ptr,12 - ld.d r8,s1_ptr,16 - ld.d r6,s2_ptr,16 - subu.cio r8,r8,r6 - st r8,res_ptr,16 - subu.cio r9,r9,r7 - st r9,res_ptr,20 - ld.d r8,s1_ptr,24 - ld.d r6,s2_ptr,24 - subu.cio r8,r8,r6 - st r8,res_ptr,24 - subu.cio r9,r9,r7 - st r9,res_ptr,28 - addu s1_ptr,s1_ptr,32 - addu s2_ptr,s2_ptr,32 - addu res_ptr,res_ptr,32 - bcnd ge0,size,Loop2 - -Lfin2: addu size,size,8-2 - bcnd lt0,size,Lend2 -Loope2: ld.d r8,s1_ptr,0 - ld.d r6,s2_ptr,0 - subu.cio r8,r8,r6 - st r8,res_ptr,0 - subu.cio r9,r9,r7 - st r9,res_ptr,4 - subu size,size,2 - addu s1_ptr,s1_ptr,8 - addu s2_ptr,s2_ptr,8 - addu res_ptr,res_ptr,8 - bcnd ge0,size,Loope2 -Lend2: bb0 0,size,Lret2 -/* Add last limb */ -Ljone: ld r10,s1_ptr,0 - ld r8,s2_ptr,0 - subu.cio r6,r10,r8 - st r6,res_ptr,0 - -Lret2: addu.ci r2,r0,r0 ; return carry-out from most sign. limb - jmp.n r1 - xor r2,r2,1 diff --git a/rts/gmp/mpn/m88k/mul_1.s b/rts/gmp/mpn/m88k/mul_1.s deleted file mode 100644 index 0637083..0000000 --- a/rts/gmp/mpn/m88k/mul_1.s +++ /dev/null @@ -1,127 +0,0 @@ -; mc88100 __gmpn_mul_1 -- Multiply a limb vector with a single limb and -; store the product in a second limb vector. - -; Copyright (C) 1992, 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. - - -; INPUT PARAMETERS -; res_ptr r2 -; s1_ptr r3 -; size r4 -; s2_limb r5 - -; Common overhead is about 11 cycles/invocation. - -; The speed for S2_LIMB >= 0x10000 is approximately 21 cycles/limb. (The -; pipeline stalls 2 cycles due to WB contention.) - -; The speed for S2_LIMB < 0x10000 is approximately 16 cycles/limb. (The -; pipeline stalls 2 cycles due to WB contention and 1 cycle due to latency.) - -; To enhance speed: -; 1. Unroll main loop 4-8 times. -; 2. Schedule code to avoid WB contention. It might be tempting to move the -; ld instruction in the loops down to save 2 cycles (less WB contention), -; but that looses because the ultimate value will be read from outside -; the allocated space. But if we handle the ultimate multiplication in -; the tail, we can do this. -; 3. Make the multiplication with less instructions. I think the code for -; (S2_LIMB >= 0x10000) is not minimal. -; With these techniques the (S2_LIMB >= 0x10000) case would run in 17 or -; less cycles/limb; the (S2_LIMB < 0x10000) case would run in 11 -; cycles/limb. (Assuming infinite unrolling.) - - text - align 16 - global ___gmpn_mul_1 -___gmpn_mul_1: - - ; Make S1_PTR and RES_PTR point at the end of their blocks - ; and negate SIZE. - lda r3,r3[r4] - lda r6,r2[r4] ; RES_PTR in r6 since r2 is retval - subu r4,r0,r4 - - addu.co r2,r0,r0 ; r2 = cy = 0 - ld r9,r3[r4] - mask r7,r5,0xffff ; r7 = lo(S2_LIMB) - extu r8,r5,16 ; r8 = hi(S2_LIMB) - bcnd.n eq0,r8,Lsmall ; jump if (hi(S2_LIMB) == 0) - subu r6,r6,4 - -; General code for any value of S2_LIMB. - - ; Make a stack frame and save r25 and r26 - subu r31,r31,16 - st.d r25,r31,8 - - ; Enter the loop in the middle - br.n L1 - addu r4,r4,1 - -Loop: ld r9,r3[r4] - st r26,r6[r4] -; bcnd ne0,r0,0 ; bubble - addu r4,r4,1 -L1: mul r26,r9,r5 ; low word of product mul_1 WB ld - mask r12,r9,0xffff ; r12 = lo(s1_limb) mask_1 - mul r11,r12,r7 ; r11 = prod_0 mul_2 WB mask_1 - mul r10,r12,r8 ; r10 = prod_1a mul_3 - extu r13,r9,16 ; r13 = hi(s1_limb) extu_1 WB mul_1 - mul r12,r13,r7 ; r12 = prod_1b mul_4 WB extu_1 - mul r25,r13,r8 ; r25 = prod_2 mul_5 WB mul_2 - extu r11,r11,16 ; r11 = hi(prod_0) extu_2 WB mul_3 - addu r10,r10,r11 ; addu_1 WB extu_2 -; bcnd ne0,r0,0 ; bubble WB addu_1 - addu.co r10,r10,r12 ; WB mul_4 - mask.u r10,r10,0xffff ; move the 16 most significant bits... - addu.ci r10,r10,r0 ; ...to the low half of the word... - rot r10,r10,16 ; ...and put carry in pos 16. - addu.co r26,r26,r2 ; add old carry limb - bcnd.n ne0,r4,Loop - addu.ci r2,r25,r10 ; compute new carry limb - - st r26,r6[r4] - ld.d r25,r31,8 - jmp.n r1 - addu r31,r31,16 - -; Fast code for S2_LIMB < 0x10000 -Lsmall: - ; Enter the loop in the middle - br.n SL1 - addu r4,r4,1 - -SLoop: ld r9,r3[r4] ; - st r8,r6[r4] ; - addu r4,r4,1 ; -SL1: mul r8,r9,r5 ; low word of product - mask r12,r9,0xffff ; r12 = lo(s1_limb) - extu r13,r9,16 ; r13 = hi(s1_limb) - mul r11,r12,r7 ; r11 = prod_0 - mul r12,r13,r7 ; r12 = prod_1b - addu.cio r8,r8,r2 ; add old carry limb - extu r10,r11,16 ; r11 = hi(prod_0) - addu r10,r10,r12 ; - bcnd.n ne0,r4,SLoop - extu r2,r10,16 ; r2 = new carry limb - - jmp.n r1 - st r8,r6[r4] diff --git a/rts/gmp/mpn/m88k/sub_n.s b/rts/gmp/mpn/m88k/sub_n.s deleted file mode 100644 index 2fd345a..0000000 --- a/rts/gmp/mpn/m88k/sub_n.s +++ /dev/null @@ -1,106 +0,0 @@ -; mc88100 __gmpn_sub -- Subtract two limb vectors of the same length > 0 and -; store difference in a third limb vector. - -; Copyright (C) 1992, 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. - - -; INPUT PARAMETERS -; res_ptr r2 -; s1_ptr r3 -; s2_ptr r4 -; size r5 - -; This code has been optimized to run one instruction per clock, avoiding -; load stalls and writeback contention. As a result, the instruction -; order is not always natural. - -; The speed is about 4.6 clocks/limb + 18 clocks/limb-vector on an 88100, -; but on the 88110, it seems to run much slower, 6.6 clocks/limb. - - text - align 16 - global ___gmpn_sub_n -___gmpn_sub_n: - ld r6,r3,0 ; read first limb from s1_ptr - extu r10,r5,3 - ld r7,r4,0 ; read first limb from s2_ptr - - subu r5,r0,r5 - mak r5,r5,3<4> - bcnd.n eq0,r5,Lzero - subu.co r0,r0,r0 ; initialize carry - - or r12,r0,lo16(Lbase) - or.u r12,r12,hi16(Lbase) - addu r12,r12,r5 ; r12 is address for entering in loop - - extu r5,r5,2 ; divide by 4 - subu r2,r2,r5 ; adjust res_ptr - subu r3,r3,r5 ; adjust s1_ptr - subu r4,r4,r5 ; adjust s2_ptr - - or r8,r6,r0 - - jmp.n r12 - or r9,r7,r0 - -Loop: addu r3,r3,32 - st r8,r2,28 - addu r4,r4,32 - ld r6,r3,0 - addu r2,r2,32 - ld r7,r4,0 -Lzero: subu r10,r10,1 ; subtract 0 + 8r limbs (adj loop cnt) -Lbase: ld r8,r3,4 - subu.cio r6,r6,r7 - ld r9,r4,4 - st r6,r2,0 - ld r6,r3,8 ; subtract 7 + 8r limbs - subu.cio r8,r8,r9 - ld r7,r4,8 - st r8,r2,4 - ld r8,r3,12 ; subtract 6 + 8r limbs - subu.cio r6,r6,r7 - ld r9,r4,12 - st r6,r2,8 - ld r6,r3,16 ; subtract 5 + 8r limbs - subu.cio r8,r8,r9 - ld r7,r4,16 - st r8,r2,12 - ld r8,r3,20 ; subtract 4 + 8r limbs - subu.cio r6,r6,r7 - ld r9,r4,20 - st r6,r2,16 - ld r6,r3,24 ; subtract 3 + 8r limbs - subu.cio r8,r8,r9 - ld r7,r4,24 - st r8,r2,20 - ld r8,r3,28 ; subtract 2 + 8r limbs - subu.cio r6,r6,r7 - ld r9,r4,28 - st r6,r2,24 - bcnd.n ne0,r10,Loop ; subtract 1 + 8r limbs - subu.cio r8,r8,r9 - - st r8,r2,28 ; store most significant limb - - addu.ci r2,r0,r0 ; return carry-out from most sign. limb - jmp.n r1 - xor r2,r2,1 diff --git a/rts/gmp/mpn/mips2/add_n.s b/rts/gmp/mpn/mips2/add_n.s deleted file mode 100644 index 5c3c7fc..0000000 --- a/rts/gmp/mpn/mips2/add_n.s +++ /dev/null @@ -1,120 +0,0 @@ - # MIPS2 __gmpn_add_n -- Add two limb vectors of the same length > 0 and - # store sum in a third limb vector. - - # Copyright (C) 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. - - - # INPUT PARAMETERS - # res_ptr $4 - # s1_ptr $5 - # s2_ptr $6 - # size $7 - - .text - .align 2 - .globl __gmpn_add_n - .ent __gmpn_add_n -__gmpn_add_n: - .set noreorder - .set nomacro - - lw $10,0($5) - lw $11,0($6) - - addiu $7,$7,-1 - and $9,$7,4-1 # number of limbs in first loop - beq $9,$0,.L0 # if multiple of 4 limbs, skip first loop - move $2,$0 - - subu $7,$7,$9 - -.Loop0: addiu $9,$9,-1 - lw $12,4($5) - addu $11,$11,$2 - lw $13,4($6) - sltu $8,$11,$2 - addu $11,$10,$11 - sltu $2,$11,$10 - sw $11,0($4) - or $2,$2,$8 - - addiu $5,$5,4 - addiu $6,$6,4 - move $10,$12 - move $11,$13 - bne $9,$0,.Loop0 - addiu $4,$4,4 - -.L0: beq $7,$0,.Lend - nop - -.Loop: addiu $7,$7,-4 - - lw $12,4($5) - addu $11,$11,$2 - lw $13,4($6) - sltu $8,$11,$2 - addu $11,$10,$11 - sltu $2,$11,$10 - sw $11,0($4) - or $2,$2,$8 - - lw $10,8($5) - addu $13,$13,$2 - lw $11,8($6) - sltu $8,$13,$2 - addu $13,$12,$13 - sltu $2,$13,$12 - sw $13,4($4) - or $2,$2,$8 - - lw $12,12($5) - addu $11,$11,$2 - lw $13,12($6) - sltu $8,$11,$2 - addu $11,$10,$11 - sltu $2,$11,$10 - sw $11,8($4) - or $2,$2,$8 - - lw $10,16($5) - addu $13,$13,$2 - lw $11,16($6) - sltu $8,$13,$2 - addu $13,$12,$13 - sltu $2,$13,$12 - sw $13,12($4) - or $2,$2,$8 - - addiu $5,$5,16 - addiu $6,$6,16 - - bne $7,$0,.Loop - addiu $4,$4,16 - -.Lend: addu $11,$11,$2 - sltu $8,$11,$2 - addu $11,$10,$11 - sltu $2,$11,$10 - sw $11,0($4) - j $31 - or $2,$2,$8 - - .end __gmpn_add_n diff --git a/rts/gmp/mpn/mips2/addmul_1.s b/rts/gmp/mpn/mips2/addmul_1.s deleted file mode 100644 index 1e50377..0000000 --- a/rts/gmp/mpn/mips2/addmul_1.s +++ /dev/null @@ -1,97 +0,0 @@ - # MIPS __gmpn_addmul_1 -- Multiply a limb vector with a single limb and - # add the product to a second limb vector. - - # Copyright (C) 1992, 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. - - - # INPUT PARAMETERS - # res_ptr $4 - # s1_ptr $5 - # size $6 - # s2_limb $7 - - .text - .align 4 - .globl __gmpn_addmul_1 - .ent __gmpn_addmul_1 -__gmpn_addmul_1: - .set noreorder - .set nomacro - - # warm up phase 0 - lw $8,0($5) - - # warm up phase 1 - addiu $5,$5,4 - multu $8,$7 - - addiu $6,$6,-1 - beq $6,$0,$LC0 - move $2,$0 # zero cy2 - - addiu $6,$6,-1 - beq $6,$0,$LC1 - lw $8,0($5) # load new s1 limb as early as possible - -Loop: lw $10,0($4) - mflo $3 - mfhi $9 - addiu $5,$5,4 - addu $3,$3,$2 # add old carry limb to low product limb - multu $8,$7 - lw $8,0($5) # load new s1 limb as early as possible - addiu $6,$6,-1 # decrement loop counter - sltu $2,$3,$2 # carry from previous addition -> $2 - addu $3,$10,$3 - sltu $10,$3,$10 - addu $2,$2,$10 - sw $3,0($4) - addiu $4,$4,4 - bne $6,$0,Loop - addu $2,$9,$2 # add high product limb and carry from addition - - # cool down phase 1 -$LC1: lw $10,0($4) - mflo $3 - mfhi $9 - addu $3,$3,$2 - sltu $2,$3,$2 - multu $8,$7 - addu $3,$10,$3 - sltu $10,$3,$10 - addu $2,$2,$10 - sw $3,0($4) - addiu $4,$4,4 - addu $2,$9,$2 # add high product limb and carry from addition - - # cool down phase 0 -$LC0: lw $10,0($4) - mflo $3 - mfhi $9 - addu $3,$3,$2 - sltu $2,$3,$2 - addu $3,$10,$3 - sltu $10,$3,$10 - addu $2,$2,$10 - sw $3,0($4) - j $31 - addu $2,$9,$2 # add high product limb and carry from addition - - .end __gmpn_addmul_1 diff --git a/rts/gmp/mpn/mips2/lshift.s b/rts/gmp/mpn/mips2/lshift.s deleted file mode 100644 index 2ca3a3c..0000000 --- a/rts/gmp/mpn/mips2/lshift.s +++ /dev/null @@ -1,95 +0,0 @@ - # MIPS2 __gmpn_lshift -- - - # Copyright (C) 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. - - - # INPUT PARAMETERS - # res_ptr $4 - # src_ptr $5 - # size $6 - # cnt $7 - - .text - .align 2 - .globl __gmpn_lshift - .ent __gmpn_lshift -__gmpn_lshift: - .set noreorder - .set nomacro - - sll $2,$6,2 - addu $5,$5,$2 # make r5 point at end of src - lw $10,-4($5) # load first limb - subu $13,$0,$7 - addu $4,$4,$2 # make r4 point at end of res - addiu $6,$6,-1 - and $9,$6,4-1 # number of limbs in first loop - beq $9,$0,.L0 # if multiple of 4 limbs, skip first loop - srl $2,$10,$13 # compute function result - - subu $6,$6,$9 - -.Loop0: lw $3,-8($5) - addiu $4,$4,-4 - addiu $5,$5,-4 - addiu $9,$9,-1 - sll $11,$10,$7 - srl $12,$3,$13 - move $10,$3 - or $8,$11,$12 - bne $9,$0,.Loop0 - sw $8,0($4) - -.L0: beq $6,$0,.Lend - nop - -.Loop: lw $3,-8($5) - addiu $4,$4,-16 - addiu $6,$6,-4 - sll $11,$10,$7 - srl $12,$3,$13 - - lw $10,-12($5) - sll $14,$3,$7 - or $8,$11,$12 - sw $8,12($4) - srl $9,$10,$13 - - lw $3,-16($5) - sll $11,$10,$7 - or $8,$14,$9 - sw $8,8($4) - srl $12,$3,$13 - - lw $10,-20($5) - sll $14,$3,$7 - or $8,$11,$12 - sw $8,4($4) - srl $9,$10,$13 - - addiu $5,$5,-16 - or $8,$14,$9 - bgtz $6,.Loop - sw $8,0($4) - -.Lend: sll $8,$10,$7 - j $31 - sw $8,-4($4) - .end __gmpn_lshift diff --git a/rts/gmp/mpn/mips2/mul_1.s b/rts/gmp/mpn/mips2/mul_1.s deleted file mode 100644 index ea8aa26..0000000 --- a/rts/gmp/mpn/mips2/mul_1.s +++ /dev/null @@ -1,85 +0,0 @@ - # MIPS __gmpn_mul_1 -- Multiply a limb vector with a single limb and - # store the product in a second limb vector. - - # Copyright (C) 1992, 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. - - - # INPUT PARAMETERS - # res_ptr $4 - # s1_ptr $5 - # size $6 - # s2_limb $7 - - .text - .align 4 - .globl __gmpn_mul_1 - .ent __gmpn_mul_1 -__gmpn_mul_1: - .set noreorder - .set nomacro - - # warm up phase 0 - lw $8,0($5) - - # warm up phase 1 - addiu $5,$5,4 - multu $8,$7 - - addiu $6,$6,-1 - beq $6,$0,$LC0 - move $2,$0 # zero cy2 - - addiu $6,$6,-1 - beq $6,$0,$LC1 - lw $8,0($5) # load new s1 limb as early as possible - -Loop: mflo $10 - mfhi $9 - addiu $5,$5,4 - addu $10,$10,$2 # add old carry limb to low product limb - multu $8,$7 - lw $8,0($5) # load new s1 limb as early as possible - addiu $6,$6,-1 # decrement loop counter - sltu $2,$10,$2 # carry from previous addition -> $2 - sw $10,0($4) - addiu $4,$4,4 - bne $6,$0,Loop - addu $2,$9,$2 # add high product limb and carry from addition - - # cool down phase 1 -$LC1: mflo $10 - mfhi $9 - addu $10,$10,$2 - sltu $2,$10,$2 - multu $8,$7 - sw $10,0($4) - addiu $4,$4,4 - addu $2,$9,$2 # add high product limb and carry from addition - - # cool down phase 0 -$LC0: mflo $10 - mfhi $9 - addu $10,$10,$2 - sltu $2,$10,$2 - sw $10,0($4) - j $31 - addu $2,$9,$2 # add high product limb and carry from addition - - .end __gmpn_mul_1 diff --git a/rts/gmp/mpn/mips2/rshift.s b/rts/gmp/mpn/mips2/rshift.s deleted file mode 100644 index 37c8f39..0000000 --- a/rts/gmp/mpn/mips2/rshift.s +++ /dev/null @@ -1,92 +0,0 @@ - # MIPS2 __gmpn_rshift -- - - # Copyright (C) 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. - - - # INPUT PARAMETERS - # res_ptr $4 - # src_ptr $5 - # size $6 - # cnt $7 - - .text - .align 2 - .globl __gmpn_rshift - .ent __gmpn_rshift -__gmpn_rshift: - .set noreorder - .set nomacro - - lw $10,0($5) # load first limb - subu $13,$0,$7 - addiu $6,$6,-1 - and $9,$6,4-1 # number of limbs in first loop - beq $9,$0,.L0 # if multiple of 4 limbs, skip first loop - sll $2,$10,$13 # compute function result - - subu $6,$6,$9 - -.Loop0: lw $3,4($5) - addiu $4,$4,4 - addiu $5,$5,4 - addiu $9,$9,-1 - srl $11,$10,$7 - sll $12,$3,$13 - move $10,$3 - or $8,$11,$12 - bne $9,$0,.Loop0 - sw $8,-4($4) - -.L0: beq $6,$0,.Lend - nop - -.Loop: lw $3,4($5) - addiu $4,$4,16 - addiu $6,$6,-4 - srl $11,$10,$7 - sll $12,$3,$13 - - lw $10,8($5) - srl $14,$3,$7 - or $8,$11,$12 - sw $8,-16($4) - sll $9,$10,$13 - - lw $3,12($5) - srl $11,$10,$7 - or $8,$14,$9 - sw $8,-12($4) - sll $12,$3,$13 - - lw $10,16($5) - srl $14,$3,$7 - or $8,$11,$12 - sw $8,-8($4) - sll $9,$10,$13 - - addiu $5,$5,16 - or $8,$14,$9 - bgtz $6,.Loop - sw $8,-4($4) - -.Lend: srl $8,$10,$7 - j $31 - sw $8,0($4) - .end __gmpn_rshift diff --git a/rts/gmp/mpn/mips2/sub_n.s b/rts/gmp/mpn/mips2/sub_n.s deleted file mode 100644 index 51d34f3..0000000 --- a/rts/gmp/mpn/mips2/sub_n.s +++ /dev/null @@ -1,120 +0,0 @@ - # MIPS2 __gmpn_sub_n -- Subtract two limb vectors of the same length > 0 and - # store difference in a third limb vector. - - # Copyright (C) 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. - - - # INPUT PARAMETERS - # res_ptr $4 - # s1_ptr $5 - # s2_ptr $6 - # size $7 - - .text - .align 2 - .globl __gmpn_sub_n - .ent __gmpn_sub_n -__gmpn_sub_n: - .set noreorder - .set nomacro - - lw $10,0($5) - lw $11,0($6) - - addiu $7,$7,-1 - and $9,$7,4-1 # number of limbs in first loop - beq $9,$0,.L0 # if multiple of 4 limbs, skip first loop - move $2,$0 - - subu $7,$7,$9 - -.Loop0: addiu $9,$9,-1 - lw $12,4($5) - addu $11,$11,$2 - lw $13,4($6) - sltu $8,$11,$2 - subu $11,$10,$11 - sltu $2,$10,$11 - sw $11,0($4) - or $2,$2,$8 - - addiu $5,$5,4 - addiu $6,$6,4 - move $10,$12 - move $11,$13 - bne $9,$0,.Loop0 - addiu $4,$4,4 - -.L0: beq $7,$0,.Lend - nop - -.Loop: addiu $7,$7,-4 - - lw $12,4($5) - addu $11,$11,$2 - lw $13,4($6) - sltu $8,$11,$2 - subu $11,$10,$11 - sltu $2,$10,$11 - sw $11,0($4) - or $2,$2,$8 - - lw $10,8($5) - addu $13,$13,$2 - lw $11,8($6) - sltu $8,$13,$2 - subu $13,$12,$13 - sltu $2,$12,$13 - sw $13,4($4) - or $2,$2,$8 - - lw $12,12($5) - addu $11,$11,$2 - lw $13,12($6) - sltu $8,$11,$2 - subu $11,$10,$11 - sltu $2,$10,$11 - sw $11,8($4) - or $2,$2,$8 - - lw $10,16($5) - addu $13,$13,$2 - lw $11,16($6) - sltu $8,$13,$2 - subu $13,$12,$13 - sltu $2,$12,$13 - sw $13,12($4) - or $2,$2,$8 - - addiu $5,$5,16 - addiu $6,$6,16 - - bne $7,$0,.Loop - addiu $4,$4,16 - -.Lend: addu $11,$11,$2 - sltu $8,$11,$2 - subu $11,$10,$11 - sltu $2,$10,$11 - sw $11,0($4) - j $31 - or $2,$2,$8 - - .end __gmpn_sub_n diff --git a/rts/gmp/mpn/mips2/submul_1.s b/rts/gmp/mpn/mips2/submul_1.s deleted file mode 100644 index 495dea3..0000000 --- a/rts/gmp/mpn/mips2/submul_1.s +++ /dev/null @@ -1,97 +0,0 @@ - # MIPS __gmpn_submul_1 -- Multiply a limb vector with a single limb and - # subtract the product from a second limb vector. - - # Copyright (C) 1992, 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. - - - # INPUT PARAMETERS - # res_ptr $4 - # s1_ptr $5 - # size $6 - # s2_limb $7 - - .text - .align 4 - .globl __gmpn_submul_1 - .ent __gmpn_submul_1 -__gmpn_submul_1: - .set noreorder - .set nomacro - - # warm up phase 0 - lw $8,0($5) - - # warm up phase 1 - addiu $5,$5,4 - multu $8,$7 - - addiu $6,$6,-1 - beq $6,$0,$LC0 - move $2,$0 # zero cy2 - - addiu $6,$6,-1 - beq $6,$0,$LC1 - lw $8,0($5) # load new s1 limb as early as possible - -Loop: lw $10,0($4) - mflo $3 - mfhi $9 - addiu $5,$5,4 - addu $3,$3,$2 # add old carry limb to low product limb - multu $8,$7 - lw $8,0($5) # load new s1 limb as early as possible - addiu $6,$6,-1 # decrement loop counter - sltu $2,$3,$2 # carry from previous addition -> $2 - subu $3,$10,$3 - sgtu $10,$3,$10 - addu $2,$2,$10 - sw $3,0($4) - addiu $4,$4,4 - bne $6,$0,Loop - addu $2,$9,$2 # add high product limb and carry from addition - - # cool down phase 1 -$LC1: lw $10,0($4) - mflo $3 - mfhi $9 - addu $3,$3,$2 - sltu $2,$3,$2 - multu $8,$7 - subu $3,$10,$3 - sgtu $10,$3,$10 - addu $2,$2,$10 - sw $3,0($4) - addiu $4,$4,4 - addu $2,$9,$2 # add high product limb and carry from addition - - # cool down phase 0 -$LC0: lw $10,0($4) - mflo $3 - mfhi $9 - addu $3,$3,$2 - sltu $2,$3,$2 - subu $3,$10,$3 - sgtu $10,$3,$10 - addu $2,$2,$10 - sw $3,0($4) - j $31 - addu $2,$9,$2 # add high product limb and carry from addition - - .end __gmpn_submul_1 diff --git a/rts/gmp/mpn/mips2/umul.s b/rts/gmp/mpn/mips2/umul.s deleted file mode 100644 index 40e8476..0000000 --- a/rts/gmp/mpn/mips2/umul.s +++ /dev/null @@ -1,30 +0,0 @@ - # Copyright (C) 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. - - .text - .align 2 - .globl __umul_ppmm - .ent __umul_ppmm -__umul_ppmm: - multu $5,$6 - mflo $3 - mfhi $2 - sw $3,0($4) - j $31 - .end __umul_ppmm diff --git a/rts/gmp/mpn/mips3/README b/rts/gmp/mpn/mips3/README deleted file mode 100644 index e94b2c7..0000000 --- a/rts/gmp/mpn/mips3/README +++ /dev/null @@ -1,23 +0,0 @@ -This directory contains mpn functions optimized for MIPS3. Example of -processors that implement MIPS3 are R4000, R4400, R4600, R4700, and R8000. - -RELEVANT OPTIMIZATION ISSUES - -1. On the R4000 and R4400, branches, both the plain and the "likely" ones, - take 3 cycles to execute. (The fastest possible loop will take 4 cycles, - because of the delay insn.) - - On the R4600, branches takes a single cycle - - On the R8000, branches often take no noticable cycles, as they are - executed in a separate function unit.. - -2. The R4000 and R4400 have a load latency of 4 cycles. - -3. On the R4000 and R4400, multiplies take a data-dependent number of - cycles, contrary to the SGI documentation. There seem to be 3 or 4 - possible latencies. - -STATUS - -Good... diff --git a/rts/gmp/mpn/mips3/add_n.s b/rts/gmp/mpn/mips3/add_n.s deleted file mode 100644 index adad0be..0000000 --- a/rts/gmp/mpn/mips3/add_n.s +++ /dev/null @@ -1,120 +0,0 @@ - # MIPS3 __gmpn_add_n -- Add two limb vectors of the same length > 0 and - # store sum in a third limb vector. - - # Copyright (C) 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. - - - # INPUT PARAMETERS - # res_ptr $4 - # s1_ptr $5 - # s2_ptr $6 - # size $7 - - .text - .align 2 - .globl __gmpn_add_n - .ent __gmpn_add_n -__gmpn_add_n: - .set noreorder - .set nomacro - - ld $10,0($5) - ld $11,0($6) - - daddiu $7,$7,-1 - and $9,$7,4-1 # number of limbs in first loop - beq $9,$0,.L0 # if multiple of 4 limbs, skip first loop - move $2,$0 - - dsubu $7,$7,$9 - -.Loop0: daddiu $9,$9,-1 - ld $12,8($5) - daddu $11,$11,$2 - ld $13,8($6) - sltu $8,$11,$2 - daddu $11,$10,$11 - sltu $2,$11,$10 - sd $11,0($4) - or $2,$2,$8 - - daddiu $5,$5,8 - daddiu $6,$6,8 - move $10,$12 - move $11,$13 - bne $9,$0,.Loop0 - daddiu $4,$4,8 - -.L0: beq $7,$0,.Lend - nop - -.Loop: daddiu $7,$7,-4 - - ld $12,8($5) - daddu $11,$11,$2 - ld $13,8($6) - sltu $8,$11,$2 - daddu $11,$10,$11 - sltu $2,$11,$10 - sd $11,0($4) - or $2,$2,$8 - - ld $10,16($5) - daddu $13,$13,$2 - ld $11,16($6) - sltu $8,$13,$2 - daddu $13,$12,$13 - sltu $2,$13,$12 - sd $13,8($4) - or $2,$2,$8 - - ld $12,24($5) - daddu $11,$11,$2 - ld $13,24($6) - sltu $8,$11,$2 - daddu $11,$10,$11 - sltu $2,$11,$10 - sd $11,16($4) - or $2,$2,$8 - - ld $10,32($5) - daddu $13,$13,$2 - ld $11,32($6) - sltu $8,$13,$2 - daddu $13,$12,$13 - sltu $2,$13,$12 - sd $13,24($4) - or $2,$2,$8 - - daddiu $5,$5,32 - daddiu $6,$6,32 - - bne $7,$0,.Loop - daddiu $4,$4,32 - -.Lend: daddu $11,$11,$2 - sltu $8,$11,$2 - daddu $11,$10,$11 - sltu $2,$11,$10 - sd $11,0($4) - j $31 - or $2,$2,$8 - - .end __gmpn_add_n diff --git a/rts/gmp/mpn/mips3/addmul_1.s b/rts/gmp/mpn/mips3/addmul_1.s deleted file mode 100644 index d390e22..0000000 --- a/rts/gmp/mpn/mips3/addmul_1.s +++ /dev/null @@ -1,97 +0,0 @@ - # MIPS3 __gmpn_addmul_1 -- Multiply a limb vector with a single limb and - # add the product to a second limb vector. - - # Copyright (C) 1992, 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. - - - # INPUT PARAMETERS - # res_ptr $4 - # s1_ptr $5 - # size $6 - # s2_limb $7 - - .text - .align 4 - .globl __gmpn_addmul_1 - .ent __gmpn_addmul_1 -__gmpn_addmul_1: - .set noreorder - .set nomacro - - # warm up phase 0 - ld $8,0($5) - - # warm up phase 1 - daddiu $5,$5,8 - dmultu $8,$7 - - daddiu $6,$6,-1 - beq $6,$0,$LC0 - move $2,$0 # zero cy2 - - daddiu $6,$6,-1 - beq $6,$0,$LC1 - ld $8,0($5) # load new s1 limb as early as possible - -Loop: ld $10,0($4) - mflo $3 - mfhi $9 - daddiu $5,$5,8 - daddu $3,$3,$2 # add old carry limb to low product limb - dmultu $8,$7 - ld $8,0($5) # load new s1 limb as early as possible - daddiu $6,$6,-1 # decrement loop counter - sltu $2,$3,$2 # carry from previous addition -> $2 - daddu $3,$10,$3 - sltu $10,$3,$10 - daddu $2,$2,$10 - sd $3,0($4) - daddiu $4,$4,8 - bne $6,$0,Loop - daddu $2,$9,$2 # add high product limb and carry from addition - - # cool down phase 1 -$LC1: ld $10,0($4) - mflo $3 - mfhi $9 - daddu $3,$3,$2 - sltu $2,$3,$2 - dmultu $8,$7 - daddu $3,$10,$3 - sltu $10,$3,$10 - daddu $2,$2,$10 - sd $3,0($4) - daddiu $4,$4,8 - daddu $2,$9,$2 # add high product limb and carry from addition - - # cool down phase 0 -$LC0: ld $10,0($4) - mflo $3 - mfhi $9 - daddu $3,$3,$2 - sltu $2,$3,$2 - daddu $3,$10,$3 - sltu $10,$3,$10 - daddu $2,$2,$10 - sd $3,0($4) - j $31 - daddu $2,$9,$2 # add high product limb and carry from addition - - .end __gmpn_addmul_1 diff --git a/rts/gmp/mpn/mips3/gmp-mparam.h b/rts/gmp/mpn/mips3/gmp-mparam.h deleted file mode 100644 index 656e90c..0000000 --- a/rts/gmp/mpn/mips3/gmp-mparam.h +++ /dev/null @@ -1,58 +0,0 @@ -/* gmp-mparam.h -- Compiler/machine parameter header file. - -Copyright (C) 1991, 1993, 1994, 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. */ - -#define BITS_PER_MP_LIMB 64 -#define BYTES_PER_MP_LIMB 8 -#define BITS_PER_LONGINT 32 -#define BITS_PER_INT 32 -#define BITS_PER_SHORTINT 16 -#define BITS_PER_CHAR 8 - -/* These values are for the R10000 usign the system cc. */ -/* Generated by tuneup.c, 2000-07-25. */ -#ifndef KARATSUBA_MUL_THRESHOLD -#define KARATSUBA_MUL_THRESHOLD 16 -#endif -#ifndef KARATSUBA_SQR_THRESHOLD -#define KARATSUBA_SQR_THRESHOLD 32 -#endif - -/* Supressed the TOOM3 values as they looked absolutely crazy - (698 and 21 respectively) */ - -#ifndef BZ_THRESHOLD -#define BZ_THRESHOLD 58 -#endif - -#ifndef FIB_THRESHOLD -#define FIB_THRESHOLD 54 -#endif - -#ifndef POWM_THRESHOLD -#define POWM_THRESHOLD 82 -#endif - -#ifndef GCD_ACCEL_THRESHOLD -#define GCD_ACCEL_THRESHOLD 4 -#endif -#ifndef GCDEXT_THRESHOLD -#define GCDEXT_THRESHOLD 159 -#endif diff --git a/rts/gmp/mpn/mips3/lshift.s b/rts/gmp/mpn/mips3/lshift.s deleted file mode 100644 index 372606f..0000000 --- a/rts/gmp/mpn/mips3/lshift.s +++ /dev/null @@ -1,95 +0,0 @@ - # MIPS3 __gmpn_lshift -- - - # Copyright (C) 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. - - - # INPUT PARAMETERS - # res_ptr $4 - # src_ptr $5 - # size $6 - # cnt $7 - - .text - .align 2 - .globl __gmpn_lshift - .ent __gmpn_lshift -__gmpn_lshift: - .set noreorder - .set nomacro - - dsll $2,$6,3 - daddu $5,$5,$2 # make r5 point at end of src - ld $10,-8($5) # load first limb - dsubu $13,$0,$7 - daddu $4,$4,$2 # make r4 point at end of res - daddiu $6,$6,-1 - and $9,$6,4-1 # number of limbs in first loop - beq $9,$0,.L0 # if multiple of 4 limbs, skip first loop - dsrl $2,$10,$13 # compute function result - - dsubu $6,$6,$9 - -.Loop0: ld $3,-16($5) - daddiu $4,$4,-8 - daddiu $5,$5,-8 - daddiu $9,$9,-1 - dsll $11,$10,$7 - dsrl $12,$3,$13 - move $10,$3 - or $8,$11,$12 - bne $9,$0,.Loop0 - sd $8,0($4) - -.L0: beq $6,$0,.Lend - nop - -.Loop: ld $3,-16($5) - daddiu $4,$4,-32 - daddiu $6,$6,-4 - dsll $11,$10,$7 - dsrl $12,$3,$13 - - ld $10,-24($5) - dsll $14,$3,$7 - or $8,$11,$12 - sd $8,24($4) - dsrl $9,$10,$13 - - ld $3,-32($5) - dsll $11,$10,$7 - or $8,$14,$9 - sd $8,16($4) - dsrl $12,$3,$13 - - ld $10,-40($5) - dsll $14,$3,$7 - or $8,$11,$12 - sd $8,8($4) - dsrl $9,$10,$13 - - daddiu $5,$5,-32 - or $8,$14,$9 - bgtz $6,.Loop - sd $8,0($4) - -.Lend: dsll $8,$10,$7 - j $31 - sd $8,-8($4) - .end __gmpn_lshift diff --git a/rts/gmp/mpn/mips3/mul_1.s b/rts/gmp/mpn/mips3/mul_1.s deleted file mode 100644 index 6659e2b..0000000 --- a/rts/gmp/mpn/mips3/mul_1.s +++ /dev/null @@ -1,85 +0,0 @@ - # MIPS3 __gmpn_mul_1 -- Multiply a limb vector with a single limb and - # store the product in a second limb vector. - - # Copyright (C) 1992, 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. - - - # INPUT PARAMETERS - # res_ptr $4 - # s1_ptr $5 - # size $6 - # s2_limb $7 - - .text - .align 4 - .globl __gmpn_mul_1 - .ent __gmpn_mul_1 -__gmpn_mul_1: - .set noreorder - .set nomacro - - # warm up phase 0 - ld $8,0($5) - - # warm up phase 1 - daddiu $5,$5,8 - dmultu $8,$7 - - daddiu $6,$6,-1 - beq $6,$0,$LC0 - move $2,$0 # zero cy2 - - daddiu $6,$6,-1 - beq $6,$0,$LC1 - ld $8,0($5) # load new s1 limb as early as possible - -Loop: mflo $10 - mfhi $9 - daddiu $5,$5,8 - daddu $10,$10,$2 # add old carry limb to low product limb - dmultu $8,$7 - ld $8,0($5) # load new s1 limb as early as possible - daddiu $6,$6,-1 # decrement loop counter - sltu $2,$10,$2 # carry from previous addition -> $2 - sd $10,0($4) - daddiu $4,$4,8 - bne $6,$0,Loop - daddu $2,$9,$2 # add high product limb and carry from addition - - # cool down phase 1 -$LC1: mflo $10 - mfhi $9 - daddu $10,$10,$2 - sltu $2,$10,$2 - dmultu $8,$7 - sd $10,0($4) - daddiu $4,$4,8 - daddu $2,$9,$2 # add high product limb and carry from addition - - # cool down phase 0 -$LC0: mflo $10 - mfhi $9 - daddu $10,$10,$2 - sltu $2,$10,$2 - sd $10,0($4) - j $31 - daddu $2,$9,$2 # add high product limb and carry from addition - - .end __gmpn_mul_1 diff --git a/rts/gmp/mpn/mips3/rshift.s b/rts/gmp/mpn/mips3/rshift.s deleted file mode 100644 index 59c7fd3..0000000 --- a/rts/gmp/mpn/mips3/rshift.s +++ /dev/null @@ -1,92 +0,0 @@ - # MIPS3 __gmpn_rshift -- - - # Copyright (C) 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. - - - # INPUT PARAMETERS - # res_ptr $4 - # src_ptr $5 - # size $6 - # cnt $7 - - .text - .align 2 - .globl __gmpn_rshift - .ent __gmpn_rshift -__gmpn_rshift: - .set noreorder - .set nomacro - - ld $10,0($5) # load first limb - dsubu $13,$0,$7 - daddiu $6,$6,-1 - and $9,$6,4-1 # number of limbs in first loop - beq $9,$0,.L0 # if multiple of 4 limbs, skip first loop - dsll $2,$10,$13 # compute function result - - dsubu $6,$6,$9 - -.Loop0: ld $3,8($5) - daddiu $4,$4,8 - daddiu $5,$5,8 - daddiu $9,$9,-1 - dsrl $11,$10,$7 - dsll $12,$3,$13 - move $10,$3 - or $8,$11,$12 - bne $9,$0,.Loop0 - sd $8,-8($4) - -.L0: beq $6,$0,.Lend - nop - -.Loop: ld $3,8($5) - daddiu $4,$4,32 - daddiu $6,$6,-4 - dsrl $11,$10,$7 - dsll $12,$3,$13 - - ld $10,16($5) - dsrl $14,$3,$7 - or $8,$11,$12 - sd $8,-32($4) - dsll $9,$10,$13 - - ld $3,24($5) - dsrl $11,$10,$7 - or $8,$14,$9 - sd $8,-24($4) - dsll $12,$3,$13 - - ld $10,32($5) - dsrl $14,$3,$7 - or $8,$11,$12 - sd $8,-16($4) - dsll $9,$10,$13 - - daddiu $5,$5,32 - or $8,$14,$9 - bgtz $6,.Loop - sd $8,-8($4) - -.Lend: dsrl $8,$10,$7 - j $31 - sd $8,0($4) - .end __gmpn_rshift diff --git a/rts/gmp/mpn/mips3/sub_n.s b/rts/gmp/mpn/mips3/sub_n.s deleted file mode 100644 index c57c824..0000000 --- a/rts/gmp/mpn/mips3/sub_n.s +++ /dev/null @@ -1,120 +0,0 @@ - # MIPS3 __gmpn_sub_n -- Subtract two limb vectors of the same length > 0 and - # store difference in a third limb vector. - - # Copyright (C) 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. - - - # INPUT PARAMETERS - # res_ptr $4 - # s1_ptr $5 - # s2_ptr $6 - # size $7 - - .text - .align 2 - .globl __gmpn_sub_n - .ent __gmpn_sub_n -__gmpn_sub_n: - .set noreorder - .set nomacro - - ld $10,0($5) - ld $11,0($6) - - daddiu $7,$7,-1 - and $9,$7,4-1 # number of limbs in first loop - beq $9,$0,.L0 # if multiple of 4 limbs, skip first loop - move $2,$0 - - dsubu $7,$7,$9 - -.Loop0: daddiu $9,$9,-1 - ld $12,8($5) - daddu $11,$11,$2 - ld $13,8($6) - sltu $8,$11,$2 - dsubu $11,$10,$11 - sltu $2,$10,$11 - sd $11,0($4) - or $2,$2,$8 - - daddiu $5,$5,8 - daddiu $6,$6,8 - move $10,$12 - move $11,$13 - bne $9,$0,.Loop0 - daddiu $4,$4,8 - -.L0: beq $7,$0,.Lend - nop - -.Loop: daddiu $7,$7,-4 - - ld $12,8($5) - daddu $11,$11,$2 - ld $13,8($6) - sltu $8,$11,$2 - dsubu $11,$10,$11 - sltu $2,$10,$11 - sd $11,0($4) - or $2,$2,$8 - - ld $10,16($5) - daddu $13,$13,$2 - ld $11,16($6) - sltu $8,$13,$2 - dsubu $13,$12,$13 - sltu $2,$12,$13 - sd $13,8($4) - or $2,$2,$8 - - ld $12,24($5) - daddu $11,$11,$2 - ld $13,24($6) - sltu $8,$11,$2 - dsubu $11,$10,$11 - sltu $2,$10,$11 - sd $11,16($4) - or $2,$2,$8 - - ld $10,32($5) - daddu $13,$13,$2 - ld $11,32($6) - sltu $8,$13,$2 - dsubu $13,$12,$13 - sltu $2,$12,$13 - sd $13,24($4) - or $2,$2,$8 - - daddiu $5,$5,32 - daddiu $6,$6,32 - - bne $7,$0,.Loop - daddiu $4,$4,32 - -.Lend: daddu $11,$11,$2 - sltu $8,$11,$2 - dsubu $11,$10,$11 - sltu $2,$10,$11 - sd $11,0($4) - j $31 - or $2,$2,$8 - - .end __gmpn_sub_n diff --git a/rts/gmp/mpn/mips3/submul_1.s b/rts/gmp/mpn/mips3/submul_1.s deleted file mode 100644 index 531f970..0000000 --- a/rts/gmp/mpn/mips3/submul_1.s +++ /dev/null @@ -1,97 +0,0 @@ - # MIPS3 __gmpn_submul_1 -- Multiply a limb vector with a single limb and - # subtract the product from a second limb vector. - - # Copyright (C) 1992, 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. - - - # INPUT PARAMETERS - # res_ptr $4 - # s1_ptr $5 - # size $6 - # s2_limb $7 - - .text - .align 4 - .globl __gmpn_submul_1 - .ent __gmpn_submul_1 -__gmpn_submul_1: - .set noreorder - .set nomacro - - # warm up phase 0 - ld $8,0($5) - - # warm up phase 1 - daddiu $5,$5,8 - dmultu $8,$7 - - daddiu $6,$6,-1 - beq $6,$0,$LC0 - move $2,$0 # zero cy2 - - daddiu $6,$6,-1 - beq $6,$0,$LC1 - ld $8,0($5) # load new s1 limb as early as possible - -Loop: ld $10,0($4) - mflo $3 - mfhi $9 - daddiu $5,$5,8 - daddu $3,$3,$2 # add old carry limb to low product limb - dmultu $8,$7 - ld $8,0($5) # load new s1 limb as early as possible - daddiu $6,$6,-1 # decrement loop counter - sltu $2,$3,$2 # carry from previous addition -> $2 - dsubu $3,$10,$3 - sgtu $10,$3,$10 - daddu $2,$2,$10 - sd $3,0($4) - daddiu $4,$4,8 - bne $6,$0,Loop - daddu $2,$9,$2 # add high product limb and carry from addition - - # cool down phase 1 -$LC1: ld $10,0($4) - mflo $3 - mfhi $9 - daddu $3,$3,$2 - sltu $2,$3,$2 - dmultu $8,$7 - dsubu $3,$10,$3 - sgtu $10,$3,$10 - daddu $2,$2,$10 - sd $3,0($4) - daddiu $4,$4,8 - daddu $2,$9,$2 # add high product limb and carry from addition - - # cool down phase 0 -$LC0: ld $10,0($4) - mflo $3 - mfhi $9 - daddu $3,$3,$2 - sltu $2,$3,$2 - dsubu $3,$10,$3 - sgtu $10,$3,$10 - daddu $2,$2,$10 - sd $3,0($4) - j $31 - daddu $2,$9,$2 # add high product limb and carry from addition - - .end __gmpn_submul_1 diff --git a/rts/gmp/mpn/mp_bases.c b/rts/gmp/mpn/mp_bases.c deleted file mode 100644 index 011c328..0000000 --- a/rts/gmp/mpn/mp_bases.c +++ /dev/null @@ -1,550 +0,0 @@ -/* __mp_bases -- Structure for conversion between internal binary - format and strings in base 2..255. The fields are explained in - gmp-impl.h. - - -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" - - -#if BITS_PER_MP_LIMB == 32 -const struct bases __mp_bases[256] = -{ - /* 0 */ {0, 0.0, 0, 0}, - /* 1 */ {0, 1e38, 0, 0}, - /* 2 */ {32, 1.0000000000000000, 0x1, 0x0}, - /* 3 */ {20, 0.6309297535714575, 0xcfd41b91, 0x3b563c24}, - /* 4 */ {16, 0.5000000000000000, 0x2, 0x0}, - /* 5 */ {13, 0.4306765580733931, 0x48c27395, 0xc25c2684}, - /* 6 */ {12, 0.3868528072345416, 0x81bf1000, 0xf91bd1b6}, - /* 7 */ {11, 0.3562071871080222, 0x75db9c97, 0x1607a2cb}, - /* 8 */ {10, 0.3333333333333334, 0x3, 0x0}, - /* 9 */ {10, 0.3154648767857287, 0xcfd41b91, 0x3b563c24}, - /* 10 */ {9, 0.3010299956639811, 0x3b9aca00, 0x12e0be82}, - /* 11 */ {9, 0.2890648263178878, 0x8c8b6d2b, 0xd24cde04}, - /* 12 */ {8, 0.2789429456511298, 0x19a10000, 0x3fa39ab5}, - /* 13 */ {8, 0.2702381544273197, 0x309f1021, 0x50f8ac5f}, - /* 14 */ {8, 0.2626495350371936, 0x57f6c100, 0x74843b1e}, - /* 15 */ {8, 0.2559580248098155, 0x98c29b81, 0xad0326c2}, - /* 16 */ {8, 0.2500000000000000, 0x4, 0x0}, - /* 17 */ {7, 0.2446505421182260, 0x18754571, 0x4ef0b6bd}, - /* 18 */ {7, 0.2398124665681315, 0x247dbc80, 0xc0fc48a1}, - /* 19 */ {7, 0.2354089133666382, 0x3547667b, 0x33838942}, - /* 20 */ {7, 0.2313782131597592, 0x4c4b4000, 0xad7f29ab}, - /* 21 */ {7, 0.2276702486969530, 0x6b5a6e1d, 0x313c3d15}, - /* 22 */ {7, 0.2242438242175754, 0x94ace180, 0xb8cca9e0}, - /* 23 */ {7, 0.2210647294575037, 0xcaf18367, 0x42ed6de9}, - /* 24 */ {6, 0.2181042919855316, 0xb640000, 0x67980e0b}, - /* 25 */ {6, 0.2153382790366965, 0xe8d4a51, 0x19799812}, - /* 26 */ {6, 0.2127460535533632, 0x1269ae40, 0xbce85396}, - /* 27 */ {6, 0.2103099178571525, 0x17179149, 0x62c103a9}, - /* 28 */ {6, 0.2080145976765095, 0x1cb91000, 0x1d353d43}, - /* 29 */ {6, 0.2058468324604344, 0x23744899, 0xce1decea}, - /* 30 */ {6, 0.2037950470905062, 0x2b73a840, 0x790fc511}, - /* 31 */ {6, 0.2018490865820999, 0x34e63b41, 0x35b865a0}, - /* 32 */ {6, 0.2000000000000000, 0x5, 0x0}, - /* 33 */ {6, 0.1982398631705605, 0x4cfa3cc1, 0xa9aed1b3}, - /* 34 */ {6, 0.1965616322328226, 0x5c13d840, 0x63dfc229}, - /* 35 */ {6, 0.1949590218937863, 0x6d91b519, 0x2b0fee30}, - /* 36 */ {6, 0.1934264036172708, 0x81bf1000, 0xf91bd1b6}, - /* 37 */ {6, 0.1919587200065601, 0x98ede0c9, 0xac89c3a9}, - /* 38 */ {6, 0.1905514124267734, 0xb3773e40, 0x6d2c32fe}, - /* 39 */ {6, 0.1892003595168700, 0xd1bbc4d1, 0x387907c9}, - /* 40 */ {6, 0.1879018247091076, 0xf4240000, 0xc6f7a0b}, - /* 41 */ {5, 0.1866524112389434, 0x6e7d349, 0x28928154}, - /* 42 */ {5, 0.1854490234153689, 0x7ca30a0, 0x6e8629d}, - /* 43 */ {5, 0.1842888331487062, 0x8c32bbb, 0xd373dca0}, - /* 44 */ {5, 0.1831692509136336, 0x9d46c00, 0xa0b17895}, - /* 45 */ {5, 0.1820879004699383, 0xaffacfd, 0x746811a5}, - /* 46 */ {5, 0.1810425967800402, 0xc46bee0, 0x4da6500f}, - /* 47 */ {5, 0.1800313266566926, 0xdab86ef, 0x2ba23582}, - /* 48 */ {5, 0.1790522317510414, 0xf300000, 0xdb20a88}, - /* 49 */ {5, 0.1781035935540111, 0x10d63af1, 0xe68d5ce4}, - /* 50 */ {5, 0.1771838201355579, 0x12a05f20, 0xb7cdfd9d}, - /* 51 */ {5, 0.1762914343888821, 0x1490aae3, 0x8e583933}, - /* 52 */ {5, 0.1754250635819545, 0x16a97400, 0x697cc3ea}, - /* 53 */ {5, 0.1745834300480449, 0x18ed2825, 0x48a5ca6c}, - /* 54 */ {5, 0.1737653428714400, 0x1b5e4d60, 0x2b52db16}, - /* 55 */ {5, 0.1729696904450771, 0x1dff8297, 0x111586a6}, - /* 56 */ {5, 0.1721954337940981, 0x20d38000, 0xf31d2b36}, - /* 57 */ {5, 0.1714416005739134, 0x23dd1799, 0xc8d76d19}, - /* 58 */ {5, 0.1707072796637201, 0x271f35a0, 0xa2cb1eb4}, - /* 59 */ {5, 0.1699916162869140, 0x2a9ce10b, 0x807c3ec3}, - /* 60 */ {5, 0.1692938075987814, 0x2e593c00, 0x617ec8bf}, - /* 61 */ {5, 0.1686130986895011, 0x3257844d, 0x45746cbe}, - /* 62 */ {5, 0.1679487789570419, 0x369b13e0, 0x2c0aa273}, - /* 63 */ {5, 0.1673001788101741, 0x3b27613f, 0x14f90805}, - /* 64 */ {5, 0.1666666666666667, 0x6, 0x0}, - /* 65 */ {5, 0.1660476462159378, 0x4528a141, 0xd9cf0829}, - /* 66 */ {5, 0.1654425539190583, 0x4aa51420, 0xb6fc4841}, - /* 67 */ {5, 0.1648508567221604, 0x50794633, 0x973054cb}, - /* 68 */ {5, 0.1642720499620502, 0x56a94400, 0x7a1dbe4b}, - /* 69 */ {5, 0.1637056554452156, 0x5d393975, 0x5f7fcd7f}, - /* 70 */ {5, 0.1631512196835108, 0x642d7260, 0x47196c84}, - /* 71 */ {5, 0.1626083122716341, 0x6b8a5ae7, 0x30b43635}, - /* 72 */ {5, 0.1620765243931223, 0x73548000, 0x1c1fa5f6}, - /* 73 */ {5, 0.1615554674429964, 0x7b908fe9, 0x930634a}, - /* 74 */ {5, 0.1610447717564445, 0x84435aa0, 0xef7f4a3c}, - /* 75 */ {5, 0.1605440854340214, 0x8d71d25b, 0xcf5552d2}, - /* 76 */ {5, 0.1600530732548213, 0x97210c00, 0xb1a47c8e}, - /* 77 */ {5, 0.1595714156699382, 0xa1563f9d, 0x9634b43e}, - /* 78 */ {5, 0.1590988078692941, 0xac16c8e0, 0x7cd3817d}, - /* 79 */ {5, 0.1586349589155960, 0xb768278f, 0x65536761}, - /* 80 */ {5, 0.1581795909397823, 0xc3500000, 0x4f8b588e}, - /* 81 */ {5, 0.1577324383928644, 0xcfd41b91, 0x3b563c24}, - /* 82 */ {5, 0.1572932473495469, 0xdcfa6920, 0x28928154}, - /* 83 */ {5, 0.1568617748594410, 0xeac8fd83, 0x1721bfb0}, - /* 84 */ {5, 0.1564377883420716, 0xf9461400, 0x6e8629d}, - /* 85 */ {4, 0.1560210650222250, 0x31c84b1, 0x491cc17c}, - /* 86 */ {4, 0.1556113914024940, 0x342ab10, 0x3a11d83b}, - /* 87 */ {4, 0.1552085627701551, 0x36a2c21, 0x2be074cd}, - /* 88 */ {4, 0.1548123827357682, 0x3931000, 0x1e7a02e7}, - /* 89 */ {4, 0.1544226628011101, 0x3bd5ee1, 0x11d10edd}, - /* 90 */ {4, 0.1540392219542636, 0x3e92110, 0x5d92c68}, - /* 91 */ {4, 0.1536618862898642, 0x4165ef1, 0xf50dbfb2}, - /* 92 */ {4, 0.1532904886526781, 0x4452100, 0xdf9f1316}, - /* 93 */ {4, 0.1529248683028321, 0x4756fd1, 0xcb52a684}, - /* 94 */ {4, 0.1525648706011593, 0x4a75410, 0xb8163e97}, - /* 95 */ {4, 0.1522103467132434, 0x4dad681, 0xa5d8f269}, - /* 96 */ {4, 0.1518611533308632, 0x5100000, 0x948b0fcd}, - /* 97 */ {4, 0.1515171524096389, 0x546d981, 0x841e0215}, - /* 98 */ {4, 0.1511782109217764, 0x57f6c10, 0x74843b1e}, - /* 99 */ {4, 0.1508442006228941, 0x5b9c0d1, 0x65b11e6e}, - /* 100 */ {4, 0.1505149978319906, 0x5f5e100, 0x5798ee23}, - /* 101 */ {4, 0.1501904832236879, 0x633d5f1, 0x4a30b99b}, - /* 102 */ {4, 0.1498705416319474, 0x673a910, 0x3d6e4d94}, - /* 103 */ {4, 0.1495550618645152, 0x6b563e1, 0x314825b0}, - /* 104 */ {4, 0.1492439365274121, 0x6f91000, 0x25b55f2e}, - /* 105 */ {4, 0.1489370618588283, 0x73eb721, 0x1aadaccb}, - /* 106 */ {4, 0.1486343375718350, 0x7866310, 0x10294ba2}, - /* 107 */ {4, 0.1483356667053617, 0x7d01db1, 0x620f8f6}, - /* 108 */ {4, 0.1480409554829326, 0x81bf100, 0xf91bd1b6}, - /* 109 */ {4, 0.1477501131786861, 0x869e711, 0xe6d37b2a}, - /* 110 */ {4, 0.1474630519902391, 0x8ba0a10, 0xd55cff6e}, - /* 111 */ {4, 0.1471796869179852, 0x90c6441, 0xc4ad2db2}, - /* 112 */ {4, 0.1468999356504447, 0x9610000, 0xb4b985cf}, - /* 113 */ {4, 0.1466237184553111, 0x9b7e7c1, 0xa5782bef}, - /* 114 */ {4, 0.1463509580758620, 0xa112610, 0x96dfdd2a}, - /* 115 */ {4, 0.1460815796324244, 0xa6cc591, 0x88e7e509}, - /* 116 */ {4, 0.1458155105286054, 0xacad100, 0x7b8813d3}, - /* 117 */ {4, 0.1455526803620167, 0xb2b5331, 0x6eb8b595}, - /* 118 */ {4, 0.1452930208392428, 0xb8e5710, 0x627289db}, - /* 119 */ {4, 0.1450364656948130, 0xbf3e7a1, 0x56aebc07}, - /* 120 */ {4, 0.1447829506139581, 0xc5c1000, 0x4b66dc33}, - /* 121 */ {4, 0.1445324131589439, 0xcc6db61, 0x4094d8a3}, - /* 122 */ {4, 0.1442847926987864, 0xd345510, 0x3632f7a5}, - /* 123 */ {4, 0.1440400303421672, 0xda48871, 0x2c3bd1f0}, - /* 124 */ {4, 0.1437980688733775, 0xe178100, 0x22aa4d5f}, - /* 125 */ {4, 0.1435588526911310, 0xe8d4a51, 0x19799812}, - /* 126 */ {4, 0.1433223277500932, 0xf05f010, 0x10a523e5}, - /* 127 */ {4, 0.1430884415049874, 0xf817e01, 0x828a237}, - /* 128 */ {4, 0.1428571428571428, 0x7, 0x0}, - /* 129 */ {4, 0.1426283821033600, 0x10818201, 0xf04ec452}, - /* 130 */ {4, 0.1424021108869747, 0x11061010, 0xe136444a}, - /* 131 */ {4, 0.1421782821510107, 0x118db651, 0xd2af9589}, - /* 132 */ {4, 0.1419568500933153, 0x12188100, 0xc4b42a83}, - /* 133 */ {4, 0.1417377701235801, 0x12a67c71, 0xb73dccf5}, - /* 134 */ {4, 0.1415209988221527, 0x1337b510, 0xaa4698c5}, - /* 135 */ {4, 0.1413064939005528, 0x13cc3761, 0x9dc8f729}, - /* 136 */ {4, 0.1410942141636095, 0x14641000, 0x91bf9a30}, - /* 137 */ {4, 0.1408841194731412, 0x14ff4ba1, 0x86257887}, - /* 138 */ {4, 0.1406761707131039, 0x159df710, 0x7af5c98c}, - /* 139 */ {4, 0.1404703297561400, 0x16401f31, 0x702c01a0}, - /* 140 */ {4, 0.1402665594314587, 0x16e5d100, 0x65c3ceb1}, - /* 141 */ {4, 0.1400648234939879, 0x178f1991, 0x5bb91502}, - /* 142 */ {4, 0.1398650865947379, 0x183c0610, 0x5207ec23}, - /* 143 */ {4, 0.1396673142523192, 0x18eca3c1, 0x48ac9c19}, - /* 144 */ {4, 0.1394714728255649, 0x19a10000, 0x3fa39ab5}, - /* 145 */ {4, 0.1392775294872041, 0x1a592841, 0x36e98912}, - /* 146 */ {4, 0.1390854521985406, 0x1b152a10, 0x2e7b3140}, - /* 147 */ {4, 0.1388952096850913, 0x1bd51311, 0x2655840b}, - /* 148 */ {4, 0.1387067714131417, 0x1c98f100, 0x1e7596ea}, - /* 149 */ {4, 0.1385201075671774, 0x1d60d1b1, 0x16d8a20d}, - /* 150 */ {4, 0.1383351890281539, 0x1e2cc310, 0xf7bfe87}, - /* 151 */ {4, 0.1381519873525671, 0x1efcd321, 0x85d2492}, - /* 152 */ {4, 0.1379704747522905, 0x1fd11000, 0x179a9f4}, - /* 153 */ {4, 0.1377906240751463, 0x20a987e1, 0xf59e80eb}, - /* 154 */ {4, 0.1376124087861776, 0x21864910, 0xe8b768db}, - /* 155 */ {4, 0.1374358029495937, 0x226761f1, 0xdc39d6d5}, - /* 156 */ {4, 0.1372607812113589, 0x234ce100, 0xd021c5d1}, - /* 157 */ {4, 0.1370873187823978, 0x2436d4d1, 0xc46b5e37}, - /* 158 */ {4, 0.1369153914223921, 0x25254c10, 0xb912f39c}, - /* 159 */ {4, 0.1367449754241439, 0x26185581, 0xae150294}, - /* 160 */ {4, 0.1365760475984821, 0x27100000, 0xa36e2eb1}, - /* 161 */ {4, 0.1364085852596902, 0x280c5a81, 0x991b4094}, - /* 162 */ {4, 0.1362425662114337, 0x290d7410, 0x8f19241e}, - /* 163 */ {4, 0.1360779687331669, 0x2a135bd1, 0x8564e6b7}, - /* 164 */ {4, 0.1359147715670014, 0x2b1e2100, 0x7bfbb5b4}, - /* 165 */ {4, 0.1357529539050150, 0x2c2dd2f1, 0x72dadcc8}, - /* 166 */ {4, 0.1355924953769863, 0x2d428110, 0x69ffc498}, - /* 167 */ {4, 0.1354333760385373, 0x2e5c3ae1, 0x6167f154}, - /* 168 */ {4, 0.1352755763596663, 0x2f7b1000, 0x5911016e}, - /* 169 */ {4, 0.1351190772136599, 0x309f1021, 0x50f8ac5f}, - /* 170 */ {4, 0.1349638598663645, 0x31c84b10, 0x491cc17c}, - /* 171 */ {4, 0.1348099059658079, 0x32f6d0b1, 0x417b26d8}, - /* 172 */ {4, 0.1346571975321549, 0x342ab100, 0x3a11d83b}, - /* 173 */ {4, 0.1345057169479844, 0x3563fc11, 0x32dee622}, - /* 174 */ {4, 0.1343554469488779, 0x36a2c210, 0x2be074cd}, - /* 175 */ {4, 0.1342063706143054, 0x37e71341, 0x2514bb58}, - /* 176 */ {4, 0.1340584713587980, 0x39310000, 0x1e7a02e7}, - /* 177 */ {4, 0.1339117329233981, 0x3a8098c1, 0x180ea5d0}, - /* 178 */ {4, 0.1337661393673756, 0x3bd5ee10, 0x11d10edd}, - /* 179 */ {4, 0.1336216750601996, 0x3d311091, 0xbbfb88e}, - /* 180 */ {4, 0.1334783246737591, 0x3e921100, 0x5d92c68}, - /* 181 */ {4, 0.1333360731748201, 0x3ff90031, 0x1c024c}, - /* 182 */ {4, 0.1331949058177136, 0x4165ef10, 0xf50dbfb2}, - /* 183 */ {4, 0.1330548081372441, 0x42d8eea1, 0xea30efa3}, - /* 184 */ {4, 0.1329157659418126, 0x44521000, 0xdf9f1316}, - /* 185 */ {4, 0.1327777653067443, 0x45d16461, 0xd555c0c9}, - /* 186 */ {4, 0.1326407925678156, 0x4756fd10, 0xcb52a684}, - /* 187 */ {4, 0.1325048343149731, 0x48e2eb71, 0xc193881f}, - /* 188 */ {4, 0.1323698773862368, 0x4a754100, 0xb8163e97}, - /* 189 */ {4, 0.1322359088617821, 0x4c0e0f51, 0xaed8b724}, - /* 190 */ {4, 0.1321029160581950, 0x4dad6810, 0xa5d8f269}, - /* 191 */ {4, 0.1319708865228925, 0x4f535d01, 0x9d15039d}, - /* 192 */ {4, 0.1318398080287045, 0x51000000, 0x948b0fcd}, - /* 193 */ {4, 0.1317096685686114, 0x52b36301, 0x8c394d1d}, - /* 194 */ {4, 0.1315804563506306, 0x546d9810, 0x841e0215}, - /* 195 */ {4, 0.1314521597928493, 0x562eb151, 0x7c3784f8}, - /* 196 */ {4, 0.1313247675185968, 0x57f6c100, 0x74843b1e}, - /* 197 */ {4, 0.1311982683517524, 0x59c5d971, 0x6d02985d}, - /* 198 */ {4, 0.1310726513121843, 0x5b9c0d10, 0x65b11e6e}, - /* 199 */ {4, 0.1309479056113158, 0x5d796e61, 0x5e8e5c64}, - /* 200 */ {4, 0.1308240206478128, 0x5f5e1000, 0x5798ee23}, - /* 201 */ {4, 0.1307009860033912, 0x614a04a1, 0x50cf7bde}, - /* 202 */ {4, 0.1305787914387386, 0x633d5f10, 0x4a30b99b}, - /* 203 */ {4, 0.1304574268895465, 0x65383231, 0x43bb66bd}, - /* 204 */ {4, 0.1303368824626505, 0x673a9100, 0x3d6e4d94}, - /* 205 */ {4, 0.1302171484322746, 0x69448e91, 0x374842ee}, - /* 206 */ {4, 0.1300982152363760, 0x6b563e10, 0x314825b0}, - /* 207 */ {4, 0.1299800734730872, 0x6d6fb2c1, 0x2b6cde75}, - /* 208 */ {4, 0.1298627138972530, 0x6f910000, 0x25b55f2e}, - /* 209 */ {4, 0.1297461274170591, 0x71ba3941, 0x2020a2c5}, - /* 210 */ {4, 0.1296303050907487, 0x73eb7210, 0x1aadaccb}, - /* 211 */ {4, 0.1295152381234257, 0x7624be11, 0x155b891f}, - /* 212 */ {4, 0.1294009178639407, 0x78663100, 0x10294ba2}, - /* 213 */ {4, 0.1292873358018581, 0x7aafdeb1, 0xb160fe9}, - /* 214 */ {4, 0.1291744835645007, 0x7d01db10, 0x620f8f6}, - /* 215 */ {4, 0.1290623529140715, 0x7f5c3a21, 0x14930ef}, - /* 216 */ {4, 0.1289509357448472, 0x81bf1000, 0xf91bd1b6}, - /* 217 */ {4, 0.1288402240804449, 0x842a70e1, 0xefdcb0c7}, - /* 218 */ {4, 0.1287302100711567, 0x869e7110, 0xe6d37b2a}, - /* 219 */ {4, 0.1286208859913518, 0x891b24f1, 0xddfeb94a}, - /* 220 */ {4, 0.1285122442369443, 0x8ba0a100, 0xd55cff6e}, - /* 221 */ {4, 0.1284042773229231, 0x8e2ef9d1, 0xcceced50}, - /* 222 */ {4, 0.1282969778809442, 0x90c64410, 0xc4ad2db2}, - /* 223 */ {4, 0.1281903386569819, 0x93669481, 0xbc9c75f9}, - /* 224 */ {4, 0.1280843525090381, 0x96100000, 0xb4b985cf}, - /* 225 */ {4, 0.1279790124049077, 0x98c29b81, 0xad0326c2}, - /* 226 */ {4, 0.1278743114199984, 0x9b7e7c10, 0xa5782bef}, - /* 227 */ {4, 0.1277702427352035, 0x9e43b6d1, 0x9e1771a9}, - /* 228 */ {4, 0.1276667996348261, 0xa1126100, 0x96dfdd2a}, - /* 229 */ {4, 0.1275639755045533, 0xa3ea8ff1, 0x8fd05c41}, - /* 230 */ {4, 0.1274617638294791, 0xa6cc5910, 0x88e7e509}, - /* 231 */ {4, 0.1273601581921741, 0xa9b7d1e1, 0x8225759d}, - /* 232 */ {4, 0.1272591522708010, 0xacad1000, 0x7b8813d3}, - /* 233 */ {4, 0.1271587398372755, 0xafac2921, 0x750eccf9}, - /* 234 */ {4, 0.1270589147554692, 0xb2b53310, 0x6eb8b595}, - /* 235 */ {4, 0.1269596709794558, 0xb5c843b1, 0x6884e923}, - /* 236 */ {4, 0.1268610025517973, 0xb8e57100, 0x627289db}, - /* 237 */ {4, 0.1267629036018709, 0xbc0cd111, 0x5c80c07b}, - /* 238 */ {4, 0.1266653683442337, 0xbf3e7a10, 0x56aebc07}, - /* 239 */ {4, 0.1265683910770258, 0xc27a8241, 0x50fbb19b}, - /* 240 */ {4, 0.1264719661804097, 0xc5c10000, 0x4b66dc33}, - /* 241 */ {4, 0.1263760881150453, 0xc91209c1, 0x45ef7c7c}, - /* 242 */ {4, 0.1262807514205999, 0xcc6db610, 0x4094d8a3}, - /* 243 */ {4, 0.1261859507142915, 0xcfd41b91, 0x3b563c24}, - /* 244 */ {4, 0.1260916806894653, 0xd3455100, 0x3632f7a5}, - /* 245 */ {4, 0.1259979361142023, 0xd6c16d31, 0x312a60c3}, - /* 246 */ {4, 0.1259047118299582, 0xda488710, 0x2c3bd1f0}, - /* 247 */ {4, 0.1258120027502338, 0xdddab5a1, 0x2766aa45}, - /* 248 */ {4, 0.1257198038592741, 0xe1781000, 0x22aa4d5f}, - /* 249 */ {4, 0.1256281102107963, 0xe520ad61, 0x1e06233c}, - /* 250 */ {4, 0.1255369169267456, 0xe8d4a510, 0x19799812}, - /* 251 */ {4, 0.1254462191960791, 0xec940e71, 0x15041c33}, - /* 252 */ {4, 0.1253560122735751, 0xf05f0100, 0x10a523e5}, - /* 253 */ {4, 0.1252662914786691, 0xf4359451, 0xc5c2749}, - /* 254 */ {4, 0.1251770521943144, 0xf817e010, 0x828a237}, - /* 255 */ {4, 0.1250882898658681, 0xfc05fc01, 0x40a1423}, -}; -#endif -#if BITS_PER_MP_LIMB == 64 -const struct bases __mp_bases[256] = -{ - /* 0 */ {0, 0.0, 0, 0}, - /* 1 */ {0, 1e38, 0, 0}, - /* 2 */ {64, 1.0000000000000000, CNST_LIMB(0x1), CNST_LIMB(0x0)}, - /* 3 */ {40, 0.6309297535714574, CNST_LIMB(0xa8b8b452291fe821), CNST_LIMB(0x846d550e37b5063d)}, - /* 4 */ {32, 0.5000000000000000, CNST_LIMB(0x2), CNST_LIMB(0x0)}, - /* 5 */ {27, 0.4306765580733931, CNST_LIMB(0x6765c793fa10079d), CNST_LIMB(0x3ce9a36f23c0fc90)}, - /* 6 */ {24, 0.3868528072345416, CNST_LIMB(0x41c21cb8e1000000), CNST_LIMB(0xf24f62335024a295)}, - /* 7 */ {22, 0.3562071871080222, CNST_LIMB(0x3642798750226111), CNST_LIMB(0x2df495ccaa57147b)}, - /* 8 */ {21, 0.3333333333333334, CNST_LIMB(0x3), CNST_LIMB(0x0)}, - /* 9 */ {20, 0.3154648767857287, CNST_LIMB(0xa8b8b452291fe821), CNST_LIMB(0x846d550e37b5063d)}, - /* 10 */ {19, 0.3010299956639811, CNST_LIMB(0x8ac7230489e80000), CNST_LIMB(0xd83c94fb6d2ac34a)}, - /* 11 */ {18, 0.2890648263178878, CNST_LIMB(0x4d28cb56c33fa539), CNST_LIMB(0xa8adf7ae45e7577b)}, - /* 12 */ {17, 0.2789429456511298, CNST_LIMB(0x1eca170c00000000), CNST_LIMB(0xa10c2bec5da8f8f)}, - /* 13 */ {17, 0.2702381544273197, CNST_LIMB(0x780c7372621bd74d), CNST_LIMB(0x10f4becafe412ec3)}, - /* 14 */ {16, 0.2626495350371936, CNST_LIMB(0x1e39a5057d810000), CNST_LIMB(0xf08480f672b4e86)}, - /* 15 */ {16, 0.2559580248098155, CNST_LIMB(0x5b27ac993df97701), CNST_LIMB(0x6779c7f90dc42f48)}, - /* 16 */ {16, 0.2500000000000000, CNST_LIMB(0x4), CNST_LIMB(0x0)}, - /* 17 */ {15, 0.2446505421182260, CNST_LIMB(0x27b95e997e21d9f1), CNST_LIMB(0x9c71e11bab279323)}, - /* 18 */ {15, 0.2398124665681315, CNST_LIMB(0x5da0e1e53c5c8000), CNST_LIMB(0x5dfaa697ec6f6a1c)}, - /* 19 */ {15, 0.2354089133666382, CNST_LIMB(0xd2ae3299c1c4aedb), CNST_LIMB(0x3711783f6be7e9ec)}, - /* 20 */ {14, 0.2313782131597592, CNST_LIMB(0x16bcc41e90000000), CNST_LIMB(0x6849b86a12b9b01e)}, - /* 21 */ {14, 0.2276702486969530, CNST_LIMB(0x2d04b7fdd9c0ef49), CNST_LIMB(0x6bf097ba5ca5e239)}, - /* 22 */ {14, 0.2242438242175754, CNST_LIMB(0x5658597bcaa24000), CNST_LIMB(0x7b8015c8d7af8f08)}, - /* 23 */ {14, 0.2210647294575037, CNST_LIMB(0xa0e2073737609371), CNST_LIMB(0x975a24b3a3151b38)}, - /* 24 */ {13, 0.2181042919855316, CNST_LIMB(0xc29e98000000000), CNST_LIMB(0x50bd367972689db1)}, - /* 25 */ {13, 0.2153382790366965, CNST_LIMB(0x14adf4b7320334b9), CNST_LIMB(0x8c240c4aecb13bb5)}, - /* 26 */ {13, 0.2127460535533632, CNST_LIMB(0x226ed36478bfa000), CNST_LIMB(0xdbd2e56854e118c9)}, - /* 27 */ {13, 0.2103099178571525, CNST_LIMB(0x383d9170b85ff80b), CNST_LIMB(0x2351ffcaa9c7c4ae)}, - /* 28 */ {13, 0.2080145976765095, CNST_LIMB(0x5a3c23e39c000000), CNST_LIMB(0x6b24188ca33b0636)}, - /* 29 */ {13, 0.2058468324604344, CNST_LIMB(0x8e65137388122bcd), CNST_LIMB(0xcc3dceaf2b8ba99d)}, - /* 30 */ {13, 0.2037950470905062, CNST_LIMB(0xdd41bb36d259e000), CNST_LIMB(0x2832e835c6c7d6b6)}, - /* 31 */ {12, 0.2018490865820999, CNST_LIMB(0xaee5720ee830681), CNST_LIMB(0x76b6aa272e1873c5)}, - /* 32 */ {12, 0.2000000000000000, CNST_LIMB(0x5), CNST_LIMB(0x0)}, - /* 33 */ {12, 0.1982398631705605, CNST_LIMB(0x172588ad4f5f0981), CNST_LIMB(0x61eaf5d402c7bf4f)}, - /* 34 */ {12, 0.1965616322328226, CNST_LIMB(0x211e44f7d02c1000), CNST_LIMB(0xeeb658123ffb27ec)}, - /* 35 */ {12, 0.1949590218937863, CNST_LIMB(0x2ee56725f06e5c71), CNST_LIMB(0x5d5e3762e6fdf509)}, - /* 36 */ {12, 0.1934264036172708, CNST_LIMB(0x41c21cb8e1000000), CNST_LIMB(0xf24f62335024a295)}, - /* 37 */ {12, 0.1919587200065601, CNST_LIMB(0x5b5b57f8a98a5dd1), CNST_LIMB(0x66ae7831762efb6f)}, - /* 38 */ {12, 0.1905514124267734, CNST_LIMB(0x7dcff8986ea31000), CNST_LIMB(0x47388865a00f544)}, - /* 39 */ {12, 0.1892003595168700, CNST_LIMB(0xabd4211662a6b2a1), CNST_LIMB(0x7d673c33a123b54c)}, - /* 40 */ {12, 0.1879018247091076, CNST_LIMB(0xe8d4a51000000000), CNST_LIMB(0x19799812dea11197)}, - /* 41 */ {11, 0.1866524112389434, CNST_LIMB(0x7a32956ad081b79), CNST_LIMB(0xc27e62e0686feae)}, - /* 42 */ {11, 0.1854490234153689, CNST_LIMB(0x9f49aaff0e86800), CNST_LIMB(0x9b6e7507064ce7c7)}, - /* 43 */ {11, 0.1842888331487062, CNST_LIMB(0xce583bb812d37b3), CNST_LIMB(0x3d9ac2bf66cfed94)}, - /* 44 */ {11, 0.1831692509136336, CNST_LIMB(0x109b79a654c00000), CNST_LIMB(0xed46bc50ce59712a)}, - /* 45 */ {11, 0.1820879004699383, CNST_LIMB(0x1543beff214c8b95), CNST_LIMB(0x813d97e2c89b8d46)}, - /* 46 */ {11, 0.1810425967800402, CNST_LIMB(0x1b149a79459a3800), CNST_LIMB(0x2e81751956af8083)}, - /* 47 */ {11, 0.1800313266566926, CNST_LIMB(0x224edfb5434a830f), CNST_LIMB(0xdd8e0a95e30c0988)}, - /* 48 */ {11, 0.1790522317510413, CNST_LIMB(0x2b3fb00000000000), CNST_LIMB(0x7ad4dd48a0b5b167)}, - /* 49 */ {11, 0.1781035935540111, CNST_LIMB(0x3642798750226111), CNST_LIMB(0x2df495ccaa57147b)}, - /* 50 */ {11, 0.1771838201355579, CNST_LIMB(0x43c33c1937564800), CNST_LIMB(0xe392010175ee5962)}, - /* 51 */ {11, 0.1762914343888821, CNST_LIMB(0x54411b2441c3cd8b), CNST_LIMB(0x84eaf11b2fe7738e)}, - /* 52 */ {11, 0.1754250635819545, CNST_LIMB(0x6851455acd400000), CNST_LIMB(0x3a1e3971e008995d)}, - /* 53 */ {11, 0.1745834300480449, CNST_LIMB(0x80a23b117c8feb6d), CNST_LIMB(0xfd7a462344ffce25)}, - /* 54 */ {11, 0.1737653428714400, CNST_LIMB(0x9dff7d32d5dc1800), CNST_LIMB(0x9eca40b40ebcef8a)}, - /* 55 */ {11, 0.1729696904450771, CNST_LIMB(0xc155af6faeffe6a7), CNST_LIMB(0x52fa161a4a48e43d)}, - /* 56 */ {11, 0.1721954337940981, CNST_LIMB(0xebb7392e00000000), CNST_LIMB(0x1607a2cbacf930c1)}, - /* 57 */ {10, 0.1714416005739134, CNST_LIMB(0x50633659656d971), CNST_LIMB(0x97a014f8e3be55f1)}, - /* 58 */ {10, 0.1707072796637201, CNST_LIMB(0x5fa8624c7fba400), CNST_LIMB(0x568df8b76cbf212c)}, - /* 59 */ {10, 0.1699916162869140, CNST_LIMB(0x717d9faa73c5679), CNST_LIMB(0x20ba7c4b4e6ef492)}, - /* 60 */ {10, 0.1692938075987814, CNST_LIMB(0x86430aac6100000), CNST_LIMB(0xe81ee46b9ef492f5)}, - /* 61 */ {10, 0.1686130986895011, CNST_LIMB(0x9e64d9944b57f29), CNST_LIMB(0x9dc0d10d51940416)}, - /* 62 */ {10, 0.1679487789570419, CNST_LIMB(0xba5ca5392cb0400), CNST_LIMB(0x5fa8ed2f450272a5)}, - /* 63 */ {10, 0.1673001788101741, CNST_LIMB(0xdab2ce1d022cd81), CNST_LIMB(0x2ba9eb8c5e04e641)}, - /* 64 */ {10, 0.1666666666666667, CNST_LIMB(0x6), CNST_LIMB(0x0)}, - /* 65 */ {10, 0.1660476462159378, CNST_LIMB(0x12aeed5fd3e2d281), CNST_LIMB(0xb67759cc00287bf1)}, - /* 66 */ {10, 0.1654425539190583, CNST_LIMB(0x15c3da1572d50400), CNST_LIMB(0x78621feeb7f4ed33)}, - /* 67 */ {10, 0.1648508567221604, CNST_LIMB(0x194c05534f75ee29), CNST_LIMB(0x43d55b5f72943bc0)}, - /* 68 */ {10, 0.1642720499620502, CNST_LIMB(0x1d56299ada100000), CNST_LIMB(0x173decb64d1d4409)}, - /* 69 */ {10, 0.1637056554452156, CNST_LIMB(0x21f2a089a4ff4f79), CNST_LIMB(0xe29fb54fd6b6074f)}, - /* 70 */ {10, 0.1631512196835108, CNST_LIMB(0x2733896c68d9a400), CNST_LIMB(0xa1f1f5c210d54e62)}, - /* 71 */ {10, 0.1626083122716341, CNST_LIMB(0x2d2cf2c33b533c71), CNST_LIMB(0x6aac7f9bfafd57b2)}, - /* 72 */ {10, 0.1620765243931223, CNST_LIMB(0x33f506e440000000), CNST_LIMB(0x3b563c2478b72ee2)}, - /* 73 */ {10, 0.1615554674429964, CNST_LIMB(0x3ba43bec1d062211), CNST_LIMB(0x12b536b574e92d1b)}, - /* 74 */ {10, 0.1610447717564444, CNST_LIMB(0x4455872d8fd4e400), CNST_LIMB(0xdf86c03020404fa5)}, - /* 75 */ {10, 0.1605440854340214, CNST_LIMB(0x4e2694539f2f6c59), CNST_LIMB(0xa34adf02234eea8e)}, - /* 76 */ {10, 0.1600530732548213, CNST_LIMB(0x5938006c18900000), CNST_LIMB(0x6f46eb8574eb59dd)}, - /* 77 */ {10, 0.1595714156699382, CNST_LIMB(0x65ad9912474aa649), CNST_LIMB(0x42459b481df47cec)}, - /* 78 */ {10, 0.1590988078692941, CNST_LIMB(0x73ae9ff4241ec400), CNST_LIMB(0x1b424b95d80ca505)}, - /* 79 */ {10, 0.1586349589155960, CNST_LIMB(0x836612ee9c4ce1e1), CNST_LIMB(0xf2c1b982203a0dac)}, - /* 80 */ {10, 0.1581795909397823, CNST_LIMB(0x9502f90000000000), CNST_LIMB(0xb7cdfd9d7bdbab7d)}, - /* 81 */ {10, 0.1577324383928644, CNST_LIMB(0xa8b8b452291fe821), CNST_LIMB(0x846d550e37b5063d)}, - /* 82 */ {10, 0.1572932473495469, CNST_LIMB(0xbebf59a07dab4400), CNST_LIMB(0x57931eeaf85cf64f)}, - /* 83 */ {10, 0.1568617748594410, CNST_LIMB(0xd7540d4093bc3109), CNST_LIMB(0x305a944507c82f47)}, - /* 84 */ {10, 0.1564377883420716, CNST_LIMB(0xf2b96616f1900000), CNST_LIMB(0xe007ccc9c22781a)}, - /* 85 */ {9, 0.1560210650222250, CNST_LIMB(0x336de62af2bca35), CNST_LIMB(0x3e92c42e000eeed4)}, - /* 86 */ {9, 0.1556113914024940, CNST_LIMB(0x39235ec33d49600), CNST_LIMB(0x1ebe59130db2795e)}, - /* 87 */ {9, 0.1552085627701551, CNST_LIMB(0x3f674e539585a17), CNST_LIMB(0x268859e90f51b89)}, - /* 88 */ {9, 0.1548123827357682, CNST_LIMB(0x4645b6958000000), CNST_LIMB(0xd24cde0463108cfa)}, - /* 89 */ {9, 0.1544226628011101, CNST_LIMB(0x4dcb74afbc49c19), CNST_LIMB(0xa536009f37adc383)}, - /* 90 */ {9, 0.1540392219542636, CNST_LIMB(0x56064e1d18d9a00), CNST_LIMB(0x7cea06ce1c9ace10)}, - /* 91 */ {9, 0.1536618862898642, CNST_LIMB(0x5f04fe2cd8a39fb), CNST_LIMB(0x58db032e72e8ba43)}, - /* 92 */ {9, 0.1532904886526781, CNST_LIMB(0x68d74421f5c0000), CNST_LIMB(0x388cc17cae105447)}, - /* 93 */ {9, 0.1529248683028321, CNST_LIMB(0x738df1f6ab4827d), CNST_LIMB(0x1b92672857620ce0)}, - /* 94 */ {9, 0.1525648706011593, CNST_LIMB(0x7f3afbc9cfb5e00), CNST_LIMB(0x18c6a9575c2ade4)}, - /* 95 */ {9, 0.1522103467132434, CNST_LIMB(0x8bf187fba88f35f), CNST_LIMB(0xd44da7da8e44b24f)}, - /* 96 */ {9, 0.1518611533308632, CNST_LIMB(0x99c600000000000), CNST_LIMB(0xaa2f78f1b4cc6794)}, - /* 97 */ {9, 0.1515171524096389, CNST_LIMB(0xa8ce21eb6531361), CNST_LIMB(0x843c067d091ee4cc)}, - /* 98 */ {9, 0.1511782109217764, CNST_LIMB(0xb92112c1a0b6200), CNST_LIMB(0x62005e1e913356e3)}, - /* 99 */ {9, 0.1508442006228941, CNST_LIMB(0xcad7718b8747c43), CNST_LIMB(0x4316eed01dedd518)}, - /* 100 */ {9, 0.1505149978319906, CNST_LIMB(0xde0b6b3a7640000), CNST_LIMB(0x2725dd1d243aba0e)}, - /* 101 */ {9, 0.1501904832236879, CNST_LIMB(0xf2d8cf5fe6d74c5), CNST_LIMB(0xddd9057c24cb54f)}, - /* 102 */ {9, 0.1498705416319474, CNST_LIMB(0x1095d25bfa712600), CNST_LIMB(0xedeee175a736d2a1)}, - /* 103 */ {9, 0.1495550618645152, CNST_LIMB(0x121b7c4c3698faa7), CNST_LIMB(0xc4699f3df8b6b328)}, - /* 104 */ {9, 0.1492439365274121, CNST_LIMB(0x13c09e8d68000000), CNST_LIMB(0x9ebbe7d859cb5a7c)}, - /* 105 */ {9, 0.1489370618588283, CNST_LIMB(0x15876ccb0b709ca9), CNST_LIMB(0x7c828b9887eb2179)}, - /* 106 */ {9, 0.1486343375718350, CNST_LIMB(0x17723c2976da2a00), CNST_LIMB(0x5d652ab99001adcf)}, - /* 107 */ {9, 0.1483356667053617, CNST_LIMB(0x198384e9c259048b), CNST_LIMB(0x4114f1754e5d7b32)}, - /* 108 */ {9, 0.1480409554829326, CNST_LIMB(0x1bbde41dfeec0000), CNST_LIMB(0x274b7c902f7e0188)}, - /* 109 */ {9, 0.1477501131786861, CNST_LIMB(0x1e241d6e3337910d), CNST_LIMB(0xfc9e0fbb32e210c)}, - /* 110 */ {9, 0.1474630519902391, CNST_LIMB(0x20b91cee9901ee00), CNST_LIMB(0xf4afa3e594f8ea1f)}, - /* 111 */ {9, 0.1471796869179852, CNST_LIMB(0x237ff9079863dfef), CNST_LIMB(0xcd85c32e9e4437b0)}, - /* 112 */ {9, 0.1468999356504447, CNST_LIMB(0x267bf47000000000), CNST_LIMB(0xa9bbb147e0dd92a8)}, - /* 113 */ {9, 0.1466237184553111, CNST_LIMB(0x29b08039fbeda7f1), CNST_LIMB(0x8900447b70e8eb82)}, - /* 114 */ {9, 0.1463509580758620, CNST_LIMB(0x2d213df34f65f200), CNST_LIMB(0x6b0a92adaad5848a)}, - /* 115 */ {9, 0.1460815796324244, CNST_LIMB(0x30d201d957a7c2d3), CNST_LIMB(0x4f990ad8740f0ee5)}, - /* 116 */ {9, 0.1458155105286054, CNST_LIMB(0x34c6d52160f40000), CNST_LIMB(0x3670a9663a8d3610)}, - /* 117 */ {9, 0.1455526803620167, CNST_LIMB(0x3903f855d8f4c755), CNST_LIMB(0x1f5c44188057be3c)}, - /* 118 */ {9, 0.1452930208392428, CNST_LIMB(0x3d8de5c8ec59b600), CNST_LIMB(0xa2bea956c4e4977)}, - /* 119 */ {9, 0.1450364656948130, CNST_LIMB(0x4269541d1ff01337), CNST_LIMB(0xed68b23033c3637e)}, - /* 120 */ {9, 0.1447829506139581, CNST_LIMB(0x479b38e478000000), CNST_LIMB(0xc99cf624e50549c5)}, - /* 121 */ {9, 0.1445324131589439, CNST_LIMB(0x4d28cb56c33fa539), CNST_LIMB(0xa8adf7ae45e7577b)}, - /* 122 */ {9, 0.1442847926987864, CNST_LIMB(0x5317871fa13aba00), CNST_LIMB(0x8a5bc740b1c113e5)}, - /* 123 */ {9, 0.1440400303421672, CNST_LIMB(0x596d2f44de9fa71b), CNST_LIMB(0x6e6c7efb81cfbb9b)}, - /* 124 */ {9, 0.1437980688733775, CNST_LIMB(0x602fd125c47c0000), CNST_LIMB(0x54aba5c5cada5f10)}, - /* 125 */ {9, 0.1435588526911310, CNST_LIMB(0x6765c793fa10079d), CNST_LIMB(0x3ce9a36f23c0fc90)}, - /* 126 */ {9, 0.1433223277500932, CNST_LIMB(0x6f15be069b847e00), CNST_LIMB(0x26fb43de2c8cd2a8)}, - /* 127 */ {9, 0.1430884415049874, CNST_LIMB(0x7746b3e82a77047f), CNST_LIMB(0x12b94793db8486a1)}, - /* 128 */ {9, 0.1428571428571428, CNST_LIMB(0x7), CNST_LIMB(0x0)}, - /* 129 */ {9, 0.1426283821033600, CNST_LIMB(0x894953f7ea890481), CNST_LIMB(0xdd5deca404c0156d)}, - /* 130 */ {9, 0.1424021108869747, CNST_LIMB(0x932abffea4848200), CNST_LIMB(0xbd51373330291de0)}, - /* 131 */ {9, 0.1421782821510107, CNST_LIMB(0x9dacb687d3d6a163), CNST_LIMB(0x9fa4025d66f23085)}, - /* 132 */ {9, 0.1419568500933153, CNST_LIMB(0xa8d8102a44840000), CNST_LIMB(0x842530ee2db4949d)}, - /* 133 */ {9, 0.1417377701235801, CNST_LIMB(0xb4b60f9d140541e5), CNST_LIMB(0x6aa7f2766b03dc25)}, - /* 134 */ {9, 0.1415209988221527, CNST_LIMB(0xc15065d4856e4600), CNST_LIMB(0x53035ba7ebf32e8d)}, - /* 135 */ {9, 0.1413064939005528, CNST_LIMB(0xceb1363f396d23c7), CNST_LIMB(0x3d12091fc9fb4914)}, - /* 136 */ {9, 0.1410942141636095, CNST_LIMB(0xdce31b2488000000), CNST_LIMB(0x28b1cb81b1ef1849)}, - /* 137 */ {9, 0.1408841194731412, CNST_LIMB(0xebf12a24bca135c9), CNST_LIMB(0x15c35be67ae3e2c9)}, - /* 138 */ {9, 0.1406761707131039, CNST_LIMB(0xfbe6f8dbf88f4a00), CNST_LIMB(0x42a17bd09be1ff0)}, - /* 139 */ {8, 0.1404703297561400, CNST_LIMB(0x1ef156c084ce761), CNST_LIMB(0x8bf461f03cf0bbf)}, - /* 140 */ {8, 0.1402665594314587, CNST_LIMB(0x20c4e3b94a10000), CNST_LIMB(0xf3fbb43f68a32d05)}, - /* 141 */ {8, 0.1400648234939879, CNST_LIMB(0x22b0695a08ba421), CNST_LIMB(0xd84f44c48564dc19)}, - /* 142 */ {8, 0.1398650865947379, CNST_LIMB(0x24b4f35d7a4c100), CNST_LIMB(0xbe58ebcce7956abe)}, - /* 143 */ {8, 0.1396673142523192, CNST_LIMB(0x26d397284975781), CNST_LIMB(0xa5fac463c7c134b7)}, - /* 144 */ {8, 0.1394714728255649, CNST_LIMB(0x290d74100000000), CNST_LIMB(0x8f19241e28c7d757)}, - /* 145 */ {8, 0.1392775294872041, CNST_LIMB(0x2b63b3a37866081), CNST_LIMB(0x799a6d046c0ae1ae)}, - /* 146 */ {8, 0.1390854521985406, CNST_LIMB(0x2dd789f4d894100), CNST_LIMB(0x6566e37d746a9e40)}, - /* 147 */ {8, 0.1388952096850913, CNST_LIMB(0x306a35e51b58721), CNST_LIMB(0x526887dbfb5f788f)}, - /* 148 */ {8, 0.1387067714131417, CNST_LIMB(0x331d01712e10000), CNST_LIMB(0x408af3382b8efd3d)}, - /* 149 */ {8, 0.1385201075671774, CNST_LIMB(0x35f14200a827c61), CNST_LIMB(0x2fbb374806ec05f1)}, - /* 150 */ {8, 0.1383351890281539, CNST_LIMB(0x38e858b62216100), CNST_LIMB(0x1fe7c0f0afce87fe)}, - /* 151 */ {8, 0.1381519873525671, CNST_LIMB(0x3c03b2c13176a41), CNST_LIMB(0x11003d517540d32e)}, - /* 152 */ {8, 0.1379704747522905, CNST_LIMB(0x3f44c9b21000000), CNST_LIMB(0x2f5810f98eff0dc)}, - /* 153 */ {8, 0.1377906240751463, CNST_LIMB(0x42ad23cef3113c1), CNST_LIMB(0xeb72e35e7840d910)}, - /* 154 */ {8, 0.1376124087861776, CNST_LIMB(0x463e546b19a2100), CNST_LIMB(0xd27de19593dc3614)}, - /* 155 */ {8, 0.1374358029495937, CNST_LIMB(0x49f9fc3f96684e1), CNST_LIMB(0xbaf391fd3e5e6fc2)}, - /* 156 */ {8, 0.1372607812113589, CNST_LIMB(0x4de1c9c5dc10000), CNST_LIMB(0xa4bd38c55228c81d)}, - /* 157 */ {8, 0.1370873187823978, CNST_LIMB(0x51f77994116d2a1), CNST_LIMB(0x8fc5a8de8e1de782)}, - /* 158 */ {8, 0.1369153914223921, CNST_LIMB(0x563cd6bb3398100), CNST_LIMB(0x7bf9265bea9d3a3b)}, - /* 159 */ {8, 0.1367449754241439, CNST_LIMB(0x5ab3bb270beeb01), CNST_LIMB(0x69454b325983dccd)}, - /* 160 */ {8, 0.1365760475984821, CNST_LIMB(0x5f5e10000000000), CNST_LIMB(0x5798ee2308c39df9)}, - /* 161 */ {8, 0.1364085852596902, CNST_LIMB(0x643dce0ec16f501), CNST_LIMB(0x46e40ba0fa66a753)}, - /* 162 */ {8, 0.1362425662114337, CNST_LIMB(0x6954fe21e3e8100), CNST_LIMB(0x3717b0870b0db3a7)}, - /* 163 */ {8, 0.1360779687331669, CNST_LIMB(0x6ea5b9755f440a1), CNST_LIMB(0x2825e6775d11cdeb)}, - /* 164 */ {8, 0.1359147715670014, CNST_LIMB(0x74322a1c0410000), CNST_LIMB(0x1a01a1c09d1b4dac)}, - /* 165 */ {8, 0.1357529539050150, CNST_LIMB(0x79fc8b6ae8a46e1), CNST_LIMB(0xc9eb0a8bebc8f3e)}, - /* 166 */ {8, 0.1355924953769863, CNST_LIMB(0x80072a66d512100), CNST_LIMB(0xffe357ff59e6a004)}, - /* 167 */ {8, 0.1354333760385373, CNST_LIMB(0x86546633b42b9c1), CNST_LIMB(0xe7dfd1be05fa61a8)}, - /* 168 */ {8, 0.1352755763596663, CNST_LIMB(0x8ce6b0861000000), CNST_LIMB(0xd11ed6fc78f760e5)}, - /* 169 */ {8, 0.1351190772136599, CNST_LIMB(0x93c08e16a022441), CNST_LIMB(0xbb8db609dd29ebfe)}, - /* 170 */ {8, 0.1349638598663645, CNST_LIMB(0x9ae49717f026100), CNST_LIMB(0xa71aec8d1813d532)}, - /* 171 */ {8, 0.1348099059658079, CNST_LIMB(0xa25577ae24c1a61), CNST_LIMB(0x93b612a9f20fbc02)}, - /* 172 */ {8, 0.1346571975321549, CNST_LIMB(0xaa15f068e610000), CNST_LIMB(0x814fc7b19a67d317)}, - /* 173 */ {8, 0.1345057169479844, CNST_LIMB(0xb228d6bf7577921), CNST_LIMB(0x6fd9a03f2e0a4b7c)}, - /* 174 */ {8, 0.1343554469488779, CNST_LIMB(0xba91158ef5c4100), CNST_LIMB(0x5f4615a38d0d316e)}, - /* 175 */ {8, 0.1342063706143054, CNST_LIMB(0xc351ad9aec0b681), CNST_LIMB(0x4f8876863479a286)}, - /* 176 */ {8, 0.1340584713587980, CNST_LIMB(0xcc6db6100000000), CNST_LIMB(0x4094d8a3041b60eb)}, - /* 177 */ {8, 0.1339117329233981, CNST_LIMB(0xd5e85d09025c181), CNST_LIMB(0x32600b8ed883a09b)}, - /* 178 */ {8, 0.1337661393673756, CNST_LIMB(0xdfc4e816401c100), CNST_LIMB(0x24df8c6eb4b6d1f1)}, - /* 179 */ {8, 0.1336216750601996, CNST_LIMB(0xea06b4c72947221), CNST_LIMB(0x18097a8ee151acef)}, - /* 180 */ {8, 0.1334783246737591, CNST_LIMB(0xf4b139365210000), CNST_LIMB(0xbd48cc8ec1cd8e3)}, - /* 181 */ {8, 0.1333360731748201, CNST_LIMB(0xffc80497d520961), CNST_LIMB(0x3807a8d67485fb)}, - /* 182 */ {8, 0.1331949058177136, CNST_LIMB(0x10b4ebfca1dee100), CNST_LIMB(0xea5768860b62e8d8)}, - /* 183 */ {8, 0.1330548081372441, CNST_LIMB(0x117492de921fc141), CNST_LIMB(0xd54faf5b635c5005)}, - /* 184 */ {8, 0.1329157659418126, CNST_LIMB(0x123bb2ce41000000), CNST_LIMB(0xc14a56233a377926)}, - /* 185 */ {8, 0.1327777653067443, CNST_LIMB(0x130a8b6157bdecc1), CNST_LIMB(0xae39a88db7cd329f)}, - /* 186 */ {8, 0.1326407925678156, CNST_LIMB(0x13e15dede0e8a100), CNST_LIMB(0x9c10bde69efa7ab6)}, - /* 187 */ {8, 0.1325048343149731, CNST_LIMB(0x14c06d941c0ca7e1), CNST_LIMB(0x8ac36c42a2836497)}, - /* 188 */ {8, 0.1323698773862368, CNST_LIMB(0x15a7ff487a810000), CNST_LIMB(0x7a463c8b84f5ef67)}, - /* 189 */ {8, 0.1322359088617821, CNST_LIMB(0x169859ddc5c697a1), CNST_LIMB(0x6a8e5f5ad090fd4b)}, - /* 190 */ {8, 0.1321029160581950, CNST_LIMB(0x1791c60f6fed0100), CNST_LIMB(0x5b91a2943596fc56)}, - /* 191 */ {8, 0.1319708865228925, CNST_LIMB(0x18948e8c0e6fba01), CNST_LIMB(0x4d4667b1c468e8f0)}, - /* 192 */ {8, 0.1318398080287045, CNST_LIMB(0x19a1000000000000), CNST_LIMB(0x3fa39ab547994daf)}, - /* 193 */ {8, 0.1317096685686114, CNST_LIMB(0x1ab769203dafc601), CNST_LIMB(0x32a0a9b2faee1e2a)}, - /* 194 */ {8, 0.1315804563506306, CNST_LIMB(0x1bd81ab557f30100), CNST_LIMB(0x26357ceac0e96962)}, - /* 195 */ {8, 0.1314521597928493, CNST_LIMB(0x1d0367a69fed1ba1), CNST_LIMB(0x1a5a6f65caa5859e)}, - /* 196 */ {8, 0.1313247675185968, CNST_LIMB(0x1e39a5057d810000), CNST_LIMB(0xf08480f672b4e86)}, - /* 197 */ {8, 0.1311982683517524, CNST_LIMB(0x1f7b2a18f29ac3e1), CNST_LIMB(0x4383340615612ca)}, - /* 198 */ {8, 0.1310726513121843, CNST_LIMB(0x20c850694c2aa100), CNST_LIMB(0xf3c77969ee4be5a2)}, - /* 199 */ {8, 0.1309479056113158, CNST_LIMB(0x222173cc014980c1), CNST_LIMB(0xe00993cc187c5ec9)}, - /* 200 */ {8, 0.1308240206478128, CNST_LIMB(0x2386f26fc1000000), CNST_LIMB(0xcd2b297d889bc2b6)}, - /* 201 */ {8, 0.1307009860033912, CNST_LIMB(0x24f92ce8af296d41), CNST_LIMB(0xbb214d5064862b22)}, - /* 202 */ {8, 0.1305787914387386, CNST_LIMB(0x2678863cd0ece100), CNST_LIMB(0xa9e1a7ca7ea10e20)}, - /* 203 */ {8, 0.1304574268895465, CNST_LIMB(0x280563f0a9472d61), CNST_LIMB(0x99626e72b39ea0cf)}, - /* 204 */ {8, 0.1303368824626505, CNST_LIMB(0x29a02e1406210000), CNST_LIMB(0x899a5ba9c13fafd9)}, - /* 205 */ {8, 0.1302171484322746, CNST_LIMB(0x2b494f4efe6d2e21), CNST_LIMB(0x7a80a705391e96ff)}, - /* 206 */ {8, 0.1300982152363760, CNST_LIMB(0x2d0134ef21cbc100), CNST_LIMB(0x6c0cfe23de23042a)}, - /* 207 */ {8, 0.1299800734730872, CNST_LIMB(0x2ec84ef4da2ef581), CNST_LIMB(0x5e377df359c944dd)}, - /* 208 */ {8, 0.1298627138972530, CNST_LIMB(0x309f102100000000), CNST_LIMB(0x50f8ac5fc8f53985)}, - /* 209 */ {8, 0.1297461274170591, CNST_LIMB(0x3285ee02a1420281), CNST_LIMB(0x44497266278e35b7)}, - /* 210 */ {8, 0.1296303050907487, CNST_LIMB(0x347d6104fc324100), CNST_LIMB(0x382316831f7ee175)}, - /* 211 */ {8, 0.1295152381234257, CNST_LIMB(0x3685e47dade53d21), CNST_LIMB(0x2c7f377833b8946e)}, - /* 212 */ {8, 0.1294009178639407, CNST_LIMB(0x389ff6bb15610000), CNST_LIMB(0x2157c761ab4163ef)}, - /* 213 */ {8, 0.1292873358018581, CNST_LIMB(0x3acc1912ebb57661), CNST_LIMB(0x16a7071803cc49a9)}, - /* 214 */ {8, 0.1291744835645007, CNST_LIMB(0x3d0acff111946100), CNST_LIMB(0xc6781d80f8224fc)}, - /* 215 */ {8, 0.1290623529140715, CNST_LIMB(0x3f5ca2e692eaf841), CNST_LIMB(0x294092d370a900b)}, - /* 216 */ {8, 0.1289509357448472, CNST_LIMB(0x41c21cb8e1000000), CNST_LIMB(0xf24f62335024a295)}, - /* 217 */ {8, 0.1288402240804449, CNST_LIMB(0x443bcb714399a5c1), CNST_LIMB(0xe03b98f103fad6d2)}, - /* 218 */ {8, 0.1287302100711567, CNST_LIMB(0x46ca406c81af2100), CNST_LIMB(0xcee3d32cad2a9049)}, - /* 219 */ {8, 0.1286208859913518, CNST_LIMB(0x496e106ac22aaae1), CNST_LIMB(0xbe3f9df9277fdada)}, - /* 220 */ {8, 0.1285122442369443, CNST_LIMB(0x4c27d39fa5410000), CNST_LIMB(0xae46f0d94c05e933)}, - /* 221 */ {8, 0.1284042773229231, CNST_LIMB(0x4ef825c296e43ca1), CNST_LIMB(0x9ef2280fb437a33d)}, - /* 222 */ {8, 0.1282969778809442, CNST_LIMB(0x51dfa61f5ad88100), CNST_LIMB(0x9039ff426d3f284b)}, - /* 223 */ {8, 0.1281903386569819, CNST_LIMB(0x54def7a6d2f16901), CNST_LIMB(0x82178c6d6b51f8f4)}, - /* 224 */ {8, 0.1280843525090381, CNST_LIMB(0x57f6c10000000000), CNST_LIMB(0x74843b1ee4c1e053)}, - /* 225 */ {8, 0.1279790124049077, CNST_LIMB(0x5b27ac993df97701), CNST_LIMB(0x6779c7f90dc42f48)}, - /* 226 */ {8, 0.1278743114199984, CNST_LIMB(0x5e7268b9bbdf8100), CNST_LIMB(0x5af23c74f9ad9fe9)}, - /* 227 */ {8, 0.1277702427352035, CNST_LIMB(0x61d7a7932ff3d6a1), CNST_LIMB(0x4ee7eae2acdc617e)}, - /* 228 */ {8, 0.1276667996348261, CNST_LIMB(0x65581f53c8c10000), CNST_LIMB(0x43556aa2ac262a0b)}, - /* 229 */ {8, 0.1275639755045533, CNST_LIMB(0x68f48a385b8320e1), CNST_LIMB(0x3835949593b8ddd1)}, - /* 230 */ {8, 0.1274617638294791, CNST_LIMB(0x6cada69ed07c2100), CNST_LIMB(0x2d837fbe78458762)}, - /* 231 */ {8, 0.1273601581921741, CNST_LIMB(0x70843718cdbf27c1), CNST_LIMB(0x233a7e150a54a555)}, - /* 232 */ {8, 0.1272591522708010, CNST_LIMB(0x7479027ea1000000), CNST_LIMB(0x19561984a50ff8fe)}, - /* 233 */ {8, 0.1271587398372755, CNST_LIMB(0x788cd40268f39641), CNST_LIMB(0xfd211159fe3490f)}, - /* 234 */ {8, 0.1270589147554692, CNST_LIMB(0x7cc07b437ecf6100), CNST_LIMB(0x6aa563e655033e3)}, - /* 235 */ {8, 0.1269596709794558, CNST_LIMB(0x8114cc6220762061), CNST_LIMB(0xfbb614b3f2d3b14c)}, - /* 236 */ {8, 0.1268610025517973, CNST_LIMB(0x858aa0135be10000), CNST_LIMB(0xeac0f8837fb05773)}, - /* 237 */ {8, 0.1267629036018709, CNST_LIMB(0x8a22d3b53c54c321), CNST_LIMB(0xda6e4c10e8615ca5)}, - /* 238 */ {8, 0.1266653683442337, CNST_LIMB(0x8ede496339f34100), CNST_LIMB(0xcab755a8d01fa67f)}, - /* 239 */ {8, 0.1265683910770258, CNST_LIMB(0x93bde80aec3a1481), CNST_LIMB(0xbb95a9ae71aa3e0c)}, - /* 240 */ {8, 0.1264719661804097, CNST_LIMB(0x98c29b8100000000), CNST_LIMB(0xad0326c296b4f529)}, - /* 241 */ {8, 0.1263760881150453, CNST_LIMB(0x9ded549671832381), CNST_LIMB(0x9ef9f21eed31b7c1)}, - /* 242 */ {8, 0.1262807514205999, CNST_LIMB(0xa33f092e0b1ac100), CNST_LIMB(0x91747422be14b0b2)}, - /* 243 */ {8, 0.1261859507142915, CNST_LIMB(0xa8b8b452291fe821), CNST_LIMB(0x846d550e37b5063d)}, - /* 244 */ {8, 0.1260916806894653, CNST_LIMB(0xae5b564ac3a10000), CNST_LIMB(0x77df79e9a96c06f6)}, - /* 245 */ {8, 0.1259979361142023, CNST_LIMB(0xb427f4b3be74c361), CNST_LIMB(0x6bc6019636c7d0c2)}, - /* 246 */ {8, 0.1259047118299582, CNST_LIMB(0xba1f9a938041e100), CNST_LIMB(0x601c4205aebd9e47)}, - /* 247 */ {8, 0.1258120027502338, CNST_LIMB(0xc0435871d1110f41), CNST_LIMB(0x54ddc59756f05016)}, - /* 248 */ {8, 0.1257198038592741, CNST_LIMB(0xc694446f01000000), CNST_LIMB(0x4a0648979c838c18)}, - /* 249 */ {8, 0.1256281102107963, CNST_LIMB(0xcd137a5b57ac3ec1), CNST_LIMB(0x3f91b6e0bb3a053d)}, - /* 250 */ {8, 0.1255369169267456, CNST_LIMB(0xd3c21bcecceda100), CNST_LIMB(0x357c299a88ea76a5)}, - /* 251 */ {8, 0.1254462191960791, CNST_LIMB(0xdaa150410b788de1), CNST_LIMB(0x2bc1e517aecc56e3)}, - /* 252 */ {8, 0.1253560122735751, CNST_LIMB(0xe1b24521be010000), CNST_LIMB(0x225f56ceb3da9f5d)}, - /* 253 */ {8, 0.1252662914786691, CNST_LIMB(0xe8f62df12777c1a1), CNST_LIMB(0x1951136d53ad63ac)}, - /* 254 */ {8, 0.1251770521943144, CNST_LIMB(0xf06e445906fc0100), CNST_LIMB(0x1093d504b3cd7d93)}, - /* 255 */ {8, 0.1250882898658681, CNST_LIMB(0xf81bc845c81bf801), CNST_LIMB(0x824794d1ec1814f)}, -}; -#endif diff --git a/rts/gmp/mpn/ns32k/add_n.s b/rts/gmp/mpn/ns32k/add_n.s deleted file mode 100644 index bd063d0..0000000 --- a/rts/gmp/mpn/ns32k/add_n.s +++ /dev/null @@ -1,46 +0,0 @@ -# ns32000 __gmpn_add_n -- Add two limb vectors of the same length > 0 and store -# sum in a third limb vector. - -# Copyright (C) 1992, 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. - - - .align 1 -.globl ___gmpn_add_n -___gmpn_add_n: - save [r3,r4,r5] - negd 28(sp),r3 - movd r3,r0 - lshd 2,r0 - movd 24(sp),r4 - subd r0,r4 # r4 -> to end of S2 - movd 20(sp),r5 - subd r0,r5 # r5 -> to end of S1 - movd 16(sp),r2 - subd r0,r2 # r2 -> to end of RES - subd r0,r0 # cy = 0 - -Loop: movd r5[r3:d],r0 - addcd r4[r3:d],r0 - movd r0,r2[r3:d] - acbd 1,r3,Loop - - scsd r0 # r0 = cy. - restore [r5,r4,r3] - ret 0 diff --git a/rts/gmp/mpn/ns32k/addmul_1.s b/rts/gmp/mpn/ns32k/addmul_1.s deleted file mode 100644 index df0dcdd..0000000 --- a/rts/gmp/mpn/ns32k/addmul_1.s +++ /dev/null @@ -1,48 +0,0 @@ -# ns32000 __gmpn_addmul_1 -- Multiply a limb vector with a limb and add -# the result to a second limb vector. - -# Copyright (C) 1992, 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. - - - .align 1 -.globl ___gmpn_addmul_1 -___gmpn_addmul_1: - save [r3,r4,r5,r6,r7] - negd 24(sp),r4 - movd r4,r0 - lshd 2,r0 - movd 20(sp),r5 - subd r0,r5 # r5 -> to end of S1 - movd 16(sp),r6 - subd r0,r6 # r6 -> to end of RES - subd r0,r0 # r0 = 0, cy = 0 - movd 28(sp),r7 # r7 = s2_limb - -Loop: movd r5[r4:d],r2 - meid r7,r2 # r2 = low_prod, r3 = high_prod - addcd r0,r2 # r2 = low_prod + cy_limb - movd r3,r0 # r0 = new cy_limb - addcd 0,r0 - addd r2,r6[r4:d] - acbd 1,r4,Loop - - addcd 0,r0 - restore [r7,r6,r5,r4,r3] - ret 0 diff --git a/rts/gmp/mpn/ns32k/mul_1.s b/rts/gmp/mpn/ns32k/mul_1.s deleted file mode 100644 index 0a77efb..0000000 --- a/rts/gmp/mpn/ns32k/mul_1.s +++ /dev/null @@ -1,47 +0,0 @@ -# ns32000 __gmpn_mul_1 -- Multiply a limb vector with a limb and store -# the result in a second limb vector. - -# Copyright (C) 1992, 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. - - - .align 1 -.globl ___gmpn_mul_1 -___gmpn_mul_1: - save [r3,r4,r5,r6,r7] - negd 24(sp),r4 - movd r4,r0 - lshd 2,r0 - movd 20(sp),r5 - subd r0,r5 # r5 -> to end of S1 - movd 16(sp),r6 - subd r0,r6 # r6 -> to end of RES - subd r0,r0 # r0 = 0, cy = 0 - movd 28(sp),r7 # r7 = s2_limb - -Loop: movd r5[r4:d],r2 - meid r7,r2 # r2 = low_prod, r3 = high_prod - addcd r0,r2 # r2 = low_prod + cy_limb - movd r3,r0 # r0 = new cy_limb - movd r2,r6[r4:d] - acbd 1,r4,Loop - - addcd 0,r0 - restore [r7,r6,r5,r4,r3] - ret 0 diff --git a/rts/gmp/mpn/ns32k/sub_n.s b/rts/gmp/mpn/ns32k/sub_n.s deleted file mode 100644 index cd89f4f..0000000 --- a/rts/gmp/mpn/ns32k/sub_n.s +++ /dev/null @@ -1,46 +0,0 @@ -# ns32000 __gmpn_sub_n -- Subtract two limb vectors of the same length > 0 and -# store difference in a third limb vector. - -# Copyright (C) 1992, 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. - - - .align 1 -.globl ___gmpn_sub_n -___gmpn_sub_n: - save [r3,r4,r5] - negd 28(sp),r3 - movd r3,r0 - lshd 2,r0 - movd 24(sp),r4 - subd r0,r4 # r4 -> to end of S2 - movd 20(sp),r5 - subd r0,r5 # r5 -> to end of S1 - movd 16(sp),r2 - subd r0,r2 # r2 -> to end of RES - subd r0,r0 # cy = 0 - -Loop: movd r5[r3:d],r0 - subcd r4[r3:d],r0 - movd r0,r2[r3:d] - acbd 1,r3,Loop - - scsd r0 # r0 = cy. - restore [r5,r4,r3] - ret 0 diff --git a/rts/gmp/mpn/ns32k/submul_1.s b/rts/gmp/mpn/ns32k/submul_1.s deleted file mode 100644 index f811aed..0000000 --- a/rts/gmp/mpn/ns32k/submul_1.s +++ /dev/null @@ -1,48 +0,0 @@ -# ns32000 __gmpn_submul_1 -- Multiply a limb vector with a limb and subtract -# the result from a second limb vector. - -# Copyright (C) 1992, 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. - - - .align 1 -.globl ___gmpn_submul_1 -___gmpn_submul_1: - save [r3,r4,r5,r6,r7] - negd 24(sp),r4 - movd r4,r0 - lshd 2,r0 - movd 20(sp),r5 - subd r0,r5 # r5 -> to end of S1 - movd 16(sp),r6 - subd r0,r6 # r6 -> to end of RES - subd r0,r0 # r0 = 0, cy = 0 - movd 28(sp),r7 # r7 = s2_limb - -Loop: movd r5[r4:d],r2 - meid r7,r2 # r2 = low_prod, r3 = high_prod - addcd r0,r2 # r2 = low_prod + cy_limb - movd r3,r0 # r0 = new cy_limb - addcd 0,r0 - subd r2,r6[r4:d] - acbd 1,r4,Loop - - addcd 0,r0 - restore [r7,r6,r5,r4,r3] - ret 0 diff --git a/rts/gmp/mpn/pa64/README b/rts/gmp/mpn/pa64/README deleted file mode 100644 index 8d2976d..0000000 --- a/rts/gmp/mpn/pa64/README +++ /dev/null @@ -1,38 +0,0 @@ -This directory contains mpn functions for 64-bit PA-RISC 2.0. - -RELEVANT OPTIMIZATION ISSUES - -The PA8000 has a multi-issue pipeline with large buffers for instructions -awaiting pending results. Therefore, no latency scheduling is necessary -(and might actually be harmful). - -Two 64-bit loads can be completed per cycle. One 64-bit store can be -completed per cycle. A store cannot complete in the same cycle as a load. - -STATUS - -* mpn_lshift, mpn_rshift, mpn_add_n, mpn_sub_n are all well-tuned and run at - the peak cache bandwidth; 1.5 cycles/limb for shifting and 2.0 cycles/limb - for add/subtract. - -* The multiplication functions run at 11 cycles/limb. The cache bandwidth - allows 7.5 cycles/limb. Perhaps it would be possible, using unrolling or - better scheduling, to get closer to the cache bandwidth limit. - -* xaddmul_1.S contains a quicker method for forming the 128 bit product. It - uses some fewer operations, and keep the carry flag live across the loop - boundary. But it seems hard to make it run more than 1/4 cycle faster - than the old code. Perhaps we really ought to unroll this loop be 2x? - 2x should suffice since register latency schedling is never needed, - but the unrolling would hide the store-load latency. Here is a sketch: - - 1. A multiply and store 64-bit products - 2. B sum 64-bit products 128-bit product - 3. B load 64-bit products to integer registers - 4. B multiply and store 64-bit products - 5. A sum 64-bit products 128-bit product - 6. A load 64-bit products to integer registers - 7. goto 1 - - In practice, adjacent groups (1 and 2, 2 and 3, etc) will be interleaved - for better instruction mix. diff --git a/rts/gmp/mpn/pa64/add_n.s b/rts/gmp/mpn/pa64/add_n.s deleted file mode 100644 index 22ff19c..0000000 --- a/rts/gmp/mpn/pa64/add_n.s +++ /dev/null @@ -1,90 +0,0 @@ -; HP-PA 2.0 __gmpn_add_n -- Add two limb vectors of the same length > 0 and -; store sum in a third limb vector. - -; 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. - - -; INPUT PARAMETERS -; res_ptr gr26 -; s1_ptr gr25 -; s2_ptr gr24 -; size gr23 - -; This runs at 2 cycles/limb on PA8000. - - .level 2.0n - .code - .export __gmpn_add_n,entry -__gmpn_add_n - .proc - .callinfo frame=0,args_saved - .entry - - sub %r0,%r23,%r22 - depw,z %r22,30,3,%r28 ; r28 = 2 * (-n & 7) - depw,z %r22,28,3,%r22 ; r22 = 8 * (-n & 7) - sub %r25,%r22,%r25 ; offset s1_ptr - sub %r24,%r22,%r24 ; offset s2_ptr - sub %r26,%r22,%r26 ; offset res_ptr - blr %r28,%r0 ; branch into loop - add %r0,%r0,%r0 ; reset carry - -L$loop ldd 0(%r25),%r20 - ldd 0(%r24),%r31 - add,dc %r20,%r31,%r20 - std %r20,0(%r26) -L$7 ldd 8(%r25),%r21 - ldd 8(%r24),%r19 - add,dc %r21,%r19,%r21 - std %r21,8(%r26) -L$6 ldd 16(%r25),%r20 - ldd 16(%r24),%r31 - add,dc %r20,%r31,%r20 - std %r20,16(%r26) -L$5 ldd 24(%r25),%r21 - ldd 24(%r24),%r19 - add,dc %r21,%r19,%r21 - std %r21,24(%r26) -L$4 ldd 32(%r25),%r20 - ldd 32(%r24),%r31 - add,dc %r20,%r31,%r20 - std %r20,32(%r26) -L$3 ldd 40(%r25),%r21 - ldd 40(%r24),%r19 - add,dc %r21,%r19,%r21 - std %r21,40(%r26) -L$2 ldd 48(%r25),%r20 - ldd 48(%r24),%r31 - add,dc %r20,%r31,%r20 - std %r20,48(%r26) -L$1 ldd 56(%r25),%r21 - ldo 64(%r25),%r25 - ldd 56(%r24),%r19 - add,dc %r21,%r19,%r21 - std %r21,56(%r26) - ldo 64(%r24),%r24 - addib,> -8,%r23,L$loop - ldo 64(%r26),%r26 - - add,dc %r0,%r0,%r29 - bve (%r2) - .exit - ldi 0,%r28 - .procend diff --git a/rts/gmp/mpn/pa64/addmul_1.S b/rts/gmp/mpn/pa64/addmul_1.S deleted file mode 100644 index b1885b4..0000000 --- a/rts/gmp/mpn/pa64/addmul_1.S +++ /dev/null @@ -1,167 +0,0 @@ -; HP-PA 2.0 64-bit __gmpn_addmul_1 -- Multiply a limb vector with a limb and -; add the result to a second limb vector. - -; 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. - -; INPUT PARAMETERS -#define rptr %r26 -#define sptr %r25 -#define size %r24 -#define s2limb -56(%r30) - -; This runs at 11 cycles/limb on a PA8000. It might be possible to make -; it faster, but the PA8000 pipeline is not publically documented and it -; is very complex to reverse engineer - -#define t1 %r19 -#define rlimb %r20 -#define hi %r21 -#define lo %r22 -#define m0 %r28 -#define m1 %r3 -#define cylimb %r29 -#define t3 %r4 -#define t2 %r6 -#define t5 %r23 -#define t4 %r31 - .level 2.0n - .code - .export __gmpn_addmul_1,entry -__gmpn_addmul_1 - .proc - .callinfo frame=128,no_calls - .entry - fldd -56(%r30),%fr5 ; s2limb passed on stack - ldo 128(%r30),%r30 - add %r0,%r0,cylimb ; clear cy and cylimb - - std %r3,-96(%r30) - std %r4,-88(%r30) - std %r5,-80(%r30) - std %r6,-72(%r30) - depdi,z 1,31,1,%r5 - - fldd 0(sptr),%fr4 - ldo 8(sptr),sptr - - xmpyu %fr5R,%fr4R,%fr6 - fstd %fr6,-128(%r30) - xmpyu %fr5R,%fr4L,%fr7 - fstd %fr7,-120(%r30) - xmpyu %fr5L,%fr4R,%fr8 - fstd %fr8,-112(%r30) - xmpyu %fr5L,%fr4L,%fr9 - fstd %fr9,-104(%r30) - ldd -128(%r30),lo ; lo = low 64 bit of product - ldd -120(%r30),m0 ; m0 = mid0 64 bit of product - ldd -112(%r30),m1 ; m1 = mid1 64 bit of product - ldd -104(%r30),hi ; hi = high 64 bit of product - addib,= -1,%r24,L$end1 - nop - fldd 0(sptr),%fr4 - ldo 8(sptr),sptr - addib,= -1,%r24,L$end2 - nop -L$loop - xmpyu %fr5R,%fr4R,%fr6 - fstd %fr6,-128(%r30) - xmpyu %fr5R,%fr4L,%fr7 - fstd %fr7,-120(%r30) - xmpyu %fr5L,%fr4R,%fr8 - fstd %fr8,-112(%r30) - xmpyu %fr5L,%fr4L,%fr9 - fstd %fr9,-104(%r30) - ldd 0(rptr),rlimb - extrd,u lo,31,32,t1 ; t1 = hi32(lo) - extrd,u lo,63,32,t4 ; t4 = lo32(lo) - add,l m0,t1,t1 ; t1 += m0 - add,l,*nuv m1,t1,t1 ; t1 += m1 - add,l %r5,hi,hi ; propagate carry - extrd,u t1,31,32,t2 ; t2 = hi32(t1) - depd,z t1,31,32,t5 ; t5 = lo32(t1) - add,l t5,t4,t4 ; t4 += lo32(t1) - ldd -128(%r30),lo ; lo = low 64 bit of product - add cylimb,rlimb,rlimb - ldd -120(%r30),m0 ; m0 = mid0 64 bit of product - add,dc t2,hi,cylimb - ldd -112(%r30),m1 ; m1 = mid1 64 bit of product - add t4,rlimb,t3 - ldd -104(%r30),hi ; hi = high 64 bit of product - add,dc %r0,cylimb,cylimb - fldd 0(sptr),%fr4 - ldo 8(sptr),sptr - std t3,0(rptr) - addib,<> -1,%r24,L$loop - ldo 8(rptr),rptr -L$end2 - xmpyu %fr5R,%fr4R,%fr6 - fstd %fr6,-128(%r30) - xmpyu %fr5R,%fr4L,%fr7 - fstd %fr7,-120(%r30) - xmpyu %fr5L,%fr4R,%fr8 - fstd %fr8,-112(%r30) - xmpyu %fr5L,%fr4L,%fr9 - fstd %fr9,-104(%r30) - ldd 0(rptr),rlimb - extrd,u lo,31,32,t1 ; t1 = hi32(lo) - extrd,u lo,63,32,t4 ; t4 = lo32(lo) - add,l m0,t1,t1 ; t1 += m0 - add,l,*nuv m1,t1,t1 ; t1 += m0 - add,l %r5,hi,hi ; propagate carry - extrd,u t1,31,32,t2 ; t2 = hi32(t1) - depd,z t1,31,32,t5 ; t5 = lo32(t1) - add,l t5,t4,t4 ; t4 += lo32(t1) - ldd -128(%r30),lo ; lo = low 64 bit of product - add cylimb,rlimb,rlimb - ldd -120(%r30),m0 ; m0 = mid0 64 bit of product - add,dc t2,hi,cylimb - ldd -112(%r30),m1 ; m1 = mid1 64 bit of product - add t4,rlimb,t3 - ldd -104(%r30),hi ; hi = high 64 bit of product - add,dc %r0,cylimb,cylimb - std t3,0(rptr) - ldo 8(rptr),rptr -L$end1 - ldd 0(rptr),rlimb - extrd,u lo,31,32,t1 ; t1 = hi32(lo) - extrd,u lo,63,32,t4 ; t4 = lo32(lo) - add,l m0,t1,t1 ; t1 += m0 - add,l,*nuv m1,t1,t1 ; t1 += m0 - add,l %r5,hi,hi ; propagate carry - extrd,u t1,31,32,t2 ; t2 = hi32(t1) - depd,z t1,31,32,t5 ; t5 = lo32(t1) - add,l t5,t4,t4 ; t4 += lo32(t1) - add cylimb,rlimb,rlimb - add,dc t2,hi,cylimb - add t4,rlimb,t3 - add,dc %r0,cylimb,cylimb - std t3,0(rptr) - ldo 8(rptr),rptr - - ldd -96(%r30),%r3 - ldd -88(%r30),%r4 - ldd -80(%r30),%r5 - ldd -72(%r30),%r6 - - extrd,u cylimb,31,32,%r28 - bve (%r2) - .exit - ldo -128(%r30),%r30 - .procend diff --git a/rts/gmp/mpn/pa64/gmp-mparam.h b/rts/gmp/mpn/pa64/gmp-mparam.h deleted file mode 100644 index 847735b..0000000 --- a/rts/gmp/mpn/pa64/gmp-mparam.h +++ /dev/null @@ -1,65 +0,0 @@ -/* gmp-mparam.h -- Compiler/machine parameter header file. - -Copyright (C) 1991, 1993, 1994, 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. */ - -#define BITS_PER_MP_LIMB 64 -#define BYTES_PER_MP_LIMB 8 -#define BITS_PER_LONGINT 64 -#define BITS_PER_INT 32 -#define BITS_PER_SHORTINT 16 -#define BITS_PER_CHAR 8 - -/* These values were measured in a PA8000 using the system compiler version - A.10.32.30. Presumably the PA8200 and PA8500 have the same timing - characteristic, but GCC might give somewhat different results. */ -/* Generated by tuneup.c, 2000-07-25. */ - -#ifndef KARATSUBA_MUL_THRESHOLD -#define KARATSUBA_MUL_THRESHOLD 16 -#endif -#ifndef TOOM3_MUL_THRESHOLD -#define TOOM3_MUL_THRESHOLD 105 -#endif - -#ifndef KARATSUBA_SQR_THRESHOLD -#define KARATSUBA_SQR_THRESHOLD 40 -#endif -#ifndef TOOM3_SQR_THRESHOLD -#define TOOM3_SQR_THRESHOLD 116 -#endif - -#ifndef BZ_THRESHOLD -#define BZ_THRESHOLD 72 -#endif - -#ifndef FIB_THRESHOLD -#define FIB_THRESHOLD 94 -#endif - -#ifndef POWM_THRESHOLD -#define POWM_THRESHOLD 50 -#endif - -#ifndef GCD_ACCEL_THRESHOLD -#define GCD_ACCEL_THRESHOLD 46 -#endif -#ifndef GCDEXT_THRESHOLD -#define GCDEXT_THRESHOLD 1 -#endif diff --git a/rts/gmp/mpn/pa64/lshift.s b/rts/gmp/mpn/pa64/lshift.s deleted file mode 100644 index 994bc1c..0000000 --- a/rts/gmp/mpn/pa64/lshift.s +++ /dev/null @@ -1,103 +0,0 @@ -; HP-PA 2.0 __gmpn_lshift -- - -; 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. - - -; INPUT PARAMETERS -; res_ptr gr26 -; s1_ptr gr25 -; size gr24 -; cnt gr23 - -; This runs at 1.5 cycles/limb on PA8000. - - .level 2.0n - .code - .export __gmpn_lshift,entry -__gmpn_lshift - .proc - .callinfo frame=0,args_saved - .entry - - shladd %r24,3,%r25,%r25 - shladd %r24,3,%r26,%r26 - subi 64,%r23,%r23 - mtsar %r23 - ldd -8(%r25),%r21 - addib,= -1,%r24,L$end - shrpd %r0,%r21,%sar,%r29 ; compute carry out limb - depw,z %r24,31,3,%r28 ; r28 = (size & 7) - sub %r0,%r24,%r22 - depw,z %r22,28,3,%r22 ; r22 = 8 * (-size & 7) - add %r25,%r22,%r25 ; offset s1_ptr - blr %r28,%r0 ; branch into jump table - add %r26,%r22,%r26 ; offset res_ptr - b L$0 - nop - b L$1 - copy %r21,%r20 - b L$2 - nop - b L$3 - copy %r21,%r20 - b L$4 - nop - b L$5 - copy %r21,%r20 - b L$6 - nop - b L$7 - copy %r21,%r20 - -L$loop -L$0 ldd -16(%r25),%r20 - shrpd %r21,%r20,%sar,%r21 - std %r21,-8(%r26) -L$7 ldd -24(%r25),%r21 - shrpd %r20,%r21,%sar,%r20 - std %r20,-16(%r26) -L$6 ldd -32(%r25),%r20 - shrpd %r21,%r20,%sar,%r21 - std %r21,-24(%r26) -L$5 ldd -40(%r25),%r21 - shrpd %r20,%r21,%sar,%r20 - std %r20,-32(%r26) -L$4 ldd -48(%r25),%r20 - shrpd %r21,%r20,%sar,%r21 - std %r21,-40(%r26) -L$3 ldd -56(%r25),%r21 - shrpd %r20,%r21,%sar,%r20 - std %r20,-48(%r26) -L$2 ldd -64(%r25),%r20 - shrpd %r21,%r20,%sar,%r21 - std %r21,-56(%r26) -L$1 ldd -72(%r25),%r21 - ldo -64(%r25),%r25 - shrpd %r20,%r21,%sar,%r20 - std %r20,-64(%r26) - addib,> -8,%r24,L$loop - ldo -64(%r26),%r26 - -L$end shrpd %r21,%r0,%sar,%r21 - std %r21,-8(%r26) - bve (%r2) - .exit - extrd,u %r29,31,32,%r28 - .procend diff --git a/rts/gmp/mpn/pa64/mul_1.S b/rts/gmp/mpn/pa64/mul_1.S deleted file mode 100644 index ab310c1..0000000 --- a/rts/gmp/mpn/pa64/mul_1.S +++ /dev/null @@ -1,158 +0,0 @@ -; HP-PA 2.0 64-bit __gmpn_mul_1 -- Multiply a limb vector with a limb and -; store the result in a second limb vector. - -; 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. - -; INPUT PARAMETERS -#define rptr %r26 -#define sptr %r25 -#define size %r24 -#define s2limb -56(%r30) - -; This runs at 11 cycles/limb on a PA8000. It might be possible to make -; it faster, but the PA8000 pipeline is not publically documented and it -; is very complex to reverse engineer - -#define t1 %r19 -#define rlimb %r20 -#define hi %r21 -#define lo %r22 -#define m0 %r28 -#define m1 %r3 -#define cylimb %r29 -#define t3 %r4 -#define t2 %r6 -#define t5 %r23 -#define t4 %r31 - .level 2.0n - .code - .export __gmpn_mul_1,entry -__gmpn_mul_1 - .proc - .callinfo frame=128,no_calls - .entry - fldd -56(%r30),%fr5 ; s2limb passed on stack - ldo 128(%r30),%r30 - add %r0,%r0,cylimb ; clear cy and cylimb - - std %r3,-96(%r30) - std %r4,-88(%r30) - std %r5,-80(%r30) - std %r6,-72(%r30) - depdi,z 1,31,1,%r5 - - fldd 0(sptr),%fr4 - ldo 8(sptr),sptr - - xmpyu %fr5R,%fr4R,%fr6 - fstd %fr6,-128(%r30) - xmpyu %fr5R,%fr4L,%fr7 - fstd %fr7,-120(%r30) - xmpyu %fr5L,%fr4R,%fr8 - fstd %fr8,-112(%r30) - xmpyu %fr5L,%fr4L,%fr9 - fstd %fr9,-104(%r30) - ldd -128(%r30),lo ; lo = low 64 bit of product - ldd -120(%r30),m0 ; m0 = mid0 64 bit of product - ldd -112(%r30),m1 ; m1 = mid1 64 bit of product - ldd -104(%r30),hi ; hi = high 64 bit of product - addib,= -1,%r24,L$end1 - nop - fldd 0(sptr),%fr4 - ldo 8(sptr),sptr - addib,= -1,%r24,L$end2 - nop -L$loop - xmpyu %fr5R,%fr4R,%fr6 - fstd %fr6,-128(%r30) - xmpyu %fr5R,%fr4L,%fr7 - fstd %fr7,-120(%r30) - xmpyu %fr5L,%fr4R,%fr8 - fstd %fr8,-112(%r30) - xmpyu %fr5L,%fr4L,%fr9 - fstd %fr9,-104(%r30) - extrd,u lo,31,32,t1 ; t1 = hi32(lo) - extrd,u lo,63,32,t4 ; t4 = lo32(lo) - add,l m0,t1,t1 ; t1 += m0 - add,l,*nuv m1,t1,t1 ; t1 += m1 - add,l %r5,hi,hi ; propagate carry - extrd,u t1,31,32,t2 ; t2 = hi32(t1) - depd,z t1,31,32,t5 ; t5 = lo32(t1) - add,l t5,t4,t4 ; t4 += lo32(t1) - ldd -128(%r30),lo ; lo = low 64 bit of product - add cylimb,t4,t3 - ldd -120(%r30),m0 ; m0 = mid0 64 bit of product - add,dc t2,hi,cylimb - ldd -112(%r30),m1 ; m1 = mid1 64 bit of product - ldd -104(%r30),hi ; hi = high 64 bit of product - fldd 0(sptr),%fr4 - ldo 8(sptr),sptr - std t3,0(rptr) - addib,<> -1,%r24,L$loop - ldo 8(rptr),rptr -L$end2 - xmpyu %fr5R,%fr4R,%fr6 - fstd %fr6,-128(%r30) - xmpyu %fr5R,%fr4L,%fr7 - fstd %fr7,-120(%r30) - xmpyu %fr5L,%fr4R,%fr8 - fstd %fr8,-112(%r30) - xmpyu %fr5L,%fr4L,%fr9 - fstd %fr9,-104(%r30) - extrd,u lo,31,32,t1 ; t1 = hi32(lo) - extrd,u lo,63,32,t4 ; t4 = lo32(lo) - add,l m0,t1,t1 ; t1 += m0 - add,l,*nuv m1,t1,t1 ; t1 += m0 - add,l %r5,hi,hi ; propagate carry - extrd,u t1,31,32,t2 ; t2 = hi32(t1) - depd,z t1,31,32,t5 ; t5 = lo32(t1) - add,l t5,t4,t4 ; t4 += lo32(t1) - ldd -128(%r30),lo ; lo = low 64 bit of product - add cylimb,t4,t3 - ldd -120(%r30),m0 ; m0 = mid0 64 bit of product - add,dc t2,hi,cylimb - ldd -112(%r30),m1 ; m1 = mid1 64 bit of product - ldd -104(%r30),hi ; hi = high 64 bit of product - std t3,0(rptr) - ldo 8(rptr),rptr -L$end1 - extrd,u lo,31,32,t1 ; t1 = hi32(lo) - extrd,u lo,63,32,t4 ; t2 = lo32(lo) - add,l m0,t1,t1 ; t1 += m0 - add,l,*nuv m1,t1,t1 ; t1 += m0 - add,l %r5,hi,hi ; propagate carry - extrd,u t1,31,32,t2 ; t2 = hi32(t1) - depd,z t1,31,32,t5 ; t5 = lo32(t1) - add,l t5,t4,t4 ; t4 += lo32(t1) - add cylimb,t4,t3 - add,dc t2,hi,cylimb - std t3,0(rptr) - ldo 8(rptr),rptr - - ldd -96(%r30),%r3 - ldd -88(%r30),%r4 - ldd -80(%r30),%r5 - ldd -72(%r30),%r6 - - extrd,u cylimb,31,32,%r28 - bve (%r2) - .exit - ldo -128(%r30),%r30 - .procend diff --git a/rts/gmp/mpn/pa64/rshift.s b/rts/gmp/mpn/pa64/rshift.s deleted file mode 100644 index f0730e2..0000000 --- a/rts/gmp/mpn/pa64/rshift.s +++ /dev/null @@ -1,100 +0,0 @@ -; HP-PA 2.0 __gmpn_rshift -- - -; 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. - - -; INPUT PARAMETERS -; res_ptr gr26 -; s1_ptr gr25 -; size gr24 -; cnt gr23 - -; This runs at 1.5 cycles/limb on PA8000. - - .level 2.0n - .code - .export __gmpn_rshift,entry -__gmpn_rshift - .proc - .callinfo frame=0,args_saved - .entry - - mtsar %r23 - ldd 0(%r25),%r21 - addib,= -1,%r24,L$end - shrpd %r21,%r0,%sar,%r29 ; compute carry out limb - depw,z %r24,31,3,%r28 ; r28 = (size & 7) - sub %r0,%r24,%r22 - depw,z %r22,28,3,%r22 ; r22 = 8 * (-size & 7) - sub %r25,%r22,%r25 ; offset s1_ptr - blr %r28,%r0 ; branch into jump table - sub %r26,%r22,%r26 ; offset res_ptr - b L$0 - nop - b L$1 - copy %r21,%r20 - b L$2 - nop - b L$3 - copy %r21,%r20 - b L$4 - nop - b L$5 - copy %r21,%r20 - b L$6 - nop - b L$7 - copy %r21,%r20 - -L$loop -L$0 ldd 8(%r25),%r20 - shrpd %r20,%r21,%sar,%r21 - std %r21,0(%r26) -L$7 ldd 16(%r25),%r21 - shrpd %r21,%r20,%sar,%r20 - std %r20,8(%r26) -L$6 ldd 24(%r25),%r20 - shrpd %r20,%r21,%sar,%r21 - std %r21,16(%r26) -L$5 ldd 32(%r25),%r21 - shrpd %r21,%r20,%sar,%r20 - std %r20,24(%r26) -L$4 ldd 40(%r25),%r20 - shrpd %r20,%r21,%sar,%r21 - std %r21,32(%r26) -L$3 ldd 48(%r25),%r21 - shrpd %r21,%r20,%sar,%r20 - std %r20,40(%r26) -L$2 ldd 56(%r25),%r20 - shrpd %r20,%r21,%sar,%r21 - std %r21,48(%r26) -L$1 ldd 64(%r25),%r21 - ldo 64(%r25),%r25 - shrpd %r21,%r20,%sar,%r20 - std %r20,56(%r26) - addib,> -8,%r24,L$loop - ldo 64(%r26),%r26 - -L$end shrpd %r0,%r21,%sar,%r21 - std %r21,0(%r26) - bve (%r2) - .exit - extrd,u %r29,31,32,%r28 - .procend diff --git a/rts/gmp/mpn/pa64/sub_n.s b/rts/gmp/mpn/pa64/sub_n.s deleted file mode 100644 index dda1f54..0000000 --- a/rts/gmp/mpn/pa64/sub_n.s +++ /dev/null @@ -1,90 +0,0 @@ -; HP-PA 2.0 __gmpn_sub_n -- Subtract two limb vectors of the same length > 0 -; and store difference in a third limb vector. - -; 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. - - -; INPUT PARAMETERS -; res_ptr gr26 -; s1_ptr gr25 -; s2_ptr gr24 -; size gr23 - -; This runs at 2 cycles/limb on PA8000. - - .level 2.0n - .code - .export __gmpn_sub_n,entry -__gmpn_sub_n - .proc - .callinfo frame=0,args_saved - .entry - - sub %r0,%r23,%r22 - depw,z %r22,30,3,%r28 ; r28 = 2 * (-n & 7) - depw,z %r22,28,3,%r22 ; r22 = 8 * (-n & 7) - sub %r25,%r22,%r25 ; offset s1_ptr - sub %r24,%r22,%r24 ; offset s2_ptr - blr %r28,%r0 ; branch into loop - sub %r26,%r22,%r26 ; offset res_ptr and set carry - -L$loop ldd 0(%r25),%r20 - ldd 0(%r24),%r31 - sub,db %r20,%r31,%r20 - std %r20,0(%r26) -L$7 ldd 8(%r25),%r21 - ldd 8(%r24),%r19 - sub,db %r21,%r19,%r21 - std %r21,8(%r26) -L$6 ldd 16(%r25),%r20 - ldd 16(%r24),%r31 - sub,db %r20,%r31,%r20 - std %r20,16(%r26) -L$5 ldd 24(%r25),%r21 - ldd 24(%r24),%r19 - sub,db %r21,%r19,%r21 - std %r21,24(%r26) -L$4 ldd 32(%r25),%r20 - ldd 32(%r24),%r31 - sub,db %r20,%r31,%r20 - std %r20,32(%r26) -L$3 ldd 40(%r25),%r21 - ldd 40(%r24),%r19 - sub,db %r21,%r19,%r21 - std %r21,40(%r26) -L$2 ldd 48(%r25),%r20 - ldd 48(%r24),%r31 - sub,db %r20,%r31,%r20 - std %r20,48(%r26) -L$1 ldd 56(%r25),%r21 - ldo 64(%r25),%r25 - ldd 56(%r24),%r19 - sub,db %r21,%r19,%r21 - std %r21,56(%r26) - ldo 64(%r24),%r24 - addib,> -8,%r23,L$loop - ldo 64(%r26),%r26 - - add,dc %r0,%r0,%r29 - subi 1,%r29,%r29 - bve (%r2) - .exit - ldi 0,%r28 - .procend diff --git a/rts/gmp/mpn/pa64/submul_1.S b/rts/gmp/mpn/pa64/submul_1.S deleted file mode 100644 index 27666b9..0000000 --- a/rts/gmp/mpn/pa64/submul_1.S +++ /dev/null @@ -1,170 +0,0 @@ -; HP-PA 2.0 64-bit __gmpn_submul_1 -- Multiply a limb vector with a limb and -; subtract the result from a second limb vector. - -; 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. - -; INPUT PARAMETERS -#define rptr %r26 -#define sptr %r25 -#define size %r24 -#define s2limb -56(%r30) - -; This runs at 11 cycles/limb on a PA8000. It might be possible to make -; it faster, but the PA8000 pipeline is not publically documented and it -; is very complex to reverse engineer - -#define t1 %r19 -#define rlimb %r20 -#define hi %r21 -#define lo %r22 -#define m0 %r28 -#define m1 %r3 -#define cylimb %r29 -#define t3 %r4 -#define t2 %r6 -#define t5 %r23 -#define t4 %r31 - .level 2.0n - .code - .export __gmpn_submul_1,entry -__gmpn_submul_1 - .proc - .callinfo frame=128,no_calls - .entry - fldd -56(%r30),%fr5 ; s2limb passed on stack - ldo 128(%r30),%r30 - add %r0,%r0,cylimb ; clear cy and cylimb - - std %r3,-96(%r30) - std %r4,-88(%r30) - std %r5,-80(%r30) - std %r6,-72(%r30) - depdi,z 1,31,1,%r5 - - fldd 0(sptr),%fr4 - ldo 8(sptr),sptr - - xmpyu %fr5R,%fr4R,%fr6 - fstd %fr6,-128(%r30) - xmpyu %fr5R,%fr4L,%fr7 - fstd %fr7,-120(%r30) - xmpyu %fr5L,%fr4R,%fr8 - fstd %fr8,-112(%r30) - xmpyu %fr5L,%fr4L,%fr9 - fstd %fr9,-104(%r30) - ldd -128(%r30),lo ; lo = low 64 bit of product - ldd -120(%r30),m0 ; m0 = mid0 64 bit of product - ldd -112(%r30),m1 ; m1 = mid1 64 bit of product - ldd -104(%r30),hi ; hi = high 64 bit of product - addib,= -1,%r24,L$end1 - nop - fldd 0(sptr),%fr4 - ldo 8(sptr),sptr - addib,= -1,%r24,L$end2 - nop -L$loop - xmpyu %fr5R,%fr4R,%fr6 - fstd %fr6,-128(%r30) - xmpyu %fr5R,%fr4L,%fr7 - fstd %fr7,-120(%r30) - xmpyu %fr5L,%fr4R,%fr8 - fstd %fr8,-112(%r30) - xmpyu %fr5L,%fr4L,%fr9 - fstd %fr9,-104(%r30) - ldd 0(rptr),rlimb - extrd,u lo,31,32,t1 ; t1 = hi32(lo) - extrd,u lo,63,32,t4 ; t4 = lo32(lo) - add,l m0,t1,t1 ; t1 += m0 - add,l,*nuv m1,t1,t1 ; t1 += m1 - add,l %r5,hi,hi ; propagate carry - extrd,u t1,31,32,t2 ; t2 = hi32(t1) - depd,z t1,31,32,t5 ; t5 = lo32(t1) - add,l t5,t4,t4 ; t4 += lo32(t1) - ldd -128(%r30),lo ; lo = low 64 bit of product - add cylimb,t4,t4 - ldd -120(%r30),m0 ; m0 = mid0 64 bit of product - add,dc t2,hi,cylimb - ldd -112(%r30),m1 ; m1 = mid1 64 bit of product - sub rlimb,t4,t3 - add t4,t3,%r0 - ldd -104(%r30),hi ; hi = high 64 bit of product - add,dc %r0,cylimb,cylimb - fldd 0(sptr),%fr4 - ldo 8(sptr),sptr - std t3,0(rptr) - addib,<> -1,%r24,L$loop - ldo 8(rptr),rptr -L$end2 - xmpyu %fr5R,%fr4R,%fr6 - fstd %fr6,-128(%r30) - xmpyu %fr5R,%fr4L,%fr7 - fstd %fr7,-120(%r30) - xmpyu %fr5L,%fr4R,%fr8 - fstd %fr8,-112(%r30) - xmpyu %fr5L,%fr4L,%fr9 - fstd %fr9,-104(%r30) - ldd 0(rptr),rlimb - extrd,u lo,31,32,t1 ; t1 = hi32(lo) - extrd,u lo,63,32,t4 ; t4 = lo32(lo) - add,l m0,t1,t1 ; t1 += m0 - add,l,*nuv m1,t1,t1 ; t1 += m0 - add,l %r5,hi,hi ; propagate carry - extrd,u t1,31,32,t2 ; t2 = hi32(t1) - depd,z t1,31,32,t5 ; t5 = lo32(t1) - add,l t5,t4,t4 ; t4 += lo32(t1) - ldd -128(%r30),lo ; lo = low 64 bit of product - add cylimb,t4,t4 - ldd -120(%r30),m0 ; m0 = mid0 64 bit of product - add,dc t2,hi,cylimb - ldd -112(%r30),m1 ; m1 = mid1 64 bit of product - sub rlimb,t4,t3 - add t4,t3,%r0 - ldd -104(%r30),hi ; hi = high 64 bit of product - add,dc %r0,cylimb,cylimb - std t3,0(rptr) - ldo 8(rptr),rptr -L$end1 - ldd 0(rptr),rlimb - extrd,u lo,31,32,t1 ; t1 = hi32(lo) - extrd,u lo,63,32,t4 ; t4 = lo32(lo) - add,l m0,t1,t1 ; t1 += m0 - add,l,*nuv m1,t1,t1 ; t1 += m0 - add,l %r5,hi,hi ; propagate carry - extrd,u t1,31,32,t2 ; t2 = hi32(t1) - depd,z t1,31,32,t5 ; t5 = lo32(t1) - add,l t5,t4,t4 ; t4 += lo32(t1) - add cylimb,t4,t4 - add,dc t2,hi,cylimb - sub rlimb,t4,t3 - add t4,t3,%r0 - add,dc %r0,cylimb,cylimb - std t3,0(rptr) - ldo 8(rptr),rptr - - ldd -96(%r30),%r3 - ldd -88(%r30),%r4 - ldd -80(%r30),%r5 - ldd -72(%r30),%r6 - - extrd,u cylimb,31,32,%r28 - bve (%r2) - .exit - ldo -128(%r30),%r30 - .procend diff --git a/rts/gmp/mpn/pa64/udiv_qrnnd.c b/rts/gmp/mpn/pa64/udiv_qrnnd.c deleted file mode 100644 index 1c9fe08..0000000 --- a/rts/gmp/mpn/pa64/udiv_qrnnd.c +++ /dev/null @@ -1,111 +0,0 @@ -/* -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" - -#define TWO64 18446744073709551616.0 - -mp_limb_t -#if __STDC__ -__MPN(udiv_qrnnd) (mp_limb_t n1, mp_limb_t n0, mp_limb_t d, mp_limb_t *r) -#else -__MPN(udiv_qrnnd) (n1, n0, d, r) - mp_limb_t n1; - mp_limb_t n0; - mp_limb_t d; - mp_limb_t *r; -#endif -{ - mp_limb_t q1, q2, q; - mp_limb_t p1, p0; - double di, dq; - - di = 1.0 / d; - - /* Generate upper 53 bits of quotient. Be careful here; the `double' - quotient may be rounded to 2^64 which we cannot safely convert back - to a 64-bit integer. */ - dq = (TWO64 * (double) n1 + (double) n0) * di; - if (dq >= TWO64) - q1 = 0xfffffffffffff800LL; - else - q1 = (mp_limb_t) dq; - - /* Multiply back in order to compare the product to the dividend. */ - umul_ppmm (p1, p0, q1, d); - - /* Was the 53-bit quotient greater that our sought quotient? Test the - sign of the partial remainder to find out. */ - if (n1 < p1 || (n1 == p1 && n0 < p0)) - { - /* 53-bit quotient too large. Partial remainder is negative. - Compute the absolute value of the remainder in n1,,n0. */ - n1 = p1 - (n1 + (p0 < n0)); - n0 = p0 - n0; - - /* Now use the partial remainder as new dividend to compute more bits of - quotient. This is an adjustment for the one we got previously. */ - q2 = (mp_limb_t) ((TWO64 * (double) n1 + (double) n0) * di); - umul_ppmm (p1, p0, q2, d); - - q = q1 - q2; - if (n1 < p1 || (n1 == p1 && n0 <= p0)) - { - n0 = p0 - n0; - } - else - { - n0 = p0 - n0; - n0 += d; - q--; - } - } - else - { - n1 = n1 - (p1 + (n0 < p0)); - n0 = n0 - p0; - - q2 = (mp_limb_t) ((TWO64 * (double) n1 + (double) n0) * di); - umul_ppmm (p1, p0, q2, d); - - q = q1 + q2; - if (n1 < p1 || (n1 == p1 && n0 < p0)) - { - n0 = n0 - p0; - n0 += d; - q--; - } - else - { - n0 = n0 - p0; - if (n0 >= d) - { - n0 -= d; - q++; - } - } - } - - *r = n0; - return q; -} diff --git a/rts/gmp/mpn/pa64/umul_ppmm.S b/rts/gmp/mpn/pa64/umul_ppmm.S deleted file mode 100644 index ceff2d7..0000000 --- a/rts/gmp/mpn/pa64/umul_ppmm.S +++ /dev/null @@ -1,74 +0,0 @@ -; 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. - -#define p0 %r28 -#define p1 %r29 -#define t32 %r19 -#define t0 %r20 -#define t1 %r21 -#define x %r22 -#define m0 %r23 -#define m1 %r24 - .level 2.0n - .code - .export __gmpn_umul_ppmm,entry -__gmpn_umul_ppmm - .proc - .callinfo frame=128,no_calls - .entry - ldo 128(%r30),%r30 - depd %r25,31,32,%r26 - std %r26,-64(%r30) - depd %r23,31,32,%r24 - std %r24,-56(%r30) - - ldw -180(%r30),%r31 - - fldd -64(%r30),%fr4 - fldd -56(%r30),%fr5 - - xmpyu %fr5R,%fr4R,%fr6 - fstd %fr6,-128(%r30) - xmpyu %fr5R,%fr4L,%fr7 - fstd %fr7,-120(%r30) - xmpyu %fr5L,%fr4R,%fr8 - fstd %fr8,-112(%r30) - xmpyu %fr5L,%fr4L,%fr9 - fstd %fr9,-104(%r30) - - depdi,z 1,31,1,t32 ; t32 = 2^32 - - ldd -128(%r30),p0 ; lo = low 64 bit of product - ldd -120(%r30),m0 ; m0 = mid0 64 bit of product - ldd -112(%r30),m1 ; m1 = mid1 64 bit of product - ldd -104(%r30),p1 ; hi = high 64 bit of product - - add,l,*nuv m0,m1,x ; x = m1+m0 - add,l t32,p1,p1 ; propagate carry to mid of p1 - depd,z x,31,32,t0 ; lo32(m1+m0) - add t0,p0,p0 - extrd,u x,31,32,t1 ; hi32(m1+m0) - add,dc t1,p1,p1 - - std p0,0(%r31) ; store low half of product - extrd,u p1,31,32,%r28 ; return high half of product - bve (%r2) - .exit - ldo -128(%r30),%r30 - .procend diff --git a/rts/gmp/mpn/pa64w/README b/rts/gmp/mpn/pa64w/README deleted file mode 100644 index cf590a7..0000000 --- a/rts/gmp/mpn/pa64w/README +++ /dev/null @@ -1,2 +0,0 @@ -This directory contains mpn functions for 64-bit PA-RISC 2.0 -using 64-bit pointers (2.0W). diff --git a/rts/gmp/mpn/pa64w/add_n.s b/rts/gmp/mpn/pa64w/add_n.s deleted file mode 100644 index 1bb9e8f..0000000 --- a/rts/gmp/mpn/pa64w/add_n.s +++ /dev/null @@ -1,90 +0,0 @@ -; HP-PA 2.0 __gmpn_add_n -- Add two limb vectors of the same length > 0 and -; store sum in a third limb vector. - -; 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. - - -; INPUT PARAMETERS -; res_ptr gr26 -; s1_ptr gr25 -; s2_ptr gr24 -; size gr23 - -; This runs at 2 cycles/limb on PA8000. - - .level 2.0w - .code - .export __gmpn_add_n,entry -__gmpn_add_n - .proc - .callinfo frame=0,args_saved - .entry - - sub %r0,%r23,%r22 - depw,z %r22,30,3,%r28 ; r28 = 2 * (-n & 7) - depw,z %r22,28,3,%r22 ; r22 = 8 * (-n & 7) - sub %r25,%r22,%r25 ; offset s1_ptr - sub %r24,%r22,%r24 ; offset s2_ptr - sub %r26,%r22,%r26 ; offset res_ptr - blr %r28,%r0 ; branch into loop - add %r0,%r0,%r0 ; reset carry - -L$loop ldd 0(%r25),%r20 - ldd 0(%r24),%r31 - add,dc %r20,%r31,%r20 - std %r20,0(%r26) -L$7 ldd 8(%r25),%r21 - ldd 8(%r24),%r19 - add,dc %r21,%r19,%r21 - std %r21,8(%r26) -L$6 ldd 16(%r25),%r20 - ldd 16(%r24),%r31 - add,dc %r20,%r31,%r20 - std %r20,16(%r26) -L$5 ldd 24(%r25),%r21 - ldd 24(%r24),%r19 - add,dc %r21,%r19,%r21 - std %r21,24(%r26) -L$4 ldd 32(%r25),%r20 - ldd 32(%r24),%r31 - add,dc %r20,%r31,%r20 - std %r20,32(%r26) -L$3 ldd 40(%r25),%r21 - ldd 40(%r24),%r19 - add,dc %r21,%r19,%r21 - std %r21,40(%r26) -L$2 ldd 48(%r25),%r20 - ldd 48(%r24),%r31 - add,dc %r20,%r31,%r20 - std %r20,48(%r26) -L$1 ldd 56(%r25),%r21 - ldo 64(%r25),%r25 - ldd 56(%r24),%r19 - add,dc %r21,%r19,%r21 - std %r21,56(%r26) - ldo 64(%r24),%r24 - addib,> -8,%r23,L$loop - ldo 64(%r26),%r26 - - add,dc %r0,%r0,%r29 - bve (%r2) - .exit - copy %r29,%r28 - .procend diff --git a/rts/gmp/mpn/pa64w/addmul_1.S b/rts/gmp/mpn/pa64w/addmul_1.S deleted file mode 100644 index 4799f90..0000000 --- a/rts/gmp/mpn/pa64w/addmul_1.S +++ /dev/null @@ -1,168 +0,0 @@ -; HP-PA 2.0 64-bit __gmpn_addmul_1 -- Multiply a limb vector with a limb and -; add the result to a second limb vector. - -; 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. - -; INPUT PARAMETERS -#define rptr %r26 -#define sptr %r25 -#define size %r24 -#define s2limb %r23 - -; This runs at 11 cycles/limb on a PA8000. It might be possible to make -; it faster, but the PA8000 pipeline is not publically documented and it -; is very complex to reverse engineer - -#define t1 %r19 -#define rlimb %r20 -#define hi %r21 -#define lo %r22 -#define m0 %r28 -#define m1 %r3 -#define cylimb %r29 -#define t3 %r4 -#define t2 %r6 -#define t5 %r23 -#define t4 %r31 - .level 2.0w - .code - .export __gmpn_addmul_1,entry -__gmpn_addmul_1 - .proc - .callinfo frame=128,no_calls - .entry - std s2limb,-56(%r30) - fldd -56(%r30),%fr5 - ldo 128(%r30),%r30 - add %r0,%r0,cylimb ; clear cy and cylimb - - std %r3,-96(%r30) - std %r4,-88(%r30) - std %r5,-80(%r30) - std %r6,-72(%r30) - depdi,z 1,31,1,%r5 - - fldd 0(sptr),%fr4 - ldo 8(sptr),sptr - - xmpyu %fr5R,%fr4R,%fr6 - fstd %fr6,-128(%r30) - xmpyu %fr5R,%fr4L,%fr7 - fstd %fr7,-120(%r30) - xmpyu %fr5L,%fr4R,%fr8 - fstd %fr8,-112(%r30) - xmpyu %fr5L,%fr4L,%fr9 - fstd %fr9,-104(%r30) - ldd -128(%r30),lo ; lo = low 64 bit of product - ldd -120(%r30),m0 ; m0 = mid0 64 bit of product - ldd -112(%r30),m1 ; m1 = mid1 64 bit of product - ldd -104(%r30),hi ; hi = high 64 bit of product - addib,= -1,%r24,L$end1 - nop - fldd 0(sptr),%fr4 - ldo 8(sptr),sptr - addib,= -1,%r24,L$end2 - nop -L$loop - xmpyu %fr5R,%fr4R,%fr6 - fstd %fr6,-128(%r30) - xmpyu %fr5R,%fr4L,%fr7 - fstd %fr7,-120(%r30) - xmpyu %fr5L,%fr4R,%fr8 - fstd %fr8,-112(%r30) - xmpyu %fr5L,%fr4L,%fr9 - fstd %fr9,-104(%r30) - ldd 0(rptr),rlimb - extrd,u lo,31,32,t1 ; t1 = hi32(lo) - extrd,u lo,63,32,t4 ; t4 = lo32(lo) - add,l m0,t1,t1 ; t1 += m0 - add,l,*nuv m1,t1,t1 ; t1 += m1 - add,l %r5,hi,hi ; propagate carry - extrd,u t1,31,32,t2 ; t2 = hi32(t1) - depd,z t1,31,32,t5 ; t5 = lo32(t1) - add,l t5,t4,t4 ; t4 += lo32(t1) - ldd -128(%r30),lo ; lo = low 64 bit of product - add cylimb,rlimb,rlimb - ldd -120(%r30),m0 ; m0 = mid0 64 bit of product - add,dc t2,hi,cylimb - ldd -112(%r30),m1 ; m1 = mid1 64 bit of product - add t4,rlimb,t3 - ldd -104(%r30),hi ; hi = high 64 bit of product - add,dc %r0,cylimb,cylimb - fldd 0(sptr),%fr4 - ldo 8(sptr),sptr - std t3,0(rptr) - addib,<> -1,%r24,L$loop - ldo 8(rptr),rptr -L$end2 - xmpyu %fr5R,%fr4R,%fr6 - fstd %fr6,-128(%r30) - xmpyu %fr5R,%fr4L,%fr7 - fstd %fr7,-120(%r30) - xmpyu %fr5L,%fr4R,%fr8 - fstd %fr8,-112(%r30) - xmpyu %fr5L,%fr4L,%fr9 - fstd %fr9,-104(%r30) - ldd 0(rptr),rlimb - extrd,u lo,31,32,t1 ; t1 = hi32(lo) - extrd,u lo,63,32,t4 ; t4 = lo32(lo) - add,l m0,t1,t1 ; t1 += m0 - add,l,*nuv m1,t1,t1 ; t1 += m0 - add,l %r5,hi,hi ; propagate carry - extrd,u t1,31,32,t2 ; t2 = hi32(t1) - depd,z t1,31,32,t5 ; t5 = lo32(t1) - add,l t5,t4,t4 ; t4 += lo32(t1) - ldd -128(%r30),lo ; lo = low 64 bit of product - add cylimb,rlimb,rlimb - ldd -120(%r30),m0 ; m0 = mid0 64 bit of product - add,dc t2,hi,cylimb - ldd -112(%r30),m1 ; m1 = mid1 64 bit of product - add t4,rlimb,t3 - ldd -104(%r30),hi ; hi = high 64 bit of product - add,dc %r0,cylimb,cylimb - std t3,0(rptr) - ldo 8(rptr),rptr -L$end1 - ldd 0(rptr),rlimb - extrd,u lo,31,32,t1 ; t1 = hi32(lo) - extrd,u lo,63,32,t4 ; t4 = lo32(lo) - add,l m0,t1,t1 ; t1 += m0 - add,l,*nuv m1,t1,t1 ; t1 += m0 - add,l %r5,hi,hi ; propagate carry - extrd,u t1,31,32,t2 ; t2 = hi32(t1) - depd,z t1,31,32,t5 ; t5 = lo32(t1) - add,l t5,t4,t4 ; t4 += lo32(t1) - add cylimb,rlimb,rlimb - add,dc t2,hi,cylimb - add t4,rlimb,t3 - add,dc %r0,cylimb,cylimb - std t3,0(rptr) - ldo 8(rptr),rptr - - ldd -96(%r30),%r3 - ldd -88(%r30),%r4 - ldd -80(%r30),%r5 - ldd -72(%r30),%r6 - - copy cylimb,%r28 - bve (%r2) - .exit - ldo -128(%r30),%r30 - .procend diff --git a/rts/gmp/mpn/pa64w/gmp-mparam.h b/rts/gmp/mpn/pa64w/gmp-mparam.h deleted file mode 100644 index ee5a0a3..0000000 --- a/rts/gmp/mpn/pa64w/gmp-mparam.h +++ /dev/null @@ -1,65 +0,0 @@ -/* gmp-mparam.h -- Compiler/machine parameter header file. - -Copyright (C) 1991, 1993, 1994, 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. */ - -#define BITS_PER_MP_LIMB 64 -#define BYTES_PER_MP_LIMB 8 -#define BITS_PER_LONGINT 64 -#define BITS_PER_INT 32 -#define BITS_PER_SHORTINT 16 -#define BITS_PER_CHAR 8 - -/* These values were measured on a PA8500 using the system compiler version - A.11.01.02. Presumably the PA8000 and PA8200 have the same timing - characteristic, but GCC might give somewhat different results.. */ -/* Generated by tuneup.c, 2000-07-25. */ - -#ifndef KARATSUBA_MUL_THRESHOLD -#define KARATSUBA_MUL_THRESHOLD 18 -#endif -#ifndef TOOM3_MUL_THRESHOLD -#define TOOM3_MUL_THRESHOLD 105 -#endif - -#ifndef KARATSUBA_SQR_THRESHOLD -#define KARATSUBA_SQR_THRESHOLD 46 -#endif -#ifndef TOOM3_SQR_THRESHOLD -#define TOOM3_SQR_THRESHOLD 83 -#endif - -#ifndef BZ_THRESHOLD -#define BZ_THRESHOLD 58 -#endif - -#ifndef FIB_THRESHOLD -#define FIB_THRESHOLD 134 -#endif - -#ifndef POWM_THRESHOLD -#define POWM_THRESHOLD 56 -#endif - -#ifndef GCD_ACCEL_THRESHOLD -#define GCD_ACCEL_THRESHOLD 26 -#endif -#ifndef GCDEXT_THRESHOLD -#define GCDEXT_THRESHOLD 1 -#endif diff --git a/rts/gmp/mpn/pa64w/lshift.s b/rts/gmp/mpn/pa64w/lshift.s deleted file mode 100644 index 84f925a..0000000 --- a/rts/gmp/mpn/pa64w/lshift.s +++ /dev/null @@ -1,103 +0,0 @@ -; HP-PA 2.0 __gmpn_lshift -- - -; 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. - - -; INPUT PARAMETERS -; res_ptr gr26 -; s1_ptr gr25 -; size gr24 -; cnt gr23 - -; This runs at 1.5 cycles/limb on PA8000. - - .level 2.0w - .code - .export __gmpn_lshift,entry -__gmpn_lshift - .proc - .callinfo frame=0,args_saved - .entry - - shladd %r24,3,%r25,%r25 - shladd %r24,3,%r26,%r26 - subi 64,%r23,%r23 - mtsar %r23 - ldd -8(%r25),%r21 - addib,= -1,%r24,L$end - shrpd %r0,%r21,%sar,%r29 ; compute carry out limb - depw,z %r24,31,3,%r28 ; r28 = (size & 7) - sub %r0,%r24,%r22 - depw,z %r22,28,3,%r22 ; r22 = 8 * (-size & 7) - add %r25,%r22,%r25 ; offset s1_ptr - blr %r28,%r0 ; branch into jump table - add %r26,%r22,%r26 ; offset res_ptr - b L$0 - nop - b L$1 - copy %r21,%r20 - b L$2 - nop - b L$3 - copy %r21,%r20 - b L$4 - nop - b L$5 - copy %r21,%r20 - b L$6 - nop - b L$7 - copy %r21,%r20 - -L$loop -L$0 ldd -16(%r25),%r20 - shrpd %r21,%r20,%sar,%r21 - std %r21,-8(%r26) -L$7 ldd -24(%r25),%r21 - shrpd %r20,%r21,%sar,%r20 - std %r20,-16(%r26) -L$6 ldd -32(%r25),%r20 - shrpd %r21,%r20,%sar,%r21 - std %r21,-24(%r26) -L$5 ldd -40(%r25),%r21 - shrpd %r20,%r21,%sar,%r20 - std %r20,-32(%r26) -L$4 ldd -48(%r25),%r20 - shrpd %r21,%r20,%sar,%r21 - std %r21,-40(%r26) -L$3 ldd -56(%r25),%r21 - shrpd %r20,%r21,%sar,%r20 - std %r20,-48(%r26) -L$2 ldd -64(%r25),%r20 - shrpd %r21,%r20,%sar,%r21 - std %r21,-56(%r26) -L$1 ldd -72(%r25),%r21 - ldo -64(%r25),%r25 - shrpd %r20,%r21,%sar,%r20 - std %r20,-64(%r26) - addib,> -8,%r24,L$loop - ldo -64(%r26),%r26 - -L$end shrpd %r21,%r0,%sar,%r21 - std %r21,-8(%r26) - bve (%r2) - .exit - copy %r29,%r28 - .procend diff --git a/rts/gmp/mpn/pa64w/mul_1.S b/rts/gmp/mpn/pa64w/mul_1.S deleted file mode 100644 index 48f13fb..0000000 --- a/rts/gmp/mpn/pa64w/mul_1.S +++ /dev/null @@ -1,159 +0,0 @@ -; HP-PA 2.0 64-bit __gmpn_mul_1 -- Multiply a limb vector with a limb and -; store the result in a second limb vector. - -; 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. - -; INPUT PARAMETERS -#define rptr %r26 -#define sptr %r25 -#define size %r24 -#define s2limb %r23 - -; This runs at 11 cycles/limb on a PA8000. It might be possible to make -; it faster, but the PA8000 pipeline is not publically documented and it -; is very complex to reverse engineer - -#define t1 %r19 -#define rlimb %r20 -#define hi %r21 -#define lo %r22 -#define m0 %r28 -#define m1 %r3 -#define cylimb %r29 -#define t3 %r4 -#define t2 %r6 -#define t5 %r23 -#define t4 %r31 - .level 2.0w - .code - .export __gmpn_mul_1,entry -__gmpn_mul_1 - .proc - .callinfo frame=128,no_calls - .entry - std s2limb,-56(%r30) - fldd -56(%r30),%fr5 - ldo 128(%r30),%r30 - add %r0,%r0,cylimb ; clear cy and cylimb - - std %r3,-96(%r30) - std %r4,-88(%r30) - std %r5,-80(%r30) - std %r6,-72(%r30) - depdi,z 1,31,1,%r5 - - fldd 0(sptr),%fr4 - ldo 8(sptr),sptr - - xmpyu %fr5R,%fr4R,%fr6 - fstd %fr6,-128(%r30) - xmpyu %fr5R,%fr4L,%fr7 - fstd %fr7,-120(%r30) - xmpyu %fr5L,%fr4R,%fr8 - fstd %fr8,-112(%r30) - xmpyu %fr5L,%fr4L,%fr9 - fstd %fr9,-104(%r30) - ldd -128(%r30),lo ; lo = low 64 bit of product - ldd -120(%r30),m0 ; m0 = mid0 64 bit of product - ldd -112(%r30),m1 ; m1 = mid1 64 bit of product - ldd -104(%r30),hi ; hi = high 64 bit of product - addib,= -1,%r24,L$end1 - nop - fldd 0(sptr),%fr4 - ldo 8(sptr),sptr - addib,= -1,%r24,L$end2 - nop -L$loop - xmpyu %fr5R,%fr4R,%fr6 - fstd %fr6,-128(%r30) - xmpyu %fr5R,%fr4L,%fr7 - fstd %fr7,-120(%r30) - xmpyu %fr5L,%fr4R,%fr8 - fstd %fr8,-112(%r30) - xmpyu %fr5L,%fr4L,%fr9 - fstd %fr9,-104(%r30) - extrd,u lo,31,32,t1 ; t1 = hi32(lo) - extrd,u lo,63,32,t4 ; t4 = lo32(lo) - add,l m0,t1,t1 ; t1 += m0 - add,l,*nuv m1,t1,t1 ; t1 += m1 - add,l %r5,hi,hi ; propagate carry - extrd,u t1,31,32,t2 ; t2 = hi32(t1) - depd,z t1,31,32,t5 ; t5 = lo32(t1) - add,l t5,t4,t4 ; t4 += lo32(t1) - ldd -128(%r30),lo ; lo = low 64 bit of product - add cylimb,t4,t3 - ldd -120(%r30),m0 ; m0 = mid0 64 bit of product - add,dc t2,hi,cylimb - ldd -112(%r30),m1 ; m1 = mid1 64 bit of product - ldd -104(%r30),hi ; hi = high 64 bit of product - fldd 0(sptr),%fr4 - ldo 8(sptr),sptr - std t3,0(rptr) - addib,<> -1,%r24,L$loop - ldo 8(rptr),rptr -L$end2 - xmpyu %fr5R,%fr4R,%fr6 - fstd %fr6,-128(%r30) - xmpyu %fr5R,%fr4L,%fr7 - fstd %fr7,-120(%r30) - xmpyu %fr5L,%fr4R,%fr8 - fstd %fr8,-112(%r30) - xmpyu %fr5L,%fr4L,%fr9 - fstd %fr9,-104(%r30) - extrd,u lo,31,32,t1 ; t1 = hi32(lo) - extrd,u lo,63,32,t4 ; t4 = lo32(lo) - add,l m0,t1,t1 ; t1 += m0 - add,l,*nuv m1,t1,t1 ; t1 += m0 - add,l %r5,hi,hi ; propagate carry - extrd,u t1,31,32,t2 ; t2 = hi32(t1) - depd,z t1,31,32,t5 ; t5 = lo32(t1) - add,l t5,t4,t4 ; t4 += lo32(t1) - ldd -128(%r30),lo ; lo = low 64 bit of product - add cylimb,t4,t3 - ldd -120(%r30),m0 ; m0 = mid0 64 bit of product - add,dc t2,hi,cylimb - ldd -112(%r30),m1 ; m1 = mid1 64 bit of product - ldd -104(%r30),hi ; hi = high 64 bit of product - std t3,0(rptr) - ldo 8(rptr),rptr -L$end1 - extrd,u lo,31,32,t1 ; t1 = hi32(lo) - extrd,u lo,63,32,t4 ; t2 = lo32(lo) - add,l m0,t1,t1 ; t1 += m0 - add,l,*nuv m1,t1,t1 ; t1 += m0 - add,l %r5,hi,hi ; propagate carry - extrd,u t1,31,32,t2 ; t2 = hi32(t1) - depd,z t1,31,32,t5 ; t5 = lo32(t1) - add,l t5,t4,t4 ; t4 += lo32(t1) - add cylimb,t4,t3 - add,dc t2,hi,cylimb - std t3,0(rptr) - ldo 8(rptr),rptr - - ldd -96(%r30),%r3 - ldd -88(%r30),%r4 - ldd -80(%r30),%r5 - ldd -72(%r30),%r6 - - copy cylimb,%r28 - bve (%r2) - .exit - ldo -128(%r30),%r30 - .procend diff --git a/rts/gmp/mpn/pa64w/rshift.s b/rts/gmp/mpn/pa64w/rshift.s deleted file mode 100644 index 2517cb1..0000000 --- a/rts/gmp/mpn/pa64w/rshift.s +++ /dev/null @@ -1,100 +0,0 @@ -; HP-PA 2.0 __gmpn_rshift -- - -; 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. - - -; INPUT PARAMETERS -; res_ptr gr26 -; s1_ptr gr25 -; size gr24 -; cnt gr23 - -; This runs at 1.5 cycles/limb on PA8000. - - .level 2.0w - .code - .export __gmpn_rshift,entry -__gmpn_rshift - .proc - .callinfo frame=0,args_saved - .entry - - mtsar %r23 - ldd 0(%r25),%r21 - addib,= -1,%r24,L$end - shrpd %r21,%r0,%sar,%r29 ; compute carry out limb - depw,z %r24,31,3,%r28 ; r28 = (size & 7) - sub %r0,%r24,%r22 - depw,z %r22,28,3,%r22 ; r22 = 8 * (-size & 7) - sub %r25,%r22,%r25 ; offset s1_ptr - blr %r28,%r0 ; branch into jump table - sub %r26,%r22,%r26 ; offset res_ptr - b L$0 - nop - b L$1 - copy %r21,%r20 - b L$2 - nop - b L$3 - copy %r21,%r20 - b L$4 - nop - b L$5 - copy %r21,%r20 - b L$6 - nop - b L$7 - copy %r21,%r20 - -L$loop -L$0 ldd 8(%r25),%r20 - shrpd %r20,%r21,%sar,%r21 - std %r21,0(%r26) -L$7 ldd 16(%r25),%r21 - shrpd %r21,%r20,%sar,%r20 - std %r20,8(%r26) -L$6 ldd 24(%r25),%r20 - shrpd %r20,%r21,%sar,%r21 - std %r21,16(%r26) -L$5 ldd 32(%r25),%r21 - shrpd %r21,%r20,%sar,%r20 - std %r20,24(%r26) -L$4 ldd 40(%r25),%r20 - shrpd %r20,%r21,%sar,%r21 - std %r21,32(%r26) -L$3 ldd 48(%r25),%r21 - shrpd %r21,%r20,%sar,%r20 - std %r20,40(%r26) -L$2 ldd 56(%r25),%r20 - shrpd %r20,%r21,%sar,%r21 - std %r21,48(%r26) -L$1 ldd 64(%r25),%r21 - ldo 64(%r25),%r25 - shrpd %r21,%r20,%sar,%r20 - std %r20,56(%r26) - addib,> -8,%r24,L$loop - ldo 64(%r26),%r26 - -L$end shrpd %r0,%r21,%sar,%r21 - std %r21,0(%r26) - bve (%r2) - .exit - copy %r29,%r28 - .procend diff --git a/rts/gmp/mpn/pa64w/sub_n.s b/rts/gmp/mpn/pa64w/sub_n.s deleted file mode 100644 index ad01e24..0000000 --- a/rts/gmp/mpn/pa64w/sub_n.s +++ /dev/null @@ -1,90 +0,0 @@ -; HP-PA 2.0 __gmpn_sub_n -- Subtract two limb vectors of the same length > 0 -; and store difference in a third limb vector. - -; 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. - - -; INPUT PARAMETERS -; res_ptr gr26 -; s1_ptr gr25 -; s2_ptr gr24 -; size gr23 - -; This runs at 2 cycles/limb on PA8000. - - .level 2.0w - .code - .export __gmpn_sub_n,entry -__gmpn_sub_n - .proc - .callinfo frame=0,args_saved - .entry - - sub %r0,%r23,%r22 - depw,z %r22,30,3,%r28 ; r28 = 2 * (-n & 7) - depw,z %r22,28,3,%r22 ; r22 = 8 * (-n & 7) - sub %r25,%r22,%r25 ; offset s1_ptr - sub %r24,%r22,%r24 ; offset s2_ptr - blr %r28,%r0 ; branch into loop - sub %r26,%r22,%r26 ; offset res_ptr and set carry - -L$loop ldd 0(%r25),%r20 - ldd 0(%r24),%r31 - sub,db %r20,%r31,%r20 - std %r20,0(%r26) -L$7 ldd 8(%r25),%r21 - ldd 8(%r24),%r19 - sub,db %r21,%r19,%r21 - std %r21,8(%r26) -L$6 ldd 16(%r25),%r20 - ldd 16(%r24),%r31 - sub,db %r20,%r31,%r20 - std %r20,16(%r26) -L$5 ldd 24(%r25),%r21 - ldd 24(%r24),%r19 - sub,db %r21,%r19,%r21 - std %r21,24(%r26) -L$4 ldd 32(%r25),%r20 - ldd 32(%r24),%r31 - sub,db %r20,%r31,%r20 - std %r20,32(%r26) -L$3 ldd 40(%r25),%r21 - ldd 40(%r24),%r19 - sub,db %r21,%r19,%r21 - std %r21,40(%r26) -L$2 ldd 48(%r25),%r20 - ldd 48(%r24),%r31 - sub,db %r20,%r31,%r20 - std %r20,48(%r26) -L$1 ldd 56(%r25),%r21 - ldo 64(%r25),%r25 - ldd 56(%r24),%r19 - sub,db %r21,%r19,%r21 - std %r21,56(%r26) - ldo 64(%r24),%r24 - addib,> -8,%r23,L$loop - ldo 64(%r26),%r26 - - add,dc %r0,%r0,%r29 - subi 1,%r29,%r29 - bve (%r2) - .exit - copy %r29,%r28 - .procend diff --git a/rts/gmp/mpn/pa64w/submul_1.S b/rts/gmp/mpn/pa64w/submul_1.S deleted file mode 100644 index 294f623..0000000 --- a/rts/gmp/mpn/pa64w/submul_1.S +++ /dev/null @@ -1,171 +0,0 @@ -; HP-PA 2.0 64-bit __gmpn_submul_1 -- Multiply a limb vector with a limb and -; subtract the result from a second limb vector. - -; 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. - -; INPUT PARAMETERS -#define rptr %r26 -#define sptr %r25 -#define size %r24 -#define s2limb %r23 - -; This runs at 11 cycles/limb on a PA8000. It might be possible to make -; it faster, but the PA8000 pipeline is not publically documented and it -; is very complex to reverse engineer - -#define t1 %r19 -#define rlimb %r20 -#define hi %r21 -#define lo %r22 -#define m0 %r28 -#define m1 %r3 -#define cylimb %r29 -#define t3 %r4 -#define t2 %r6 -#define t5 %r23 -#define t4 %r31 - .level 2.0w - .code - .export __gmpn_submul_1,entry -__gmpn_submul_1 - .proc - .callinfo frame=128,no_calls - .entry - std s2limb,-56(%r30) - fldd -56(%r30),%fr5 - ldo 128(%r30),%r30 - add %r0,%r0,cylimb ; clear cy and cylimb - - std %r3,-96(%r30) - std %r4,-88(%r30) - std %r5,-80(%r30) - std %r6,-72(%r30) - depdi,z 1,31,1,%r5 - - fldd 0(sptr),%fr4 - ldo 8(sptr),sptr - - xmpyu %fr5R,%fr4R,%fr6 - fstd %fr6,-128(%r30) - xmpyu %fr5R,%fr4L,%fr7 - fstd %fr7,-120(%r30) - xmpyu %fr5L,%fr4R,%fr8 - fstd %fr8,-112(%r30) - xmpyu %fr5L,%fr4L,%fr9 - fstd %fr9,-104(%r30) - ldd -128(%r30),lo ; lo = low 64 bit of product - ldd -120(%r30),m0 ; m0 = mid0 64 bit of product - ldd -112(%r30),m1 ; m1 = mid1 64 bit of product - ldd -104(%r30),hi ; hi = high 64 bit of product - addib,= -1,%r24,L$end1 - nop - fldd 0(sptr),%fr4 - ldo 8(sptr),sptr - addib,= -1,%r24,L$end2 - nop -L$loop - xmpyu %fr5R,%fr4R,%fr6 - fstd %fr6,-128(%r30) - xmpyu %fr5R,%fr4L,%fr7 - fstd %fr7,-120(%r30) - xmpyu %fr5L,%fr4R,%fr8 - fstd %fr8,-112(%r30) - xmpyu %fr5L,%fr4L,%fr9 - fstd %fr9,-104(%r30) - ldd 0(rptr),rlimb - extrd,u lo,31,32,t1 ; t1 = hi32(lo) - extrd,u lo,63,32,t4 ; t4 = lo32(lo) - add,l m0,t1,t1 ; t1 += m0 - add,l,*nuv m1,t1,t1 ; t1 += m1 - add,l %r5,hi,hi ; propagate carry - extrd,u t1,31,32,t2 ; t2 = hi32(t1) - depd,z t1,31,32,t5 ; t5 = lo32(t1) - add,l t5,t4,t4 ; t4 += lo32(t1) - ldd -128(%r30),lo ; lo = low 64 bit of product - add cylimb,t4,t4 - ldd -120(%r30),m0 ; m0 = mid0 64 bit of product - add,dc t2,hi,cylimb - ldd -112(%r30),m1 ; m1 = mid1 64 bit of product - sub rlimb,t4,t3 - add t4,t3,%r0 - ldd -104(%r30),hi ; hi = high 64 bit of product - add,dc %r0,cylimb,cylimb - fldd 0(sptr),%fr4 - ldo 8(sptr),sptr - std t3,0(rptr) - addib,<> -1,%r24,L$loop - ldo 8(rptr),rptr -L$end2 - xmpyu %fr5R,%fr4R,%fr6 - fstd %fr6,-128(%r30) - xmpyu %fr5R,%fr4L,%fr7 - fstd %fr7,-120(%r30) - xmpyu %fr5L,%fr4R,%fr8 - fstd %fr8,-112(%r30) - xmpyu %fr5L,%fr4L,%fr9 - fstd %fr9,-104(%r30) - ldd 0(rptr),rlimb - extrd,u lo,31,32,t1 ; t1 = hi32(lo) - extrd,u lo,63,32,t4 ; t4 = lo32(lo) - add,l m0,t1,t1 ; t1 += m0 - add,l,*nuv m1,t1,t1 ; t1 += m0 - add,l %r5,hi,hi ; propagate carry - extrd,u t1,31,32,t2 ; t2 = hi32(t1) - depd,z t1,31,32,t5 ; t5 = lo32(t1) - add,l t5,t4,t4 ; t4 += lo32(t1) - ldd -128(%r30),lo ; lo = low 64 bit of product - add cylimb,t4,t4 - ldd -120(%r30),m0 ; m0 = mid0 64 bit of product - add,dc t2,hi,cylimb - ldd -112(%r30),m1 ; m1 = mid1 64 bit of product - sub rlimb,t4,t3 - add t4,t3,%r0 - ldd -104(%r30),hi ; hi = high 64 bit of product - add,dc %r0,cylimb,cylimb - std t3,0(rptr) - ldo 8(rptr),rptr -L$end1 - ldd 0(rptr),rlimb - extrd,u lo,31,32,t1 ; t1 = hi32(lo) - extrd,u lo,63,32,t4 ; t4 = lo32(lo) - add,l m0,t1,t1 ; t1 += m0 - add,l,*nuv m1,t1,t1 ; t1 += m0 - add,l %r5,hi,hi ; propagate carry - extrd,u t1,31,32,t2 ; t2 = hi32(t1) - depd,z t1,31,32,t5 ; t5 = lo32(t1) - add,l t5,t4,t4 ; t4 += lo32(t1) - add cylimb,t4,t4 - add,dc t2,hi,cylimb - sub rlimb,t4,t3 - add t4,t3,%r0 - add,dc %r0,cylimb,cylimb - std t3,0(rptr) - ldo 8(rptr),rptr - - ldd -96(%r30),%r3 - ldd -88(%r30),%r4 - ldd -80(%r30),%r5 - ldd -72(%r30),%r6 - - copy cylimb,%r28 - bve (%r2) - .exit - ldo -128(%r30),%r30 - .procend diff --git a/rts/gmp/mpn/pa64w/udiv_qrnnd.c b/rts/gmp/mpn/pa64w/udiv_qrnnd.c deleted file mode 100644 index 1852913..0000000 --- a/rts/gmp/mpn/pa64w/udiv_qrnnd.c +++ /dev/null @@ -1,117 +0,0 @@ -/* -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" - -#define TWO64 18446744073709551616.0 -#define TWO63 9223372036854775808.0 - -mp_limb_t -#if __STDC__ -__MPN(udiv_qrnnd) (mp_limb_t n1, mp_limb_t n0, mp_limb_t d, mp_limb_t *r) -#else -__MPN(udiv_qrnnd) (n1, n0, d, r) - mp_limb_t n1; - mp_limb_t n0; - mp_limb_t d; - mp_limb_t *r; -#endif -{ - mp_limb_t q1, q2, q; - mp_limb_t p1, p0; - double di, dq; - - di = 1.0 / d; - - /* Generate upper 53 bits of quotient. Be careful here; the `double' - quotient may be rounded to 2^64 which we cannot safely convert back - to a 64-bit integer. */ - dq = (TWO64 * (double) n1 + (double) n0) * di; - if (dq >= TWO64) - q1 = 0xfffffffffffff800L; -#ifndef __GNUC__ - /* Work around HP compiler bug. */ - else if (dq > TWO63) - q1 = (mp_limb_t) (dq - TWO63) + 0x8000000000000000L; -#endif - else - q1 = (mp_limb_t) dq; - - /* Multiply back in order to compare the product to the dividend. */ - umul_ppmm (p1, p0, q1, d); - - /* Was the 53-bit quotient greater that our sought quotient? Test the - sign of the partial remainder to find out. */ - if (n1 < p1 || (n1 == p1 && n0 < p0)) - { - /* 53-bit quotient too large. Partial remainder is negative. - Compute the absolute value of the remainder in n1,,n0. */ - n1 = p1 - (n1 + (p0 < n0)); - n0 = p0 - n0; - - /* Now use the partial remainder as new dividend to compute more bits of - quotient. This is an adjustment for the one we got previously. */ - q2 = (mp_limb_t) ((TWO64 * (double) n1 + (double) n0) * di); - umul_ppmm (p1, p0, q2, d); - - q = q1 - q2; - if (n1 < p1 || (n1 == p1 && n0 <= p0)) - { - n0 = p0 - n0; - } - else - { - n0 = p0 - n0; - n0 += d; - q--; - } - } - else - { - n1 = n1 - (p1 + (n0 < p0)); - n0 = n0 - p0; - - q2 = (mp_limb_t) ((TWO64 * (double) n1 + (double) n0) * di); - umul_ppmm (p1, p0, q2, d); - - q = q1 + q2; - if (n1 < p1 || (n1 == p1 && n0 < p0)) - { - n0 = n0 - p0; - n0 += d; - q--; - } - else - { - n0 = n0 - p0; - if (n0 >= d) - { - n0 -= d; - q++; - } - } - } - - *r = n0; - return q; -} diff --git a/rts/gmp/mpn/pa64w/umul_ppmm.S b/rts/gmp/mpn/pa64w/umul_ppmm.S deleted file mode 100644 index d9fb92b..0000000 --- a/rts/gmp/mpn/pa64w/umul_ppmm.S +++ /dev/null @@ -1,72 +0,0 @@ -; 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. - -#define p0 %r28 -#define p1 %r29 -#define t32 %r19 -#define t0 %r20 -#define t1 %r21 -#define x %r22 -#define m0 %r23 -#define m1 %r24 - .level 2.0w - .code - .export __gmpn_umul_ppmm,entry -__gmpn_umul_ppmm - .proc - .callinfo frame=128,no_calls - .entry - ldo 128(%r30),%r30 - std %r26,-64(%r30) - std %r25,-56(%r30) - - copy %r24,%r31 - - fldd -64(%r30),%fr4 - fldd -56(%r30),%fr5 - - xmpyu %fr5R,%fr4R,%fr6 - fstd %fr6,-128(%r30) - xmpyu %fr5R,%fr4L,%fr7 - fstd %fr7,-120(%r30) - xmpyu %fr5L,%fr4R,%fr8 - fstd %fr8,-112(%r30) - xmpyu %fr5L,%fr4L,%fr9 - fstd %fr9,-104(%r30) - - depdi,z 1,31,1,t32 ; t32 = 2^32 - - ldd -128(%r30),p0 ; lo = low 64 bit of product - ldd -120(%r30),m0 ; m0 = mid0 64 bit of product - ldd -112(%r30),m1 ; m1 = mid1 64 bit of product - ldd -104(%r30),p1 ; hi = high 64 bit of product - - add,l,*nuv m0,m1,x ; x = m1+m0 - add,l t32,p1,p1 ; propagate carry to mid of p1 - depd,z x,31,32,t0 ; lo32(m1+m0) - add t0,p0,p0 - extrd,u x,31,32,t1 ; hi32(m1+m0) - add,dc t1,p1,p1 - - std p0,0(%r31) ; store low half of product - copy p1,%r28 ; return high half of product - bve (%r2) - .exit - ldo -128(%r30),%r30 - .procend diff --git a/rts/gmp/mpn/power/add_n.s b/rts/gmp/mpn/power/add_n.s deleted file mode 100644 index 0f9f48f..0000000 --- a/rts/gmp/mpn/power/add_n.s +++ /dev/null @@ -1,79 +0,0 @@ -# IBM POWER __gmpn_add_n -- Add two limb vectors of equal, non-zero length. - -# Copyright (C) 1992, 1994, 1995, 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. - - -# INPUT PARAMETERS -# res_ptr r3 -# s1_ptr r4 -# s2_ptr r5 -# size r6 - - .toc - .globl __gmpn_add_n - .globl .__gmpn_add_n - .csect __gmpn_add_n[DS] -__gmpn_add_n: - .long .__gmpn_add_n, TOC[tc0], 0 - .csect .text[PR] - .align 2 -.__gmpn_add_n: - andil. 10,6,1 # odd or even number of limbs? - l 8,0(4) # load least significant s1 limb - l 0,0(5) # load least significant s2 limb - cal 3,-4(3) # offset res_ptr, it's updated before it's used - sri 10,6,1 # count for unrolled loop - a 7,0,8 # add least significant limbs, set cy - mtctr 10 # copy count into CTR - beq 0,Leven # branch if even # of limbs (# of limbs >= 2) - -# We have an odd # of limbs. Add the first limbs separately. - cmpi 1,10,0 # is count for unrolled loop zero? - bc 4,6,L1 # bne cr1,L1 (misassembled by gas) - st 7,4(3) - aze 3,10 # use the fact that r10 is zero... - br # return - -# We added least significant limbs. Now reload the next limbs to enter loop. -L1: lu 8,4(4) # load s1 limb and update s1_ptr - lu 0,4(5) # load s2 limb and update s2_ptr - stu 7,4(3) - ae 7,0,8 # add limbs, set cy -Leven: lu 9,4(4) # load s1 limb and update s1_ptr - lu 10,4(5) # load s2 limb and update s2_ptr - bdz Lend # If done, skip loop - -Loop: lu 8,4(4) # load s1 limb and update s1_ptr - lu 0,4(5) # load s2 limb and update s2_ptr - ae 11,9,10 # add previous limbs with cy, set cy - stu 7,4(3) # - lu 9,4(4) # load s1 limb and update s1_ptr - lu 10,4(5) # load s2 limb and update s2_ptr - ae 7,0,8 # add previous limbs with cy, set cy - stu 11,4(3) # - bdn Loop # decrement CTR and loop back - -Lend: ae 11,9,10 # add limbs with cy, set cy - st 7,4(3) # - st 11,8(3) # - lil 3,0 # load cy into ... - aze 3,3 # ... return value register - br diff --git a/rts/gmp/mpn/power/addmul_1.s b/rts/gmp/mpn/power/addmul_1.s deleted file mode 100644 index 8ecc651..0000000 --- a/rts/gmp/mpn/power/addmul_1.s +++ /dev/null @@ -1,122 +0,0 @@ -# IBM POWER __gmpn_addmul_1 -- Multiply a limb vector with a limb and add -# the result to a second limb vector. - -# Copyright (C) 1992, 1994, 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. - - -# INPUT PARAMETERS -# res_ptr r3 -# s1_ptr r4 -# size r5 -# s2_limb r6 - -# The POWER architecture has no unsigned 32x32->64 bit multiplication -# instruction. To obtain that operation, we have to use the 32x32->64 signed -# multiplication instruction, and add the appropriate compensation to the high -# limb of the result. We add the multiplicand if the multiplier has its most -# significant bit set, and we add the multiplier if the multiplicand has its -# most significant bit set. We need to preserve the carry flag between each -# iteration, so we have to compute the compensation carefully (the natural, -# srai+and doesn't work). Since the POWER architecture has a branch unit we -# can branch in zero cycles, so that's how we perform the additions. - - .toc - .globl __gmpn_addmul_1 - .globl .__gmpn_addmul_1 - .csect __gmpn_addmul_1[DS] -__gmpn_addmul_1: - .long .__gmpn_addmul_1, TOC[tc0], 0 - .csect .text[PR] - .align 2 -.__gmpn_addmul_1: - - cal 3,-4(3) - l 0,0(4) - cmpi 0,6,0 - mtctr 5 - mul 9,0,6 - srai 7,0,31 - and 7,7,6 - mfmq 8 - cax 9,9,7 - l 7,4(3) - a 8,8,7 # add res_limb - blt Lneg -Lpos: bdz Lend - -Lploop: lu 0,4(4) - stu 8,4(3) - cmpi 0,0,0 - mul 10,0,6 - mfmq 0 - ae 8,0,9 # low limb + old_cy_limb + old cy - l 7,4(3) - aze 10,10 # propagate cy to new cy_limb - a 8,8,7 # add res_limb - bge Lp0 - cax 10,10,6 # adjust high limb for negative limb from s1 -Lp0: bdz Lend0 - lu 0,4(4) - stu 8,4(3) - cmpi 0,0,0 - mul 9,0,6 - mfmq 0 - ae 8,0,10 - l 7,4(3) - aze 9,9 - a 8,8,7 - bge Lp1 - cax 9,9,6 # adjust high limb for negative limb from s1 -Lp1: bdn Lploop - - b Lend - -Lneg: cax 9,9,0 - bdz Lend -Lnloop: lu 0,4(4) - stu 8,4(3) - cmpi 0,0,0 - mul 10,0,6 - mfmq 7 - ae 8,7,9 - l 7,4(3) - ae 10,10,0 # propagate cy to new cy_limb - a 8,8,7 # add res_limb - bge Ln0 - cax 10,10,6 # adjust high limb for negative limb from s1 -Ln0: bdz Lend0 - lu 0,4(4) - stu 8,4(3) - cmpi 0,0,0 - mul 9,0,6 - mfmq 7 - ae 8,7,10 - l 7,4(3) - ae 9,9,0 # propagate cy to new cy_limb - a 8,8,7 # add res_limb - bge Ln1 - cax 9,9,6 # adjust high limb for negative limb from s1 -Ln1: bdn Lnloop - b Lend - -Lend0: cal 9,0(10) -Lend: st 8,4(3) - aze 3,9 - br diff --git a/rts/gmp/mpn/power/lshift.s b/rts/gmp/mpn/power/lshift.s deleted file mode 100644 index ab71fb7..0000000 --- a/rts/gmp/mpn/power/lshift.s +++ /dev/null @@ -1,56 +0,0 @@ -# IBM POWER __gmpn_lshift -- - -# Copyright (C) 1992, 1994, 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. - - -# INPUT PARAMETERS -# res_ptr r3 -# s_ptr r4 -# size r5 -# cnt r6 - - .toc - .globl __gmpn_lshift - .globl .__gmpn_lshift - .csect __gmpn_lshift[DS] -__gmpn_lshift: - .long .__gmpn_lshift, TOC[tc0], 0 - .csect .text[PR] - .align 2 -.__gmpn_lshift: - sli 0,5,2 - cax 9,3,0 - cax 4,4,0 - sfi 8,6,32 - mtctr 5 # put limb count in CTR loop register - lu 0,-4(4) # read most significant limb - sre 3,0,8 # compute carry out limb, and init MQ register - bdz Lend2 # if just one limb, skip loop - lu 0,-4(4) # read 2:nd most significant limb - sreq 7,0,8 # compute most significant limb of result - bdz Lend # if just two limb, skip loop -Loop: lu 0,-4(4) # load next lower limb - stu 7,-4(9) # store previous result during read latency - sreq 7,0,8 # compute result limb - bdn Loop # loop back until CTR is zero -Lend: stu 7,-4(9) # store 2:nd least significant limb -Lend2: sle 7,0,6 # compute least significant limb - st 7,-4(9) # store it" \ - br diff --git a/rts/gmp/mpn/power/mul_1.s b/rts/gmp/mpn/power/mul_1.s deleted file mode 100644 index 4e08ade..0000000 --- a/rts/gmp/mpn/power/mul_1.s +++ /dev/null @@ -1,109 +0,0 @@ -# IBM POWER __gmpn_mul_1 -- Multiply a limb vector with a limb and store -# the result in a second limb vector. - -# Copyright (C) 1992, 1994, 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. - - -# INPUT PARAMETERS -# res_ptr r3 -# s1_ptr r4 -# size r5 -# s2_limb r6 - -# The POWER architecture has no unsigned 32x32->64 bit multiplication -# instruction. To obtain that operation, we have to use the 32x32->64 signed -# multiplication instruction, and add the appropriate compensation to the high -# limb of the result. We add the multiplicand if the multiplier has its most -# significant bit set, and we add the multiplier if the multiplicand has its -# most significant bit set. We need to preserve the carry flag between each -# iteration, so we have to compute the compensation carefully (the natural, -# srai+and doesn't work). Since the POWER architecture has a branch unit we -# can branch in zero cycles, so that's how we perform the additions. - - .toc - .globl __gmpn_mul_1 - .globl .__gmpn_mul_1 - .csect __gmpn_mul_1[DS] -__gmpn_mul_1: - .long .__gmpn_mul_1, TOC[tc0], 0 - .csect .text[PR] - .align 2 -.__gmpn_mul_1: - - cal 3,-4(3) - l 0,0(4) - cmpi 0,6,0 - mtctr 5 - mul 9,0,6 - srai 7,0,31 - and 7,7,6 - mfmq 8 - ai 0,0,0 # reset carry - cax 9,9,7 - blt Lneg -Lpos: bdz Lend -Lploop: lu 0,4(4) - stu 8,4(3) - cmpi 0,0,0 - mul 10,0,6 - mfmq 0 - ae 8,0,9 - bge Lp0 - cax 10,10,6 # adjust high limb for negative limb from s1 -Lp0: bdz Lend0 - lu 0,4(4) - stu 8,4(3) - cmpi 0,0,0 - mul 9,0,6 - mfmq 0 - ae 8,0,10 - bge Lp1 - cax 9,9,6 # adjust high limb for negative limb from s1 -Lp1: bdn Lploop - b Lend - -Lneg: cax 9,9,0 - bdz Lend -Lnloop: lu 0,4(4) - stu 8,4(3) - cmpi 0,0,0 - mul 10,0,6 - cax 10,10,0 # adjust high limb for negative s2_limb - mfmq 0 - ae 8,0,9 - bge Ln0 - cax 10,10,6 # adjust high limb for negative limb from s1 -Ln0: bdz Lend0 - lu 0,4(4) - stu 8,4(3) - cmpi 0,0,0 - mul 9,0,6 - cax 9,9,0 # adjust high limb for negative s2_limb - mfmq 0 - ae 8,0,10 - bge Ln1 - cax 9,9,6 # adjust high limb for negative limb from s1 -Ln1: bdn Lnloop - b Lend - -Lend0: cal 9,0(10) -Lend: st 8,4(3) - aze 3,9 - br diff --git a/rts/gmp/mpn/power/rshift.s b/rts/gmp/mpn/power/rshift.s deleted file mode 100644 index 65b3945..0000000 --- a/rts/gmp/mpn/power/rshift.s +++ /dev/null @@ -1,54 +0,0 @@ -# IBM POWER __gmpn_rshift -- - -# Copyright (C) 1992, 1994, 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. - - -# INPUT PARAMETERS -# res_ptr r3 -# s_ptr r4 -# size r5 -# cnt r6 - - .toc - .globl __gmpn_rshift - .globl .__gmpn_rshift - .csect __gmpn_rshift[DS] -__gmpn_rshift: - .long .__gmpn_rshift, TOC[tc0], 0 - .csect .text[PR] - .align 2 -.__gmpn_rshift: - sfi 8,6,32 - mtctr 5 # put limb count in CTR loop register - l 0,0(4) # read least significant limb - ai 9,3,-4 # adjust res_ptr since it's offset in the stu:s - sle 3,0,8 # compute carry limb, and init MQ register - bdz Lend2 # if just one limb, skip loop - lu 0,4(4) # read 2:nd least significant limb - sleq 7,0,8 # compute least significant limb of result - bdz Lend # if just two limb, skip loop -Loop: lu 0,4(4) # load next higher limb - stu 7,4(9) # store previous result during read latency - sleq 7,0,8 # compute result limb - bdn Loop # loop back until CTR is zero -Lend: stu 7,4(9) # store 2:nd most significant limb -Lend2: sre 7,0,6 # compute most significant limb - st 7,4(9) # store it" \ - br diff --git a/rts/gmp/mpn/power/sdiv.s b/rts/gmp/mpn/power/sdiv.s deleted file mode 100644 index 81da622..0000000 --- a/rts/gmp/mpn/power/sdiv.s +++ /dev/null @@ -1,34 +0,0 @@ -# Copyright (C) 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. - - .toc - .globl __sdiv_qrnnd - .globl .__sdiv_qrnnd - .csect __sdiv_qrnnd[DS] -__sdiv_qrnnd: - .long .__sdiv_qrnnd, TOC[tc0], 0 - .csect .text[PR] - .align 2 -.__sdiv_qrnnd: - mtmq 5 - div 0,4,6 - mfmq 9 - st 9,0(3) - mr 3,0 - br diff --git a/rts/gmp/mpn/power/sub_n.s b/rts/gmp/mpn/power/sub_n.s deleted file mode 100644 index aa09cf5..0000000 --- a/rts/gmp/mpn/power/sub_n.s +++ /dev/null @@ -1,80 +0,0 @@ -# IBM POWER __gmpn_sub_n -- Subtract two limb vectors of equal, non-zero length. - -# Copyright (C) 1992, 1994, 1995, 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. - - -# INPUT PARAMETERS -# res_ptr r3 -# s1_ptr r4 -# s2_ptr r5 -# size r6 - - .toc - .globl __gmpn_sub_n - .globl .__gmpn_sub_n - .csect __gmpn_sub_n[DS] -__gmpn_sub_n: - .long .__gmpn_sub_n, TOC[tc0], 0 - .csect .text[PR] - .align 2 -.__gmpn_sub_n: - andil. 10,6,1 # odd or even number of limbs? - l 8,0(4) # load least significant s1 limb - l 0,0(5) # load least significant s2 limb - cal 3,-4(3) # offset res_ptr, it's updated before it's used - sri 10,6,1 # count for unrolled loop - sf 7,0,8 # subtract least significant limbs, set cy - mtctr 10 # copy count into CTR - beq 0,Leven # branch if even # of limbs (# of limbs >= 2) - -# We have an odd # of limbs. Add the first limbs separately. - cmpi 1,10,0 # is count for unrolled loop zero? - bc 4,6,L1 # bne cr1,L1 (misassembled by gas) - st 7,4(3) - sfe 3,0,0 # load !cy into ... - sfi 3,3,0 # ... return value register - br # return - -# We added least significant limbs. Now reload the next limbs to enter loop. -L1: lu 8,4(4) # load s1 limb and update s1_ptr - lu 0,4(5) # load s2 limb and update s2_ptr - stu 7,4(3) - sfe 7,0,8 # subtract limbs, set cy -Leven: lu 9,4(4) # load s1 limb and update s1_ptr - lu 10,4(5) # load s2 limb and update s2_ptr - bdz Lend # If done, skip loop - -Loop: lu 8,4(4) # load s1 limb and update s1_ptr - lu 0,4(5) # load s2 limb and update s2_ptr - sfe 11,10,9 # subtract previous limbs with cy, set cy - stu 7,4(3) # - lu 9,4(4) # load s1 limb and update s1_ptr - lu 10,4(5) # load s2 limb and update s2_ptr - sfe 7,0,8 # subtract previous limbs with cy, set cy - stu 11,4(3) # - bdn Loop # decrement CTR and loop back - -Lend: sfe 11,10,9 # subtract limbs with cy, set cy - st 7,4(3) # - st 11,8(3) # - sfe 3,0,0 # load !cy into ... - sfi 3,3,0 # ... return value register - br diff --git a/rts/gmp/mpn/power/submul_1.s b/rts/gmp/mpn/power/submul_1.s deleted file mode 100644 index bc01b7c..0000000 --- a/rts/gmp/mpn/power/submul_1.s +++ /dev/null @@ -1,127 +0,0 @@ -# IBM POWER __gmpn_submul_1 -- Multiply a limb vector with a limb and subtract -# the result from a second limb vector. - -# Copyright (C) 1992, 1994, 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. - - -# INPUT PARAMETERS -# res_ptr r3 -# s1_ptr r4 -# size r5 -# s2_limb r6 - -# The POWER architecture has no unsigned 32x32->64 bit multiplication -# instruction. To obtain that operation, we have to use the 32x32->64 signed -# multiplication instruction, and add the appropriate compensation to the high -# limb of the result. We add the multiplicand if the multiplier has its most -# significant bit set, and we add the multiplier if the multiplicand has its -# most significant bit set. We need to preserve the carry flag between each -# iteration, so we have to compute the compensation carefully (the natural, -# srai+and doesn't work). Since the POWER architecture has a branch unit we -# can branch in zero cycles, so that's how we perform the additions. - - .toc - .globl __gmpn_submul_1 - .globl .__gmpn_submul_1 - .csect __gmpn_submul_1[DS] -__gmpn_submul_1: - .long .__gmpn_submul_1, TOC[tc0], 0 - .csect .text[PR] - .align 2 -.__gmpn_submul_1: - - cal 3,-4(3) - l 0,0(4) - cmpi 0,6,0 - mtctr 5 - mul 9,0,6 - srai 7,0,31 - and 7,7,6 - mfmq 11 - cax 9,9,7 - l 7,4(3) - sf 8,11,7 # add res_limb - a 11,8,11 # invert cy (r11 is junk) - blt Lneg -Lpos: bdz Lend - -Lploop: lu 0,4(4) - stu 8,4(3) - cmpi 0,0,0 - mul 10,0,6 - mfmq 0 - ae 11,0,9 # low limb + old_cy_limb + old cy - l 7,4(3) - aze 10,10 # propagate cy to new cy_limb - sf 8,11,7 # add res_limb - a 11,8,11 # invert cy (r11 is junk) - bge Lp0 - cax 10,10,6 # adjust high limb for negative limb from s1 -Lp0: bdz Lend0 - lu 0,4(4) - stu 8,4(3) - cmpi 0,0,0 - mul 9,0,6 - mfmq 0 - ae 11,0,10 - l 7,4(3) - aze 9,9 - sf 8,11,7 - a 11,8,11 # invert cy (r11 is junk) - bge Lp1 - cax 9,9,6 # adjust high limb for negative limb from s1 -Lp1: bdn Lploop - - b Lend - -Lneg: cax 9,9,0 - bdz Lend -Lnloop: lu 0,4(4) - stu 8,4(3) - cmpi 0,0,0 - mul 10,0,6 - mfmq 7 - ae 11,7,9 - l 7,4(3) - ae 10,10,0 # propagate cy to new cy_limb - sf 8,11,7 # add res_limb - a 11,8,11 # invert cy (r11 is junk) - bge Ln0 - cax 10,10,6 # adjust high limb for negative limb from s1 -Ln0: bdz Lend0 - lu 0,4(4) - stu 8,4(3) - cmpi 0,0,0 - mul 9,0,6 - mfmq 7 - ae 11,7,10 - l 7,4(3) - ae 9,9,0 # propagate cy to new cy_limb - sf 8,11,7 # add res_limb - a 11,8,11 # invert cy (r11 is junk) - bge Ln1 - cax 9,9,6 # adjust high limb for negative limb from s1 -Ln1: bdn Lnloop - b Lend - -Lend0: cal 9,0(10) -Lend: st 8,4(3) - aze 3,9 - br diff --git a/rts/gmp/mpn/power/umul.s b/rts/gmp/mpn/power/umul.s deleted file mode 100644 index 8c77496..0000000 --- a/rts/gmp/mpn/power/umul.s +++ /dev/null @@ -1,38 +0,0 @@ -# Copyright (C) 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. - - .toc - .globl __umul_ppmm - .globl .__umul_ppmm - .csect __umul_ppmm[DS] -__umul_ppmm: - .long .__umul_ppmm, TOC[tc0], 0 - .csect .text[PR] - .align 2 -.__umul_ppmm: - mul 9,4,5 - srai 0,4,31 - and 0,0,5 - srai 5,5,31 - and 5,5,4 - cax 0,0,5 - mfmq 11 - st 11,0(3) - cax 3,9,0 - br diff --git a/rts/gmp/mpn/powerpc32/add_n.asm b/rts/gmp/mpn/powerpc32/add_n.asm deleted file mode 100644 index 81ed04b..0000000 --- a/rts/gmp/mpn/powerpc32/add_n.asm +++ /dev/null @@ -1,61 +0,0 @@ -dnl PowerPC-32 mpn_add_n -- Add two limb vectors of the same length > 0 and -dnl store sum in a third limb vector. - -dnl Copyright (C) 1995, 1997, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published by -dnl the Free Software Foundation; either version 2.1 of the License, or (at your -dnl option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - - -dnl INPUT PARAMETERS -dnl res_ptr r3 -dnl s1_ptr r4 -dnl s2_ptr r5 -dnl size r6 - -include(`../config.m4') - -ASM_START() -PROLOGUE(mpn_add_n) - mtctr r6 C copy size into CTR - addic r0,r0,0 C clear cy - lwz r8,0(r4) C load least significant s1 limb - lwz r0,0(r5) C load least significant s2 limb - addi r3,r3,-4 C offset res_ptr, it's updated before it's used - bdz .Lend C If done, skip loop -.Loop: lwz r9,4(r4) C load s1 limb - lwz r10,4(r5) C load s2 limb - adde r7,r0,r8 C add limbs with cy, set cy - stw r7,4(r3) C store result limb - bdz .Lexit C decrement CTR and exit if done - lwzu r8,8(r4) C load s1 limb and update s1_ptr - lwzu r0,8(r5) C load s2 limb and update s2_ptr - adde r7,r10,r9 C add limbs with cy, set cy - stwu r7,8(r3) C store result limb and update res_ptr - bdnz .Loop C decrement CTR and loop back - -.Lend: adde r7,r0,r8 - stw r7,4(r3) C store ultimate result limb - li r3,0 C load cy into ... - addze r3,r3 C ... return value register - blr -.Lexit: adde r7,r10,r9 - stw r7,8(r3) - li r3,0 C load cy into ... - addze r3,r3 C ... return value register - blr -EPILOGUE(mpn_add_n) diff --git a/rts/gmp/mpn/powerpc32/addmul_1.asm b/rts/gmp/mpn/powerpc32/addmul_1.asm deleted file mode 100644 index 3ef75b1..0000000 --- a/rts/gmp/mpn/powerpc32/addmul_1.asm +++ /dev/null @@ -1,124 +0,0 @@ -dnl PowerPC-32 mpn_addmul_1 -- Multiply a limb vector with a limb and add -dnl the result to a second limb vector. - -dnl Copyright (C) 1995, 1997, 1998, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published by -dnl the Free Software Foundation; either version 2.1 of the License, or (at your -dnl option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - - -dnl INPUT PARAMETERS -dnl res_ptr r3 -dnl s1_ptr r4 -dnl size r5 -dnl s2_limb r6 - -dnl This is optimized for the PPC604. It has not been tested on PPC601, PPC603 -dnl or PPC750 since I don't have access to any such machines. - -include(`../config.m4') - -ASM_START() -PROLOGUE(mpn_addmul_1) - cmpi cr0,r5,9 C more than 9 limbs? - bgt cr0,.Lbig C branch if more than 9 limbs - - mtctr r5 - lwz r0,0(r4) - mullw r7,r0,r6 - mulhwu r10,r0,r6 - lwz r9,0(r3) - addc r8,r7,r9 - addi r3,r3,-4 - bdz .Lend -.Lloop: - lwzu r0,4(r4) - stwu r8,4(r3) - mullw r8,r0,r6 - adde r7,r8,r10 - mulhwu r10,r0,r6 - lwz r9,4(r3) - addze r10,r10 - addc r8,r7,r9 - bdnz .Lloop -.Lend: stw r8,4(r3) - addze r3,r10 - blr - -.Lbig: stmw r30,-32(r1) - addi r5,r5,-1 - srwi r0,r5,2 - mtctr r0 - - lwz r7,0(r4) - mullw r8,r7,r6 - mulhwu r0,r7,r6 - lwz r7,0(r3) - addc r8,r8,r7 - stw r8,0(r3) - -.LloopU: - lwz r7,4(r4) - lwz r12,8(r4) - lwz r30,12(r4) - lwzu r31,16(r4) - mullw r8,r7,r6 - mullw r9,r12,r6 - mullw r10,r30,r6 - mullw r11,r31,r6 - adde r8,r8,r0 C add cy_limb - mulhwu r0,r7,r6 - lwz r7,4(r3) - adde r9,r9,r0 - mulhwu r0,r12,r6 - lwz r12,8(r3) - adde r10,r10,r0 - mulhwu r0,r30,r6 - lwz r30,12(r3) - adde r11,r11,r0 - mulhwu r0,r31,r6 - lwz r31,16(r3) - addze r0,r0 C new cy_limb - addc r8,r8,r7 - stw r8,4(r3) - adde r9,r9,r12 - stw r9,8(r3) - adde r10,r10,r30 - stw r10,12(r3) - adde r11,r11,r31 - stwu r11,16(r3) - bdnz .LloopU - - andi. r31,r5,3 - mtctr r31 - beq cr0,.Lendx - -.LloopE: - lwzu r7,4(r4) - mullw r8,r7,r6 - adde r8,r8,r0 C add cy_limb - mulhwu r0,r7,r6 - lwz r7,4(r3) - addze r0,r0 C new cy_limb - addc r8,r8,r7 - stwu r8,4(r3) - bdnz .LloopE -.Lendx: - addze r3,r0 - lmw r30,-32(r1) - blr -EPILOGUE(mpn_addmul_1) diff --git a/rts/gmp/mpn/powerpc32/aix.m4 b/rts/gmp/mpn/powerpc32/aix.m4 deleted file mode 100644 index 2bd8425..0000000 --- a/rts/gmp/mpn/powerpc32/aix.m4 +++ /dev/null @@ -1,39 +0,0 @@ -divert(-1) -dnl m4 macros for AIX 32-bit assembly. - -dnl Copyright (C) 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - -define(`ASM_START', - `.toc') - -define(`PROLOGUE', - ` - .globl $1 - .globl .$1 - .csect $1[DS],2 -$1: - .long .$1, TOC[tc0], 0 - .csect .text[PR] - .align 2 -.$1:') - -define(`EPILOGUE', `') - -divert diff --git a/rts/gmp/mpn/powerpc32/gmp-mparam.h b/rts/gmp/mpn/powerpc32/gmp-mparam.h deleted file mode 100644 index b283185..0000000 --- a/rts/gmp/mpn/powerpc32/gmp-mparam.h +++ /dev/null @@ -1,66 +0,0 @@ -/* gmp-mparam.h -- Compiler/machine parameter header file. - -Copyright (C) 1991, 1993, 1994, 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. */ - -#define BITS_PER_MP_LIMB 32 -#define BYTES_PER_MP_LIMB 4 -#define BITS_PER_LONGINT 32 -#define BITS_PER_INT 32 -#define BITS_PER_SHORTINT 16 -#define BITS_PER_CHAR 8 - -/* These values are for the 604. Presumably, these should be considerably - different for the 603 and 750 that have much slower multiply - instructions. */ - -/* Generated by tuneup.c, 2000-05-26. */ - -#ifndef KARATSUBA_MUL_THRESHOLD -#define KARATSUBA_MUL_THRESHOLD 26 /* tuneup says 20 */ -#endif -#ifndef TOOM3_MUL_THRESHOLD -#define TOOM3_MUL_THRESHOLD 228 -#endif - -#ifndef KARATSUBA_SQR_THRESHOLD -#define KARATSUBA_SQR_THRESHOLD 46 /* tuneup says 44 */ -#endif -#ifndef TOOM3_SQR_THRESHOLD -#define TOOM3_SQR_THRESHOLD 262 -#endif - -#ifndef BZ_THRESHOLD -#define BZ_THRESHOLD 52 -#endif - -#ifndef FIB_THRESHOLD -#define FIB_THRESHOLD 86 -#endif - -#ifndef POWM_THRESHOLD -#define POWM_THRESHOLD 23 -#endif - -#ifndef GCD_ACCEL_THRESHOLD -#define GCD_ACCEL_THRESHOLD 7 -#endif -#ifndef GCDEXT_THRESHOLD -#define GCDEXT_THRESHOLD 53 -#endif diff --git a/rts/gmp/mpn/powerpc32/lshift.asm b/rts/gmp/mpn/powerpc32/lshift.asm deleted file mode 100644 index 73a8543..0000000 --- a/rts/gmp/mpn/powerpc32/lshift.asm +++ /dev/null @@ -1,145 +0,0 @@ -dnl PowerPC-32 mpn_lshift -- Shift a number left. - -dnl Copyright (C) 1995, 1998, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published by -dnl the Free Software Foundation; either version 2.1 of the License, or (at your -dnl option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - - -dnl INPUT PARAMETERS -dnl res_ptr r3 -dnl s1_ptr r4 -dnl size r5 -dnl cnt r6 - -include(`../config.m4') - -ASM_START() -PROLOGUE(mpn_lshift) - cmpi cr0,r5,12 C more than 12 limbs? - slwi r0,r5,2 - add r4,r4,r0 C make r4 point at end of s1 - add r7,r3,r0 C make r7 point at end of res - bgt .LBIG C branch if more than 12 limbs - - mtctr r5 C copy size into CTR - subfic r8,r6,32 - lwzu r11,-4(r4) C load first s1 limb - srw r3,r11,r8 C compute function return value - bdz .Lend1 - -.Loop: lwzu r10,-4(r4) - slw r9,r11,r6 - srw r12,r10,r8 - or r9,r9,r12 - stwu r9,-4(r7) - bdz .Lend2 - lwzu r11,-4(r4) - slw r9,r10,r6 - srw r12,r11,r8 - or r9,r9,r12 - stwu r9,-4(r7) - bdnz .Loop - -.Lend1: slw r0,r11,r6 - stw r0,-4(r7) - blr -.Lend2: slw r0,r10,r6 - stw r0,-4(r7) - blr - -.LBIG: - stmw r24,-32(r1) C save registers we are supposed to preserve - lwzu r9,-4(r4) - subfic r8,r6,32 - srw r3,r9,r8 C compute function return value - slw r0,r9,r6 - addi r5,r5,-1 - - andi. r10,r5,3 C count for spill loop - beq .Le - mtctr r10 - lwzu r28,-4(r4) - bdz .Lxe0 - -.Loop0: slw r12,r28,r6 - srw r24,r28,r8 - lwzu r28,-4(r4) - or r24,r0,r24 - stwu r24,-4(r7) - mr r0,r12 - bdnz .Loop0 C taken at most once! - -.Lxe0: slw r12,r28,r6 - srw r24,r28,r8 - or r24,r0,r24 - stwu r24,-4(r7) - mr r0,r12 - -.Le: srwi r5,r5,2 C count for unrolled loop - addi r5,r5,-1 - mtctr r5 - lwz r28,-4(r4) - lwz r29,-8(r4) - lwz r30,-12(r4) - lwzu r31,-16(r4) - -.LoopU: slw r9,r28,r6 - srw r24,r28,r8 - lwz r28,-4(r4) - slw r10,r29,r6 - srw r25,r29,r8 - lwz r29,-8(r4) - slw r11,r30,r6 - srw r26,r30,r8 - lwz r30,-12(r4) - slw r12,r31,r6 - srw r27,r31,r8 - lwzu r31,-16(r4) - or r24,r0,r24 - stw r24,-4(r7) - or r25,r9,r25 - stw r25,-8(r7) - or r26,r10,r26 - stw r26,-12(r7) - or r27,r11,r27 - stwu r27,-16(r7) - mr r0,r12 - bdnz .LoopU - - slw r9,r28,r6 - srw r24,r28,r8 - slw r10,r29,r6 - srw r25,r29,r8 - slw r11,r30,r6 - srw r26,r30,r8 - slw r12,r31,r6 - srw r27,r31,r8 - or r24,r0,r24 - stw r24,-4(r7) - or r25,r9,r25 - stw r25,-8(r7) - or r26,r10,r26 - stw r26,-12(r7) - or r27,r11,r27 - stwu r27,-16(r7) - mr r0,r12 - - stw r0,-4(r7) - lmw r24,-32(r1) C restore registers - blr -EPILOGUE(mpn_lshift) diff --git a/rts/gmp/mpn/powerpc32/mul_1.asm b/rts/gmp/mpn/powerpc32/mul_1.asm deleted file mode 100644 index ec878b5..0000000 --- a/rts/gmp/mpn/powerpc32/mul_1.asm +++ /dev/null @@ -1,86 +0,0 @@ -dnl PowerPC-32 mpn_mul_1 -- Multiply a limb vector with a limb and store -dnl the result in a second limb vector. - -dnl Copyright (C) 1995, 1997, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published by -dnl the Free Software Foundation; either version 2.1 of the License, or (at your -dnl option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - - -dnl INPUT PARAMETERS -dnl res_ptr r3 -dnl s1_ptr r4 -dnl size r5 -dnl s2_limb r6 - -dnl This is optimized for the PPC604 but it runs decently even on PPC601. It -dnl has not been tested on a PPC603 since I don't have access to any such -dnl machines. - -include(`../config.m4') - -ASM_START() -PROLOGUE(mpn_mul_1) - mtctr r5 - addi r3,r3,-4 C adjust res_ptr, it's offset before it's used - li r12,0 C clear upper product reg - addic r0,r0,0 C clear cy -C Start software pipeline - lwz r8,0(r4) - bdz .Lend3 - stmw r30,-8(r1) C save registers we are supposed to preserve - lwzu r9,4(r4) - mullw r11,r8,r6 - mulhwu r0,r8,r6 - bdz .Lend1 -C Software pipelined main loop -.Loop: lwz r8,4(r4) - mullw r10,r9,r6 - adde r30,r11,r12 - mulhwu r12,r9,r6 - stw r30,4(r3) - bdz .Lend2 - lwzu r9,8(r4) - mullw r11,r8,r6 - adde r31,r10,r0 - mulhwu r0,r8,r6 - stwu r31,8(r3) - bdnz .Loop -C Finish software pipeline -.Lend1: mullw r10,r9,r6 - adde r30,r11,r12 - mulhwu r12,r9,r6 - stw r30,4(r3) - adde r31,r10,r0 - stwu r31,8(r3) - addze r3,r12 - lmw r30,-8(r1) C restore registers from stack - blr -.Lend2: mullw r11,r8,r6 - adde r31,r10,r0 - mulhwu r0,r8,r6 - stwu r31,8(r3) - adde r30,r11,r12 - stw r30,4(r3) - addze r3,r0 - lmw r30,-8(r1) C restore registers from stack - blr -.Lend3: mullw r11,r8,r6 - stw r11,4(r3) - mulhwu r3,r8,r6 - blr -EPILOGUE(mpn_mul_1) diff --git a/rts/gmp/mpn/powerpc32/regmap.m4 b/rts/gmp/mpn/powerpc32/regmap.m4 deleted file mode 100644 index 978f189..0000000 --- a/rts/gmp/mpn/powerpc32/regmap.m4 +++ /dev/null @@ -1,34 +0,0 @@ -divert(-1) - -dnl Copyright (C) 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -dnl Map register names r0, r1, etc, to just `0', `1', etc. -dnl This is needed on all systems but NeXT, Rhapsody, and MacOS-X -forloop(i,0,31, -`define(`r'i,i)' -) - -dnl Likewise for cr0, cr1, etc. -forloop(i,0,7, -`define(`cr'i,i)' -) - -divert diff --git a/rts/gmp/mpn/powerpc32/rshift.asm b/rts/gmp/mpn/powerpc32/rshift.asm deleted file mode 100644 index a09ba04..0000000 --- a/rts/gmp/mpn/powerpc32/rshift.asm +++ /dev/null @@ -1,60 +0,0 @@ -dnl PowerPC-32 mpn_rshift -- Shift a number right. - -dnl Copyright (C) 1995, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published by -dnl the Free Software Foundation; either version 2.1 of the License, or (at your -dnl option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - - -dnl INPUT PARAMETERS -dnl res_ptr r3 -dnl s1_ptr r4 -dnl size r5 -dnl cnt r6 - -include(`../config.m4') - -ASM_START() -PROLOGUE(mpn_rshift) - mtctr r5 C copy size into CTR - addi r7,r3,-4 C move adjusted res_ptr to free return reg - subfic r8,r6,32 - lwz r11,0(r4) C load first s1 limb - slw r3,r11,r8 C compute function return value - bdz .Lend1 - -.Loop: lwzu r10,4(r4) - srw r9,r11,r6 - slw r12,r10,r8 - or r9,r9,r12 - stwu r9,4(r7) - bdz .Lend2 - lwzu r11,4(r4) - srw r9,r10,r6 - slw r12,r11,r8 - or r9,r9,r12 - stwu r9,4(r7) - bdnz .Loop - -.Lend1: srw r0,r11,r6 - stw r0,4(r7) - blr - -.Lend2: srw r0,r10,r6 - stw r0,4(r7) - blr -EPILOGUE(mpn_rshift) diff --git a/rts/gmp/mpn/powerpc32/sub_n.asm b/rts/gmp/mpn/powerpc32/sub_n.asm deleted file mode 100644 index b04b419..0000000 --- a/rts/gmp/mpn/powerpc32/sub_n.asm +++ /dev/null @@ -1,61 +0,0 @@ -dnl PowerPC-32 mpn_sub_n -- Subtract two limb vectors of the same length > 0 -dnl and store difference in a third limb vector. - -dnl Copyright (C) 1995, 1997, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published by -dnl the Free Software Foundation; either version 2.1 of the License, or (at your -dnl option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - - -dnl INPUT PARAMETERS -dnl res_ptr r3 -dnl s1_ptr r4 -dnl s2_ptr r5 -dnl size r6 - -include(`../config.m4') - -ASM_START() -PROLOGUE(mpn_sub_n) - mtctr r6 C copy size into CTR - addic r0,r6,-1 C set cy - lwz r8,0(r4) C load least significant s1 limb - lwz r0,0(r5) C load least significant s2 limb - addi r3,r3,-4 C offset res_ptr, it's updated before it's used - bdz .Lend C If done, skip loop -.Loop: lwz r9,4(r4) C load s1 limb - lwz r10,4(r5) C load s2 limb - subfe r7,r0,r8 C subtract limbs with cy, set cy - stw r7,4(r3) C store result limb - bdz .Lexit C decrement CTR and exit if done - lwzu r8,8(r4) C load s1 limb and update s1_ptr - lwzu r0,8(r5) C load s2 limb and update s2_ptr - subfe r7,r10,r9 C subtract limbs with cy, set cy - stwu r7,8(r3) C store result limb and update res_ptr - bdnz .Loop C decrement CTR and loop back - -.Lend: subfe r7,r0,r8 - stw r7,4(r3) C store ultimate result limb - subfe r3,r0,r0 C load !cy into ... - subfic r3,r3,0 C ... return value register - blr -.Lexit: subfe r7,r10,r9 - stw r7,8(r3) - subfe r3,r0,r0 C load !cy into ... - subfic r3,r3,0 C ... return value register - blr -EPILOGUE(mpn_sub_n) diff --git a/rts/gmp/mpn/powerpc32/submul_1.asm b/rts/gmp/mpn/powerpc32/submul_1.asm deleted file mode 100644 index a129e9f..0000000 --- a/rts/gmp/mpn/powerpc32/submul_1.asm +++ /dev/null @@ -1,130 +0,0 @@ -dnl PowerPC-32 mpn_submul_1 -- Multiply a limb vector with a limb and subtract -dnl the result from a second limb vector. - -dnl Copyright (C) 1995, 1997, 1998, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published by -dnl the Free Software Foundation; either version 2.1 of the License, or (at your -dnl option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - - -dnl INPUT PARAMETERS -dnl res_ptr r3 -dnl s1_ptr r4 -dnl size r5 -dnl s2_limb r6 - -dnl This is optimized for the PPC604. It has not been tested on PPC601, PPC603 -dnl or PPC750 since I don't have access to any such machines. - -include(`../config.m4') - -ASM_START() -PROLOGUE(mpn_submul_1) - cmpi cr0,r5,9 C more than 9 limbs? - bgt cr0,.Lbig C branch if more than 9 limbs - - mtctr r5 - lwz r0,0(r4) - mullw r7,r0,r6 - mulhwu r10,r0,r6 - lwz r9,0(r3) - subfc r8,r7,r9 - addc r7,r7,r8 C invert cy (r7 is junk) - addi r3,r3,-4 - bdz .Lend -.Lloop: - lwzu r0,4(r4) - stwu r8,4(r3) - mullw r8,r0,r6 - adde r7,r8,r10 - mulhwu r10,r0,r6 - lwz r9,4(r3) - addze r10,r10 - subfc r8,r7,r9 - addc r7,r7,r8 C invert cy (r7 is junk) - bdnz .Lloop -.Lend: stw r8,4(r3) - addze r3,r10 - blr - -.Lbig: stmw r30,-32(r1) - addi r5,r5,-1 - srwi r0,r5,2 - mtctr r0 - - lwz r7,0(r4) - mullw r8,r7,r6 - mulhwu r0,r7,r6 - lwz r7,0(r3) - subfc r7,r8,r7 - addc r8,r8,r7 - stw r7,0(r3) - -.LloopU: - lwz r7,4(r4) - lwz r12,8(r4) - lwz r30,12(r4) - lwzu r31,16(r4) - mullw r8,r7,r6 - mullw r9,r12,r6 - mullw r10,r30,r6 - mullw r11,r31,r6 - adde r8,r8,r0 C add cy_limb - mulhwu r0,r7,r6 - lwz r7,4(r3) - adde r9,r9,r0 - mulhwu r0,r12,r6 - lwz r12,8(r3) - adde r10,r10,r0 - mulhwu r0,r30,r6 - lwz r30,12(r3) - adde r11,r11,r0 - mulhwu r0,r31,r6 - lwz r31,16(r3) - addze r0,r0 C new cy_limb - subfc r7,r8,r7 - stw r7,4(r3) - subfe r12,r9,r12 - stw r12,8(r3) - subfe r30,r10,r30 - stw r30,12(r3) - subfe r31,r11,r31 - stwu r31,16(r3) - subfe r11,r11,r11 C invert ... - addic r11,r11,1 C ... carry - bdnz .LloopU - - andi. r31,r5,3 - mtctr r31 - beq cr0,.Lendx - -.LloopE: - lwzu r7,4(r4) - mullw r8,r7,r6 - adde r8,r8,r0 C add cy_limb - mulhwu r0,r7,r6 - lwz r7,4(r3) - addze r0,r0 C new cy_limb - subfc r7,r8,r7 - addc r8,r8,r7 - stwu r7,4(r3) - bdnz .LloopE -.Lendx: - addze r3,r0 - lmw r30,-32(r1) - blr -EPILOGUE(mpn_submul_1) diff --git a/rts/gmp/mpn/powerpc32/umul.asm b/rts/gmp/mpn/powerpc32/umul.asm deleted file mode 100644 index eeaa0a4..0000000 --- a/rts/gmp/mpn/powerpc32/umul.asm +++ /dev/null @@ -1,32 +0,0 @@ -dnl PowerPC-32 umul_ppmm -- support for longlong.h - -dnl Copyright (C) 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published by -dnl the Free Software Foundation; either version 2.1 of the License, or (at your -dnl option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - - -include(`../config.m4') - -ASM_START() -PROLOGUE(mpn_umul_ppmm) - mullw 0,4,5 - mulhwu 9,4,5 - stw 0,0(3) - mr 3,9 - blr -EPILOGUE(mpn_umul_ppmm) diff --git a/rts/gmp/mpn/powerpc64/README b/rts/gmp/mpn/powerpc64/README deleted file mode 100644 index c779276..0000000 --- a/rts/gmp/mpn/powerpc64/README +++ /dev/null @@ -1,36 +0,0 @@ -PPC630 (aka Power3) pipeline information: - -Decoding is 4-way and issue is 8-way with some out-of-order capability. -LS1 - ld/st unit 1 -LS2 - ld/st unit 2 -FXU1 - integer unit 1, handles any simple integer instructions -FXU2 - integer unit 2, handles any simple integer instructions -FXU3 - integer unit 3, handles integer multiply and divide -FPU1 - floating-point unit 1 -FPU2 - floating-point unit 2 - -Memory: Any two memory operations can issue, but memory subsystem - can sustain just one store per cycle. -Simple integer: 2 operations (such as add, rl*) -Integer multiply: 1 operation every 9th cycle worst case; exact timing depends - on 2nd operand most significant bit position (10 bits per - cycle). Multiply unit is not pipelined, only one multiply - operation in progress is allowed. -Integer divide: ? -Floating-point: Any plain 2 arithmetic instructions (such as fmul, fadd, fmadd) - Latency = 4. -Floating-point divide: - ? -Floating-point square root: - ? - -Best possible times for the main loops: -shift: 1.5 cycles limited by integer unit contention. - With 63 special loops, one for each shift count, we could - reduce the needed integer instructions to 2, which would - reduce the best possible time to 1 cycle. -add/sub: 1.5 cycles, limited by ld/st unit contention. -mul: 18 cycles (average) unless floating-point operations are used, - but that would only help for multiplies of perhaps 10 and more - limbs. -addmul/submul:Same situation as for mul. diff --git a/rts/gmp/mpn/powerpc64/add_n.asm b/rts/gmp/mpn/powerpc64/add_n.asm deleted file mode 100644 index c332537..0000000 --- a/rts/gmp/mpn/powerpc64/add_n.asm +++ /dev/null @@ -1,61 +0,0 @@ -# PowerPC-64 mpn_add_n -- Add two limb vectors of the same length > 0 and -# store sum in a third limb vector. - -# 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. - - -# INPUT PARAMETERS -# res_ptr r3 -# s1_ptr r4 -# s2_ptr r5 -# size r6 - -include(`../config.m4') - -ASM_START() -PROLOGUE(mpn_add_n) - mtctr r6 # copy size into CTR - addic r0,r0,0 # clear cy - ld r8,0(r4) # load least significant s1 limb - ld r0,0(r5) # load least significant s2 limb - addi r3,r3,-8 # offset res_ptr, it's updated before it's used - bdz .Lend # If done, skip loop -.Loop: ld r9,8(r4) # load s1 limb - ld r10,8(r5) # load s2 limb - adde r7,r0,r8 # add limbs with cy, set cy - std r7,8(r3) # store result limb - bdz .Lexit # decrement CTR and exit if done - ldu r8,16(r4) # load s1 limb and update s1_ptr - ldu r0,16(r5) # load s2 limb and update s2_ptr - adde r7,r10,r9 # add limbs with cy, set cy - stdu r7,16(r3) # store result limb and update res_ptr - bdnz .Loop # decrement CTR and loop back - -.Lend: adde r7,r0,r8 - std r7,8(r3) # store ultimate result limb - li r3,0 # load cy into ... - addze r3,r3 # ... return value register - blr -.Lexit: adde r7,r10,r9 - std r7,16(r3) - li r3,0 # load cy into ... - addze r3,r3 # ... return value register - blr -EPILOGUE(mpn_add_n) diff --git a/rts/gmp/mpn/powerpc64/addmul_1.asm b/rts/gmp/mpn/powerpc64/addmul_1.asm deleted file mode 100644 index 8177448..0000000 --- a/rts/gmp/mpn/powerpc64/addmul_1.asm +++ /dev/null @@ -1,52 +0,0 @@ -# PowerPC-64 mpn_addmul_1 -- Multiply a limb vector with a limb and add -# the result to a second limb vector. - -# 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. - - -# INPUT PARAMETERS -# res_ptr r3 -# s1_ptr r4 -# size r5 -# s2_limb r6 - -include(`../config.m4') - -ASM_START() -PROLOGUE(mpn_addmul_1) - mtctr 5 - li 9,0 # cy_limb = 0 - addic 0,0,0 - cal 3,-8(3) - cal 4,-8(4) -.Loop: - ldu 0,8(4) - ld 10,8(3) - mulld 7,0,6 - adde 7,7,9 - mulhdu 9,0,6 - addze 9,9 - addc 7,7,10 - stdu 7,8(3) - bdnz .Loop - - addze 3,9 - blr -EPILOGUE(mpn_addmul_1) diff --git a/rts/gmp/mpn/powerpc64/addsub_n.asm b/rts/gmp/mpn/powerpc64/addsub_n.asm deleted file mode 100644 index 4ed40d7..0000000 --- a/rts/gmp/mpn/powerpc64/addsub_n.asm +++ /dev/null @@ -1,107 +0,0 @@ -# PowerPC-64 mpn_addsub_n -- Simultaneous add and sub. - -# 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. - - -# INPUT PARAMETERS -# res_ptr r3 -# s1_ptr r4 -# s2_ptr r5 -# size r6 - -include(`asm-syntax.m4') - -define(SAVE_BORROW_RESTORE_CARRY, - `sldi $1,$1,63 - adde $1,$1,$1') -define(SAVE_CARRY_RESTORE_BORROW, - `sldi $1,$1,63 - adde $1,$1,$1') - -# 19991117 - -# This is just crafted for testing some ideas, and verifying that we can make -# it run fast. It runs at 2.55 cycles/limb on the 630, which is very good. -# We should play a little with the schedule. No time has been spent on that. - -# To finish this, the loop warm up and cool down code needs to be written, -# and the result need to be tested. Also, the proper calling sequence should -# be used. - -# r1p r2p s1p s2p n -# Use reg r0, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12 - -ASM_START() -PROLOGUE(mpn_addsub_n) - std r14,-64(1) - std r15,-56(1) - std r16,-48(1) - std r17,-40(1) - std r18,-32(1) - std r19,-24(1) - - srdi r7,r7,2 - mtctr r7 # copy size into CTR - addic r0,r0,0 # clear cy - addi r3,r3,-8 # offset res_ptr, it's updated before it's used - addi r4,r4,-8 # offset res_ptr, it's updated before it's used - -.Loop: - adde r12,r8,r9 - std r12,8(r3) - adde r12,r10,r11 - std r12,16(r3) - - SAVE_CARRY_RESTORE_BORROW(r0) - - subfe r12,r8,r9 - std r12,8(r4) - ld r8,8(r5) # s1 L 1 - ld r9,8(r6) # s2 L 1 - subfe r12,r10,r11 - std r12,16(r4) - ld r10,16(r5) # s1 L 2 - ld r11,16(r6) # s2 L 2 -# pair ------------------------- - subfe r12,r14,r15 - std r12,24(r4) - subfe r12,r16,r17 - stdu r12,32(r4) - - SAVE_BORROW_RESTORE_CARRY(r0) - - adde r12,r14,r15 - std r12,24(r3) - ld r14,24(r5) # s1 L 3 - ld r15,24(r6) # s2 L 3 - adde r12,r16,r17 - stdu r12,32(r3) - ldu r16,32(r5) # s1 L 4 - ldu r17,32(r6) # s2 L 4 - bdnz .Loop - - ld r14,-64(1) - ld r15,-56(1) - ld r16,-48(1) - ld r17,-40(1) - ld r18,-32(1) - ld r19,-24(1) - blr -EPILOGUE(mpn_addsub_n) diff --git a/rts/gmp/mpn/powerpc64/aix.m4 b/rts/gmp/mpn/powerpc64/aix.m4 deleted file mode 100644 index aee9f1f..0000000 --- a/rts/gmp/mpn/powerpc64/aix.m4 +++ /dev/null @@ -1,40 +0,0 @@ -divert(-1) -dnl m4 macros for AIX 64-bit assembly. - -dnl Copyright (C) 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - -define(`ASM_START', - `.machine "ppc64" - .toc') - -define(`PROLOGUE', - ` - .globl $1 - .globl .$1 - .csect $1[DS],3 -$1: - .llong .$1, TOC[tc0], 0 - .csect .text[PR] - .align 2 -.$1:') - -define(`EPILOGUE', `') - -divert diff --git a/rts/gmp/mpn/powerpc64/copyd.asm b/rts/gmp/mpn/powerpc64/copyd.asm deleted file mode 100644 index d06e8c2..0000000 --- a/rts/gmp/mpn/powerpc64/copyd.asm +++ /dev/null @@ -1,45 +0,0 @@ -# PowerPC-64 mpn_copyd -- Copy a limb vector. - -# 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. - - -# INPUT PARAMETERS -# rptr r3 -# sptr r4 -# n r5 - -include(`../config.m4') - -# Unrolling this analogous to sparc64/copyi.s doesn't help for any -# operand sizes. - -ASM_START() -PROLOGUE(mpn_copyd) - cmpdi cr0,r5,0 - mtctr r5 - sldi r5,r5,3 - add r4,r4,r5 - add r3,r3,r5 - beq cr0,.Lend -.Loop: ldu r0,-8(r4) - stdu r0,-8(r3) - bdnz .Loop -.Lend: blr -EPILOGUE(mpn_copyd) diff --git a/rts/gmp/mpn/powerpc64/copyi.asm b/rts/gmp/mpn/powerpc64/copyi.asm deleted file mode 100644 index a1bedc4..0000000 --- a/rts/gmp/mpn/powerpc64/copyi.asm +++ /dev/null @@ -1,44 +0,0 @@ -# PowerPC-64 mpn_copyi -- Copy a limb vector. - -# 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. - - -# INPUT PARAMETERS -# rptr r3 -# sptr r4 -# n r5 - -include(`../config.m4') - -# Unrolling this analogous to sparc64/copyi.s doesn't help for any -# operand sizes. - -ASM_START() -PROLOGUE(mpn_copyi) - cmpdi cr0,r5,0 - mtctr r5 - addi r4,r4,-8 - addi r3,r3,-8 - beq cr0,.Lend -.Loop: ldu r0,8(r4) - stdu r0,8(r3) - bdnz .Loop -.Lend: blr -EPILOGUE(mpn_copyi) diff --git a/rts/gmp/mpn/powerpc64/gmp-mparam.h b/rts/gmp/mpn/powerpc64/gmp-mparam.h deleted file mode 100644 index 6fefb96..0000000 --- a/rts/gmp/mpn/powerpc64/gmp-mparam.h +++ /dev/null @@ -1,62 +0,0 @@ -/* gmp-mparam.h -- Compiler/machine parameter header file. - -Copyright (C) 1991, 1993, 1994, 1995, 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. */ - -#define BITS_PER_MP_LIMB 64 -#define BYTES_PER_MP_LIMB 8 -#define BITS_PER_LONGINT 64 -#define BITS_PER_INT 32 -#define BITS_PER_SHORTINT 16 -#define BITS_PER_CHAR 8 - -/* Generated by tuneup.c, 2000-07-16. */ - -#ifndef KARATSUBA_MUL_THRESHOLD -#define KARATSUBA_MUL_THRESHOLD 10 -#endif -#ifndef TOOM3_MUL_THRESHOLD -#define TOOM3_MUL_THRESHOLD 57 -#endif - -#ifndef KARATSUBA_SQR_THRESHOLD -#define KARATSUBA_SQR_THRESHOLD 16 -#endif -#ifndef TOOM3_SQR_THRESHOLD -#define TOOM3_SQR_THRESHOLD 89 -#endif - -#ifndef BZ_THRESHOLD -#define BZ_THRESHOLD 28 -#endif - -#ifndef FIB_THRESHOLD -#define FIB_THRESHOLD 216 -#endif - -#ifndef POWM_THRESHOLD -#define POWM_THRESHOLD 14 -#endif - -#ifndef GCD_ACCEL_THRESHOLD -#define GCD_ACCEL_THRESHOLD 6 -#endif -#ifndef GCDEXT_THRESHOLD -#define GCDEXT_THRESHOLD 163 -#endif diff --git a/rts/gmp/mpn/powerpc64/lshift.asm b/rts/gmp/mpn/powerpc64/lshift.asm deleted file mode 100644 index cef3a81..0000000 --- a/rts/gmp/mpn/powerpc64/lshift.asm +++ /dev/null @@ -1,159 +0,0 @@ -# PowerPC-64 mpn_lshift -- Shift a number left. - -# 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. - - -# INPUT PARAMETERS -# res_ptr r3 -# s1_ptr r4 -# size r5 -# cnt r6 - -include(`../config.m4') - -ASM_START() -PROLOGUE(mpn_lshift) - cmpdi cr0,r5,20 # more than 20 limbs? - sldi r0,r5,3 - add r4,r4,r0 # make r4 point at end of s1 - add r7,r3,r0 # make r7 point at end of res - bgt .LBIG # branch if more than 12 limbs - - mtctr r5 # copy size into CTR - subfic r8,r6,64 - ldu r11,-8(r4) # load first s1 limb - srd r3,r11,r8 # compute function return value - bdz .Lend1 - -.Loop: ldu r10,-8(r4) - sld r9,r11,r6 - srd r12,r10,r8 - or r9,r9,r12 - stdu r9,-8(r7) - bdz .Lend2 - ldu r11,-8(r4) - sld r9,r10,r6 - srd r12,r11,r8 - or r9,r9,r12 - stdu r9,-8(r7) - bdnz .Loop - -.Lend1: sld r0,r11,r6 - std r0,-8(r7) - blr -.Lend2: sld r0,r10,r6 - std r0,-8(r7) - blr - -.LBIG: - std r24,-64(1) - std r25,-56(1) - std r26,-48(1) - std r27,-40(1) - std r28,-32(1) - std r29,-24(1) - std r30,-16(1) - std r31,-8(1) - ldu r9,-8(r4) - subfic r8,r6,64 - srd r3,r9,r8 # compute function return value - sld r0,r9,r6 - addi r5,r5,-1 - - andi. r10,r5,3 # count for spill loop - beq .Le - mtctr r10 - ldu r28,-8(r4) - bdz .Lxe0 - -.Loop0: sld r12,r28,r6 - srd r24,r28,r8 - ldu r28,-8(r4) - or r24,r0,r24 - stdu r24,-8(r7) - mr r0,r12 - bdnz .Loop0 # taken at most once! - -.Lxe0: sld r12,r28,r6 - srd r24,r28,r8 - or r24,r0,r24 - stdu r24,-8(r7) - mr r0,r12 - -.Le: srdi r5,r5,2 # count for unrolled loop - addi r5,r5,-1 - mtctr r5 - ld r28,-8(r4) - ld r29,-16(r4) - ld r30,-24(r4) - ldu r31,-32(r4) - -.LoopU: sld r9,r28,r6 - srd r24,r28,r8 - ld r28,-8(r4) - sld r10,r29,r6 - srd r25,r29,r8 - ld r29,-16(r4) - sld r11,r30,r6 - srd r26,r30,r8 - ld r30,-24(r4) - sld r12,r31,r6 - srd r27,r31,r8 - ldu r31,-32(r4) - or r24,r0,r24 - std r24,-8(r7) - or r25,r9,r25 - std r25,-16(r7) - or r26,r10,r26 - std r26,-24(r7) - or r27,r11,r27 - stdu r27,-32(r7) - mr r0,r12 - bdnz .LoopU - - sld r9,r28,r6 - srd r24,r28,r8 - sld r10,r29,r6 - srd r25,r29,r8 - sld r11,r30,r6 - srd r26,r30,r8 - sld r12,r31,r6 - srd r27,r31,r8 - or r24,r0,r24 - std r24,-8(r7) - or r25,r9,r25 - std r25,-16(r7) - or r26,r10,r26 - std r26,-24(r7) - or r27,r11,r27 - stdu r27,-32(r7) - mr r0,r12 - - std r0,-8(r7) - ld r24,-64(1) - ld r25,-56(1) - ld r26,-48(1) - ld r27,-40(1) - ld r28,-32(1) - ld r29,-24(1) - ld r30,-16(1) - ld r31,-8(1) - blr -EPILOGUE(mpn_lshift) diff --git a/rts/gmp/mpn/powerpc64/mul_1.asm b/rts/gmp/mpn/powerpc64/mul_1.asm deleted file mode 100644 index 4759728..0000000 --- a/rts/gmp/mpn/powerpc64/mul_1.asm +++ /dev/null @@ -1,49 +0,0 @@ -# PowerPC-64 mpn_mul_1 -- Multiply a limb vector with a limb and store -# the result in a second limb vector. - -# 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. - - -# INPUT PARAMETERS -# res_ptr r3 -# s1_ptr r4 -# size r5 -# s2_limb r6 - -include(`../config.m4') - -ASM_START() -PROLOGUE(mpn_mul_1) - mtctr 5 - li 9,0 # cy_limb = 0 - addic 0,0,0 - cal 3,-8(3) - cal 4,-8(4) -.Loop: - ldu 0,8(4) - mulld 7,0,6 - adde 7,7,9 - mulhdu 9,0,6 - stdu 7,8(3) - bdnz .Loop - - addze 3,9 - blr -EPILOGUE(mpn_mul_1) diff --git a/rts/gmp/mpn/powerpc64/rshift.asm b/rts/gmp/mpn/powerpc64/rshift.asm deleted file mode 100644 index 88272c7..0000000 --- a/rts/gmp/mpn/powerpc64/rshift.asm +++ /dev/null @@ -1,60 +0,0 @@ -# PowerPC-64 mpn_rshift -- Shift a number right. - -# 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. - - -# INPUT PARAMETERS -# res_ptr r3 -# s1_ptr r4 -# size r5 -# cnt r6 - -include(`../config.m4') - -ASM_START() -PROLOGUE(mpn_rshift) - mtctr r5 # copy size into CTR - addi r7,r3,-8 # move adjusted res_ptr to free return reg - subfic r8,r6,64 - ld r11,0(r4) # load first s1 limb - sld r3,r11,r8 # compute function return value - bdz .Lend1 - -.Loop: ldu r10,8(r4) - srd r9,r11,r6 - sld r12,r10,r8 - or r9,r9,r12 - stdu r9,8(r7) - bdz .Lend2 - ldu r11,8(r4) - srd r9,r10,r6 - sld r12,r11,r8 - or r9,r9,r12 - stdu r9,8(r7) - bdnz .Loop - -.Lend1: srd r0,r11,r6 - std r0,8(r7) - blr - -.Lend2: srd r0,r10,r6 - std r0,8(r7) - blr -EPILOGUE(mpn_rshift) diff --git a/rts/gmp/mpn/powerpc64/sub_n.asm b/rts/gmp/mpn/powerpc64/sub_n.asm deleted file mode 100644 index 4de3de6..0000000 --- a/rts/gmp/mpn/powerpc64/sub_n.asm +++ /dev/null @@ -1,61 +0,0 @@ -# PowerPC-64 mpn_sub_n -- Subtract two limb vectors of the same length > 0 -# and store difference in a third limb vector. - -# Copyright (C) 1999, 2000 Free Software Foundation, Inc.b - -# 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. - - -# INPUT PARAMETERS -# res_ptr r3 -# s1_ptr r4 -# s2_ptr r5 -# size r6 - -include(`../config.m4') - -ASM_START() -PROLOGUE(mpn_sub_n) - mtctr r6 # copy size into CTR - addic r0,r6,-1 # set cy - ld r8,0(r4) # load least significant s1 limb - ld r0,0(r5) # load least significant s2 limb - addi r3,r3,-8 # offset res_ptr, it's updated before it's used - bdz .Lend # If done, skip loop -.Loop: ld r9,8(r4) # load s1 limb - ld r10,8(r5) # load s2 limb - subfe r7,r0,r8 # subtract limbs with cy, set cy - std r7,8(r3) # store result limb - bdz .Lexit # decrement CTR and exit if done - ldu r8,16(r4) # load s1 limb and update s1_ptr - ldu r0,16(r5) # load s2 limb and update s2_ptr - subfe r7,r10,r9 # subtract limbs with cy, set cy - stdu r7,16(r3) # store result limb and update res_ptr - bdnz .Loop # decrement CTR and loop back - -.Lend: subfe r7,r0,r8 - std r7,8(r3) # store ultimate result limb - subfe r3,r0,r0 # load !cy into ... - subfic r3,r3,0 # ... return value register - blr -.Lexit: subfe r7,r10,r9 - std r7,16(r3) - subfe r3,r0,r0 # load !cy into ... - subfic r3,r3,0 # ... return value register - blr -EPILOGUE(mpn_sub_n) diff --git a/rts/gmp/mpn/powerpc64/submul_1.asm b/rts/gmp/mpn/powerpc64/submul_1.asm deleted file mode 100644 index 17f6369..0000000 --- a/rts/gmp/mpn/powerpc64/submul_1.asm +++ /dev/null @@ -1,54 +0,0 @@ -# PowerPC-64 mpn_submul_1 -- Multiply a limb vector with a limb and subtract -# the result from a second limb vector. - -# 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. - - -# INPUT PARAMETERS -# res_ptr r3 -# s1_ptr r4 -# size r5 -# s2_limb r6 - -include(`../config.m4') - -ASM_START() -PROLOGUE(mpn_submul_1) - mtctr 5 - li 9,0 # cy_limb = 0 - addic 0,0,0 - cal 3,-8(3) - cal 4,-8(4) -.Loop: - ldu 0,8(4) - ld 10,8(3) - mulld 7,0,6 - adde 7,7,9 - mulhdu 9,0,6 - addze 9,9 - subfc 7,7,10 - stdu 7,8(3) - subfe 11,11,11 # invert ... - addic 11,11,1 # ... carry - bdnz .Loop - - addze 3,9 - blr -EPILOGUE(mpn_submul_1) diff --git a/rts/gmp/mpn/pyr/add_n.s b/rts/gmp/mpn/pyr/add_n.s deleted file mode 100644 index e1fc535..0000000 --- a/rts/gmp/mpn/pyr/add_n.s +++ /dev/null @@ -1,76 +0,0 @@ -# Pyramid __gmpn_add_n -- Add two limb vectors of the same length > 0 and store -# sum in a third limb vector. - -# Copyright (C) 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. - -.text - .align 2 -.globl ___gmpn_add_n -___gmpn_add_n: - movw $-1,tr0 # representation for carry clear - - movw pr3,tr2 - andw $3,tr2 - beq Lend0 - subw tr2,pr3 - -Loop0: rsubw $0,tr0 # restore carry bit from carry-save register - - movw (pr1),tr1 - addwc (pr2),tr1 - movw tr1,(pr0) - - subwb tr0,tr0 - addw $4,pr0 - addw $4,pr1 - addw $4,pr2 - addw $-1,tr2 - bne Loop0 - - mtstw pr3,pr3 - beq Lend -Lend0: -Loop: rsubw $0,tr0 # restore carry bit from carry-save register - - movw (pr1),tr1 - addwc (pr2),tr1 - movw tr1,(pr0) - - movw 4(pr1),tr1 - addwc 4(pr2),tr1 - movw tr1,4(pr0) - - movw 8(pr1),tr1 - addwc 8(pr2),tr1 - movw tr1,8(pr0) - - movw 12(pr1),tr1 - addwc 12(pr2),tr1 - movw tr1,12(pr0) - - subwb tr0,tr0 - addw $16,pr0 - addw $16,pr1 - addw $16,pr2 - addw $-4,pr3 - bne Loop -Lend: - mnegw tr0,pr0 - ret diff --git a/rts/gmp/mpn/pyr/addmul_1.s b/rts/gmp/mpn/pyr/addmul_1.s deleted file mode 100644 index 65c3f8f..0000000 --- a/rts/gmp/mpn/pyr/addmul_1.s +++ /dev/null @@ -1,45 +0,0 @@ -# Pyramid __gmpn_addmul_1 -- Multiply a limb vector with a limb and add -# the result to a second limb vector. - -# Copyright (C) 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. - -.text - .align 2 -.globl ___gmpn_addmul_1 -___gmpn_addmul_1: - mova (pr0)[pr2*4],pr0 - mova (pr1)[pr2*4],pr1 - mnegw pr2,pr2 - movw $0,tr3 - -Loop: movw (pr1)[pr2*4],tr1 - uemul pr3,tr0 - addw tr3,tr1 - movw $0,tr3 - addwc tr0,tr3 - movw (pr0)[pr2*0x4],tr0 - addw tr0,tr1 - addwc $0,tr3 - movw tr1,(pr0)[pr2*4] - addw $1,pr2 - bne Loop - - movw tr3,pr0 - ret diff --git a/rts/gmp/mpn/pyr/mul_1.s b/rts/gmp/mpn/pyr/mul_1.s deleted file mode 100644 index 1272297..0000000 --- a/rts/gmp/mpn/pyr/mul_1.s +++ /dev/null @@ -1,42 +0,0 @@ -# Pyramid __gmpn_mul_1 -- Multiply a limb vector with a limb and store -# the result in a second limb vector. - -# Copyright (C) 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. - -.text - .align 2 -.globl ___gmpn_mul_1 -___gmpn_mul_1: - mova (pr0)[pr2*4],pr0 - mova (pr1)[pr2*4],pr1 - mnegw pr2,pr2 - movw $0,tr3 - -Loop: movw (pr1)[pr2*4],tr1 - uemul pr3,tr0 - addw tr3,tr1 - movw $0,tr3 - addwc tr0,tr3 - movw tr1,(pr0)[pr2*4] - addw $1,pr2 - bne Loop - - movw tr3,pr0 - ret diff --git a/rts/gmp/mpn/pyr/sub_n.s b/rts/gmp/mpn/pyr/sub_n.s deleted file mode 100644 index 1fd2eb0..0000000 --- a/rts/gmp/mpn/pyr/sub_n.s +++ /dev/null @@ -1,76 +0,0 @@ -# Pyramid __gmpn_sub_n -- Subtract two limb vectors of the same length > 0 and -# store difference in a third limb vector. - -# Copyright (C) 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. - -.text - .align 2 -.globl ___gmpn_sub_n -___gmpn_sub_n: - movw $-1,tr0 # representation for carry clear - - movw pr3,tr2 - andw $3,tr2 - beq Lend0 - subw tr2,pr3 - -Loop0: rsubw $0,tr0 # restore carry bit from carry-save register - - movw (pr1),tr1 - subwb (pr2),tr1 - movw tr1,(pr0) - - subwb tr0,tr0 - addw $4,pr0 - addw $4,pr1 - addw $4,pr2 - addw $-1,tr2 - bne Loop0 - - mtstw pr3,pr3 - beq Lend -Lend0: -Loop: rsubw $0,tr0 # restore carry bit from carry-save register - - movw (pr1),tr1 - subwb (pr2),tr1 - movw tr1,(pr0) - - movw 4(pr1),tr1 - subwb 4(pr2),tr1 - movw tr1,4(pr0) - - movw 8(pr1),tr1 - subwb 8(pr2),tr1 - movw tr1,8(pr0) - - movw 12(pr1),tr1 - subwb 12(pr2),tr1 - movw tr1,12(pr0) - - subwb tr0,tr0 - addw $16,pr0 - addw $16,pr1 - addw $16,pr2 - addw $-4,pr3 - bne Loop -Lend: - mnegw tr0,pr0 - ret diff --git a/rts/gmp/mpn/sh/add_n.s b/rts/gmp/mpn/sh/add_n.s deleted file mode 100644 index df388b3..0000000 --- a/rts/gmp/mpn/sh/add_n.s +++ /dev/null @@ -1,47 +0,0 @@ -! SH __gmpn_add_n -- Add two limb vectors of the same length > 0 and store -! sum in a third limb vector. - -! Copyright (C) 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. - - -! INPUT PARAMETERS -! res_ptr r4 -! s1_ptr r5 -! s2_ptr r6 -! size r7 - - .text - .align 2 - .global ___gmpn_add_n -___gmpn_add_n: - mov #0,r3 ! clear cy save reg - -Loop: mov.l @r5+,r1 - mov.l @r6+,r2 - shlr r3 ! restore cy - addc r2,r1 - movt r3 ! save cy - mov.l r1,@r4 - dt r7 - bf.s Loop - add #4,r4 - - rts - mov r3,r0 ! return carry-out from most sign. limb diff --git a/rts/gmp/mpn/sh/sh2/addmul_1.s b/rts/gmp/mpn/sh/sh2/addmul_1.s deleted file mode 100644 index f34a7f0..0000000 --- a/rts/gmp/mpn/sh/sh2/addmul_1.s +++ /dev/null @@ -1,53 +0,0 @@ -! SH2 __gmpn_addmul_1 -- Multiply a limb vector with a limb and add -! the result to a second limb vector. - -! Copyright (C) 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. - - -! INPUT PARAMETERS -! res_ptr r4 -! s1_ptr r5 -! size r6 -! s2_limb r7 - - .text - .align 1 - .global ___gmpn_addmul_1 -___gmpn_addmul_1: - mov #0,r2 ! cy_limb = 0 - mov #0,r0 ! Keep r0 = 0 for entire loop - clrt - -Loop: mov.l @r5+,r3 - dmulu.l r3,r7 - sts macl,r1 - addc r2,r1 ! lo_prod += old cy_limb - sts mach,r2 ! new cy_limb = hi_prod - mov.l @r4,r3 - addc r0,r2 ! cy_limb += T, T = 0 - addc r3,r1 - addc r0,r2 ! cy_limb += T, T = 0 - dt r6 - mov.l r1,@r4 - bf.s Loop - add #4,r4 - - rts - mov r2,r0 diff --git a/rts/gmp/mpn/sh/sh2/mul_1.s b/rts/gmp/mpn/sh/sh2/mul_1.s deleted file mode 100644 index 2a117a3..0000000 --- a/rts/gmp/mpn/sh/sh2/mul_1.s +++ /dev/null @@ -1,50 +0,0 @@ -! SH2 __gmpn_mul_1 -- Multiply a limb vector with a limb and store -! the result in a second limb vector. - -! Copyright (C) 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. - - -! INPUT PARAMETERS -! res_ptr r4 -! s1_ptr r5 -! size r6 -! s2_limb r7 - - .text - .align 1 - .global ___gmpn_mul_1 -___gmpn_mul_1: - mov #0,r2 ! cy_limb = 0 - mov #0,r0 ! Keep r0 = 0 for entire loop - clrt - -Loop: mov.l @r5+,r3 - dmulu.l r3,r7 - sts macl,r1 - addc r2,r1 - sts mach,r2 - addc r0,r2 ! propagate carry to cy_limb (dt clobbers T) - dt r6 - mov.l r1,@r4 - bf.s Loop - add #4,r4 - - rts - mov r2,r0 diff --git a/rts/gmp/mpn/sh/sh2/submul_1.s b/rts/gmp/mpn/sh/sh2/submul_1.s deleted file mode 100644 index eb9a27d..0000000 --- a/rts/gmp/mpn/sh/sh2/submul_1.s +++ /dev/null @@ -1,53 +0,0 @@ -! SH2 __gmpn_submul_1 -- Multiply a limb vector with a limb and subtract -! the result from a second limb vector. - -! Copyright (C) 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. - - -! INPUT PARAMETERS -! res_ptr r4 -! s1_ptr r5 -! size r6 -! s2_limb r7 - - .text - .align 1 - .global ___gmpn_submul_1 -___gmpn_submul_1: - mov #0,r2 ! cy_limb = 0 - mov #0,r0 ! Keep r0 = 0 for entire loop - clrt - -Loop: mov.l @r5+,r3 - dmulu.l r3,r7 - sts macl,r1 - addc r2,r1 ! lo_prod += old cy_limb - sts mach,r2 ! new cy_limb = hi_prod - mov.l @r4,r3 - addc r0,r2 ! cy_limb += T, T = 0 - subc r3,r1 - addc r0,r2 ! cy_limb += T, T = 0 - dt r6 - mov.l r1,@r4 - bf.s Loop - add #4,r4 - - rts - mov r2,r0 diff --git a/rts/gmp/mpn/sh/sub_n.s b/rts/gmp/mpn/sh/sub_n.s deleted file mode 100644 index 5f818c9..0000000 --- a/rts/gmp/mpn/sh/sub_n.s +++ /dev/null @@ -1,47 +0,0 @@ -! SH __gmpn_sub_n -- Subtract two limb vectors of the same length > 0 and store -! difference in a third limb vector. - -! Copyright (C) 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. - - -! INPUT PARAMETERS -! res_ptr r4 -! s1_ptr r5 -! s2_ptr r6 -! size r7 - - .text - .align 2 - .global ___gmpn_sub_n -___gmpn_sub_n: - mov #0,r3 ! clear cy save reg - -Loop: mov.l @r5+,r1 - mov.l @r6+,r2 - shlr r3 ! restore cy - subc r2,r1 - movt r3 ! save cy - mov.l r1,@r4 - dt r7 - bf.s Loop - add #4,r4 - - rts - mov r3,r0 ! return carry-out from most sign. limb diff --git a/rts/gmp/mpn/sparc32/README b/rts/gmp/mpn/sparc32/README deleted file mode 100644 index 7c19df7..0000000 --- a/rts/gmp/mpn/sparc32/README +++ /dev/null @@ -1,36 +0,0 @@ -This directory contains mpn functions for various SPARC chips. Code that -runs only on version 8 SPARC implementations, is in the v8 subdirectory. - -RELEVANT OPTIMIZATION ISSUES - - Load and Store timing - -On most early SPARC implementations, the ST instructions takes multiple -cycles, while a STD takes just a single cycle more than an ST. For the CPUs -in SPARCstation I and II, the times are 3 and 4 cycles, respectively. -Therefore, combining two ST instrucitons into a STD when possible is a -significant optimiation. - -Later SPARC implementations have single cycle ST. - -For SuperSPARC, we can perform just one memory instruction per cycle, even -if up to two integer instructions can be executed in its pipeline. For -programs that perform so many memory operations that there are not enough -non-memory operations to issue in parallel with all memory operations, using -LDD and STD when possible helps. - -STATUS - -1. On a SuperSPARC, mpn_lshift and mpn_rshift run at 3 cycles/limb, or 2.5 - cycles/limb asymptotically. We could optimize speed for special counts - by using ADDXCC. - -2. On a SuperSPARC, mpn_add_n and mpn_sub_n runs at 2.5 cycles/limb, or 2 - cycles/limb asymptotically. - -3. mpn_mul_1 runs at what is believed to be optimal speed. - -4. On SuperSPARC, mpn_addmul_1 and mpn_submul_1 could both be improved by a - cycle by avoiding one of the add instrucitons. See a29k/addmul_1. - -The speed of the code for other SPARC implementations is uncertain. diff --git a/rts/gmp/mpn/sparc32/add_n.asm b/rts/gmp/mpn/sparc32/add_n.asm deleted file mode 100644 index 5f1d00c..0000000 --- a/rts/gmp/mpn/sparc32/add_n.asm +++ /dev/null @@ -1,236 +0,0 @@ -dnl SPARC mpn_add_n -- Add two limb vectors of the same length > 0 and store -dnl sum in a third limb vector. - -dnl Copyright (C) 1995, 1996, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published -dnl by the Free Software Foundation; either version 2.1 of the License, or (at -dnl your option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - - -include(`../config.m4') - -C INPUT PARAMETERS -define(res_ptr,%o0) -define(s1_ptr,%o1) -define(s2_ptr,%o2) -define(n,%o3) - -ASM_START() -PROLOGUE(mpn_add_n) - xor s2_ptr,res_ptr,%g1 - andcc %g1,4,%g0 - bne L(1) C branch if alignment differs - nop -C ** V1a ** -L(0): andcc res_ptr,4,%g0 C res_ptr unaligned? Side effect: cy=0 - be L(v1) C if no, branch - nop -C Add least significant limb separately to align res_ptr and s2_ptr - ld [s1_ptr],%g4 - add s1_ptr,4,s1_ptr - ld [s2_ptr],%g2 - add s2_ptr,4,s2_ptr - add n,-1,n - addcc %g4,%g2,%o4 - st %o4,[res_ptr] - add res_ptr,4,res_ptr -L(v1): addx %g0,%g0,%o4 C save cy in register - cmp n,2 C if n < 2 ... - bl L(end2) C ... branch to tail code - subcc %g0,%o4,%g0 C restore cy - - ld [s1_ptr+0],%g4 - addcc n,-10,n - ld [s1_ptr+4],%g1 - ldd [s2_ptr+0],%g2 - blt L(fin1) - subcc %g0,%o4,%g0 C restore cy -C Add blocks of 8 limbs until less than 8 limbs remain -L(loop1): - addxcc %g4,%g2,%o4 - ld [s1_ptr+8],%g4 - addxcc %g1,%g3,%o5 - ld [s1_ptr+12],%g1 - ldd [s2_ptr+8],%g2 - std %o4,[res_ptr+0] - addxcc %g4,%g2,%o4 - ld [s1_ptr+16],%g4 - addxcc %g1,%g3,%o5 - ld [s1_ptr+20],%g1 - ldd [s2_ptr+16],%g2 - std %o4,[res_ptr+8] - addxcc %g4,%g2,%o4 - ld [s1_ptr+24],%g4 - addxcc %g1,%g3,%o5 - ld [s1_ptr+28],%g1 - ldd [s2_ptr+24],%g2 - std %o4,[res_ptr+16] - addxcc %g4,%g2,%o4 - ld [s1_ptr+32],%g4 - addxcc %g1,%g3,%o5 - ld [s1_ptr+36],%g1 - ldd [s2_ptr+32],%g2 - std %o4,[res_ptr+24] - addx %g0,%g0,%o4 C save cy in register - addcc n,-8,n - add s1_ptr,32,s1_ptr - add s2_ptr,32,s2_ptr - add res_ptr,32,res_ptr - bge L(loop1) - subcc %g0,%o4,%g0 C restore cy - -L(fin1): - addcc n,8-2,n - blt L(end1) - subcc %g0,%o4,%g0 C restore cy -C Add blocks of 2 limbs until less than 2 limbs remain -L(loope1): - addxcc %g4,%g2,%o4 - ld [s1_ptr+8],%g4 - addxcc %g1,%g3,%o5 - ld [s1_ptr+12],%g1 - ldd [s2_ptr+8],%g2 - std %o4,[res_ptr+0] - addx %g0,%g0,%o4 C save cy in register - addcc n,-2,n - add s1_ptr,8,s1_ptr - add s2_ptr,8,s2_ptr - add res_ptr,8,res_ptr - bge L(loope1) - subcc %g0,%o4,%g0 C restore cy -L(end1): - addxcc %g4,%g2,%o4 - addxcc %g1,%g3,%o5 - std %o4,[res_ptr+0] - addx %g0,%g0,%o4 C save cy in register - - andcc n,1,%g0 - be L(ret1) - subcc %g0,%o4,%g0 C restore cy -C Add last limb - ld [s1_ptr+8],%g4 - ld [s2_ptr+8],%g2 - addxcc %g4,%g2,%o4 - st %o4,[res_ptr+8] - -L(ret1): - retl - addx %g0,%g0,%o0 C return carry-out from most sign. limb - -L(1): xor s1_ptr,res_ptr,%g1 - andcc %g1,4,%g0 - bne L(2) - nop -C ** V1b ** - mov s2_ptr,%g1 - mov s1_ptr,s2_ptr - b L(0) - mov %g1,s1_ptr - -C ** V2 ** -C If we come here, the alignment of s1_ptr and res_ptr as well as the -C alignment of s2_ptr and res_ptr differ. Since there are only two ways -C things can be aligned (that we care about) we now know that the alignment -C of s1_ptr and s2_ptr are the same. - -L(2): cmp n,1 - be L(jone) - nop - andcc s1_ptr,4,%g0 C s1_ptr unaligned? Side effect: cy=0 - be L(v2) C if no, branch - nop -C Add least significant limb separately to align s1_ptr and s2_ptr - ld [s1_ptr],%g4 - add s1_ptr,4,s1_ptr - ld [s2_ptr],%g2 - add s2_ptr,4,s2_ptr - add n,-1,n - addcc %g4,%g2,%o4 - st %o4,[res_ptr] - add res_ptr,4,res_ptr - -L(v2): addx %g0,%g0,%o4 C save cy in register - addcc n,-8,n - blt L(fin2) - subcc %g0,%o4,%g0 C restore cy -C Add blocks of 8 limbs until less than 8 limbs remain -L(loop2): - ldd [s1_ptr+0],%g2 - ldd [s2_ptr+0],%o4 - addxcc %g2,%o4,%g2 - st %g2,[res_ptr+0] - addxcc %g3,%o5,%g3 - st %g3,[res_ptr+4] - ldd [s1_ptr+8],%g2 - ldd [s2_ptr+8],%o4 - addxcc %g2,%o4,%g2 - st %g2,[res_ptr+8] - addxcc %g3,%o5,%g3 - st %g3,[res_ptr+12] - ldd [s1_ptr+16],%g2 - ldd [s2_ptr+16],%o4 - addxcc %g2,%o4,%g2 - st %g2,[res_ptr+16] - addxcc %g3,%o5,%g3 - st %g3,[res_ptr+20] - ldd [s1_ptr+24],%g2 - ldd [s2_ptr+24],%o4 - addxcc %g2,%o4,%g2 - st %g2,[res_ptr+24] - addxcc %g3,%o5,%g3 - st %g3,[res_ptr+28] - addx %g0,%g0,%o4 C save cy in register - addcc n,-8,n - add s1_ptr,32,s1_ptr - add s2_ptr,32,s2_ptr - add res_ptr,32,res_ptr - bge L(loop2) - subcc %g0,%o4,%g0 C restore cy - -L(fin2): - addcc n,8-2,n - blt L(end2) - subcc %g0,%o4,%g0 C restore cy -L(loope2): - ldd [s1_ptr+0],%g2 - ldd [s2_ptr+0],%o4 - addxcc %g2,%o4,%g2 - st %g2,[res_ptr+0] - addxcc %g3,%o5,%g3 - st %g3,[res_ptr+4] - addx %g0,%g0,%o4 C save cy in register - addcc n,-2,n - add s1_ptr,8,s1_ptr - add s2_ptr,8,s2_ptr - add res_ptr,8,res_ptr - bge L(loope2) - subcc %g0,%o4,%g0 C restore cy -L(end2): - andcc n,1,%g0 - be L(ret2) - subcc %g0,%o4,%g0 C restore cy -C Add last limb -L(jone): - ld [s1_ptr],%g4 - ld [s2_ptr],%g2 - addxcc %g4,%g2,%o4 - st %o4,[res_ptr] - -L(ret2): - retl - addx %g0,%g0,%o0 C return carry-out from most sign. limb -EPILOGUE(mpn_add_n) diff --git a/rts/gmp/mpn/sparc32/addmul_1.asm b/rts/gmp/mpn/sparc32/addmul_1.asm deleted file mode 100644 index 80c94e4..0000000 --- a/rts/gmp/mpn/sparc32/addmul_1.asm +++ /dev/null @@ -1,146 +0,0 @@ -dnl SPARC mpn_addmul_1 -- Multiply a limb vector with a limb and add the -dnl result to a second limb vector. - -dnl Copyright (C) 1992, 1993, 1994, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published -dnl by the Free Software Foundation; either version 2.1 of the License, or (at -dnl your option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - - -include(`../config.m4') - -C INPUT PARAMETERS -C res_ptr o0 -C s1_ptr o1 -C size o2 -C s2_limb o3 - -ASM_START() -PROLOGUE(mpn_addmul_1) - C Make S1_PTR and RES_PTR point at the end of their blocks - C and put (- 4 x SIZE) in index/loop counter. - sll %o2,2,%o2 - add %o0,%o2,%o4 C RES_PTR in o4 since o0 is retval - add %o1,%o2,%o1 - sub %g0,%o2,%o2 - - cmp %o3,0xfff - bgu L(large) - nop - - ld [%o1+%o2],%o5 - mov 0,%o0 - b L(0) - add %o4,-4,%o4 -L(loop0): - addcc %o5,%g1,%g1 - ld [%o1+%o2],%o5 - addx %o0,%g0,%o0 - st %g1,[%o4+%o2] -L(0): wr %g0,%o3,%y - sra %o5,31,%g2 - and %o3,%g2,%g2 - andcc %g1,0,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,0,%g1 - sra %g1,20,%g4 - sll %g1,12,%g1 - rd %y,%g3 - srl %g3,20,%g3 - or %g1,%g3,%g1 - - addcc %g1,%o0,%g1 - addx %g2,%g4,%o0 C add sign-compensation and cy to hi limb - addcc %o2,4,%o2 C loop counter - bne L(loop0) - ld [%o4+%o2],%o5 - - addcc %o5,%g1,%g1 - addx %o0,%g0,%o0 - retl - st %g1,[%o4+%o2] - -L(large): - ld [%o1+%o2],%o5 - mov 0,%o0 - sra %o3,31,%g4 C g4 = mask of ones iff S2_LIMB < 0 - b L(1) - add %o4,-4,%o4 -L(loop): - addcc %o5,%g3,%g3 - ld [%o1+%o2],%o5 - addx %o0,%g0,%o0 - st %g3,[%o4+%o2] -L(1): wr %g0,%o5,%y - and %o5,%g4,%g2 - andcc %g0,%g0,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%g0,%g1 - rd %y,%g3 - addcc %g3,%o0,%g3 - addx %g2,%g1,%o0 - addcc %o2,4,%o2 - bne L(loop) - ld [%o4+%o2],%o5 - - addcc %o5,%g3,%g3 - addx %o0,%g0,%o0 - retl - st %g3,[%o4+%o2] -EPILOGUE(mpn_addmul_1) diff --git a/rts/gmp/mpn/sparc32/lshift.asm b/rts/gmp/mpn/sparc32/lshift.asm deleted file mode 100644 index 529733a..0000000 --- a/rts/gmp/mpn/sparc32/lshift.asm +++ /dev/null @@ -1,97 +0,0 @@ -dnl SPARC mpn_lshift -- Shift a number left. -dnl - -dnl Copyright (C) 1995, 1996, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published -dnl by the Free Software Foundation; either version 2.1 of the License, or (at -dnl your option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - - -include(`../config.m4') - -C INPUT PARAMETERS -C res_ptr %o0 -C src_ptr %o1 -C size %o2 -C cnt %o3 - -ASM_START() -PROLOGUE(mpn_lshift) - sll %o2,2,%g1 - add %o1,%g1,%o1 C make %o1 point at end of src - ld [%o1-4],%g2 C load first limb - sub %g0,%o3,%o5 C negate shift count - add %o0,%g1,%o0 C make %o0 point at end of res - add %o2,-1,%o2 - andcc %o2,4-1,%g4 C number of limbs in first loop - srl %g2,%o5,%g1 C compute function result - be L(0) C if multiple of 4 limbs, skip first loop - st %g1,[%sp+80] - - sub %o2,%g4,%o2 C adjust count for main loop - -L(loop0): - ld [%o1-8],%g3 - add %o0,-4,%o0 - add %o1,-4,%o1 - addcc %g4,-1,%g4 - sll %g2,%o3,%o4 - srl %g3,%o5,%g1 - mov %g3,%g2 - or %o4,%g1,%o4 - bne L(loop0) - st %o4,[%o0+0] - -L(0): tst %o2 - be L(end) - nop - -L(loop): - ld [%o1-8],%g3 - add %o0,-16,%o0 - addcc %o2,-4,%o2 - sll %g2,%o3,%o4 - srl %g3,%o5,%g1 - - ld [%o1-12],%g2 - sll %g3,%o3,%g4 - or %o4,%g1,%o4 - st %o4,[%o0+12] - srl %g2,%o5,%g1 - - ld [%o1-16],%g3 - sll %g2,%o3,%o4 - or %g4,%g1,%g4 - st %g4,[%o0+8] - srl %g3,%o5,%g1 - - ld [%o1-20],%g2 - sll %g3,%o3,%g4 - or %o4,%g1,%o4 - st %o4,[%o0+4] - srl %g2,%o5,%g1 - - add %o1,-16,%o1 - or %g4,%g1,%g4 - bne L(loop) - st %g4,[%o0+0] - -L(end): sll %g2,%o3,%g2 - st %g2,[%o0-4] - retl - ld [%sp+80],%o0 -EPILOGUE(mpn_lshift) diff --git a/rts/gmp/mpn/sparc32/mul_1.asm b/rts/gmp/mpn/sparc32/mul_1.asm deleted file mode 100644 index e5fedea..0000000 --- a/rts/gmp/mpn/sparc32/mul_1.asm +++ /dev/null @@ -1,137 +0,0 @@ -dnl SPARC mpn_mul_1 -- Multiply a limb vector with a limb and store -dnl the result in a second limb vector. - -dnl Copyright (C) 1992, 1993, 1994, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published -dnl by the Free Software Foundation; either version 2.1 of the License, or (at -dnl your option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - - -include(`../config.m4') - -C INPUT PARAMETERS -C res_ptr o0 -C s1_ptr o1 -C size o2 -C s2_limb o3 - -ASM_START() -PROLOGUE(mpn_mul_1) - C Make S1_PTR and RES_PTR point at the end of their blocks - C and put (- 4 x SIZE) in index/loop counter. - sll %o2,2,%o2 - add %o0,%o2,%o4 C RES_PTR in o4 since o0 is retval - add %o1,%o2,%o1 - sub %g0,%o2,%o2 - - cmp %o3,0xfff - bgu L(large) - nop - - ld [%o1+%o2],%o5 - mov 0,%o0 - b L(0) - add %o4,-4,%o4 -L(loop0): - st %g1,[%o4+%o2] -L(0): wr %g0,%o3,%y - sra %o5,31,%g2 - and %o3,%g2,%g2 - andcc %g1,0,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,0,%g1 - sra %g1,20,%g4 - sll %g1,12,%g1 - rd %y,%g3 - srl %g3,20,%g3 - or %g1,%g3,%g1 - - addcc %g1,%o0,%g1 - addx %g2,%g4,%o0 C add sign-compensation and cy to hi limb - addcc %o2,4,%o2 C loop counter - bne,a L(loop0) - ld [%o1+%o2],%o5 - - retl - st %g1,[%o4+%o2] - - -L(large): - ld [%o1+%o2],%o5 - mov 0,%o0 - sra %o3,31,%g4 C g4 = mask of ones iff S2_LIMB < 0 - b L(1) - add %o4,-4,%o4 -L(loop): - st %g3,[%o4+%o2] -L(1): wr %g0,%o5,%y - and %o5,%g4,%g2 C g2 = S1_LIMB iff S2_LIMB < 0, else 0 - andcc %g0,%g0,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%g0,%g1 - rd %y,%g3 - addcc %g3,%o0,%g3 - addx %g2,%g1,%o0 C add sign-compensation and cy to hi limb - addcc %o2,4,%o2 C loop counter - bne,a L(loop) - ld [%o1+%o2],%o5 - - retl - st %g3,[%o4+%o2] -EPILOGUE(mpn_mul_1) diff --git a/rts/gmp/mpn/sparc32/rshift.asm b/rts/gmp/mpn/sparc32/rshift.asm deleted file mode 100644 index 9187dba..0000000 --- a/rts/gmp/mpn/sparc32/rshift.asm +++ /dev/null @@ -1,93 +0,0 @@ -dnl SPARC mpn_rshift -- Shift a number right. - -dnl Copyright (C) 1995, 1996, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published -dnl by the Free Software Foundation; either version 2.1 of the License, or (at -dnl your option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - - -include(`../config.m4') - -C INPUT PARAMETERS -C res_ptr %o0 -C src_ptr %o1 -C size %o2 -C cnt %o3 - -ASM_START() -PROLOGUE(mpn_rshift) - ld [%o1],%g2 C load first limb - sub %g0,%o3,%o5 C negate shift count - add %o2,-1,%o2 - andcc %o2,4-1,%g4 C number of limbs in first loop - sll %g2,%o5,%g1 C compute function result - be L(0) C if multiple of 4 limbs, skip first loop - st %g1,[%sp+80] - - sub %o2,%g4,%o2 C adjust count for main loop - -L(loop0): - ld [%o1+4],%g3 - add %o0,4,%o0 - add %o1,4,%o1 - addcc %g4,-1,%g4 - srl %g2,%o3,%o4 - sll %g3,%o5,%g1 - mov %g3,%g2 - or %o4,%g1,%o4 - bne L(loop0) - st %o4,[%o0-4] - -L(0): tst %o2 - be L(end) - nop - -L(loop): - ld [%o1+4],%g3 - add %o0,16,%o0 - addcc %o2,-4,%o2 - srl %g2,%o3,%o4 - sll %g3,%o5,%g1 - - ld [%o1+8],%g2 - srl %g3,%o3,%g4 - or %o4,%g1,%o4 - st %o4,[%o0-16] - sll %g2,%o5,%g1 - - ld [%o1+12],%g3 - srl %g2,%o3,%o4 - or %g4,%g1,%g4 - st %g4,[%o0-12] - sll %g3,%o5,%g1 - - ld [%o1+16],%g2 - srl %g3,%o3,%g4 - or %o4,%g1,%o4 - st %o4,[%o0-8] - sll %g2,%o5,%g1 - - add %o1,16,%o1 - or %g4,%g1,%g4 - bne L(loop) - st %g4,[%o0-4] - -L(end): srl %g2,%o3,%g2 - st %g2,[%o0-0] - retl - ld [%sp+80],%o0 -EPILOGUE(mpn_rshift) diff --git a/rts/gmp/mpn/sparc32/sub_n.asm b/rts/gmp/mpn/sparc32/sub_n.asm deleted file mode 100644 index 071909a..0000000 --- a/rts/gmp/mpn/sparc32/sub_n.asm +++ /dev/null @@ -1,326 +0,0 @@ -dnl SPARC mpn_sub_n -- Subtract two limb vectors of the same length > 0 and -dnl store difference in a third limb vector. - -dnl Copyright (C) 1995, 1996, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published -dnl by the Free Software Foundation; either version 2.1 of the License, or (at -dnl your option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - - -include(`../config.m4') - -C INPUT PARAMETERS -define(res_ptr,%o0) -define(s1_ptr,%o1) -define(s2_ptr,%o2) -define(n,%o3) - -ASM_START() -PROLOGUE(mpn_sub_n) - xor s2_ptr,res_ptr,%g1 - andcc %g1,4,%g0 - bne L(1) C branch if alignment differs - nop -C ** V1a ** - andcc res_ptr,4,%g0 C res_ptr unaligned? Side effect: cy=0 - be L(v1) C if no, branch - nop -C Add least significant limb separately to align res_ptr and s2_ptr - ld [s1_ptr],%g4 - add s1_ptr,4,s1_ptr - ld [s2_ptr],%g2 - add s2_ptr,4,s2_ptr - add n,-1,n - subcc %g4,%g2,%o4 - st %o4,[res_ptr] - add res_ptr,4,res_ptr -L(v1): addx %g0,%g0,%o4 C save cy in register - cmp n,2 C if n < 2 ... - bl L(end2) C ... branch to tail code - subcc %g0,%o4,%g0 C restore cy - - ld [s1_ptr+0],%g4 - addcc n,-10,n - ld [s1_ptr+4],%g1 - ldd [s2_ptr+0],%g2 - blt L(fin1) - subcc %g0,%o4,%g0 C restore cy -C Add blocks of 8 limbs until less than 8 limbs remain -L(loop1): - subxcc %g4,%g2,%o4 - ld [s1_ptr+8],%g4 - subxcc %g1,%g3,%o5 - ld [s1_ptr+12],%g1 - ldd [s2_ptr+8],%g2 - std %o4,[res_ptr+0] - subxcc %g4,%g2,%o4 - ld [s1_ptr+16],%g4 - subxcc %g1,%g3,%o5 - ld [s1_ptr+20],%g1 - ldd [s2_ptr+16],%g2 - std %o4,[res_ptr+8] - subxcc %g4,%g2,%o4 - ld [s1_ptr+24],%g4 - subxcc %g1,%g3,%o5 - ld [s1_ptr+28],%g1 - ldd [s2_ptr+24],%g2 - std %o4,[res_ptr+16] - subxcc %g4,%g2,%o4 - ld [s1_ptr+32],%g4 - subxcc %g1,%g3,%o5 - ld [s1_ptr+36],%g1 - ldd [s2_ptr+32],%g2 - std %o4,[res_ptr+24] - addx %g0,%g0,%o4 C save cy in register - addcc n,-8,n - add s1_ptr,32,s1_ptr - add s2_ptr,32,s2_ptr - add res_ptr,32,res_ptr - bge L(loop1) - subcc %g0,%o4,%g0 C restore cy - -L(fin1): - addcc n,8-2,n - blt L(end1) - subcc %g0,%o4,%g0 C restore cy -C Add blocks of 2 limbs until less than 2 limbs remain -L(loope1): - subxcc %g4,%g2,%o4 - ld [s1_ptr+8],%g4 - subxcc %g1,%g3,%o5 - ld [s1_ptr+12],%g1 - ldd [s2_ptr+8],%g2 - std %o4,[res_ptr+0] - addx %g0,%g0,%o4 C save cy in register - addcc n,-2,n - add s1_ptr,8,s1_ptr - add s2_ptr,8,s2_ptr - add res_ptr,8,res_ptr - bge L(loope1) - subcc %g0,%o4,%g0 C restore cy -L(end1): - subxcc %g4,%g2,%o4 - subxcc %g1,%g3,%o5 - std %o4,[res_ptr+0] - addx %g0,%g0,%o4 C save cy in register - - andcc n,1,%g0 - be L(ret1) - subcc %g0,%o4,%g0 C restore cy -C Add last limb - ld [s1_ptr+8],%g4 - ld [s2_ptr+8],%g2 - subxcc %g4,%g2,%o4 - st %o4,[res_ptr+8] - -L(ret1): - retl - addx %g0,%g0,%o0 C return carry-out from most sign. limb - -L(1): xor s1_ptr,res_ptr,%g1 - andcc %g1,4,%g0 - bne L(2) - nop -C ** V1b ** - andcc res_ptr,4,%g0 C res_ptr unaligned? Side effect: cy=0 - be L(v1b) C if no, branch - nop -C Add least significant limb separately to align res_ptr and s1_ptr - ld [s2_ptr],%g4 - add s2_ptr,4,s2_ptr - ld [s1_ptr],%g2 - add s1_ptr,4,s1_ptr - add n,-1,n - subcc %g2,%g4,%o4 - st %o4,[res_ptr] - add res_ptr,4,res_ptr -L(v1b): addx %g0,%g0,%o4 C save cy in register - cmp n,2 C if n < 2 ... - bl L(end2) C ... branch to tail code - subcc %g0,%o4,%g0 C restore cy - - ld [s2_ptr+0],%g4 - addcc n,-10,n - ld [s2_ptr+4],%g1 - ldd [s1_ptr+0],%g2 - blt L(fin1b) - subcc %g0,%o4,%g0 C restore cy -C Add blocks of 8 limbs until less than 8 limbs remain -L(loop1b): - subxcc %g2,%g4,%o4 - ld [s2_ptr+8],%g4 - subxcc %g3,%g1,%o5 - ld [s2_ptr+12],%g1 - ldd [s1_ptr+8],%g2 - std %o4,[res_ptr+0] - subxcc %g2,%g4,%o4 - ld [s2_ptr+16],%g4 - subxcc %g3,%g1,%o5 - ld [s2_ptr+20],%g1 - ldd [s1_ptr+16],%g2 - std %o4,[res_ptr+8] - subxcc %g2,%g4,%o4 - ld [s2_ptr+24],%g4 - subxcc %g3,%g1,%o5 - ld [s2_ptr+28],%g1 - ldd [s1_ptr+24],%g2 - std %o4,[res_ptr+16] - subxcc %g2,%g4,%o4 - ld [s2_ptr+32],%g4 - subxcc %g3,%g1,%o5 - ld [s2_ptr+36],%g1 - ldd [s1_ptr+32],%g2 - std %o4,[res_ptr+24] - addx %g0,%g0,%o4 C save cy in register - addcc n,-8,n - add s1_ptr,32,s1_ptr - add s2_ptr,32,s2_ptr - add res_ptr,32,res_ptr - bge L(loop1b) - subcc %g0,%o4,%g0 C restore cy - -L(fin1b): - addcc n,8-2,n - blt L(end1b) - subcc %g0,%o4,%g0 C restore cy -C Add blocks of 2 limbs until less than 2 limbs remain -L(loope1b): - subxcc %g2,%g4,%o4 - ld [s2_ptr+8],%g4 - subxcc %g3,%g1,%o5 - ld [s2_ptr+12],%g1 - ldd [s1_ptr+8],%g2 - std %o4,[res_ptr+0] - addx %g0,%g0,%o4 C save cy in register - addcc n,-2,n - add s1_ptr,8,s1_ptr - add s2_ptr,8,s2_ptr - add res_ptr,8,res_ptr - bge L(loope1b) - subcc %g0,%o4,%g0 C restore cy -L(end1b): - subxcc %g2,%g4,%o4 - subxcc %g3,%g1,%o5 - std %o4,[res_ptr+0] - addx %g0,%g0,%o4 C save cy in register - - andcc n,1,%g0 - be L(ret1b) - subcc %g0,%o4,%g0 C restore cy -C Add last limb - ld [s2_ptr+8],%g4 - ld [s1_ptr+8],%g2 - subxcc %g2,%g4,%o4 - st %o4,[res_ptr+8] - -L(ret1b): - retl - addx %g0,%g0,%o0 C return carry-out from most sign. limb - -C ** V2 ** -C If we come here, the alignment of s1_ptr and res_ptr as well as the -C alignment of s2_ptr and res_ptr differ. Since there are only two ways -C things can be aligned (that we care about) we now know that the alignment -C of s1_ptr and s2_ptr are the same. - -L(2): cmp n,1 - be L(jone) - nop - andcc s1_ptr,4,%g0 C s1_ptr unaligned? Side effect: cy=0 - be L(v2) C if no, branch - nop -C Add least significant limb separately to align s1_ptr and s2_ptr - ld [s1_ptr],%g4 - add s1_ptr,4,s1_ptr - ld [s2_ptr],%g2 - add s2_ptr,4,s2_ptr - add n,-1,n - subcc %g4,%g2,%o4 - st %o4,[res_ptr] - add res_ptr,4,res_ptr - -L(v2): addx %g0,%g0,%o4 C save cy in register - addcc n,-8,n - blt L(fin2) - subcc %g0,%o4,%g0 C restore cy -C Add blocks of 8 limbs until less than 8 limbs remain -L(loop2): - ldd [s1_ptr+0],%g2 - ldd [s2_ptr+0],%o4 - subxcc %g2,%o4,%g2 - st %g2,[res_ptr+0] - subxcc %g3,%o5,%g3 - st %g3,[res_ptr+4] - ldd [s1_ptr+8],%g2 - ldd [s2_ptr+8],%o4 - subxcc %g2,%o4,%g2 - st %g2,[res_ptr+8] - subxcc %g3,%o5,%g3 - st %g3,[res_ptr+12] - ldd [s1_ptr+16],%g2 - ldd [s2_ptr+16],%o4 - subxcc %g2,%o4,%g2 - st %g2,[res_ptr+16] - subxcc %g3,%o5,%g3 - st %g3,[res_ptr+20] - ldd [s1_ptr+24],%g2 - ldd [s2_ptr+24],%o4 - subxcc %g2,%o4,%g2 - st %g2,[res_ptr+24] - subxcc %g3,%o5,%g3 - st %g3,[res_ptr+28] - addx %g0,%g0,%o4 C save cy in register - addcc n,-8,n - add s1_ptr,32,s1_ptr - add s2_ptr,32,s2_ptr - add res_ptr,32,res_ptr - bge L(loop2) - subcc %g0,%o4,%g0 C restore cy - -L(fin2): - addcc n,8-2,n - blt L(end2) - subcc %g0,%o4,%g0 C restore cy -L(loope2): - ldd [s1_ptr+0],%g2 - ldd [s2_ptr+0],%o4 - subxcc %g2,%o4,%g2 - st %g2,[res_ptr+0] - subxcc %g3,%o5,%g3 - st %g3,[res_ptr+4] - addx %g0,%g0,%o4 C save cy in register - addcc n,-2,n - add s1_ptr,8,s1_ptr - add s2_ptr,8,s2_ptr - add res_ptr,8,res_ptr - bge L(loope2) - subcc %g0,%o4,%g0 C restore cy -L(end2): - andcc n,1,%g0 - be L(ret2) - subcc %g0,%o4,%g0 C restore cy -C Add last limb -L(jone): - ld [s1_ptr],%g4 - ld [s2_ptr],%g2 - subxcc %g4,%g2,%o4 - st %o4,[res_ptr] - -L(ret2): - retl - addx %g0,%g0,%o0 C return carry-out from most sign. limb -EPILOGUE(mpn_sub_n) diff --git a/rts/gmp/mpn/sparc32/submul_1.asm b/rts/gmp/mpn/sparc32/submul_1.asm deleted file mode 100644 index 12abd84..0000000 --- a/rts/gmp/mpn/sparc32/submul_1.asm +++ /dev/null @@ -1,146 +0,0 @@ -dnl SPARC mpn_submul_1 -- Multiply a limb vector with a limb and subtract -dnl the result from a second limb vector. - -dnl Copyright (C) 1992, 1993, 1994, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published -dnl by the Free Software Foundation; either version 2.1 of the License, or (at -dnl your option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - - -include(`../config.m4') - -C INPUT PARAMETERS -C res_ptr o0 -C s1_ptr o1 -C size o2 -C s2_limb o3 - -ASM_START() -PROLOGUE(mpn_submul_1) - C Make S1_PTR and RES_PTR point at the end of their blocks - C and put (- 4 x SIZE) in index/loop counter. - sll %o2,2,%o2 - add %o0,%o2,%o4 C RES_PTR in o4 since o0 is retval - add %o1,%o2,%o1 - sub %g0,%o2,%o2 - - cmp %o3,0xfff - bgu L(large) - nop - - ld [%o1+%o2],%o5 - mov 0,%o0 - b L(0) - add %o4,-4,%o4 -L(loop0): - subcc %o5,%g1,%g1 - ld [%o1+%o2],%o5 - addx %o0,%g0,%o0 - st %g1,[%o4+%o2] -L(0): wr %g0,%o3,%y - sra %o5,31,%g2 - and %o3,%g2,%g2 - andcc %g1,0,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,0,%g1 - sra %g1,20,%g4 - sll %g1,12,%g1 - rd %y,%g3 - srl %g3,20,%g3 - or %g1,%g3,%g1 - - addcc %g1,%o0,%g1 - addx %g2,%g4,%o0 C add sign-compensation and cy to hi limb - addcc %o2,4,%o2 C loop counter - bne L(loop0) - ld [%o4+%o2],%o5 - - subcc %o5,%g1,%g1 - addx %o0,%g0,%o0 - retl - st %g1,[%o4+%o2] - -L(large): - ld [%o1+%o2],%o5 - mov 0,%o0 - sra %o3,31,%g4 C g4 = mask of ones iff S2_LIMB < 0 - b L(1) - add %o4,-4,%o4 -L(loop): - subcc %o5,%g3,%g3 - ld [%o1+%o2],%o5 - addx %o0,%g0,%o0 - st %g3,[%o4+%o2] -L(1): wr %g0,%o5,%y - and %o5,%g4,%g2 - andcc %g0,%g0,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%g0,%g1 - rd %y,%g3 - addcc %g3,%o0,%g3 - addx %g2,%g1,%o0 - addcc %o2,4,%o2 - bne L(loop) - ld [%o4+%o2],%o5 - - subcc %o5,%g3,%g3 - addx %o0,%g0,%o0 - retl - st %g3,[%o4+%o2] -EPILOGUE(mpn_submul_1) diff --git a/rts/gmp/mpn/sparc32/udiv_fp.asm b/rts/gmp/mpn/sparc32/udiv_fp.asm deleted file mode 100644 index e340e14..0000000 --- a/rts/gmp/mpn/sparc32/udiv_fp.asm +++ /dev/null @@ -1,158 +0,0 @@ -dnl SPARC v7 __udiv_qrnnd division support, used from longlong.h. -dnl This is for v7 CPUs with a floating-point unit. - -dnl Copyright (C) 1993, 1994, 1996, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published -dnl by the Free Software Foundation; either version 2.1 of the License, or (at -dnl your option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - - -include(`../config.m4') - -C INPUT PARAMETERS -C rem_ptr i0 -C n1 i1 -C n0 i2 -C d i3 - -ASM_START() - -ifdef(`PIC', -` TEXT -L(getpc): - retl - nop') - - TEXT - ALIGN(8) -L(C0): .double 0r4294967296 -L(C1): .double 0r2147483648 - -PROLOGUE(mpn_udiv_qrnnd) - save %sp,-104,%sp - st %i1,[%fp-8] - ld [%fp-8],%f10 - -ifdef(`PIC', -`L(pc): call L(getpc) C put address of this insn in %o7 - ldd [%o7+L(C0)-L(pc)],%f8', -` sethi %hi(L(C0)),%o7 - ldd [%o7+%lo(L(C0))],%f8') - - fitod %f10,%f4 - cmp %i1,0 - bge L(248) - mov %i0,%i5 - faddd %f4,%f8,%f4 -L(248): - st %i2,[%fp-8] - ld [%fp-8],%f10 - fmuld %f4,%f8,%f6 - cmp %i2,0 - bge L(249) - fitod %f10,%f2 - faddd %f2,%f8,%f2 -L(249): - st %i3,[%fp-8] - faddd %f6,%f2,%f2 - ld [%fp-8],%f10 - cmp %i3,0 - bge L(250) - fitod %f10,%f4 - faddd %f4,%f8,%f4 -L(250): - fdivd %f2,%f4,%f2 - -ifdef(`PIC', -` ldd [%o7+L(C1)-L(pc)],%f4', -` sethi %hi(L(C1)),%o7 - ldd [%o7+%lo(L(C1))],%f4') - - fcmped %f2,%f4 - nop - fbge,a L(251) - fsubd %f2,%f4,%f2 - fdtoi %f2,%f2 - st %f2,[%fp-8] - b L(252) - ld [%fp-8],%i4 -L(251): - fdtoi %f2,%f2 - st %f2,[%fp-8] - ld [%fp-8],%i4 - sethi %hi(-2147483648),%g2 - xor %i4,%g2,%i4 -L(252): - wr %g0,%i4,%y - sra %i3,31,%g2 - and %i4,%g2,%g2 - andcc %g0,0,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,0,%g1 - add %g1,%g2,%i0 - rd %y,%g3 - subcc %i2,%g3,%o7 - subxcc %i1,%i0,%g0 - be L(253) - cmp %o7,%i3 - - add %i4,-1,%i0 - add %o7,%i3,%o7 - st %o7,[%i5] - ret - restore -L(253): - blu L(246) - mov %i4,%i0 - add %i4,1,%i0 - sub %o7,%i3,%o7 -L(246): - st %o7,[%i5] - ret - restore -EPILOGUE(mpn_udiv_qrnnd) diff --git a/rts/gmp/mpn/sparc32/udiv_nfp.asm b/rts/gmp/mpn/sparc32/udiv_nfp.asm deleted file mode 100644 index ae19f4c..0000000 --- a/rts/gmp/mpn/sparc32/udiv_nfp.asm +++ /dev/null @@ -1,193 +0,0 @@ -dnl SPARC v7 __udiv_qrnnd division support, used from longlong.h. -dnl This is for v7 CPUs without a floating-point unit. - -dnl Copyright (C) 1993, 1994, 1996, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published -dnl by the Free Software Foundation; either version 2.1 of the License, or (at -dnl your option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - - -include(`../config.m4') - -C INPUT PARAMETERS -C rem_ptr o0 -C n1 o1 -C n0 o2 -C d o3 - -ASM_START() -PROLOGUE(mpn_udiv_qrnnd) - tst %o3 - bneg L(largedivisor) - mov 8,%g1 - - b L(p1) - addxcc %o2,%o2,%o2 - -L(plop): - bcc L(n1) - addxcc %o2,%o2,%o2 -L(p1): addx %o1,%o1,%o1 - subcc %o1,%o3,%o4 - bcc L(n2) - addxcc %o2,%o2,%o2 -L(p2): addx %o1,%o1,%o1 - subcc %o1,%o3,%o4 - bcc L(n3) - addxcc %o2,%o2,%o2 -L(p3): addx %o1,%o1,%o1 - subcc %o1,%o3,%o4 - bcc L(n4) - addxcc %o2,%o2,%o2 -L(p4): addx %o1,%o1,%o1 - addcc %g1,-1,%g1 - bne L(plop) - subcc %o1,%o3,%o4 - bcc L(n5) - addxcc %o2,%o2,%o2 -L(p5): st %o1,[%o0] - retl - xnor %g0,%o2,%o0 - -L(nlop): - bcc L(p1) - addxcc %o2,%o2,%o2 -L(n1): addx %o4,%o4,%o4 - subcc %o4,%o3,%o1 - bcc L(p2) - addxcc %o2,%o2,%o2 -L(n2): addx %o4,%o4,%o4 - subcc %o4,%o3,%o1 - bcc L(p3) - addxcc %o2,%o2,%o2 -L(n3): addx %o4,%o4,%o4 - subcc %o4,%o3,%o1 - bcc L(p4) - addxcc %o2,%o2,%o2 -L(n4): addx %o4,%o4,%o4 - addcc %g1,-1,%g1 - bne L(nlop) - subcc %o4,%o3,%o1 - bcc L(p5) - addxcc %o2,%o2,%o2 -L(n5): st %o4,[%o0] - retl - xnor %g0,%o2,%o0 - -L(largedivisor): - and %o2,1,%o5 C %o5 = n0 & 1 - - srl %o2,1,%o2 - sll %o1,31,%g2 - or %g2,%o2,%o2 C %o2 = lo(n1n0 >> 1) - srl %o1,1,%o1 C %o1 = hi(n1n0 >> 1) - - and %o3,1,%g2 - srl %o3,1,%g3 C %g3 = floor(d / 2) - add %g3,%g2,%g3 C %g3 = ceil(d / 2) - - b L(Lp1) - addxcc %o2,%o2,%o2 - -L(Lplop): - bcc L(Ln1) - addxcc %o2,%o2,%o2 -L(Lp1): addx %o1,%o1,%o1 - subcc %o1,%g3,%o4 - bcc L(Ln2) - addxcc %o2,%o2,%o2 -L(Lp2): addx %o1,%o1,%o1 - subcc %o1,%g3,%o4 - bcc L(Ln3) - addxcc %o2,%o2,%o2 -L(Lp3): addx %o1,%o1,%o1 - subcc %o1,%g3,%o4 - bcc L(Ln4) - addxcc %o2,%o2,%o2 -L(Lp4): addx %o1,%o1,%o1 - addcc %g1,-1,%g1 - bne L(Lplop) - subcc %o1,%g3,%o4 - bcc L(Ln5) - addxcc %o2,%o2,%o2 -L(Lp5): add %o1,%o1,%o1 C << 1 - tst %g2 - bne L(oddp) - add %o5,%o1,%o1 - st %o1,[%o0] - retl - xnor %g0,%o2,%o0 - -L(Lnlop): - bcc L(Lp1) - addxcc %o2,%o2,%o2 -L(Ln1): addx %o4,%o4,%o4 - subcc %o4,%g3,%o1 - bcc L(Lp2) - addxcc %o2,%o2,%o2 -L(Ln2): addx %o4,%o4,%o4 - subcc %o4,%g3,%o1 - bcc L(Lp3) - addxcc %o2,%o2,%o2 -L(Ln3): addx %o4,%o4,%o4 - subcc %o4,%g3,%o1 - bcc L(Lp4) - addxcc %o2,%o2,%o2 -L(Ln4): addx %o4,%o4,%o4 - addcc %g1,-1,%g1 - bne L(Lnlop) - subcc %o4,%g3,%o1 - bcc L(Lp5) - addxcc %o2,%o2,%o2 -L(Ln5): add %o4,%o4,%o4 C << 1 - tst %g2 - bne L(oddn) - add %o5,%o4,%o4 - st %o4,[%o0] - retl - xnor %g0,%o2,%o0 - -L(oddp): - xnor %g0,%o2,%o2 - C q' in %o2. r' in %o1 - addcc %o1,%o2,%o1 - bcc L(Lp6) - addx %o2,0,%o2 - sub %o1,%o3,%o1 -L(Lp6): subcc %o1,%o3,%g0 - bcs L(Lp7) - subx %o2,-1,%o2 - sub %o1,%o3,%o1 -L(Lp7): st %o1,[%o0] - retl - mov %o2,%o0 - -L(oddn): - xnor %g0,%o2,%o2 - C q' in %o2. r' in %o4 - addcc %o4,%o2,%o4 - bcc L(Ln6) - addx %o2,0,%o2 - sub %o4,%o3,%o4 -L(Ln6): subcc %o4,%o3,%g0 - bcs L(Ln7) - subx %o2,-1,%o2 - sub %o4,%o3,%o4 -L(Ln7): st %o4,[%o0] - retl - mov %o2,%o0 -EPILOGUE(mpn_udiv_qrnnd) diff --git a/rts/gmp/mpn/sparc32/umul.asm b/rts/gmp/mpn/sparc32/umul.asm deleted file mode 100644 index efa5685..0000000 --- a/rts/gmp/mpn/sparc32/umul.asm +++ /dev/null @@ -1,68 +0,0 @@ -dnl SPARC mpn_umul_ppmm -- support for longlong.h for non-gcc. - -dnl Copyright (C) 1995, 1996, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published -dnl by the Free Software Foundation; either version 2.1 of the License, or (at -dnl your option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - - -include(`../config.m4') - -ASM_START() -PROLOGUE(mpn_umul_ppmm) - wr %g0,%o1,%y - sra %o2,31,%g2 C Don't move this insn - and %o1,%g2,%g2 C Don't move this insn - andcc %g0,0,%g1 C Don't move this insn - mulscc %g1,%o2,%g1 - mulscc %g1,%o2,%g1 - mulscc %g1,%o2,%g1 - mulscc %g1,%o2,%g1 - mulscc %g1,%o2,%g1 - mulscc %g1,%o2,%g1 - mulscc %g1,%o2,%g1 - mulscc %g1,%o2,%g1 - mulscc %g1,%o2,%g1 - mulscc %g1,%o2,%g1 - mulscc %g1,%o2,%g1 - mulscc %g1,%o2,%g1 - mulscc %g1,%o2,%g1 - mulscc %g1,%o2,%g1 - mulscc %g1,%o2,%g1 - mulscc %g1,%o2,%g1 - mulscc %g1,%o2,%g1 - mulscc %g1,%o2,%g1 - mulscc %g1,%o2,%g1 - mulscc %g1,%o2,%g1 - mulscc %g1,%o2,%g1 - mulscc %g1,%o2,%g1 - mulscc %g1,%o2,%g1 - mulscc %g1,%o2,%g1 - mulscc %g1,%o2,%g1 - mulscc %g1,%o2,%g1 - mulscc %g1,%o2,%g1 - mulscc %g1,%o2,%g1 - mulscc %g1,%o2,%g1 - mulscc %g1,%o2,%g1 - mulscc %g1,%o2,%g1 - mulscc %g1,%o2,%g1 - mulscc %g1,0,%g1 - rd %y,%g3 - st %g3,[%o0] - retl - add %g1,%g2,%o0 -EPILOGUE(mpn_umul_ppmm) diff --git a/rts/gmp/mpn/sparc32/v8/addmul_1.asm b/rts/gmp/mpn/sparc32/v8/addmul_1.asm deleted file mode 100644 index da44644..0000000 --- a/rts/gmp/mpn/sparc32/v8/addmul_1.asm +++ /dev/null @@ -1,122 +0,0 @@ -dnl SPARC v8 mpn_addmul_1 -- Multiply a limb vector with a limb and -dnl add the result to a second limb vector. - -dnl Copyright (C) 1992, 1993, 1994, 1995, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published -dnl by the Free Software Foundation; either version 2.1 of the License, or (at -dnl your option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - - -include(`../config.m4') - -C INPUT PARAMETERS -C res_ptr o0 -C s1_ptr o1 -C size o2 -C s2_limb o3 - -ASM_START() -PROLOGUE(mpn_addmul_1) - orcc %g0,%g0,%g2 - ld [%o1+0],%o4 C 1 - - sll %o2,4,%g1 - and %g1,(4-1)<<4,%g1 -ifdef(`PIC', -` mov %o7,%g4 C Save return address register -0: call 1f - add %o7,L(1)-0b,%g3 -1: mov %g4,%o7 C Restore return address register -', -` sethi %hi(L(1)),%g3 - or %g3,%lo(L(1)),%g3 -') - jmp %g3+%g1 - nop -L(1): -L(L00): add %o0,-4,%o0 - b L(loop00) C 4, 8, 12, ... - add %o1,-4,%o1 - nop -L(L01): b L(loop01) C 1, 5, 9, ... - nop - nop - nop -L(L10): add %o0,-12,%o0 C 2, 6, 10, ... - b L(loop10) - add %o1,4,%o1 - nop -L(L11): add %o0,-8,%o0 C 3, 7, 11, ... - b L(loop11) - add %o1,-8,%o1 - nop - -L(loop): - addcc %g3,%g2,%g3 C 1 - ld [%o1+4],%o4 C 2 - rd %y,%g2 C 1 - addx %g0,%g2,%g2 - ld [%o0+0],%g1 C 2 - addcc %g1,%g3,%g3 - st %g3,[%o0+0] C 1 -L(loop00): - umul %o4,%o3,%g3 C 2 - ld [%o0+4],%g1 C 2 - addxcc %g3,%g2,%g3 C 2 - ld [%o1+8],%o4 C 3 - rd %y,%g2 C 2 - addx %g0,%g2,%g2 - nop - addcc %g1,%g3,%g3 - st %g3,[%o0+4] C 2 -L(loop11): - umul %o4,%o3,%g3 C 3 - addxcc %g3,%g2,%g3 C 3 - ld [%o1+12],%o4 C 4 - rd %y,%g2 C 3 - add %o1,16,%o1 - addx %g0,%g2,%g2 - ld [%o0+8],%g1 C 2 - addcc %g1,%g3,%g3 - st %g3,[%o0+8] C 3 -L(loop10): - umul %o4,%o3,%g3 C 4 - addxcc %g3,%g2,%g3 C 4 - ld [%o1+0],%o4 C 1 - rd %y,%g2 C 4 - addx %g0,%g2,%g2 - ld [%o0+12],%g1 C 2 - addcc %g1,%g3,%g3 - st %g3,[%o0+12] C 4 - add %o0,16,%o0 - addx %g0,%g2,%g2 -L(loop01): - addcc %o2,-4,%o2 - bg L(loop) - umul %o4,%o3,%g3 C 1 - - addcc %g3,%g2,%g3 C 4 - rd %y,%g2 C 4 - addx %g0,%g2,%g2 - ld [%o0+0],%g1 C 2 - addcc %g1,%g3,%g3 - st %g3,[%o0+0] C 4 - addx %g0,%g2,%o0 - - retl - nop -EPILOGUE(mpn_addmul_1) diff --git a/rts/gmp/mpn/sparc32/v8/mul_1.asm b/rts/gmp/mpn/sparc32/v8/mul_1.asm deleted file mode 100644 index 8012475..0000000 --- a/rts/gmp/mpn/sparc32/v8/mul_1.asm +++ /dev/null @@ -1,103 +0,0 @@ -dnl SPARC v8 mpn_mul_1 -- Multiply a limb vector with a single limb and -dnl store the product in a second limb vector. - -dnl Copyright (C) 1992, 1994, 1995, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published -dnl by the Free Software Foundation; either version 2.1 of the License, or (at -dnl your option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - - -include(`../config.m4') - -C INPUT PARAMETERS -C res_ptr o0 -C s1_ptr o1 -C size o2 -C s2_limb o3 - -ASM_START() -PROLOGUE(mpn_mul_1) - sll %o2,4,%g1 - and %g1,(4-1)<<4,%g1 -ifdef(`PIC', -` mov %o7,%g4 C Save return address register -0: call 1f - add %o7,L(1)-0b,%g3 -1: mov %g4,%o7 C Restore return address register -', -` sethi %hi(L(1)),%g3 - or %g3,%lo(L(1)),%g3 -') - jmp %g3+%g1 - ld [%o1+0],%o4 C 1 -L(1): -L(L00): add %o0,-4,%o0 - add %o1,-4,%o1 - b L(loop00) C 4, 8, 12, ... - orcc %g0,%g0,%g2 -L(L01): b L(loop01) C 1, 5, 9, ... - orcc %g0,%g0,%g2 - nop - nop -L(L10): add %o0,-12,%o0 C 2, 6, 10, ... - add %o1,4,%o1 - b L(loop10) - orcc %g0,%g0,%g2 - nop -L(L11): add %o0,-8,%o0 C 3, 7, 11, ... - add %o1,-8,%o1 - b L(loop11) - orcc %g0,%g0,%g2 - -L(loop): - addcc %g3,%g2,%g3 C 1 - ld [%o1+4],%o4 C 2 - st %g3,[%o0+0] C 1 - rd %y,%g2 C 1 -L(loop00): - umul %o4,%o3,%g3 C 2 - addxcc %g3,%g2,%g3 C 2 - ld [%o1+8],%o4 C 3 - st %g3,[%o0+4] C 2 - rd %y,%g2 C 2 -L(loop11): - umul %o4,%o3,%g3 C 3 - addxcc %g3,%g2,%g3 C 3 - ld [%o1+12],%o4 C 4 - add %o1,16,%o1 - st %g3,[%o0+8] C 3 - rd %y,%g2 C 3 -L(loop10): - umul %o4,%o3,%g3 C 4 - addxcc %g3,%g2,%g3 C 4 - ld [%o1+0],%o4 C 1 - st %g3,[%o0+12] C 4 - add %o0,16,%o0 - rd %y,%g2 C 4 - addx %g0,%g2,%g2 -L(loop01): - addcc %o2,-4,%o2 - bg L(loop) - umul %o4,%o3,%g3 C 1 - - addcc %g3,%g2,%g3 C 4 - st %g3,[%o0+0] C 4 - rd %y,%g2 C 4 - - retl - addx %g0,%g2,%o0 -EPILOGUE(mpn_mul_1) diff --git a/rts/gmp/mpn/sparc32/v8/submul_1.asm b/rts/gmp/mpn/sparc32/v8/submul_1.asm deleted file mode 100644 index 9ed132f..0000000 --- a/rts/gmp/mpn/sparc32/v8/submul_1.asm +++ /dev/null @@ -1,58 +0,0 @@ -dnl SPARC v8 mpn_submul_1 -- Multiply a limb vector with a limb and -dnl subtract the result from a second limb vector. - -dnl Copyright (C) 1992, 1993, 1994, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published -dnl by the Free Software Foundation; either version 2.1 of the License, or (at -dnl your option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - - -include(`../config.m4') - -C INPUT PARAMETERS -C res_ptr o0 -C s1_ptr o1 -C size o2 -C s2_limb o3 - -ASM_START() -PROLOGUE(mpn_submul_1) - sub %g0,%o2,%o2 C negate ... - sll %o2,2,%o2 C ... and scale size - sub %o1,%o2,%o1 C o1 is offset s1_ptr - sub %o0,%o2,%g1 C g1 is offset res_ptr - - mov 0,%o0 C clear cy_limb - -L(loop): - ld [%o1+%o2],%o4 - ld [%g1+%o2],%g2 - umul %o4,%o3,%o5 - rd %y,%g3 - addcc %o5,%o0,%o5 - addx %g3,0,%o0 - subcc %g2,%o5,%g2 - addx %o0,0,%o0 - st %g2,[%g1+%o2] - - addcc %o2,4,%o2 - bne L(loop) - nop - - retl - nop -EPILOGUE(mpn_submul_1) diff --git a/rts/gmp/mpn/sparc32/v8/supersparc/udiv.asm b/rts/gmp/mpn/sparc32/v8/supersparc/udiv.asm deleted file mode 100644 index 0d5e8d4..0000000 --- a/rts/gmp/mpn/sparc32/v8/supersparc/udiv.asm +++ /dev/null @@ -1,122 +0,0 @@ -dnl SuperSPARC mpn_udiv_qrnnd division support, used from longlong.h. -dnl This is for SuperSPARC only, to compensate for its semi-functional -dnl udiv instruction. - -dnl Copyright (C) 1993, 1994, 1996, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published -dnl by the Free Software Foundation; either version 2.1 of the License, or (at -dnl your option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - - -include(`../config.m4') - -C INPUT PARAMETERS -C rem_ptr i0 -C n1 i1 -C n0 i2 -C d i3 - -ASM_START() - -ifdef(`PIC', -` TEXT -L(getpc): - retl - nop') - - TEXT - ALIGN(8) -L(C0): .double 0r4294967296 -L(C1): .double 0r2147483648 - -PROLOGUE(mpn_udiv_qrnnd) - save %sp,-104,%sp - st %i1,[%fp-8] - ld [%fp-8],%f10 - -ifdef(`PIC', -`L(pc): call L(getpc) C put address of this insn in %o7 - ldd [%o7+L(C0)-L(pc)],%f8', -` sethi %hi(L(C0)),%o7 - ldd [%o7+%lo(L(C0))],%f8') - - fitod %f10,%f4 - cmp %i1,0 - bge L(248) - mov %i0,%i5 - faddd %f4,%f8,%f4 -L(248): - st %i2,[%fp-8] - ld [%fp-8],%f10 - fmuld %f4,%f8,%f6 - cmp %i2,0 - bge L(249) - fitod %f10,%f2 - faddd %f2,%f8,%f2 -L(249): - st %i3,[%fp-8] - faddd %f6,%f2,%f2 - ld [%fp-8],%f10 - cmp %i3,0 - bge L(250) - fitod %f10,%f4 - faddd %f4,%f8,%f4 -L(250): - fdivd %f2,%f4,%f2 - -ifdef(`PIC', -` ldd [%o7+L(C1)-L(pc)],%f4', -` sethi %hi(L(C1)),%o7 - ldd [%o7+%lo(L(C1))],%f4') - - fcmped %f2,%f4 - nop - fbge,a L(251) - fsubd %f2,%f4,%f2 - fdtoi %f2,%f2 - st %f2,[%fp-8] - b L(252) - ld [%fp-8],%i4 -L(251): - fdtoi %f2,%f2 - st %f2,[%fp-8] - ld [%fp-8],%i4 - sethi %hi(-2147483648),%g2 - xor %i4,%g2,%i4 -L(252): - umul %i3,%i4,%g3 - rd %y,%i0 - subcc %i2,%g3,%o7 - subxcc %i1,%i0,%g0 - be L(253) - cmp %o7,%i3 - - add %i4,-1,%i0 - add %o7,%i3,%o7 - st %o7,[%i5] - ret - restore -L(253): - blu L(246) - mov %i4,%i0 - add %i4,1,%i0 - sub %o7,%i3,%o7 -L(246): - st %o7,[%i5] - ret - restore -EPILOGUE(mpn_udiv_qrnnd) diff --git a/rts/gmp/mpn/sparc32/v8/umul.asm b/rts/gmp/mpn/sparc32/v8/umul.asm deleted file mode 100644 index ae8f692..0000000 --- a/rts/gmp/mpn/sparc32/v8/umul.asm +++ /dev/null @@ -1,31 +0,0 @@ -dnl SPARC v8 mpn_umul_ppmm -- support for longlong.h for non-gcc. - -dnl Copyright (C) 1995, 1996, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published -dnl by the Free Software Foundation; either version 2.1 of the License, or (at -dnl your option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - - -include(`../config.m4') - -ASM_START() -PROLOGUE(mpn_umul_ppmm) - umul %o1,%o2,%g2 - st %g2,[%o0] - retl - rd %y,%o0 -EPILOGUE(mpn_umul_ppmm) diff --git a/rts/gmp/mpn/sparc32/v9/README b/rts/gmp/mpn/sparc32/v9/README deleted file mode 100644 index 9b39713..0000000 --- a/rts/gmp/mpn/sparc32/v9/README +++ /dev/null @@ -1,4 +0,0 @@ -Code for SPARC processors implementing version 9 of the SPARC architecture. -This code is for systems that doesn't preserve the full 64-bit contents of -integer register at context switch. For other systems (such as Solaris 7 or -later) use the code in ../../sparc64. diff --git a/rts/gmp/mpn/sparc32/v9/addmul_1.asm b/rts/gmp/mpn/sparc32/v9/addmul_1.asm deleted file mode 100644 index c1762cc..0000000 --- a/rts/gmp/mpn/sparc32/v9/addmul_1.asm +++ /dev/null @@ -1,288 +0,0 @@ -dnl SPARC v9 32-bit mpn_addmul_1 -- Multiply a limb vector with a limb and -dnl add the result to a second limb vector. - -dnl Copyright (C) 1998, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published -dnl by the Free Software Foundation; either version 2.1 of the License, or (at -dnl your option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - - -include(`../config.m4') - -C INPUT PARAMETERS -C res_ptr i0 -C s1_ptr i1 -C size i2 -C s2_limb i3 - -ASM_START() - - TEXT - ALIGN(4) -L(noll): - .word 0 - -PROLOGUE(mpn_addmul_1) - save %sp,-256,%sp - -ifdef(`PIC', -`L(pc): rd %pc,%o7 - ld [%o7+L(noll)-L(pc)],%f10', -` sethi %hi(L(noll)),%g1 - ld [%g1+%lo(L(noll))],%f10') - - sethi %hi(0xffff0000),%o0 - andn %i3,%o0,%o0 - st %o0,[%fp-16] - ld [%fp-16],%f11 - fxtod %f10,%f6 - - srl %i3,16,%o0 - st %o0,[%fp-16] - ld [%fp-16],%f11 - fxtod %f10,%f8 - - mov 0,%g3 C cy = 0 - - ld [%i1],%f11 - subcc %i2,1,%i2 - be,pn %icc,L(end1) - add %i1,4,%i1 C s1_ptr++ - - fxtod %f10,%f2 - ld [%i1],%f11 - add %i1,4,%i1 C s1_ptr++ - fmuld %f2,%f8,%f16 - fmuld %f2,%f6,%f4 - fdtox %f16,%f14 - std %f14,[%fp-24] - fdtox %f4,%f12 - subcc %i2,1,%i2 - be,pn %icc,L(end2) - std %f12,[%fp-16] - - fxtod %f10,%f2 - ld [%i1],%f11 - add %i1,4,%i1 C s1_ptr++ - fmuld %f2,%f8,%f16 - fmuld %f2,%f6,%f4 - fdtox %f16,%f14 - std %f14,[%fp-40] - fdtox %f4,%f12 - subcc %i2,1,%i2 - be,pn %icc,L(end3) - std %f12,[%fp-32] - - fxtod %f10,%f2 - ld [%i1],%f11 - add %i1,4,%i1 C s1_ptr++ - ld [%i0],%g5 - ldx [%fp-24],%g2 C p16 - fmuld %f2,%f8,%f16 - ldx [%fp-16],%g1 C p0 - fmuld %f2,%f6,%f4 - sllx %g2,16,%g2 C align p16 - fdtox %f16,%f14 - add %g2,%g1,%g1 C add p16 to p0 (ADD1) - std %f14,[%fp-24] - fdtox %f4,%f12 - add %i0,4,%i0 C res_ptr++ - subcc %i2,1,%i2 - be,pn %icc,L(end4) - std %f12,[%fp-16] - - b,a L(loopm) - - .align 16 -C BEGIN LOOP -L(loop): - fxtod %f10,%f2 - ld [%i1],%f11 - add %i1,4,%i1 C s1_ptr++ - add %g5,%g1,%g1 C add *res_ptr to p0 (ADD2) - add %g3,%g1,%g4 C p += cy - ld [%i0],%g5 - srlx %g4,32,%g3 - ldx [%fp-24],%g2 C p16 - fmuld %f2,%f8,%f16 - ldx [%fp-16],%g1 C p0 - fmuld %f2,%f6,%f4 - sllx %g2,16,%g2 C align p16 - st %g4,[%i0-4] - fdtox %f16,%f14 - add %g2,%g1,%g1 C add p16 to p0 (ADD1) - std %f14,[%fp-24] - fdtox %f4,%f12 - std %f12,[%fp-16] - subcc %i2,1,%i2 - be,pn %icc,L(loope) - add %i0,4,%i0 C res_ptr++ -L(loopm): - fxtod %f10,%f2 - ld [%i1],%f11 - add %i1,4,%i1 C s1_ptr++ - add %g5,%g1,%g1 C add *res_ptr to p0 (ADD2) - add %g3,%g1,%g4 C p += cy - ld [%i0],%g5 - srlx %g4,32,%g3 - ldx [%fp-40],%g2 C p16 - fmuld %f2,%f8,%f16 - ldx [%fp-32],%g1 C p0 - fmuld %f2,%f6,%f4 - sllx %g2,16,%g2 C align p16 - st %g4,[%i0-4] - fdtox %f16,%f14 - add %g2,%g1,%g1 C add p16 to p0 (ADD1) - std %f14,[%fp-40] - fdtox %f4,%f12 - std %f12,[%fp-32] - subcc %i2,1,%i2 - bne,pt %icc,L(loop) - add %i0,4,%i0 C res_ptr++ -C END LOOP - - fxtod %f10,%f2 - add %g5,%g1,%g1 C add *res_ptr to p0 (ADD2) - add %g3,%g1,%g4 C p += cy - ld [%i0],%g5 - srlx %g4,32,%g3 - ldx [%fp-24],%g2 C p16 - fmuld %f2,%f8,%f16 - ldx [%fp-16],%g1 C p0 - fmuld %f2,%f6,%f4 - sllx %g2,16,%g2 C align p16 - st %g4,[%i0-4] - b,a L(xxx) -L(loope): -L(end4): - fxtod %f10,%f2 - add %g5,%g1,%g1 C add *res_ptr to p0 (ADD2) - add %g3,%g1,%g4 C p += cy - ld [%i0],%g5 - srlx %g4,32,%g3 - ldx [%fp-40],%g2 C p16 - fmuld %f2,%f8,%f16 - ldx [%fp-32],%g1 C p0 - fmuld %f2,%f6,%f4 - sllx %g2,16,%g2 C align p16 - st %g4,[%i0-4] - fdtox %f16,%f14 - add %g2,%g1,%g1 C add p16 to p0 (ADD1) - std %f14,[%fp-40] - fdtox %f4,%f12 - std %f12,[%fp-32] - add %i0,4,%i0 C res_ptr++ - - add %g5,%g1,%g1 C add *res_ptr to p0 (ADD2) - add %g3,%g1,%g4 C p += cy - ld [%i0],%g5 - srlx %g4,32,%g3 - ldx [%fp-24],%g2 C p16 - ldx [%fp-16],%g1 C p0 - sllx %g2,16,%g2 C align p16 - st %g4,[%i0-4] - b,a L(yyy) - -L(end3): - fxtod %f10,%f2 - ld [%i0],%g5 - ldx [%fp-24],%g2 C p16 - fmuld %f2,%f8,%f16 - ldx [%fp-16],%g1 C p0 - fmuld %f2,%f6,%f4 - sllx %g2,16,%g2 C align p16 -L(xxx): fdtox %f16,%f14 - add %g2,%g1,%g1 C add p16 to p0 (ADD1) - std %f14,[%fp-24] - fdtox %f4,%f12 - std %f12,[%fp-16] - add %i0,4,%i0 C res_ptr++ - - add %g5,%g1,%g1 C add *res_ptr to p0 (ADD2) - add %g3,%g1,%g4 C p += cy - ld [%i0],%g5 - srlx %g4,32,%g3 - ldx [%fp-40],%g2 C p16 - ldx [%fp-32],%g1 C p0 - sllx %g2,16,%g2 C align p16 - st %g4,[%i0-4] - add %g2,%g1,%g1 C add p16 to p0 (ADD1) - add %i0,4,%i0 C res_ptr++ - - add %g5,%g1,%g1 C add *res_ptr to p0 (ADD2) - add %g3,%g1,%g4 C p += cy - ld [%i0],%g5 - srlx %g4,32,%g3 - ldx [%fp-24],%g2 C p16 - ldx [%fp-16],%g1 C p0 - sllx %g2,16,%g2 C align p16 - st %g4,[%i0-4] - add %g2,%g1,%g1 C add p16 to p0 (ADD1) - add %i0,4,%i0 C res_ptr++ - b,a L(ret) - -L(end2): - fxtod %f10,%f2 - fmuld %f2,%f8,%f16 - fmuld %f2,%f6,%f4 - fdtox %f16,%f14 - std %f14,[%fp-40] - fdtox %f4,%f12 - std %f12,[%fp-32] - ld [%i0],%g5 - ldx [%fp-24],%g2 C p16 - ldx [%fp-16],%g1 C p0 - sllx %g2,16,%g2 C align p16 -L(yyy): add %g2,%g1,%g1 C add p16 to p0 (ADD1) - add %i0,4,%i0 C res_ptr++ - - add %g5,%g1,%g1 C add *res_ptr to p0 (ADD2) - add %g3,%g1,%g4 C p += cy - ld [%i0],%g5 - srlx %g4,32,%g3 - ldx [%fp-40],%g2 C p16 - ldx [%fp-32],%g1 C p0 - sllx %g2,16,%g2 C align p16 - st %g4,[%i0-4] - add %g2,%g1,%g1 C add p16 to p0 (ADD1) - add %i0,4,%i0 C res_ptr++ - b,a L(ret) - -L(end1): - fxtod %f10,%f2 - fmuld %f2,%f8,%f16 - fmuld %f2,%f6,%f4 - fdtox %f16,%f14 - std %f14,[%fp-24] - fdtox %f4,%f12 - std %f12,[%fp-16] - - ld [%i0],%g5 - ldx [%fp-24],%g2 C p16 - ldx [%fp-16],%g1 C p0 - sllx %g2,16,%g2 C align p16 - add %g2,%g1,%g1 C add p16 to p0 (ADD1) - add %i0,4,%i0 C res_ptr++ - -L(ret): add %g5,%g1,%g1 C add *res_ptr to p0 (ADD2) - add %g3,%g1,%g4 C p += cy - srlx %g4,32,%g3 - st %g4,[%i0-4] - - ret - restore %g0,%g3,%o0 C sideeffect: put cy in retreg -EPILOGUE(mpn_addmul_1) diff --git a/rts/gmp/mpn/sparc32/v9/gmp-mparam.h b/rts/gmp/mpn/sparc32/v9/gmp-mparam.h deleted file mode 100644 index f946b90..0000000 --- a/rts/gmp/mpn/sparc32/v9/gmp-mparam.h +++ /dev/null @@ -1,69 +0,0 @@ -/* gmp-mparam.h -- Compiler/machine parameter header file. - -Copyright (C) 1991, 1993, 1994, 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. */ - -#define BITS_PER_MP_LIMB 32 -#define BYTES_PER_MP_LIMB 4 -#define BITS_PER_LONGINT 32 -#define BITS_PER_INT 32 -#define BITS_PER_SHORTINT 16 -#define BITS_PER_CHAR 8 - - -/* These values are for UltraSPARC I, II, and IIi. It is bogus that - this file lives in v9, but that will do for now. */ - -/* Variations in addmul_1 speed make the multiply and square thresholds - doubtful. TOOM3_SQR_THRESHOLD had to be estimated here. */ - -/* Generated by tuneup.c, 2000-07-06. */ - -#ifndef KARATSUBA_MUL_THRESHOLD -#define KARATSUBA_MUL_THRESHOLD 30 -#endif -#ifndef TOOM3_MUL_THRESHOLD -#define TOOM3_MUL_THRESHOLD 200 -#endif - -#ifndef KARATSUBA_SQR_THRESHOLD -#define KARATSUBA_SQR_THRESHOLD 59 -#endif -#ifndef TOOM3_SQR_THRESHOLD -#define TOOM3_SQR_THRESHOLD 500 -#endif - -#ifndef BZ_THRESHOLD -#define BZ_THRESHOLD 107 -#endif - -#ifndef FIB_THRESHOLD -#define FIB_THRESHOLD 146 -#endif - -#ifndef POWM_THRESHOLD -#define POWM_THRESHOLD 29 -#endif - -#ifndef GCD_ACCEL_THRESHOLD -#define GCD_ACCEL_THRESHOLD 4 -#endif -#ifndef GCDEXT_THRESHOLD -#define GCDEXT_THRESHOLD 3 -#endif diff --git a/rts/gmp/mpn/sparc32/v9/mul_1.asm b/rts/gmp/mpn/sparc32/v9/mul_1.asm deleted file mode 100644 index f8f0fdd..0000000 --- a/rts/gmp/mpn/sparc32/v9/mul_1.asm +++ /dev/null @@ -1,267 +0,0 @@ -dnl SPARC v9 32-bit mpn_mul_1 -- Multiply a limb vector with a limb and -dnl store the result in a second limb vector. - -dnl Copyright (C) 1998, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published -dnl by the Free Software Foundation; either version 2.1 of the License, or (at -dnl your option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - - -include(`../config.m4') - -C INPUT PARAMETERS -C res_ptr i0 -C s1_ptr i1 -C size i2 -C s2_limb i3 - -ASM_START() - - TEXT - ALIGN(4) -L(noll): - .word 0 - -PROLOGUE(mpn_mul_1) - save %sp,-256,%sp - -ifdef(`PIC', -`L(pc): rd %pc,%o7 - ld [%o7+L(noll)-L(pc)],%f10', -` sethi %hi(L(noll)),%g1 - ld [%g1+%lo(L(noll))],%f10') - - sethi %hi(0xffff0000),%o0 - andn %i3,%o0,%o0 - st %o0,[%fp-16] - ld [%fp-16],%f11 - fxtod %f10,%f6 - - srl %i3,16,%o0 - st %o0,[%fp-16] - ld [%fp-16],%f11 - fxtod %f10,%f8 - - mov 0,%g3 C cy = 0 - - ld [%i1],%f11 - subcc %i2,1,%i2 - be,pn %icc,L(end1) - add %i1,4,%i1 C s1_ptr++ - - fxtod %f10,%f2 - ld [%i1],%f11 - add %i1,4,%i1 C s1_ptr++ - fmuld %f2,%f8,%f16 - fmuld %f2,%f6,%f4 - fdtox %f16,%f14 - std %f14,[%fp-24] - fdtox %f4,%f12 - subcc %i2,1,%i2 - be,pn %icc,L(end2) - std %f12,[%fp-16] - - fxtod %f10,%f2 - ld [%i1],%f11 - add %i1,4,%i1 C s1_ptr++ - fmuld %f2,%f8,%f16 - fmuld %f2,%f6,%f4 - fdtox %f16,%f14 - std %f14,[%fp-40] - fdtox %f4,%f12 - subcc %i2,1,%i2 - be,pn %icc,L(end3) - std %f12,[%fp-32] - - fxtod %f10,%f2 - ld [%i1],%f11 - add %i1,4,%i1 C s1_ptr++ - ldx [%fp-24],%g2 C p16 - fmuld %f2,%f8,%f16 - ldx [%fp-16],%g1 C p0 - fmuld %f2,%f6,%f4 - sllx %g2,16,%g2 C align p16 - fdtox %f16,%f14 - add %g2,%g1,%g1 C add p16 to p0 (ADD1) - std %f14,[%fp-24] - fdtox %f4,%f12 - add %i0,4,%i0 C res_ptr++ - subcc %i2,1,%i2 - be,pn %icc,L(end4) - std %f12,[%fp-16] - - b,a L(loopm) - - .align 16 -C BEGIN LOOP -L(loop): - fxtod %f10,%f2 - ld [%i1],%f11 - add %i1,4,%i1 C s1_ptr++ - add %g3,%g1,%g4 C p += cy - srlx %g4,32,%g3 - ldx [%fp-24],%g2 C p16 - fmuld %f2,%f8,%f16 - ldx [%fp-16],%g1 C p0 - fmuld %f2,%f6,%f4 - sllx %g2,16,%g2 C align p16 - st %g4,[%i0-4] - fdtox %f16,%f14 - add %g2,%g1,%g1 C add p16 to p0 (ADD1) - std %f14,[%fp-24] - fdtox %f4,%f12 - std %f12,[%fp-16] - subcc %i2,1,%i2 - be,pn %icc,L(loope) - add %i0,4,%i0 C res_ptr++ -L(loopm): - fxtod %f10,%f2 - ld [%i1],%f11 - add %i1,4,%i1 C s1_ptr++ - add %g3,%g1,%g4 C p += cy - srlx %g4,32,%g3 - ldx [%fp-40],%g2 C p16 - fmuld %f2,%f8,%f16 - ldx [%fp-32],%g1 C p0 - fmuld %f2,%f6,%f4 - sllx %g2,16,%g2 C align p16 - st %g4,[%i0-4] - fdtox %f16,%f14 - add %g2,%g1,%g1 C add p16 to p0 (ADD1) - std %f14,[%fp-40] - fdtox %f4,%f12 - std %f12,[%fp-32] - subcc %i2,1,%i2 - bne,pt %icc,L(loop) - add %i0,4,%i0 C res_ptr++ -C END LOOP - - fxtod %f10,%f2 - add %g3,%g1,%g4 C p += cy - srlx %g4,32,%g3 - ldx [%fp-24],%g2 C p16 - fmuld %f2,%f8,%f16 - ldx [%fp-16],%g1 C p0 - fmuld %f2,%f6,%f4 - sllx %g2,16,%g2 C align p16 - st %g4,[%i0-4] - b,a L(xxx) -L(loope): -L(end4): - fxtod %f10,%f2 - add %g3,%g1,%g4 C p += cy - srlx %g4,32,%g3 - ldx [%fp-40],%g2 C p16 - fmuld %f2,%f8,%f16 - ldx [%fp-32],%g1 C p0 - fmuld %f2,%f6,%f4 - sllx %g2,16,%g2 C align p16 - st %g4,[%i0-4] - fdtox %f16,%f14 - add %g2,%g1,%g1 C add p16 to p0 (ADD1) - std %f14,[%fp-40] - fdtox %f4,%f12 - std %f12,[%fp-32] - add %i0,4,%i0 C res_ptr++ - - add %g3,%g1,%g4 C p += cy - srlx %g4,32,%g3 - ldx [%fp-24],%g2 C p16 - ldx [%fp-16],%g1 C p0 - sllx %g2,16,%g2 C align p16 - st %g4,[%i0-4] - b,a L(yyy) - -L(end3): - fxtod %f10,%f2 - ldx [%fp-24],%g2 C p16 - fmuld %f2,%f8,%f16 - ldx [%fp-16],%g1 C p0 - fmuld %f2,%f6,%f4 - sllx %g2,16,%g2 C align p16 -L(xxx): fdtox %f16,%f14 - add %g2,%g1,%g1 C add p16 to p0 (ADD1) - std %f14,[%fp-24] - fdtox %f4,%f12 - std %f12,[%fp-16] - add %i0,4,%i0 C res_ptr++ - - add %g3,%g1,%g4 C p += cy - srlx %g4,32,%g3 - ldx [%fp-40],%g2 C p16 - ldx [%fp-32],%g1 C p0 - sllx %g2,16,%g2 C align p16 - st %g4,[%i0-4] - add %g2,%g1,%g1 C add p16 to p0 (ADD1) - add %i0,4,%i0 C res_ptr++ - - add %g3,%g1,%g4 C p += cy - srlx %g4,32,%g3 - ldx [%fp-24],%g2 C p16 - ldx [%fp-16],%g1 C p0 - sllx %g2,16,%g2 C align p16 - st %g4,[%i0-4] - add %g2,%g1,%g1 C add p16 to p0 (ADD1) - add %i0,4,%i0 C res_ptr++ - b,a L(ret) - -L(end2): - fxtod %f10,%f2 - fmuld %f2,%f8,%f16 - fmuld %f2,%f6,%f4 - fdtox %f16,%f14 - std %f14,[%fp-40] - fdtox %f4,%f12 - std %f12,[%fp-32] - ldx [%fp-24],%g2 C p16 - ldx [%fp-16],%g1 C p0 - sllx %g2,16,%g2 C align p16 -L(yyy): add %g2,%g1,%g1 C add p16 to p0 (ADD1) - add %i0,4,%i0 C res_ptr++ - - add %g3,%g1,%g4 C p += cy - srlx %g4,32,%g3 - ldx [%fp-40],%g2 C p16 - ldx [%fp-32],%g1 C p0 - sllx %g2,16,%g2 C align p16 - st %g4,[%i0-4] - add %g2,%g1,%g1 C add p16 to p0 (ADD1) - add %i0,4,%i0 C res_ptr++ - b,a L(ret) - -L(end1): - fxtod %f10,%f2 - fmuld %f2,%f8,%f16 - fmuld %f2,%f6,%f4 - fdtox %f16,%f14 - std %f14,[%fp-24] - fdtox %f4,%f12 - std %f12,[%fp-16] - - ldx [%fp-24],%g2 C p16 - ldx [%fp-16],%g1 C p0 - sllx %g2,16,%g2 C align p16 - add %g2,%g1,%g1 C add p16 to p0 (ADD1) - add %i0,4,%i0 C res_ptr++ - -L(ret): add %g3,%g1,%g4 C p += cy - srlx %g4,32,%g3 - st %g4,[%i0-4] - - ret - restore %g0,%g3,%o0 C sideeffect: put cy in retreg -EPILOGUE(mpn_mul_1) diff --git a/rts/gmp/mpn/sparc32/v9/submul_1.asm b/rts/gmp/mpn/sparc32/v9/submul_1.asm deleted file mode 100644 index 6195ea8..0000000 --- a/rts/gmp/mpn/sparc32/v9/submul_1.asm +++ /dev/null @@ -1,291 +0,0 @@ -dnl SPARC v9 32-bit mpn_submul_1 -- Multiply a limb vector with a limb and -dnl subtract the result from a second limb vector. - -dnl Copyright (C) 1998, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published -dnl by the Free Software Foundation; either version 2.1 of the License, or (at -dnl your option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - - -include(`../config.m4') - -C INPUT PARAMETERS -C res_ptr i0 -C s1_ptr i1 -C size i2 -C s2_limb i3 - -ASM_START() - - TEXT - ALIGN(4) -L(noll): - .word 0 - -PROLOGUE(mpn_submul_1) - save %sp,-256,%sp - -ifdef(`PIC', -`L(pc): rd %pc,%o7 - ld [%o7+L(noll)-L(pc)],%f10', -` sethi %hi(L(noll)),%g1 - ld [%g1+%lo(L(noll))],%f10') - - sethi %hi(0xffff0000),%o0 - andn %i3,%o0,%o0 - st %o0,[%fp-16] - ld [%fp-16],%f11 - fxtod %f10,%f6 - - srl %i3,16,%o0 - st %o0,[%fp-16] - ld [%fp-16],%f11 - fxtod %f10,%f8 - - mov 0,%g3 C cy = 0 - - ld [%i1],%f11 - subcc %i2,1,%i2 - be,pn %icc,L(end1) - add %i1,4,%i1 C s1_ptr++ - - fxtod %f10,%f2 - ld [%i1],%f11 - add %i1,4,%i1 C s1_ptr++ - fmuld %f2,%f8,%f16 - fmuld %f2,%f6,%f4 - fdtox %f16,%f14 - std %f14,[%fp-24] - fdtox %f4,%f12 - subcc %i2,1,%i2 - be,pn %icc,L(end2) - std %f12,[%fp-16] - - fxtod %f10,%f2 - ld [%i1],%f11 - add %i1,4,%i1 C s1_ptr++ - fmuld %f2,%f8,%f16 - fmuld %f2,%f6,%f4 - fdtox %f16,%f14 - std %f14,[%fp-40] - fdtox %f4,%f12 - subcc %i2,1,%i2 - be,pn %icc,L(end3) - std %f12,[%fp-32] - - fxtod %f10,%f2 - ld [%i1],%f11 - add %i1,4,%i1 C s1_ptr++ - ld [%i0],%g5 - ldx [%fp-24],%g2 C p16 - fmuld %f2,%f8,%f16 - ldx [%fp-16],%g1 C p0 - fmuld %f2,%f6,%f4 - sllx %g2,16,%g2 C align p16 - fdtox %f16,%f14 - add %g2,%g1,%g1 C add p16 to p0 (ADD1) - std %f14,[%fp-24] - fdtox %f4,%f12 - add %i0,4,%i0 C res_ptr++ - subcc %i2,1,%i2 - be,pn %icc,L(end4) - std %f12,[%fp-16] - - b,a L(loopm) - - .align 16 -C BEGIN LOOP -L(loop): - fxtod %f10,%f2 - ld [%i1],%f11 - add %i1,4,%i1 C s1_ptr++ - add %g3,%g1,%g4 C p += cy - subcc %g5,%g4,%l2 C add *res_ptr to p0 (ADD2) - ld [%i0],%g5 - srlx %g4,32,%g3 - ldx [%fp-24],%g2 C p16 - fmuld %f2,%f8,%f16 - ldx [%fp-16],%g1 C p0 - fmuld %f2,%f6,%f4 - sllx %g2,16,%g2 C align p16 - st %l2,[%i0-4] - addx %g3,0,%g3 - fdtox %f16,%f14 - add %g2,%g1,%g1 C add p16 to p0 (ADD1) - std %f14,[%fp-24] - fdtox %f4,%f12 - std %f12,[%fp-16] - subcc %i2,1,%i2 - be,pn %icc,L(loope) - add %i0,4,%i0 C res_ptr++ -L(loopm): - fxtod %f10,%f2 - ld [%i1],%f11 - add %i1,4,%i1 C s1_ptr++ - add %g3,%g1,%g4 C p += cy - subcc %g5,%g4,%l2 C add *res_ptr to p0 (ADD2) - ld [%i0],%g5 - srlx %g4,32,%g3 - ldx [%fp-40],%g2 C p16 - fmuld %f2,%f8,%f16 - ldx [%fp-32],%g1 C p0 - fmuld %f2,%f6,%f4 - sllx %g2,16,%g2 C align p16 - st %l2,[%i0-4] - addx %g3,0,%g3 - fdtox %f16,%f14 - add %g2,%g1,%g1 C add p16 to p0 (ADD1) - std %f14,[%fp-40] - fdtox %f4,%f12 - std %f12,[%fp-32] - subcc %i2,1,%i2 - bne,pt %icc,L(loop) - add %i0,4,%i0 C res_ptr++ -C END LOOP - - fxtod %f10,%f2 - add %g3,%g1,%g4 C p += cy - subcc %g5,%g4,%l2 C add *res_ptr to p0 (ADD2) - ld [%i0],%g5 - srlx %g4,32,%g3 - ldx [%fp-24],%g2 C p16 - fmuld %f2,%f8,%f16 - ldx [%fp-16],%g1 C p0 - fmuld %f2,%f6,%f4 - sllx %g2,16,%g2 C align p16 - st %l2,[%i0-4] - b,a L(xxx) -L(loope): -L(end4): - fxtod %f10,%f2 - add %g3,%g1,%g4 C p += cy - subcc %g5,%g4,%l2 C add *res_ptr to p0 (ADD2) - ld [%i0],%g5 - srlx %g4,32,%g3 - ldx [%fp-40],%g2 C p16 - fmuld %f2,%f8,%f16 - ldx [%fp-32],%g1 C p0 - fmuld %f2,%f6,%f4 - sllx %g2,16,%g2 C align p16 - st %l2,[%i0-4] - fdtox %f16,%f14 - add %g2,%g1,%g1 C add p16 to p0 (ADD1) - std %f14,[%fp-40] - fdtox %f4,%f12 - std %f12,[%fp-32] - add %i0,4,%i0 C res_ptr++ - - add %g3,%g1,%g4 C p += cy - subxcc %g5,%g4,%l2 C add *res_ptr to p0 (ADD2) - ld [%i0],%g5 - srlx %g4,32,%g3 - ldx [%fp-24],%g2 C p16 - ldx [%fp-16],%g1 C p0 - sllx %g2,16,%g2 C align p16 - st %l2,[%i0-4] - b,a L(yyy) - -L(end3): - fxtod %f10,%f2 - ld [%i0],%g5 - ldx [%fp-24],%g2 C p16 - fmuld %f2,%f8,%f16 - ldx [%fp-16],%g1 C p0 - fmuld %f2,%f6,%f4 - sllx %g2,16,%g2 C align p16 -L(xxx): fdtox %f16,%f14 - add %g2,%g1,%g1 C add p16 to p0 (ADD1) - std %f14,[%fp-24] - fdtox %f4,%f12 - std %f12,[%fp-16] - add %i0,4,%i0 C res_ptr++ - - add %g3,%g1,%g4 C p += cy - subxcc %g5,%g4,%l2 C add *res_ptr to p0 (ADD2) - ld [%i0],%g5 - srlx %g4,32,%g3 - ldx [%fp-40],%g2 C p16 - ldx [%fp-32],%g1 C p0 - sllx %g2,16,%g2 C align p16 - st %l2,[%i0-4] - add %g2,%g1,%g1 C add p16 to p0 (ADD1) - add %i0,4,%i0 C res_ptr++ - - add %g3,%g1,%g4 C p += cy - subxcc %g5,%g4,%l2 C add *res_ptr to p0 (ADD2) - ld [%i0],%g5 - srlx %g4,32,%g3 - ldx [%fp-24],%g2 C p16 - ldx [%fp-16],%g1 C p0 - sllx %g2,16,%g2 C align p16 - st %l2,[%i0-4] - add %g2,%g1,%g1 C add p16 to p0 (ADD1) - add %i0,4,%i0 C res_ptr++ - b,a L(ret) - -L(end2): - fxtod %f10,%f2 - fmuld %f2,%f8,%f16 - fmuld %f2,%f6,%f4 - fdtox %f16,%f14 - std %f14,[%fp-40] - fdtox %f4,%f12 - std %f12,[%fp-32] - ld [%i0],%g5 - ldx [%fp-24],%g2 C p16 - ldx [%fp-16],%g1 C p0 - sllx %g2,16,%g2 C align p16 -L(yyy): add %g2,%g1,%g1 C add p16 to p0 (ADD1) - add %i0,4,%i0 C res_ptr++ - - add %g3,%g1,%g4 C p += cy - subxcc %g5,%g4,%l2 C add *res_ptr to p0 (ADD2) - ld [%i0],%g5 - srlx %g4,32,%g3 - ldx [%fp-40],%g2 C p16 - ldx [%fp-32],%g1 C p0 - sllx %g2,16,%g2 C align p16 - st %l2,[%i0-4] - add %g2,%g1,%g1 C add p16 to p0 (ADD1) - add %i0,4,%i0 C res_ptr++ - b,a L(ret) - -L(end1): - fxtod %f10,%f2 - fmuld %f2,%f8,%f16 - fmuld %f2,%f6,%f4 - fdtox %f16,%f14 - std %f14,[%fp-24] - fdtox %f4,%f12 - std %f12,[%fp-16] - - ld [%i0],%g5 - ldx [%fp-24],%g2 C p16 - ldx [%fp-16],%g1 C p0 - sllx %g2,16,%g2 C align p16 - add %g2,%g1,%g1 C add p16 to p0 (ADD1) - add %i0,4,%i0 C res_ptr++ - -L(ret): add %g3,%g1,%g4 C p += cy - subxcc %g5,%g4,%l2 C add *res_ptr to p0 (ADD2) - srlx %g4,32,%g3 - st %l2,[%i0-4] - - addx %g3,%g0,%g3 - ret - restore %g0,%g3,%o0 C sideeffect: put cy in retreg -EPILOGUE(mpn_submul_1) diff --git a/rts/gmp/mpn/sparc64/README b/rts/gmp/mpn/sparc64/README deleted file mode 100644 index 6923a13..0000000 --- a/rts/gmp/mpn/sparc64/README +++ /dev/null @@ -1,48 +0,0 @@ -This directory contains mpn functions for 64-bit V9 SPARC - -RELEVANT OPTIMIZATION ISSUES - -The Ultra I/II pipeline executes up to two simple integer arithmetic operations -per cycle. The 64-bit integer multiply instruction mulx takes from 5 cycles to -35 cycles, depending on the position of the most significant bit of the 1st -source operand. It cannot overlap with other instructions. For our use of -mulx, it will take from 5 to 20 cycles. - -Integer conditional move instructions cannot dual-issue with other integer -instructions. No conditional move can issue 1-5 cycles after a load. (Or -something such bizzare.) - -Integer branches can issue with two integer arithmetic instructions. Likewise -for integer loads. Four instructions may issue (arith, arith, ld/st, branch) -but only if the branch is last. - -(The V9 architecture manual recommends that the 2nd operand of a multiply -instruction be the smaller one. For UltraSPARC, they got things backwards and -optimize for the wrong operand! Really helpful in the light of that multiply -is incredibly slow on these CPUs!) - -STATUS - -There is new code in ~/prec/gmp-remote/sparc64. Not tested or completed, but -the pipelines are worked out. Here are the timings: - -* lshift, rshift: The code is well-optimized and runs at 2.0 cycles/limb. - -* add_n, sub_n: add3.s currently runs at 6 cycles/limb. We use a bizarre - scheme of compares and branches (with some nops and fnops to align things) - and carefully stay away from the instructions intended for this application - (i.e., movcs and movcc). - - Using movcc/movcs, even with deep unrolling, seems to get down to 7 - cycles/limb. - - The most promising approach is to split operands in 32-bit pieces using - srlx, then use two addccc, and finally compile the results with sllx+or. - The result could run at 5 cycles/limb, I think. It might be possible to - do without unrolling, or with minimal unrolling. - -* addmul_1/submul_1: Should optimize for when scalar operand < 2^32. -* addmul_1/submul_1: Since mulx is horrendously slow on UltraSPARC I/II, - Karatsuba's method should save up to 16 cycles (i.e. > 20%). -* mul_1 (and possibly the other multiply functions): Handle carry in the - same tricky way as add_n,sub_n. diff --git a/rts/gmp/mpn/sparc64/add_n.asm b/rts/gmp/mpn/sparc64/add_n.asm deleted file mode 100644 index 72b3895..0000000 --- a/rts/gmp/mpn/sparc64/add_n.asm +++ /dev/null @@ -1,172 +0,0 @@ -! SPARC v9 __gmpn_add_n -- Add two limb vectors of the same length > 0 and store -! sum in a third limb vector. - -! 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. - - -! INPUT PARAMETERS -! res_ptr %o0 -! s1_ptr %o1 -! s2_ptr %o2 -! size %o3 - -include(`../config.m4') - -ASM_START() - .register %g2,#scratch - .register %g3,#scratch -PROLOGUE(mpn_add_n) - -! 12 mem ops >= 12 cycles -! 8 shift insn >= 8 cycles -! 8 addccc, executing alone, +8 cycles -! Unrolling not mandatory...perhaps 2-way is best? -! Put one ldx/stx and one s?lx per issue tuple, fill with pointer arith and loop ctl -! All in all, it runs at 5 cycles/limb - - save %sp,-160,%sp - - addcc %g0,%g0,%g0 - - add %i3,-4,%i3 - brlz,pn %i3,L(there) - nop - - ldx [%i1+0],%l0 - ldx [%i2+0],%l4 - ldx [%i1+8],%l1 - ldx [%i2+8],%l5 - ldx [%i1+16],%l2 - ldx [%i2+16],%l6 - ldx [%i1+24],%l3 - ldx [%i2+24],%l7 - add %i1,32,%i1 - add %i2,32,%i2 - - add %i3,-4,%i3 - brlz,pn %i3,L(skip) - nop - b L(loop1) ! jump instead of executing many NOPs - nop - ALIGN(32) -!--------- Start main loop --------- -L(loop1): - addccc %l0,%l4,%g1 -!- - srlx %l0,32,%o0 - ldx [%i1+0],%l0 -!- - srlx %l4,32,%o4 - ldx [%i2+0],%l4 -!- - addccc %o0,%o4,%g0 -!- - addccc %l1,%l5,%g2 -!- - srlx %l1,32,%o1 - ldx [%i1+8],%l1 -!- - srlx %l5,32,%o5 - ldx [%i2+8],%l5 -!- - addccc %o1,%o5,%g0 -!- - addccc %l2,%l6,%g3 -!- - srlx %l2,32,%o2 - ldx [%i1+16],%l2 -!- - srlx %l6,32,%g5 ! asymmetry - ldx [%i2+16],%l6 -!- - addccc %o2,%g5,%g0 -!- - addccc %l3,%l7,%g4 -!- - srlx %l3,32,%o3 - ldx [%i1+24],%l3 - add %i1,32,%i1 -!- - srlx %l7,32,%o7 - ldx [%i2+24],%l7 - add %i2,32,%i2 -!- - addccc %o3,%o7,%g0 -!- - stx %g1,[%i0+0] -!- - stx %g2,[%i0+8] -!- - stx %g3,[%i0+16] - add %i3,-4,%i3 -!- - stx %g4,[%i0+24] - add %i0,32,%i0 - - brgez,pt %i3,L(loop1) - nop -!--------- End main loop --------- -L(skip): - addccc %l0,%l4,%g1 - srlx %l0,32,%o0 - srlx %l4,32,%o4 - addccc %o0,%o4,%g0 - addccc %l1,%l5,%g2 - srlx %l1,32,%o1 - srlx %l5,32,%o5 - addccc %o1,%o5,%g0 - addccc %l2,%l6,%g3 - srlx %l2,32,%o2 - srlx %l6,32,%g5 ! asymmetry - addccc %o2,%g5,%g0 - addccc %l3,%l7,%g4 - srlx %l3,32,%o3 - srlx %l7,32,%o7 - addccc %o3,%o7,%g0 - stx %g1,[%i0+0] - stx %g2,[%i0+8] - stx %g3,[%i0+16] - stx %g4,[%i0+24] - add %i0,32,%i0 - -L(there): - add %i3,4,%i3 - brz,pt %i3,L(end) - nop - -L(loop2): - ldx [%i1+0],%l0 - add %i1,8,%i1 - ldx [%i2+0],%l4 - add %i2,8,%i2 - srlx %l0,32,%g2 - srlx %l4,32,%g3 - addccc %l0,%l4,%g1 - addccc %g2,%g3,%g0 - stx %g1,[%i0+0] - add %i0,8,%i0 - add %i3,-1,%i3 - brgz,pt %i3,L(loop2) - nop - -L(end): addc %g0,%g0,%i0 - ret - restore -EPILOGUE(mpn_add_n) diff --git a/rts/gmp/mpn/sparc64/addmul1h.asm b/rts/gmp/mpn/sparc64/addmul1h.asm deleted file mode 100644 index 96cb5f7..0000000 --- a/rts/gmp/mpn/sparc64/addmul1h.asm +++ /dev/null @@ -1,203 +0,0 @@ -dnl SPARC 64-bit addmull/addmulu -- Helper for mpn_addmul_1 and mpn_mul_1. - -dnl Copyright (C) 1998, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published -dnl by the Free Software Foundation; either version 2.1 of the License, or (at -dnl your option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - -ifdef(`LOWPART', -`addmull:', -`addmulu:') - save %sp,-256,%sp - - sethi %hi(0xffff0000),%o0 - andn %i3,%o0,%o0 - st %o0,[%fp-17] - ld [%fp-17],%f11 - fxtod %f10,%f6 - - srl %i3,16,%o0 - st %o0,[%fp-17] - ld [%fp-17],%f11 - fxtod %f10,%f8 - - mov 0,%g3 C cy = 0 - - ld [%i1+4],%f11 - subcc %i2,1,%i2 -dnl be,pn %icc,E(end1) - add %i1,4,%i1 C s1_ptr++ - - fxtod %f10,%f2 - ld [%i1-4],%f11 - add %i1,4,%i1 C s1_ptr++ - fmuld %f2,%f8,%f16 - fmuld %f2,%f6,%f4 - fdtox %f16,%f14 - std %f14,[%fp-25] - fdtox %f4,%f12 - subcc %i2,1,%i2 - be,pn %icc,E(end2) - std %f12,[%fp-17] - - fxtod %f10,%f2 - ld [%i1+4],%f11 - add %i1,4,%i1 C s1_ptr++ - fmuld %f2,%f8,%f16 - fmuld %f2,%f6,%f4 - fdtox %f16,%f14 - std %f14,[%fp-41] - fdtox %f4,%f12 - subcc %i2,1,%i2 -dnl be,pn %icc,E(end3) - std %f12,[%fp-33] - - fxtod %f10,%f2 - ld [%i1-4],%f11 - add %i1,4,%i1 C s1_ptr++ - ld [%i0+DLO],%g5 - ldx [%fp-25],%g2 C p16 - fmuld %f2,%f8,%f16 - ldx [%fp-17],%g1 C p0 - fmuld %f2,%f6,%f4 - sllx %g2,16,%g2 C align p16 - fdtox %f16,%f14 - add %g2,%g1,%g1 C add p16 to p0 (ADD1) - std %f14,[%fp-25] - fdtox %f4,%f12 - add %i0,4,%i0 C res_ptr++ - subcc %i2,1,%i2 - be,pn %icc,E(end4) - std %f12,[%fp-17] - - b,a E(loop) - nop C nop is cheap to nullify - - ALIGN(16) -C BEGIN LOOP -E(loop): - fxtod %f10,%f2 - ld [%i1+4],%f11 - add %i1,4,%i1 C s1_ptr++ - add %g5,%g1,%g1 C add *res_ptr to p0 (ADD2) - add %g3,%g1,%g4 C p += cy - ld [%i0+DHI],%g5 - srlx %g4,32,%g3 - ldx [%fp-41],%g2 C p16 - fmuld %f2,%f8,%f16 - ldx [%fp-33],%g1 C p0 - fmuld %f2,%f6,%f4 - sllx %g2,16,%g2 C align p16 - st %g4,[%i0-4+DLO] - fdtox %f16,%f14 - add %g2,%g1,%g1 C add p16 to p0 (ADD1) - std %f14,[%fp-41] - fdtox %f4,%f12 - std %f12,[%fp-33] - sub %i2,2,%i2 - add %i0,4,%i0 C res_ptr++ - - fxtod %f10,%f2 - ld [%i1-4],%f11 - add %i1,4,%i1 C s1_ptr++ - add %g5,%g1,%g1 C add *res_ptr to p0 (ADD2) - add %g3,%g1,%g4 C p += cy - ld [%i0+DLO],%g5 - srlx %g4,32,%g3 - ldx [%fp-25],%g2 C p16 - fmuld %f2,%f8,%f16 - ldx [%fp-17],%g1 C p0 - fmuld %f2,%f6,%f4 - sllx %g2,16,%g2 C align p16 - st %g4,[%i0-4+DHI] - fdtox %f16,%f14 - add %g2,%g1,%g1 C add p16 to p0 (ADD1) - std %f14,[%fp-25] - fdtox %f4,%f12 - std %f12,[%fp-17] - brnz,pt %i2,E(loop) - add %i0,4,%i0 C res_ptr++ -C END LOOP -E(loope): -E(end4): - fxtod %f10,%f2 - add %g5,%g1,%g1 C add *res_ptr to p0 (ADD2) - add %g3,%g1,%g4 C p += cy - ld [%i0+DHI],%g5 - srlx %g4,32,%g3 - ldx [%fp-41],%g2 C p16 - fmuld %f2,%f8,%f16 - ldx [%fp-33],%g1 C p0 - fmuld %f2,%f6,%f4 - sllx %g2,16,%g2 C align p16 - st %g4,[%i0-4+DLO] - fdtox %f16,%f14 - add %g2,%g1,%g1 C add p16 to p0 (ADD1) - std %f14,[%fp-41] - fdtox %f4,%f12 - std %f12,[%fp-33] - add %i0,4,%i0 C res_ptr++ - - add %g5,%g1,%g1 C add *res_ptr to p0 (ADD2) - add %g3,%g1,%g4 C p += cy - ld [%i0+DLO],%g5 - srlx %g4,32,%g3 - ldx [%fp-25],%g2 C p16 - ldx [%fp-17],%g1 C p0 - sllx %g2,16,%g2 C align p16 - st %g4,[%i0-4+DHI] - b,a E(yyy) - -E(end2): - fxtod %f10,%f2 - fmuld %f2,%f8,%f16 - fmuld %f2,%f6,%f4 - fdtox %f16,%f14 - std %f14,[%fp-41] - fdtox %f4,%f12 - std %f12,[%fp-33] - ld [%i0+DLO],%g5 - ldx [%fp-25],%g2 C p16 - ldx [%fp-17],%g1 C p0 - sllx %g2,16,%g2 C align p16 -E(yyy): add %g2,%g1,%g1 C add p16 to p0 (ADD1) - add %i0,4,%i0 C res_ptr++ - - add %g5,%g1,%g1 C add *res_ptr to p0 (ADD2) - add %g3,%g1,%g4 C p += cy -ifdef(`LOWPART', -` ld [%i0+DHI],%g5') - srlx %g4,32,%g3 - ldx [%fp-41],%g2 C p16 - ldx [%fp-33],%g1 C p0 - sllx %g2,16,%g2 C align p16 - st %g4,[%i0-4+DLO] - add %g2,%g1,%g1 C add p16 to p0 (ADD1) - add %i0,4,%i0 C res_ptr++ - -ifdef(`LOWPART', -` add %g5,%g1,%g1') C add *res_ptr to p0 (ADD2) - add %g3,%g1,%g4 C p += cy -ifdef(`LOWPART', -` st %g4,[%i0-4+DHI] - srlx %g4,32,%g4') - - ret - restore %g0,%g4,%o0 C sideeffect: put cy in retreg -ifdef(`LOWPART', -`EPILOGUE(addmull)', -`EPILOGUE(addmulu)') diff --git a/rts/gmp/mpn/sparc64/addmul_1.asm b/rts/gmp/mpn/sparc64/addmul_1.asm deleted file mode 100644 index c3f04ce..0000000 --- a/rts/gmp/mpn/sparc64/addmul_1.asm +++ /dev/null @@ -1,114 +0,0 @@ -dnl SPARC 64-bit mpn_addmul_1 -- Multiply a limb vector with a limb and -dnl add the result to a second limb vector. - -dnl Copyright (C) 1998, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published -dnl by the Free Software Foundation; either version 2.1 of the License, or (at -dnl your option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - -include(`../config.m4') - -C INPUT PARAMETERS -C res_ptr i0 -C s1_ptr i1 -C size i2 -C s2_limb i3 - -ASM_START() - .register %g2,#scratch - .register %g3,#scratch - -PROLOGUE(mpn_addmul_1) - save %sp,-256,%sp - -C We store 0.0 in f10 and keep it invariant accross thw two -C function calls below. Note that this is not ABI conformant, -C but since the functions are local, that's acceptable. -ifdef(`PIC', -`L(pc): rd %pc,%o7 - ld [%o7+L(noll)-L(pc)],%f10', -` sethi %hh(L(noll)),%g2 - sethi %lm(L(noll)),%g1 - or %g2,%hm(L(noll)),%g2 - or %g1,%lo(L(noll)),%g1 - sllx %g2,32,%g2 - ld [%g1+%g2],%f10') - - sub %i1,%i0,%g1 - srlx %g1,3,%g1 - cmp %g1,%i2 - bcc,pt %xcc,L(nooverlap) - nop - - sllx %i2,3,%g2 C compute stack allocation byte count - add %g2,15,%o0 - and %o0,-16,%o0 - sub %sp,%o0,%sp - add %sp,2223,%o0 - - mov %i1,%o1 C copy s1_ptr to mpn_copyi's srcp - call mpn_copyi - mov %i2,%o2 C copy n to mpn_copyi's count parameter - - add %sp,2223,%i1 - -L(nooverlap): -C First multiply-add with low 32 bits of s2_limb - mov %i0,%o0 - mov %i1,%o1 - add %i2,%i2,%o2 - call addmull - srl %i3,0,%o3 - - mov %o0,%l0 C keep carry-out from accmull - -C Now multiply-add with high 32 bits of s2_limb, unless it is zero. - srlx %i3,32,%o3 - brz,a,pn %o3,L(small) - mov %o0,%i0 - mov %i1,%o1 - add %i2,%i2,%o2 - call addmulu - add %i0,4,%o0 - - add %l0,%o0,%i0 -L(small): - ret - restore %g0,%g0,%g0 -EPILOGUE(mpn_addmul_1) - -C Put a zero in the text segment to allow us to t the address -C quickly when compiling for PIC - TEXT - ALIGN(4) -L(noll): - .word 0 - -define(`LO',`(+4)') -define(`HI',`(-4)') - -define(`DLO',`(+4)') -define(`DHI',`(-4)') -define(`LOWPART') -define(`E',`L(l.$1)') -include_mpn(`sparc64/addmul1h.asm') - -define(`DLO',`(-4)') -define(`DHI',`(+4)') -undefine(`LOWPART') -define(`E',`L(u.$1)') -include_mpn(`sparc64/addmul1h.asm') diff --git a/rts/gmp/mpn/sparc64/copyi.asm b/rts/gmp/mpn/sparc64/copyi.asm deleted file mode 100644 index d9957e3..0000000 --- a/rts/gmp/mpn/sparc64/copyi.asm +++ /dev/null @@ -1,79 +0,0 @@ -! SPARC v9 __gmpn_copy -- Copy a limb vector. - -! 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. - - -! INPUT PARAMETERS -! rptr %o0 -! sptr %o1 -! n %o2 - -include(`../config.m4') - -ASM_START() - .register %g2,#scratch - .register %g3,#scratch -PROLOGUE(mpn_copyi) - add %o2,-8,%o2 - brlz,pn %o2,L(skip) - nop - b,a L(loop1) - nop - - ALIGN(16) -L(loop1): - ldx [%o1+0],%g1 - ldx [%o1+8],%g2 - ldx [%o1+16],%g3 - ldx [%o1+24],%g4 - ldx [%o1+32],%g5 - ldx [%o1+40],%o3 - ldx [%o1+48],%o4 - ldx [%o1+56],%o5 - add %o1,64,%o1 - stx %g1,[%o0+0] - stx %g2,[%o0+8] - stx %g3,[%o0+16] - stx %g4,[%o0+24] - stx %g5,[%o0+32] - stx %o3,[%o0+40] - stx %o4,[%o0+48] - stx %o5,[%o0+56] - add %o2,-8,%o2 - brgez,pt %o2,L(loop1) - add %o0,64,%o0 - -L(skip): - add %o2,8,%o2 - brz,pt %o2,L(end) - nop - -L(loop2): - ldx [%o1],%g1 - add %o1,8,%o1 - add %o2,-1,%o2 - stx %g1,[%o0] - add %o0,8,%o0 - brgz,pt %o2,L(loop2) - nop - -L(end): retl - nop -EPILOGUE(mpn_copyi) diff --git a/rts/gmp/mpn/sparc64/gmp-mparam.h b/rts/gmp/mpn/sparc64/gmp-mparam.h deleted file mode 100644 index 74f6166..0000000 --- a/rts/gmp/mpn/sparc64/gmp-mparam.h +++ /dev/null @@ -1,88 +0,0 @@ -/* Sparc64 gmp-mparam.h -- Compiler/machine parameter header file. - -Copyright (C) 1991, 1993, 1994, 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. */ - -#define BITS_PER_MP_LIMB 64 -#define BYTES_PER_MP_LIMB 8 -#define BITS_PER_LONGINT 64 -#define BITS_PER_INT 32 -#define BITS_PER_SHORTINT 16 -#define BITS_PER_CHAR 8 - -/* Tell the toom3 multiply implementation to call low-level mpn - functions instead of open-coding operations in C. */ -#define USE_MORE_MPN 1 - - -/* Run on sun workshop cc. */ -/* Generated by tuneup.c, 2000-07-30. */ - -#ifndef KARATSUBA_MUL_THRESHOLD -#define KARATSUBA_MUL_THRESHOLD 12 -#endif -#ifndef TOOM3_MUL_THRESHOLD -#define TOOM3_MUL_THRESHOLD 95 -#endif - -#ifndef KARATSUBA_SQR_THRESHOLD -#define KARATSUBA_SQR_THRESHOLD 33 -#endif -#ifndef TOOM3_SQR_THRESHOLD -#define TOOM3_SQR_THRESHOLD 125 -#endif - -#ifndef BZ_THRESHOLD -#define BZ_THRESHOLD 27 -#endif - -#ifndef FIB_THRESHOLD -#define FIB_THRESHOLD 107 -#endif - -#ifndef POWM_THRESHOLD -#define POWM_THRESHOLD 12 -#endif - -#ifndef GCD_ACCEL_THRESHOLD -#define GCD_ACCEL_THRESHOLD 4 -#endif -#ifndef GCDEXT_THRESHOLD -#define GCDEXT_THRESHOLD 199 -#endif - -#ifndef FFT_MUL_TABLE -#define FFT_MUL_TABLE { 304, 608, 1344, 2304, 7168, 20480, 49152, 0 } -#endif -#ifndef FFT_MODF_MUL_THRESHOLD -#define FFT_MODF_MUL_THRESHOLD 320 -#endif -#ifndef FFT_MUL_THRESHOLD -#define FFT_MUL_THRESHOLD 1664 -#endif - -#ifndef FFT_SQR_TABLE -#define FFT_SQR_TABLE { 304, 608, 1344, 2816, 7168, 20480, 49152, 0 } -#endif -#ifndef FFT_MODF_SQR_THRESHOLD -#define FFT_MODF_SQR_THRESHOLD 320 -#endif -#ifndef FFT_SQR_THRESHOLD -#define FFT_SQR_THRESHOLD 1664 -#endif diff --git a/rts/gmp/mpn/sparc64/lshift.asm b/rts/gmp/mpn/sparc64/lshift.asm deleted file mode 100644 index 2d2edc5..0000000 --- a/rts/gmp/mpn/sparc64/lshift.asm +++ /dev/null @@ -1,97 +0,0 @@ -! SPARC v9 __gmpn_lshift -- - -! 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. - - -! INPUT PARAMETERS -! res_ptr %o0 -! src_ptr %o1 -! size %o2 -! cnt %o3 - -include(`../config.m4') - -ASM_START() - .register %g2,#scratch - .register %g3,#scratch -PROLOGUE(mpn_lshift) - sllx %o2,3,%g1 - add %o1,%g1,%o1 ! make %o1 point at end of src - ldx [%o1-8],%g2 ! load first limb - sub %g0,%o3,%o5 ! negate shift count - add %o0,%g1,%o0 ! make %o0 point at end of res - add %o2,-1,%o2 - and %o2,4-1,%g4 ! number of limbs in first loop - srlx %g2,%o5,%g1 ! compute function result - brz,pn %g4,L(0) ! if multiple of 4 limbs, skip first loop - mov %g1,%g5 - - sub %o2,%g4,%o2 ! adjust count for main loop - -L(loop0): - ldx [%o1-16],%g3 - add %o0,-8,%o0 - add %o1,-8,%o1 - add %g4,-1,%g4 - sllx %g2,%o3,%o4 - srlx %g3,%o5,%g1 - mov %g3,%g2 - or %o4,%g1,%o4 - brnz,pt %g4,L(loop0) - stx %o4,[%o0+0] - -L(0): brz,pn %o2,L(end) - nop - -L(loop1): - ldx [%o1-16],%g3 - add %o0,-32,%o0 - add %o2,-4,%o2 - sllx %g2,%o3,%o4 - srlx %g3,%o5,%g1 - - ldx [%o1-24],%g2 - sllx %g3,%o3,%g4 - or %o4,%g1,%o4 - stx %o4,[%o0+24] - srlx %g2,%o5,%g1 - - ldx [%o1-32],%g3 - sllx %g2,%o3,%o4 - or %g4,%g1,%g4 - stx %g4,[%o0+16] - srlx %g3,%o5,%g1 - - ldx [%o1-40],%g2 - sllx %g3,%o3,%g4 - or %o4,%g1,%o4 - stx %o4,[%o0+8] - srlx %g2,%o5,%g1 - - add %o1,-32,%o1 - or %g4,%g1,%g4 - brnz,pt %o2,L(loop1) - stx %g4,[%o0+0] - -L(end): sllx %g2,%o3,%g2 - stx %g2,[%o0-8] - retl - mov %g5,%o0 -EPILOGUE(mpn_lshift) diff --git a/rts/gmp/mpn/sparc64/mul_1.asm b/rts/gmp/mpn/sparc64/mul_1.asm deleted file mode 100644 index f2f2821..0000000 --- a/rts/gmp/mpn/sparc64/mul_1.asm +++ /dev/null @@ -1,113 +0,0 @@ -dnl SPARC 64-bit mpn_mul_1 -- Multiply a limb vector with a limb and -dnl store the result to a second limb vector. - -dnl Copyright (C) 1998, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published -dnl by the Free Software Foundation; either version 2.1 of the License, or (at -dnl your option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - -include(`../config.m4') - -C INPUT PARAMETERS -C res_ptr i0 -C s1_ptr i1 -C size i2 -C s2_limb i3 - -ASM_START() - .register %g2,#scratch - .register %g3,#scratch - -PROLOGUE(mpn_mul_1) - save %sp,-256,%sp - -C We store 0.0 in f10 and keep it invariant accross thw two -C function calls below. Note that this is not ABI conformant, -C but since the functions are local, that's acceptable. -ifdef(`PIC', -`L(pc): rd %pc,%o7 - ld [%o7+L(noll)-L(pc)],%f10', -` sethi %hh(L(noll)),%g2 - sethi %lm(L(noll)),%g1 - or %g2,%hm(L(noll)),%g2 - or %g1,%lo(L(noll)),%g1 - sllx %g2,32,%g2 - ld [%g1+%g2],%f10') - - sub %i1,%i0,%g1 - srlx %g1,3,%g1 - cmp %g1,%i2 - bcc,pt %xcc,L(nooverlap) - nop - - sllx %i2,3,%g2 C compute stack allocation byte count - add %g2,15,%o0 - and %o0,-16,%o0 - sub %sp,%o0,%sp - add %sp,2223,%o0 - - mov %i1,%o1 C copy s1_ptr to mpn_copyi's srcp - call mpn_copyi - mov %i2,%o2 C copy n to mpn_copyi's count parameter - - add %sp,2223,%i1 - -L(nooverlap): -C First multiply-add with low 32 bits of s2_limb - mov %i0,%o0 - mov %i1,%o1 - add %i2,%i2,%o2 - call mull - srl %i3,0,%o3 - - mov %o0,%l0 C keep carry-out from accmull - -C Now multiply-add with high 32 bits of s2_limb, unless it is zero. - srlx %i3,32,%o3 - brz,a,pn %o3,L(small) - mov %o0,%i0 - mov %i1,%o1 - add %i2,%i2,%o2 - call addmulu - add %i0,4,%o0 - - add %l0,%o0,%i0 -L(small): - ret - restore %g0,%g0,%g0 -EPILOGUE(mpn_mul_1) - -C Put a zero in the text segment to allow us to t the address -C quickly when compiling for PIC - TEXT - ALIGN(4) -L(noll): - .word 0 - -define(`LO',`(+4)') -define(`HI',`(-4)') - -define(`DLO',`(+4)') -define(`DHI',`(-4)') -define(`E',`L($1)') -include_mpn(`sparc64/mul_1h.asm') - -define(`DLO',`(-4)') -define(`DHI',`(+4)') -undefine(`LOWPART') -define(`E',`L(u.$1)') -include_mpn(`sparc64/addmul1h.asm') diff --git a/rts/gmp/mpn/sparc64/mul_1h.asm b/rts/gmp/mpn/sparc64/mul_1h.asm deleted file mode 100644 index 5078c01..0000000 --- a/rts/gmp/mpn/sparc64/mul_1h.asm +++ /dev/null @@ -1,183 +0,0 @@ -dnl SPARC 64-bit mull -- Helper for mpn_mul_1. - -dnl Copyright (C) 1998, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published -dnl by the Free Software Foundation; either version 2.1 of the License, or (at -dnl your option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - -mull: - save %sp,-256,%sp - - sethi %hi(0xffff0000),%o0 - andn %i3,%o0,%o0 - st %o0,[%fp-17] - ld [%fp-17],%f11 - fxtod %f10,%f6 - - srl %i3,16,%o0 - st %o0,[%fp-17] - ld [%fp-17],%f11 - fxtod %f10,%f8 - - mov 0,%g3 C cy = 0 - - ld [%i1+4],%f11 - subcc %i2,1,%i2 -dnl be,pn %icc,E(end1) - add %i1,4,%i1 C s1_ptr++ - - fxtod %f10,%f2 - ld [%i1-4],%f11 - add %i1,4,%i1 C s1_ptr++ - fmuld %f2,%f8,%f16 - fmuld %f2,%f6,%f4 - fdtox %f16,%f14 - std %f14,[%fp-25] - fdtox %f4,%f12 - subcc %i2,1,%i2 - be,pn %icc,E(end2) - std %f12,[%fp-17] - - fxtod %f10,%f2 - ld [%i1+4],%f11 - add %i1,4,%i1 C s1_ptr++ - fmuld %f2,%f8,%f16 - fmuld %f2,%f6,%f4 - fdtox %f16,%f14 - std %f14,[%fp-41] - fdtox %f4,%f12 - subcc %i2,1,%i2 -dnl be,pn %icc,E(end3) - std %f12,[%fp-33] - - fxtod %f10,%f2 - ld [%i1-4],%f11 - add %i1,4,%i1 C s1_ptr++ - ldx [%fp-25],%g2 C p16 - fmuld %f2,%f8,%f16 - ldx [%fp-17],%g1 C p0 - fmuld %f2,%f6,%f4 - sllx %g2,16,%g2 C align p16 - fdtox %f16,%f14 - add %g2,%g1,%g1 C add p16 to p0 (ADD1) - std %f14,[%fp-25] - fdtox %f4,%f12 - add %i0,4,%i0 C res_ptr++ - subcc %i2,1,%i2 - be,pn %icc,E(end4) - std %f12,[%fp-17] - - b,a E(loop) - nop C nop is cheap to nullify - - ALIGN(16) -C BEGIN LOOP -E(loop): - fxtod %f10,%f2 - ld [%i1+4],%f11 - add %i1,4,%i1 C s1_ptr++ - add %g3,%g1,%g4 C p += cy - srlx %g4,32,%g3 - ldx [%fp-41],%g2 C p16 - fmuld %f2,%f8,%f16 - ldx [%fp-33],%g1 C p0 - fmuld %f2,%f6,%f4 - sllx %g2,16,%g2 C align p16 - st %g4,[%i0-4+DLO] - fdtox %f16,%f14 - add %g2,%g1,%g1 C add p16 to p0 (ADD1) - std %f14,[%fp-41] - fdtox %f4,%f12 - std %f12,[%fp-33] - sub %i2,2,%i2 - add %i0,4,%i0 C res_ptr++ - - fxtod %f10,%f2 - ld [%i1-4],%f11 - add %i1,4,%i1 C s1_ptr++ - add %g3,%g1,%g4 C p += cy - srlx %g4,32,%g3 - ldx [%fp-25],%g2 C p16 - fmuld %f2,%f8,%f16 - ldx [%fp-17],%g1 C p0 - fmuld %f2,%f6,%f4 - sllx %g2,16,%g2 C align p16 - st %g4,[%i0-4+DHI] - fdtox %f16,%f14 - add %g2,%g1,%g1 C add p16 to p0 (ADD1) - std %f14,[%fp-25] - fdtox %f4,%f12 - std %f12,[%fp-17] - brnz,pt %i2,E(loop) - add %i0,4,%i0 C res_ptr++ -C END LOOP -E(loope): -E(end4): - fxtod %f10,%f2 - add %g3,%g1,%g4 C p += cy - srlx %g4,32,%g3 - ldx [%fp-41],%g2 C p16 - fmuld %f2,%f8,%f16 - ldx [%fp-33],%g1 C p0 - fmuld %f2,%f6,%f4 - sllx %g2,16,%g2 C align p16 - st %g4,[%i0-4+DLO] - fdtox %f16,%f14 - add %g2,%g1,%g1 C add p16 to p0 (ADD1) - std %f14,[%fp-41] - fdtox %f4,%f12 - std %f12,[%fp-33] - add %i0,4,%i0 C res_ptr++ - - add %g3,%g1,%g4 C p += cy - srlx %g4,32,%g3 - ldx [%fp-25],%g2 C p16 - ldx [%fp-17],%g1 C p0 - sllx %g2,16,%g2 C align p16 - st %g4,[%i0-4+DHI] - b,a E(yyy) - -E(end2): - fxtod %f10,%f2 - fmuld %f2,%f8,%f16 - fmuld %f2,%f6,%f4 - fdtox %f16,%f14 - std %f14,[%fp-41] - fdtox %f4,%f12 - std %f12,[%fp-33] - ldx [%fp-25],%g2 C p16 - ldx [%fp-17],%g1 C p0 - sllx %g2,16,%g2 C align p16 -E(yyy): add %g2,%g1,%g1 C add p16 to p0 (ADD1) - add %i0,4,%i0 C res_ptr++ - - add %g3,%g1,%g4 C p += cy - srlx %g4,32,%g3 - ldx [%fp-41],%g2 C p16 - ldx [%fp-33],%g1 C p0 - sllx %g2,16,%g2 C align p16 - st %g4,[%i0-4+DLO] - add %g2,%g1,%g1 C add p16 to p0 (ADD1) - add %i0,4,%i0 C res_ptr++ - - add %g3,%g1,%g4 C p += cy - st %g4,[%i0-4+DHI] - srlx %g4,32,%g4 - - ret - restore %g0,%g4,%o0 C sideeffect: put cy in retreg -EPILOGUE(mull) diff --git a/rts/gmp/mpn/sparc64/rshift.asm b/rts/gmp/mpn/sparc64/rshift.asm deleted file mode 100644 index baf7920..0000000 --- a/rts/gmp/mpn/sparc64/rshift.asm +++ /dev/null @@ -1,94 +0,0 @@ -! SPARC v9 __gmpn_rshift -- - -! 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. - - -! INPUT PARAMETERS -! res_ptr %o0 -! src_ptr %o1 -! size %o2 -! cnt %o3 - -include(`../config.m4') - -ASM_START() - .register %g2,#scratch - .register %g3,#scratch -PROLOGUE(mpn_rshift) - ldx [%o1],%g2 ! load first limb - sub %g0,%o3,%o5 ! negate shift count - add %o2,-1,%o2 - and %o2,4-1,%g4 ! number of limbs in first loop - sllx %g2,%o5,%g1 ! compute function result - brz,pn %g4,L(0) ! if multiple of 4 limbs, skip first loop - mov %g1,%g5 - - sub %o2,%g4,%o2 ! adjust count for main loop - -L(loop0): - ldx [%o1+8],%g3 - add %o0,8,%o0 - add %o1,8,%o1 - add %g4,-1,%g4 - srlx %g2,%o3,%o4 - sllx %g3,%o5,%g1 - mov %g3,%g2 - or %o4,%g1,%o4 - brnz,pt %g4,L(loop0) - stx %o4,[%o0-8] - -L(0): brz,pn %o2,L(end) - nop - -L(loop1): - ldx [%o1+8],%g3 - add %o0,32,%o0 - add %o2,-4,%o2 - srlx %g2,%o3,%o4 - sllx %g3,%o5,%g1 - - ldx [%o1+16],%g2 - srlx %g3,%o3,%g4 - or %o4,%g1,%o4 - stx %o4,[%o0-32] - sllx %g2,%o5,%g1 - - ldx [%o1+24],%g3 - srlx %g2,%o3,%o4 - or %g4,%g1,%g4 - stx %g4,[%o0-24] - sllx %g3,%o5,%g1 - - ldx [%o1+32],%g2 - srlx %g3,%o3,%g4 - or %o4,%g1,%o4 - stx %o4,[%o0-16] - sllx %g2,%o5,%g1 - - add %o1,32,%o1 - or %g4,%g1,%g4 - brnz %o2,L(loop1) - stx %g4,[%o0-8] - -L(end): srlx %g2,%o3,%g2 - stx %g2,[%o0-0] - retl - mov %g5,%o0 -EPILOGUE(mpn_rshift) diff --git a/rts/gmp/mpn/sparc64/sub_n.asm b/rts/gmp/mpn/sparc64/sub_n.asm deleted file mode 100644 index 6154713..0000000 --- a/rts/gmp/mpn/sparc64/sub_n.asm +++ /dev/null @@ -1,172 +0,0 @@ -! SPARC v9 __gmpn_sub_n -- Subtract two limb vectors of the same length > 0 and -! store difference in a third limb vector. - -! 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. - - -! INPUT PARAMETERS -! res_ptr %o0 -! s1_ptr %o1 -! s2_ptr %o2 -! size %o3 - -include(`../config.m4') - -ASM_START() - .register %g2,#scratch - .register %g3,#scratch -PROLOGUE(mpn_sub_n) - -! 12 mem ops >= 12 cycles -! 8 shift insn >= 8 cycles -! 8 addccc, executing alone, +8 cycles -! Unrolling not mandatory...perhaps 2-way is best? -! Put one ldx/stx and one s?lx per issue tuple, fill with pointer arith and loop ctl -! All in all, it runs at 5 cycles/limb - - save %sp,-160,%sp - - addcc %g0,%g0,%g0 - - add %i3,-4,%i3 - brlz,pn %i3,L(there) - nop - - ldx [%i1+0],%l0 - ldx [%i2+0],%l4 - ldx [%i1+8],%l1 - ldx [%i2+8],%l5 - ldx [%i1+16],%l2 - ldx [%i2+16],%l6 - ldx [%i1+24],%l3 - ldx [%i2+24],%l7 - add %i1,32,%i1 - add %i2,32,%i2 - - add %i3,-4,%i3 - brlz,pn %i3,L(skip) - nop - b L(loop1) ! jump instead of executing many NOPs - nop - ALIGN(32) -!--------- Start main loop --------- -L(loop1): - subccc %l0,%l4,%g1 -!- - srlx %l0,32,%o0 - ldx [%i1+0],%l0 -!- - srlx %l4,32,%o4 - ldx [%i2+0],%l4 -!- - subccc %o0,%o4,%g0 -!- - subccc %l1,%l5,%g2 -!- - srlx %l1,32,%o1 - ldx [%i1+8],%l1 -!- - srlx %l5,32,%o5 - ldx [%i2+8],%l5 -!- - subccc %o1,%o5,%g0 -!- - subccc %l2,%l6,%g3 -!- - srlx %l2,32,%o2 - ldx [%i1+16],%l2 -!- - srlx %l6,32,%g5 ! asymmetry - ldx [%i2+16],%l6 -!- - subccc %o2,%g5,%g0 -!- - subccc %l3,%l7,%g4 -!- - srlx %l3,32,%o3 - ldx [%i1+24],%l3 - add %i1,32,%i1 -!- - srlx %l7,32,%o7 - ldx [%i2+24],%l7 - add %i2,32,%i2 -!- - subccc %o3,%o7,%g0 -!- - stx %g1,[%i0+0] -!- - stx %g2,[%i0+8] -!- - stx %g3,[%i0+16] - add %i3,-4,%i3 -!- - stx %g4,[%i0+24] - add %i0,32,%i0 - - brgez,pt %i3,L(loop1) - nop -!--------- End main loop --------- -L(skip): - subccc %l0,%l4,%g1 - srlx %l0,32,%o0 - srlx %l4,32,%o4 - subccc %o0,%o4,%g0 - subccc %l1,%l5,%g2 - srlx %l1,32,%o1 - srlx %l5,32,%o5 - subccc %o1,%o5,%g0 - subccc %l2,%l6,%g3 - srlx %l2,32,%o2 - srlx %l6,32,%g5 ! asymmetry - subccc %o2,%g5,%g0 - subccc %l3,%l7,%g4 - srlx %l3,32,%o3 - srlx %l7,32,%o7 - subccc %o3,%o7,%g0 - stx %g1,[%i0+0] - stx %g2,[%i0+8] - stx %g3,[%i0+16] - stx %g4,[%i0+24] - add %i0,32,%i0 - -L(there): - add %i3,4,%i3 - brz,pt %i3,L(end) - nop - -L(loop2): - ldx [%i1+0],%l0 - add %i1,8,%i1 - ldx [%i2+0],%l4 - add %i2,8,%i2 - srlx %l0,32,%g2 - srlx %l4,32,%g3 - subccc %l0,%l4,%g1 - subccc %g2,%g3,%g0 - stx %g1,[%i0+0] - add %i0,8,%i0 - add %i3,-1,%i3 - brgz,pt %i3,L(loop2) - nop - -L(end): addc %g0,%g0,%i0 - ret - restore -EPILOGUE(mpn_sub_n) diff --git a/rts/gmp/mpn/sparc64/submul1h.asm b/rts/gmp/mpn/sparc64/submul1h.asm deleted file mode 100644 index 7f51ba5..0000000 --- a/rts/gmp/mpn/sparc64/submul1h.asm +++ /dev/null @@ -1,204 +0,0 @@ -dnl SPARC 64-bit submull/submulu -- Helper for mpn_submul_1 and mpn_mul_1. - -dnl Copyright (C) 1998, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published -dnl by the Free Software Foundation; either version 2.1 of the License, or (at -dnl your option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - -ifdef(`LOWPART', -`submull:', -`submulu:') - save %sp,-256,%sp - - sethi %hi(0xffff0000),%o0 - andn %i3,%o0,%o0 - st %o0,[%fp-17] - ld [%fp-17],%f11 - fxtod %f10,%f6 - - srl %i3,16,%o0 - st %o0,[%fp-17] - ld [%fp-17],%f11 - fxtod %f10,%f8 - - mov 0,%g3 C cy = 0 - - ld [%i1+4],%f11 - subcc %i2,1,%i2 -dnl be,pn %icc,E(end1) - add %i1,4,%i1 C s1_ptr++ - - fxtod %f10,%f2 - ld [%i1-4],%f11 - add %i1,4,%i1 C s1_ptr++ - fmuld %f2,%f8,%f16 - fmuld %f2,%f6,%f4 - fdtox %f16,%f14 - std %f14,[%fp-25] - fdtox %f4,%f12 - subcc %i2,1,%i2 - be,pn %icc,E(end2) - std %f12,[%fp-17] - - fxtod %f10,%f2 - ld [%i1+4],%f11 - add %i1,4,%i1 C s1_ptr++ - fmuld %f2,%f8,%f16 - fmuld %f2,%f6,%f4 - fdtox %f16,%f14 - std %f14,[%fp-41] - fdtox %f4,%f12 - subcc %i2,1,%i2 -dnl be,pn %icc,E(end3) - std %f12,[%fp-33] - - fxtod %f10,%f2 - ld [%i1-4],%f11 - add %i1,4,%i1 C s1_ptr++ - ld [%i0+DLO],%g5 - ldx [%fp-25],%g2 C p16 - fmuld %f2,%f8,%f16 - ldx [%fp-17],%g1 C p0 - fmuld %f2,%f6,%f4 - sllx %g2,16,%g2 C align p16 - fdtox %f16,%f14 - add %g2,%g1,%g1 C add p16 to p0 (ADD1) - std %f14,[%fp-25] - fdtox %f4,%f12 - add %i0,4,%i0 C res_ptr++ - subcc %i2,1,%i2 - be,pn %icc,E(end4) - std %f12,[%fp-17] - - b,a E(loop) - nop C nop is cheap to nullify - - ALIGN(16) -C BEGIN LOOP -E(loop): - fxtod %f10,%f2 - ld [%i1+4],%f11 - add %i1,4,%i1 C s1_ptr++ - add %g3,%g1,%g4 C p += cy - subxcc %g5,%g4,%l2 C add *res_ptr to p0 (ADD2) - ld [%i0+DHI],%g5 - srlx %g4,32,%g3 - ldx [%fp-41],%g2 C p16 - fmuld %f2,%f8,%f16 - ldx [%fp-33],%g1 C p0 - fmuld %f2,%f6,%f4 - sllx %g2,16,%g2 C align p16 - st %l2,[%i0-4+DLO] - fdtox %f16,%f14 - add %g2,%g1,%g1 C add p16 to p0 (ADD1) - std %f14,[%fp-41] - fdtox %f4,%f12 - std %f12,[%fp-33] - sub %i2,2,%i2 - add %i0,4,%i0 C res_ptr++ - - fxtod %f10,%f2 - ld [%i1-4],%f11 - add %i1,4,%i1 C s1_ptr++ - add %g3,%g1,%g4 C p += cy - subxcc %g5,%g4,%l2 C add *res_ptr to p0 (ADD2) - ld [%i0+DLO],%g5 - srlx %g4,32,%g3 - ldx [%fp-25],%g2 C p16 - fmuld %f2,%f8,%f16 - ldx [%fp-17],%g1 C p0 - fmuld %f2,%f6,%f4 - sllx %g2,16,%g2 C align p16 - st %l2,[%i0-4+DHI] - fdtox %f16,%f14 - add %g2,%g1,%g1 C add p16 to p0 (ADD1) - std %f14,[%fp-25] - fdtox %f4,%f12 - std %f12,[%fp-17] - brnz,pt %i2,E(loop) - add %i0,4,%i0 C res_ptr++ -C END LOOP -E(loope): -E(end4): - fxtod %f10,%f2 - add %g3,%g1,%g4 C p += cy - subxcc %g5,%g4,%l2 C add *res_ptr to p0 (ADD2) - ld [%i0+DHI],%g5 - srlx %g4,32,%g3 - ldx [%fp-41],%g2 C p16 - fmuld %f2,%f8,%f16 - ldx [%fp-33],%g1 C p0 - fmuld %f2,%f6,%f4 - sllx %g2,16,%g2 C align p16 - st %l2,[%i0-4+DLO] - fdtox %f16,%f14 - add %g2,%g1,%g1 C add p16 to p0 (ADD1) - std %f14,[%fp-41] - fdtox %f4,%f12 - std %f12,[%fp-33] - add %i0,4,%i0 C res_ptr++ - - add %g3,%g1,%g4 C p += cy - subxcc %g5,%g4,%l2 C add *res_ptr to p0 (ADD2) - ld [%i0+DLO],%g5 - srlx %g4,32,%g3 - ldx [%fp-25],%g2 C p16 - ldx [%fp-17],%g1 C p0 - sllx %g2,16,%g2 C align p16 - st %l2,[%i0-4+DHI] - b,a E(yyy) - -E(end2): - fxtod %f10,%f2 - fmuld %f2,%f8,%f16 - fmuld %f2,%f6,%f4 - fdtox %f16,%f14 - std %f14,[%fp-41] - fdtox %f4,%f12 - std %f12,[%fp-33] - ld [%i0+DLO],%g5 - ldx [%fp-25],%g2 C p16 - ldx [%fp-17],%g1 C p0 - sllx %g2,16,%g2 C align p16 -E(yyy): add %g2,%g1,%g1 C add p16 to p0 (ADD1) - add %i0,4,%i0 C res_ptr++ - - add %g3,%g1,%g4 C p += cy - subxcc %g5,%g4,%l2 C add *res_ptr to p0 (ADD2) -ifdef(`LOWPART', -` ld [%i0+DHI],%g5') - srlx %g4,32,%g3 - ldx [%fp-41],%g2 C p16 - ldx [%fp-33],%g1 C p0 - sllx %g2,16,%g2 C align p16 - st %l2,[%i0-4+DLO] - add %g2,%g1,%g1 C add p16 to p0 (ADD1) - add %i0,4,%i0 C res_ptr++ - - add %g3,%g1,%g4 C p += cy -ifdef(`LOWPART', -` subxcc %g5,%g4,%l2') C add *res_ptr to p0 (ADD2) -ifdef(`LOWPART', -` st %l2,[%i0-4+DHI] - srlx %g4,32,%g4') - - addx %g4,0,%g4 - ret - restore %g0,%g4,%o0 C sideeffect: put cy in retreg -ifdef(`LOWPART', -`EPILOGUE(submull)', -`EPILOGUE(submulu)') diff --git a/rts/gmp/mpn/sparc64/submul_1.asm b/rts/gmp/mpn/sparc64/submul_1.asm deleted file mode 100644 index 7c6af0a..0000000 --- a/rts/gmp/mpn/sparc64/submul_1.asm +++ /dev/null @@ -1,114 +0,0 @@ -dnl SPARC 64-bit mpn_submul_1 -- Multiply a limb vector with a limb and -dnl subtract the result from a second limb vector. - -dnl Copyright (C) 1998, 2000 Free Software Foundation, Inc. - -dnl This file is part of the GNU MP Library. - -dnl The GNU MP Library is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU Lesser General Public License as published -dnl by the Free Software Foundation; either version 2.1 of the License, or (at -dnl your option) any later version. - -dnl The GNU MP Library is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -dnl License for more details. - -dnl You should have received a copy of the GNU Lesser General Public License -dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -dnl MA 02111-1307, USA. - -include(`../config.m4') - -C INPUT PARAMETERS -C res_ptr i0 -C s1_ptr i1 -C size i2 -C s2_limb i3 - -ASM_START() - .register %g2,#scratch - .register %g3,#scratch - -PROLOGUE(mpn_submul_1) - save %sp,-256,%sp - -C We store 0.0 in f10 and keep it invariant accross thw two -C function calls below. Note that this is not ABI conformant, -C but since the functions are local, that's acceptable. -ifdef(`PIC', -`L(pc): rd %pc,%o7 - ld [%o7+L(noll)-L(pc)],%f10', -` sethi %hh(L(noll)),%g2 - sethi %lm(L(noll)),%g1 - or %g2,%hm(L(noll)),%g2 - or %g1,%lo(L(noll)),%g1 - sllx %g2,32,%g2 - ld [%g1+%g2],%f10') - - sub %i1,%i0,%g1 - srlx %g1,3,%g1 - cmp %g1,%i2 - bcc,pt %xcc,L(nooverlap) - nop - - sllx %i2,3,%g2 C compute stack allocation byte count - add %g2,15,%o0 - and %o0,-16,%o0 - sub %sp,%o0,%sp - add %sp,2223,%o0 - - mov %i1,%o1 C copy s1_ptr to mpn_copyi's srcp - call mpn_copyi - mov %i2,%o2 C copy n to mpn_copyi's count parameter - - add %sp,2223,%i1 - -L(nooverlap): -C First multiply-add with low 32 bits of s2_limb - mov %i0,%o0 - mov %i1,%o1 - add %i2,%i2,%o2 - call submull - srl %i3,0,%o3 - - mov %o0,%l0 C keep carry-out from accmull - -C Now multiply-add with high 32 bits of s2_limb, unless it is zero. - srlx %i3,32,%o3 - brz,a,pn %o3,L(small) - mov %o0,%i0 - mov %i1,%o1 - add %i2,%i2,%o2 - call submulu - add %i0,4,%o0 - - add %l0,%o0,%i0 -L(small): - ret - restore %g0,%g0,%g0 -EPILOGUE(mpn_submul_1) - -C Put a zero in the text segment to allow us to t the address -C quickly when compiling for PIC - TEXT - ALIGN(4) -L(noll): - .word 0 - -define(`LO',`(+4)') -define(`HI',`(-4)') - -define(`DLO',`(+4)') -define(`DHI',`(-4)') -define(`LOWPART') -define(`E',`L(l.$1)') -include_mpn(`sparc64/submul1h.asm') - -define(`DLO',`(-4)') -define(`DHI',`(+4)') -undefine(`LOWPART') -define(`E',`L(u.$1)') -include_mpn(`sparc64/submul1h.asm') diff --git a/rts/gmp/mpn/thumb/add_n.s b/rts/gmp/mpn/thumb/add_n.s deleted file mode 100644 index c1eeb6c..0000000 --- a/rts/gmp/mpn/thumb/add_n.s +++ /dev/null @@ -1,50 +0,0 @@ -@ ARM/Thumb __gmpn_add -- Add two limb vectors of the same length > 0 and store -@ sum in a third limb vector. - -@ 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. - - -@ INPUT PARAMETERS -@ RES_ptr r0 -@ S1_ptr r1 -@ S2_ptr r2 -@ SIZE r3 - -@ NOT TESTED CODE - - .text - .thumb - .align 0 - .global ___gmpn_add_n -___gmpn_add_n: - push {r4, r5, r6, lr} - mov r6, #1 @ init carry save register - -Loop: sub r6, #1 @ restore carry (set iff r6 was 0) - ldmia r1!, {r4} @ load next limb from S1 - ldmia r2!, {r5} @ load next limb from S2 - adc r4, r5 - stmia r0!, {r4} @ store result limb to RES - sbc r6, r6 @ save negated carry - sub r3, #1 - bge Loop @ loop back while remaining count >= 4 - - mov r0, r6 - pop {r4, r5, r6, pc} diff --git a/rts/gmp/mpn/thumb/sub_n.s b/rts/gmp/mpn/thumb/sub_n.s deleted file mode 100644 index 53c2923..0000000 --- a/rts/gmp/mpn/thumb/sub_n.s +++ /dev/null @@ -1,50 +0,0 @@ -@ ARM/Thumb __gmpn_sub -- Subtract two limb vectors of the same length > 0 and -@ store difference in a third limb vector. - -@ 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. - - -@ INPUT PARAMETERS -@ RES_ptr r0 -@ S1_ptr r1 -@ S2_ptr r2 -@ SIZE r3 - -@ NOT TESTED CODE - - .text - .thumb - .align 0 - .global ___gmpn_sub_n -___gmpn_sub_n: - push {r4, r5, r6, lr} - mov r6, #1 @ init carry save register - -Loop: sub r6, #1 @ restore carry (set iff r6 was 0) - ldmia r1!, {r4} @ load next limb from S1 - ldmia r2!, {r5} @ load next limb from S2 - sbc r4, r5 - stmia r0!, {r4} @ store result limb to RES - sbc r6, r6 @ save negated carry - sub r3, #1 - bge Loop @ loop back while remaining count >= 4 - - mov r0, r6 - pop {r4, r5, r6, pc} diff --git a/rts/gmp/mpn/underscore.h b/rts/gmp/mpn/underscore.h deleted file mode 100644 index 240dae0..0000000 --- a/rts/gmp/mpn/underscore.h +++ /dev/null @@ -1,26 +0,0 @@ -/* -Copyright (C) 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. -*/ - -#if __STDC__ -#define C_SYMBOL_NAME(name) _##name -#else -#define C_SYMBOL_NAME(name) _/**/name -#endif diff --git a/rts/gmp/mpn/vax/add_n.s b/rts/gmp/mpn/vax/add_n.s deleted file mode 100644 index cf4060f..0000000 --- a/rts/gmp/mpn/vax/add_n.s +++ /dev/null @@ -1,61 +0,0 @@ -# VAX __gmpn_add_n -- Add two limb vectors of the same length > 0 and store -# sum in a third limb vector. - -# 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. - - -# INPUT PARAMETERS -# res_ptr (sp + 4) -# s1_ptr (sp + 8) -# s2_ptr (sp + 12) -# size (sp + 16) - -.text - .align 1 -.globl ___gmpn_add_n -___gmpn_add_n: - .word 0x0 - movl 16(ap),r0 - movl 12(ap),r1 - movl 8(ap),r2 - movl 4(ap),r3 - mnegl r0,r5 - addl2 $3,r0 - ashl $-2,r0,r0 # unroll loop count - bicl2 $-4,r5 # mask out low 2 bits - movaq (r5)[r5],r5 # 9x - jmp Loop(r5) - -Loop: movl (r2)+,r4 - adwc (r1)+,r4 - movl r4,(r3)+ - movl (r2)+,r4 - adwc (r1)+,r4 - movl r4,(r3)+ - movl (r2)+,r4 - adwc (r1)+,r4 - movl r4,(r3)+ - movl (r2)+,r4 - adwc (r1)+,r4 - movl r4,(r3)+ - sobgtr r0,Loop - - adwc r0,r0 - ret diff --git a/rts/gmp/mpn/vax/addmul_1.s b/rts/gmp/mpn/vax/addmul_1.s deleted file mode 100644 index 379061d..0000000 --- a/rts/gmp/mpn/vax/addmul_1.s +++ /dev/null @@ -1,126 +0,0 @@ -# VAX __gmpn_addmul_1 -- Multiply a limb vector with a limb and add -# the result to a second limb vector. - -# Copyright (C) 1992, 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. - - -# INPUT PARAMETERS -# res_ptr (sp + 4) -# s1_ptr (sp + 8) -# size (sp + 12) -# s2_limb (sp + 16) - -.text - .align 1 -.globl ___gmpn_addmul_1 -___gmpn_addmul_1: - .word 0xfc0 - movl 12(ap),r4 - movl 8(ap),r8 - movl 4(ap),r9 - movl 16(ap),r6 - jlss s2_big - - clrl r3 - incl r4 - ashl $-1,r4,r7 - jlbc r4,L1 - clrl r11 - -# Loop for S2_LIMB < 0x80000000 -Loop1: movl (r8)+,r1 - jlss L1n0 - emul r1,r6,$0,r2 - addl2 r11,r2 - adwc $0,r3 - addl2 r2,(r9)+ - adwc $0,r3 -L1: movl (r8)+,r1 - jlss L1n1 -L1p1: emul r1,r6,$0,r10 - addl2 r3,r10 - adwc $0,r11 - addl2 r10,(r9)+ - adwc $0,r11 - - sobgtr r7,Loop1 - movl r11,r0 - ret - -L1n0: emul r1,r6,$0,r2 - addl2 r11,r2 - adwc r6,r3 - addl2 r2,(r9)+ - adwc $0,r3 - movl (r8)+,r1 - jgeq L1p1 -L1n1: emul r1,r6,$0,r10 - addl2 r3,r10 - adwc r6,r11 - addl2 r10,(r9)+ - adwc $0,r11 - - sobgtr r7,Loop1 - movl r11,r0 - ret - - -s2_big: clrl r3 - incl r4 - ashl $-1,r4,r7 - jlbc r4,L2 - clrl r11 - -# Loop for S2_LIMB >= 0x80000000 -Loop2: movl (r8)+,r1 - jlss L2n0 - emul r1,r6,$0,r2 - addl2 r11,r2 - adwc r1,r3 - addl2 r2,(r9)+ - adwc $0,r3 -L2: movl (r8)+,r1 - jlss L2n1 -L2p1: emul r1,r6,$0,r10 - addl2 r3,r10 - adwc r1,r11 - addl2 r10,(r9)+ - adwc $0,r11 - - sobgtr r7,Loop2 - movl r11,r0 - ret - -L2n0: emul r1,r6,$0,r2 - addl2 r11,r2 - adwc r6,r3 - addl2 r2,(r9)+ - adwc r1,r3 - movl (r8)+,r1 - jgeq L2p1 -L2n1: emul r1,r6,$0,r10 - addl2 r3,r10 - adwc r6,r11 - addl2 r10,(r9)+ - adwc r1,r11 - - sobgtr r7,Loop2 - movl r11,r0 - ret diff --git a/rts/gmp/mpn/vax/lshift.s b/rts/gmp/mpn/vax/lshift.s deleted file mode 100644 index fd311a9..0000000 --- a/rts/gmp/mpn/vax/lshift.s +++ /dev/null @@ -1,58 +0,0 @@ -# VAX __gmpn_lshift -- left shift. - -# 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. - - -# INPUT PARAMETERS -# rptr (sp + 4) -# sptr (sp + 8) -# size (sp + 12) -# cnt (sp + 16) -# r0=retval r1=size r2,r3=itmp r4,r5=otmp call-used registers -# r6=sptr r7=rptr r8=cnt r9 r10 r11 call-saved registers - -.text - .align 1 -.globl ___gmpn_lshift -___gmpn_lshift: - .word 0x1c0 - movl 4(ap),r7 - movl 8(ap),r6 - movl 12(ap),r1 - movl 16(ap),r8 - - moval (r6)[r1],r6 - moval (r7)[r1],r7 - clrl r3 - movl -(r6),r2 - ashq r8,r2,r4 - movl r5,r0 - movl r2,r3 - decl r1 - jeql Lend - -Loop: movl -(r6),r2 - ashq r8,r2,r4 - movl r5,-(r7) - movl r2,r3 - jsobgtr r1,Loop - -Lend: movl r4,-4(r7) - ret diff --git a/rts/gmp/mpn/vax/mul_1.s b/rts/gmp/mpn/vax/mul_1.s deleted file mode 100644 index 708e8ca..0000000 --- a/rts/gmp/mpn/vax/mul_1.s +++ /dev/null @@ -1,123 +0,0 @@ -# VAX __gmpn_mul_1 -- Multiply a limb vector with a limb and store -# the result in a second limb vector. - -# Copyright (C) 1992, 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. - - -# INPUT PARAMETERS -# res_ptr (sp + 4) -# s1_ptr (sp + 8) -# size (sp + 12) -# s2_limb (sp + 16) - -.text - .align 1 -.globl ___gmpn_mul_1 -___gmpn_mul_1: - .word 0xfc0 - movl 12(ap),r4 - movl 8(ap),r8 - movl 4(ap),r9 - movl 16(ap),r6 - jlss s2_big - -# One might want to combine the addl2 and the store below, but that -# is actually just slower according to my timing tests. (VAX 3600) - - clrl r3 - incl r4 - ashl $-1,r4,r7 - jlbc r4,L1 - clrl r11 - -# Loop for S2_LIMB < 0x80000000 -Loop1: movl (r8)+,r1 - jlss L1n0 - emul r1,r6,$0,r2 - addl2 r11,r2 - adwc $0,r3 - movl r2,(r9)+ -L1: movl (r8)+,r1 - jlss L1n1 -L1p1: emul r1,r6,$0,r10 - addl2 r3,r10 - adwc $0,r11 - movl r10,(r9)+ - - sobgtr r7,Loop1 - movl r11,r0 - ret - -L1n0: emul r1,r6,$0,r2 - addl2 r11,r2 - adwc r6,r3 - movl r2,(r9)+ - movl (r8)+,r1 - jgeq L1p1 -L1n1: emul r1,r6,$0,r10 - addl2 r3,r10 - adwc r6,r11 - movl r10,(r9)+ - - sobgtr r7,Loop1 - movl r11,r0 - ret - - -s2_big: clrl r3 - incl r4 - ashl $-1,r4,r7 - jlbc r4,L2 - clrl r11 - -# Loop for S2_LIMB >= 0x80000000 -Loop2: movl (r8)+,r1 - jlss L2n0 - emul r1,r6,$0,r2 - addl2 r11,r2 - adwc r1,r3 - movl r2,(r9)+ -L2: movl (r8)+,r1 - jlss L2n1 -L2p1: emul r1,r6,$0,r10 - addl2 r3,r10 - adwc r1,r11 - movl r10,(r9)+ - - sobgtr r7,Loop2 - movl r11,r0 - ret - -L2n0: emul r1,r6,$0,r2 - addl2 r1,r3 - addl2 r11,r2 - adwc r6,r3 - movl r2,(r9)+ - movl (r8)+,r1 - jgeq L2p1 -L2n1: emul r1,r6,$0,r10 - addl2 r1,r11 - addl2 r3,r10 - adwc r6,r11 - movl r10,(r9)+ - - sobgtr r7,Loop2 - movl r11,r0 - ret diff --git a/rts/gmp/mpn/vax/rshift.s b/rts/gmp/mpn/vax/rshift.s deleted file mode 100644 index 5158132..0000000 --- a/rts/gmp/mpn/vax/rshift.s +++ /dev/null @@ -1,56 +0,0 @@ -# VAX __gmpn_rshift -- right shift. - -# 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. - - -# INPUT PARAMETERS -# rptr (sp + 4) -# sptr (sp + 8) -# size (sp + 12) -# cnt (sp + 16) -# r0=retval r1=size r2,r3=itmp r4,r5=otmp call-used registers -# r6=sptr r7=rptr r8=cnt r9 r10 r11 call-saved registers - -.text - .align 1 -.globl ___gmpn_rshift -___gmpn_rshift: - .word 0x1c0 - movl 4(ap),r7 - movl 8(ap),r6 - movl 12(ap),r1 - movl 16(ap),r8 - - movl (r6)+,r2 - subl3 r8,$32,r8 - ashl r8,r2,r0 - decl r1 - jeql Lend - -Loop: movl (r6)+,r3 - ashq r8,r2,r4 - movl r5,(r7)+ - movl r3,r2 - jsobgtr r1,Loop - -Lend: clrl r3 - ashq r8,r2,r4 - movl r5,(r7) - ret diff --git a/rts/gmp/mpn/vax/sub_n.s b/rts/gmp/mpn/vax/sub_n.s deleted file mode 100644 index eff4b1c..0000000 --- a/rts/gmp/mpn/vax/sub_n.s +++ /dev/null @@ -1,61 +0,0 @@ -# VAX __gmpn_sub_n -- Subtract two limb vectors of the same length > 0 and store -# difference in a third limb vector. - -# 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. - - -# INPUT PARAMETERS -# res_ptr (sp + 4) -# s1_ptr (sp + 8) -# s2_ptr (sp + 12) -# size (sp + 16) - -.text - .align 1 -.globl ___gmpn_sub_n -___gmpn_sub_n: - .word 0x0 - movl 16(ap),r0 - movl 12(ap),r1 - movl 8(ap),r2 - movl 4(ap),r3 - mnegl r0,r5 - addl2 $3,r0 - ashl $-2,r0,r0 # unroll loop count - bicl2 $-4,r5 # mask out low 2 bits - movaq (r5)[r5],r5 # 9x - jmp Loop(r5) - -Loop: movl (r2)+,r4 - sbwc (r1)+,r4 - movl r4,(r3)+ - movl (r2)+,r4 - sbwc (r1)+,r4 - movl r4,(r3)+ - movl (r2)+,r4 - sbwc (r1)+,r4 - movl r4,(r3)+ - movl (r2)+,r4 - sbwc (r1)+,r4 - movl r4,(r3)+ - sobgtr r0,Loop - - adwc r0,r0 - ret diff --git a/rts/gmp/mpn/vax/submul_1.s b/rts/gmp/mpn/vax/submul_1.s deleted file mode 100644 index be42286..0000000 --- a/rts/gmp/mpn/vax/submul_1.s +++ /dev/null @@ -1,126 +0,0 @@ -# VAX __gmpn_submul_1 -- Multiply a limb vector with a limb and subtract -# the result from a second limb vector. - -# Copyright (C) 1992, 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. - - -# INPUT PARAMETERS -# res_ptr (sp + 4) -# s1_ptr (sp + 8) -# size (sp + 12) -# s2_limb (sp + 16) - -.text - .align 1 -.globl ___gmpn_submul_1 -___gmpn_submul_1: - .word 0xfc0 - movl 12(ap),r4 - movl 8(ap),r8 - movl 4(ap),r9 - movl 16(ap),r6 - jlss s2_big - - clrl r3 - incl r4 - ashl $-1,r4,r7 - jlbc r4,L1 - clrl r11 - -# Loop for S2_LIMB < 0x80000000 -Loop1: movl (r8)+,r1 - jlss L1n0 - emul r1,r6,$0,r2 - addl2 r11,r2 - adwc $0,r3 - subl2 r2,(r9)+ - adwc $0,r3 -L1: movl (r8)+,r1 - jlss L1n1 -L1p1: emul r1,r6,$0,r10 - addl2 r3,r10 - adwc $0,r11 - subl2 r10,(r9)+ - adwc $0,r11 - - sobgtr r7,Loop1 - movl r11,r0 - ret - -L1n0: emul r1,r6,$0,r2 - addl2 r11,r2 - adwc r6,r3 - subl2 r2,(r9)+ - adwc $0,r3 - movl (r8)+,r1 - jgeq L1p1 -L1n1: emul r1,r6,$0,r10 - addl2 r3,r10 - adwc r6,r11 - subl2 r10,(r9)+ - adwc $0,r11 - - sobgtr r7,Loop1 - movl r11,r0 - ret - - -s2_big: clrl r3 - incl r4 - ashl $-1,r4,r7 - jlbc r4,L2 - clrl r11 - -# Loop for S2_LIMB >= 0x80000000 -Loop2: movl (r8)+,r1 - jlss L2n0 - emul r1,r6,$0,r2 - addl2 r11,r2 - adwc r1,r3 - subl2 r2,(r9)+ - adwc $0,r3 -L2: movl (r8)+,r1 - jlss L2n1 -L2p1: emul r1,r6,$0,r10 - addl2 r3,r10 - adwc r1,r11 - subl2 r10,(r9)+ - adwc $0,r11 - - sobgtr r7,Loop2 - movl r11,r0 - ret - -L2n0: emul r1,r6,$0,r2 - addl2 r11,r2 - adwc r6,r3 - subl2 r2,(r9)+ - adwc r1,r3 - movl (r8)+,r1 - jgeq L2p1 -L2n1: emul r1,r6,$0,r10 - addl2 r3,r10 - adwc r6,r11 - subl2 r10,(r9)+ - adwc r1,r11 - - sobgtr r7,Loop2 - movl r11,r0 - ret diff --git a/rts/gmp/mpn/x86/README b/rts/gmp/mpn/x86/README deleted file mode 100644 index 3507548..0000000 --- a/rts/gmp/mpn/x86/README +++ /dev/null @@ -1,40 +0,0 @@ - - X86 MPN SUBROUTINES - - -This directory contains mpn functions for various 80x86 chips. - - -CODE ORGANIZATION - - x86 i386, i486, generic - x86/pentium Intel Pentium (P5, P54) - x86/pentium/mmx Intel Pentium with MMX (P55) - x86/p6 Intel Pentium Pro - x86/p6/mmx Intel Pentium II, III - x86/p6/p3mmx Intel Pentium III - x86/k6 AMD K6, K6-2, K6-3 - x86/k6/mmx - x86/k6/k62mmx AMD K6-2 - x86/k7 AMD Athlon - x86/k7/mmx - - -The x86 directory is also the main support for P6 at the moment, and -is something of a blended style, meant to be reasonable on all x86s. - - - -STATUS - -The code is well-optimized for AMD and Intel chips, but not so well -optimized for Cyrix chips. - - - -RELEVANT OPTIMIZATION ISSUES - -For implementations with slow double shift instructions (SHLD and -SHRD), it might be better to mimic their operation with SHL+SHR+OR. -(M2 is likely to benefit from that, but not Pentium due to its slow -plain SHL and SHR.) diff --git a/rts/gmp/mpn/x86/README.family b/rts/gmp/mpn/x86/README.family deleted file mode 100644 index 3bc73f5..0000000 --- a/rts/gmp/mpn/x86/README.family +++ /dev/null @@ -1,333 +0,0 @@ - - X86 CPU FAMILY MPN SUBROUTINES - - -This file has some notes on things common to all the x86 family code. - - - -ASM FILES - -The x86 .asm files are BSD style x86 assembler code, first put through m4 -for macro processing. The generic mpn/asm-defs.m4 is used, together with -mpn/x86/x86-defs.m4. Detailed notes are in those files. - -The code is meant for use with GNU "gas" or a system "as". There's no -support for assemblers that demand Intel style, and with gas freely -available and easy to use that shouldn't be a problem. - - - -STACK FRAME - -m4 macros are used to define the parameters passed on the stack, and these -act like comments on what the stack frame looks like too. For example, -mpn_mul_1() has the following. - - defframe(PARAM_MULTIPLIER, 16) - defframe(PARAM_SIZE, 12) - defframe(PARAM_SRC, 8) - defframe(PARAM_DST, 4) - -Here PARAM_MULTIPLIER gets defined as `FRAME+16(%esp)', and the others -similarly. The return address is at offset 0, but there's not normally any -need to access that. - -FRAME is redefined as necessary through the code so it's the number of bytes -pushed on the stack, and hence the offsets in the parameter macros stay -correct. At the start of a routine FRAME should be zero. - - deflit(`FRAME',0) - ... - deflit(`FRAME',4) - ... - deflit(`FRAME',8) - ... - -Helper macros FRAME_pushl(), FRAME_popl(), FRAME_addl_esp() and -FRAME_subl_esp() exist to adjust FRAME for the effect of those instructions, -and can be used instead of explicit definitions if preferred. -defframe_pushl() is a combination FRAME_pushl() and defframe(). - -There's generally some slackness in redefining FRAME. If new values aren't -going to get used, then the redefinitions are omitted to keep from -cluttering up the code. This happens for instance at the end of a routine, -where there might be just four register pops and then a ret, so FRAME isn't -getting used. - -Local variables and saved registers can be similarly defined, with negative -offsets representing stack space below the initial stack pointer. For -example, - - defframe(SAVE_ESI, -4) - defframe(SAVE_EDI, -8) - defframe(VAR_COUNTER,-12) - - deflit(STACK_SPACE, 12) - -Here STACK_SPACE gets used in a "subl $STACK_SPACE, %esp" to allocate the -space, and that instruction must be followed by a redefinition of FRAME -(setting it equal to STACK_SPACE) to reflect the change in %esp. - -Definitions for pushed registers are only put in when they're going to be -used. If registers are just saved and restored with pushes and pops then -definitions aren't made. - - - -ASSEMBLER EXPRESSIONS - -Only addition and subtraction seem to be universally available, certainly -that's all the Solaris 8 "as" seems to accept. If expressions are wanted -then m4 eval() should be used. - -In particular note that a "/" anywhere in a line starts a comment in Solaris -"as", and in some configurations of gas too. - - addl $32/2, %eax <-- wrong - - addl $eval(32/2), %eax <-- right - -Binutils gas/config/tc-i386.c has a choice between "/" being a comment -anywhere in a line, or only at the start. FreeBSD patches 2.9.1 to select -the latter, and as of 2.9.5 it's the default for GNU/Linux too. - - - -ASSEMBLER COMMENTS - -Solaris "as" doesn't support "#" commenting, using /* */ instead, -unfortunately. For that reason "C" commenting is used (see asm-defs.m4) and -the intermediate ".s" files have no comments. - - - -ZERO DISPLACEMENTS - -In a couple of places addressing modes like 0(%ebx) with a byte-sized zero -displacement are wanted, rather than (%ebx) with no displacement. These are -either for computed jumps or to get desirable code alignment. Explicit -.byte sequences are used to ensure the assembler doesn't turn 0(%ebx) into -(%ebx). The Zdisp() macro in x86-defs.m4 is used for this. - -Current gas 2.9.5 or recent 2.9.1 leave 0(%ebx) as written, but old gas -1.92.3 changes it. In general changing would be the sort of "optimization" -an assembler might perform, hence explicit ".byte"s are used where -necessary. - - - -SHLD/SHRD INSTRUCTIONS - -The %cl count forms of double shift instructions like "shldl %cl,%eax,%ebx" -must be written "shldl %eax,%ebx" for some assemblers. gas takes either, -Solaris "as" doesn't allow %cl, gcc generates %cl for gas and NeXT (which is -gas), and omits %cl elsewhere. - -For GMP an autoconf test is used to determine whether %cl should be used and -the macros shldl, shrdl, shldw and shrdw in mpn/x86/x86-defs.m4 then pass -through or omit %cl as necessary. See comments with those macros for usage. - - - -DIRECTION FLAG - -The x86 calling conventions say that the direction flag should be clear at -function entry and exit. (See iBCS2 and SVR4 ABI books, references below.) - -Although this has been so since the year dot, it's not absolutely clear -whether it's universally respected. Since it's better to be safe than -sorry, gmp follows glibc and does a "cld" if it depends on the direction -flag being clear. This happens only in a few places. - - - -POSITION INDEPENDENT CODE - -Defining the symbol PIC in m4 processing selects position independent code. -This mainly affects computed jumps, and these are implemented in a -self-contained fashion (without using the global offset table). The few -calls from assembly code to global functions use the normal procedure -linkage table. - -PIC is necessary for ELF shared libraries because they can be mapped into -different processes at different virtual addresses. Text relocations in -shared libraries are allowed, but that presumably means a page with such a -relocation isn't shared. The use of the PLT for PIC adds a fixed cost to -every function call, which is small but might be noticeable when working with -small operands. - -Calls from one library function to another don't need to go through the PLT, -since of course the call instruction uses a displacement, not an absolute -address, and the relative locations of object files are known when libgmp.so -is created. "ld -Bsymbolic" (or "gcc -Wl,-Bsymbolic") will resolve calls -this way, so that there's no jump through the PLT, but of course leaving -setups of the GOT address in %ebx that may be unnecessary. - -The %ebx setup could be avoided in assembly if a separate option controlled -PIC for calls as opposed to computed jumps etc. But there's only ever -likely to be a handful of calls out of assembler, and getting the same -optimization for C intra-library calls would be more important. There seems -no easy way to tell gcc that certain functions can be called non-PIC, and -unfortunately many gmp functions use the global memory allocation variables, -so they need the GOT anyway. Object files with no global data references -and only intra-library calls could go into the library as non-PIC under --Bsymbolic. Integrating this into libtool and automake is left as an -exercise for the reader. - - - -SIMPLE LOOPS - -The overheads in setting up for an unrolled loop can mean that at small -sizes a simple loop is faster. Making small sizes go fast is important, -even if it adds a cycle or two to bigger sizes. To this end various -routines choose between a simple loop and an unrolled loop according to -operand size. The path to the simple loop, or to special case code for -small sizes, is always as fast as possible. - -Adding a simple loop requires a conditional jump to choose between the -simple and unrolled code. The size of a branch misprediction penalty -affects whether a simple loop is worthwhile. - -The convention is for an m4 definition UNROLL_THRESHOLD to set the crossover -point, with sizes < UNROLL_THRESHOLD using the simple loop, sizes >= -UNROLL_THRESHOLD using the unrolled loop. If position independent code adds -a couple of cycles to an unrolled loop setup, the threshold will vary with -PIC or non-PIC. Something like the following is typical. - - ifdef(`PIC',` - deflit(UNROLL_THRESHOLD, 10) - ',` - deflit(UNROLL_THRESHOLD, 8) - ') - -There's no automated way to determine the threshold. Setting it to a small -value and then to a big value makes it possible to measure the simple and -unrolled loops each over a range of sizes, from which the crossover point -can be determined. Alternately, just adjust the threshold up or down until -there's no more speedups. - - - -UNROLLED LOOP CODING - -The x86 addressing modes allow a byte displacement of -128 to +127, making -it possible to access 256 bytes, which is 64 limbs, without adjusting -pointer registers within the loop. Dword sized displacements can be used -too, but they increase code size, and unrolling to 64 ought to be enough. - -When unrolling to the full 64 limbs/loop, the limb at the top of the loop -will have a displacement of -128, so pointers have to have a corresponding -+128 added before entering the loop. When unrolling to 32 limbs/loop -displacements 0 to 127 can be used with 0 at the top of the loop and no -adjustment needed to the pointers. - -Where 64 limbs/loop is supported, the +128 adjustment is done only when 64 -limbs/loop is selected. Usually the gain in speed using 64 instead of 32 or -16 is small, so support for 64 limbs/loop is generally only for comparison. - - - -COMPUTED JUMPS - -When working from least significant limb to most significant limb (most -routines) the computed jump and pointer calculations in preparation for an -unrolled loop are as follows. - - S = operand size in limbs - N = number of limbs per loop (UNROLL_COUNT) - L = log2 of unrolling (UNROLL_LOG2) - M = mask for unrolling (UNROLL_MASK) - C = code bytes per limb in the loop - B = bytes per limb (4 for x86) - - computed jump (-S & M) * C + entrypoint - subtract from pointers (-S & M) * B - initial loop counter (S-1) >> L - displacements 0 to B*(N-1) - -The loop counter is decremented at the end of each loop, and the looping -stops when the decrement takes the counter to -1. The displacements are for -the addressing accessing each limb, eg. a load with "movl disp(%ebx), %eax". - -Usually the multiply by "C" can be handled without an imul, using instead an -leal, or a shift and subtract. - -When working from most significant to least significant limb (eg. mpn_lshift -and mpn_copyd), the calculations change as follows. - - add to pointers (-S & M) * B - displacements 0 to -B*(N-1) - - - -OLD GAS 1.92.3 - -This version comes with FreeBSD 2.2.8 and has a couple of gremlins that -affect gmp code. - -Firstly, an expression involving two forward references to labels comes out -as zero. For example, - - addl $bar-foo, %eax - foo: - nop - bar: - -This should lead to "addl $1, %eax", but it comes out as "addl $0, %eax". -When only one forward reference is involved, it works correctly, as for -example, - - foo: - addl $bar-foo, %eax - nop - bar: - -Secondly, an expression involving two labels can't be used as the -displacement for an leal. For example, - - foo: - nop - bar: - leal bar-foo(%eax,%ebx,8), %ecx - -A slightly cryptic error is given, "Unimplemented segment type 0 in -parse_operand". When only one label is used it's ok, and the label can be a -forward reference too, as for example, - - leal foo(%eax,%ebx,8), %ecx - nop - foo: - -These problems only affect PIC computed jump calculations. The workarounds -are just to do an leal without a displacement and then an addl, and to make -sure the code is placed so that there's at most one forward reference in the -addl. - - - -REFERENCES - -"Intel Architecture Software Developer's Manual", volumes 1 to 3, 1999, -order numbers 243190, 243191 and 243192. Available on-line, - - ftp://download.intel.com/design/PentiumII/manuals/243190.htm - ftp://download.intel.com/design/PentiumII/manuals/243191.htm - ftp://download.intel.com/design/PentiumII/manuals/243192.htm - -"Intel386 Family Binary Compatibility Specification 2", Intel Corporation, -published by McGraw-Hill, 1991, ISBN 0-07-031219-2. - -"System V Application Binary Interface", Unix System Laboratories Inc, 1992, -published by Prentice Hall, ISBN 0-13-880410-9. And the "Intel386 Processor -Supplement", AT&T, 1991, ISBN 0-13-877689-X. (These have details of ELF -shared library PIC coding.) - - - ----------------- -Local variables: -mode: text -fill-column: 76 -End: diff --git a/rts/gmp/mpn/x86/addsub_n.S b/rts/gmp/mpn/x86/addsub_n.S deleted file mode 100644 index fe6f648..0000000 --- a/rts/gmp/mpn/x86/addsub_n.S +++ /dev/null @@ -1,174 +0,0 @@ -/* Currently not working and not used. */ - -/* -Copyright (C) 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. -*/ - - -#define SAVE_BORROW_RESTORE_CARRY(r) adcl r,r; shll $31,r -#define SAVE_CARRY_RESTORE_BORROW(r) adcl r,r - - .globl mpn_addsub_n_0 - .globl mpn_addsub_n_1 - -/* Cute i386/i486/p6 addsub loop for the "full overlap" case r1==s2,r2==s1. - We let subtraction and addition alternate in being two limbs - ahead of the other, thereby avoiding some SAVE_RESTORE. */ -// r1 = r2 + r1 edi = esi + edi -// r2 = r2 - r1 esi = esi - edi -// s1 s2 -// r2 r1 -// eax,ebx,ecx,edx,esi,edi,ebp -mpn_addsub_n_0: - pushl %edi - pushl %esi - pushl %ebx - pushl %ebp - - movl 20(%esp),%edi /* res_ptr */ - movl 24(%esp),%esi /* s1_ptr */ - movl 36(%esp),%ebp /* size */ - - shrl $2,%ebp - xorl %edx,%edx - .align 4 -Loop0: // L=load E=execute S=store - movl (%esi),%ebx // sub 0 L - movl 4(%esi),%ecx // sub 1 L - sbbl (%edi),%ebx // sub 0 LE - sbbl 4(%edi),%ecx // sub 1 LE -// SAVE_BORROW_RESTORE_CARRY(%edx) - movl (%esi),%eax // add 0 L - adcl %eax,(%edi) // add 0 LES - movl 4(%esi),%eax // add 1 L - adcl %eax,4(%edi) // add 1 LES - movl %ebx,(%esi) // sub 0 S - movl %ecx,4(%esi) // sub 1 S - movl 8(%esi),%ebx // add 2 L - adcl 8(%edi),%ebx // add 2 LE - movl 12(%esi),%ecx // add 3 L - adcl 12(%edi),%ecx // add 3 LE -// SAVE_CARRY_RESTORE_BORROW(%edx) - movl 8(%edi),%eax // sub 2 L - sbbl %eax,8(%esi) // sub 2 LES - movl 12(%edi),%eax // sub 3 L - sbbl %eax,12(%esi) // sub 3 LES - movl %ebx,8(%edi) // add 2 S - movl %ecx,12(%edi) // add 3 S - leal 16(%esi),%esi - leal 16(%edi),%edi - decl %ebp - jnz Loop0 - - popl %ebp - popl %ebx - popl %esi - popl %edi - ret - -/* Cute i386/i486/p6 addsub loop for the "full overlap" case r1==s1,r2==s2. - We let subtraction and addition alternate in being two limbs - ahead of the other, thereby avoiding some SAVE_RESTORE. */ -// r1 = r1 + r2 edi = edi + esi -// r2 = r1 - r2 esi = edi - esi -// s2 s1 -// r2 r1 -// eax,ebx,ecx,edx,esi,edi,ebp -mpn_addsub_n_1: - pushl %edi - pushl %esi - pushl %ebx - pushl %ebp - - movl 20(%esp),%edi /* res_ptr */ - movl 24(%esp),%esi /* s1_ptr */ - movl 36(%esp),%ebp /* size */ - - shrl $2,%ebp - xorl %edx,%edx - .align 4 -Loop1: // L=load E=execute S=store - movl (%edi),%ebx // sub 0 L - sbbl (%esi),%ebx // sub 0 LE - movl 4(%edi),%ecx // sub 1 L - sbbl 4(%esi),%ecx // sub 1 LE -// SAVE_BORROW_RESTORE_CARRY(%edx) - movl (%esi),%eax // add 0 L - adcl %eax,(%edi) // add 0 LES - movl 4(%esi),%eax // add 1 L - adcl %eax,4(%edi) // add 1 LES - movl %ebx,(%esi) // sub 0 S - movl %ecx,4(%esi) // sub 1 S - movl 8(%esi),%ebx // add 2 L - adcl 8(%edi),%ebx // add 2 LE - movl 12(%esi),%ecx // add 3 L - adcl 12(%edi),%ecx // add 3 LE -// SAVE_CARRY_RESTORE_BORROW(%edx) - movl 8(%edi),%eax // sub 2 L - sbbl 8(%esi),%eax // sub 2 LES - movl %eax,8(%esi) // sub 2 S - movl 12(%edi),%eax // sub 3 L - sbbl 12(%esi),%eax // sub 3 LE - movl %eax,12(%esi) // sub 3 S - movl %ebx,8(%edi) // add 2 S - movl %ecx,12(%edi) // add 3 S - leal 16(%esi),%esi - leal 16(%edi),%edi - decl %ebp - jnz Loop1 - - popl %ebp - popl %ebx - popl %esi - popl %edi - ret - - .globl mpn_copy -mpn_copy: - pushl %edi - pushl %esi - pushl %ebx - pushl %ebp - - movl 20(%esp),%edi /* res_ptr */ - movl 24(%esp),%esi /* s1_ptr */ - movl 28(%esp),%ebp /* size */ - - shrl $2,%ebp - .align 4 -Loop2: - movl (%esi),%eax - movl 4(%esi),%ebx - movl %eax,(%edi) - movl %ebx,4(%edi) - movl 8(%esi),%eax - movl 12(%esi),%ebx - movl %eax,8(%edi) - movl %ebx,12(%edi) - leal 16(%esi),%esi - leal 16(%edi),%edi - decl %ebp - jnz Loop2 - - popl %ebp - popl %ebx - popl %esi - popl %edi - ret diff --git a/rts/gmp/mpn/x86/aors_n.asm b/rts/gmp/mpn/x86/aors_n.asm deleted file mode 100644 index 18ef816..0000000 --- a/rts/gmp/mpn/x86/aors_n.asm +++ /dev/null @@ -1,187 +0,0 @@ -dnl x86 mpn_add_n/mpn_sub_n -- mpn addition and subtraction. - -dnl Copyright (C) 1992, 1994, 1995, 1996, 1999, 2000 Free Software -dnl Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -ifdef(`OPERATION_add_n',` - define(M4_inst, adcl) - define(M4_function_n, mpn_add_n) - define(M4_function_nc, mpn_add_nc) - -',`ifdef(`OPERATION_sub_n',` - define(M4_inst, sbbl) - define(M4_function_n, mpn_sub_n) - define(M4_function_nc, mpn_sub_nc) - -',`m4_error(`Need OPERATION_add_n or OPERATION_sub_n -')')') - -MULFUNC_PROLOGUE(mpn_add_n mpn_add_nc mpn_sub_n mpn_sub_nc) - - -C mp_limb_t M4_function_n (mp_ptr dst, mp_srcptr src1, mp_srcptr src2, -C mp_size_t size); -C mp_limb_t M4_function_nc (mp_ptr dst, mp_srcptr src1, mp_srcptr src2, -C mp_size_t size, mp_limb_t carry); - -defframe(PARAM_CARRY,20) -defframe(PARAM_SIZE, 16) -defframe(PARAM_SRC2, 12) -defframe(PARAM_SRC1, 8) -defframe(PARAM_DST, 4) - - .text - ALIGN(8) - -PROLOGUE(M4_function_nc) -deflit(`FRAME',0) - - pushl %edi FRAME_pushl() - pushl %esi FRAME_pushl() - - movl PARAM_DST,%edi - movl PARAM_SRC1,%esi - movl PARAM_SRC2,%edx - movl PARAM_SIZE,%ecx - - movl %ecx,%eax - shrl $3,%ecx C compute count for unrolled loop - negl %eax - andl $7,%eax C get index where to start loop - jz LF(M4_function_n,oopgo) C necessary special case for 0 - incl %ecx C adjust loop count - shll $2,%eax C adjustment for pointers... - subl %eax,%edi C ... since they are offset ... - subl %eax,%esi C ... by a constant when we ... - subl %eax,%edx C ... enter the loop - shrl $2,%eax C restore previous value - -ifdef(`PIC',` - C Calculate start address in loop for PIC. Due to limitations in - C old gas, LF(M4_function_n,oop)-L(0a)-3 cannot be put into the leal - call L(0a) -L(0a): leal (%eax,%eax,8),%eax - addl (%esp),%eax - addl $LF(M4_function_n,oop)-L(0a)-3,%eax - addl $4,%esp -',` - C Calculate start address in loop for non-PIC. - leal LF(M4_function_n,oop)-3(%eax,%eax,8),%eax -') - - C These lines initialize carry from the 5th parameter. Should be - C possible to simplify. - pushl %ebp FRAME_pushl() - movl PARAM_CARRY,%ebp - shrl $1,%ebp C shift bit 0 into carry - popl %ebp FRAME_popl() - - jmp *%eax C jump into loop - -EPILOGUE() - - - ALIGN(8) -PROLOGUE(M4_function_n) -deflit(`FRAME',0) - - pushl %edi FRAME_pushl() - pushl %esi FRAME_pushl() - - movl PARAM_DST,%edi - movl PARAM_SRC1,%esi - movl PARAM_SRC2,%edx - movl PARAM_SIZE,%ecx - - movl %ecx,%eax - shrl $3,%ecx C compute count for unrolled loop - negl %eax - andl $7,%eax C get index where to start loop - jz L(oop) C necessary special case for 0 - incl %ecx C adjust loop count - shll $2,%eax C adjustment for pointers... - subl %eax,%edi C ... since they are offset ... - subl %eax,%esi C ... by a constant when we ... - subl %eax,%edx C ... enter the loop - shrl $2,%eax C restore previous value - -ifdef(`PIC',` - C Calculate start address in loop for PIC. Due to limitations in - C some assemblers, L(oop)-L(0b)-3 cannot be put into the leal - call L(0b) -L(0b): leal (%eax,%eax,8),%eax - addl (%esp),%eax - addl $L(oop)-L(0b)-3,%eax - addl $4,%esp -',` - C Calculate start address in loop for non-PIC. - leal L(oop)-3(%eax,%eax,8),%eax -') - jmp *%eax C jump into loop - -L(oopgo): - pushl %ebp FRAME_pushl() - movl PARAM_CARRY,%ebp - shrl $1,%ebp C shift bit 0 into carry - popl %ebp FRAME_popl() - - ALIGN(8) -L(oop): movl (%esi),%eax - M4_inst (%edx),%eax - movl %eax,(%edi) - movl 4(%esi),%eax - M4_inst 4(%edx),%eax - movl %eax,4(%edi) - movl 8(%esi),%eax - M4_inst 8(%edx),%eax - movl %eax,8(%edi) - movl 12(%esi),%eax - M4_inst 12(%edx),%eax - movl %eax,12(%edi) - movl 16(%esi),%eax - M4_inst 16(%edx),%eax - movl %eax,16(%edi) - movl 20(%esi),%eax - M4_inst 20(%edx),%eax - movl %eax,20(%edi) - movl 24(%esi),%eax - M4_inst 24(%edx),%eax - movl %eax,24(%edi) - movl 28(%esi),%eax - M4_inst 28(%edx),%eax - movl %eax,28(%edi) - leal 32(%edi),%edi - leal 32(%esi),%esi - leal 32(%edx),%edx - decl %ecx - jnz L(oop) - - sbbl %eax,%eax - negl %eax - - popl %esi - popl %edi - ret - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/aorsmul_1.asm b/rts/gmp/mpn/x86/aorsmul_1.asm deleted file mode 100644 index f32ad83..0000000 --- a/rts/gmp/mpn/x86/aorsmul_1.asm +++ /dev/null @@ -1,134 +0,0 @@ -dnl x86 __gmpn_addmul_1 (for 386 and 486) -- Multiply a limb vector with a -dnl limb and add the result to a second limb vector. - - -dnl Copyright (C) 1992, 1994, 1997, 1999, 2000 Free Software Foundation, -dnl Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -ifdef(`OPERATION_addmul_1',` - define(M4_inst, addl) - define(M4_function_1, mpn_addmul_1) - -',`ifdef(`OPERATION_submul_1',` - define(M4_inst, subl) - define(M4_function_1, mpn_submul_1) - -',`m4_error(`Need OPERATION_addmul_1 or OPERATION_submul_1 -')')') - -MULFUNC_PROLOGUE(mpn_addmul_1 mpn_submul_1) - - -C mp_limb_t M4_function_1 (mp_ptr dst, mp_srcptr src, mp_size_t size, -C mp_limb_t mult); - -define(PARAM_MULTIPLIER, `FRAME+16(%esp)') -define(PARAM_SIZE, `FRAME+12(%esp)') -define(PARAM_SRC, `FRAME+8(%esp)') -define(PARAM_DST, `FRAME+4(%esp)') - - TEXT - ALIGN(8) - -PROLOGUE(M4_function_1) -deflit(`FRAME',0) - - pushl %edi - pushl %esi - pushl %ebx - pushl %ebp -deflit(`FRAME',16) - - movl PARAM_DST,%edi - movl PARAM_SRC,%esi - movl PARAM_SIZE,%ecx - - xorl %ebx,%ebx - andl $3,%ecx - jz L(end0) - -L(oop0): - movl (%esi),%eax - mull PARAM_MULTIPLIER - leal 4(%esi),%esi - addl %ebx,%eax - movl $0,%ebx - adcl %ebx,%edx - M4_inst %eax,(%edi) - adcl %edx,%ebx C propagate carry into cylimb - - leal 4(%edi),%edi - decl %ecx - jnz L(oop0) - -L(end0): - movl PARAM_SIZE,%ecx - shrl $2,%ecx - jz L(end) - - ALIGN(8) -L(oop): movl (%esi),%eax - mull PARAM_MULTIPLIER - addl %eax,%ebx - movl $0,%ebp - adcl %edx,%ebp - - movl 4(%esi),%eax - mull PARAM_MULTIPLIER - M4_inst %ebx,(%edi) - adcl %eax,%ebp C new lo + cylimb - movl $0,%ebx - adcl %edx,%ebx - - movl 8(%esi),%eax - mull PARAM_MULTIPLIER - M4_inst %ebp,4(%edi) - adcl %eax,%ebx C new lo + cylimb - movl $0,%ebp - adcl %edx,%ebp - - movl 12(%esi),%eax - mull PARAM_MULTIPLIER - M4_inst %ebx,8(%edi) - adcl %eax,%ebp C new lo + cylimb - movl $0,%ebx - adcl %edx,%ebx - - M4_inst %ebp,12(%edi) - adcl $0,%ebx C propagate carry into cylimb - - leal 16(%esi),%esi - leal 16(%edi),%edi - decl %ecx - jnz L(oop) - -L(end): movl %ebx,%eax - - popl %ebp - popl %ebx - popl %esi - popl %edi - ret - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/copyd.asm b/rts/gmp/mpn/x86/copyd.asm deleted file mode 100644 index 439640e..0000000 --- a/rts/gmp/mpn/x86/copyd.asm +++ /dev/null @@ -1,80 +0,0 @@ -dnl x86 mpn_copyd -- copy limb vector, decrementing. -dnl -dnl Future: On P6 an MMX loop should be able to go faster than this code. - - -dnl Copyright (C) 1999, 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -C void mpn_copyd (mp_ptr dst, mp_srcptr src, mp_size_t size); -C -C Copy src,size to dst,size, working from high to low addresses. -C -C The code here is very generic and can be expected to be reasonable on all -C the x86 family. -C -C P5 - 1.0 cycles/limb. -C -C P6 - 2.4 cycles/limb, approx 40 cycles startup. - -defframe(PARAM_SIZE,12) -defframe(PARAM_SRC, 8) -defframe(PARAM_DST, 4) -deflit(`FRAME',0) - - .text - ALIGN(32) - -PROLOGUE(mpn_copyd) - C eax saved esi - C ebx - C ecx counter - C edx saved edi - C esi src - C edi dst - C ebp - - movl PARAM_SIZE, %ecx - movl %esi, %eax - - movl PARAM_SRC, %esi - movl %edi, %edx - - movl PARAM_DST, %edi - leal -4(%esi,%ecx,4), %esi - - leal -4(%edi,%ecx,4), %edi - - std - - rep - movsl - - cld - - movl %eax, %esi - movl %edx, %edi - - ret - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/copyi.asm b/rts/gmp/mpn/x86/copyi.asm deleted file mode 100644 index 5bc4e36..0000000 --- a/rts/gmp/mpn/x86/copyi.asm +++ /dev/null @@ -1,79 +0,0 @@ -dnl x86 mpn_copyi -- copy limb vector, incrementing. - - -dnl Copyright (C) 1999, 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -C void mpn_copyi (mp_ptr dst, mp_srcptr src, mp_size_t size); -C -C Copy src,size to dst,size, working from low to high addresses. -C -C The code here is very generic and can be expected to be reasonable on all -C the x86 family. -C -C P5 - 1.0 cycles/limb. -C -C P6 - 0.75 cycles/limb. An MMX based copy was tried, but was found to be -C slower than a rep movs in all cases. The fastest MMX found was 0.8 -C cycles/limb (when fully aligned). A rep movs seems to have a startup -C time of about 15 cycles, but doing something special for small sizes -C could lead to a branch misprediction that would destroy any saving. -C For now a plain rep movs seems ok for P6. - -defframe(PARAM_SIZE,12) -defframe(PARAM_SRC, 8) -defframe(PARAM_DST, 4) -deflit(`FRAME',0) - - .text - ALIGN(32) - - C eax saved esi - C ebx - C ecx counter - C edx saved edi - C esi src - C edi dst - C ebp - -PROLOGUE(mpn_copyi) - - movl PARAM_SIZE, %ecx - movl %esi, %eax - - movl PARAM_SRC, %esi - movl %edi, %edx - - movl PARAM_DST, %edi - - cld C better safe than sorry, see mpn/x86/README.family - - rep - movsl - - movl %eax, %esi - movl %edx, %edi - - ret - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/diveby3.asm b/rts/gmp/mpn/x86/diveby3.asm deleted file mode 100644 index df879da..0000000 --- a/rts/gmp/mpn/x86/diveby3.asm +++ /dev/null @@ -1,115 +0,0 @@ -dnl x86 mpn_divexact_by3 -- mpn division by 3, expecting no remainder. - - -dnl Copyright (C) 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -dnl The following all have their own optimized versions of this routine, -dnl but for reference the code here runs as follows. -dnl -dnl cycles/limb -dnl P54 18.0 -dnl P55 17.0 -dnl P6 14.5 -dnl K6 14.0 -dnl K7 10.0 - - -include(`../config.m4') - - -C mp_limb_t mpn_divexact_by3c (mp_ptr dst, mp_srcptr src, mp_size_t size, -C mp_limb_t carry); - -defframe(PARAM_CARRY,16) -defframe(PARAM_SIZE, 12) -defframe(PARAM_SRC, 8) -defframe(PARAM_DST, 4) - -dnl multiplicative inverse of 3, modulo 2^32 -deflit(INVERSE_3, 0xAAAAAAAB) - -dnl ceil(b/3) and ceil(b*2/3) where b=2^32 -deflit(ONE_THIRD_CEIL, 0x55555556) -deflit(TWO_THIRDS_CEIL, 0xAAAAAAAB) - - .text - ALIGN(8) - -PROLOGUE(mpn_divexact_by3c) -deflit(`FRAME',0) - - movl PARAM_SRC, %ecx - pushl %ebp FRAME_pushl() - - movl PARAM_SIZE, %ebp - pushl %edi FRAME_pushl() - - movl PARAM_DST, %edi - pushl %esi FRAME_pushl() - - movl $INVERSE_3, %esi - pushl %ebx FRAME_pushl() - - leal (%ecx,%ebp,4), %ecx - movl PARAM_CARRY, %ebx - - leal (%edi,%ebp,4), %edi - negl %ebp - - - ALIGN(8) -L(top): - C eax scratch, low product - C ebx carry limb (0 to 3) - C ecx &src[size] - C edx scratch, high product - C esi multiplier - C edi &dst[size] - C ebp counter, limbs, negative - - movl (%ecx,%ebp,4), %eax - - subl %ebx, %eax - - setc %bl - - imull %esi - - cmpl $ONE_THIRD_CEIL, %eax - movl %eax, (%edi,%ebp,4) - - sbbl $-1, %ebx C +1 if eax>=ceil(b/3) - cmpl $TWO_THIRDS_CEIL, %eax - - sbbl $-1, %ebx C +1 if eax>=ceil(b*2/3) - incl %ebp - - jnz L(top) - - - movl %ebx, %eax - popl %ebx - popl %esi - popl %edi - popl %ebp - ret - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/divrem_1.asm b/rts/gmp/mpn/x86/divrem_1.asm deleted file mode 100644 index 12f1467..0000000 --- a/rts/gmp/mpn/x86/divrem_1.asm +++ /dev/null @@ -1,232 +0,0 @@ -dnl x86 mpn_divrem_1 -- mpn by limb division extending to fractional quotient. - -dnl Copyright (C) 1999, 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -dnl cycles/limb -dnl K6 20 -dnl P5 44 -dnl P6 39 -dnl 486 approx 43 maybe -dnl -dnl -dnl The following have their own optimized divrem_1 implementations, but -dnl for reference the code here runs as follows. -dnl -dnl cycles/limb -dnl P6MMX 39 -dnl K7 42 - - -include(`../config.m4') - - -C mp_limb_t mpn_divrem_1 (mp_ptr dst, mp_size_t xsize, -C mp_srcptr src, mp_size_t size, mp_limb_t divisor); -C mp_limb_t mpn_divrem_1c (mp_ptr dst, mp_size_t xsize, -C mp_srcptr src, mp_size_t size, mp_limb_t divisor); -C -C Divide src,size by divisor and store the quotient in dst+xsize,size. -C Extend the division to fractional quotient limbs in dst,xsize. Return the -C remainder. Either or both xsize and size can be 0. -C -C mpn_divrem_1c takes a carry parameter which is an initial high limb, -C effectively one extra limb at the top of src,size. Must have -C carry= b^2, which is u*b+v >= b^2-x*y, and -C there are b^2-(b^2-x*y) = x*y many such values, giving a probability of -C x*y/b^2. If x, y, u and v are random and uniformly distributed between 0 -C and b-1, then the total probability can be summed over x and y, -C -C 1 b-1 b-1 x*y 1 b*(b-1) b*(b-1) -C --- * sum sum --- = --- * ------- * ------- = 1/4 -C b^2 x=0 y=1 b^2 b^4 2 2 -C -C Actually it's a very tiny bit less than 1/4 of course. If y is fixed, -C then the probability is 1/2*y/b thus varying linearly between 0 and 1/2. - - -ifdef(`PIC',` -deflit(UNROLL_THRESHOLD, 9) -',` -deflit(UNROLL_THRESHOLD, 6) -') - -defframe(PARAM_CARRY, 20) -defframe(PARAM_MULTIPLIER,16) -defframe(PARAM_SIZE, 12) -defframe(PARAM_SRC, 8) -defframe(PARAM_DST, 4) - - .text - ALIGN(32) - -PROLOGUE(M4_function_1c) - pushl %esi -deflit(`FRAME',4) - movl PARAM_CARRY, %esi - jmp LF(M4_function_1,start_nc) -EPILOGUE() - -PROLOGUE(M4_function_1) - push %esi -deflit(`FRAME',4) - xorl %esi, %esi C initial carry - -L(start_nc): - movl PARAM_SIZE, %ecx - pushl %ebx -deflit(`FRAME',8) - - movl PARAM_SRC, %ebx - pushl %edi -deflit(`FRAME',12) - - cmpl $UNROLL_THRESHOLD, %ecx - movl PARAM_DST, %edi - - pushl %ebp -deflit(`FRAME',16) - jae L(unroll) - - - C simple loop - - movl PARAM_MULTIPLIER, %ebp - -L(simple): - C eax scratch - C ebx src - C ecx counter - C edx scratch - C esi carry - C edi dst - C ebp multiplier - - movl (%ebx), %eax - addl $4, %ebx - - mull %ebp - - addl $4, %edi - addl %esi, %eax - - adcl $0, %edx - - M4_inst %eax, -4(%edi) - - adcl $0, %edx - - movl %edx, %esi - loop L(simple) - - - popl %ebp - popl %edi - - popl %ebx - movl %esi, %eax - - popl %esi - ret - - - -C ----------------------------------------------------------------------------- -C The unrolled loop uses a "two carry limbs" scheme. At the top of the loop -C the carries are ecx=lo, esi=hi, then they swap for each limb processed. -C For the computed jump an odd size means they start one way around, an even -C size the other. -C -C VAR_JUMP holds the computed jump temporarily because there's not enough -C registers at the point of doing the mul for the initial two carry limbs. -C -C The add/adc for the initial carry in %esi is necessary only for the -C mpn_addmul/submul_1c entry points. Duplicating the startup code to -C eliminiate this for the plain mpn_add/submul_1 doesn't seem like a good -C idea. - -dnl overlapping with parameters already fetched -define(VAR_COUNTER, `PARAM_SIZE') -define(VAR_JUMP, `PARAM_DST') - -L(unroll): - C eax - C ebx src - C ecx size - C edx - C esi initial carry - C edi dst - C ebp - - movl %ecx, %edx - decl %ecx - - subl $2, %edx - negl %ecx - - shrl $UNROLL_LOG2, %edx - andl $UNROLL_MASK, %ecx - - movl %edx, VAR_COUNTER - movl %ecx, %edx - - shll $4, %edx - negl %ecx - - C 15 code bytes per limb -ifdef(`PIC',` - call L(pic_calc) -L(here): -',` - leal L(entry) (%edx,%ecx,1), %edx -') - movl (%ebx), %eax C src low limb - - movl PARAM_MULTIPLIER, %ebp - movl %edx, VAR_JUMP - - mull %ebp - - addl %esi, %eax C initial carry (from _1c) - jadcl0( %edx) - - - leal 4(%ebx,%ecx,4), %ebx - movl %edx, %esi C high carry - - movl VAR_JUMP, %edx - leal (%edi,%ecx,4), %edi - - testl $1, %ecx - movl %eax, %ecx C low carry - - jz L(noswap) - movl %esi, %ecx C high,low carry other way around - - movl %eax, %esi -L(noswap): - - jmp *%edx - - -ifdef(`PIC',` -L(pic_calc): - C See README.family about old gas bugs - leal (%edx,%ecx,1), %edx - addl $L(entry)-L(here), %edx - addl (%esp), %edx - ret -') - - -C ----------------------------------------------------------- - ALIGN(32) -L(top): -deflit(`FRAME',16) - C eax scratch - C ebx src - C ecx carry lo - C edx scratch - C esi carry hi - C edi dst - C ebp multiplier - C - C 15 code bytes per limb - - leal UNROLL_BYTES(%edi), %edi - -L(entry): -forloop(`i', 0, UNROLL_COUNT/2-1, ` - deflit(`disp0', eval(2*i*4)) - deflit(`disp1', eval(disp0 + 4)) - -Zdisp( movl, disp0,(%ebx), %eax) - mull %ebp -Zdisp( M4_inst,%ecx, disp0,(%edi)) - adcl %eax, %esi - movl %edx, %ecx - jadcl0( %ecx) - - movl disp1(%ebx), %eax - mull %ebp - M4_inst %esi, disp1(%edi) - adcl %eax, %ecx - movl %edx, %esi - jadcl0( %esi) -') - - decl VAR_COUNTER - leal UNROLL_BYTES(%ebx), %ebx - - jns L(top) - - - popl %ebp - M4_inst %ecx, UNROLL_BYTES(%edi) - - popl %edi - movl %esi, %eax - - popl %ebx - jadcl0( %eax) - - popl %esi - ret - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/k6/cross.pl b/rts/gmp/mpn/x86/k6/cross.pl deleted file mode 100644 index 21734f3..0000000 --- a/rts/gmp/mpn/x86/k6/cross.pl +++ /dev/null @@ -1,141 +0,0 @@ -#! /usr/bin/perl - -# 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. - - -# Usage: cross.pl [filename.o]... -# -# Produce an annotated disassembly of the given object files, indicating -# certain code alignment and addressing mode problems afflicting K6 chips. -# "ZZ" is used on all annotations, so this can be searched for. -# -# With no arguments, all .o files corresponding to .asm files are processed. -# This is good in the mpn object directory of a k6*-*-* build. -# -# As far as fixing problems goes, any cache line crossing problems in loops -# get attention, but as a rule it's too tedious to rearrange code or slip in -# nops to fix every problem in setup or finishup code. -# -# Bugs: -# -# Instructions without mod/rm bytes or which are already vector decoded are -# unaffected by cache line boundary crossing, but not all of these have yet -# been put in as exceptions. All that occur in practice in GMP are present -# though. -# -# There's no messages for using the vector decoded addressing mode (%esi), -# but that mode is easy to avoid when coding. - -use strict; - -sub disassemble { - my ($file) = @_; - my ($addr,$b1,$b2,$b3, $prefix,$opcode,$modrm); - - open (IN, "objdump -Srfh $file |") - || die "Cannot open pipe from objdump\n"; - while () { - print; - - if (/^[ \t]*[0-9]+[ \t]+\.text[ \t]/ && /2\*\*([0-9]+)$/) { - if ($1 < 5) { - print "ZZ need at least 2**5 for predictable cache line crossing\n"; - } - } - - if (/^[ \t]*([0-9a-f]*):[ \t]*([0-9a-f]+)[ \t]+([0-9a-f]+)[ \t]+([0-9a-f]+)/) { - ($addr,$b1,$b2,$b3) = ($1,$2,$3,$4); - - } elsif (/^[ \t]*([0-9a-f]*):[ \t]*([0-9a-f]+)[ \t]+([0-9a-f]+)/) { - ($addr,$b1,$b2,$b3) = ($1,$2,$3,''); - - } elsif (/^[ \t]*([0-9a-f]*):[ \t]*([0-9a-f]+)/) { - ($addr,$b1,$b2,$b3) = ($1,$2,'',''); - - } else { - next; - } - - if ($b1 =~ /0f/) { - $prefix = $b1; - $opcode = $b2; - $modrm = $b3; - } else { - $prefix = ''; - $opcode = $b1; - $modrm = $b2; - } - - # modrm of the form 00-xxx-100 with an 0F prefix is the problem case - # for K6 and pre-CXT K6-2 - if ($prefix =~ /0f/ - && $opcode !~ /^8/ # jcond disp32 - && $modrm =~ /^[0-3][4c]/) { - print "ZZ ($file) >3 bytes to determine instruction length\n"; - } - - # with just an opcode, starting 1f mod 20h - if ($addr =~ /[13579bdf]f$/ - && $prefix !~ /0f/ - && $opcode !~ /1[012345]/ # adc - && $opcode !~ /1[89abcd]/ # sbb - && $opcode !~ /68/ # push $imm32 - && $opcode !~ /^7/ # jcond disp8 - && $opcode !~ /a[89]/ # test+imm - && $opcode !~ /a[a-f]/ # stos/lods/scas - && $opcode !~ /b8/ # movl $imm32,%eax - && $opcode !~ /e[0123]/ # loop/loopz/loopnz/jcxz - && $opcode !~ /e[b9]/ # jmp disp8/disp32 - && $opcode !~ /f[89abcd]/ # clc,stc,cli,sti,cld,std - && !($opcode =~ /f[67]/ # grp 1 - && $modrm =~ /^[2367abef]/) # mul, imul, div, idiv - && $modrm !~ /^$/) { - print "ZZ ($file) opcode/modrm cross 32-byte boundary\n"; - } - - # with an 0F prefix, anything starting at 1f mod 20h - if ($addr =~ /[13579bdf][f]$/ - && $prefix =~ /0f/) { - print "ZZ ($file) prefix/opcode cross 32-byte boundary\n"; - } - - # with an 0F prefix, anything with mod/rm starting at 1e mod 20h - if ($addr =~ /[13579bdf][e]$/ - && $prefix =~ /0f/ - && $opcode !~ /^8/ # jcond disp32 - && $modrm !~ /^$/) { - print "ZZ ($file) prefix/opcode/modrm cross 32-byte boundary\n"; - } - } - close IN || die "Error from objdump (or objdump not available)\n"; -} - - -my @files; -if ($#ARGV >= 0) { - @files = @ARGV; -} else { - @files = glob "*.asm"; - map {s/.asm/.o/} @files; -} - -foreach (@files) { - disassemble($_); -} diff --git a/rts/gmp/mpn/x86/k6/diveby3.asm b/rts/gmp/mpn/x86/k6/diveby3.asm deleted file mode 100644 index ffb97bc..0000000 --- a/rts/gmp/mpn/x86/k6/diveby3.asm +++ /dev/null @@ -1,110 +0,0 @@ -dnl AMD K6 mpn_divexact_by3 -- mpn division by 3, expecting no remainder. -dnl -dnl K6: 11.0 cycles/limb - - -dnl Copyright (C) 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -C mp_limb_t mpn_divexact_by3c (mp_ptr dst, mp_srcptr src, mp_size_t size, -C mp_limb_t carry); -C -C Using %esi in (%esi,%ecx,4) or 0(%esi,%ecx,4) addressing modes doesn't -C lead to vector decoding, unlike plain (%esi) does. - -defframe(PARAM_CARRY,16) -defframe(PARAM_SIZE, 12) -defframe(PARAM_SRC, 8) -defframe(PARAM_DST, 4) - -dnl multiplicative inverse of 3, modulo 2^32 -deflit(INVERSE_3, 0xAAAAAAAB) - - .text - ALIGN(32) - -PROLOGUE(mpn_divexact_by3c) -deflit(`FRAME',0) - - movl PARAM_SIZE, %ecx - pushl %esi defframe_pushl(SAVE_ESI) - - movl PARAM_SRC, %esi - pushl %edi defframe_pushl(SAVE_EDI) - - movl PARAM_DST, %edi - pushl %ebx defframe_pushl(SAVE_EBX) - - movl PARAM_CARRY, %ebx - leal (%esi,%ecx,4), %esi - - pushl $3 defframe_pushl(VAR_THREE) - leal (%edi,%ecx,4), %edi - - negl %ecx - - - C Need 32 alignment for claimed speed, to avoid the movl store - C opcode/modrm crossing a cache line boundary - - ALIGN(32) -L(top): - C eax scratch, low product - C ebx carry limb (0 to 3) - C ecx counter, limbs, negative - C edx scratch, high product - C esi &src[size] - C edi &dst[size] - C ebp - C - C The 0(%esi,%ecx,4) form pads so the finishup "movl %ebx, %eax" - C doesn't cross a 32 byte boundary, saving a couple of cycles - C (that's a fixed couple, not per loop). - -Zdisp( movl, 0,(%esi,%ecx,4), %eax) - subl %ebx, %eax - - setc %bl - - imull $INVERSE_3, %eax - - movl %eax, (%edi,%ecx,4) - addl $2, %ecx - - mull VAR_THREE - - addl %edx, %ebx - loop L(top) - - - movl SAVE_ESI, %esi - movl %ebx, %eax - - movl SAVE_EBX, %ebx - - movl SAVE_EDI, %edi - addl $FRAME, %esp - - ret - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/k6/gmp-mparam.h b/rts/gmp/mpn/x86/k6/gmp-mparam.h deleted file mode 100644 index 77f3948..0000000 --- a/rts/gmp/mpn/x86/k6/gmp-mparam.h +++ /dev/null @@ -1,97 +0,0 @@ -/* AMD K6 gmp-mparam.h -- Compiler/machine parameter header file. - -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. */ - -#define BITS_PER_MP_LIMB 32 -#define BYTES_PER_MP_LIMB 4 -#define BITS_PER_LONGINT 32 -#define BITS_PER_INT 32 -#define BITS_PER_SHORTINT 16 -#define BITS_PER_CHAR 8 - - -#ifndef UMUL_TIME -#define UMUL_TIME 3 /* cycles */ -#endif - -#ifndef UDIV_TIME -#define UDIV_TIME 20 /* cycles */ -#endif - -/* bsfl takes 12-27 cycles, put an average for uniform random numbers */ -#ifndef COUNT_TRAILING_ZEROS_TIME -#define COUNT_TRAILING_ZEROS_TIME 14 /* cycles */ -#endif - - -/* Generated by tuneup.c, 2000-07-04. */ - -#ifndef KARATSUBA_MUL_THRESHOLD -#define KARATSUBA_MUL_THRESHOLD 18 -#endif -#ifndef TOOM3_MUL_THRESHOLD -#define TOOM3_MUL_THRESHOLD 130 -#endif - -#ifndef KARATSUBA_SQR_THRESHOLD -#define KARATSUBA_SQR_THRESHOLD 34 -#endif -#ifndef TOOM3_SQR_THRESHOLD -#define TOOM3_SQR_THRESHOLD 116 -#endif - -#ifndef BZ_THRESHOLD -#define BZ_THRESHOLD 68 -#endif - -#ifndef FIB_THRESHOLD -#define FIB_THRESHOLD 98 -#endif - -#ifndef POWM_THRESHOLD -#define POWM_THRESHOLD 13 -#endif - -#ifndef GCD_ACCEL_THRESHOLD -#define GCD_ACCEL_THRESHOLD 4 -#endif -#ifndef GCDEXT_THRESHOLD -#define GCDEXT_THRESHOLD 67 -#endif - -#ifndef FFT_MUL_TABLE -#define FFT_MUL_TABLE { 528, 1184, 2176, 5632, 14336, 40960, 0 } -#endif -#ifndef FFT_MODF_MUL_THRESHOLD -#define FFT_MODF_MUL_THRESHOLD 472 -#endif -#ifndef FFT_MUL_THRESHOLD -#define FFT_MUL_THRESHOLD 4352 -#endif - -#ifndef FFT_SQR_TABLE -#define FFT_SQR_TABLE { 528, 1184, 2176, 5632, 14336, 40960, 0 } -#endif -#ifndef FFT_MODF_SQR_THRESHOLD -#define FFT_MODF_SQR_THRESHOLD 544 -#endif -#ifndef FFT_SQR_THRESHOLD -#define FFT_SQR_THRESHOLD 4352 -#endif diff --git a/rts/gmp/mpn/x86/k6/k62mmx/copyd.asm b/rts/gmp/mpn/x86/k6/k62mmx/copyd.asm deleted file mode 100644 index 20a33e6..0000000 --- a/rts/gmp/mpn/x86/k6/k62mmx/copyd.asm +++ /dev/null @@ -1,179 +0,0 @@ -dnl AMD K6-2 mpn_copyd -- copy limb vector, decrementing. -dnl -dnl K6-2: 0.56 or 1.0 cycles/limb (at 32 limbs/loop), depending on data -dnl alignment. - - -dnl Copyright (C) 1999, 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -dnl K6-2 aligned: -dnl UNROLL_COUNT cycles/limb -dnl 8 0.75 -dnl 16 0.625 -dnl 32 0.5625 -dnl 64 0.53 -dnl Maximum possible with the current code is 64, the minimum is 2. - -deflit(UNROLL_COUNT, 32) - - -C void mpn_copyd (mp_ptr dst, mp_srcptr src, mp_size_t size); -C -C Copy src,size to dst,size, processing limbs from high to low addresses. -C -C The comments in copyi.asm apply here too. - - -defframe(PARAM_SIZE,12) -defframe(PARAM_SRC, 8) -defframe(PARAM_DST, 4) -deflit(`FRAME',0) - - .text - ALIGN(32) - -PROLOGUE(mpn_copyd) - movl PARAM_SIZE, %ecx - movl %esi, %eax - - movl PARAM_SRC, %esi - movl %edi, %edx - - std - - movl PARAM_DST, %edi - cmpl $UNROLL_COUNT, %ecx - - leal -4(%esi,%ecx,4), %esi - - leal -4(%edi,%ecx,4), %edi - ja L(unroll) - -L(simple): - rep - movsl - - cld - - movl %eax, %esi - movl %edx, %edi - - ret - - -L(unroll): - C if src and dst are different alignments mod8, then use rep movs - C if src and dst are both 4mod8 then process one limb to get 0mod8 - - pushl %ebx - leal (%esi,%edi), %ebx - - testb $4, %bl - popl %ebx - - jnz L(simple) - testl $4, %esi - - leal -UNROLL_COUNT(%ecx), %ecx - jnz L(already_aligned) - - movsl - - decl %ecx -L(already_aligned): - - -ifelse(UNROLL_BYTES,256,` - subl $128, %esi - subl $128, %edi -') - - C offset 0x3D here, but gets full speed without further alignment -L(top): - C eax saved esi - C ebx - C ecx counter, limbs - C edx saved edi - C esi src, incrementing - C edi dst, incrementing - C ebp - C - C `disp' is never 0, so don't need to force 0(%esi). - -deflit(CHUNK_COUNT, 2) -forloop(`i', 0, UNROLL_COUNT/CHUNK_COUNT-1, ` - deflit(`disp', eval(-4-i*CHUNK_COUNT*4 ifelse(UNROLL_BYTES,256,+128))) - movq disp(%esi), %mm0 - movq %mm0, disp(%edi) -') - - leal -UNROLL_BYTES(%esi), %esi - subl $UNROLL_COUNT, %ecx - - leal -UNROLL_BYTES(%edi), %edi - jns L(top) - - - C now %ecx is -UNROLL_COUNT to -1 representing repectively 0 to - C UNROLL_COUNT-1 limbs remaining - - testb $eval(UNROLL_COUNT/2), %cl - - leal UNROLL_COUNT(%ecx), %ecx - jz L(not_half) - - - C at an unroll count of 32 this block of code is 16 cycles faster than - C the rep movs, less 3 or 4 to test whether to do it - -forloop(`i', 0, UNROLL_COUNT/CHUNK_COUNT/2-1, ` - deflit(`disp', eval(-4-i*CHUNK_COUNT*4 ifelse(UNROLL_BYTES,256,+128))) - movq disp(%esi), %mm0 - movq %mm0, disp(%edi) -') - - subl $eval(UNROLL_BYTES/2), %esi - subl $eval(UNROLL_BYTES/2), %edi - - subl $eval(UNROLL_COUNT/2), %ecx -L(not_half): - - -ifelse(UNROLL_BYTES,256,` - addl $128, %esi - addl $128, %edi -') - - rep - movsl - - cld - - movl %eax, %esi - movl %edx, %edi - - femms - ret - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/k6/k62mmx/copyi.asm b/rts/gmp/mpn/x86/k6/k62mmx/copyi.asm deleted file mode 100644 index 215d805..0000000 --- a/rts/gmp/mpn/x86/k6/k62mmx/copyi.asm +++ /dev/null @@ -1,196 +0,0 @@ -dnl AMD K6-2 mpn_copyi -- copy limb vector, incrementing. -dnl -dnl K6-2: 0.56 or 1.0 cycles/limb (at 32 limbs/loop), depending on data -dnl alignment. - - -dnl Copyright (C) 1999, 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -dnl K6-2 aligned: -dnl UNROLL_COUNT cycles/limb -dnl 8 0.75 -dnl 16 0.625 -dnl 32 0.5625 -dnl 64 0.53 -dnl Maximum possible with the current code is 64, the minimum is 2. - -deflit(UNROLL_COUNT, 32) - - -C void mpn_copyi (mp_ptr dst, mp_srcptr src, mp_size_t size); -C -C The MMX loop is faster than a rep movs when src and dst are both 0mod8. -C With one 0mod8 and one 4mod8 it's 1.056 c/l and the rep movs at 1.0 c/l is -C used instead. -C -C mod8 -C src dst -C 0 0 both aligned, use mmx -C 0 4 unaligned, use rep movs -C 4 0 unaligned, use rep movs -C 4 4 do one movs, then both aligned, use mmx -C -C The MMX code on aligned data is 0.5 c/l, plus loop overhead of 2 -C cycles/loop, which is 0.0625 c/l at 32 limbs/loop. -C -C A pattern of two movq loads and two movq stores (or four and four) was -C tried, but found to be the same speed as just one of each. -C -C Note that this code only suits K6-2 and K6-3. Plain K6 does only one mmx -C instruction per cycle, so "movq"s are no faster than the simple 1 c/l rep -C movs. -C -C Enhancement: -C -C Addressing modes like disp(%esi,%ecx,4) aren't currently used. They'd -C make it possible to avoid incrementing %esi and %edi in the loop and hence -C get loop overhead down to 1 cycle. Care would be needed to avoid bad -C cache line crossings since the "movq"s would then be 5 code bytes rather -C than 4. - - -defframe(PARAM_SIZE,12) -defframe(PARAM_SRC, 8) -defframe(PARAM_DST, 4) -deflit(`FRAME',0) - - .text - ALIGN(32) - -PROLOGUE(mpn_copyi) - movl PARAM_SIZE, %ecx - movl %esi, %eax - - movl PARAM_SRC, %esi - movl %edi, %edx - - cld - - movl PARAM_DST, %edi - cmpl $UNROLL_COUNT, %ecx - - ja L(unroll) - -L(simple): - rep - movsl - - movl %eax, %esi - movl %edx, %edi - - ret - - -L(unroll): - C if src and dst are different alignments mod8, then use rep movs - C if src and dst are both 4mod8 then process one limb to get 0mod8 - - pushl %ebx - leal (%esi,%edi), %ebx - - testb $4, %bl - popl %ebx - - jnz L(simple) - testl $4, %esi - - leal -UNROLL_COUNT(%ecx), %ecx - jz L(already_aligned) - - decl %ecx - - movsl -L(already_aligned): - - -ifelse(UNROLL_BYTES,256,` - addl $128, %esi - addl $128, %edi -') - - C this is offset 0x34, no alignment needed -L(top): - C eax saved esi - C ebx - C ecx counter, limbs - C edx saved edi - C esi src, incrementing - C edi dst, incrementing - C ebp - C - C Zdisp gets 0(%esi) left that way to avoid vector decode, and with - C 0(%edi) keeps code aligned to 16 byte boundaries. - -deflit(CHUNK_COUNT, 2) -forloop(`i', 0, UNROLL_COUNT/CHUNK_COUNT-1, ` - deflit(`disp', eval(i*CHUNK_COUNT*4 ifelse(UNROLL_BYTES,256,-128))) -Zdisp( movq, disp,(%esi), %mm0) -Zdisp( movq, %mm0, disp,(%edi)) -') - - addl $UNROLL_BYTES, %esi - subl $UNROLL_COUNT, %ecx - - leal UNROLL_BYTES(%edi), %edi - jns L(top) - - - C now %ecx is -UNROLL_COUNT to -1 representing repectively 0 to - C UNROLL_COUNT-1 limbs remaining - - testb $eval(UNROLL_COUNT/2), %cl - - leal UNROLL_COUNT(%ecx), %ecx - jz L(not_half) - - C at an unroll count of 32 this block of code is 16 cycles faster than - C the rep movs, less 3 or 4 to test whether to do it - -forloop(`i', 0, UNROLL_COUNT/CHUNK_COUNT/2-1, ` - deflit(`disp', eval(i*CHUNK_COUNT*4 ifelse(UNROLL_BYTES,256,-128))) - movq disp(%esi), %mm0 - movq %mm0, disp(%edi) -') - addl $eval(UNROLL_BYTES/2), %esi - addl $eval(UNROLL_BYTES/2), %edi - - subl $eval(UNROLL_COUNT/2), %ecx -L(not_half): - - -ifelse(UNROLL_BYTES,256,` - subl $128, %esi - subl $128, %edi -') - - rep - movsl - - movl %eax, %esi - movl %edx, %edi - - femms - ret - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/k6/k62mmx/lshift.asm b/rts/gmp/mpn/x86/k6/k62mmx/lshift.asm deleted file mode 100644 index f6d54f9..0000000 --- a/rts/gmp/mpn/x86/k6/k62mmx/lshift.asm +++ /dev/null @@ -1,286 +0,0 @@ -dnl AMD K6-2 mpn_lshift -- mpn left shift. -dnl -dnl K6-2: 1.75 cycles/limb - - -dnl Copyright (C) 1999, 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -C mp_limb_t mpn_lshift (mp_ptr dst, mp_srcptr src, mp_size_t size, -C unsigned shift); -C - -defframe(PARAM_SHIFT,16) -defframe(PARAM_SIZE, 12) -defframe(PARAM_SRC, 8) -defframe(PARAM_DST, 4) -deflit(`FRAME',0) - -dnl used after src has been fetched -define(VAR_RETVAL,`PARAM_SRC') - -dnl minimum 9, because unrolled loop can't handle less -deflit(UNROLL_THRESHOLD, 9) - - .text - ALIGN(32) - -PROLOGUE(mpn_lshift) -deflit(`FRAME',0) - - C The 1 limb case can be done without the push %ebx, but it's then - C still the same speed. The push is left as a free helping hand for - C the two_or_more code. - - movl PARAM_SIZE, %eax - pushl %ebx FRAME_pushl() - - movl PARAM_SRC, %ebx - decl %eax - - movl PARAM_SHIFT, %ecx - jnz L(two_or_more) - - movl (%ebx), %edx C src limb - movl PARAM_DST, %ebx - - shldl( %cl, %edx, %eax) C return value - - shll %cl, %edx - - movl %edx, (%ebx) C dst limb - popl %ebx - - ret - - -C ----------------------------------------------------------------------------- - ALIGN(16) C avoid offset 0x1f -L(two_or_more): - C eax size-1 - C ebx src - C ecx shift - C edx - - movl (%ebx,%eax,4), %edx C src high limb - negl %ecx - - movd PARAM_SHIFT, %mm6 - addl $32, %ecx C 32-shift - - shrl %cl, %edx - cmpl $UNROLL_THRESHOLD-1, %eax - - movl %edx, VAR_RETVAL - jae L(unroll) - - - movd %ecx, %mm7 - movl %eax, %ecx - - movl PARAM_DST, %eax - -L(simple): - C eax dst - C ebx src - C ecx counter, size-1 to 1 - C edx retval - C - C mm0 scratch - C mm6 shift - C mm7 32-shift - - movq -4(%ebx,%ecx,4), %mm0 - - psrlq %mm7, %mm0 - -Zdisp( movd, %mm0, 0,(%eax,%ecx,4)) - loop L(simple) - - - movd (%ebx), %mm0 - popl %ebx - - psllq %mm6, %mm0 - - movd %mm0, (%eax) - movl %edx, %eax - - femms - ret - - -C ----------------------------------------------------------------------------- - ALIGN(16) -L(unroll): - C eax size-1 - C ebx src - C ecx 32-shift - C edx retval (but instead VAR_RETVAL is used) - C - C mm6 shift - - addl $32, %ecx - movl PARAM_DST, %edx - - movd %ecx, %mm7 - subl $7, %eax C size-8 - - leal (%edx,%eax,4), %ecx C alignment of dst - - movq 32-8(%ebx,%eax,4), %mm2 C src high qword - testb $4, %cl - - jz L(dst_aligned) - psllq %mm6, %mm2 - - psrlq $32, %mm2 - decl %eax - - movd %mm2, 32(%edx,%eax,4) C dst high limb - movq 32-8(%ebx,%eax,4), %mm2 C new src high qword -L(dst_aligned): - - movq 32-16(%ebx,%eax,4), %mm0 C src second highest qword - - - C This loop is the important bit, the rest is just support for it. - C Four src limbs are held at the start, and four more will be read. - C Four dst limbs will be written. This schedule seems necessary for - C full speed. - C - C The use of size-8 lets the loop stop when %eax goes negative and - C leaves -4 to -1 which can be tested with test $1 and $2. - -L(top): - C eax counter, size-8 step by -4 until <0 - C ebx src - C ecx - C edx dst - C - C mm0 src next qword - C mm1 scratch - C mm2 src prev qword - C mm6 shift - C mm7 64-shift - - psllq %mm6, %mm2 - subl $4, %eax - - movq %mm0, %mm1 - psrlq %mm7, %mm0 - - por %mm0, %mm2 - movq 24(%ebx,%eax,4), %mm0 - - psllq %mm6, %mm1 - movq %mm2, 40(%edx,%eax,4) - - movq %mm0, %mm2 - psrlq %mm7, %mm0 - - por %mm0, %mm1 - movq 16(%ebx,%eax,4), %mm0 - - movq %mm1, 32(%edx,%eax,4) - jnc L(top) - - - C Now have four limbs in mm2 (prev) and mm0 (next), plus eax mod 4. - C - C 8(%ebx) is the next source, and 24(%edx) is the next destination. - C %eax is between -4 and -1, representing respectively 0 to 3 extra - C limbs that must be read. - - - testl $2, %eax C testl to avoid bad cache line crossing - jz L(finish_nottwo) - - C Two more limbs: lshift mm2, OR it with rshifted mm0, mm0 becomes - C new mm2 and a new mm0 is loaded. - - psllq %mm6, %mm2 - movq %mm0, %mm1 - - psrlq %mm7, %mm0 - subl $2, %eax - - por %mm0, %mm2 - movq 16(%ebx,%eax,4), %mm0 - - movq %mm2, 32(%edx,%eax,4) - movq %mm1, %mm2 -L(finish_nottwo): - - - C lshift mm2, OR with rshifted mm0, mm1 becomes lshifted mm0 - - testb $1, %al - psllq %mm6, %mm2 - - movq %mm0, %mm1 - psrlq %mm7, %mm0 - - por %mm0, %mm2 - psllq %mm6, %mm1 - - movq %mm2, 24(%edx,%eax,4) - jz L(finish_even) - - - C Size is odd, so mm1 and one extra limb to process. - - movd (%ebx), %mm0 C src[0] - popl %ebx -deflit(`FRAME',0) - - movq %mm0, %mm2 - psllq $32, %mm0 - - psrlq %mm7, %mm0 - - psllq %mm6, %mm2 - por %mm0, %mm1 - - movq %mm1, 4(%edx) C dst[1,2] - movd %mm2, (%edx) C dst[0] - - movl VAR_RETVAL, %eax - - femms - ret - - - nop C avoid bad cache line crossing -L(finish_even): -deflit(`FRAME',4) - C Size is even, so only mm1 left to process. - - movq %mm1, (%edx) C dst[0,1] - movl VAR_RETVAL, %eax - - popl %ebx - femms - ret - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/k6/k62mmx/rshift.asm b/rts/gmp/mpn/x86/k6/k62mmx/rshift.asm deleted file mode 100644 index 8a8c144..0000000 --- a/rts/gmp/mpn/x86/k6/k62mmx/rshift.asm +++ /dev/null @@ -1,285 +0,0 @@ -dnl AMD K6-2 mpn_rshift -- mpn right shift. -dnl -dnl K6-2: 1.75 cycles/limb - - -dnl Copyright (C) 1999, 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -C mp_limb_t mpn_rshift (mp_ptr dst, mp_srcptr src, mp_size_t size, -C unsigned shift); -C - -defframe(PARAM_SHIFT,16) -defframe(PARAM_SIZE, 12) -defframe(PARAM_SRC, 8) -defframe(PARAM_DST, 4) -deflit(`FRAME',0) - -dnl Minimum 9, because the unrolled loop can't handle less. -dnl -deflit(UNROLL_THRESHOLD, 9) - - .text - ALIGN(32) - -PROLOGUE(mpn_rshift) -deflit(`FRAME',0) - - C The 1 limb case can be done without the push %ebx, but it's then - C still the same speed. The push is left as a free helping hand for - C the two_or_more code. - - movl PARAM_SIZE, %eax - pushl %ebx FRAME_pushl() - - movl PARAM_SRC, %ebx - decl %eax - - movl PARAM_SHIFT, %ecx - jnz L(two_or_more) - - movl (%ebx), %edx C src limb - movl PARAM_DST, %ebx - - shrdl( %cl, %edx, %eax) C return value - - shrl %cl, %edx - - movl %edx, (%ebx) C dst limb - popl %ebx - - ret - - -C ----------------------------------------------------------------------------- - ALIGN(16) C avoid offset 0x1f -L(two_or_more): - C eax size-1 - C ebx src - C ecx shift - C edx - - movl (%ebx), %edx C src low limb - negl %ecx - - addl $32, %ecx - movd PARAM_SHIFT, %mm6 - - shll %cl, %edx - cmpl $UNROLL_THRESHOLD-1, %eax - - jae L(unroll) - - - C eax size-1 - C ebx src - C ecx 32-shift - C edx retval - C - C mm6 shift - - movl PARAM_DST, %ecx - leal (%ebx,%eax,4), %ebx - - leal -4(%ecx,%eax,4), %ecx - negl %eax - - C This loop runs at about 3 cycles/limb, which is the amount of - C decoding, and this is despite every second access being unaligned. - -L(simple): - C eax counter, -(size-1) to -1 - C ebx &src[size-1] - C ecx &dst[size-1] - C edx retval - C - C mm0 scratch - C mm6 shift - -Zdisp( movq, 0,(%ebx,%eax,4), %mm0) - incl %eax - - psrlq %mm6, %mm0 - -Zdisp( movd, %mm0, 0,(%ecx,%eax,4)) - jnz L(simple) - - - movq %mm0, (%ecx) - movl %edx, %eax - - popl %ebx - - femms - ret - - -C ----------------------------------------------------------------------------- - ALIGN(16) -L(unroll): - C eax size-1 - C ebx src - C ecx 32-shift - C edx retval - C - C mm6 shift - - addl $32, %ecx - subl $7, %eax C size-8 - - movd %ecx, %mm7 - movl PARAM_DST, %ecx - - movq (%ebx), %mm2 C src low qword - leal (%ebx,%eax,4), %ebx C src end - 32 - - testb $4, %cl - leal (%ecx,%eax,4), %ecx C dst end - 32 - - notl %eax C -(size-7) - jz L(dst_aligned) - - psrlq %mm6, %mm2 - incl %eax - -Zdisp( movd, %mm2, 0,(%ecx,%eax,4)) C dst low limb - movq 4(%ebx,%eax,4), %mm2 C new src low qword -L(dst_aligned): - - movq 12(%ebx,%eax,4), %mm0 C src second lowest qword - nop C avoid bad cache line crossing - - - C This loop is the important bit, the rest is just support for it. - C Four src limbs are held at the start, and four more will be read. - C Four dst limbs will be written. This schedule seems necessary for - C full speed. - C - C The use of -(size-7) lets the loop stop when %eax becomes >= 0 and - C and leaves 0 to 3 which can be tested with test $1 and $2. - -L(top): - C eax counter, -(size-7) step by +4 until >=0 - C ebx src end - 32 - C ecx dst end - 32 - C edx retval - C - C mm0 src next qword - C mm1 scratch - C mm2 src prev qword - C mm6 shift - C mm7 64-shift - - psrlq %mm6, %mm2 - addl $4, %eax - - movq %mm0, %mm1 - psllq %mm7, %mm0 - - por %mm0, %mm2 - movq 4(%ebx,%eax,4), %mm0 - - psrlq %mm6, %mm1 - movq %mm2, -12(%ecx,%eax,4) - - movq %mm0, %mm2 - psllq %mm7, %mm0 - - por %mm0, %mm1 - movq 12(%ebx,%eax,4), %mm0 - - movq %mm1, -4(%ecx,%eax,4) - ja L(top) C jump if no carry and not zero - - - - C Now have the four limbs in mm2 (low) and mm0 (high), and %eax is 0 - C to 3 representing respectively 3 to 0 further limbs. - - testl $2, %eax C testl to avoid bad cache line crossings - jnz L(finish_nottwo) - - C Two or three extra limbs: rshift mm2, OR it with lshifted mm0, mm0 - C becomes new mm2 and a new mm0 is loaded. - - psrlq %mm6, %mm2 - movq %mm0, %mm1 - - psllq %mm7, %mm0 - addl $2, %eax - - por %mm0, %mm2 - movq 12(%ebx,%eax,4), %mm0 - - movq %mm2, -4(%ecx,%eax,4) - movq %mm1, %mm2 -L(finish_nottwo): - - - testb $1, %al - psrlq %mm6, %mm2 - - movq %mm0, %mm1 - psllq %mm7, %mm0 - - por %mm0, %mm2 - psrlq %mm6, %mm1 - - movq %mm2, 4(%ecx,%eax,4) - jnz L(finish_even) - - - C one further extra limb to process - - movd 32-4(%ebx), %mm0 C src[size-1], most significant limb - popl %ebx - - movq %mm0, %mm2 - psllq %mm7, %mm0 - - por %mm0, %mm1 - psrlq %mm6, %mm2 - - movq %mm1, 32-12(%ecx) C dst[size-3,size-2] - movd %mm2, 32-4(%ecx) C dst[size-1] - - movl %edx, %eax C retval - - femms - ret - - - nop C avoid bad cache line crossing -L(finish_even): - C no further extra limbs - - movq %mm1, 32-8(%ecx) C dst[size-2,size-1] - movl %edx, %eax C retval - - popl %ebx - - femms - ret - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/k6/mmx/com_n.asm b/rts/gmp/mpn/x86/k6/mmx/com_n.asm deleted file mode 100644 index 8915080..0000000 --- a/rts/gmp/mpn/x86/k6/mmx/com_n.asm +++ /dev/null @@ -1,91 +0,0 @@ -dnl AMD K6-2 mpn_com_n -- mpn bitwise one's complement. -dnl -dnl alignment dst/src, A=0mod8 N=4mod8 -dnl A/A A/N N/A N/N -dnl K6-2 1.0 1.18 1.18 1.18 cycles/limb -dnl K6 1.5 1.85 1.75 1.85 - - -dnl Copyright (C) 1999, 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -C void mpn_com_n (mp_ptr dst, mp_srcptr src, mp_size_t size); -C -C Take the bitwise ones-complement of src,size and write it to dst,size. - -defframe(PARAM_SIZE,12) -defframe(PARAM_SRC, 8) -defframe(PARAM_DST, 4) - - .text - ALIGN(32) -PROLOGUE(mpn_com_n) -deflit(`FRAME',0) - - movl PARAM_SIZE, %ecx - movl PARAM_SRC, %eax - movl PARAM_DST, %edx - shrl %ecx - jnz L(two_or_more) - - movl (%eax), %eax - notl %eax - movl %eax, (%edx) - ret - - -L(two_or_more): - pushl %ebx -FRAME_pushl() - movl %ecx, %ebx - - pcmpeqd %mm7, %mm7 C all ones - - - ALIGN(16) -L(top): - C eax src - C ebx floor(size/2) - C ecx counter - C edx dst - C esi - C edi - C ebp - - movq -8(%eax,%ecx,8), %mm0 - pxor %mm7, %mm0 - movq %mm0, -8(%edx,%ecx,8) - loop L(top) - - - jnc L(no_extra) - movl (%eax,%ebx,8), %eax - notl %eax - movl %eax, (%edx,%ebx,8) -L(no_extra): - - popl %ebx - emms_or_femms - ret - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/k6/mmx/logops_n.asm b/rts/gmp/mpn/x86/k6/mmx/logops_n.asm deleted file mode 100644 index 46cb3b7..0000000 --- a/rts/gmp/mpn/x86/k6/mmx/logops_n.asm +++ /dev/null @@ -1,212 +0,0 @@ -dnl AMD K6-2 mpn_and_n, mpn_andn_n, mpn_nand_n, mpn_ior_n, mpn_iorn_n, -dnl mpn_nior_n, mpn_xor_n, mpn_xnor_n -- mpn bitwise logical operations. -dnl -dnl alignment dst/src1/src2, A=0mod8, N=4mod8 -dnl A/A/A A/A/N A/N/A A/N/N N/A/A N/A/N N/N/A N/N/N -dnl -dnl K6-2 1.2 1.5 1.5 1.2 1.2 1.5 1.5 1.2 and,andn,ior,xor -dnl K6-2 1.5 1.75 2.0 1.75 1.75 2.0 1.75 1.5 iorn,xnor -dnl K6-2 1.75 2.0 2.0 2.0 2.0 2.0 2.0 1.75 nand,nior -dnl -dnl K6 1.5 1.68 1.75 1.2 1.75 1.75 1.68 1.5 and,andn,ior,xor -dnl K6 2.0 2.0 2.25 2.25 2.25 2.25 2.0 2.0 iorn,xnor -dnl K6 2.0 2.25 2.25 2.25 2.25 2.25 2.25 2.0 nand,nior - - -dnl Copyright (C) 1999, 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -dnl M4_p and M4_i are the MMX and integer instructions -dnl M4_*_neg_dst means whether to negate the final result before writing -dnl M4_*_neg_src2 means whether to negate the src2 values before using them - -define(M4_choose_op, -m4_assert_numargs(7) -`ifdef(`OPERATION_$1',` -define(`M4_function', `mpn_$1') -define(`M4_operation', `$1') -define(`M4_p', `$2') -define(`M4_p_neg_dst', `$3') -define(`M4_p_neg_src2',`$4') -define(`M4_i', `$5') -define(`M4_i_neg_dst', `$6') -define(`M4_i_neg_src2',`$7') -')') - -dnl xnor is done in "iorn" style because it's a touch faster than "nior" -dnl style (the two are equivalent for xor). - -M4_choose_op( and_n, pand,0,0, andl,0,0) -M4_choose_op( andn_n, pandn,0,0, andl,0,1) -M4_choose_op( nand_n, pand,1,0, andl,1,0) -M4_choose_op( ior_n, por,0,0, orl,0,0) -M4_choose_op( iorn_n, por,0,1, orl,0,1) -M4_choose_op( nior_n, por,1,0, orl,1,0) -M4_choose_op( xor_n, pxor,0,0, xorl,0,0) -M4_choose_op( xnor_n, pxor,0,1, xorl,0,1) - -ifdef(`M4_function',, -`m4_error(`Unrecognised or undefined OPERATION symbol -')') - -MULFUNC_PROLOGUE(mpn_and_n mpn_andn_n mpn_nand_n mpn_ior_n mpn_iorn_n mpn_nior_n mpn_xor_n mpn_xnor_n) - - -C void M4_function (mp_ptr dst, mp_srcptr src1, mp_srcptr src2, -C mp_size_t size); -C -C Do src1,size M4_operation src2,size, storing the result in dst,size. -C -C Unaligned movq loads and stores are a bit slower than aligned ones. The -C test at the start of the routine checks the alignment of src1 and if -C necessary processes one limb separately at the low end to make it aligned. -C -C The raw speeds without this alignment switch are as follows. -C -C alignment dst/src1/src2, A=0mod8, N=4mod8 -C A/A/A A/A/N A/N/A A/N/N N/A/A N/A/N N/N/A N/N/N -C -C K6 1.5 2.0 1.5 2.0 and,andn,ior,xor -C K6 1.75 2.2 2.0 2.28 iorn,xnor -C K6 2.0 2.25 2.35 2.28 nand,nior -C -C -C Future: -C -C K6 can do one 64-bit load per cycle so each of these routines should be -C able to approach 1.0 c/l, if aligned. The basic and/andn/ior/xor might be -C able to get 1.0 with just a 4 limb loop, being 3 instructions per 2 limbs. -C The others are 4 instructions per 2 limbs, and so can only approach 1.0 -C because there's nowhere to hide some loop control. - -defframe(PARAM_SIZE,16) -defframe(PARAM_SRC2,12) -defframe(PARAM_SRC1,8) -defframe(PARAM_DST, 4) -deflit(`FRAME',0) - - .text - ALIGN(32) -PROLOGUE(M4_function) - movl PARAM_SIZE, %ecx - pushl %ebx - FRAME_pushl() - movl PARAM_SRC1, %eax - movl PARAM_SRC2, %ebx - cmpl $1, %ecx - movl PARAM_DST, %edx - ja L(two_or_more) - - - movl (%ebx), %ecx - popl %ebx -ifelse(M4_i_neg_src2,1,`notl %ecx') - M4_i (%eax), %ecx -ifelse(M4_i_neg_dst,1,` notl %ecx') - movl %ecx, (%edx) - - ret - - -L(two_or_more): - C eax src1 - C ebx src2 - C ecx size - C edx dst - C esi - C edi - C ebp - C - C carry bit is low of size - - pushl %esi - FRAME_pushl() - testl $4, %eax - jz L(alignment_ok) - - movl (%ebx), %esi - addl $4, %ebx -ifelse(M4_i_neg_src2,1,`notl %esi') - M4_i (%eax), %esi - addl $4, %eax -ifelse(M4_i_neg_dst,1,` notl %esi') - movl %esi, (%edx) - addl $4, %edx - decl %ecx - -L(alignment_ok): - movl %ecx, %esi - shrl %ecx - jnz L(still_two_or_more) - - movl (%ebx), %ecx - popl %esi -ifelse(M4_i_neg_src2,1,`notl %ecx') - M4_i (%eax), %ecx -ifelse(M4_i_neg_dst,1,` notl %ecx') - popl %ebx - movl %ecx, (%edx) - ret - - -L(still_two_or_more): -ifelse(eval(M4_p_neg_src2 || M4_p_neg_dst),1,` - pcmpeqd %mm7, %mm7 C all ones -') - - ALIGN(16) -L(top): - C eax src1 - C ebx src2 - C ecx counter - C edx dst - C esi - C edi - C ebp - C - C carry bit is low of size - - movq -8(%ebx,%ecx,8), %mm0 -ifelse(M4_p_neg_src2,1,`pxor %mm7, %mm0') - M4_p -8(%eax,%ecx,8), %mm0 -ifelse(M4_p_neg_dst,1,` pxor %mm7, %mm0') - movq %mm0, -8(%edx,%ecx,8) - - loop L(top) - - - jnc L(no_extra) - - movl -4(%ebx,%esi,4), %ebx -ifelse(M4_i_neg_src2,1,`notl %ebx') - M4_i -4(%eax,%esi,4), %ebx -ifelse(M4_i_neg_dst,1,` notl %ebx') - movl %ebx, -4(%edx,%esi,4) -L(no_extra): - - popl %esi - popl %ebx - emms_or_femms - ret - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/k6/mmx/lshift.asm b/rts/gmp/mpn/x86/k6/mmx/lshift.asm deleted file mode 100644 index f1dc83d..0000000 --- a/rts/gmp/mpn/x86/k6/mmx/lshift.asm +++ /dev/null @@ -1,122 +0,0 @@ -dnl AMD K6 mpn_lshift -- mpn left shift. -dnl -dnl K6: 3.0 cycles/limb - - -dnl Copyright (C) 1999, 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -C mp_limb_t mpn_lshift (mp_ptr dst, mp_srcptr src, mp_size_t size, -C unsigned shift); -C -C The loop runs at 3 cycles/limb, limited by decoding and by having 3 mmx -C instructions. This is despite every second fetch being unaligned. - - -defframe(PARAM_SHIFT,16) -defframe(PARAM_SIZE, 12) -defframe(PARAM_SRC, 8) -defframe(PARAM_DST, 4) - - .text - ALIGN(32) - -PROLOGUE(mpn_lshift) -deflit(`FRAME',0) - - C The 1 limb case can be done without the push %ebx, but it's then - C still the same speed. The push is left as a free helping hand for - C the two_or_more code. - - movl PARAM_SIZE, %eax - pushl %ebx FRAME_pushl() - - movl PARAM_SRC, %ebx - decl %eax - - movl PARAM_SHIFT, %ecx - jnz L(two_or_more) - - movl (%ebx), %edx C src limb - movl PARAM_DST, %ebx - - shldl( %cl, %edx, %eax) C return value - - shll %cl, %edx - - movl %edx, (%ebx) C dst limb - popl %ebx - - ret - - - ALIGN(16) C avoid offset 0x1f - nop C avoid bad cache line crossing -L(two_or_more): - C eax size-1 - C ebx src - C ecx shift - C edx - - movl (%ebx,%eax,4), %edx C src high limb - negl %ecx - - movd PARAM_SHIFT, %mm6 - addl $32, %ecx C 32-shift - - shrl %cl, %edx - - movd %ecx, %mm7 - movl PARAM_DST, %ecx - -L(top): - C eax counter, size-1 to 1 - C ebx src - C ecx dst - C edx retval - C - C mm0 scratch - C mm6 shift - C mm7 32-shift - - movq -4(%ebx,%eax,4), %mm0 - decl %eax - - psrlq %mm7, %mm0 - - movd %mm0, 4(%ecx,%eax,4) - jnz L(top) - - - movd (%ebx), %mm0 - popl %ebx - - psllq %mm6, %mm0 - movl %edx, %eax - - movd %mm0, (%ecx) - - emms - ret - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/k6/mmx/popham.asm b/rts/gmp/mpn/x86/k6/mmx/popham.asm deleted file mode 100644 index 2c61925..0000000 --- a/rts/gmp/mpn/x86/k6/mmx/popham.asm +++ /dev/null @@ -1,238 +0,0 @@ -dnl AMD K6-2 mpn_popcount, mpn_hamdist -- mpn bit population count and -dnl hamming distance. -dnl -dnl popcount hamdist -dnl K6-2: 9.0 11.5 cycles/limb -dnl K6: 12.5 13.0 - - -dnl Copyright (C) 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -C unsigned long mpn_popcount (mp_srcptr src, mp_size_t size); -C unsigned long mpn_hamdist (mp_srcptr src, mp_srcptr src2, mp_size_t size); -C -C The code here isn't optimal, but it's already a 2x speedup over the plain -C integer mpn/generic/popcount.c,hamdist.c. - - -ifdef(`OPERATION_popcount',, -`ifdef(`OPERATION_hamdist',, -`m4_error(`Need OPERATION_popcount or OPERATION_hamdist -')m4exit(1)')') - -define(HAM, -m4_assert_numargs(1) -`ifdef(`OPERATION_hamdist',`$1')') - -define(POP, -m4_assert_numargs(1) -`ifdef(`OPERATION_popcount',`$1')') - -HAM(` -defframe(PARAM_SIZE, 12) -defframe(PARAM_SRC2, 8) -defframe(PARAM_SRC, 4) -define(M4_function,mpn_hamdist) -') -POP(` -defframe(PARAM_SIZE, 8) -defframe(PARAM_SRC, 4) -define(M4_function,mpn_popcount) -') - -MULFUNC_PROLOGUE(mpn_popcount mpn_hamdist) - - -ifdef(`PIC',,` - dnl non-PIC - - DATA - ALIGN(8) - -define(LS, -m4_assert_numargs(1) -`LF(M4_function,`$1')') - -LS(rodata_AAAAAAAAAAAAAAAA): - .long 0xAAAAAAAA - .long 0xAAAAAAAA - -LS(rodata_3333333333333333): - .long 0x33333333 - .long 0x33333333 - -LS(rodata_0F0F0F0F0F0F0F0F): - .long 0x0F0F0F0F - .long 0x0F0F0F0F - -LS(rodata_000000FF000000FF): - .long 0x000000FF - .long 0x000000FF -') - - .text - ALIGN(32) - -POP(`ifdef(`PIC', ` - C avoid shrl crossing a 32-byte boundary - nop')') - -PROLOGUE(M4_function) -deflit(`FRAME',0) - - movl PARAM_SIZE, %ecx - orl %ecx, %ecx - jz L(zero) - -ifdef(`PIC',` - movl $0xAAAAAAAA, %eax - movl $0x33333333, %edx - - movd %eax, %mm7 - movd %edx, %mm6 - - movl $0x0F0F0F0F, %eax - movl $0x000000FF, %edx - - punpckldq %mm7, %mm7 - punpckldq %mm6, %mm6 - - movd %eax, %mm5 - movd %edx, %mm4 - - punpckldq %mm5, %mm5 - punpckldq %mm4, %mm4 -',` - - movq LS(rodata_AAAAAAAAAAAAAAAA), %mm7 - movq LS(rodata_3333333333333333), %mm6 - movq LS(rodata_0F0F0F0F0F0F0F0F), %mm5 - movq LS(rodata_000000FF000000FF), %mm4 -') - -define(REG_AAAAAAAAAAAAAAAA, %mm7) -define(REG_3333333333333333, %mm6) -define(REG_0F0F0F0F0F0F0F0F, %mm5) -define(REG_000000FF000000FF, %mm4) - - - movl PARAM_SRC, %eax -HAM(` movl PARAM_SRC2, %edx') - - pxor %mm2, %mm2 C total - - shrl %ecx - jnc L(top) - -Zdisp( movd, 0,(%eax,%ecx,8), %mm1) - -HAM(` -Zdisp( movd, 0,(%edx,%ecx,8), %mm0) - pxor %mm0, %mm1 -') - - incl %ecx - jmp L(loaded) - - - ALIGN(16) -POP(` nop C alignment to avoid crossing 32-byte boundaries') - -L(top): - C eax src - C ebx - C ecx counter, qwords, decrementing - C edx [hamdist] src2 - C - C mm0 (scratch) - C mm1 (scratch) - C mm2 total (low dword) - C mm3 - C mm4 \ - C mm5 | special constants - C mm6 | - C mm7 / - - movq -8(%eax,%ecx,8), %mm1 -HAM(` pxor -8(%edx,%ecx,8), %mm1') - -L(loaded): - movq %mm1, %mm0 - pand REG_AAAAAAAAAAAAAAAA, %mm1 - - psrlq $1, %mm1 -HAM(` nop C code alignment') - - psubd %mm1, %mm0 C bit pairs -HAM(` nop C code alignment') - - - movq %mm0, %mm1 - psrlq $2, %mm0 - - pand REG_3333333333333333, %mm0 - pand REG_3333333333333333, %mm1 - - paddd %mm1, %mm0 C nibbles - - - movq %mm0, %mm1 - psrlq $4, %mm0 - - pand REG_0F0F0F0F0F0F0F0F, %mm0 - pand REG_0F0F0F0F0F0F0F0F, %mm1 - - paddd %mm1, %mm0 C bytes - - movq %mm0, %mm1 - psrlq $8, %mm0 - - - paddb %mm1, %mm0 C words - - - movq %mm0, %mm1 - psrlq $16, %mm0 - - paddd %mm1, %mm0 C dwords - - pand REG_000000FF000000FF, %mm0 - - paddd %mm0, %mm2 C low to total - psrlq $32, %mm0 - - paddd %mm0, %mm2 C high to total - loop L(top) - - - - movd %mm2, %eax - emms_or_femms - ret - -L(zero): - movl $0, %eax - ret - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/k6/mmx/rshift.asm b/rts/gmp/mpn/x86/k6/mmx/rshift.asm deleted file mode 100644 index cc5948f..0000000 --- a/rts/gmp/mpn/x86/k6/mmx/rshift.asm +++ /dev/null @@ -1,122 +0,0 @@ -dnl AMD K6 mpn_rshift -- mpn right shift. -dnl -dnl K6: 3.0 cycles/limb - - -dnl Copyright (C) 1999, 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -C mp_limb_t mpn_rshift (mp_ptr dst, mp_srcptr src, mp_size_t size, -C unsigned shift); -C -C The loop runs at 3 cycles/limb, limited by decoding and by having 3 mmx -C instructions. This is despite every second fetch being unaligned. - - -defframe(PARAM_SHIFT,16) -defframe(PARAM_SIZE, 12) -defframe(PARAM_SRC, 8) -defframe(PARAM_DST, 4) -deflit(`FRAME',0) - - .text - ALIGN(32) - -PROLOGUE(mpn_rshift) -deflit(`FRAME',0) - - C The 1 limb case can be done without the push %ebx, but it's then - C still the same speed. The push is left as a free helping hand for - C the two_or_more code. - - movl PARAM_SIZE, %eax - pushl %ebx FRAME_pushl() - - movl PARAM_SRC, %ebx - decl %eax - - movl PARAM_SHIFT, %ecx - jnz L(two_or_more) - - movl (%ebx), %edx C src limb - movl PARAM_DST, %ebx - - shrdl( %cl, %edx, %eax) C return value - - shrl %cl, %edx - - movl %edx, (%ebx) C dst limb - popl %ebx - - ret - - - ALIGN(16) C avoid offset 0x1f -L(two_or_more): - C eax size-1 - C ebx src - C ecx shift - C edx - - movl (%ebx), %edx C src low limb - negl %ecx - - addl $32, %ecx C 32-shift - movd PARAM_SHIFT, %mm6 - - shll %cl, %edx C retval - movl PARAM_DST, %ecx - - leal (%ebx,%eax,4), %ebx - - leal -4(%ecx,%eax,4), %ecx - negl %eax - - -L(simple): - C eax counter (negative) - C ebx &src[size-1] - C ecx &dst[size-1] - C edx retval - C - C mm0 scratch - C mm6 shift - -Zdisp( movq, 0,(%ebx,%eax,4), %mm0) - incl %eax - - psrlq %mm6, %mm0 - -Zdisp( movd, %mm0, 0,(%ecx,%eax,4)) - jnz L(simple) - - - movq %mm0, (%ecx) - movl %edx, %eax - - popl %ebx - - emms - ret - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/k6/mul_1.asm b/rts/gmp/mpn/x86/k6/mul_1.asm deleted file mode 100644 index c2220fe..0000000 --- a/rts/gmp/mpn/x86/k6/mul_1.asm +++ /dev/null @@ -1,272 +0,0 @@ -dnl AMD K6 mpn_mul_1 -- mpn by limb multiply. -dnl -dnl K6: 6.25 cycles/limb. - - -dnl Copyright (C) 1999, 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -C mp_limb_t mpn_mul_1 (mp_ptr dst, mp_srcptr src, mp_size_t size, -C mp_limb_t multiplier); -C mp_limb_t mpn_mul_1c (mp_ptr dst, mp_srcptr src, mp_size_t size, -C mp_limb_t multiplier, mp_limb_t carry); -C -C Multiply src,size by mult and store the result in dst,size. -C Return the carry limb from the top of the result. -C -C mpn_mul_1c() accepts an initial carry for the calculation, it's added into -C the low limb of the result. - -defframe(PARAM_CARRY, 20) -defframe(PARAM_MULTIPLIER,16) -defframe(PARAM_SIZE, 12) -defframe(PARAM_SRC, 8) -defframe(PARAM_DST, 4) - -dnl minimum 5 because the unrolled code can't handle less -deflit(UNROLL_THRESHOLD, 5) - - .text - ALIGN(32) - -PROLOGUE(mpn_mul_1c) - pushl %esi -deflit(`FRAME',4) - movl PARAM_CARRY, %esi - jmp LF(mpn_mul_1,start_nc) -EPILOGUE() - - -PROLOGUE(mpn_mul_1) - push %esi -deflit(`FRAME',4) - xorl %esi, %esi C initial carry - -L(start_nc): - mov PARAM_SIZE, %ecx - push %ebx -FRAME_pushl() - - movl PARAM_SRC, %ebx - push %edi -FRAME_pushl() - - movl PARAM_DST, %edi - pushl %ebp -FRAME_pushl() - - cmpl $UNROLL_THRESHOLD, %ecx - movl PARAM_MULTIPLIER, %ebp - - jae L(unroll) - - - C code offset 0x22 here, close enough to aligned -L(simple): - C eax scratch - C ebx src - C ecx counter - C edx scratch - C esi carry - C edi dst - C ebp multiplier - C - C this loop 8 cycles/limb - - movl (%ebx), %eax - addl $4, %ebx - - mull %ebp - - addl %esi, %eax - movl $0, %esi - - adcl %edx, %esi - - movl %eax, (%edi) - addl $4, %edi - - loop L(simple) - - - popl %ebp - - popl %edi - popl %ebx - - movl %esi, %eax - popl %esi - - ret - - -C ----------------------------------------------------------------------------- -C The code for each limb is 6 cycles, with instruction decoding being the -C limiting factor. At 4 limbs/loop and 1 cycle/loop of overhead it's 6.25 -C cycles/limb in total. -C -C The secret ingredient to get 6.25 is to start the loop with the mul and -C have the load/store pair at the end. Rotating the load/store to the top -C is an 0.5 c/l slowdown. (Some address generation effect probably.) -C -C The whole unrolled loop fits nicely in exactly 80 bytes. - - - ALIGN(16) C already aligned to 16 here actually -L(unroll): - movl (%ebx), %eax - leal -16(%ebx,%ecx,4), %ebx - - leal -16(%edi,%ecx,4), %edi - subl $4, %ecx - - negl %ecx - - - ALIGN(16) C one byte nop for this alignment -L(top): - C eax scratch - C ebx &src[size-4] - C ecx counter - C edx scratch - C esi carry - C edi &dst[size-4] - C ebp multiplier - - mull %ebp - - addl %esi, %eax - movl $0, %esi - - adcl %edx, %esi - - movl %eax, (%edi,%ecx,4) - movl 4(%ebx,%ecx,4), %eax - - - mull %ebp - - addl %esi, %eax - movl $0, %esi - - adcl %edx, %esi - - movl %eax, 4(%edi,%ecx,4) - movl 8(%ebx,%ecx,4), %eax - - - mull %ebp - - addl %esi, %eax - movl $0, %esi - - adcl %edx, %esi - - movl %eax, 8(%edi,%ecx,4) - movl 12(%ebx,%ecx,4), %eax - - - mull %ebp - - addl %esi, %eax - movl $0, %esi - - adcl %edx, %esi - - movl %eax, 12(%edi,%ecx,4) - movl 16(%ebx,%ecx,4), %eax - - - addl $4, %ecx - js L(top) - - - - C eax next src limb - C ebx &src[size-4] - C ecx 0 to 3 representing respectively 4 to 1 further limbs - C edx - C esi carry - C edi &dst[size-4] - - testb $2, %cl - jnz L(finish_not_two) - - mull %ebp - - addl %esi, %eax - movl $0, %esi - - adcl %edx, %esi - - movl %eax, (%edi,%ecx,4) - movl 4(%ebx,%ecx,4), %eax - - - mull %ebp - - addl %esi, %eax - movl $0, %esi - - adcl %edx, %esi - - movl %eax, 4(%edi,%ecx,4) - movl 8(%ebx,%ecx,4), %eax - - addl $2, %ecx -L(finish_not_two): - - - testb $1, %cl - jnz L(finish_not_one) - - mull %ebp - - addl %esi, %eax - movl $0, %esi - - adcl %edx, %esi - - movl %eax, 8(%edi) - movl 12(%ebx), %eax -L(finish_not_one): - - - mull %ebp - - addl %esi, %eax - popl %ebp - - adcl $0, %edx - - movl %eax, 12(%edi) - popl %edi - - popl %ebx - movl %edx, %eax - - popl %esi - - ret - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/k6/mul_basecase.asm b/rts/gmp/mpn/x86/k6/mul_basecase.asm deleted file mode 100644 index 1f5a3a4..0000000 --- a/rts/gmp/mpn/x86/k6/mul_basecase.asm +++ /dev/null @@ -1,600 +0,0 @@ -dnl AMD K6 mpn_mul_basecase -- multiply two mpn numbers. -dnl -dnl K6: approx 9.0 cycles per cross product on 30x30 limbs (with 16 limbs/loop -dnl unrolling). - - -dnl Copyright (C) 1999, 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -dnl K6: UNROLL_COUNT cycles/product (approx) -dnl 8 9.75 -dnl 16 9.3 -dnl 32 9.3 -dnl Maximum possible with the current code is 32. -dnl -dnl With 16 the inner unrolled loop fits exactly in a 256 byte block, which -dnl might explain it's good performance. - -deflit(UNROLL_COUNT, 16) - - -C void mpn_mul_basecase (mp_ptr wp, -C mp_srcptr xp, mp_size_t xsize, -C mp_srcptr yp, mp_size_t ysize); -C -C Calculate xp,xsize multiplied by yp,ysize, storing the result in -C wp,xsize+ysize. -C -C This routine is essentially the same as mpn/generic/mul_basecase.c, but -C it's faster because it does most of the mpn_addmul_1() entry code only -C once. The saving is about 10-20% on typical sizes coming from the -C Karatsuba multiply code. -C -C Future: -C -C The unrolled loop could be shared by mpn_addmul_1, with some extra stack -C setups and maybe 2 or 3 wasted cycles at the end. Code saving would be -C 256 bytes. - -ifdef(`PIC',` -deflit(UNROLL_THRESHOLD, 8) -',` -deflit(UNROLL_THRESHOLD, 8) -') - -defframe(PARAM_YSIZE,20) -defframe(PARAM_YP, 16) -defframe(PARAM_XSIZE,12) -defframe(PARAM_XP, 8) -defframe(PARAM_WP, 4) - - .text - ALIGN(32) -PROLOGUE(mpn_mul_basecase) -deflit(`FRAME',0) - - movl PARAM_XSIZE, %ecx - movl PARAM_YP, %eax - - movl PARAM_XP, %edx - movl (%eax), %eax C yp low limb - - cmpl $2, %ecx - ja L(xsize_more_than_two_limbs) - je L(two_by_something) - - - C one limb by one limb - - movl (%edx), %edx C xp low limb - movl PARAM_WP, %ecx - - mull %edx - - movl %eax, (%ecx) - movl %edx, 4(%ecx) - ret - - -C ----------------------------------------------------------------------------- -L(two_by_something): - decl PARAM_YSIZE - pushl %ebx -deflit(`FRAME',4) - - movl PARAM_WP, %ebx - pushl %esi -deflit(`FRAME',8) - - movl %eax, %ecx C yp low limb - movl (%edx), %eax C xp low limb - - movl %edx, %esi C xp - jnz L(two_by_two) - - - C two limbs by one limb - - mull %ecx - - movl %eax, (%ebx) - movl 4(%esi), %eax - - movl %edx, %esi C carry - - mull %ecx - - addl %eax, %esi - movl %esi, 4(%ebx) - - adcl $0, %edx - - movl %edx, 8(%ebx) - popl %esi - - popl %ebx - ret - - - -C ----------------------------------------------------------------------------- - ALIGN(16) -L(two_by_two): - C eax xp low limb - C ebx wp - C ecx yp low limb - C edx - C esi xp - C edi - C ebp -deflit(`FRAME',8) - - mull %ecx C xp[0] * yp[0] - - push %edi -deflit(`FRAME',12) - movl %eax, (%ebx) - - movl 4(%esi), %eax - movl %edx, %edi C carry, for wp[1] - - mull %ecx C xp[1] * yp[0] - - addl %eax, %edi - movl PARAM_YP, %ecx - - adcl $0, %edx - - movl %edi, 4(%ebx) - movl 4(%ecx), %ecx C yp[1] - - movl 4(%esi), %eax C xp[1] - movl %edx, %edi C carry, for wp[2] - - mull %ecx C xp[1] * yp[1] - - addl %eax, %edi - - adcl $0, %edx - - movl (%esi), %eax C xp[0] - movl %edx, %esi C carry, for wp[3] - - mull %ecx C xp[0] * yp[1] - - addl %eax, 4(%ebx) - adcl %edx, %edi - adcl $0, %esi - - movl %edi, 8(%ebx) - popl %edi - - movl %esi, 12(%ebx) - popl %esi - - popl %ebx - ret - - -C ----------------------------------------------------------------------------- - ALIGN(16) -L(xsize_more_than_two_limbs): - -C The first limb of yp is processed with a simple mpn_mul_1 style loop -C inline. Unrolling this doesn't seem worthwhile since it's only run once -C (whereas the addmul below is run ysize-1 many times). A call to the -C actual mpn_mul_1 will be slowed down by the call and parameter pushing and -C popping, and doesn't seem likely to be worthwhile on the typical 10-20 -C limb operations the Karatsuba code calls here with. - - C eax yp[0] - C ebx - C ecx xsize - C edx xp - C esi - C edi - C ebp -deflit(`FRAME',0) - - pushl %edi defframe_pushl(SAVE_EDI) - pushl %ebp defframe_pushl(SAVE_EBP) - - movl PARAM_WP, %edi - pushl %esi defframe_pushl(SAVE_ESI) - - movl %eax, %ebp - pushl %ebx defframe_pushl(SAVE_EBX) - - leal (%edx,%ecx,4), %ebx C xp end - xorl %esi, %esi - - leal (%edi,%ecx,4), %edi C wp end of mul1 - negl %ecx - - -L(mul1): - C eax scratch - C ebx xp end - C ecx counter, negative - C edx scratch - C esi carry - C edi wp end of mul1 - C ebp multiplier - - movl (%ebx,%ecx,4), %eax - - mull %ebp - - addl %esi, %eax - movl $0, %esi - - adcl %edx, %esi - - movl %eax, (%edi,%ecx,4) - incl %ecx - - jnz L(mul1) - - - movl PARAM_YSIZE, %edx - movl %esi, (%edi) C final carry - - movl PARAM_XSIZE, %ecx - decl %edx - - jnz L(ysize_more_than_one_limb) - - popl %ebx - popl %esi - popl %ebp - popl %edi - ret - - -L(ysize_more_than_one_limb): - cmpl $UNROLL_THRESHOLD, %ecx - movl PARAM_YP, %eax - - jae L(unroll) - - -C ----------------------------------------------------------------------------- -C Simple addmul loop. -C -C Using ebx and edi pointing at the ends of their respective locations saves -C a couple of instructions in the outer loop. The inner loop is still 11 -C cycles, the same as the simple loop in aorsmul_1.asm. - - C eax yp - C ebx xp end - C ecx xsize - C edx ysize-1 - C esi - C edi wp end of mul1 - C ebp - - movl 4(%eax), %ebp C multiplier - negl %ecx - - movl %ecx, PARAM_XSIZE C -xsize - xorl %esi, %esi C initial carry - - leal 4(%eax,%edx,4), %eax C yp end - negl %edx - - movl %eax, PARAM_YP - movl %edx, PARAM_YSIZE - - jmp L(simple_outer_entry) - - - C aligning here saves a couple of cycles - ALIGN(16) -L(simple_outer_top): - C edx ysize counter, negative - - movl PARAM_YP, %eax C yp end - xorl %esi, %esi C carry - - movl PARAM_XSIZE, %ecx C -xsize - movl %edx, PARAM_YSIZE - - movl (%eax,%edx,4), %ebp C yp limb multiplier -L(simple_outer_entry): - addl $4, %edi - - -L(simple_inner): - C eax scratch - C ebx xp end - C ecx counter, negative - C edx scratch - C esi carry - C edi wp end of this addmul - C ebp multiplier - - movl (%ebx,%ecx,4), %eax - - mull %ebp - - addl %esi, %eax - movl $0, %esi - - adcl $0, %edx - addl %eax, (%edi,%ecx,4) - adcl %edx, %esi - - incl %ecx - jnz L(simple_inner) - - - movl PARAM_YSIZE, %edx - movl %esi, (%edi) - - incl %edx - jnz L(simple_outer_top) - - - popl %ebx - popl %esi - popl %ebp - popl %edi - ret - - -C ----------------------------------------------------------------------------- -C Unrolled loop. -C -C The unrolled inner loop is the same as in aorsmul_1.asm, see that code for -C some comments. -C -C VAR_COUNTER is for the inner loop, running from VAR_COUNTER_INIT down to -C 0, inclusive. -C -C VAR_JMP is the computed jump into the unrolled loop. -C -C PARAM_XP and PARAM_WP get offset appropriately for where the unrolled loop -C is entered. -C -C VAR_XP_LOW is the least significant limb of xp, which is needed at the -C start of the unrolled loop. This can't just be fetched through the xp -C pointer because of the offset applied to it. -C -C PARAM_YSIZE is the outer loop counter, going from -(ysize-1) up to -1, -C inclusive. -C -C PARAM_YP is offset appropriately so that the PARAM_YSIZE counter can be -C added to give the location of the next limb of yp, which is the multiplier -C in the unrolled loop. -C -C PARAM_WP is similarly offset so that the PARAM_YSIZE counter can be added -C to give the starting point in the destination for each unrolled loop (this -C point is one limb upwards for each limb of yp processed). -C -C Having PARAM_YSIZE count negative to zero means it's not necessary to -C store new values of PARAM_YP and PARAM_WP on each loop. Those values on -C the stack remain constant and on each loop an leal adjusts them with the -C PARAM_YSIZE counter value. - - -defframe(VAR_COUNTER, -20) -defframe(VAR_COUNTER_INIT, -24) -defframe(VAR_JMP, -28) -defframe(VAR_XP_LOW, -32) -deflit(VAR_STACK_SPACE, 16) - -dnl For some strange reason using (%esp) instead of 0(%esp) is a touch -dnl slower in this code, hence the defframe empty-if-zero feature is -dnl disabled. -dnl -dnl If VAR_COUNTER is at (%esp), the effect is worse. In this case the -dnl unrolled loop is 255 instead of 256 bytes, but quite how this affects -dnl anything isn't clear. -dnl -define(`defframe_empty_if_zero_disabled',1) - -L(unroll): - C eax yp (not used) - C ebx xp end (not used) - C ecx xsize - C edx ysize-1 - C esi - C edi wp end of mul1 (not used) - C ebp -deflit(`FRAME', 16) - - leal -2(%ecx), %ebp C one limb processed at start, - decl %ecx C and ebp is one less - - shrl $UNROLL_LOG2, %ebp - negl %ecx - - subl $VAR_STACK_SPACE, %esp -deflit(`FRAME', 16+VAR_STACK_SPACE) - andl $UNROLL_MASK, %ecx - - movl %ecx, %esi - shll $4, %ecx - - movl %ebp, VAR_COUNTER_INIT - negl %esi - - C 15 code bytes per limb -ifdef(`PIC',` - call L(pic_calc) -L(unroll_here): -',` - leal L(unroll_entry) (%ecx,%esi,1), %ecx -') - - movl PARAM_XP, %ebx - movl %ebp, VAR_COUNTER - - movl PARAM_WP, %edi - movl %ecx, VAR_JMP - - movl (%ebx), %eax - leal 4(%edi,%esi,4), %edi C wp adjust for unrolling and mul1 - - leal (%ebx,%esi,4), %ebx C xp adjust for unrolling - - movl %eax, VAR_XP_LOW - - movl %ebx, PARAM_XP - movl PARAM_YP, %ebx - - leal (%edi,%edx,4), %ecx C wp adjust for ysize indexing - movl 4(%ebx), %ebp C multiplier (yp second limb) - - leal 4(%ebx,%edx,4), %ebx C yp adjust for ysize indexing - - movl %ecx, PARAM_WP - - leal 1(%esi), %ecx C adjust parity for decl %ecx above - - movl %ebx, PARAM_YP - negl %edx - - movl %edx, PARAM_YSIZE - jmp L(unroll_outer_entry) - - -ifdef(`PIC',` -L(pic_calc): - C See README.family about old gas bugs - leal (%ecx,%esi,1), %ecx - addl $L(unroll_entry)-L(unroll_here), %ecx - addl (%esp), %ecx - ret -') - - -C ----------------------------------------------------------------------------- - C Aligning here saves a couple of cycles per loop. Using 32 doesn't - C cost any extra space, since the inner unrolled loop below is - C aligned to 32. - ALIGN(32) -L(unroll_outer_top): - C edx ysize - - movl PARAM_YP, %eax - movl %edx, PARAM_YSIZE C incremented ysize counter - - movl PARAM_WP, %edi - - movl VAR_COUNTER_INIT, %ebx - movl (%eax,%edx,4), %ebp C next multiplier - - movl PARAM_XSIZE, %ecx - leal (%edi,%edx,4), %edi C adjust wp for where we are in yp - - movl VAR_XP_LOW, %eax - movl %ebx, VAR_COUNTER - -L(unroll_outer_entry): - mull %ebp - - C using testb is a tiny bit faster than testl - testb $1, %cl - - movl %eax, %ecx C low carry - movl VAR_JMP, %eax - - movl %edx, %esi C high carry - movl PARAM_XP, %ebx - - jnz L(unroll_noswap) - movl %ecx, %esi C high,low carry other way around - - movl %edx, %ecx -L(unroll_noswap): - - jmp *%eax - - - -C ----------------------------------------------------------------------------- - ALIGN(32) -L(unroll_top): - C eax scratch - C ebx xp - C ecx carry low - C edx scratch - C esi carry high - C edi wp - C ebp multiplier - C VAR_COUNTER loop counter - C - C 15 code bytes each limb - - leal UNROLL_BYTES(%edi), %edi - -L(unroll_entry): -deflit(CHUNK_COUNT,2) -forloop(`i', 0, UNROLL_COUNT/CHUNK_COUNT-1, ` - deflit(`disp0', eval(i*CHUNK_COUNT*4)) - deflit(`disp1', eval(disp0 + 4)) - deflit(`disp2', eval(disp1 + 4)) - - movl disp1(%ebx), %eax - mull %ebp -Zdisp( addl, %ecx, disp0,(%edi)) - adcl %eax, %esi - movl %edx, %ecx - jadcl0( %ecx) - - movl disp2(%ebx), %eax - mull %ebp - addl %esi, disp1(%edi) - adcl %eax, %ecx - movl %edx, %esi - jadcl0( %esi) -') - - decl VAR_COUNTER - leal UNROLL_BYTES(%ebx), %ebx - - jns L(unroll_top) - - - movl PARAM_YSIZE, %edx - addl %ecx, UNROLL_BYTES(%edi) - - adcl $0, %esi - - incl %edx - movl %esi, UNROLL_BYTES+4(%edi) - - jnz L(unroll_outer_top) - - - movl SAVE_ESI, %esi - movl SAVE_EBP, %ebp - movl SAVE_EDI, %edi - movl SAVE_EBX, %ebx - - addl $FRAME, %esp - ret - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/k6/sqr_basecase.asm b/rts/gmp/mpn/x86/k6/sqr_basecase.asm deleted file mode 100644 index 70d49b3..0000000 --- a/rts/gmp/mpn/x86/k6/sqr_basecase.asm +++ /dev/null @@ -1,672 +0,0 @@ -dnl AMD K6 mpn_sqr_basecase -- square an mpn number. -dnl -dnl K6: approx 4.7 cycles per cross product, or 9.2 cycles per triangular -dnl product (measured on the speed difference between 17 and 33 limbs, -dnl which is roughly the Karatsuba recursing range). - - -dnl Copyright (C) 1999, 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -dnl KARATSUBA_SQR_THRESHOLD_MAX is the maximum KARATSUBA_SQR_THRESHOLD this -dnl code supports. This value is used only by the tune program to know -dnl what it can go up to. (An attempt to compile with a bigger value will -dnl trigger some m4_assert()s in the code, making the build fail.) -dnl -dnl The value is determined by requiring the displacements in the unrolled -dnl addmul to fit in single bytes. This means a maximum UNROLL_COUNT of -dnl 63, giving a maximum KARATSUBA_SQR_THRESHOLD of 66. - -deflit(KARATSUBA_SQR_THRESHOLD_MAX, 66) - - -dnl Allow a value from the tune program to override config.m4. - -ifdef(`KARATSUBA_SQR_THRESHOLD_OVERRIDE', -`define(`KARATSUBA_SQR_THRESHOLD',KARATSUBA_SQR_THRESHOLD_OVERRIDE)') - - -dnl UNROLL_COUNT is the number of code chunks in the unrolled addmul. The -dnl number required is determined by KARATSUBA_SQR_THRESHOLD, since -dnl mpn_sqr_basecase only needs to handle sizes < KARATSUBA_SQR_THRESHOLD. -dnl -dnl The first addmul is the biggest, and this takes the second least -dnl significant limb and multiplies it by the third least significant and -dnl up. Hence for a maximum operand size of KARATSUBA_SQR_THRESHOLD-1 -dnl limbs, UNROLL_COUNT needs to be KARATSUBA_SQR_THRESHOLD-3. - -m4_config_gmp_mparam(`KARATSUBA_SQR_THRESHOLD') -deflit(UNROLL_COUNT, eval(KARATSUBA_SQR_THRESHOLD-3)) - - -C void mpn_sqr_basecase (mp_ptr dst, mp_srcptr src, mp_size_t size); -C -C The algorithm is essentially the same as mpn/generic/sqr_basecase.c, but a -C lot of function call overheads are avoided, especially when the given size -C is small. -C -C The code size might look a bit excessive, but not all of it is executed -C and so won't fill up the code cache. The 1x1, 2x2 and 3x3 special cases -C clearly apply only to those sizes; mid sizes like 10x10 only need part of -C the unrolled addmul; and big sizes like 35x35 that do need all of it will -C at least be getting value for money, because 35x35 spends something like -C 5780 cycles here. -C -C Different values of UNROLL_COUNT give slightly different speeds, between -C 9.0 and 9.2 c/tri-prod measured on the difference between 17 and 33 limbs. -C This isn't a big difference, but it's presumably some alignment effect -C which if understood could give a simple speedup. - -defframe(PARAM_SIZE,12) -defframe(PARAM_SRC, 8) -defframe(PARAM_DST, 4) - - .text - ALIGN(32) -PROLOGUE(mpn_sqr_basecase) -deflit(`FRAME',0) - - movl PARAM_SIZE, %ecx - movl PARAM_SRC, %eax - - cmpl $2, %ecx - je L(two_limbs) - - movl PARAM_DST, %edx - ja L(three_or_more) - - -C ----------------------------------------------------------------------------- -C one limb only - C eax src - C ebx - C ecx size - C edx dst - - movl (%eax), %eax - movl %edx, %ecx - - mull %eax - - movl %eax, (%ecx) - movl %edx, 4(%ecx) - ret - - -C ----------------------------------------------------------------------------- - ALIGN(16) -L(two_limbs): - C eax src - C ebx - C ecx size - C edx dst - - pushl %ebx - movl %eax, %ebx C src -deflit(`FRAME',4) - - movl (%ebx), %eax - movl PARAM_DST, %ecx - - mull %eax C src[0]^2 - - movl %eax, (%ecx) - movl 4(%ebx), %eax - - movl %edx, 4(%ecx) - - mull %eax C src[1]^2 - - movl %eax, 8(%ecx) - movl (%ebx), %eax - - movl %edx, 12(%ecx) - movl 4(%ebx), %edx - - mull %edx C src[0]*src[1] - - addl %eax, 4(%ecx) - - adcl %edx, 8(%ecx) - adcl $0, 12(%ecx) - - popl %ebx - addl %eax, 4(%ecx) - - adcl %edx, 8(%ecx) - adcl $0, 12(%ecx) - - ret - - -C ----------------------------------------------------------------------------- -L(three_or_more): -deflit(`FRAME',0) - cmpl $4, %ecx - jae L(four_or_more) - - -C ----------------------------------------------------------------------------- -C three limbs - C eax src - C ecx size - C edx dst - - pushl %ebx - movl %eax, %ebx C src - - movl (%ebx), %eax - movl %edx, %ecx C dst - - mull %eax C src[0] ^ 2 - - movl %eax, (%ecx) - movl 4(%ebx), %eax - - movl %edx, 4(%ecx) - pushl %esi - - mull %eax C src[1] ^ 2 - - movl %eax, 8(%ecx) - movl 8(%ebx), %eax - - movl %edx, 12(%ecx) - pushl %edi - - mull %eax C src[2] ^ 2 - - movl %eax, 16(%ecx) - movl (%ebx), %eax - - movl %edx, 20(%ecx) - movl 4(%ebx), %edx - - mull %edx C src[0] * src[1] - - movl %eax, %esi - movl (%ebx), %eax - - movl %edx, %edi - movl 8(%ebx), %edx - - pushl %ebp - xorl %ebp, %ebp - - mull %edx C src[0] * src[2] - - addl %eax, %edi - movl 4(%ebx), %eax - - adcl %edx, %ebp - - movl 8(%ebx), %edx - - mull %edx C src[1] * src[2] - - addl %eax, %ebp - - adcl $0, %edx - - - C eax will be dst[5] - C ebx - C ecx dst - C edx dst[4] - C esi dst[1] - C edi dst[2] - C ebp dst[3] - - xorl %eax, %eax - addl %esi, %esi - adcl %edi, %edi - adcl %ebp, %ebp - adcl %edx, %edx - adcl $0, %eax - - addl %esi, 4(%ecx) - adcl %edi, 8(%ecx) - adcl %ebp, 12(%ecx) - - popl %ebp - popl %edi - - adcl %edx, 16(%ecx) - - popl %esi - popl %ebx - - adcl %eax, 20(%ecx) - ASSERT(nc) - - ret - - -C ----------------------------------------------------------------------------- - -defframe(SAVE_EBX, -4) -defframe(SAVE_ESI, -8) -defframe(SAVE_EDI, -12) -defframe(SAVE_EBP, -16) -defframe(VAR_COUNTER,-20) -defframe(VAR_JMP, -24) -deflit(STACK_SPACE, 24) - - ALIGN(16) -L(four_or_more): - - C eax src - C ebx - C ecx size - C edx dst - C esi - C edi - C ebp - -C First multiply src[0]*src[1..size-1] and store at dst[1..size]. -C -C A test was done calling mpn_mul_1 here to get the benefit of its unrolled -C loop, but this was only a tiny speedup; at 35 limbs it took 24 cycles off -C a 5780 cycle operation, which is not surprising since the loop here is 8 -C c/l and mpn_mul_1 is 6.25 c/l. - - subl $STACK_SPACE, %esp deflit(`FRAME',STACK_SPACE) - - movl %edi, SAVE_EDI - leal 4(%edx), %edi - - movl %ebx, SAVE_EBX - leal 4(%eax), %ebx - - movl %esi, SAVE_ESI - xorl %esi, %esi - - movl %ebp, SAVE_EBP - - C eax - C ebx src+4 - C ecx size - C edx - C esi - C edi dst+4 - C ebp - - movl (%eax), %ebp C multiplier - leal -1(%ecx), %ecx C size-1, and pad to a 16 byte boundary - - - ALIGN(16) -L(mul_1): - C eax scratch - C ebx src ptr - C ecx counter - C edx scratch - C esi carry - C edi dst ptr - C ebp multiplier - - movl (%ebx), %eax - addl $4, %ebx - - mull %ebp - - addl %esi, %eax - movl $0, %esi - - adcl %edx, %esi - - movl %eax, (%edi) - addl $4, %edi - - loop L(mul_1) - - -C Addmul src[n]*src[n+1..size-1] at dst[2*n-1...], for each n=1..size-2. -C -C The last two addmuls, which are the bottom right corner of the product -C triangle, are left to the end. These are src[size-3]*src[size-2,size-1] -C and src[size-2]*src[size-1]. If size is 4 then it's only these corner -C cases that need to be done. -C -C The unrolled code is the same as mpn_addmul_1(), see that routine for some -C comments. -C -C VAR_COUNTER is the outer loop, running from -(size-4) to -1, inclusive. -C -C VAR_JMP is the computed jump into the unrolled code, stepped by one code -C chunk each outer loop. -C -C K6 doesn't do any branch prediction on indirect jumps, which is good -C actually because it's a different target each time. The unrolled addmul -C is about 3 cycles/limb faster than a simple loop, so the 6 cycle cost of -C the indirect jump is quickly recovered. - - -dnl This value is also implicitly encoded in a shift and add. -dnl -deflit(CODE_BYTES_PER_LIMB, 15) - -dnl With the unmodified &src[size] and &dst[size] pointers, the -dnl displacements in the unrolled code fit in a byte for UNROLL_COUNT -dnl values up to 31. Above that an offset must be added to them. -dnl -deflit(OFFSET, -ifelse(eval(UNROLL_COUNT>31),1, -eval((UNROLL_COUNT-31)*4), -0)) - - C eax - C ebx &src[size] - C ecx - C edx - C esi carry - C edi &dst[size] - C ebp - - movl PARAM_SIZE, %ecx - movl %esi, (%edi) - - subl $4, %ecx - jz L(corner) - - movl %ecx, %edx -ifelse(OFFSET,0,, -` subl $OFFSET, %ebx') - - shll $4, %ecx -ifelse(OFFSET,0,, -` subl $OFFSET, %edi') - - negl %ecx - -ifdef(`PIC',` - call L(pic_calc) -L(here): -',` - leal L(unroll_inner_end)-eval(2*CODE_BYTES_PER_LIMB)(%ecx,%edx), %ecx -') - negl %edx - - - C The calculated jump mustn't be before the start of the available - C code. This is the limitation UNROLL_COUNT puts on the src operand - C size, but checked here using the jump address directly. - C - ASSERT(ae,` - movl_text_address( L(unroll_inner_start), %eax) - cmpl %eax, %ecx - ') - - -C ----------------------------------------------------------------------------- - ALIGN(16) -L(unroll_outer_top): - C eax - C ebx &src[size], constant - C ecx VAR_JMP - C edx VAR_COUNTER, limbs, negative - C esi high limb to store - C edi dst ptr, high of last addmul - C ebp - - movl -12+OFFSET(%ebx,%edx,4), %ebp C multiplier - movl %edx, VAR_COUNTER - - movl -8+OFFSET(%ebx,%edx,4), %eax C first limb of multiplicand - - mull %ebp - - testb $1, %cl - - movl %edx, %esi C high carry - movl %ecx, %edx C jump - - movl %eax, %ecx C low carry - leal CODE_BYTES_PER_LIMB(%edx), %edx - - movl %edx, VAR_JMP - leal 4(%edi), %edi - - C A branch-free version of this using some xors was found to be a - C touch slower than just a conditional jump, despite the jump - C switching between taken and not taken on every loop. - -ifelse(eval(UNROLL_COUNT%2),0, - jz,jnz) L(unroll_noswap) - movl %esi, %eax C high,low carry other way around - - movl %ecx, %esi - movl %eax, %ecx -L(unroll_noswap): - - jmp *%edx - - - C Must be on an even address here so the low bit of the jump address - C will indicate which way around ecx/esi should start. - C - C An attempt was made at padding here to get the end of the unrolled - C code to come out on a good alignment, to save padding before - C L(corner). This worked, but turned out to run slower than just an - C ALIGN(2). The reason for this is not clear, it might be related - C to the different speeds on different UNROLL_COUNTs noted above. - - ALIGN(2) - -L(unroll_inner_start): - C eax scratch - C ebx src - C ecx carry low - C edx scratch - C esi carry high - C edi dst - C ebp multiplier - C - C 15 code bytes each limb - C ecx/esi swapped on each chunk - -forloop(`i', UNROLL_COUNT, 1, ` - deflit(`disp_src', eval(-i*4 + OFFSET)) - deflit(`disp_dst', eval(disp_src - 4)) - - m4_assert(`disp_src>=-128 && disp_src<128') - m4_assert(`disp_dst>=-128 && disp_dst<128') - -ifelse(eval(i%2),0,` -Zdisp( movl, disp_src,(%ebx), %eax) - mull %ebp -Zdisp( addl, %esi, disp_dst,(%edi)) - adcl %eax, %ecx - movl %edx, %esi - jadcl0( %esi) -',` - dnl this one comes out last -Zdisp( movl, disp_src,(%ebx), %eax) - mull %ebp -Zdisp( addl, %ecx, disp_dst,(%edi)) - adcl %eax, %esi - movl %edx, %ecx - jadcl0( %ecx) -') -') -L(unroll_inner_end): - - addl %esi, -4+OFFSET(%edi) - - movl VAR_COUNTER, %edx - jadcl0( %ecx) - - movl %ecx, m4_empty_if_zero(OFFSET)(%edi) - movl VAR_JMP, %ecx - - incl %edx - jnz L(unroll_outer_top) - - -ifelse(OFFSET,0,,` - addl $OFFSET, %ebx - addl $OFFSET, %edi -') - - -C ----------------------------------------------------------------------------- - ALIGN(16) -L(corner): - C ebx &src[size] - C edi &dst[2*size-5] - - movl -12(%ebx), %ebp - - movl -8(%ebx), %eax - movl %eax, %ecx - - mull %ebp - - addl %eax, -4(%edi) - adcl $0, %edx - - movl -4(%ebx), %eax - movl %edx, %esi - movl %eax, %ebx - - mull %ebp - - addl %esi, %eax - adcl $0, %edx - - addl %eax, (%edi) - adcl $0, %edx - - movl %edx, %esi - movl %ebx, %eax - - mull %ecx - - addl %esi, %eax - movl %eax, 4(%edi) - - adcl $0, %edx - - movl %edx, 8(%edi) - - -C ----------------------------------------------------------------------------- -C Left shift of dst[1..2*size-2], the bit shifted out becomes dst[2*size-1]. -C The loop measures about 6 cycles/iteration, though it looks like it should -C decode in 5. - -L(lshift_start): - movl PARAM_SIZE, %ecx - - movl PARAM_DST, %edi - subl $1, %ecx C size-1 and clear carry - - movl PARAM_SRC, %ebx - movl %ecx, %edx - - xorl %eax, %eax C ready for adcl - - - ALIGN(16) -L(lshift): - C eax - C ebx src (for later use) - C ecx counter, decrementing - C edx size-1 (for later use) - C esi - C edi dst, incrementing - C ebp - - rcll 4(%edi) - rcll 8(%edi) - leal 8(%edi), %edi - loop L(lshift) - - - adcl %eax, %eax - - movl %eax, 4(%edi) C dst most significant limb - movl (%ebx), %eax C src[0] - - leal 4(%ebx,%edx,4), %ebx C &src[size] - subl %edx, %ecx C -(size-1) - - -C ----------------------------------------------------------------------------- -C Now add in the squares on the diagonal, src[0]^2, src[1]^2, ..., -C src[size-1]^2. dst[0] hasn't yet been set at all yet, and just gets the -C low limb of src[0]^2. - - - mull %eax - - movl %eax, (%edi,%ecx,8) C dst[0] - - - ALIGN(16) -L(diag): - C eax scratch - C ebx &src[size] - C ecx counter, negative - C edx carry - C esi scratch - C edi dst[2*size-2] - C ebp - - movl (%ebx,%ecx,4), %eax - movl %edx, %esi - - mull %eax - - addl %esi, 4(%edi,%ecx,8) - adcl %eax, 8(%edi,%ecx,8) - adcl $0, %edx - - incl %ecx - jnz L(diag) - - - movl SAVE_EBX, %ebx - movl SAVE_ESI, %esi - - addl %edx, 4(%edi) C dst most significant limb - - movl SAVE_EDI, %edi - movl SAVE_EBP, %ebp - addl $FRAME, %esp - ret - - - -C ----------------------------------------------------------------------------- -ifdef(`PIC',` -L(pic_calc): - C See README.family about old gas bugs - addl (%esp), %ecx - addl $L(unroll_inner_end)-L(here)-eval(2*CODE_BYTES_PER_LIMB), %ecx - addl %edx, %ecx - ret -') - - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/k7/README b/rts/gmp/mpn/x86/k7/README deleted file mode 100644 index c34315c..0000000 --- a/rts/gmp/mpn/x86/k7/README +++ /dev/null @@ -1,145 +0,0 @@ - - AMD K7 MPN SUBROUTINES - - -This directory contains code optimized for the AMD Athlon CPU. - -The mmx subdirectory has routines using MMX instructions. All Athlons have -MMX, the separate directory is just so that configure can omit it if the -assembler doesn't support MMX. - - - -STATUS - -Times for the loops, with all code and data in L1 cache. - - cycles/limb - mpn_add/sub_n 1.6 - - mpn_copyi 0.75 or 1.0 \ varying with data alignment - mpn_copyd 0.75 or 1.0 / - - mpn_divrem_1 17.0 integer part, 15.0 fractional part - mpn_mod_1 17.0 - mpn_divexact_by3 8.0 - - mpn_l/rshift 1.2 - - mpn_mul_1 3.4 - mpn_addmul/submul_1 3.9 - - mpn_mul_basecase 4.42 cycles/crossproduct (approx) - - mpn_popcount 5.0 - mpn_hamdist 6.0 - -Prefetching of sources hasn't yet been tried. - - - -NOTES - -cmov, MMX, 3DNow and some extensions to MMX and 3DNow are available. - -Write-allocate L1 data cache means prefetching of destinations is unnecessary. - -Floating point multiplications can be done in parallel with integer -multiplications, but there doesn't seem to be any way to make use of this. - -Unsigned "mul"s can be issued every 3 cycles. This suggests 3 is a limit on -the speed of the multiplication routines. The documentation shows mul -executing in IEU0 (or maybe in IEU0 and IEU1 together), so it might be that, -to get near 3 cycles code has to be arranged so that nothing else is issued -to IEU0. A busy IEU0 could explain why some code takes 4 cycles and other -apparently equivalent code takes 5. - - - -OPTIMIZATIONS - -Unrolled loops are used to reduce looping overhead. The unrolling is -configurable up to 32 limbs/loop for most routines and up to 64 for some. -The K7 has 64k L1 code cache so quite big unrolling is allowable. - -Computed jumps into the unrolling are used to handle sizes not a multiple of -the unrolling. An attractive feature of this is that times increase -smoothly with operand size, but it may be that some routines should just -have simple loops to finish up, especially when PIC adds between 2 and 16 -cycles to get %eip. - -Position independent code is implemented using a call to get %eip for the -computed jumps and a ret is always done, rather than an addl $4,%esp or a -popl, so the CPU return address branch prediction stack stays synchronised -with the actual stack in memory. - -Branch prediction, in absence of any history, will guess forward jumps are -not taken and backward jumps are taken. Where possible it's arranged that -the less likely or less important case is under a taken forward jump. - - - -CODING - -Instructions in general code have been shown grouped if they can execute -together, which means up to three direct-path instructions which have no -successive dependencies. K7 always decodes three and has out-of-order -execution, but the groupings show what slots might be available and what -dependency chains exist. - -When there's vector-path instructions an effort is made to get triplets of -direct-path instructions in between them, even if there's dependencies, -since this maximizes decoding throughput and might save a cycle or two if -decoding is the limiting factor. - - - -INSTRUCTIONS - -adcl direct -divl 39 cycles back-to-back -lodsl,etc vector -loop 1 cycle vector (decl/jnz opens up one decode slot) -movd reg vector -movd mem direct -mull issue every 3 cycles, latency 4 cycles low word, 6 cycles high word -popl vector (use movl for more than one pop) -pushl direct, will pair with a load -shrdl %cl vector, 3 cycles, seems to be 3 decode too -xorl r,r false read dependency recognised - - - -REFERENCES - -"AMD Athlon Processor X86 Code Optimization Guide", AMD publication number -22007, revision E, November 1999. Available on-line, - - http://www.amd.com/products/cpg/athlon/techdocs/pdf/22007.pdf - -"3DNow Technology Manual", AMD publication number 21928F/0-August 1999. -This describes the femms and prefetch instructions. Available on-line, - - http://www.amd.com/K6/k6docs/pdf/21928.pdf - -"AMD Extensions to the 3DNow and MMX Instruction Sets Manual", AMD -publication number 22466, revision B, August 1999. This describes -instructions added in the Athlon processor, such as pswapd and the extra -prefetch forms. Available on-line, - - http://www.amd.com/products/cpg/athlon/techdocs/pdf/22466.pdf - -"3DNow Instruction Porting Guide", AMD publication number 22621, revision B, -August 1999. This has some notes on general Athlon optimizations as well as -3DNow. Available on-line, - - http://www.amd.com/products/cpg/athlon/techdocs/pdf/22621.pdf - - - - ----------------- -Local variables: -mode: text -fill-column: 76 -End: diff --git a/rts/gmp/mpn/x86/k7/aors_n.asm b/rts/gmp/mpn/x86/k7/aors_n.asm deleted file mode 100644 index 85fa9d3..0000000 --- a/rts/gmp/mpn/x86/k7/aors_n.asm +++ /dev/null @@ -1,250 +0,0 @@ -dnl AMD K7 mpn_add_n/mpn_sub_n -- mpn add or subtract. -dnl -dnl K7: 1.64 cycles/limb (at 16 limb/loop). - - -dnl Copyright (C) 1999, 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -dnl K7: UNROLL_COUNT cycles/limb -dnl 8 1.9 -dnl 16 1.64 -dnl 32 1.7 -dnl 64 2.0 -dnl Maximum possible with the current code is 64. - -deflit(UNROLL_COUNT, 16) - - -ifdef(`OPERATION_add_n', ` - define(M4_inst, adcl) - define(M4_function_n, mpn_add_n) - define(M4_function_nc, mpn_add_nc) - define(M4_description, add) -',`ifdef(`OPERATION_sub_n', ` - define(M4_inst, sbbl) - define(M4_function_n, mpn_sub_n) - define(M4_function_nc, mpn_sub_nc) - define(M4_description, subtract) -',`m4_error(`Need OPERATION_add_n or OPERATION_sub_n -')')') - -MULFUNC_PROLOGUE(mpn_add_n mpn_add_nc mpn_sub_n mpn_sub_nc) - - -C mp_limb_t M4_function_n (mp_ptr dst, mp_srcptr src1, mp_srcptr src2, -C mp_size_t size); -C mp_limb_t M4_function_nc (mp_ptr dst, mp_srcptr src1, mp_srcptr src2, -C mp_size_t size, mp_limb_t carry); -C -C Calculate src1,size M4_description src2,size, and store the result in -C dst,size. The return value is the carry bit from the top of the result (1 -C or 0). -C -C The _nc version accepts 1 or 0 for an initial carry into the low limb of -C the calculation. Note values other than 1 or 0 here will lead to garbage -C results. -C -C This code runs at 1.64 cycles/limb, which is probably the best possible -C with plain integer operations. Each limb is 2 loads and 1 store, and in -C one cycle the K7 can do two loads, or a load and a store, leading to 1.5 -C c/l. - -dnl Must have UNROLL_THRESHOLD >= 2, since the unrolled loop can't handle 1. -ifdef(`PIC',` -deflit(UNROLL_THRESHOLD, 8) -',` -deflit(UNROLL_THRESHOLD, 8) -') - -defframe(PARAM_CARRY,20) -defframe(PARAM_SIZE, 16) -defframe(PARAM_SRC2, 12) -defframe(PARAM_SRC1, 8) -defframe(PARAM_DST, 4) - -defframe(SAVE_EBP, -4) -defframe(SAVE_ESI, -8) -defframe(SAVE_EBX, -12) -defframe(SAVE_EDI, -16) -deflit(STACK_SPACE, 16) - - .text - ALIGN(32) -deflit(`FRAME',0) - -PROLOGUE(M4_function_nc) - movl PARAM_CARRY, %eax - jmp LF(M4_function_n,start) -EPILOGUE() - -PROLOGUE(M4_function_n) - - xorl %eax, %eax C carry -L(start): - movl PARAM_SIZE, %ecx - subl $STACK_SPACE, %esp -deflit(`FRAME',STACK_SPACE) - - movl %edi, SAVE_EDI - movl %ebx, SAVE_EBX - cmpl $UNROLL_THRESHOLD, %ecx - - movl PARAM_SRC2, %edx - movl PARAM_SRC1, %ebx - jae L(unroll) - - movl PARAM_DST, %edi - leal (%ebx,%ecx,4), %ebx - leal (%edx,%ecx,4), %edx - - leal (%edi,%ecx,4), %edi - negl %ecx - shrl %eax - - C This loop in in a single 16 byte code block already, so no - C alignment necessary. -L(simple): - C eax scratch - C ebx src1 - C ecx counter - C edx src2 - C esi - C edi dst - C ebp - - movl (%ebx,%ecx,4), %eax - M4_inst (%edx,%ecx,4), %eax - movl %eax, (%edi,%ecx,4) - incl %ecx - jnz L(simple) - - movl $0, %eax - movl SAVE_EDI, %edi - - movl SAVE_EBX, %ebx - setc %al - addl $STACK_SPACE, %esp - - ret - - -C ----------------------------------------------------------------------------- - C This is at 0x55, close enough to aligned. -L(unroll): -deflit(`FRAME',STACK_SPACE) - movl %ebp, SAVE_EBP - andl $-2, %ecx C size low bit masked out - andl $1, PARAM_SIZE C size low bit kept - - movl %ecx, %edi - decl %ecx - movl PARAM_DST, %ebp - - shrl $UNROLL_LOG2, %ecx - negl %edi - movl %esi, SAVE_ESI - - andl $UNROLL_MASK, %edi - -ifdef(`PIC',` - call L(pic_calc) -L(here): -',` - leal L(entry) (%edi,%edi,8), %esi C 9 bytes per -') - negl %edi - shrl %eax - - leal ifelse(UNROLL_BYTES,256,128) (%ebx,%edi,4), %ebx - leal ifelse(UNROLL_BYTES,256,128) (%edx,%edi,4), %edx - leal ifelse(UNROLL_BYTES,256,128) (%ebp,%edi,4), %edi - - jmp *%esi - - -ifdef(`PIC',` -L(pic_calc): - C See README.family about old gas bugs - leal (%edi,%edi,8), %esi - addl $L(entry)-L(here), %esi - addl (%esp), %esi - ret -') - - -C ----------------------------------------------------------------------------- - ALIGN(32) -L(top): - C eax zero - C ebx src1 - C ecx counter - C edx src2 - C esi scratch (was computed jump) - C edi dst - C ebp scratch - - leal UNROLL_BYTES(%edx), %edx - -L(entry): -deflit(CHUNK_COUNT, 2) -forloop(i, 0, UNROLL_COUNT/CHUNK_COUNT-1, ` - deflit(`disp0', eval(i*CHUNK_COUNT*4 ifelse(UNROLL_BYTES,256,-128))) - deflit(`disp1', eval(disp0 + 4)) - -Zdisp( movl, disp0,(%ebx), %esi) - movl disp1(%ebx), %ebp -Zdisp( M4_inst,disp0,(%edx), %esi) -Zdisp( movl, %esi, disp0,(%edi)) - M4_inst disp1(%edx), %ebp - movl %ebp, disp1(%edi) -') - - decl %ecx - leal UNROLL_BYTES(%ebx), %ebx - leal UNROLL_BYTES(%edi), %edi - jns L(top) - - - mov PARAM_SIZE, %esi - movl SAVE_EBP, %ebp - movl $0, %eax - - decl %esi - js L(even) - - movl (%ebx), %ecx - M4_inst UNROLL_BYTES(%edx), %ecx - movl %ecx, (%edi) -L(even): - - movl SAVE_EDI, %edi - movl SAVE_EBX, %ebx - setc %al - - movl SAVE_ESI, %esi - addl $STACK_SPACE, %esp - - ret - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/k7/aorsmul_1.asm b/rts/gmp/mpn/x86/k7/aorsmul_1.asm deleted file mode 100644 index 9f9c3da..0000000 --- a/rts/gmp/mpn/x86/k7/aorsmul_1.asm +++ /dev/null @@ -1,364 +0,0 @@ -dnl AMD K7 mpn_addmul_1/mpn_submul_1 -- add or subtract mpn multiple. -dnl -dnl K7: 3.9 cycles/limb. -dnl -dnl Future: It should be possible to avoid the separate mul after the -dnl unrolled loop by moving the movl/adcl to the top. - - -dnl Copyright (C) 1999, 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -dnl K7: UNROLL_COUNT cycles/limb -dnl 4 4.42 -dnl 8 4.16 -dnl 16 3.9 -dnl 32 3.9 -dnl 64 3.87 -dnl Maximum possible with the current code is 64. - -deflit(UNROLL_COUNT, 16) - - -ifdef(`OPERATION_addmul_1',` - define(M4_inst, addl) - define(M4_function_1, mpn_addmul_1) - define(M4_function_1c, mpn_addmul_1c) - define(M4_description, add it to) - define(M4_desc_retval, carry) -',`ifdef(`OPERATION_submul_1',` - define(M4_inst, subl) - define(M4_function_1, mpn_submul_1) - define(M4_function_1c, mpn_submul_1c) - define(M4_description, subtract it from) - define(M4_desc_retval, borrow) -',`m4_error(`Need OPERATION_addmul_1 or OPERATION_submul_1 -')')') - -MULFUNC_PROLOGUE(mpn_addmul_1 mpn_addmul_1c mpn_submul_1 mpn_submul_1c) - - -C mp_limb_t M4_function_1 (mp_ptr dst, mp_srcptr src, mp_size_t size, -C mp_limb_t mult); -C mp_limb_t M4_function_1c (mp_ptr dst, mp_srcptr src, mp_size_t size, -C mp_limb_t mult, mp_limb_t carry); -C -C Calculate src,size multiplied by mult and M4_description dst,size. -C Return the M4_desc_retval limb from the top of the result. - -ifdef(`PIC',` -deflit(UNROLL_THRESHOLD, 9) -',` -deflit(UNROLL_THRESHOLD, 6) -') - -defframe(PARAM_CARRY, 20) -defframe(PARAM_MULTIPLIER,16) -defframe(PARAM_SIZE, 12) -defframe(PARAM_SRC, 8) -defframe(PARAM_DST, 4) -deflit(`FRAME',0) - -defframe(SAVE_EBX, -4) -defframe(SAVE_ESI, -8) -defframe(SAVE_EDI, -12) -defframe(SAVE_EBP, -16) -deflit(SAVE_SIZE, 16) - - .text - ALIGN(32) -PROLOGUE(M4_function_1) - movl PARAM_SIZE, %edx - movl PARAM_SRC, %eax - xorl %ecx, %ecx - - decl %edx - jnz LF(M4_function_1c,start_1) - - movl (%eax), %eax - movl PARAM_DST, %ecx - - mull PARAM_MULTIPLIER - - M4_inst %eax, (%ecx) - adcl $0, %edx - movl %edx, %eax - - ret -EPILOGUE() - - ALIGN(16) -PROLOGUE(M4_function_1c) - movl PARAM_SIZE, %edx - movl PARAM_SRC, %eax - - decl %edx - jnz L(more_than_one_limb) - - movl (%eax), %eax - movl PARAM_DST, %ecx - - mull PARAM_MULTIPLIER - - addl PARAM_CARRY, %eax - - adcl $0, %edx - M4_inst %eax, (%ecx) - - adcl $0, %edx - movl %edx, %eax - - ret - - - C offset 0x44 so close enough to aligned -L(more_than_one_limb): - movl PARAM_CARRY, %ecx -L(start_1): - C eax src - C ecx initial carry - C edx size-1 - subl $SAVE_SIZE, %esp -deflit(`FRAME',16) - - movl %ebx, SAVE_EBX - movl %esi, SAVE_ESI - movl %edx, %ebx C size-1 - - movl PARAM_SRC, %esi - movl %ebp, SAVE_EBP - cmpl $UNROLL_THRESHOLD, %edx - - movl PARAM_MULTIPLIER, %ebp - movl %edi, SAVE_EDI - - movl (%esi), %eax C src low limb - movl PARAM_DST, %edi - ja L(unroll) - - - C simple loop - - leal 4(%esi,%ebx,4), %esi C point one limb past last - leal (%edi,%ebx,4), %edi C point at last limb - negl %ebx - - C The movl to load the next source limb is done well ahead of the - C mul. This is necessary for full speed, and leads to one limb - C handled separately at the end. - -L(simple): - C eax src limb - C ebx loop counter - C ecx carry limb - C edx scratch - C esi src - C edi dst - C ebp multiplier - - mull %ebp - - addl %eax, %ecx - adcl $0, %edx - - M4_inst %ecx, (%edi,%ebx,4) - movl (%esi,%ebx,4), %eax - adcl $0, %edx - - incl %ebx - movl %edx, %ecx - jnz L(simple) - - - mull %ebp - - movl SAVE_EBX, %ebx - movl SAVE_ESI, %esi - movl SAVE_EBP, %ebp - - addl %eax, %ecx - adcl $0, %edx - - M4_inst %ecx, (%edi) - adcl $0, %edx - movl SAVE_EDI, %edi - - addl $SAVE_SIZE, %esp - movl %edx, %eax - ret - - - -C ----------------------------------------------------------------------------- - ALIGN(16) -L(unroll): - C eax src low limb - C ebx size-1 - C ecx carry - C edx size-1 - C esi src - C edi dst - C ebp multiplier - -dnl overlapping with parameters no longer needed -define(VAR_COUNTER,`PARAM_SIZE') -define(VAR_JUMP, `PARAM_MULTIPLIER') - - subl $2, %ebx C (size-2)-1 - decl %edx C size-2 - - shrl $UNROLL_LOG2, %ebx - negl %edx - - movl %ebx, VAR_COUNTER - andl $UNROLL_MASK, %edx - - movl %edx, %ebx - shll $4, %edx - -ifdef(`PIC',` - call L(pic_calc) -L(here): -',` - leal L(entry) (%edx,%ebx,1), %edx -') - negl %ebx - movl %edx, VAR_JUMP - - mull %ebp - - addl %eax, %ecx C initial carry, becomes low carry - adcl $0, %edx - testb $1, %bl - - movl 4(%esi), %eax C src second limb - leal ifelse(UNROLL_BYTES,256,128+) 8(%esi,%ebx,4), %esi - leal ifelse(UNROLL_BYTES,256,128) (%edi,%ebx,4), %edi - - movl %edx, %ebx C high carry - cmovnz( %ecx, %ebx) C high,low carry other way around - cmovnz( %edx, %ecx) - - jmp *VAR_JUMP - - -ifdef(`PIC',` -L(pic_calc): - C See README.family about old gas bugs - leal (%edx,%ebx,1), %edx - addl $L(entry)-L(here), %edx - addl (%esp), %edx - ret -') - - -C ----------------------------------------------------------------------------- -C This code uses a "two carry limbs" scheme. At the top of the loop the -C carries are ebx=lo, ecx=hi, then they swap for each limb processed. For -C the computed jump an odd size means they start one way around, an even -C size the other. Either way one limb is handled separately at the start of -C the loop. -C -C The positioning of the movl to load the next source limb is important. -C Moving it after the adcl with a view to avoiding a separate mul at the end -C of the loop slows the code down. - - ALIGN(32) -L(top): - C eax src limb - C ebx carry high - C ecx carry low - C edx scratch - C esi src+8 - C edi dst - C ebp multiplier - C - C VAR_COUNTER loop counter - C - C 17 bytes each limb - -L(entry): -deflit(CHUNK_COUNT,2) -forloop(`i', 0, UNROLL_COUNT/CHUNK_COUNT-1, ` - deflit(`disp0', eval(i*CHUNK_COUNT*4 ifelse(UNROLL_BYTES,256,-128))) - deflit(`disp1', eval(disp0 + 4)) - - mull %ebp - -Zdisp( M4_inst,%ecx, disp0,(%edi)) - movl $0, %ecx - - adcl %eax, %ebx - -Zdisp( movl, disp0,(%esi), %eax) - adcl %edx, %ecx - - - mull %ebp - - M4_inst %ebx, disp1(%edi) - movl $0, %ebx - - adcl %eax, %ecx - - movl disp1(%esi), %eax - adcl %edx, %ebx -') - - decl VAR_COUNTER - leal UNROLL_BYTES(%esi), %esi - leal UNROLL_BYTES(%edi), %edi - - jns L(top) - - - C eax src limb - C ebx carry high - C ecx carry low - C edx - C esi - C edi dst (points at second last limb) - C ebp multiplier -deflit(`disp0', ifelse(UNROLL_BYTES,256,-128)) -deflit(`disp1', eval(disp0-0 + 4)) - - mull %ebp - - M4_inst %ecx, disp0(%edi) - movl SAVE_EBP, %ebp - - adcl %ebx, %eax - movl SAVE_EBX, %ebx - movl SAVE_ESI, %esi - - adcl $0, %edx - M4_inst %eax, disp1(%edi) - movl SAVE_EDI, %edi - - adcl $0, %edx - addl $SAVE_SIZE, %esp - - movl %edx, %eax - ret - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/k7/diveby3.asm b/rts/gmp/mpn/x86/k7/diveby3.asm deleted file mode 100644 index 5768495..0000000 --- a/rts/gmp/mpn/x86/k7/diveby3.asm +++ /dev/null @@ -1,131 +0,0 @@ -dnl AMD K7 mpn_divexact_by3 -- mpn division by 3, expecting no remainder. -dnl -dnl K7: 8.0 cycles/limb - - -dnl Copyright (C) 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -C mp_limb_t mpn_divexact_by3c (mp_ptr dst, mp_srcptr src, mp_size_t size, -C mp_limb_t carry); - -defframe(PARAM_CARRY,16) -defframe(PARAM_SIZE, 12) -defframe(PARAM_SRC, 8) -defframe(PARAM_DST, 4) - -dnl multiplicative inverse of 3, modulo 2^32 -deflit(INVERSE_3, 0xAAAAAAAB) - -dnl ceil(b/3) and floor(b*2/3) where b=2^32 -deflit(ONE_THIRD_CEIL, 0x55555556) -deflit(TWO_THIRDS_FLOOR, 0xAAAAAAAA) - - .text - ALIGN(32) - -PROLOGUE(mpn_divexact_by3c) -deflit(`FRAME',0) - - movl PARAM_SRC, %ecx - pushl %ebx defframe_pushl(SAVE_EBX) - - movl PARAM_CARRY, %ebx - pushl %ebp defframe_pushl(SAVE_EBP) - - movl PARAM_SIZE, %ebp - pushl %edi defframe_pushl(SAVE_EDI) - - movl (%ecx), %eax C src low limb - pushl %esi defframe_pushl(SAVE_ESI) - - movl PARAM_DST, %edi - movl $TWO_THIRDS_FLOOR, %esi - leal -4(%ecx,%ebp,4), %ecx C &src[size-1] - - subl %ebx, %eax - - setc %bl - decl %ebp - jz L(last) - - leal (%edi,%ebp,4), %edi C &dst[size-1] - negl %ebp - - - ALIGN(16) -L(top): - C eax src limb, carry subtracted - C ebx carry limb (0 or 1) - C ecx &src[size-1] - C edx scratch - C esi TWO_THIRDS_FLOOR - C edi &dst[size-1] - C ebp counter, limbs, negative - - imull $INVERSE_3, %eax, %edx - - movl 4(%ecx,%ebp,4), %eax C next src limb - cmpl $ONE_THIRD_CEIL, %edx - - sbbl $-1, %ebx C +1 if result>=ceil(b/3) - cmpl %edx, %esi - - sbbl %ebx, %eax C and further 1 if result>=ceil(b*2/3) - movl %edx, (%edi,%ebp,4) - incl %ebp - - setc %bl C new carry - jnz L(top) - - - -L(last): - C eax src limb, carry subtracted - C ebx carry limb (0 or 1) - C ecx &src[size-1] - C edx scratch - C esi multiplier - C edi &dst[size-1] - C ebp - - imull $INVERSE_3, %eax - - cmpl $ONE_THIRD_CEIL, %eax - movl %eax, (%edi) - movl SAVE_EBP, %ebp - - sbbl $-1, %ebx C +1 if eax>=ceil(b/3) - cmpl %eax, %esi - movl $0, %eax - - adcl %ebx, %eax C further +1 if eax>=ceil(b*2/3) - movl SAVE_EDI, %edi - movl SAVE_ESI, %esi - - movl SAVE_EBX, %ebx - addl $FRAME, %esp - - ret - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/k7/gmp-mparam.h b/rts/gmp/mpn/x86/k7/gmp-mparam.h deleted file mode 100644 index c3bba0a..0000000 --- a/rts/gmp/mpn/x86/k7/gmp-mparam.h +++ /dev/null @@ -1,100 +0,0 @@ -/* AMD K7 gmp-mparam.h -- Compiler/machine parameter header file. - -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. */ - -#define BITS_PER_MP_LIMB 32 -#define BYTES_PER_MP_LIMB 4 -#define BITS_PER_LONGINT 32 -#define BITS_PER_INT 32 -#define BITS_PER_SHORTINT 16 -#define BITS_PER_CHAR 8 - - -/* the low limb is ready after 4 cycles, but normally it's the high limb - which is of interest, and that comes out after 6 cycles */ -#ifndef UMUL_TIME -#define UMUL_TIME 6 /* cycles */ -#endif - -/* AMD doco says 40, but it measures 39 back-to-back */ -#ifndef UDIV_TIME -#define UDIV_TIME 39 /* cycles */ -#endif - -/* using bsf */ -#ifndef COUNT_TRAILING_ZEROS_TIME -#define COUNT_TRAILING_ZEROS_TIME 7 /* cycles */ -#endif - - -/* Generated by tuneup.c, 2000-07-06. */ - -#ifndef KARATSUBA_MUL_THRESHOLD -#define KARATSUBA_MUL_THRESHOLD 26 -#endif -#ifndef TOOM3_MUL_THRESHOLD -#define TOOM3_MUL_THRESHOLD 177 -#endif - -#ifndef KARATSUBA_SQR_THRESHOLD -#define KARATSUBA_SQR_THRESHOLD 52 -#endif -#ifndef TOOM3_SQR_THRESHOLD -#define TOOM3_SQR_THRESHOLD 173 -#endif - -#ifndef BZ_THRESHOLD -#define BZ_THRESHOLD 76 -#endif - -#ifndef FIB_THRESHOLD -#define FIB_THRESHOLD 114 -#endif - -#ifndef POWM_THRESHOLD -#define POWM_THRESHOLD 34 -#endif - -#ifndef GCD_ACCEL_THRESHOLD -#define GCD_ACCEL_THRESHOLD 5 -#endif -#ifndef GCDEXT_THRESHOLD -#define GCDEXT_THRESHOLD 54 -#endif - -#ifndef FFT_MUL_TABLE -#define FFT_MUL_TABLE { 720, 1440, 2944, 7680, 18432, 57344, 0 } -#endif -#ifndef FFT_MODF_MUL_THRESHOLD -#define FFT_MODF_MUL_THRESHOLD 736 -#endif -#ifndef FFT_MUL_THRESHOLD -#define FFT_MUL_THRESHOLD 6912 -#endif - -#ifndef FFT_SQR_TABLE -#define FFT_SQR_TABLE { 784, 1696, 3200, 7680, 18432, 57344, 0 } -#endif -#ifndef FFT_MODF_SQR_THRESHOLD -#define FFT_MODF_SQR_THRESHOLD 800 -#endif -#ifndef FFT_SQR_THRESHOLD -#define FFT_SQR_THRESHOLD 8448 -#endif diff --git a/rts/gmp/mpn/x86/k7/mmx/copyd.asm b/rts/gmp/mpn/x86/k7/mmx/copyd.asm deleted file mode 100644 index 33214da..0000000 --- a/rts/gmp/mpn/x86/k7/mmx/copyd.asm +++ /dev/null @@ -1,136 +0,0 @@ -dnl AMD K7 mpn_copyd -- copy limb vector, decrementing. -dnl -dnl alignment dst/src, A=0mod8 N=4mod8 -dnl A/A A/N N/A N/N -dnl K7 0.75 1.0 1.0 0.75 - - -dnl Copyright (C) 1999, 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -C void mpn_copyd (mp_ptr dst, mp_srcptr src, mp_size_t size); -C -C The various comments in mpn/x86/k7/copyi.asm apply here too. - -defframe(PARAM_SIZE,12) -defframe(PARAM_SRC, 8) -defframe(PARAM_DST, 4) -deflit(`FRAME',0) - -dnl parameter space reused -define(SAVE_EBX,`PARAM_SIZE') -define(SAVE_ESI,`PARAM_SRC') - -dnl minimum 5 since the unrolled code can't handle less than 5 -deflit(UNROLL_THRESHOLD, 5) - - .text - ALIGN(32) -PROLOGUE(mpn_copyd) - - movl PARAM_SIZE, %ecx - movl %ebx, SAVE_EBX - - movl PARAM_SRC, %eax - movl PARAM_DST, %edx - - cmpl $UNROLL_THRESHOLD, %ecx - jae L(unroll) - - orl %ecx, %ecx - jz L(simple_done) - -L(simple): - C eax src - C ebx scratch - C ecx counter - C edx dst - C - C this loop is 2 cycles/limb - - movl -4(%eax,%ecx,4), %ebx - movl %ebx, -4(%edx,%ecx,4) - decl %ecx - jnz L(simple) - -L(simple_done): - movl SAVE_EBX, %ebx - ret - - -L(unroll): - movl %esi, SAVE_ESI - leal (%eax,%ecx,4), %ebx - leal (%edx,%ecx,4), %esi - - andl %esi, %ebx - movl SAVE_ESI, %esi - subl $4, %ecx C size-4 - - testl $4, %ebx C testl to pad code closer to 16 bytes for L(top) - jz L(aligned) - - C both src and dst unaligned, process one limb to align them - movl 12(%eax,%ecx,4), %ebx - movl %ebx, 12(%edx,%ecx,4) - decl %ecx -L(aligned): - - - ALIGN(16) -L(top): - C eax src - C ebx - C ecx counter, limbs - C edx dst - - movq 8(%eax,%ecx,4), %mm0 - movq (%eax,%ecx,4), %mm1 - subl $4, %ecx - movq %mm0, 16+8(%edx,%ecx,4) - movq %mm1, 16(%edx,%ecx,4) - jns L(top) - - - C now %ecx is -4 to -1 representing respectively 0 to 3 limbs remaining - - testb $2, %cl - jz L(finish_not_two) - - movq 8(%eax,%ecx,4), %mm0 - movq %mm0, 8(%edx,%ecx,4) -L(finish_not_two): - - testb $1, %cl - jz L(done) - - movl (%eax), %ebx - movl %ebx, (%edx) - -L(done): - movl SAVE_EBX, %ebx - emms - ret - - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/k7/mmx/copyi.asm b/rts/gmp/mpn/x86/k7/mmx/copyi.asm deleted file mode 100644 index b234a16..0000000 --- a/rts/gmp/mpn/x86/k7/mmx/copyi.asm +++ /dev/null @@ -1,147 +0,0 @@ -dnl AMD K7 mpn_copyi -- copy limb vector, incrementing. -dnl -dnl alignment dst/src, A=0mod8 N=4mod8 -dnl A/A A/N N/A N/N -dnl K7 0.75 1.0 1.0 0.75 - - -dnl Copyright (C) 1999, 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -C void mpn_copyi (mp_ptr dst, mp_srcptr src, mp_size_t size); -C -C Copy src,size to dst,size. -C -C This code at 0.75 or 1.0 c/l is always faster than a plain rep movsl at -C 1.33 c/l. -C -C The K7 can do two loads, or two stores, or a load and a store, in one -C cycle, so if those are 64-bit operations then 0.5 c/l should be possible, -C however nothing under 0.7 c/l is known. -C -C If both source and destination are unaligned then one limb is processed at -C the start to make them aligned and so get 0.75 c/l, whereas if they'd been -C used unaligned it would be 1.5 c/l. - -defframe(PARAM_SIZE,12) -defframe(PARAM_SRC, 8) -defframe(PARAM_DST, 4) - -dnl parameter space reused -define(SAVE_EBX,`PARAM_SIZE') - -dnl minimum 5 since the unrolled code can't handle less than 5 -deflit(UNROLL_THRESHOLD, 5) - - .text - ALIGN(32) -PROLOGUE(mpn_copyi) -deflit(`FRAME',0) - - movl PARAM_SIZE, %ecx - movl %ebx, SAVE_EBX - - movl PARAM_SRC, %eax - movl PARAM_DST, %edx - - cmpl $UNROLL_THRESHOLD, %ecx - jae L(unroll) - - orl %ecx, %ecx - jz L(simple_done) - -L(simple): - C eax src, incrementing - C ebx scratch - C ecx counter - C edx dst, incrementing - C - C this loop is 2 cycles/limb - - movl (%eax), %ebx - movl %ebx, (%edx) - decl %ecx - leal 4(%eax), %eax - leal 4(%edx), %edx - jnz L(simple) - -L(simple_done): - movl SAVE_EBX, %ebx - ret - - -L(unroll): - movl %eax, %ebx - leal -12(%eax,%ecx,4), %eax C src end - 12 - subl $3, %ecx C size-3 - - andl %edx, %ebx - leal (%edx,%ecx,4), %edx C dst end - 12 - negl %ecx - - testl $4, %ebx C testl to pad code closer to 16 bytes for L(top) - jz L(aligned) - - C both src and dst unaligned, process one limb to align them - movl (%eax,%ecx,4), %ebx - movl %ebx, (%edx,%ecx,4) - incl %ecx -L(aligned): - - - ALIGN(16) -L(top): - C eax src end - 12 - C ebx - C ecx counter, negative, limbs - C edx dst end - 12 - - movq (%eax,%ecx,4), %mm0 - movq 8(%eax,%ecx,4), %mm1 - addl $4, %ecx - movq %mm0, -16(%edx,%ecx,4) - movq %mm1, -16+8(%edx,%ecx,4) - ja L(top) C jump no carry and not zero - - - C now %ecx is 0 to 3 representing respectively 3 to 0 limbs remaining - - testb $2, %cl - jnz L(finish_not_two) - - movq (%eax,%ecx,4), %mm0 - movq %mm0, (%edx,%ecx,4) -L(finish_not_two): - - testb $1, %cl - jnz L(done) - - movl 8(%eax), %ebx - movl %ebx, 8(%edx) - -L(done): - movl SAVE_EBX, %ebx - emms - ret - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/k7/mmx/divrem_1.asm b/rts/gmp/mpn/x86/k7/mmx/divrem_1.asm deleted file mode 100644 index 483ad6a..0000000 --- a/rts/gmp/mpn/x86/k7/mmx/divrem_1.asm +++ /dev/null @@ -1,718 +0,0 @@ -dnl AMD K7 mpn_divrem_1 -- mpn by limb division. -dnl -dnl K7: 17.0 cycles/limb integer part, 15.0 cycles/limb fraction part. - - -dnl Copyright (C) 1999, 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -C mp_limb_t mpn_divrem_1 (mp_ptr dst, mp_size_t xsize, -C mp_srcptr src, mp_size_t size, -C mp_limb_t divisor); -C mp_limb_t mpn_divrem_1c (mp_ptr dst, mp_size_t xsize, -C mp_srcptr src, mp_size_t size, -C mp_limb_t divisor, mp_limb_t carry); -C -C The method and nomenclature follow part 8 of "Division by Invariant -C Integers using Multiplication" by Granlund and Montgomery, reference in -C gmp.texi. -C -C The "and"s shown in the paper are done here with "cmov"s. "m" is written -C for m', and "d" for d_norm, which won't cause any confusion since it's -C only the normalized divisor that's of any use in the code. "b" is written -C for 2^N, the size of a limb, N being 32 here. -C -C mpn_divrem_1 avoids one division if the src high limb is less than the -C divisor. mpn_divrem_1c doesn't check for a zero carry, since in normal -C circumstances that will be a very rare event. -C -C There's a small bias towards expecting xsize==0, by having code for -C xsize==0 in a straight line and xsize!=0 under forward jumps. - - -dnl MUL_THRESHOLD is the value of xsize+size at which the multiply by -dnl inverse method is used, rather than plain "divl"s. Minimum value 1. -dnl -dnl The inverse takes about 50 cycles to calculate, but after that the -dnl multiply is 17 c/l versus division at 42 c/l. -dnl -dnl At 3 limbs the mul is a touch faster than div on the integer part, and -dnl even more so on the fractional part. - -deflit(MUL_THRESHOLD, 3) - - -defframe(PARAM_CARRY, 24) -defframe(PARAM_DIVISOR,20) -defframe(PARAM_SIZE, 16) -defframe(PARAM_SRC, 12) -defframe(PARAM_XSIZE, 8) -defframe(PARAM_DST, 4) - -defframe(SAVE_EBX, -4) -defframe(SAVE_ESI, -8) -defframe(SAVE_EDI, -12) -defframe(SAVE_EBP, -16) - -defframe(VAR_NORM, -20) -defframe(VAR_INVERSE, -24) -defframe(VAR_SRC, -28) -defframe(VAR_DST, -32) -defframe(VAR_DST_STOP,-36) - -deflit(STACK_SPACE, 36) - - .text - ALIGN(32) - -PROLOGUE(mpn_divrem_1c) -deflit(`FRAME',0) - movl PARAM_CARRY, %edx - movl PARAM_SIZE, %ecx - subl $STACK_SPACE, %esp -deflit(`FRAME',STACK_SPACE) - - movl %ebx, SAVE_EBX - movl PARAM_XSIZE, %ebx - - movl %edi, SAVE_EDI - movl PARAM_DST, %edi - - movl %ebp, SAVE_EBP - movl PARAM_DIVISOR, %ebp - - movl %esi, SAVE_ESI - movl PARAM_SRC, %esi - - leal -4(%edi,%ebx,4), %edi - jmp LF(mpn_divrem_1,start_1c) - -EPILOGUE() - - - C offset 0x31, close enough to aligned -PROLOGUE(mpn_divrem_1) -deflit(`FRAME',0) - - movl PARAM_SIZE, %ecx - movl $0, %edx C initial carry (if can't skip a div) - subl $STACK_SPACE, %esp -deflit(`FRAME',STACK_SPACE) - - movl %ebp, SAVE_EBP - movl PARAM_DIVISOR, %ebp - - movl %ebx, SAVE_EBX - movl PARAM_XSIZE, %ebx - - movl %esi, SAVE_ESI - movl PARAM_SRC, %esi - orl %ecx, %ecx - - movl %edi, SAVE_EDI - movl PARAM_DST, %edi - leal -4(%edi,%ebx,4), %edi C &dst[xsize-1] - - jz L(no_skip_div) - movl -4(%esi,%ecx,4), %eax C src high limb - - cmpl %ebp, %eax C one less div if high=MUL_THRESHOLD, so with size==0 then - C must have xsize!=0 - jmp L(fraction_some) - - - -C ----------------------------------------------------------------------------- -C -C The multiply by inverse loop is 17 cycles, and relies on some out-of-order -C execution. The instruction scheduling is important, with various -C apparently equivalent forms running 1 to 5 cycles slower. -C -C A lower bound for the time would seem to be 16 cycles, based on the -C following successive dependencies. -C -C cycles -C n2+n1 1 -C mul 6 -C q1+1 1 -C mul 6 -C sub 1 -C addback 1 -C --- -C 16 -C -C This chain is what the loop has already, but 16 cycles isn't achieved. -C K7 has enough decode, and probably enough execute (depending maybe on what -C a mul actually consumes), but nothing running under 17 has been found. -C -C In theory n2+n1 could be done in the sub and addback stages (by -C calculating both n2 and n2+n1 there), but lack of registers makes this an -C unlikely proposition. -C -C The jz in the loop keeps the q1+1 stage to 1 cycle. Handling an overflow -C from q1+1 with an "sbbl $0, %ebx" would add a cycle to the dependent -C chain, and nothing better than 18 cycles has been found when using it. -C The jump is taken only when q1 is 0xFFFFFFFF, and on random data this will -C be an extremely rare event. -C -C Branch mispredictions will hit random occurrances of q1==0xFFFFFFFF, but -C if some special data is coming out with this always, the q1_ff special -C case actually runs at 15 c/l. 0x2FFF...FFFD divided by 3 is a good way to -C induce the q1_ff case, for speed measurements or testing. Note that -C 0xFFF...FFF divided by 1 or 2 doesn't induce it. -C -C The instruction groupings and empty comments show the cycles for a naive -C in-order view of the code (conveniently ignoring the load latency on -C VAR_INVERSE). This shows some of where the time is going, but is nonsense -C to the extent that out-of-order execution rearranges it. In this case -C there's 19 cycles shown, but it executes at 17. - - ALIGN(16) -L(integer_top): - C eax scratch - C ebx scratch (nadj, q1) - C ecx scratch (src, dst) - C edx scratch - C esi n10 - C edi n2 - C ebp divisor - C - C mm0 scratch (src qword) - C mm7 rshift for normalization - - cmpl $0x80000000, %esi C n1 as 0=c, 1=nc - movl %edi, %eax C n2 - movl VAR_SRC, %ecx - - leal (%ebp,%esi), %ebx - cmovc( %esi, %ebx) C nadj = n10 + (-n1 & d), ignoring overflow - sbbl $-1, %eax C n2+n1 - - mull VAR_INVERSE C m*(n2+n1) - - movq (%ecx), %mm0 C next limb and the one below it - subl $4, %ecx - - movl %ecx, VAR_SRC - - C - - addl %ebx, %eax C m*(n2+n1) + nadj, low giving carry flag - leal 1(%edi), %ebx C n2<<32 + m*(n2+n1)) - movl %ebp, %eax C d - - C - - adcl %edx, %ebx C 1 + high(n2<<32 + m*(n2+n1) + nadj) = q1+1 - jz L(q1_ff) - movl VAR_DST, %ecx - - mull %ebx C (q1+1)*d - - psrlq %mm7, %mm0 - - leal -4(%ecx), %ecx - - C - - subl %eax, %esi - movl VAR_DST_STOP, %eax - - C - - sbbl %edx, %edi C n - (q1+1)*d - movl %esi, %edi C remainder -> n2 - leal (%ebp,%esi), %edx - - movd %mm0, %esi - - cmovc( %edx, %edi) C n - q1*d if underflow from using q1+1 - sbbl $0, %ebx C q - cmpl %eax, %ecx - - movl %ebx, (%ecx) - movl %ecx, VAR_DST - jne L(integer_top) - - -L(integer_loop_done): - - -C ----------------------------------------------------------------------------- -C -C Here, and in integer_one_left below, an sbbl $0 is used rather than a jz -C q1_ff special case. This make the code a bit smaller and simpler, and -C costs only 1 cycle (each). - -L(integer_two_left): - C eax scratch - C ebx scratch (nadj, q1) - C ecx scratch (src, dst) - C edx scratch - C esi n10 - C edi n2 - C ebp divisor - C - C mm0 src limb, shifted - C mm7 rshift - - cmpl $0x80000000, %esi C n1 as 0=c, 1=nc - movl %edi, %eax C n2 - movl PARAM_SRC, %ecx - - leal (%ebp,%esi), %ebx - cmovc( %esi, %ebx) C nadj = n10 + (-n1 & d), ignoring overflow - sbbl $-1, %eax C n2+n1 - - mull VAR_INVERSE C m*(n2+n1) - - movd (%ecx), %mm0 C src low limb - - movl VAR_DST_STOP, %ecx - - C - - addl %ebx, %eax C m*(n2+n1) + nadj, low giving carry flag - leal 1(%edi), %ebx C n2<<32 + m*(n2+n1)) - movl %ebp, %eax C d - - adcl %edx, %ebx C 1 + high(n2<<32 + m*(n2+n1) + nadj) = q1+1 - - sbbl $0, %ebx - - mull %ebx C (q1+1)*d - - psllq $32, %mm0 - - psrlq %mm7, %mm0 - - C - - subl %eax, %esi - - C - - sbbl %edx, %edi C n - (q1+1)*d - movl %esi, %edi C remainder -> n2 - leal (%ebp,%esi), %edx - - movd %mm0, %esi - - cmovc( %edx, %edi) C n - q1*d if underflow from using q1+1 - sbbl $0, %ebx C q - - movl %ebx, -4(%ecx) - - -C ----------------------------------------------------------------------------- -L(integer_one_left): - C eax scratch - C ebx scratch (nadj, q1) - C ecx dst - C edx scratch - C esi n10 - C edi n2 - C ebp divisor - C - C mm0 src limb, shifted - C mm7 rshift - - movl VAR_DST_STOP, %ecx - cmpl $0x80000000, %esi C n1 as 0=c, 1=nc - movl %edi, %eax C n2 - - leal (%ebp,%esi), %ebx - cmovc( %esi, %ebx) C nadj = n10 + (-n1 & d), ignoring overflow - sbbl $-1, %eax C n2+n1 - - mull VAR_INVERSE C m*(n2+n1) - - C - - C - - C - - addl %ebx, %eax C m*(n2+n1) + nadj, low giving carry flag - leal 1(%edi), %ebx C n2<<32 + m*(n2+n1)) - movl %ebp, %eax C d - - C - - adcl %edx, %ebx C 1 + high(n2<<32 + m*(n2+n1) + nadj) = q1+1 - - sbbl $0, %ebx C q1 if q1+1 overflowed - - mull %ebx - - C - - C - - C - - subl %eax, %esi - - C - - sbbl %edx, %edi C n - (q1+1)*d - movl %esi, %edi C remainder -> n2 - leal (%ebp,%esi), %edx - - cmovc( %edx, %edi) C n - q1*d if underflow from using q1+1 - sbbl $0, %ebx C q - - movl %ebx, -8(%ecx) - subl $8, %ecx - - - -L(integer_none): - cmpl $0, PARAM_XSIZE - jne L(fraction_some) - - movl %edi, %eax -L(fraction_done): - movl VAR_NORM, %ecx - movl SAVE_EBP, %ebp - - movl SAVE_EDI, %edi - movl SAVE_ESI, %esi - - movl SAVE_EBX, %ebx - addl $STACK_SPACE, %esp - - shrl %cl, %eax - emms - - ret - - -C ----------------------------------------------------------------------------- -C -C Special case for q1=0xFFFFFFFF, giving q=0xFFFFFFFF meaning the low dword -C of q*d is simply -d and the remainder n-q*d = n10+d - -L(q1_ff): - C eax (divisor) - C ebx (q1+1 == 0) - C ecx - C edx - C esi n10 - C edi n2 - C ebp divisor - - movl VAR_DST, %ecx - movl VAR_DST_STOP, %edx - subl $4, %ecx - - psrlq %mm7, %mm0 - leal (%ebp,%esi), %edi C n-q*d remainder -> next n2 - movl %ecx, VAR_DST - - movd %mm0, %esi C next n10 - - movl $-1, (%ecx) - cmpl %ecx, %edx - jne L(integer_top) - - jmp L(integer_loop_done) - - - -C ----------------------------------------------------------------------------- -C -C Being the fractional part, the "source" limbs are all zero, meaning -C n10=0, n1=0, and hence nadj=0, leading to many instructions eliminated. -C -C The loop runs at 15 cycles. The dependent chain is the same as the -C general case above, but without the n2+n1 stage (due to n1==0), so 15 -C would seem to be the lower bound. -C -C A not entirely obvious simplification is that q1+1 never overflows a limb, -C and so there's no need for the sbbl $0 or jz q1_ff from the general case. -C q1 is the high word of m*n2+b*n2 and the following shows q1<=b-2 always. -C rnd() means rounding down to a multiple of d. -C -C m*n2 + b*n2 <= m*(d-1) + b*(d-1) -C = m*d + b*d - m - b -C = floor((b(b-d)-1)/d)*d + b*d - m - b -C = rnd(b(b-d)-1) + b*d - m - b -C = rnd(b(b-d)-1 + b*d) - m - b -C = rnd(b*b-1) - m - b -C <= (b-2)*b -C -C Unchanged from the general case is that the final quotient limb q can be -C either q1 or q1+1, and the q1+1 case occurs often. This can be seen from -C equation 8.4 of the paper which simplifies as follows when n1==0 and -C n0==0. -C -C n-q1*d = (n2*k+q0*d)/b <= d + (d*d-2d)/b -C -C As before, the instruction groupings and empty comments show a naive -C in-order view of the code, which is made a nonsense by out of order -C execution. There's 17 cycles shown, but it executes at 15. -C -C Rotating the store q and remainder->n2 instructions up to the top of the -C loop gets the run time down from 16 to 15. - - ALIGN(16) -L(fraction_some): - C eax - C ebx - C ecx - C edx - C esi - C edi carry - C ebp divisor - - movl PARAM_DST, %esi - movl VAR_DST_STOP, %ecx - movl %edi, %eax - - subl $8, %ecx - - jmp L(fraction_entry) - - - ALIGN(16) -L(fraction_top): - C eax n2 carry, then scratch - C ebx scratch (nadj, q1) - C ecx dst, decrementing - C edx scratch - C esi dst stop point - C edi (will be n2) - C ebp divisor - - movl %ebx, (%ecx) C previous q - movl %eax, %edi C remainder->n2 - -L(fraction_entry): - mull VAR_INVERSE C m*n2 - - movl %ebp, %eax C d - subl $4, %ecx C dst - leal 1(%edi), %ebx - - C - - C - - C - - C - - addl %edx, %ebx C 1 + high(n2<<32 + m*n2) = q1+1 - - mull %ebx C (q1+1)*d - - C - - C - - C - - negl %eax C low of n - (q1+1)*d - - C - - sbbl %edx, %edi C high of n - (q1+1)*d, caring only about carry - leal (%ebp,%eax), %edx - - cmovc( %edx, %eax) C n - q1*d if underflow from using q1+1 - sbbl $0, %ebx C q - cmpl %esi, %ecx - - jne L(fraction_top) - - - movl %ebx, (%ecx) - jmp L(fraction_done) - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/k7/mmx/lshift.asm b/rts/gmp/mpn/x86/k7/mmx/lshift.asm deleted file mode 100644 index 4d17c88..0000000 --- a/rts/gmp/mpn/x86/k7/mmx/lshift.asm +++ /dev/null @@ -1,472 +0,0 @@ -dnl AMD K7 mpn_lshift -- mpn left shift. -dnl -dnl K7: 1.21 cycles/limb (at 16 limbs/loop). - - -dnl Copyright (C) 1999, 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -dnl K7: UNROLL_COUNT cycles/limb -dnl 4 1.51 -dnl 8 1.26 -dnl 16 1.21 -dnl 32 1.2 -dnl Maximum possible with the current code is 64. - -deflit(UNROLL_COUNT, 16) - - -C mp_limb_t mpn_lshift (mp_ptr dst, mp_srcptr src, mp_size_t size, -C unsigned shift); -C -C Shift src,size left by shift many bits and store the result in dst,size. -C Zeros are shifted in at the right. The bits shifted out at the left are -C the return value. -C -C The comments in mpn_rshift apply here too. - -ifdef(`PIC',` -deflit(UNROLL_THRESHOLD, 10) -',` -deflit(UNROLL_THRESHOLD, 10) -') - -defframe(PARAM_SHIFT,16) -defframe(PARAM_SIZE, 12) -defframe(PARAM_SRC, 8) -defframe(PARAM_DST, 4) - -defframe(SAVE_EDI, -4) -defframe(SAVE_ESI, -8) -defframe(SAVE_EBX, -12) -deflit(SAVE_SIZE, 12) - - .text - ALIGN(32) - -PROLOGUE(mpn_lshift) -deflit(`FRAME',0) - - movl PARAM_SIZE, %eax - movl PARAM_SRC, %edx - subl $SAVE_SIZE, %esp -deflit(`FRAME',SAVE_SIZE) - - movl PARAM_SHIFT, %ecx - movl %edi, SAVE_EDI - - movl PARAM_DST, %edi - decl %eax - jnz L(more_than_one_limb) - - movl (%edx), %edx - - shldl( %cl, %edx, %eax) C eax was decremented to zero - - shll %cl, %edx - - movl %edx, (%edi) - movl SAVE_EDI, %edi - addl $SAVE_SIZE, %esp - - ret - - -C ----------------------------------------------------------------------------- -L(more_than_one_limb): - C eax size-1 - C ebx - C ecx shift - C edx src - C esi - C edi dst - C ebp - - movd PARAM_SHIFT, %mm6 - movd (%edx,%eax,4), %mm5 C src high limb - cmp $UNROLL_THRESHOLD-1, %eax - - jae L(unroll) - negl %ecx - movd (%edx), %mm4 C src low limb - - addl $32, %ecx - - movd %ecx, %mm7 - -L(simple_top): - C eax loop counter, limbs - C ebx - C ecx - C edx src - C esi - C edi dst - C ebp - C - C mm0 scratch - C mm4 src low limb - C mm5 src high limb - C mm6 shift - C mm7 32-shift - - movq -4(%edx,%eax,4), %mm0 - decl %eax - - psrlq %mm7, %mm0 - - movd %mm0, 4(%edi,%eax,4) - jnz L(simple_top) - - - psllq %mm6, %mm5 - psllq %mm6, %mm4 - - psrlq $32, %mm5 - movd %mm4, (%edi) C dst low limb - - movd %mm5, %eax C return value - - movl SAVE_EDI, %edi - addl $SAVE_SIZE, %esp - emms - - ret - - -C ----------------------------------------------------------------------------- - ALIGN(16) -L(unroll): - C eax size-1 - C ebx (saved) - C ecx shift - C edx src - C esi - C edi dst - C ebp - C - C mm5 src high limb, for return value - C mm6 lshift - - movl %esi, SAVE_ESI - movl %ebx, SAVE_EBX - leal -4(%edx,%eax,4), %edx C &src[size-2] - - testb $4, %dl - movq (%edx), %mm1 C src high qword - - jz L(start_src_aligned) - - - C src isn't aligned, process high limb (marked xxx) separately to - C make it so - C - C source -4(edx,%eax,4) - C | - C +-------+-------+-------+-- - C | xxx | - C +-------+-------+-------+-- - C 0mod8 4mod8 0mod8 - C - C dest -4(edi,%eax,4) - C | - C +-------+-------+-- - C | xxx | | - C +-------+-------+-- - - psllq %mm6, %mm1 - subl $4, %edx - movl %eax, PARAM_SIZE C size-1 - - psrlq $32, %mm1 - decl %eax C size-2 is new size-1 - - movd %mm1, 4(%edi,%eax,4) - movq (%edx), %mm1 C new src high qword -L(start_src_aligned): - - - leal -4(%edi,%eax,4), %edi C &dst[size-2] - psllq %mm6, %mm5 - - testl $4, %edi - psrlq $32, %mm5 C return value - - jz L(start_dst_aligned) - - - C dst isn't aligned, subtract 4 bytes to make it so, and pretend the - C shift is 32 bits extra. High limb of dst (marked xxx) handled - C here separately. - C - C source %edx - C +-------+-------+-- - C | mm1 | - C +-------+-------+-- - C 0mod8 4mod8 - C - C dest %edi - C +-------+-------+-------+-- - C | xxx | - C +-------+-------+-------+-- - C 0mod8 4mod8 0mod8 - - movq %mm1, %mm0 - psllq %mm6, %mm1 - addl $32, %ecx C shift+32 - - psrlq $32, %mm1 - - movd %mm1, 4(%edi) - movq %mm0, %mm1 - subl $4, %edi - - movd %ecx, %mm6 C new lshift -L(start_dst_aligned): - - decl %eax C size-2, two last limbs handled at end - movq %mm1, %mm2 C copy of src high qword - negl %ecx - - andl $-2, %eax C round size down to even - addl $64, %ecx - - movl %eax, %ebx - negl %eax - - andl $UNROLL_MASK, %eax - decl %ebx - - shll %eax - - movd %ecx, %mm7 C rshift = 64-lshift - -ifdef(`PIC',` - call L(pic_calc) -L(here): -',` - leal L(entry) (%eax,%eax,4), %esi -') - shrl $UNROLL_LOG2, %ebx C loop counter - - leal ifelse(UNROLL_BYTES,256,128) -8(%edx,%eax,2), %edx - leal ifelse(UNROLL_BYTES,256,128) (%edi,%eax,2), %edi - movl PARAM_SIZE, %eax C for use at end - jmp *%esi - - -ifdef(`PIC',` -L(pic_calc): - C See README.family about old gas bugs - leal (%eax,%eax,4), %esi - addl $L(entry)-L(here), %esi - addl (%esp), %esi - - ret -') - - -C ----------------------------------------------------------------------------- - ALIGN(32) -L(top): - C eax size (for use at end) - C ebx loop counter - C ecx rshift - C edx src - C esi computed jump - C edi dst - C ebp - C - C mm0 scratch - C mm1 \ carry (alternating, mm2 first) - C mm2 / - C mm6 lshift - C mm7 rshift - C - C 10 code bytes/limb - C - C The two chunks differ in whether mm1 or mm2 hold the carry. - C The computed jump puts the initial carry in both mm1 and mm2. - -L(entry): -deflit(CHUNK_COUNT, 4) -forloop(i, 0, UNROLL_COUNT/CHUNK_COUNT-1, ` - deflit(`disp0', eval(-i*CHUNK_COUNT*4 ifelse(UNROLL_BYTES,256,-128))) - deflit(`disp1', eval(disp0 - 8)) - - movq disp0(%edx), %mm0 - psllq %mm6, %mm2 - - movq %mm0, %mm1 - psrlq %mm7, %mm0 - - por %mm2, %mm0 - movq %mm0, disp0(%edi) - - - movq disp1(%edx), %mm0 - psllq %mm6, %mm1 - - movq %mm0, %mm2 - psrlq %mm7, %mm0 - - por %mm1, %mm0 - movq %mm0, disp1(%edi) -') - - subl $UNROLL_BYTES, %edx - subl $UNROLL_BYTES, %edi - decl %ebx - - jns L(top) - - - -define(`disp', `m4_empty_if_zero(eval($1 ifelse(UNROLL_BYTES,256,-128)))') - -L(end): - testb $1, %al - movl SAVE_EBX, %ebx - psllq %mm6, %mm2 C wanted left shifted in all cases below - - movd %mm5, %eax - - movl SAVE_ESI, %esi - jz L(end_even) - - -L(end_odd): - - C Size odd, destination was aligned. - C - C source edx+8 edx+4 - C --+---------------+-------+ - C | mm2 | | - C --+---------------+-------+ - C - C dest edi - C --+---------------+---------------+-------+ - C | written | | | - C --+---------------+---------------+-------+ - C - C mm6 = shift - C mm7 = ecx = 64-shift - - - C Size odd, destination was unaligned. - C - C source edx+8 edx+4 - C --+---------------+-------+ - C | mm2 | | - C --+---------------+-------+ - C - C dest edi - C --+---------------+---------------+ - C | written | | - C --+---------------+---------------+ - C - C mm6 = shift+32 - C mm7 = ecx = 64-(shift+32) - - - C In both cases there's one extra limb of src to fetch and combine - C with mm2 to make a qword at (%edi), and in the aligned case - C there's an extra limb of dst to be formed from that extra src limb - C left shifted. - - movd disp(4) (%edx), %mm0 - testb $32, %cl - - movq %mm0, %mm1 - psllq $32, %mm0 - - psrlq %mm7, %mm0 - psllq %mm6, %mm1 - - por %mm2, %mm0 - - movq %mm0, disp(0) (%edi) - jz L(end_odd_unaligned) - movd %mm1, disp(-4) (%edi) -L(end_odd_unaligned): - - movl SAVE_EDI, %edi - addl $SAVE_SIZE, %esp - emms - - ret - - -L(end_even): - - C Size even, destination was aligned. - C - C source edx+8 - C --+---------------+ - C | mm2 | - C --+---------------+ - C - C dest edi - C --+---------------+---------------+ - C | written | | - C --+---------------+---------------+ - C - C mm6 = shift - C mm7 = ecx = 64-shift - - - C Size even, destination was unaligned. - C - C source edx+8 - C --+---------------+ - C | mm2 | - C --+---------------+ - C - C dest edi+4 - C --+---------------+-------+ - C | written | | - C --+---------------+-------+ - C - C mm6 = shift+32 - C mm7 = ecx = 64-(shift+32) - - - C The movq for the aligned case overwrites the movd for the - C unaligned case. - - movq %mm2, %mm0 - psrlq $32, %mm2 - - testb $32, %cl - movd %mm2, disp(4) (%edi) - - jz L(end_even_unaligned) - movq %mm0, disp(0) (%edi) -L(end_even_unaligned): - - movl SAVE_EDI, %edi - addl $SAVE_SIZE, %esp - emms - - ret - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/k7/mmx/mod_1.asm b/rts/gmp/mpn/x86/k7/mmx/mod_1.asm deleted file mode 100644 index 545ca56..0000000 --- a/rts/gmp/mpn/x86/k7/mmx/mod_1.asm +++ /dev/null @@ -1,457 +0,0 @@ -dnl AMD K7 mpn_mod_1 -- mpn by limb remainder. -dnl -dnl K7: 17.0 cycles/limb. - - -dnl Copyright (C) 1999, 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -C mp_limb_t mpn_mod_1 (mp_srcptr src, mp_size_t size, mp_limb_t divisor); -C mp_limb_t mpn_mod_1c (mp_srcptr src, mp_size_t size, mp_limb_t divisor, -C mp_limb_t carry); -C -C The code here is the same as mpn_divrem_1, but with the quotient -C discarded. See mpn/x86/k7/mmx/divrem_1.c for some comments. - - -dnl MUL_THRESHOLD is the size at which the multiply by inverse method is -dnl used, rather than plain "divl"s. Minimum value 2. -dnl -dnl The inverse takes about 50 cycles to calculate, but after that the -dnl multiply is 17 c/l versus division at 41 c/l. -dnl -dnl Using mul or div is about the same speed at 3 limbs, so the threshold -dnl is set to 4 to get the smaller div code used at 3. - -deflit(MUL_THRESHOLD, 4) - - -defframe(PARAM_CARRY, 16) -defframe(PARAM_DIVISOR,12) -defframe(PARAM_SIZE, 8) -defframe(PARAM_SRC, 4) - -defframe(SAVE_EBX, -4) -defframe(SAVE_ESI, -8) -defframe(SAVE_EDI, -12) -defframe(SAVE_EBP, -16) - -defframe(VAR_NORM, -20) -defframe(VAR_INVERSE, -24) -defframe(VAR_SRC_STOP,-28) - -deflit(STACK_SPACE, 28) - - .text - ALIGN(32) - -PROLOGUE(mpn_mod_1c) -deflit(`FRAME',0) - movl PARAM_CARRY, %edx - movl PARAM_SIZE, %ecx - subl $STACK_SPACE, %esp -deflit(`FRAME',STACK_SPACE) - - movl %ebp, SAVE_EBP - movl PARAM_DIVISOR, %ebp - - movl %esi, SAVE_ESI - movl PARAM_SRC, %esi - jmp LF(mpn_mod_1,start_1c) - -EPILOGUE() - - - ALIGN(32) -PROLOGUE(mpn_mod_1) -deflit(`FRAME',0) - - movl PARAM_SIZE, %ecx - movl $0, %edx C initial carry (if can't skip a div) - subl $STACK_SPACE, %esp -deflit(`FRAME',STACK_SPACE) - - movl %esi, SAVE_ESI - movl PARAM_SRC, %esi - - movl %ebp, SAVE_EBP - movl PARAM_DIVISOR, %ebp - - orl %ecx, %ecx - jz L(divide_done) - - movl -4(%esi,%ecx,4), %eax C src high limb - - cmpl %ebp, %eax C carry flag if high n2 - leal (%ebp,%esi), %edx - - movd %mm0, %esi - - cmovc( %edx, %edi) C n - q1*d if underflow from using q1+1 - cmpl %eax, %ecx - jne L(inverse_top) - - -L(inverse_loop_done): - - -C ----------------------------------------------------------------------------- - -L(inverse_two_left): - C eax scratch - C ebx scratch (nadj, q1) - C ecx &src[-1] - C edx scratch - C esi n10 - C edi n2 - C ebp divisor - C - C mm0 scratch (src dword) - C mm7 rshift - - cmpl $0x80000000, %esi C n1 as 0=c, 1=nc - movl %edi, %eax C n2 - - leal (%ebp,%esi), %ebx - cmovc( %esi, %ebx) C nadj = n10 + (-n1 & d), ignoring overflow - sbbl $-1, %eax C n2+n1 - - mull VAR_INVERSE C m*(n2+n1) - - movd 4(%ecx), %mm0 C src low limb - - C - - C - - addl %ebx, %eax C m*(n2+n1) + nadj, low giving carry flag - leal 1(%edi), %ebx C n2<<32 + m*(n2+n1)) - movl %ebp, %eax C d - - adcl %edx, %ebx C 1 + high(n2<<32 + m*(n2+n1) + nadj) = q1+1 - - sbbl $0, %ebx - - mull %ebx C (q1+1)*d - - psllq $32, %mm0 - - psrlq %mm7, %mm0 - - C - - subl %eax, %esi - - C - - sbbl %edx, %edi C n - (q1+1)*d - movl %esi, %edi C remainder -> n2 - leal (%ebp,%esi), %edx - - movd %mm0, %esi - - cmovc( %edx, %edi) C n - q1*d if underflow from using q1+1 - - -C One limb left - - C eax scratch - C ebx scratch (nadj, q1) - C ecx - C edx scratch - C esi n10 - C edi n2 - C ebp divisor - C - C mm0 src limb, shifted - C mm7 rshift - - cmpl $0x80000000, %esi C n1 as 0=c, 1=nc - movl %edi, %eax C n2 - - leal (%ebp,%esi), %ebx - cmovc( %esi, %ebx) C nadj = n10 + (-n1 & d), ignoring overflow - sbbl $-1, %eax C n2+n1 - - mull VAR_INVERSE C m*(n2+n1) - - movl VAR_NORM, %ecx C for final denorm - - C - - C - - addl %ebx, %eax C m*(n2+n1) + nadj, low giving carry flag - leal 1(%edi), %ebx C n2<<32 + m*(n2+n1)) - movl %ebp, %eax C d - - C - - adcl %edx, %ebx C 1 + high(n2<<32 + m*(n2+n1) + nadj) = q1+1 - - sbbl $0, %ebx - - mull %ebx C (q1+1)*d - - movl SAVE_EBX, %ebx - - C - - C - - subl %eax, %esi - - movl %esi, %eax C remainder - movl SAVE_ESI, %esi - - sbbl %edx, %edi C n - (q1+1)*d - leal (%ebp,%eax), %edx - movl SAVE_EBP, %ebp - - cmovc( %edx, %eax) C n - q1*d if underflow from using q1+1 - movl SAVE_EDI, %edi - - shrl %cl, %eax C denorm remainder - addl $STACK_SPACE, %esp - emms - - ret - - -C ----------------------------------------------------------------------------- -C -C Special case for q1=0xFFFFFFFF, giving q=0xFFFFFFFF meaning the low dword -C of q*d is simply -d and the remainder n-q*d = n10+d - -L(q1_ff): - C eax (divisor) - C ebx (q1+1 == 0) - C ecx src pointer - C edx - C esi n10 - C edi (n2) - C ebp divisor - - movl VAR_SRC_STOP, %edx - leal (%ebp,%esi), %edi C n-q*d remainder -> next n2 - psrlq %mm7, %mm0 - - movd %mm0, %esi C next n10 - - cmpl %ecx, %edx - jne L(inverse_top) - jmp L(inverse_loop_done) - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/k7/mmx/popham.asm b/rts/gmp/mpn/x86/k7/mmx/popham.asm deleted file mode 100644 index fa7c8c0..0000000 --- a/rts/gmp/mpn/x86/k7/mmx/popham.asm +++ /dev/null @@ -1,239 +0,0 @@ -dnl AMD K7 mpn_popcount, mpn_hamdist -- population count and hamming -dnl distance. -dnl -dnl K7: popcount 5.0 cycles/limb, hamdist 6.0 cycles/limb - - -dnl Copyright (C) 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -dnl Only recent versions of gas know psadbw, in particular gas 2.9.1 on -dnl FreeBSD 3.3 and 3.4 doesn't recognise it. - -define(psadbw_mm4_mm0, -`ifelse(m4_ifdef_anyof_p(`HAVE_TARGET_CPU_athlon', - `HAVE_TARGET_CPU_pentium3'),1, - `.byte 0x0f,0xf6,0xc4 C psadbw %mm4, %mm0', - -`m4_warning(`warning, using simulated and only partly functional psadbw, use for testing only -') C this works enough for the sum of bytes done below, making it - C possible to test on an older cpu - leal -8(%esp), %esp - movq %mm4, (%esp) - movq %mm0, %mm4 -forloop(i,1,7, -` psrlq $ 8, %mm4 - paddb %mm4, %mm0 -') - pushl $ 0 - pushl $ 0xFF - pand (%esp), %mm0 - movq 8(%esp), %mm4 - leal 16(%esp), %esp -')') - - -C unsigned long mpn_popcount (mp_srcptr src, mp_size_t size); -C unsigned long mpn_hamdist (mp_srcptr src, mp_srcptr src2, mp_size_t size); -C -C The code here is almost certainly not optimal, but is already a 3x speedup -C over the generic C code. The main improvement would be to interleave -C processing of two qwords in the loop so as to fully exploit the available -C execution units, possibly leading to 3.25 c/l (13 cycles for 4 limbs). -C -C The loop is based on the example "Efficient 64-bit population count using -C MMX instructions" in the Athlon Optimization Guide, AMD document 22007, -C page 158 of rev E (reference in mpn/x86/k7/README). - -ifdef(`OPERATION_popcount',, -`ifdef(`OPERATION_hamdist',, -`m4_error(`Need OPERATION_popcount or OPERATION_hamdist defined -')')') - -define(HAM, -m4_assert_numargs(1) -`ifdef(`OPERATION_hamdist',`$1')') - -define(POP, -m4_assert_numargs(1) -`ifdef(`OPERATION_popcount',`$1')') - -HAM(` -defframe(PARAM_SIZE, 12) -defframe(PARAM_SRC2, 8) -defframe(PARAM_SRC, 4) -define(M4_function,mpn_hamdist) -') -POP(` -defframe(PARAM_SIZE, 8) -defframe(PARAM_SRC, 4) -define(M4_function,mpn_popcount) -') - -MULFUNC_PROLOGUE(mpn_popcount mpn_hamdist) - - -ifdef(`PIC',,` - dnl non-PIC - - DATA - ALIGN(8) - -define(LS, -m4_assert_numargs(1) -`LF(M4_function,`$1')') - -LS(rodata_AAAAAAAAAAAAAAAA): - .long 0xAAAAAAAA - .long 0xAAAAAAAA - -LS(rodata_3333333333333333): - .long 0x33333333 - .long 0x33333333 - -LS(rodata_0F0F0F0F0F0F0F0F): - .long 0x0F0F0F0F - .long 0x0F0F0F0F -') - - .text - ALIGN(32) - -PROLOGUE(M4_function) -deflit(`FRAME',0) - - movl PARAM_SIZE, %ecx - orl %ecx, %ecx - jz L(zero) - -ifdef(`PIC',` - movl $0xAAAAAAAA, %eax - movl $0x33333333, %edx - - movd %eax, %mm7 - movd %edx, %mm6 - - movl $0x0F0F0F0F, %eax - - punpckldq %mm7, %mm7 - punpckldq %mm6, %mm6 - - movd %eax, %mm5 - movd %edx, %mm4 - - punpckldq %mm5, %mm5 - -',` - movq LS(rodata_AAAAAAAAAAAAAAAA), %mm7 - movq LS(rodata_3333333333333333), %mm6 - movq LS(rodata_0F0F0F0F0F0F0F0F), %mm5 -') - pxor %mm4, %mm4 - -define(REG_AAAAAAAAAAAAAAAA,%mm7) -define(REG_3333333333333333,%mm6) -define(REG_0F0F0F0F0F0F0F0F,%mm5) -define(REG_0000000000000000,%mm4) - - - movl PARAM_SRC, %eax -HAM(` movl PARAM_SRC2, %edx') - - pxor %mm2, %mm2 C total - - shrl %ecx - jnc L(top) - - movd (%eax,%ecx,8), %mm1 - -HAM(` movd 0(%edx,%ecx,8), %mm0 - pxor %mm0, %mm1 -') - orl %ecx, %ecx - jmp L(loaded) - - - ALIGN(16) -L(top): - C eax src - C ebx - C ecx counter, qwords, decrementing - C edx [hamdist] src2 - C - C mm0 (scratch) - C mm1 (scratch) - C mm2 total (low dword) - C mm3 - C mm4 \ - C mm5 | special constants - C mm6 | - C mm7 / - - movq -8(%eax,%ecx,8), %mm1 - -HAM(` pxor -8(%edx,%ecx,8), %mm1') - decl %ecx - -L(loaded): - movq %mm1, %mm0 - pand REG_AAAAAAAAAAAAAAAA, %mm1 - - psrlq $1, %mm1 - - psubd %mm1, %mm0 C bit pairs - - - movq %mm0, %mm1 - psrlq $2, %mm0 - - pand REG_3333333333333333, %mm0 - pand REG_3333333333333333, %mm1 - - paddd %mm1, %mm0 C nibbles - - - movq %mm0, %mm1 - psrlq $4, %mm0 - - pand REG_0F0F0F0F0F0F0F0F, %mm0 - pand REG_0F0F0F0F0F0F0F0F, %mm1 - - paddd %mm1, %mm0 C bytes - - - psadbw_mm4_mm0 - - paddd %mm0, %mm2 C add to total - jnz L(top) - - - movd %mm2, %eax - emms - ret - - -L(zero): - movl $0, %eax - ret - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/k7/mmx/rshift.asm b/rts/gmp/mpn/x86/k7/mmx/rshift.asm deleted file mode 100644 index abb546c..0000000 --- a/rts/gmp/mpn/x86/k7/mmx/rshift.asm +++ /dev/null @@ -1,471 +0,0 @@ -dnl AMD K7 mpn_rshift -- mpn right shift. -dnl -dnl K7: 1.21 cycles/limb (at 16 limbs/loop). - - -dnl Copyright (C) 1999, 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -dnl K7: UNROLL_COUNT cycles/limb -dnl 4 1.51 -dnl 8 1.26 -dnl 16 1.21 -dnl 32 1.2 -dnl Maximum possible with the current code is 64. - -deflit(UNROLL_COUNT, 16) - - -C mp_limb_t mpn_rshift (mp_ptr dst, mp_srcptr src, mp_size_t size, -C unsigned shift); -C -C Shift src,size right by shift many bits and store the result in dst,size. -C Zeros are shifted in at the left. The bits shifted out at the right are -C the return value. -C -C This code uses 64-bit MMX operations, which makes it possible to handle -C two limbs at a time, for a theoretical 1.0 cycles/limb. Plain integer -C code, on the other hand, suffers from shrd being a vector path decode and -C running at 3 cycles back-to-back. -C -C Full speed depends on source and destination being aligned, and some hairy -C setups and finish-ups are done to arrange this for the loop. - -ifdef(`PIC',` -deflit(UNROLL_THRESHOLD, 10) -',` -deflit(UNROLL_THRESHOLD, 10) -') - -defframe(PARAM_SHIFT,16) -defframe(PARAM_SIZE, 12) -defframe(PARAM_SRC, 8) -defframe(PARAM_DST, 4) - -defframe(SAVE_EDI, -4) -defframe(SAVE_ESI, -8) -defframe(SAVE_EBX, -12) -deflit(SAVE_SIZE, 12) - - .text - ALIGN(32) - -PROLOGUE(mpn_rshift) -deflit(`FRAME',0) - - movl PARAM_SIZE, %eax - movl PARAM_SRC, %edx - subl $SAVE_SIZE, %esp -deflit(`FRAME',SAVE_SIZE) - - movl PARAM_SHIFT, %ecx - movl %edi, SAVE_EDI - - movl PARAM_DST, %edi - decl %eax - jnz L(more_than_one_limb) - - movl (%edx), %edx C src limb - - shrdl( %cl, %edx, %eax) C eax was decremented to zero - - shrl %cl, %edx - - movl %edx, (%edi) C dst limb - movl SAVE_EDI, %edi - addl $SAVE_SIZE, %esp - - ret - - -C ----------------------------------------------------------------------------- -L(more_than_one_limb): - C eax size-1 - C ebx - C ecx shift - C edx src - C esi - C edi dst - C ebp - - movd PARAM_SHIFT, %mm6 C rshift - movd (%edx), %mm5 C src low limb - cmp $UNROLL_THRESHOLD-1, %eax - - jae L(unroll) - leal (%edx,%eax,4), %edx C &src[size-1] - leal -4(%edi,%eax,4), %edi C &dst[size-2] - - movd (%edx), %mm4 C src high limb - negl %eax - - -L(simple_top): - C eax loop counter, limbs, negative - C ebx - C ecx shift - C edx carry - C edx &src[size-1] - C edi &dst[size-2] - C ebp - C - C mm0 scratch - C mm4 src high limb - C mm5 src low limb - C mm6 shift - - movq (%edx,%eax,4), %mm0 - incl %eax - - psrlq %mm6, %mm0 - - movd %mm0, (%edi,%eax,4) - jnz L(simple_top) - - - psllq $32, %mm5 - psrlq %mm6, %mm4 - - psrlq %mm6, %mm5 - movd %mm4, 4(%edi) C dst high limb - - movd %mm5, %eax C return value - - movl SAVE_EDI, %edi - addl $SAVE_SIZE, %esp - emms - - ret - - -C ----------------------------------------------------------------------------- - ALIGN(16) -L(unroll): - C eax size-1 - C ebx - C ecx shift - C edx src - C esi - C edi dst - C ebp - C - C mm5 src low limb - C mm6 rshift - - testb $4, %dl - movl %esi, SAVE_ESI - movl %ebx, SAVE_EBX - - psllq $32, %mm5 - jz L(start_src_aligned) - - - C src isn't aligned, process low limb separately (marked xxx) and - C step src and dst by one limb, making src aligned. - C - C source edx - C --+-------+-------+-------+ - C | xxx | - C --+-------+-------+-------+ - C 4mod8 0mod8 4mod8 - C - C dest edi - C --+-------+-------+ - C | | xxx | - C --+-------+-------+ - - movq (%edx), %mm0 C src low two limbs - addl $4, %edx - movl %eax, PARAM_SIZE C size-1 - - addl $4, %edi - decl %eax C size-2 is new size-1 - - psrlq %mm6, %mm0 - movl %edi, PARAM_DST C new dst - - movd %mm0, -4(%edi) -L(start_src_aligned): - - - movq (%edx), %mm1 C src low two limbs - decl %eax C size-2, two last limbs handled at end - testl $4, %edi - - psrlq %mm6, %mm5 - jz L(start_dst_aligned) - - - C dst isn't aligned, add 4 to make it so, and pretend the shift is - C 32 bits extra. Low limb of dst (marked xxx) handled here separately. - C - C source edx - C --+-------+-------+ - C | mm1 | - C --+-------+-------+ - C 4mod8 0mod8 - C - C dest edi - C --+-------+-------+-------+ - C | xxx | - C --+-------+-------+-------+ - C 4mod8 0mod8 4mod8 - - movq %mm1, %mm0 - psrlq %mm6, %mm1 - addl $32, %ecx C shift+32 - - movd %mm1, (%edi) - movq %mm0, %mm1 - addl $4, %edi C new dst - - movd %ecx, %mm6 -L(start_dst_aligned): - - - movq %mm1, %mm2 C copy of src low two limbs - negl %ecx - andl $-2, %eax C round size down to even - - movl %eax, %ebx - negl %eax - addl $64, %ecx - - andl $UNROLL_MASK, %eax - decl %ebx - - shll %eax - - movd %ecx, %mm7 C lshift = 64-rshift - -ifdef(`PIC',` - call L(pic_calc) -L(here): -',` - leal L(entry) (%eax,%eax,4), %esi - negl %eax -') - shrl $UNROLL_LOG2, %ebx C loop counter - - leal ifelse(UNROLL_BYTES,256,128+) 8(%edx,%eax,2), %edx - leal ifelse(UNROLL_BYTES,256,128) (%edi,%eax,2), %edi - movl PARAM_SIZE, %eax C for use at end - - jmp *%esi - - -ifdef(`PIC',` -L(pic_calc): - C See README.family about old gas bugs - leal (%eax,%eax,4), %esi - addl $L(entry)-L(here), %esi - addl (%esp), %esi - negl %eax - - ret -') - - -C ----------------------------------------------------------------------------- - ALIGN(64) -L(top): - C eax size, for use at end - C ebx loop counter - C ecx lshift - C edx src - C esi was computed jump - C edi dst - C ebp - C - C mm0 scratch - C mm1 \ carry (alternating) - C mm2 / - C mm6 rshift - C mm7 lshift - C - C 10 code bytes/limb - C - C The two chunks differ in whether mm1 or mm2 hold the carry. - C The computed jump puts the initial carry in both mm1 and mm2. - -L(entry): -deflit(CHUNK_COUNT, 4) -forloop(i, 0, UNROLL_COUNT/CHUNK_COUNT-1, ` - deflit(`disp0', eval(i*CHUNK_COUNT*4 ifelse(UNROLL_BYTES,256,-128))) - deflit(`disp1', eval(disp0 + 8)) - - movq disp0(%edx), %mm0 - psrlq %mm6, %mm2 - - movq %mm0, %mm1 - psllq %mm7, %mm0 - - por %mm2, %mm0 - movq %mm0, disp0(%edi) - - - movq disp1(%edx), %mm0 - psrlq %mm6, %mm1 - - movq %mm0, %mm2 - psllq %mm7, %mm0 - - por %mm1, %mm0 - movq %mm0, disp1(%edi) -') - - addl $UNROLL_BYTES, %edx - addl $UNROLL_BYTES, %edi - decl %ebx - - jns L(top) - - -deflit(`disp0', ifelse(UNROLL_BYTES,256,-128)) -deflit(`disp1', eval(disp0-0 + 8)) - - testb $1, %al - psrlq %mm6, %mm2 C wanted rshifted in all cases below - movl SAVE_ESI, %esi - - movd %mm5, %eax C return value - - movl SAVE_EBX, %ebx - jz L(end_even) - - - C Size odd, destination was aligned. - C - C source - C edx - C +-------+---------------+-- - C | | mm2 | - C +-------+---------------+-- - C - C dest edi - C +-------+---------------+---------------+-- - C | | | written | - C +-------+---------------+---------------+-- - C - C mm6 = shift - C mm7 = ecx = 64-shift - - - C Size odd, destination was unaligned. - C - C source - C edx - C +-------+---------------+-- - C | | mm2 | - C +-------+---------------+-- - C - C dest edi - C +---------------+---------------+-- - C | | written | - C +---------------+---------------+-- - C - C mm6 = shift+32 - C mm7 = ecx = 64-(shift+32) - - - C In both cases there's one extra limb of src to fetch and combine - C with mm2 to make a qword to store, and in the aligned case there's - C a further extra limb of dst to be formed. - - - movd disp0(%edx), %mm0 - movq %mm0, %mm1 - - psllq %mm7, %mm0 - testb $32, %cl - - por %mm2, %mm0 - psrlq %mm6, %mm1 - - movq %mm0, disp0(%edi) - jz L(finish_odd_unaligned) - - movd %mm1, disp1(%edi) -L(finish_odd_unaligned): - - movl SAVE_EDI, %edi - addl $SAVE_SIZE, %esp - emms - - ret - - -L(end_even): - - C Size even, destination was aligned. - C - C source - C +---------------+-- - C | mm2 | - C +---------------+-- - C - C dest edi - C +---------------+---------------+-- - C | | mm3 | - C +---------------+---------------+-- - C - C mm6 = shift - C mm7 = ecx = 64-shift - - - C Size even, destination was unaligned. - C - C source - C +---------------+-- - C | mm2 | - C +---------------+-- - C - C dest edi - C +-------+---------------+-- - C | | mm3 | - C +-------+---------------+-- - C - C mm6 = shift+32 - C mm7 = 64-(shift+32) - - - C The movd for the unaligned case is the same data as the movq for - C the aligned case, it's just a choice between whether one or two - C limbs should be written. - - - testb $32, %cl - movd %mm2, disp0(%edi) - - jz L(end_even_unaligned) - - movq %mm2, disp0(%edi) -L(end_even_unaligned): - - movl SAVE_EDI, %edi - addl $SAVE_SIZE, %esp - emms - - ret - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/k7/mul_1.asm b/rts/gmp/mpn/x86/k7/mul_1.asm deleted file mode 100644 index 07f7085..0000000 --- a/rts/gmp/mpn/x86/k7/mul_1.asm +++ /dev/null @@ -1,265 +0,0 @@ -dnl AMD K7 mpn_mul_1 -- mpn by limb multiply. -dnl -dnl K7: 3.4 cycles/limb (at 16 limbs/loop). - - -dnl Copyright (C) 1999, 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -dnl K7: UNROLL_COUNT cycles/limb -dnl 8 3.9 -dnl 16 3.4 -dnl 32 3.4 -dnl 64 3.35 -dnl Maximum possible with the current code is 64. - -deflit(UNROLL_COUNT, 16) - - -C mp_limb_t mpn_mul_1 (mp_ptr dst, mp_srcptr src, mp_size_t size, -C mp_limb_t multiplier); -C mp_limb_t mpn_mul_1c (mp_ptr dst, mp_srcptr src, mp_size_t size, -C mp_limb_t multiplier, mp_limb_t carry); -C -C Multiply src,size by mult and store the result in dst,size. -C Return the carry limb from the top of the result. -C -C mpn_mul_1c() accepts an initial carry for the calculation, it's added into -C the low limb of the destination. -C -C Variations on the unrolled loop have been tried, with the current -C registers or with the counter on the stack to free up ecx. The current -C code is the fastest found. -C -C An interesting effect is that removing the stores "movl %ebx, disp0(%edi)" -C from the unrolled loop actually slows it down to 5.0 cycles/limb. Code -C with this change can be tested on sizes of the form UNROLL_COUNT*n+1 -C without having to change the computed jump. There's obviously something -C fishy going on, perhaps with what execution units the mul needs. - -defframe(PARAM_CARRY, 20) -defframe(PARAM_MULTIPLIER,16) -defframe(PARAM_SIZE, 12) -defframe(PARAM_SRC, 8) -defframe(PARAM_DST, 4) - -defframe(SAVE_EBP, -4) -defframe(SAVE_EDI, -8) -defframe(SAVE_ESI, -12) -defframe(SAVE_EBX, -16) -deflit(STACK_SPACE, 16) - -dnl Must have UNROLL_THRESHOLD >= 2, since the unrolled loop can't handle 1. -ifdef(`PIC',` -deflit(UNROLL_THRESHOLD, 7) -',` -deflit(UNROLL_THRESHOLD, 5) -') - - .text - ALIGN(32) -PROLOGUE(mpn_mul_1c) -deflit(`FRAME',0) - movl PARAM_CARRY, %edx - jmp LF(mpn_mul_1,start_nc) -EPILOGUE() - - -PROLOGUE(mpn_mul_1) -deflit(`FRAME',0) - xorl %edx, %edx C initial carry -L(start_nc): - movl PARAM_SIZE, %ecx - subl $STACK_SPACE, %esp -deflit(`FRAME', STACK_SPACE) - - movl %edi, SAVE_EDI - movl %ebx, SAVE_EBX - movl %edx, %ebx - - movl %esi, SAVE_ESI - movl PARAM_SRC, %esi - cmpl $UNROLL_THRESHOLD, %ecx - - movl PARAM_DST, %edi - movl %ebp, SAVE_EBP - jae L(unroll) - - leal (%esi,%ecx,4), %esi - leal (%edi,%ecx,4), %edi - negl %ecx - - movl PARAM_MULTIPLIER, %ebp - -L(simple): - C eax scratch - C ebx carry - C ecx counter (negative) - C edx scratch - C esi src - C edi dst - C ebp multiplier - - movl (%esi,%ecx,4), %eax - - mull %ebp - - addl %ebx, %eax - movl %eax, (%edi,%ecx,4) - movl $0, %ebx - - adcl %edx, %ebx - incl %ecx - jnz L(simple) - - movl %ebx, %eax - movl SAVE_EBX, %ebx - movl SAVE_ESI, %esi - - movl SAVE_EDI, %edi - movl SAVE_EBP, %ebp - addl $STACK_SPACE, %esp - - ret - - -C ----------------------------------------------------------------------------- -C The mov to load the next source limb is done well ahead of the mul, this -C is necessary for full speed. It leads to one limb handled separately -C after the loop. -C -C When unrolling to 32 or more, an offset of +4 is used on the src pointer, -C to avoid having an 0x80 displacement in the code for the last limb in the -C unrolled loop. This is for a fair comparison between 16 and 32 unrolling. - -ifelse(eval(UNROLL_COUNT >= 32),1,` -deflit(SRC_OFFSET,4) -',` -deflit(SRC_OFFSET,) -') - - C this is offset 0x62, so close enough to aligned -L(unroll): - C eax - C ebx initial carry - C ecx size - C edx - C esi src - C edi dst - C ebp -deflit(`FRAME', STACK_SPACE) - - leal -1(%ecx), %edx C one limb handled at end - leal -2(%ecx), %ecx C and ecx is one less than edx - movl %ebp, SAVE_EBP - - negl %edx - shrl $UNROLL_LOG2, %ecx C unrolled loop counter - movl (%esi), %eax C src low limb - - andl $UNROLL_MASK, %edx - movl PARAM_DST, %edi - - movl %edx, %ebp - shll $4, %edx - - C 17 code bytes per limb -ifdef(`PIC',` - call L(add_eip_to_edx) -L(here): -',` - leal L(entry) (%edx,%ebp), %edx -') - negl %ebp - - leal ifelse(UNROLL_BYTES,256,128+) SRC_OFFSET(%esi,%ebp,4), %esi - leal ifelse(UNROLL_BYTES,256,128) (%edi,%ebp,4), %edi - movl PARAM_MULTIPLIER, %ebp - - jmp *%edx - - -ifdef(`PIC',` -L(add_eip_to_edx): - C See README.family about old gas bugs - leal (%edx,%ebp), %edx - addl $L(entry)-L(here), %edx - addl (%esp), %edx - ret -') - - -C ---------------------------------------------------------------------------- - ALIGN(32) -L(top): - C eax next src limb - C ebx carry - C ecx counter - C edx scratch - C esi src+4 - C edi dst - C ebp multiplier - C - C 17 code bytes per limb processed - -L(entry): -forloop(i, 0, UNROLL_COUNT-1, ` - deflit(`disp_dst', eval(i*4 ifelse(UNROLL_BYTES,256,-128))) - deflit(`disp_src', eval(disp_dst + 4-(SRC_OFFSET-0))) - - mull %ebp - - addl %eax, %ebx -Zdisp( movl, disp_src,(%esi), %eax) -Zdisp( movl, %ebx, disp_dst,(%edi)) - - movl $0, %ebx - adcl %edx, %ebx -') - - decl %ecx - - leal UNROLL_BYTES(%esi), %esi - leal UNROLL_BYTES(%edi), %edi - jns L(top) - - -deflit(`disp0', ifelse(UNROLL_BYTES,256,-128)) - - mull %ebp - - addl %eax, %ebx - movl $0, %eax - movl SAVE_ESI, %esi - - movl %ebx, disp0(%edi) - movl SAVE_EBX, %ebx - movl SAVE_EDI, %edi - - adcl %edx, %eax - movl SAVE_EBP, %ebp - addl $STACK_SPACE, %esp - - ret - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/k7/mul_basecase.asm b/rts/gmp/mpn/x86/k7/mul_basecase.asm deleted file mode 100644 index c4be62e..0000000 --- a/rts/gmp/mpn/x86/k7/mul_basecase.asm +++ /dev/null @@ -1,593 +0,0 @@ -dnl AMD K7 mpn_mul_basecase -- multiply two mpn numbers. -dnl -dnl K7: approx 4.42 cycles per cross product at around 20x20 limbs (16 -dnl limbs/loop unrolling). - - -dnl Copyright (C) 1999, 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -dnl K7 UNROLL_COUNT cycles/product (at around 20x20) -dnl 8 4.67 -dnl 16 4.59 -dnl 32 4.42 -dnl Maximum possible with the current code is 32. -dnl -dnl At 32 the typical 13-26 limb sizes from the karatsuba code will get -dnl done with a straight run through a block of code, no inner loop. Using -dnl 32 gives 1k of code, but the k7 has a 64k L1 code cache. - -deflit(UNROLL_COUNT, 32) - - -C void mpn_mul_basecase (mp_ptr wp, -C mp_srcptr xp, mp_size_t xsize, -C mp_srcptr yp, mp_size_t ysize); -C -C Calculate xp,xsize multiplied by yp,ysize, storing the result in -C wp,xsize+ysize. -C -C This routine is essentially the same as mpn/generic/mul_basecase.c, but -C it's faster because it does most of the mpn_addmul_1() startup -C calculations only once. The saving is 15-25% on typical sizes coming from -C the Karatsuba multiply code. - -ifdef(`PIC',` -deflit(UNROLL_THRESHOLD, 5) -',` -deflit(UNROLL_THRESHOLD, 5) -') - -defframe(PARAM_YSIZE,20) -defframe(PARAM_YP, 16) -defframe(PARAM_XSIZE,12) -defframe(PARAM_XP, 8) -defframe(PARAM_WP, 4) - - .text - ALIGN(32) -PROLOGUE(mpn_mul_basecase) -deflit(`FRAME',0) - - movl PARAM_XSIZE, %ecx - movl PARAM_YP, %eax - - movl PARAM_XP, %edx - movl (%eax), %eax C yp low limb - - cmpl $2, %ecx - ja L(xsize_more_than_two) - je L(two_by_something) - - - C one limb by one limb - - mull (%edx) - - movl PARAM_WP, %ecx - movl %eax, (%ecx) - movl %edx, 4(%ecx) - ret - - -C ----------------------------------------------------------------------------- -L(two_by_something): -deflit(`FRAME',0) - decl PARAM_YSIZE - pushl %ebx defframe_pushl(`SAVE_EBX') - movl %eax, %ecx C yp low limb - - movl PARAM_WP, %ebx - pushl %esi defframe_pushl(`SAVE_ESI') - movl %edx, %esi C xp - - movl (%edx), %eax C xp low limb - jnz L(two_by_two) - - - C two limbs by one limb - - mull %ecx - - movl %eax, (%ebx) - movl 4(%esi), %eax - movl %edx, %esi C carry - - mull %ecx - - addl %eax, %esi - - movl %esi, 4(%ebx) - movl SAVE_ESI, %esi - - adcl $0, %edx - - movl %edx, 8(%ebx) - movl SAVE_EBX, %ebx - addl $FRAME, %esp - - ret - - - -C ----------------------------------------------------------------------------- -C Could load yp earlier into another register. - - ALIGN(16) -L(two_by_two): - C eax xp low limb - C ebx wp - C ecx yp low limb - C edx - C esi xp - C edi - C ebp - -dnl FRAME carries on from previous - - mull %ecx C xp[0] * yp[0] - - push %edi defframe_pushl(`SAVE_EDI') - movl %edx, %edi C carry, for wp[1] - - movl %eax, (%ebx) - movl 4(%esi), %eax - - mull %ecx C xp[1] * yp[0] - - addl %eax, %edi - movl PARAM_YP, %ecx - - adcl $0, %edx - movl 4(%ecx), %ecx C yp[1] - movl %edi, 4(%ebx) - - movl 4(%esi), %eax C xp[1] - movl %edx, %edi C carry, for wp[2] - - mull %ecx C xp[1] * yp[1] - - addl %eax, %edi - - adcl $0, %edx - movl (%esi), %eax C xp[0] - - movl %edx, %esi C carry, for wp[3] - - mull %ecx C xp[0] * yp[1] - - addl %eax, 4(%ebx) - adcl %edx, %edi - movl %edi, 8(%ebx) - - adcl $0, %esi - movl SAVE_EDI, %edi - movl %esi, 12(%ebx) - - movl SAVE_ESI, %esi - movl SAVE_EBX, %ebx - addl $FRAME, %esp - - ret - - -C ----------------------------------------------------------------------------- - ALIGN(16) -L(xsize_more_than_two): - -C The first limb of yp is processed with a simple mpn_mul_1 style loop -C inline. Unrolling this doesn't seem worthwhile since it's only run once -C (whereas the addmul below is run ysize-1 many times). A call to the -C actual mpn_mul_1 will be slowed down by the call and parameter pushing and -C popping, and doesn't seem likely to be worthwhile on the typical 13-26 -C limb operations the Karatsuba code calls here with. - - C eax yp[0] - C ebx - C ecx xsize - C edx xp - C esi - C edi - C ebp - -dnl FRAME doesn't carry on from previous, no pushes yet here -defframe(`SAVE_EBX',-4) -defframe(`SAVE_ESI',-8) -defframe(`SAVE_EDI',-12) -defframe(`SAVE_EBP',-16) -deflit(`FRAME',0) - - subl $16, %esp -deflit(`FRAME',16) - - movl %edi, SAVE_EDI - movl PARAM_WP, %edi - - movl %ebx, SAVE_EBX - movl %ebp, SAVE_EBP - movl %eax, %ebp - - movl %esi, SAVE_ESI - xorl %ebx, %ebx - leal (%edx,%ecx,4), %esi C xp end - - leal (%edi,%ecx,4), %edi C wp end of mul1 - negl %ecx - - -L(mul1): - C eax scratch - C ebx carry - C ecx counter, negative - C edx scratch - C esi xp end - C edi wp end of mul1 - C ebp multiplier - - movl (%esi,%ecx,4), %eax - - mull %ebp - - addl %ebx, %eax - movl %eax, (%edi,%ecx,4) - movl $0, %ebx - - adcl %edx, %ebx - incl %ecx - jnz L(mul1) - - - movl PARAM_YSIZE, %edx - movl PARAM_XSIZE, %ecx - - movl %ebx, (%edi) C final carry - decl %edx - - jnz L(ysize_more_than_one) - - - movl SAVE_EDI, %edi - movl SAVE_EBX, %ebx - - movl SAVE_EBP, %ebp - movl SAVE_ESI, %esi - addl $FRAME, %esp - - ret - - -L(ysize_more_than_one): - cmpl $UNROLL_THRESHOLD, %ecx - movl PARAM_YP, %eax - - jae L(unroll) - - -C ----------------------------------------------------------------------------- - C simple addmul looping - C - C eax yp - C ebx - C ecx xsize - C edx ysize-1 - C esi xp end - C edi wp end of mul1 - C ebp - - leal 4(%eax,%edx,4), %ebp C yp end - negl %ecx - negl %edx - - movl (%esi,%ecx,4), %eax C xp low limb - movl %edx, PARAM_YSIZE C -(ysize-1) - incl %ecx - - xorl %ebx, %ebx C initial carry - movl %ecx, PARAM_XSIZE C -(xsize-1) - movl %ebp, PARAM_YP - - movl (%ebp,%edx,4), %ebp C yp second lowest limb - multiplier - jmp L(simple_outer_entry) - - - C this is offset 0x121 so close enough to aligned -L(simple_outer_top): - C ebp ysize counter, negative - - movl PARAM_YP, %edx - movl PARAM_XSIZE, %ecx C -(xsize-1) - xorl %ebx, %ebx C carry - - movl %ebp, PARAM_YSIZE - addl $4, %edi C next position in wp - - movl (%edx,%ebp,4), %ebp C yp limb - multiplier - movl -4(%esi,%ecx,4), %eax C xp low limb - - -L(simple_outer_entry): - -L(simple_inner): - C eax xp limb - C ebx carry limb - C ecx loop counter (negative) - C edx scratch - C esi xp end - C edi wp end - C ebp multiplier - - mull %ebp - - addl %eax, %ebx - adcl $0, %edx - - addl %ebx, (%edi,%ecx,4) - movl (%esi,%ecx,4), %eax - adcl $0, %edx - - incl %ecx - movl %edx, %ebx - jnz L(simple_inner) - - - mull %ebp - - movl PARAM_YSIZE, %ebp - addl %eax, %ebx - - adcl $0, %edx - addl %ebx, (%edi) - - adcl $0, %edx - incl %ebp - - movl %edx, 4(%edi) - jnz L(simple_outer_top) - - - movl SAVE_EBX, %ebx - movl SAVE_ESI, %esi - - movl SAVE_EDI, %edi - movl SAVE_EBP, %ebp - addl $FRAME, %esp - - ret - - - -C ----------------------------------------------------------------------------- -C -C The unrolled loop is the same as in mpn_addmul_1(), see that code for some -C comments. -C -C VAR_ADJUST is the negative of how many limbs the leals in the inner loop -C increment xp and wp. This is used to adjust back xp and wp, and rshifted -C to given an initial VAR_COUNTER at the top of the outer loop. -C -C VAR_COUNTER is for the unrolled loop, running from VAR_ADJUST/UNROLL_COUNT -C up to -1, inclusive. -C -C VAR_JMP is the computed jump into the unrolled loop. -C -C VAR_XP_LOW is the least significant limb of xp, which is needed at the -C start of the unrolled loop. -C -C PARAM_YSIZE is the outer loop counter, going from -(ysize-1) up to -1, -C inclusive. -C -C PARAM_YP is offset appropriately so that the PARAM_YSIZE counter can be -C added to give the location of the next limb of yp, which is the multiplier -C in the unrolled loop. -C -C The trick with VAR_ADJUST means it's only necessary to do one fetch in the -C outer loop to take care of xp, wp and the inner loop counter. - -defframe(VAR_COUNTER, -20) -defframe(VAR_ADJUST, -24) -defframe(VAR_JMP, -28) -defframe(VAR_XP_LOW, -32) -deflit(VAR_EXTRA_SPACE, 16) - - -L(unroll): - C eax yp - C ebx - C ecx xsize - C edx ysize-1 - C esi xp end - C edi wp end of mul1 - C ebp - - movl PARAM_XP, %esi - movl 4(%eax), %ebp C multiplier (yp second limb) - leal 4(%eax,%edx,4), %eax C yp adjust for ysize indexing - - movl PARAM_WP, %edi - movl %eax, PARAM_YP - negl %edx - - movl %edx, PARAM_YSIZE - leal UNROLL_COUNT-2(%ecx), %ebx C (xsize-1)+UNROLL_COUNT-1 - decl %ecx C xsize-1 - - movl (%esi), %eax C xp low limb - andl $-UNROLL_MASK-1, %ebx - negl %ecx - - subl $VAR_EXTRA_SPACE, %esp -deflit(`FRAME',16+VAR_EXTRA_SPACE) - negl %ebx - andl $UNROLL_MASK, %ecx - - movl %ebx, VAR_ADJUST - movl %ecx, %edx - shll $4, %ecx - - sarl $UNROLL_LOG2, %ebx - - C 17 code bytes per limb -ifdef(`PIC',` - call L(pic_calc) -L(unroll_here): -',` - leal L(unroll_entry) (%ecx,%edx,1), %ecx -') - negl %edx - - movl %eax, VAR_XP_LOW - movl %ecx, VAR_JMP - leal 4(%edi,%edx,4), %edi C wp and xp, adjust for unrolling, - leal 4(%esi,%edx,4), %esi C and start at second limb - jmp L(unroll_outer_entry) - - -ifdef(`PIC',` -L(pic_calc): - C See README.family about old gas bugs - leal (%ecx,%edx,1), %ecx - addl $L(unroll_entry)-L(unroll_here), %ecx - addl (%esp), %ecx - ret -') - - -C -------------------------------------------------------------------------- - ALIGN(32) -L(unroll_outer_top): - C ebp ysize counter, negative - - movl VAR_ADJUST, %ebx - movl PARAM_YP, %edx - - movl VAR_XP_LOW, %eax - movl %ebp, PARAM_YSIZE C store incremented ysize counter - - leal 4(%edi,%ebx,4), %edi - leal (%esi,%ebx,4), %esi - sarl $UNROLL_LOG2, %ebx - - movl (%edx,%ebp,4), %ebp C yp next multiplier - movl VAR_JMP, %ecx - -L(unroll_outer_entry): - mull %ebp - - testb $1, %cl C and clear carry bit - movl %ebx, VAR_COUNTER - movl $0, %ebx - - movl $0, %ecx - cmovz( %eax, %ecx) C eax into low carry, zero into high carry limb - cmovnz( %eax, %ebx) - - C Extra fetch of VAR_JMP is bad, but registers are tight - jmp *VAR_JMP - - -C ----------------------------------------------------------------------------- - ALIGN(32) -L(unroll_top): - C eax xp limb - C ebx carry high - C ecx carry low - C edx scratch - C esi xp+8 - C edi wp - C ebp yp multiplier limb - C - C VAR_COUNTER loop counter, negative - C - C 17 bytes each limb - -L(unroll_entry): - -deflit(CHUNK_COUNT,2) -forloop(`i', 0, UNROLL_COUNT/CHUNK_COUNT-1, ` - deflit(`disp0', eval(i*CHUNK_COUNT*4 ifelse(UNROLL_BYTES,256,-128))) - deflit(`disp1', eval(disp0 + 4)) - -Zdisp( movl, disp0,(%esi), %eax) - adcl %edx, %ebx - - mull %ebp - -Zdisp( addl, %ecx, disp0,(%edi)) - movl $0, %ecx - - adcl %eax, %ebx - - - movl disp1(%esi), %eax - adcl %edx, %ecx - - mull %ebp - - addl %ebx, disp1(%edi) - movl $0, %ebx - - adcl %eax, %ecx -') - - - incl VAR_COUNTER - leal UNROLL_BYTES(%esi), %esi - leal UNROLL_BYTES(%edi), %edi - - jnz L(unroll_top) - - - C eax - C ebx zero - C ecx low - C edx high - C esi - C edi wp, pointing at second last limb) - C ebp - C - C carry flag to be added to high - -deflit(`disp0', ifelse(UNROLL_BYTES,256,-128)) -deflit(`disp1', eval(disp0-0 + 4)) - - movl PARAM_YSIZE, %ebp - adcl $0, %edx - addl %ecx, disp0(%edi) - - adcl $0, %edx - incl %ebp - - movl %edx, disp1(%edi) - jnz L(unroll_outer_top) - - - movl SAVE_ESI, %esi - movl SAVE_EBP, %ebp - - movl SAVE_EDI, %edi - movl SAVE_EBX, %ebx - addl $FRAME, %esp - - ret - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/k7/sqr_basecase.asm b/rts/gmp/mpn/x86/k7/sqr_basecase.asm deleted file mode 100644 index 84861ea..0000000 --- a/rts/gmp/mpn/x86/k7/sqr_basecase.asm +++ /dev/null @@ -1,627 +0,0 @@ -dnl AMD K7 mpn_sqr_basecase -- square an mpn number. -dnl -dnl K7: approx 2.3 cycles/crossproduct, or 4.55 cycles/triangular product -dnl (measured on the speed difference between 25 and 50 limbs, which is -dnl roughly the Karatsuba recursing range). - - -dnl Copyright (C) 1999, 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -dnl These are the same as mpn/x86/k6/sqr_basecase.asm, see that code for -dnl some comments. - -deflit(KARATSUBA_SQR_THRESHOLD_MAX, 66) - -ifdef(`KARATSUBA_SQR_THRESHOLD_OVERRIDE', -`define(`KARATSUBA_SQR_THRESHOLD',KARATSUBA_SQR_THRESHOLD_OVERRIDE)') - -m4_config_gmp_mparam(`KARATSUBA_SQR_THRESHOLD') -deflit(UNROLL_COUNT, eval(KARATSUBA_SQR_THRESHOLD-3)) - - -C void mpn_sqr_basecase (mp_ptr dst, mp_srcptr src, mp_size_t size); -C -C With a KARATSUBA_SQR_THRESHOLD around 50 this code is about 1500 bytes, -C which is quite a bit, but is considered good value since squares big -C enough to use most of the code will be spending quite a few cycles in it. - - -defframe(PARAM_SIZE,12) -defframe(PARAM_SRC, 8) -defframe(PARAM_DST, 4) - - .text - ALIGN(32) -PROLOGUE(mpn_sqr_basecase) -deflit(`FRAME',0) - - movl PARAM_SIZE, %ecx - movl PARAM_SRC, %eax - cmpl $2, %ecx - - movl PARAM_DST, %edx - je L(two_limbs) - ja L(three_or_more) - - -C------------------------------------------------------------------------------ -C one limb only - C eax src - C ecx size - C edx dst - - movl (%eax), %eax - movl %edx, %ecx - - mull %eax - - movl %edx, 4(%ecx) - movl %eax, (%ecx) - ret - - -C------------------------------------------------------------------------------ -C -C Using the read/modify/write "add"s seems to be faster than saving and -C restoring registers. Perhaps the loads for the first set hide under the -C mul latency and the second gets store to load forwarding. - - ALIGN(16) -L(two_limbs): - C eax src - C ebx - C ecx size - C edx dst -deflit(`FRAME',0) - - pushl %ebx FRAME_pushl() - movl %eax, %ebx C src - movl (%eax), %eax - - movl %edx, %ecx C dst - - mull %eax C src[0]^2 - - movl %eax, (%ecx) C dst[0] - movl 4(%ebx), %eax - - movl %edx, 4(%ecx) C dst[1] - - mull %eax C src[1]^2 - - movl %eax, 8(%ecx) C dst[2] - movl (%ebx), %eax - - movl %edx, 12(%ecx) C dst[3] - - mull 4(%ebx) C src[0]*src[1] - - popl %ebx - - addl %eax, 4(%ecx) - adcl %edx, 8(%ecx) - adcl $0, 12(%ecx) - ASSERT(nc) - - addl %eax, 4(%ecx) - adcl %edx, 8(%ecx) - adcl $0, 12(%ecx) - ASSERT(nc) - - ret - - -C------------------------------------------------------------------------------ -defframe(SAVE_EBX, -4) -defframe(SAVE_ESI, -8) -defframe(SAVE_EDI, -12) -defframe(SAVE_EBP, -16) -deflit(STACK_SPACE, 16) - -L(three_or_more): - subl $STACK_SPACE, %esp - cmpl $4, %ecx - jae L(four_or_more) -deflit(`FRAME',STACK_SPACE) - - -C------------------------------------------------------------------------------ -C Three limbs -C -C Writing out the loads and stores separately at the end of this code comes -C out about 10 cycles faster than using adcls to memory. - - C eax src - C ecx size - C edx dst - - movl %ebx, SAVE_EBX - movl %eax, %ebx C src - movl (%eax), %eax - - movl %edx, %ecx C dst - movl %esi, SAVE_ESI - movl %edi, SAVE_EDI - - mull %eax C src[0] ^ 2 - - movl %eax, (%ecx) - movl 4(%ebx), %eax - movl %edx, 4(%ecx) - - mull %eax C src[1] ^ 2 - - movl %eax, 8(%ecx) - movl 8(%ebx), %eax - movl %edx, 12(%ecx) - - mull %eax C src[2] ^ 2 - - movl %eax, 16(%ecx) - movl (%ebx), %eax - movl %edx, 20(%ecx) - - mull 4(%ebx) C src[0] * src[1] - - movl %eax, %esi - movl (%ebx), %eax - movl %edx, %edi - - mull 8(%ebx) C src[0] * src[2] - - addl %eax, %edi - movl %ebp, SAVE_EBP - movl $0, %ebp - - movl 4(%ebx), %eax - adcl %edx, %ebp - - mull 8(%ebx) C src[1] * src[2] - - xorl %ebx, %ebx - addl %eax, %ebp - - adcl $0, %edx - - C eax - C ebx zero, will be dst[5] - C ecx dst - C edx dst[4] - C esi dst[1] - C edi dst[2] - C ebp dst[3] - - adcl $0, %edx - addl %esi, %esi - - adcl %edi, %edi - movl 4(%ecx), %eax - - adcl %ebp, %ebp - - adcl %edx, %edx - - adcl $0, %ebx - addl %eax, %esi - movl 8(%ecx), %eax - - adcl %eax, %edi - movl 12(%ecx), %eax - movl %esi, 4(%ecx) - - adcl %eax, %ebp - movl 16(%ecx), %eax - movl %edi, 8(%ecx) - - movl SAVE_ESI, %esi - movl SAVE_EDI, %edi - - adcl %eax, %edx - movl 20(%ecx), %eax - movl %ebp, 12(%ecx) - - adcl %ebx, %eax - ASSERT(nc) - movl SAVE_EBX, %ebx - movl SAVE_EBP, %ebp - - movl %edx, 16(%ecx) - movl %eax, 20(%ecx) - addl $FRAME, %esp - - ret - - -C------------------------------------------------------------------------------ -L(four_or_more): - -C First multiply src[0]*src[1..size-1] and store at dst[1..size]. -C Further products are added in rather than stored. - - C eax src - C ebx - C ecx size - C edx dst - C esi - C edi - C ebp - -defframe(`VAR_COUNTER',-20) -defframe(`VAR_JMP', -24) -deflit(EXTRA_STACK_SPACE, 8) - - movl %ebx, SAVE_EBX - movl %edi, SAVE_EDI - leal (%edx,%ecx,4), %edi C &dst[size] - - movl %esi, SAVE_ESI - movl %ebp, SAVE_EBP - leal (%eax,%ecx,4), %esi C &src[size] - - movl (%eax), %ebp C multiplier - movl $0, %ebx - decl %ecx - - negl %ecx - subl $EXTRA_STACK_SPACE, %esp -FRAME_subl_esp(EXTRA_STACK_SPACE) - -L(mul_1): - C eax scratch - C ebx carry - C ecx counter - C edx scratch - C esi &src[size] - C edi &dst[size] - C ebp multiplier - - movl (%esi,%ecx,4), %eax - - mull %ebp - - addl %ebx, %eax - movl %eax, (%edi,%ecx,4) - movl $0, %ebx - - adcl %edx, %ebx - incl %ecx - jnz L(mul_1) - - -C Add products src[n]*src[n+1..size-1] at dst[2*n-1...], for each n=1..size-2. -C -C The last two products, which are the bottom right corner of the product -C triangle, are left to the end. These are src[size-3]*src[size-2,size-1] -C and src[size-2]*src[size-1]. If size is 4 then it's only these corner -C cases that need to be done. -C -C The unrolled code is the same as in mpn_addmul_1, see that routine for -C some comments. -C -C VAR_COUNTER is the outer loop, running from -size+4 to -1, inclusive. -C -C VAR_JMP is the computed jump into the unrolled code, stepped by one code -C chunk each outer loop. -C -C K7 does branch prediction on indirect jumps, which is bad since it's a -C different target each time. There seems no way to avoid this. - -dnl This value also hard coded in some shifts and adds -deflit(CODE_BYTES_PER_LIMB, 17) - -dnl With the unmodified &src[size] and &dst[size] pointers, the -dnl displacements in the unrolled code fit in a byte for UNROLL_COUNT -dnl values up to 31, but above that an offset must be added to them. - -deflit(OFFSET, -ifelse(eval(UNROLL_COUNT>31),1, -eval((UNROLL_COUNT-31)*4), -0)) - -dnl Because the last chunk of code is generated differently, a label placed -dnl at the end doesn't work. Instead calculate the implied end using the -dnl start and how many chunks of code there are. - -deflit(UNROLL_INNER_END, -`L(unroll_inner_start)+eval(UNROLL_COUNT*CODE_BYTES_PER_LIMB)') - - C eax - C ebx carry - C ecx - C edx - C esi &src[size] - C edi &dst[size] - C ebp - - movl PARAM_SIZE, %ecx - movl %ebx, (%edi) - - subl $4, %ecx - jz L(corner) - - negl %ecx -ifelse(OFFSET,0,,`subl $OFFSET, %edi') -ifelse(OFFSET,0,,`subl $OFFSET, %esi') - - movl %ecx, %edx - shll $4, %ecx - -ifdef(`PIC',` - call L(pic_calc) -L(here): -',` - leal UNROLL_INNER_END-eval(2*CODE_BYTES_PER_LIMB)(%ecx,%edx), %ecx -') - - - C The calculated jump mustn't come out to before the start of the - C code available. This is the limit UNROLL_COUNT puts on the src - C operand size, but checked here directly using the jump address. - ASSERT(ae, - `movl_text_address(L(unroll_inner_start), %eax) - cmpl %eax, %ecx') - - -C------------------------------------------------------------------------------ - ALIGN(16) -L(unroll_outer_top): - C eax - C ebx high limb to store - C ecx VAR_JMP - C edx VAR_COUNTER, limbs, negative - C esi &src[size], constant - C edi dst ptr, high of last addmul - C ebp - - movl -12+OFFSET(%esi,%edx,4), %ebp C next multiplier - movl -8+OFFSET(%esi,%edx,4), %eax C first of multiplicand - - movl %edx, VAR_COUNTER - - mull %ebp - -define(cmovX,`ifelse(eval(UNROLL_COUNT%2),0,`cmovz($@)',`cmovnz($@)')') - - testb $1, %cl - movl %edx, %ebx C high carry - movl %ecx, %edx C jump - - movl %eax, %ecx C low carry - cmovX( %ebx, %ecx) C high carry reverse - cmovX( %eax, %ebx) C low carry reverse - - leal CODE_BYTES_PER_LIMB(%edx), %eax - xorl %edx, %edx - leal 4(%edi), %edi - - movl %eax, VAR_JMP - - jmp *%eax - - -ifdef(`PIC',` -L(pic_calc): - addl (%esp), %ecx - addl $UNROLL_INNER_END-eval(2*CODE_BYTES_PER_LIMB)-L(here), %ecx - addl %edx, %ecx - ret -') - - - C Must be an even address to preserve the significance of the low - C bit of the jump address indicating which way around ecx/ebx should - C start. - ALIGN(2) - -L(unroll_inner_start): - C eax next limb - C ebx carry high - C ecx carry low - C edx scratch - C esi src - C edi dst - C ebp multiplier - -forloop(`i', UNROLL_COUNT, 1, ` - deflit(`disp_src', eval(-i*4 + OFFSET)) - deflit(`disp_dst', eval(disp_src - 4)) - - m4_assert(`disp_src>=-128 && disp_src<128') - m4_assert(`disp_dst>=-128 && disp_dst<128') - -ifelse(eval(i%2),0,` -Zdisp( movl, disp_src,(%esi), %eax) - adcl %edx, %ebx - - mull %ebp - -Zdisp( addl, %ecx, disp_dst,(%edi)) - movl $0, %ecx - - adcl %eax, %ebx - -',` - dnl this bit comes out last -Zdisp( movl, disp_src,(%esi), %eax) - adcl %edx, %ecx - - mull %ebp - -dnl Zdisp( addl %ebx, disp_src,(%edi)) - addl %ebx, disp_dst(%edi) -ifelse(forloop_last,0, -` movl $0, %ebx') - - adcl %eax, %ecx -') -') - - C eax next limb - C ebx carry high - C ecx carry low - C edx scratch - C esi src - C edi dst - C ebp multiplier - - adcl $0, %edx - addl %ecx, -4+OFFSET(%edi) - movl VAR_JMP, %ecx - - adcl $0, %edx - - movl %edx, m4_empty_if_zero(OFFSET) (%edi) - movl VAR_COUNTER, %edx - - incl %edx - jnz L(unroll_outer_top) - - -ifelse(OFFSET,0,,` - addl $OFFSET, %esi - addl $OFFSET, %edi -') - - -C------------------------------------------------------------------------------ -L(corner): - C esi &src[size] - C edi &dst[2*size-5] - - movl -12(%esi), %ebp - movl -8(%esi), %eax - movl %eax, %ecx - - mull %ebp - - addl %eax, -4(%edi) - movl -4(%esi), %eax - - adcl $0, %edx - movl %edx, %ebx - movl %eax, %esi - - mull %ebp - - addl %ebx, %eax - - adcl $0, %edx - addl %eax, (%edi) - movl %esi, %eax - - adcl $0, %edx - movl %edx, %ebx - - mull %ecx - - addl %ebx, %eax - movl %eax, 4(%edi) - - adcl $0, %edx - movl %edx, 8(%edi) - - - -C Left shift of dst[1..2*size-2], high bit shifted out becomes dst[2*size-1]. - -L(lshift_start): - movl PARAM_SIZE, %eax - movl PARAM_DST, %edi - xorl %ecx, %ecx C clear carry - - leal (%edi,%eax,8), %edi - notl %eax C -size-1, preserve carry - - leal 2(%eax), %eax C -(size-1) - -L(lshift): - C eax counter, negative - C ebx - C ecx - C edx - C esi - C edi dst, pointing just after last limb - C ebp - - rcll -4(%edi,%eax,8) - rcll (%edi,%eax,8) - incl %eax - jnz L(lshift) - - setc %al - - movl PARAM_SRC, %esi - movl %eax, -4(%edi) C dst most significant limb - - movl PARAM_SIZE, %ecx - - -C Now add in the squares on the diagonal, src[0]^2, src[1]^2, ..., -C src[size-1]^2. dst[0] hasn't yet been set at all yet, and just gets the -C low limb of src[0]^2. - - movl (%esi), %eax C src[0] - - mull %eax - - leal (%esi,%ecx,4), %esi C src point just after last limb - negl %ecx - - movl %eax, (%edi,%ecx,8) C dst[0] - incl %ecx - -L(diag): - C eax scratch - C ebx scratch - C ecx counter, negative - C edx carry - C esi src just after last limb - C edi dst just after last limb - C ebp - - movl (%esi,%ecx,4), %eax - movl %edx, %ebx - - mull %eax - - addl %ebx, -4(%edi,%ecx,8) - adcl %eax, (%edi,%ecx,8) - adcl $0, %edx - - incl %ecx - jnz L(diag) - - - movl SAVE_ESI, %esi - movl SAVE_EBX, %ebx - - addl %edx, -4(%edi) C dst most significant limb - movl SAVE_EDI, %edi - - movl SAVE_EBP, %ebp - addl $FRAME, %esp - - ret - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/lshift.asm b/rts/gmp/mpn/x86/lshift.asm deleted file mode 100644 index 4735335..0000000 --- a/rts/gmp/mpn/x86/lshift.asm +++ /dev/null @@ -1,90 +0,0 @@ -dnl x86 mpn_lshift -- mpn left shift. - -dnl Copyright (C) 1992, 1994, 1996, 1999, 2000 Free Software Foundation, -dnl Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -C mp_limb_t mpn_lshift (mp_ptr dst, mp_srcptr src, mp_size_t size, -C unsigned shift); - -defframe(PARAM_SHIFT,16) -defframe(PARAM_SIZE, 12) -defframe(PARAM_SRC, 8) -defframe(PARAM_DST, 4) - - .text - ALIGN(8) -PROLOGUE(mpn_lshift) - - pushl %edi - pushl %esi - pushl %ebx -deflit(`FRAME',12) - - movl PARAM_DST,%edi - movl PARAM_SRC,%esi - movl PARAM_SIZE,%edx - movl PARAM_SHIFT,%ecx - - subl $4,%esi C adjust src - - movl (%esi,%edx,4),%ebx C read most significant limb - xorl %eax,%eax - shldl( %cl, %ebx, %eax) C compute carry limb - decl %edx - jz L(end) - pushl %eax C push carry limb onto stack - testb $1,%dl - jnz L(1) C enter loop in the middle - movl %ebx,%eax - - ALIGN(8) -L(oop): movl (%esi,%edx,4),%ebx C load next lower limb - shldl( %cl, %ebx, %eax) C compute result limb - movl %eax,(%edi,%edx,4) C store it - decl %edx -L(1): movl (%esi,%edx,4),%eax - shldl( %cl, %eax, %ebx) - movl %ebx,(%edi,%edx,4) - decl %edx - jnz L(oop) - - shll %cl,%eax C compute least significant limb - movl %eax,(%edi) C store it - - popl %eax C pop carry limb - - popl %ebx - popl %esi - popl %edi - ret - -L(end): shll %cl,%ebx C compute least significant limb - movl %ebx,(%edi) C store it - - popl %ebx - popl %esi - popl %edi - ret - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/mod_1.asm b/rts/gmp/mpn/x86/mod_1.asm deleted file mode 100644 index 3908161..0000000 --- a/rts/gmp/mpn/x86/mod_1.asm +++ /dev/null @@ -1,141 +0,0 @@ -dnl x86 mpn_mod_1 -- mpn by limb remainder. - - -dnl Copyright (C) 1999, 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -dnl cycles/limb -dnl K6 20 -dnl P5 44 -dnl P6 39 -dnl 486 approx 42 maybe -dnl -dnl The following have their own optimized mod_1 implementations, but for -dnl reference the code here runs as follows. -dnl -dnl P6MMX 39 -dnl K7 41 - - -include(`../config.m4') - - -C mp_limb_t mpn_mod_1 (mp_srcptr src, mp_size_t size, mp_limb_t divisor); -C mp_limb_t mpn_mod_1c (mp_srcptr src, mp_size_t size, mp_limb_t divisor, -C mp_limb_t carry); -C -C Divide src,size by divisor and return the remainder. The quotient is -C discarded. -C -C See mpn/x86/divrem_1.asm for some comments. - -defframe(PARAM_CARRY, 16) -defframe(PARAM_DIVISOR,12) -defframe(PARAM_SIZE, 8) -defframe(PARAM_SRC, 4) - - .text - ALIGN(16) - -PROLOGUE(mpn_mod_1c) -deflit(`FRAME',0) - - movl PARAM_SIZE, %ecx - pushl %ebx FRAME_pushl() - - movl PARAM_SRC, %ebx - pushl %esi FRAME_pushl() - - movl PARAM_DIVISOR, %esi - orl %ecx, %ecx - - movl PARAM_CARRY, %edx - jnz LF(mpn_mod_1,top) - - popl %esi - movl %edx, %eax - - popl %ebx - - ret - -EPILOGUE() - - -PROLOGUE(mpn_mod_1) -deflit(`FRAME',0) - - movl PARAM_SIZE, %ecx - pushl %ebx FRAME_pushl() - - movl PARAM_SRC, %ebx - pushl %esi FRAME_pushl() - - orl %ecx, %ecx - jz L(done_zero) - - movl PARAM_DIVISOR, %esi - movl -4(%ebx,%ecx,4), %eax C src high limb - - cmpl %esi, %eax - - sbbl %edx, %edx C -1 if high 4-fold for that -C part of the function, but since it is not very large, that would be -C acceptable. -C -C The mul loop (at L(oopM)) might need some tweaking. It's current speed is -C unknown. - -defframe(PARAM_YSIZE,20) -defframe(PARAM_YP, 16) -defframe(PARAM_XSIZE,12) -defframe(PARAM_XP, 8) -defframe(PARAM_WP, 4) - -defframe(VAR_MULTIPLIER, -4) -defframe(VAR_COUNTER, -8) -deflit(VAR_STACK_SPACE, 8) - - .text - ALIGN(8) - -PROLOGUE(mpn_mul_basecase) -deflit(`FRAME',0) - - subl $VAR_STACK_SPACE,%esp - pushl %esi - pushl %ebp - pushl %edi -deflit(`FRAME',eval(VAR_STACK_SPACE+12)) - - movl PARAM_XP,%esi - movl PARAM_WP,%edi - movl PARAM_YP,%ebp - - movl (%esi),%eax C load xp[0] - mull (%ebp) C multiply by yp[0] - movl %eax,(%edi) C store to wp[0] - movl PARAM_XSIZE,%ecx C xsize - decl %ecx C If xsize = 1, ysize = 1 too - jz L(done) - - pushl %ebx -FRAME_pushl() - movl %edx,%ebx - - leal 4(%esi),%esi - leal 4(%edi),%edi - -L(oopM): - movl (%esi),%eax C load next limb at xp[j] - leal 4(%esi),%esi - mull (%ebp) - addl %ebx,%eax - movl %edx,%ebx - adcl $0,%ebx - movl %eax,(%edi) - leal 4(%edi),%edi - decl %ecx - jnz L(oopM) - - movl %ebx,(%edi) C most significant limb of product - addl $4,%edi C increment wp - movl PARAM_XSIZE,%eax - shll $2,%eax - subl %eax,%edi - subl %eax,%esi - - movl PARAM_YSIZE,%eax C ysize - decl %eax - jz L(skip) - movl %eax,VAR_COUNTER C set index i to ysize - -L(outer): - movl PARAM_YP,%ebp C yp - addl $4,%ebp C make ebp point to next v limb - movl %ebp,PARAM_YP - movl (%ebp),%eax C copy y limb ... - movl %eax,VAR_MULTIPLIER C ... to stack slot - movl PARAM_XSIZE,%ecx - - xorl %ebx,%ebx - andl $3,%ecx - jz L(end0) - -L(oop0): - movl (%esi),%eax - mull VAR_MULTIPLIER - leal 4(%esi),%esi - addl %ebx,%eax - movl $0,%ebx - adcl %ebx,%edx - addl %eax,(%edi) - adcl %edx,%ebx C propagate carry into cylimb - - leal 4(%edi),%edi - decl %ecx - jnz L(oop0) - -L(end0): - movl PARAM_XSIZE,%ecx - shrl $2,%ecx - jz L(endX) - - ALIGN(8) -L(oopX): - movl (%esi),%eax - mull VAR_MULTIPLIER - addl %eax,%ebx - movl $0,%ebp - adcl %edx,%ebp - - movl 4(%esi),%eax - mull VAR_MULTIPLIER - addl %ebx,(%edi) - adcl %eax,%ebp C new lo + cylimb - movl $0,%ebx - adcl %edx,%ebx - - movl 8(%esi),%eax - mull VAR_MULTIPLIER - addl %ebp,4(%edi) - adcl %eax,%ebx C new lo + cylimb - movl $0,%ebp - adcl %edx,%ebp - - movl 12(%esi),%eax - mull VAR_MULTIPLIER - addl %ebx,8(%edi) - adcl %eax,%ebp C new lo + cylimb - movl $0,%ebx - adcl %edx,%ebx - - addl %ebp,12(%edi) - adcl $0,%ebx C propagate carry into cylimb - - leal 16(%esi),%esi - leal 16(%edi),%edi - decl %ecx - jnz L(oopX) - -L(endX): - movl %ebx,(%edi) - addl $4,%edi - - C we incremented wp and xp in the loop above; compensate - movl PARAM_XSIZE,%eax - shll $2,%eax - subl %eax,%edi - subl %eax,%esi - - movl VAR_COUNTER,%eax - decl %eax - movl %eax,VAR_COUNTER - jnz L(outer) - -L(skip): - popl %ebx - popl %edi - popl %ebp - popl %esi - addl $8,%esp - ret - -L(done): - movl %edx,4(%edi) C store to wp[1] - popl %edi - popl %ebp - popl %esi - addl $8,%esp - ret - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/p6/README b/rts/gmp/mpn/x86/p6/README deleted file mode 100644 index 7dbc905..0000000 --- a/rts/gmp/mpn/x86/p6/README +++ /dev/null @@ -1,95 +0,0 @@ - - INTEL P6 MPN SUBROUTINES - - - -This directory contains code optimized for Intel P6 class CPUs, meaning -PentiumPro, Pentium II and Pentium III. The mmx and p3mmx subdirectories -have routines using MMX instructions. - - - -STATUS - -Times for the loops, with all code and data in L1 cache, are as follows. -Some of these might be able to be improved. - - cycles/limb - - mpn_add_n/sub_n 3.7 - - mpn_copyi 0.75 - mpn_copyd 2.4 - - mpn_divrem_1 39.0 - mpn_mod_1 39.0 - mpn_divexact_by3 8.5 - - mpn_mul_1 5.5 - mpn_addmul/submul_1 6.35 - - mpn_l/rshift 2.5 - - mpn_mul_basecase 8.2 cycles/crossproduct (approx) - mpn_sqr_basecase 4.0 cycles/crossproduct (approx) - or 7.75 cycles/triangleproduct (approx) - -Pentium II and III have MMX and get the following improvements. - - mpn_divrem_1 25.0 integer part, 17.5 fractional part - mpn_mod_1 24.0 - - mpn_l/rshift 1.75 - - - - -NOTES - -Write-allocate L1 data cache means prefetching of destinations is unnecessary. - -Mispredicted branches have a penalty of between 9 and 15 cycles, and even up -to 26 cycles depending how far speculative execution has gone. The 9 cycle -minimum penalty comes from the issue pipeline being 9 stages. - -A copy with rep movs seems to copy 16 bytes at a time, since speeds for 4, -5, 6 or 7 limb operations are all the same. The 0.75 cycles/limb would be 3 -cycles per 16 byte block. - - - - -CODING - -Instructions in general code have been shown grouped if they can execute -together, which means up to three instructions with no successive -dependencies, and with only the first being a multiple micro-op. - -P6 has out-of-order execution, so the groupings are really only showing -dependent paths where some shuffling might allow some latencies to be -hidden. - - - - -REFERENCES - -"Intel Architecture Optimization Reference Manual", 1999, revision 001 dated -02/99, order number 245127 (order number 730795-001 is in the document too). -Available on-line: - - http://download.intel.com/design/PentiumII/manuals/245127.htm - -"Intel Architecture Optimization Manual", 1997, order number 242816. This -is an older document mostly about P5 and not as good as the above. -Available on-line: - - http://download.intel.com/design/PentiumII/manuals/242816.htm - - - ----------------- -Local variables: -mode: text -fill-column: 76 -End: diff --git a/rts/gmp/mpn/x86/p6/aorsmul_1.asm b/rts/gmp/mpn/x86/p6/aorsmul_1.asm deleted file mode 100644 index feb364e..0000000 --- a/rts/gmp/mpn/x86/p6/aorsmul_1.asm +++ /dev/null @@ -1,300 +0,0 @@ -dnl Intel P6 mpn_addmul_1/mpn_submul_1 -- add or subtract mpn multiple. -dnl -dnl P6: 6.35 cycles/limb (at 16 limbs/loop). - - -dnl Copyright (C) 1999, 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -dnl P6 UNROLL_COUNT cycles/limb -dnl 8 6.7 -dnl 16 6.35 -dnl 32 6.3 -dnl 64 6.3 -dnl Maximum possible with the current code is 64. - -deflit(UNROLL_COUNT, 16) - - -ifdef(`OPERATION_addmul_1', ` - define(M4_inst, addl) - define(M4_function_1, mpn_addmul_1) - define(M4_function_1c, mpn_addmul_1c) - define(M4_description, add it to) - define(M4_desc_retval, carry) -',`ifdef(`OPERATION_submul_1', ` - define(M4_inst, subl) - define(M4_function_1, mpn_submul_1) - define(M4_function_1c, mpn_submul_1c) - define(M4_description, subtract it from) - define(M4_desc_retval, borrow) -',`m4_error(`Need OPERATION_addmul_1 or OPERATION_submul_1 -')')') - -MULFUNC_PROLOGUE(mpn_addmul_1 mpn_addmul_1c mpn_submul_1 mpn_submul_1c) - - -C mp_limb_t M4_function_1 (mp_ptr dst, mp_srcptr src, mp_size_t size, -C mp_limb_t mult); -C mp_limb_t M4_function_1c (mp_ptr dst, mp_srcptr src, mp_size_t size, -C mp_limb_t mult, mp_limb_t carry); -C -C Calculate src,size multiplied by mult and M4_description dst,size. -C Return the M4_desc_retval limb from the top of the result. -C -C This code is pretty much the same as the K6 code. The unrolled loop is -C the same, but there's just a few scheduling tweaks in the setups and the -C simple loop. -C -C A number of variations have been tried for the unrolled loop, with one or -C two carries, and with loads scheduled earlier, but nothing faster than 6 -C cycles/limb has been found. - -ifdef(`PIC',` -deflit(UNROLL_THRESHOLD, 5) -',` -deflit(UNROLL_THRESHOLD, 5) -') - -defframe(PARAM_CARRY, 20) -defframe(PARAM_MULTIPLIER,16) -defframe(PARAM_SIZE, 12) -defframe(PARAM_SRC, 8) -defframe(PARAM_DST, 4) - - .text - ALIGN(32) - -PROLOGUE(M4_function_1c) - pushl %ebx -deflit(`FRAME',4) - movl PARAM_CARRY, %ebx - jmp LF(M4_function_1,start_nc) -EPILOGUE() - -PROLOGUE(M4_function_1) - push %ebx -deflit(`FRAME',4) - xorl %ebx, %ebx C initial carry - -L(start_nc): - movl PARAM_SIZE, %ecx - pushl %esi -deflit(`FRAME',8) - - movl PARAM_SRC, %esi - pushl %edi -deflit(`FRAME',12) - - movl PARAM_DST, %edi - pushl %ebp -deflit(`FRAME',16) - cmpl $UNROLL_THRESHOLD, %ecx - - movl PARAM_MULTIPLIER, %ebp - jae L(unroll) - - - C simple loop - C this is offset 0x22, so close enough to aligned -L(simple): - C eax scratch - C ebx carry - C ecx counter - C edx scratch - C esi src - C edi dst - C ebp multiplier - - movl (%esi), %eax - addl $4, %edi - - mull %ebp - - addl %ebx, %eax - adcl $0, %edx - - M4_inst %eax, -4(%edi) - movl %edx, %ebx - - adcl $0, %ebx - decl %ecx - - leal 4(%esi), %esi - jnz L(simple) - - - popl %ebp - popl %edi - - popl %esi - movl %ebx, %eax - - popl %ebx - ret - - - -C------------------------------------------------------------------------------ -C VAR_JUMP holds the computed jump temporarily because there's not enough -C registers when doing the mul for the initial two carry limbs. -C -C The add/adc for the initial carry in %ebx is necessary only for the -C mpn_add/submul_1c entry points. Duplicating the startup code to -C eliminiate this for the plain mpn_add/submul_1 doesn't seem like a good -C idea. - -dnl overlapping with parameters already fetched -define(VAR_COUNTER,`PARAM_SIZE') -define(VAR_JUMP, `PARAM_DST') - - C this is offset 0x43, so close enough to aligned -L(unroll): - C eax - C ebx initial carry - C ecx size - C edx - C esi src - C edi dst - C ebp - - movl %ecx, %edx - decl %ecx - - subl $2, %edx - negl %ecx - - shrl $UNROLL_LOG2, %edx - andl $UNROLL_MASK, %ecx - - movl %edx, VAR_COUNTER - movl %ecx, %edx - - C 15 code bytes per limb -ifdef(`PIC',` - call L(pic_calc) -L(here): -',` - shll $4, %edx - negl %ecx - - leal L(entry) (%edx,%ecx,1), %edx -') - movl (%esi), %eax C src low limb - - movl %edx, VAR_JUMP - leal ifelse(UNROLL_BYTES,256,128+) 4(%esi,%ecx,4), %esi - - mull %ebp - - addl %ebx, %eax C initial carry (from _1c) - adcl $0, %edx - - movl %edx, %ebx C high carry - leal ifelse(UNROLL_BYTES,256,128) (%edi,%ecx,4), %edi - - movl VAR_JUMP, %edx - testl $1, %ecx - movl %eax, %ecx C low carry - - cmovnz( %ebx, %ecx) C high,low carry other way around - cmovnz( %eax, %ebx) - - jmp *%edx - - -ifdef(`PIC',` -L(pic_calc): - shll $4, %edx - negl %ecx - - C See README.family about old gas bugs - leal (%edx,%ecx,1), %edx - addl $L(entry)-L(here), %edx - - addl (%esp), %edx - - ret -') - - -C ----------------------------------------------------------- - ALIGN(32) -L(top): -deflit(`FRAME',16) - C eax scratch - C ebx carry hi - C ecx carry lo - C edx scratch - C esi src - C edi dst - C ebp multiplier - C - C VAR_COUNTER loop counter - C - C 15 code bytes per limb - - addl $UNROLL_BYTES, %edi - -L(entry): -deflit(CHUNK_COUNT,2) -forloop(`i', 0, UNROLL_COUNT/CHUNK_COUNT-1, ` - deflit(`disp0', eval(i*4*CHUNK_COUNT ifelse(UNROLL_BYTES,256,-128))) - deflit(`disp1', eval(disp0 + 4)) - -Zdisp( movl, disp0,(%esi), %eax) - mull %ebp -Zdisp( M4_inst,%ecx, disp0,(%edi)) - adcl %eax, %ebx - movl %edx, %ecx - adcl $0, %ecx - - movl disp1(%esi), %eax - mull %ebp - M4_inst %ebx, disp1(%edi) - adcl %eax, %ecx - movl %edx, %ebx - adcl $0, %ebx -') - - decl VAR_COUNTER - leal UNROLL_BYTES(%esi), %esi - - jns L(top) - - -deflit(`disp0', eval(UNROLL_BYTES ifelse(UNROLL_BYTES,256,-128))) - - M4_inst %ecx, disp0(%edi) - movl %ebx, %eax - - popl %ebp - popl %edi - - popl %esi - popl %ebx - adcl $0, %eax - - ret - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/p6/diveby3.asm b/rts/gmp/mpn/x86/p6/diveby3.asm deleted file mode 100644 index a77703e..0000000 --- a/rts/gmp/mpn/x86/p6/diveby3.asm +++ /dev/null @@ -1,37 +0,0 @@ -dnl Intel P6 mpn_divexact_by3 -- mpn division by 3, expecting no remainder. -dnl -dnl P6: 8.5 cycles/limb - - -dnl Copyright (C) 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -dnl The P5 code runs well on P6, in fact better than anything else found so -dnl far. An imul is 4 cycles, meaning the two cmp/sbbl pairs on the -dnl dependent path are taking 4.5 cycles. -dnl -dnl The destination cache line prefetching is unnecessary on P6, but -dnl removing it is a 2 cycle slowdown (approx), so it must be inducing -dnl something good in the out of order execution. - -include(`../config.m4') - -MULFUNC_PROLOGUE(mpn_divexact_by3c) -include_mpn(`x86/pentium/diveby3.asm') diff --git a/rts/gmp/mpn/x86/p6/gmp-mparam.h b/rts/gmp/mpn/x86/p6/gmp-mparam.h deleted file mode 100644 index d7bfb6d..0000000 --- a/rts/gmp/mpn/x86/p6/gmp-mparam.h +++ /dev/null @@ -1,96 +0,0 @@ -/* Intel P6 gmp-mparam.h -- Compiler/machine parameter header file. - -Copyright (C) 1991, 1993, 1994, 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. */ - - -#define BITS_PER_MP_LIMB 32 -#define BYTES_PER_MP_LIMB 4 -#define BITS_PER_LONGINT 32 -#define BITS_PER_INT 32 -#define BITS_PER_SHORTINT 16 -#define BITS_PER_CHAR 8 - - -#ifndef UMUL_TIME -#define UMUL_TIME 5 /* cycles */ -#endif -#ifndef UDIV_TIME -#define UDIV_TIME 39 /* cycles */ -#endif - -#ifndef COUNT_TRAILING_ZEROS_TIME -#define COUNT_TRAILING_ZEROS_TIME 2 /* cycles */ -#endif - - -/* Generated by tuneup.c, 2000-07-06. */ - -#ifndef KARATSUBA_MUL_THRESHOLD -#define KARATSUBA_MUL_THRESHOLD 23 -#endif -#ifndef TOOM3_MUL_THRESHOLD -#define TOOM3_MUL_THRESHOLD 139 -#endif - -#ifndef KARATSUBA_SQR_THRESHOLD -#define KARATSUBA_SQR_THRESHOLD 52 -#endif -#ifndef TOOM3_SQR_THRESHOLD -#define TOOM3_SQR_THRESHOLD 166 -#endif - -#ifndef BZ_THRESHOLD -#define BZ_THRESHOLD 116 -#endif - -#ifndef FIB_THRESHOLD -#define FIB_THRESHOLD 66 -#endif - -#ifndef POWM_THRESHOLD -#define POWM_THRESHOLD 20 -#endif - -#ifndef GCD_ACCEL_THRESHOLD -#define GCD_ACCEL_THRESHOLD 4 -#endif -#ifndef GCDEXT_THRESHOLD -#define GCDEXT_THRESHOLD 54 -#endif - -#ifndef FFT_MUL_TABLE -#define FFT_MUL_TABLE { 592, 1440, 2688, 5632, 14336, 40960, 0 } -#endif -#ifndef FFT_MODF_MUL_THRESHOLD -#define FFT_MODF_MUL_THRESHOLD 608 -#endif -#ifndef FFT_MUL_THRESHOLD -#define FFT_MUL_THRESHOLD 5888 -#endif - -#ifndef FFT_SQR_TABLE -#define FFT_SQR_TABLE { 656, 1504, 2944, 6656, 18432, 57344, 0 } -#endif -#ifndef FFT_MODF_SQR_THRESHOLD -#define FFT_MODF_SQR_THRESHOLD 672 -#endif -#ifndef FFT_SQR_THRESHOLD -#define FFT_SQR_THRESHOLD 5888 -#endif diff --git a/rts/gmp/mpn/x86/p6/mmx/divrem_1.asm b/rts/gmp/mpn/x86/p6/mmx/divrem_1.asm deleted file mode 100644 index f1b011b..0000000 --- a/rts/gmp/mpn/x86/p6/mmx/divrem_1.asm +++ /dev/null @@ -1,677 +0,0 @@ -dnl Intel Pentium-II mpn_divrem_1 -- mpn by limb division. -dnl -dnl P6MMX: 25.0 cycles/limb integer part, 17.5 cycles/limb fraction part. - - -dnl Copyright (C) 1999, 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -C mp_limb_t mpn_divrem_1 (mp_ptr dst, mp_size_t xsize, -C mp_srcptr src, mp_size_t size, -C mp_limb_t divisor); -C mp_limb_t mpn_divrem_1c (mp_ptr dst, mp_size_t xsize, -C mp_srcptr src, mp_size_t size, -C mp_limb_t divisor, mp_limb_t carry); -C -C This code is a lightly reworked version of mpn/x86/k7/mmx/divrem_1.asm, -C see that file for some comments. It's likely what's here can be improved. - - -dnl MUL_THRESHOLD is the value of xsize+size at which the multiply by -dnl inverse method is used, rather than plain "divl"s. Minimum value 1. -dnl -dnl The different speeds of the integer and fraction parts means that using -dnl xsize+size isn't quite right. The threshold wants to be a bit higher -dnl for the integer part and a bit lower for the fraction part. (Or what's -dnl really wanted is to speed up the integer part!) -dnl -dnl The threshold is set to make the integer part right. At 4 limbs the -dnl div and mul are about the same there, but on the fractional part the -dnl mul is much faster. - -deflit(MUL_THRESHOLD, 4) - - -defframe(PARAM_CARRY, 24) -defframe(PARAM_DIVISOR,20) -defframe(PARAM_SIZE, 16) -defframe(PARAM_SRC, 12) -defframe(PARAM_XSIZE, 8) -defframe(PARAM_DST, 4) - -defframe(SAVE_EBX, -4) -defframe(SAVE_ESI, -8) -defframe(SAVE_EDI, -12) -defframe(SAVE_EBP, -16) - -defframe(VAR_NORM, -20) -defframe(VAR_INVERSE, -24) -defframe(VAR_SRC, -28) -defframe(VAR_DST, -32) -defframe(VAR_DST_STOP,-36) - -deflit(STACK_SPACE, 36) - - .text - ALIGN(16) - -PROLOGUE(mpn_divrem_1c) -deflit(`FRAME',0) - movl PARAM_CARRY, %edx - - movl PARAM_SIZE, %ecx - subl $STACK_SPACE, %esp -deflit(`FRAME',STACK_SPACE) - - movl %ebx, SAVE_EBX - movl PARAM_XSIZE, %ebx - - movl %edi, SAVE_EDI - movl PARAM_DST, %edi - - movl %ebp, SAVE_EBP - movl PARAM_DIVISOR, %ebp - - movl %esi, SAVE_ESI - movl PARAM_SRC, %esi - - leal -4(%edi,%ebx,4), %edi - jmp LF(mpn_divrem_1,start_1c) - -EPILOGUE() - - - C offset 0x31, close enough to aligned -PROLOGUE(mpn_divrem_1) -deflit(`FRAME',0) - - movl PARAM_SIZE, %ecx - movl $0, %edx C initial carry (if can't skip a div) - subl $STACK_SPACE, %esp -deflit(`FRAME',STACK_SPACE) - - movl %ebp, SAVE_EBP - movl PARAM_DIVISOR, %ebp - - movl %ebx, SAVE_EBX - movl PARAM_XSIZE, %ebx - - movl %esi, SAVE_ESI - movl PARAM_SRC, %esi - orl %ecx, %ecx - - movl %edi, SAVE_EDI - movl PARAM_DST, %edi - - leal -4(%edi,%ebx,4), %edi C &dst[xsize-1] - jz L(no_skip_div) - - movl -4(%esi,%ecx,4), %eax C src high limb - cmpl %ebp, %eax C one less div if high=MUL_THRESHOLD, so with size==0 then - C must have xsize!=0 - jmp L(fraction_some) - - - -C ----------------------------------------------------------------------------- -C -C This loop runs at about 25 cycles, which is probably sub-optimal, and -C certainly more than the dependent chain would suggest. A better loop, or -C a better rough analysis of what's possible, would be welcomed. -C -C In the current implementation, the following successively dependent -C micro-ops seem to exist. -C -C uops -C n2+n1 1 (addl) -C mul 5 -C q1+1 3 (addl/adcl) -C mul 5 -C sub 3 (subl/sbbl) -C addback 2 (cmov) -C --- -C 19 -C -C Lack of registers hinders explicit scheduling and it might be that the -C normal out of order execution isn't able to hide enough under the mul -C latencies. -C -C Using sarl/negl to pick out n1 for the n2+n1 stage is a touch faster than -C cmov (and takes one uop off the dependent chain). A sarl/andl/addl -C combination was tried for the addback (despite the fact it would lengthen -C the dependent chain) but found to be no faster. - - - ALIGN(16) -L(integer_top): - C eax scratch - C ebx scratch (nadj, q1) - C ecx scratch (src, dst) - C edx scratch - C esi n10 - C edi n2 - C ebp d - C - C mm0 scratch (src qword) - C mm7 rshift for normalization - - movl %esi, %eax - movl %ebp, %ebx - - sarl $31, %eax C -n1 - movl VAR_SRC, %ecx - - andl %eax, %ebx C -n1 & d - negl %eax C n1 - - addl %esi, %ebx C nadj = n10 + (-n1 & d), ignoring overflow - addl %edi, %eax C n2+n1 - movq (%ecx), %mm0 C next src limb and the one below it - - mull VAR_INVERSE C m*(n2+n1) - - subl $4, %ecx - - movl %ecx, VAR_SRC - - C - - C - - addl %ebx, %eax C m*(n2+n1) + nadj, low giving carry flag - movl %ebp, %eax C d - leal 1(%edi), %ebx C n2<<32 + m*(n2+n1)) - - adcl %edx, %ebx C 1 + high(n2<<32 + m*(n2+n1) + nadj) = q1+1 - jz L(q1_ff) - - mull %ebx C (q1+1)*d - - movl VAR_DST, %ecx - psrlq %mm7, %mm0 - - C - - C - - C - - subl %eax, %esi - movl VAR_DST_STOP, %eax - - sbbl %edx, %edi C n - (q1+1)*d - movl %esi, %edi C remainder -> n2 - leal (%ebp,%esi), %edx - - cmovc( %edx, %edi) C n - q1*d if underflow from using q1+1 - movd %mm0, %esi - - sbbl $0, %ebx C q - subl $4, %ecx - - movl %ebx, (%ecx) - cmpl %eax, %ecx - - movl %ecx, VAR_DST - jne L(integer_top) - - -L(integer_loop_done): - - -C ----------------------------------------------------------------------------- -C -C Here, and in integer_one_left below, an sbbl $0 is used rather than a jz -C q1_ff special case. This make the code a bit smaller and simpler, and -C costs only 2 cycles (each). - -L(integer_two_left): - C eax scratch - C ebx scratch (nadj, q1) - C ecx scratch (src, dst) - C edx scratch - C esi n10 - C edi n2 - C ebp divisor - C - C mm0 src limb, shifted - C mm7 rshift - - - movl %esi, %eax - movl %ebp, %ebx - - sarl $31, %eax C -n1 - movl PARAM_SRC, %ecx - - andl %eax, %ebx C -n1 & d - negl %eax C n1 - - addl %esi, %ebx C nadj = n10 + (-n1 & d), ignoring overflow - addl %edi, %eax C n2+n1 - - mull VAR_INVERSE C m*(n2+n1) - - movd (%ecx), %mm0 C src low limb - - movl VAR_DST_STOP, %ecx - - C - - C - - addl %ebx, %eax C m*(n2+n1) + nadj, low giving carry flag - leal 1(%edi), %ebx C n2<<32 + m*(n2+n1)) - movl %ebp, %eax C d - - adcl %edx, %ebx C 1 + high(n2<<32 + m*(n2+n1) + nadj) = q1+1 - - sbbl $0, %ebx - - mull %ebx C (q1+1)*d - - psllq $32, %mm0 - - psrlq %mm7, %mm0 - - C - - C - - subl %eax, %esi - - sbbl %edx, %edi C n - (q1+1)*d - movl %esi, %edi C remainder -> n2 - leal (%ebp,%esi), %edx - - cmovc( %edx, %edi) C n - q1*d if underflow from using q1+1 - movd %mm0, %esi - - sbbl $0, %ebx C q - - movl %ebx, -4(%ecx) - - -C ----------------------------------------------------------------------------- -L(integer_one_left): - C eax scratch - C ebx scratch (nadj, q1) - C ecx scratch (dst) - C edx scratch - C esi n10 - C edi n2 - C ebp divisor - C - C mm0 src limb, shifted - C mm7 rshift - - - movl %esi, %eax - movl %ebp, %ebx - - sarl $31, %eax C -n1 - movl VAR_DST_STOP, %ecx - - andl %eax, %ebx C -n1 & d - negl %eax C n1 - - addl %esi, %ebx C nadj = n10 + (-n1 & d), ignoring overflow - addl %edi, %eax C n2+n1 - - mull VAR_INVERSE C m*(n2+n1) - - C - - C - - C - - addl %ebx, %eax C m*(n2+n1) + nadj, low giving carry flag - leal 1(%edi), %ebx C n2<<32 + m*(n2+n1)) - movl %ebp, %eax C d - - C - - adcl %edx, %ebx C 1 + high(n2<<32 + m*(n2+n1) + nadj) = q1+1 - - sbbl $0, %ebx C q1 if q1+1 overflowed - - mull %ebx - - C - - C - - C - - C - - subl %eax, %esi - movl PARAM_XSIZE, %eax - - sbbl %edx, %edi C n - (q1+1)*d - movl %esi, %edi C remainder -> n2 - leal (%ebp,%esi), %edx - - cmovc( %edx, %edi) C n - q1*d if underflow from using q1+1 - - sbbl $0, %ebx C q - - movl %ebx, -8(%ecx) - subl $8, %ecx - - - - orl %eax, %eax C xsize - jnz L(fraction_some) - - movl %edi, %eax -L(fraction_done): - movl VAR_NORM, %ecx - movl SAVE_EBP, %ebp - - movl SAVE_EDI, %edi - - movl SAVE_ESI, %esi - - movl SAVE_EBX, %ebx - addl $STACK_SPACE, %esp - - shrl %cl, %eax - emms - - ret - - -C ----------------------------------------------------------------------------- -C -C Special case for q1=0xFFFFFFFF, giving q=0xFFFFFFFF meaning the low dword -C of q*d is simply -d and the remainder n-q*d = n10+d - -L(q1_ff): - C eax (divisor) - C ebx (q1+1 == 0) - C ecx - C edx - C esi n10 - C edi n2 - C ebp divisor - - movl VAR_DST, %ecx - movl VAR_DST_STOP, %edx - subl $4, %ecx - - movl %ecx, VAR_DST - psrlq %mm7, %mm0 - leal (%ebp,%esi), %edi C n-q*d remainder -> next n2 - - movl $-1, (%ecx) - movd %mm0, %esi C next n10 - - cmpl %ecx, %edx - jne L(integer_top) - - jmp L(integer_loop_done) - - - -C ----------------------------------------------------------------------------- -C -C In the current implementation, the following successively dependent -C micro-ops seem to exist. -C -C uops -C mul 5 -C q1+1 1 (addl) -C mul 5 -C sub 3 (negl/sbbl) -C addback 2 (cmov) -C --- -C 16 -C -C The loop in fact runs at about 17.5 cycles. Using a sarl/andl/addl for -C the addback was found to be a touch slower. - - - ALIGN(16) -L(fraction_some): - C eax - C ebx - C ecx - C edx - C esi - C edi carry - C ebp divisor - - movl PARAM_DST, %esi - movl VAR_DST_STOP, %ecx - movl %edi, %eax - - subl $8, %ecx - - - ALIGN(16) -L(fraction_top): - C eax n2, then scratch - C ebx scratch (nadj, q1) - C ecx dst, decrementing - C edx scratch - C esi dst stop point - C edi n2 - C ebp divisor - - mull VAR_INVERSE C m*n2 - - movl %ebp, %eax C d - subl $4, %ecx C dst - leal 1(%edi), %ebx - - C - - C - - C - - addl %edx, %ebx C 1 + high(n2<<32 + m*n2) = q1+1 - - mull %ebx C (q1+1)*d - - C - - C - - C - - C - - negl %eax C low of n - (q1+1)*d - - sbbl %edx, %edi C high of n - (q1+1)*d, caring only about carry - leal (%ebp,%eax), %edx - - cmovc( %edx, %eax) C n - q1*d if underflow from using q1+1 - - sbbl $0, %ebx C q - movl %eax, %edi C remainder->n2 - cmpl %esi, %ecx - - movl %ebx, (%ecx) C previous q - jne L(fraction_top) - - - jmp L(fraction_done) - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/p6/mmx/mod_1.asm b/rts/gmp/mpn/x86/p6/mmx/mod_1.asm deleted file mode 100644 index e7d8d94..0000000 --- a/rts/gmp/mpn/x86/p6/mmx/mod_1.asm +++ /dev/null @@ -1,444 +0,0 @@ -dnl Intel Pentium-II mpn_mod_1 -- mpn by limb remainder. -dnl -dnl P6MMX: 24.0 cycles/limb. - - -dnl Copyright (C) 1999, 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -C mp_limb_t mpn_mod_1 (mp_srcptr src, mp_size_t size, mp_limb_t divisor); -C mp_limb_t mpn_mod_1c (mp_srcptr src, mp_size_t size, mp_limb_t divisor, -C mp_limb_t carry); -C -C The code here very similar to mpn_divrem_1, but with the quotient -C discarded. What's here probably isn't optimal. -C -C See mpn/x86/p6/mmx/divrem_1.c and mpn/x86/k7/mmx/mod_1.asm for some -C comments. - - -dnl MUL_THRESHOLD is the size at which the multiply by inverse method is -dnl used, rather than plain "divl"s. Minimum value 2. - -deflit(MUL_THRESHOLD, 4) - - -defframe(PARAM_CARRY, 16) -defframe(PARAM_DIVISOR,12) -defframe(PARAM_SIZE, 8) -defframe(PARAM_SRC, 4) - -defframe(SAVE_EBX, -4) -defframe(SAVE_ESI, -8) -defframe(SAVE_EDI, -12) -defframe(SAVE_EBP, -16) - -defframe(VAR_NORM, -20) -defframe(VAR_INVERSE, -24) -defframe(VAR_SRC_STOP,-28) - -deflit(STACK_SPACE, 28) - - .text - ALIGN(16) - -PROLOGUE(mpn_mod_1c) -deflit(`FRAME',0) - movl PARAM_CARRY, %edx - movl PARAM_SIZE, %ecx - subl $STACK_SPACE, %esp -deflit(`FRAME',STACK_SPACE) - - movl %ebp, SAVE_EBP - movl PARAM_DIVISOR, %ebp - - movl %esi, SAVE_ESI - movl PARAM_SRC, %esi - jmp LF(mpn_mod_1,start_1c) - -EPILOGUE() - - - ALIGN(16) -PROLOGUE(mpn_mod_1) -deflit(`FRAME',0) - - movl $0, %edx C initial carry (if can't skip a div) - movl PARAM_SIZE, %ecx - subl $STACK_SPACE, %esp -deflit(`FRAME',STACK_SPACE) - - movl %esi, SAVE_ESI - movl PARAM_SRC, %esi - - movl %ebp, SAVE_EBP - movl PARAM_DIVISOR, %ebp - - orl %ecx, %ecx - jz L(divide_done) - - movl -4(%esi,%ecx,4), %eax C src high limb - - cmpl %ebp, %eax C carry flag if high n2 - leal (%ebp,%esi), %edx - - cmovc( %edx, %edi) C n - q1*d if underflow from using q1+1 - movd %mm0, %esi - cmpl %ebx, %ecx - - jne L(inverse_top) - - -L(inverse_loop_done): - - -C ----------------------------------------------------------------------------- - -L(inverse_two_left): - C eax scratch - C ebx scratch (nadj, q1) - C ecx &src[-1] - C edx scratch - C esi n10 - C edi n2 - C ebp divisor - C - C mm0 scratch (src dword) - C mm7 rshift - - movl %esi, %eax - movl %ebp, %ebx - - sarl $31, %eax C -n1 - - andl %eax, %ebx C -n1 & d - negl %eax C n1 - - addl %esi, %ebx C nadj = n10 + (-n1 & d), ignoring overflow - addl %edi, %eax C n2+n1 - - mull VAR_INVERSE C m*(n2+n1) - - movd 4(%ecx), %mm0 C src low limb - - C - - C - - C - - addl %ebx, %eax C m*(n2+n1) + nadj, low giving carry flag - leal 1(%edi), %ebx C n2<<32 + m*(n2+n1)) - - adcl %edx, %ebx C 1 + high(n2<<32 + m*(n2+n1) + nadj) = q1+1 - - sbbl $0, %ebx - movl %ebp, %eax C d - - mull %ebx C (q1+1)*d - - psllq $32, %mm0 - - psrlq %mm7, %mm0 - - C - - C - - subl %eax, %esi - - sbbl %edx, %edi C n - (q1+1)*d - movl %esi, %edi C remainder -> n2 - leal (%ebp,%esi), %edx - - cmovc( %edx, %edi) C n - q1*d if underflow from using q1+1 - movd %mm0, %esi - - -C One limb left - - C eax scratch - C ebx scratch (nadj, q1) - C ecx - C edx scratch - C esi n10 - C edi n2 - C ebp divisor - C - C mm0 src limb, shifted - C mm7 rshift - - movl %esi, %eax - movl %ebp, %ebx - - sarl $31, %eax C -n1 - - andl %eax, %ebx C -n1 & d - negl %eax C n1 - - addl %esi, %ebx C nadj = n10 + (-n1 & d), ignoring overflow - addl %edi, %eax C n2+n1 - - mull VAR_INVERSE C m*(n2+n1) - - movl VAR_NORM, %ecx C for final denorm - - C - - C - - C - - addl %ebx, %eax C m*(n2+n1) + nadj, low giving carry flag - leal 1(%edi), %ebx C n2<<32 + m*(n2+n1)) - - adcl %edx, %ebx C 1 + high(n2<<32 + m*(n2+n1) + nadj) = q1+1 - - sbbl $0, %ebx - movl %ebp, %eax C d - - mull %ebx C (q1+1)*d - - movl SAVE_EBX, %ebx - - C - - C - - C - - subl %eax, %esi - - sbbl %edx, %edi C n - (q1+1)*d - leal (%ebp,%esi), %edx - movl SAVE_EBP, %ebp - - movl %esi, %eax C remainder - movl SAVE_ESI, %esi - - cmovc( %edx, %eax) C n - q1*d if underflow from using q1+1 - movl SAVE_EDI, %edi - - shrl %cl, %eax C denorm remainder - addl $STACK_SPACE, %esp - emms - - ret - - -C ----------------------------------------------------------------------------- -C -C Special case for q1=0xFFFFFFFF, giving q=0xFFFFFFFF meaning the low dword -C of q*d is simply -d and the remainder n-q*d = n10+d - -L(q1_ff): - C eax (divisor) - C ebx (q1+1 == 0) - C ecx src pointer - C edx - C esi n10 - C edi (n2) - C ebp divisor - - leal (%ebp,%esi), %edi C n-q*d remainder -> next n2 - movl VAR_SRC_STOP, %edx - psrlq %mm7, %mm0 - - movd %mm0, %esi C next n10 - cmpl %ecx, %edx - jne L(inverse_top) - - jmp L(inverse_loop_done) - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/p6/mmx/popham.asm b/rts/gmp/mpn/x86/p6/mmx/popham.asm deleted file mode 100644 index 50f9a11..0000000 --- a/rts/gmp/mpn/x86/p6/mmx/popham.asm +++ /dev/null @@ -1,31 +0,0 @@ -dnl Intel Pentium-II mpn_popcount, mpn_hamdist -- population count and -dnl hamming distance. -dnl -dnl P6MMX: popcount 11 cycles/limb (approx), hamdist 11.5 cycles/limb -dnl (approx) - - -dnl Copyright (C) 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - -MULFUNC_PROLOGUE(mpn_popcount mpn_hamdist) -include_mpn(`x86/k6/mmx/popham.asm') diff --git a/rts/gmp/mpn/x86/p6/p3mmx/popham.asm b/rts/gmp/mpn/x86/p6/p3mmx/popham.asm deleted file mode 100644 index e63fbf3..0000000 --- a/rts/gmp/mpn/x86/p6/p3mmx/popham.asm +++ /dev/null @@ -1,30 +0,0 @@ -dnl Intel Pentium-III mpn_popcount, mpn_hamdist -- population count and -dnl hamming distance. - -dnl Copyright (C) 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -dnl Haven't actually measured it, but the K7 code with the psadbw should be -dnl good on P-III. - -include(`../config.m4') - -MULFUNC_PROLOGUE(mpn_popcount mpn_hamdist) -include_mpn(`x86/k7/mmx/popham.asm') diff --git a/rts/gmp/mpn/x86/p6/sqr_basecase.asm b/rts/gmp/mpn/x86/p6/sqr_basecase.asm deleted file mode 100644 index 174c784..0000000 --- a/rts/gmp/mpn/x86/p6/sqr_basecase.asm +++ /dev/null @@ -1,641 +0,0 @@ -dnl Intel P6 mpn_sqr_basecase -- square an mpn number. -dnl -dnl P6: approx 4.0 cycles per cross product, or 7.75 cycles per triangular -dnl product (measured on the speed difference between 20 and 40 limbs, -dnl which is the Karatsuba recursing range). - - -dnl Copyright (C) 1999, 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -dnl These are the same as in mpn/x86/k6/sqr_basecase.asm, see that file for -dnl a description. The only difference here is that UNROLL_COUNT can go up -dnl to 64 (not 63) making KARATSUBA_SQR_THRESHOLD_MAX 67. - -deflit(KARATSUBA_SQR_THRESHOLD_MAX, 67) - -ifdef(`KARATSUBA_SQR_THRESHOLD_OVERRIDE', -`define(`KARATSUBA_SQR_THRESHOLD',KARATSUBA_SQR_THRESHOLD_OVERRIDE)') - -m4_config_gmp_mparam(`KARATSUBA_SQR_THRESHOLD') -deflit(UNROLL_COUNT, eval(KARATSUBA_SQR_THRESHOLD-3)) - - -C void mpn_sqr_basecase (mp_ptr dst, mp_srcptr src, mp_size_t size); -C -C The algorithm is basically the same as mpn/generic/sqr_basecase.c, but a -C lot of function call overheads are avoided, especially when the given size -C is small. -C -C The code size might look a bit excessive, but not all of it is executed so -C it won't all get into the code cache. The 1x1, 2x2 and 3x3 special cases -C clearly apply only to those sizes; mid sizes like 10x10 only need part of -C the unrolled addmul; and big sizes like 40x40 that do use the full -C unrolling will least be making good use of it, because 40x40 will take -C something like 7000 cycles. - -defframe(PARAM_SIZE,12) -defframe(PARAM_SRC, 8) -defframe(PARAM_DST, 4) - - .text - ALIGN(32) -PROLOGUE(mpn_sqr_basecase) -deflit(`FRAME',0) - - movl PARAM_SIZE, %edx - - movl PARAM_SRC, %eax - - cmpl $2, %edx - movl PARAM_DST, %ecx - je L(two_limbs) - - movl (%eax), %eax - ja L(three_or_more) - - -C ----------------------------------------------------------------------------- -C one limb only - C eax src limb - C ebx - C ecx dst - C edx - - mull %eax - - movl %eax, (%ecx) - movl %edx, 4(%ecx) - - ret - - -C ----------------------------------------------------------------------------- -L(two_limbs): - C eax src - C ebx - C ecx dst - C edx - -defframe(SAVE_ESI, -4) -defframe(SAVE_EBX, -8) -defframe(SAVE_EDI, -12) -defframe(SAVE_EBP, -16) -deflit(`STACK_SPACE',16) - - subl $STACK_SPACE, %esp -deflit(`FRAME',STACK_SPACE) - - movl %esi, SAVE_ESI - movl %eax, %esi - movl (%eax), %eax - - mull %eax C src[0]^2 - - movl %eax, (%ecx) C dst[0] - movl 4(%esi), %eax - - movl %ebx, SAVE_EBX - movl %edx, %ebx C dst[1] - - mull %eax C src[1]^2 - - movl %edi, SAVE_EDI - movl %eax, %edi C dst[2] - movl (%esi), %eax - - movl %ebp, SAVE_EBP - movl %edx, %ebp C dst[3] - - mull 4(%esi) C src[0]*src[1] - - addl %eax, %ebx - movl SAVE_ESI, %esi - - adcl %edx, %edi - - adcl $0, %ebp - addl %ebx, %eax - movl SAVE_EBX, %ebx - - adcl %edi, %edx - movl SAVE_EDI, %edi - - adcl $0, %ebp - - movl %eax, 4(%ecx) - - movl %ebp, 12(%ecx) - movl SAVE_EBP, %ebp - - movl %edx, 8(%ecx) - addl $FRAME, %esp - - ret - - -C ----------------------------------------------------------------------------- -L(three_or_more): - C eax src low limb - C ebx - C ecx dst - C edx size -deflit(`FRAME',0) - - pushl %esi defframe_pushl(`SAVE_ESI') - cmpl $4, %edx - - movl PARAM_SRC, %esi - jae L(four_or_more) - - -C ----------------------------------------------------------------------------- -C three limbs - - C eax src low limb - C ebx - C ecx dst - C edx - C esi src - C edi - C ebp - - pushl %ebp defframe_pushl(`SAVE_EBP') - pushl %edi defframe_pushl(`SAVE_EDI') - - mull %eax C src[0] ^ 2 - - movl %eax, (%ecx) - movl %edx, 4(%ecx) - - movl 4(%esi), %eax - xorl %ebp, %ebp - - mull %eax C src[1] ^ 2 - - movl %eax, 8(%ecx) - movl %edx, 12(%ecx) - movl 8(%esi), %eax - - pushl %ebx defframe_pushl(`SAVE_EBX') - - mull %eax C src[2] ^ 2 - - movl %eax, 16(%ecx) - movl %edx, 20(%ecx) - - movl (%esi), %eax - - mull 4(%esi) C src[0] * src[1] - - movl %eax, %ebx - movl %edx, %edi - - movl (%esi), %eax - - mull 8(%esi) C src[0] * src[2] - - addl %eax, %edi - movl %edx, %ebp - - adcl $0, %ebp - movl 4(%esi), %eax - - mull 8(%esi) C src[1] * src[2] - - xorl %esi, %esi - addl %eax, %ebp - - C eax - C ebx dst[1] - C ecx dst - C edx dst[4] - C esi zero, will be dst[5] - C edi dst[2] - C ebp dst[3] - - adcl $0, %edx - addl %ebx, %ebx - - adcl %edi, %edi - - adcl %ebp, %ebp - - adcl %edx, %edx - movl 4(%ecx), %eax - - adcl $0, %esi - addl %ebx, %eax - - movl %eax, 4(%ecx) - movl 8(%ecx), %eax - - adcl %edi, %eax - movl 12(%ecx), %ebx - - adcl %ebp, %ebx - movl 16(%ecx), %edi - - movl %eax, 8(%ecx) - movl SAVE_EBP, %ebp - - movl %ebx, 12(%ecx) - movl SAVE_EBX, %ebx - - adcl %edx, %edi - movl 20(%ecx), %eax - - movl %edi, 16(%ecx) - movl SAVE_EDI, %edi - - adcl %esi, %eax C no carry out of this - movl SAVE_ESI, %esi - - movl %eax, 20(%ecx) - addl $FRAME, %esp - - ret - - - -C ----------------------------------------------------------------------------- -defframe(VAR_COUNTER,-20) -defframe(VAR_JMP, -24) -deflit(`STACK_SPACE',24) - -L(four_or_more): - C eax src low limb - C ebx - C ecx - C edx size - C esi src - C edi - C ebp -deflit(`FRAME',4) dnl %esi already pushed - -C First multiply src[0]*src[1..size-1] and store at dst[1..size]. - - subl $STACK_SPACE-FRAME, %esp -deflit(`FRAME',STACK_SPACE) - movl $1, %ecx - - movl %edi, SAVE_EDI - movl PARAM_DST, %edi - - movl %ebx, SAVE_EBX - subl %edx, %ecx C -(size-1) - - movl %ebp, SAVE_EBP - movl $0, %ebx C initial carry - - leal (%esi,%edx,4), %esi C &src[size] - movl %eax, %ebp C multiplier - - leal -4(%edi,%edx,4), %edi C &dst[size-1] - - -C This loop runs at just over 6 c/l. - -L(mul_1): - C eax scratch - C ebx carry - C ecx counter, limbs, negative, -(size-1) to -1 - C edx scratch - C esi &src[size] - C edi &dst[size-1] - C ebp multiplier - - movl %ebp, %eax - - mull (%esi,%ecx,4) - - addl %ebx, %eax - movl $0, %ebx - - adcl %edx, %ebx - movl %eax, 4(%edi,%ecx,4) - - incl %ecx - jnz L(mul_1) - - - movl %ebx, 4(%edi) - - -C Addmul src[n]*src[n+1..size-1] at dst[2*n-1...], for each n=1..size-2. -C -C The last two addmuls, which are the bottom right corner of the product -C triangle, are left to the end. These are src[size-3]*src[size-2,size-1] -C and src[size-2]*src[size-1]. If size is 4 then it's only these corner -C cases that need to be done. -C -C The unrolled code is the same as mpn_addmul_1(), see that routine for some -C comments. -C -C VAR_COUNTER is the outer loop, running from -(size-4) to -1, inclusive. -C -C VAR_JMP is the computed jump into the unrolled code, stepped by one code -C chunk each outer loop. - -dnl This is also hard-coded in the address calculation below. -deflit(CODE_BYTES_PER_LIMB, 15) - -dnl With &src[size] and &dst[size-1] pointers, the displacements in the -dnl unrolled code fit in a byte for UNROLL_COUNT values up to 32, but above -dnl that an offset must be added to them. -deflit(OFFSET, -ifelse(eval(UNROLL_COUNT>32),1, -eval((UNROLL_COUNT-32)*4), -0)) - - C eax - C ebx carry - C ecx - C edx - C esi &src[size] - C edi &dst[size-1] - C ebp - - movl PARAM_SIZE, %ecx - - subl $4, %ecx - jz L(corner) - - movl %ecx, %edx - negl %ecx - - shll $4, %ecx -ifelse(OFFSET,0,,`subl $OFFSET, %esi') - -ifdef(`PIC',` - call L(pic_calc) -L(here): -',` - leal L(unroll_inner_end)-eval(2*CODE_BYTES_PER_LIMB)(%ecx,%edx), %ecx -') - negl %edx - -ifelse(OFFSET,0,,`subl $OFFSET, %edi') - - C The calculated jump mustn't be before the start of the available - C code. This is the limit that UNROLL_COUNT puts on the src operand - C size, but checked here using the jump address directly. - - ASSERT(ae, - `movl_text_address( L(unroll_inner_start), %eax) - cmpl %eax, %ecx') - - -C ----------------------------------------------------------------------------- - ALIGN(16) -L(unroll_outer_top): - C eax - C ebx high limb to store - C ecx VAR_JMP - C edx VAR_COUNTER, limbs, negative - C esi &src[size], constant - C edi dst ptr, second highest limb of last addmul - C ebp - - movl -12+OFFSET(%esi,%edx,4), %ebp C multiplier - movl %edx, VAR_COUNTER - - movl -8+OFFSET(%esi,%edx,4), %eax C first limb of multiplicand - - mull %ebp - -define(cmovX,`ifelse(eval(UNROLL_COUNT%2),1,`cmovz($@)',`cmovnz($@)')') - - testb $1, %cl - - movl %edx, %ebx C high carry - leal 4(%edi), %edi - - movl %ecx, %edx C jump - - movl %eax, %ecx C low carry - leal CODE_BYTES_PER_LIMB(%edx), %edx - - cmovX( %ebx, %ecx) C high carry reverse - cmovX( %eax, %ebx) C low carry reverse - movl %edx, VAR_JMP - jmp *%edx - - - C Must be on an even address here so the low bit of the jump address - C will indicate which way around ecx/ebx should start. - - ALIGN(2) - -L(unroll_inner_start): - C eax scratch - C ebx carry high - C ecx carry low - C edx scratch - C esi src pointer - C edi dst pointer - C ebp multiplier - C - C 15 code bytes each limb - C ecx/ebx reversed on each chunk - -forloop(`i', UNROLL_COUNT, 1, ` - deflit(`disp_src', eval(-i*4 + OFFSET)) - deflit(`disp_dst', eval(disp_src)) - - m4_assert(`disp_src>=-128 && disp_src<128') - m4_assert(`disp_dst>=-128 && disp_dst<128') - -ifelse(eval(i%2),0,` -Zdisp( movl, disp_src,(%esi), %eax) - mull %ebp -Zdisp( addl, %ebx, disp_dst,(%edi)) - adcl %eax, %ecx - movl %edx, %ebx - adcl $0, %ebx -',` - dnl this one comes out last -Zdisp( movl, disp_src,(%esi), %eax) - mull %ebp -Zdisp( addl, %ecx, disp_dst,(%edi)) - adcl %eax, %ebx - movl %edx, %ecx - adcl $0, %ecx -') -') -L(unroll_inner_end): - - addl %ebx, m4_empty_if_zero(OFFSET)(%edi) - - movl VAR_COUNTER, %edx - adcl $0, %ecx - - movl %ecx, m4_empty_if_zero(OFFSET+4)(%edi) - movl VAR_JMP, %ecx - - incl %edx - jnz L(unroll_outer_top) - - -ifelse(OFFSET,0,,` - addl $OFFSET, %esi - addl $OFFSET, %edi -') - - -C ----------------------------------------------------------------------------- - ALIGN(16) -L(corner): - C eax - C ebx - C ecx - C edx - C esi &src[size] - C edi &dst[2*size-5] - C ebp - - movl -12(%esi), %eax - - mull -8(%esi) - - addl %eax, (%edi) - movl -12(%esi), %eax - movl $0, %ebx - - adcl %edx, %ebx - - mull -4(%esi) - - addl %eax, %ebx - movl -8(%esi), %eax - - adcl $0, %edx - - addl %ebx, 4(%edi) - movl $0, %ebx - - adcl %edx, %ebx - - mull -4(%esi) - - movl PARAM_SIZE, %ecx - addl %ebx, %eax - - adcl $0, %edx - - movl %eax, 8(%edi) - - movl %edx, 12(%edi) - movl PARAM_DST, %edi - - -C Left shift of dst[1..2*size-2], the bit shifted out becomes dst[2*size-1]. - - subl $1, %ecx C size-1 - xorl %eax, %eax C ready for final adcl, and clear carry - - movl %ecx, %edx - movl PARAM_SRC, %esi - - -L(lshift): - C eax - C ebx - C ecx counter, size-1 to 1 - C edx size-1 (for later use) - C esi src (for later use) - C edi dst, incrementing - C ebp - - rcll 4(%edi) - rcll 8(%edi) - - leal 8(%edi), %edi - decl %ecx - jnz L(lshift) - - - adcl %eax, %eax - - movl %eax, 4(%edi) C dst most significant limb - movl (%esi), %eax C src[0] - - leal 4(%esi,%edx,4), %esi C &src[size] - subl %edx, %ecx C -(size-1) - - -C Now add in the squares on the diagonal, src[0]^2, src[1]^2, ..., -C src[size-1]^2. dst[0] hasn't yet been set at all yet, and just gets the -C low limb of src[0]^2. - - - mull %eax - - movl %eax, (%edi,%ecx,8) C dst[0] - - -L(diag): - C eax scratch - C ebx scratch - C ecx counter, negative - C edx carry - C esi &src[size] - C edi dst[2*size-2] - C ebp - - movl (%esi,%ecx,4), %eax - movl %edx, %ebx - - mull %eax - - addl %ebx, 4(%edi,%ecx,8) - adcl %eax, 8(%edi,%ecx,8) - adcl $0, %edx - - incl %ecx - jnz L(diag) - - - movl SAVE_ESI, %esi - movl SAVE_EBX, %ebx - - addl %edx, 4(%edi) C dst most significant limb - - movl SAVE_EDI, %edi - movl SAVE_EBP, %ebp - addl $FRAME, %esp - ret - - - -C ----------------------------------------------------------------------------- -ifdef(`PIC',` -L(pic_calc): - addl (%esp), %ecx - addl $L(unroll_inner_end)-L(here)-eval(2*CODE_BYTES_PER_LIMB), %ecx - addl %edx, %ecx - ret -') - - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/pentium/README b/rts/gmp/mpn/x86/pentium/README deleted file mode 100644 index 3b9ec8a..0000000 --- a/rts/gmp/mpn/x86/pentium/README +++ /dev/null @@ -1,77 +0,0 @@ - - INTEL PENTIUM P5 MPN SUBROUTINES - - -This directory contains mpn functions optimized for Intel Pentium (P5,P54) -processors. The mmx subdirectory has code for Pentium with MMX (P55). - - -STATUS - - cycles/limb - - mpn_add_n/sub_n 2.375 - - mpn_copyi/copyd 1.0 - - mpn_divrem_1 44.0 - mpn_mod_1 44.0 - mpn_divexact_by3 15.0 - - mpn_l/rshift 5.375 normal (6.0 on P54) - 1.875 special shift by 1 bit - - mpn_mul_1 13.0 - mpn_add/submul_1 14.0 - - mpn_mul_basecase 14.2 cycles/crossproduct (approx) - - mpn_sqr_basecase 8 cycles/crossproduct (approx) - or 15.5 cycles/triangleproduct (approx) - -Pentium MMX gets the following improvements - - mpn_l/rshift 1.75 - - -1. mpn_lshift and mpn_rshift run at about 6 cycles/limb on P5 and P54, but the -documentation indicates that they should take only 43/8 = 5.375 cycles/limb, -or 5 cycles/limb asymptotically. The P55 runs them at the expected speed. - -2. mpn_add_n and mpn_sub_n run at asymptotically 2 cycles/limb. Due to loop -overhead and other delays (cache refill?), they run at or near 2.5 cycles/limb. - -3. mpn_mul_1, mpn_addmul_1, mpn_submul_1 all run 1 cycle faster than they -should. Intel documentation says a mul instruction is 10 cycles, but it -measures 9 and the routines using it run with it as 9. - - - -RELEVANT OPTIMIZATION ISSUES - -1. Pentium doesn't allocate cache lines on writes, unlike most other modern -processors. Since the functions in the mpn class do array writes, we have to -handle allocating the destination cache lines by reading a word from it in the -loops, to achieve the best performance. - -2. Pairing of memory operations requires that the two issued operations refer -to different cache banks. The simplest way to insure this is to read/write -two words from the same object. If we make operations on different objects, -they might or might not be to the same cache bank. - - - -REFERENCES - -"Intel Architecture Optimization Manual", 1997, order number 242816. This -is mostly about P5, the parts about P6 aren't relevant. Available on-line: - - http://download.intel.com/design/PentiumII/manuals/242816.htm - - - ----------------- -Local variables: -mode: text -fill-column: 76 -End: diff --git a/rts/gmp/mpn/x86/pentium/aors_n.asm b/rts/gmp/mpn/x86/pentium/aors_n.asm deleted file mode 100644 index a61082a..0000000 --- a/rts/gmp/mpn/x86/pentium/aors_n.asm +++ /dev/null @@ -1,196 +0,0 @@ -dnl Intel Pentium mpn_add_n/mpn_sub_n -- mpn addition and subtraction. -dnl -dnl P5: 2.375 cycles/limb - - -dnl Copyright (C) 1992, 1994, 1995, 1996, 1999, 2000 Free Software -dnl Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -ifdef(`OPERATION_add_n',` - define(M4_inst, adcl) - define(M4_function_n, mpn_add_n) - define(M4_function_nc, mpn_add_nc) - -',`ifdef(`OPERATION_sub_n',` - define(M4_inst, sbbl) - define(M4_function_n, mpn_sub_n) - define(M4_function_nc, mpn_sub_nc) - -',`m4_error(`Need OPERATION_add_n or OPERATION_sub_n -')')') - -MULFUNC_PROLOGUE(mpn_add_n mpn_add_nc mpn_sub_n mpn_sub_nc) - - -C mp_limb_t M4_function_n (mp_ptr dst, mp_srcptr src1, mp_srcptr src2, -C mp_size_t size); -C mp_limb_t M4_function_nc (mp_ptr dst, mp_srcptr src1, mp_srcptr src2, -C mp_size_t size, mp_limb_t carry); - -defframe(PARAM_CARRY,20) -defframe(PARAM_SIZE, 16) -defframe(PARAM_SRC2, 12) -defframe(PARAM_SRC1, 8) -defframe(PARAM_DST, 4) - - .text - ALIGN(8) -PROLOGUE(M4_function_nc) - - pushl %edi - pushl %esi - pushl %ebx - pushl %ebp -deflit(`FRAME',16) - - movl PARAM_DST,%edi - movl PARAM_SRC1,%esi - movl PARAM_SRC2,%ebp - movl PARAM_SIZE,%ecx - - movl (%ebp),%ebx - - decl %ecx - movl %ecx,%edx - shrl $3,%ecx - andl $7,%edx - testl %ecx,%ecx C zero carry flag - jz L(endgo) - - pushl %edx -FRAME_pushl() - movl PARAM_CARRY,%eax - shrl $1,%eax C shift bit 0 into carry - jmp LF(M4_function_n,oop) - -L(endgo): -deflit(`FRAME',16) - movl PARAM_CARRY,%eax - shrl $1,%eax C shift bit 0 into carry - jmp LF(M4_function_n,end) - -EPILOGUE() - - - ALIGN(8) -PROLOGUE(M4_function_n) - - pushl %edi - pushl %esi - pushl %ebx - pushl %ebp -deflit(`FRAME',16) - - movl PARAM_DST,%edi - movl PARAM_SRC1,%esi - movl PARAM_SRC2,%ebp - movl PARAM_SIZE,%ecx - - movl (%ebp),%ebx - - decl %ecx - movl %ecx,%edx - shrl $3,%ecx - andl $7,%edx - testl %ecx,%ecx C zero carry flag - jz L(end) - pushl %edx -FRAME_pushl() - - ALIGN(8) -L(oop): movl 28(%edi),%eax C fetch destination cache line - leal 32(%edi),%edi - -L(1): movl (%esi),%eax - movl 4(%esi),%edx - M4_inst %ebx,%eax - movl 4(%ebp),%ebx - M4_inst %ebx,%edx - movl 8(%ebp),%ebx - movl %eax,-32(%edi) - movl %edx,-28(%edi) - -L(2): movl 8(%esi),%eax - movl 12(%esi),%edx - M4_inst %ebx,%eax - movl 12(%ebp),%ebx - M4_inst %ebx,%edx - movl 16(%ebp),%ebx - movl %eax,-24(%edi) - movl %edx,-20(%edi) - -L(3): movl 16(%esi),%eax - movl 20(%esi),%edx - M4_inst %ebx,%eax - movl 20(%ebp),%ebx - M4_inst %ebx,%edx - movl 24(%ebp),%ebx - movl %eax,-16(%edi) - movl %edx,-12(%edi) - -L(4): movl 24(%esi),%eax - movl 28(%esi),%edx - M4_inst %ebx,%eax - movl 28(%ebp),%ebx - M4_inst %ebx,%edx - movl 32(%ebp),%ebx - movl %eax,-8(%edi) - movl %edx,-4(%edi) - - leal 32(%esi),%esi - leal 32(%ebp),%ebp - decl %ecx - jnz L(oop) - - popl %edx -FRAME_popl() -L(end): - decl %edx C test %edx w/o clobbering carry - js L(end2) - incl %edx -L(oop2): - leal 4(%edi),%edi - movl (%esi),%eax - M4_inst %ebx,%eax - movl 4(%ebp),%ebx - movl %eax,-4(%edi) - leal 4(%esi),%esi - leal 4(%ebp),%ebp - decl %edx - jnz L(oop2) -L(end2): - movl (%esi),%eax - M4_inst %ebx,%eax - movl %eax,(%edi) - - sbbl %eax,%eax - negl %eax - - popl %ebp - popl %ebx - popl %esi - popl %edi - ret - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/pentium/aorsmul_1.asm b/rts/gmp/mpn/x86/pentium/aorsmul_1.asm deleted file mode 100644 index 147b556..0000000 --- a/rts/gmp/mpn/x86/pentium/aorsmul_1.asm +++ /dev/null @@ -1,99 +0,0 @@ -dnl Intel Pentium mpn_addmul_1 -- mpn by limb multiplication. -dnl -dnl P5: 14.0 cycles/limb - - -dnl Copyright (C) 1992, 1994, 1996, 1999, 2000 Free Software Foundation, -dnl Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. */ - - -include(`../config.m4') - - -ifdef(`OPERATION_addmul_1', ` - define(M4_inst, addl) - define(M4_function_1, mpn_addmul_1) - -',`ifdef(`OPERATION_submul_1', ` - define(M4_inst, subl) - define(M4_function_1, mpn_submul_1) - -',`m4_error(`Need OPERATION_addmul_1 or OPERATION_submul_1 -')')') - -MULFUNC_PROLOGUE(mpn_addmul_1 mpn_submul_1) - - -C mp_limb_t M4_function_1 (mp_ptr dst, mp_srcptr src, mp_size_t size, -C mp_limb_t mult); - -defframe(PARAM_MULTIPLIER,16) -defframe(PARAM_SIZE, 12) -defframe(PARAM_SRC, 8) -defframe(PARAM_DST, 4) - - .text - ALIGN(8) - -PROLOGUE(M4_function_1) - - pushl %edi - pushl %esi - pushl %ebx - pushl %ebp -deflit(`FRAME',16) - - movl PARAM_DST, %edi - movl PARAM_SRC, %esi - movl PARAM_SIZE, %ecx - movl PARAM_MULTIPLIER, %ebp - - leal (%edi,%ecx,4), %edi - leal (%esi,%ecx,4), %esi - negl %ecx - xorl %ebx, %ebx - ALIGN(8) - -L(oop): adcl $0, %ebx - movl (%esi,%ecx,4), %eax - - mull %ebp - - addl %ebx, %eax - movl (%edi,%ecx,4), %ebx - - adcl $0, %edx - M4_inst %eax, %ebx - - movl %ebx, (%edi,%ecx,4) - incl %ecx - - movl %edx, %ebx - jnz L(oop) - - adcl $0, %ebx - movl %ebx, %eax - popl %ebp - popl %ebx - popl %esi - popl %edi - ret - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/pentium/diveby3.asm b/rts/gmp/mpn/x86/pentium/diveby3.asm deleted file mode 100644 index dbac816..0000000 --- a/rts/gmp/mpn/x86/pentium/diveby3.asm +++ /dev/null @@ -1,183 +0,0 @@ -dnl Intel P5 mpn_divexact_by3 -- mpn division by 3, expecting no remainder. -dnl -dnl P5: 15.0 cycles/limb - - -dnl Copyright (C) 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -C mp_limb_t mpn_divexact_by3c (mp_ptr dst, mp_srcptr src, mp_size_t size, -C mp_limb_t carry); - -defframe(PARAM_CARRY,16) -defframe(PARAM_SIZE, 12) -defframe(PARAM_SRC, 8) -defframe(PARAM_DST, 4) - -dnl multiplicative inverse of 3, modulo 2^32 -deflit(INVERSE_3, 0xAAAAAAAB) - -dnl ceil(b/3), ceil(b*2/3) and floor(b*2/3) where b=2^32 -deflit(ONE_THIRD_CEIL, 0x55555556) -deflit(TWO_THIRDS_CEIL, 0xAAAAAAAB) -deflit(TWO_THIRDS_FLOOR, 0xAAAAAAAA) - - .text - ALIGN(8) - -PROLOGUE(mpn_divexact_by3c) -deflit(`FRAME',0) - - movl PARAM_SRC, %ecx - movl PARAM_SIZE, %edx - - decl %edx - jnz L(two_or_more) - - movl (%ecx), %edx - movl PARAM_CARRY, %eax C risk of cache bank clash here - - movl PARAM_DST, %ecx - subl %eax, %edx - - sbbl %eax, %eax C 0 or -1 - - imull $INVERSE_3, %edx, %edx - - negl %eax C 0 or 1 - cmpl $ONE_THIRD_CEIL, %edx - - sbbl $-1, %eax C +1 if edx>=ceil(b/3) - cmpl $TWO_THIRDS_CEIL, %edx - - sbbl $-1, %eax C +1 if edx>=ceil(b*2/3) - movl %edx, (%ecx) - - ret - - -L(two_or_more): - C eax - C ebx - C ecx src - C edx size-1 - C esi - C edi - C ebp - - pushl %ebx FRAME_pushl() - pushl %esi FRAME_pushl() - - pushl %edi FRAME_pushl() - pushl %ebp FRAME_pushl() - - movl PARAM_DST, %edi - movl PARAM_CARRY, %esi - - movl (%ecx), %eax C src low limb - xorl %ebx, %ebx - - sub %esi, %eax - movl $TWO_THIRDS_FLOOR, %esi - - leal (%ecx,%edx,4), %ecx C &src[size-1] - leal (%edi,%edx,4), %edi C &dst[size-1] - - adcl $0, %ebx C carry, 0 or 1 - negl %edx C -(size-1) - - -C The loop needs a source limb ready at the top, which leads to one limb -C handled separately at the end, and the special case above for size==1. -C There doesn't seem to be any scheduling that would keep the speed but move -C the source load and carry subtract up to the top. -C -C The destination cache line prefetching adds 1 cycle to the loop but is -C considered worthwhile. The slowdown is a factor of 1.07, but will prevent -C repeated write-throughs if the destination isn't in L1. A version using -C an outer loop to prefetch only every 8 limbs (a cache line) proved to be -C no faster, due to unavoidable branch mispreditions in the inner loop. -C -C setc is 2 cycles on P54, so an adcl is used instead. If the movl $0,%ebx -C could be avoided then the src limb fetch could pair up and save a cycle. -C This would probably mean going to a two limb loop with the carry limb -C alternately positive or negative, since an sbbl %ebx,%ebx will leave a -C value which is in the opposite sense to the preceding sbbl/adcl %ebx,%eax. -C -C A register is used for TWO_THIRDS_FLOOR because a cmp can't be done as -C "cmpl %edx, $n" with the immediate as the second operand. -C -C The "4" source displacement is in the loop rather than the setup because -C this gets L(top) aligned to 8 bytes at no cost. - - ALIGN(8) -L(top): - C eax source limb, carry subtracted - C ebx carry (0 or 1) - C ecx &src[size-1] - C edx counter, limbs, negative - C esi TWO_THIRDS_FLOOR - C edi &dst[size-1] - C ebp scratch (result limb) - - imull $INVERSE_3, %eax, %ebp - - cmpl $ONE_THIRD_CEIL, %ebp - movl (%edi,%edx,4), %eax C dst cache line prefetch - - sbbl $-1, %ebx C +1 if ebp>=ceil(b/3) - cmpl %ebp, %esi - - movl 4(%ecx,%edx,4), %eax C next src limb - - sbbl %ebx, %eax C and further -1 if ebp>=ceil(b*2/3) - movl $0, %ebx - - adcl $0, %ebx C new carry - movl %ebp, (%edi,%edx,4) - - incl %edx - jnz L(top) - - - - imull $INVERSE_3, %eax, %edx - - cmpl $ONE_THIRD_CEIL, %edx - movl %edx, (%edi) - - sbbl $-1, %ebx C +1 if edx>=ceil(b/3) - cmpl $TWO_THIRDS_CEIL, %edx - - sbbl $-1, %ebx C +1 if edx>=ceil(b*2/3) - popl %ebp - - movl %ebx, %eax - popl %edi - - popl %esi - popl %ebx - - ret - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/pentium/gmp-mparam.h b/rts/gmp/mpn/x86/pentium/gmp-mparam.h deleted file mode 100644 index d3ed3d7..0000000 --- a/rts/gmp/mpn/x86/pentium/gmp-mparam.h +++ /dev/null @@ -1,97 +0,0 @@ -/* Intel P54 gmp-mparam.h -- Compiler/machine parameter header file. - -Copyright (C) 1991, 1993, 1994, 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. */ - - -#define BITS_PER_MP_LIMB 32 -#define BYTES_PER_MP_LIMB 4 -#define BITS_PER_LONGINT 32 -#define BITS_PER_INT 32 -#define BITS_PER_SHORTINT 16 -#define BITS_PER_CHAR 8 - - -#ifndef UMUL_TIME -#define UMUL_TIME 9 /* cycles */ -#endif -#ifndef UDIV_TIME -#define UDIV_TIME 41 /* cycles */ -#endif - -/* bsf takes 18-42 cycles, put an average for uniform random numbers */ -#ifndef COUNT_TRAILING_ZEROS_TIME -#define COUNT_TRAILING_ZEROS_TIME 20 /* cycles */ -#endif - - -/* Generated by tuneup.c, 2000-07-06. */ - -#ifndef KARATSUBA_MUL_THRESHOLD -#define KARATSUBA_MUL_THRESHOLD 14 -#endif -#ifndef TOOM3_MUL_THRESHOLD -#define TOOM3_MUL_THRESHOLD 179 -#endif - -#ifndef KARATSUBA_SQR_THRESHOLD -#define KARATSUBA_SQR_THRESHOLD 22 -#endif -#ifndef TOOM3_SQR_THRESHOLD -#define TOOM3_SQR_THRESHOLD 153 -#endif - -#ifndef BZ_THRESHOLD -#define BZ_THRESHOLD 46 -#endif - -#ifndef FIB_THRESHOLD -#define FIB_THRESHOLD 110 -#endif - -#ifndef POWM_THRESHOLD -#define POWM_THRESHOLD 13 -#endif - -#ifndef GCD_ACCEL_THRESHOLD -#define GCD_ACCEL_THRESHOLD 4 -#endif -#ifndef GCDEXT_THRESHOLD -#define GCDEXT_THRESHOLD 25 -#endif - -#ifndef FFT_MUL_TABLE -#define FFT_MUL_TABLE { 496, 928, 1920, 4608, 14336, 40960, 0 } -#endif -#ifndef FFT_MODF_MUL_THRESHOLD -#define FFT_MODF_MUL_THRESHOLD 512 -#endif -#ifndef FFT_MUL_THRESHOLD -#define FFT_MUL_THRESHOLD 3840 -#endif - -#ifndef FFT_SQR_TABLE -#define FFT_SQR_TABLE { 496, 1184, 1920, 5632, 14336, 40960, 0 } -#endif -#ifndef FFT_MODF_SQR_THRESHOLD -#define FFT_MODF_SQR_THRESHOLD 512 -#endif -#ifndef FFT_SQR_THRESHOLD -#define FFT_SQR_THRESHOLD 3840 -#endif diff --git a/rts/gmp/mpn/x86/pentium/lshift.asm b/rts/gmp/mpn/x86/pentium/lshift.asm deleted file mode 100644 index e1e35d4..0000000 --- a/rts/gmp/mpn/x86/pentium/lshift.asm +++ /dev/null @@ -1,236 +0,0 @@ -dnl Intel Pentium mpn_lshift -- mpn left shift. -dnl -dnl cycles/limb -dnl P5,P54: 6.0 -dnl P55: 5.375 - - -dnl Copyright (C) 1992, 1994, 1995, 1996, 1999, 2000 Free Software -dnl Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -C mp_limb_t mpn_lshift (mp_ptr dst, mp_srcptr src, mp_size_t size, -C unsigned shift); -C -C The main shift-by-N loop should run at 5.375 c/l and that's what P55 does, -C but P5 and P54 run only at 6.0 c/l, which is 4 cycles lost somewhere. - -defframe(PARAM_SHIFT,16) -defframe(PARAM_SIZE, 12) -defframe(PARAM_SRC, 8) -defframe(PARAM_DST, 4) - - .text - ALIGN(8) -PROLOGUE(mpn_lshift) - - pushl %edi - pushl %esi - pushl %ebx - pushl %ebp -deflit(`FRAME',16) - - movl PARAM_DST,%edi - movl PARAM_SRC,%esi - movl PARAM_SIZE,%ebp - movl PARAM_SHIFT,%ecx - -C We can use faster code for shift-by-1 under certain conditions. - cmp $1,%ecx - jne L(normal) - leal 4(%esi),%eax - cmpl %edi,%eax - jnc L(special) C jump if s_ptr + 1 >= res_ptr - leal (%esi,%ebp,4),%eax - cmpl %eax,%edi - jnc L(special) C jump if res_ptr >= s_ptr + size - -L(normal): - leal -4(%edi,%ebp,4),%edi - leal -4(%esi,%ebp,4),%esi - - movl (%esi),%edx - subl $4,%esi - xorl %eax,%eax - shldl( %cl, %edx, %eax) C compute carry limb - pushl %eax C push carry limb onto stack - - decl %ebp - pushl %ebp - shrl $3,%ebp - jz L(end) - - movl (%edi),%eax C fetch destination cache line - - ALIGN(4) -L(oop): movl -28(%edi),%eax C fetch destination cache line - movl %edx,%ebx - - movl (%esi),%eax - movl -4(%esi),%edx - shldl( %cl, %eax, %ebx) - shldl( %cl, %edx, %eax) - movl %ebx,(%edi) - movl %eax,-4(%edi) - - movl -8(%esi),%ebx - movl -12(%esi),%eax - shldl( %cl, %ebx, %edx) - shldl( %cl, %eax, %ebx) - movl %edx,-8(%edi) - movl %ebx,-12(%edi) - - movl -16(%esi),%edx - movl -20(%esi),%ebx - shldl( %cl, %edx, %eax) - shldl( %cl, %ebx, %edx) - movl %eax,-16(%edi) - movl %edx,-20(%edi) - - movl -24(%esi),%eax - movl -28(%esi),%edx - shldl( %cl, %eax, %ebx) - shldl( %cl, %edx, %eax) - movl %ebx,-24(%edi) - movl %eax,-28(%edi) - - subl $32,%esi - subl $32,%edi - decl %ebp - jnz L(oop) - -L(end): popl %ebp - andl $7,%ebp - jz L(end2) -L(oop2): - movl (%esi),%eax - shldl( %cl,%eax,%edx) - movl %edx,(%edi) - movl %eax,%edx - subl $4,%esi - subl $4,%edi - decl %ebp - jnz L(oop2) - -L(end2): - shll %cl,%edx C compute least significant limb - movl %edx,(%edi) C store it - - popl %eax C pop carry limb - - popl %ebp - popl %ebx - popl %esi - popl %edi - ret - - -C We loop from least significant end of the arrays, which is only -C permissable if the source and destination don't overlap, since the -C function is documented to work for overlapping source and destination. - -L(special): - movl (%esi),%edx - addl $4,%esi - - decl %ebp - pushl %ebp - shrl $3,%ebp - - addl %edx,%edx - incl %ebp - decl %ebp - jz L(Lend) - - movl (%edi),%eax C fetch destination cache line - - ALIGN(4) -L(Loop): - movl 28(%edi),%eax C fetch destination cache line - movl %edx,%ebx - - movl (%esi),%eax - movl 4(%esi),%edx - adcl %eax,%eax - movl %ebx,(%edi) - adcl %edx,%edx - movl %eax,4(%edi) - - movl 8(%esi),%ebx - movl 12(%esi),%eax - adcl %ebx,%ebx - movl %edx,8(%edi) - adcl %eax,%eax - movl %ebx,12(%edi) - - movl 16(%esi),%edx - movl 20(%esi),%ebx - adcl %edx,%edx - movl %eax,16(%edi) - adcl %ebx,%ebx - movl %edx,20(%edi) - - movl 24(%esi),%eax - movl 28(%esi),%edx - adcl %eax,%eax - movl %ebx,24(%edi) - adcl %edx,%edx - movl %eax,28(%edi) - - leal 32(%esi),%esi C use leal not to clobber carry - leal 32(%edi),%edi - decl %ebp - jnz L(Loop) - -L(Lend): - popl %ebp - sbbl %eax,%eax C save carry in %eax - andl $7,%ebp - jz L(Lend2) - addl %eax,%eax C restore carry from eax -L(Loop2): - movl %edx,%ebx - movl (%esi),%edx - adcl %edx,%edx - movl %ebx,(%edi) - - leal 4(%esi),%esi C use leal not to clobber carry - leal 4(%edi),%edi - decl %ebp - jnz L(Loop2) - - jmp L(L1) -L(Lend2): - addl %eax,%eax C restore carry from eax -L(L1): movl %edx,(%edi) C store last limb - - sbbl %eax,%eax - negl %eax - - popl %ebp - popl %ebx - popl %esi - popl %edi - ret - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/pentium/mmx/gmp-mparam.h b/rts/gmp/mpn/x86/pentium/mmx/gmp-mparam.h deleted file mode 100644 index 2379077..0000000 --- a/rts/gmp/mpn/x86/pentium/mmx/gmp-mparam.h +++ /dev/null @@ -1,97 +0,0 @@ -/* Intel P55 gmp-mparam.h -- Compiler/machine parameter header file. - -Copyright (C) 1991, 1993, 1994, 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. */ - - -#define BITS_PER_MP_LIMB 32 -#define BYTES_PER_MP_LIMB 4 -#define BITS_PER_LONGINT 32 -#define BITS_PER_INT 32 -#define BITS_PER_SHORTINT 16 -#define BITS_PER_CHAR 8 - - -#ifndef UMUL_TIME -#define UMUL_TIME 9 /* cycles */ -#endif -#ifndef UDIV_TIME -#define UDIV_TIME 41 /* cycles */ -#endif - -/* bsf takes 18-42 cycles, put an average for uniform random numbers */ -#ifndef COUNT_TRAILING_ZEROS_TIME -#define COUNT_TRAILING_ZEROS_TIME 20 /* cycles */ -#endif - - -/* Generated by tuneup.c, 2000-07-06. */ - -#ifndef KARATSUBA_MUL_THRESHOLD -#define KARATSUBA_MUL_THRESHOLD 14 -#endif -#ifndef TOOM3_MUL_THRESHOLD -#define TOOM3_MUL_THRESHOLD 99 -#endif - -#ifndef KARATSUBA_SQR_THRESHOLD -#define KARATSUBA_SQR_THRESHOLD 22 -#endif -#ifndef TOOM3_SQR_THRESHOLD -#define TOOM3_SQR_THRESHOLD 89 -#endif - -#ifndef BZ_THRESHOLD -#define BZ_THRESHOLD 40 -#endif - -#ifndef FIB_THRESHOLD -#define FIB_THRESHOLD 98 -#endif - -#ifndef POWM_THRESHOLD -#define POWM_THRESHOLD 13 -#endif - -#ifndef GCD_ACCEL_THRESHOLD -#define GCD_ACCEL_THRESHOLD 5 -#endif -#ifndef GCDEXT_THRESHOLD -#define GCDEXT_THRESHOLD 25 -#endif - -#ifndef FFT_MUL_TABLE -#define FFT_MUL_TABLE { 496, 1056, 1920, 4608, 14336, 40960, 0 } -#endif -#ifndef FFT_MODF_MUL_THRESHOLD -#define FFT_MODF_MUL_THRESHOLD 512 -#endif -#ifndef FFT_MUL_THRESHOLD -#define FFT_MUL_THRESHOLD 3840 -#endif - -#ifndef FFT_SQR_TABLE -#define FFT_SQR_TABLE { 496, 1184, 2176, 5632, 14336, 40960, 0 } -#endif -#ifndef FFT_MODF_SQR_THRESHOLD -#define FFT_MODF_SQR_THRESHOLD 512 -#endif -#ifndef FFT_SQR_THRESHOLD -#define FFT_SQR_THRESHOLD 4352 -#endif diff --git a/rts/gmp/mpn/x86/pentium/mmx/lshift.asm b/rts/gmp/mpn/x86/pentium/mmx/lshift.asm deleted file mode 100644 index 2225438..0000000 --- a/rts/gmp/mpn/x86/pentium/mmx/lshift.asm +++ /dev/null @@ -1,455 +0,0 @@ -dnl Intel P5 mpn_lshift -- mpn left shift. -dnl -dnl P5: 1.75 cycles/limb. - - -dnl Copyright (C) 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -C mp_limb_t mpn_lshift (mp_ptr dst, mp_srcptr src, mp_size_t size, -C unsigned shift); -C -C Shift src,size left by shift many bits and store the result in dst,size. -C Zeros are shifted in at the right. Return the bits shifted out at the -C left. -C -C The comments in mpn_rshift apply here too. - -defframe(PARAM_SHIFT,16) -defframe(PARAM_SIZE, 12) -defframe(PARAM_SRC, 8) -defframe(PARAM_DST, 4) -deflit(`FRAME',0) - -dnl minimum 5, because the unrolled loop can't handle less -deflit(UNROLL_THRESHOLD, 5) - - .text - ALIGN(8) - -PROLOGUE(mpn_lshift) - - pushl %ebx - pushl %edi -deflit(`FRAME',8) - - movl PARAM_SIZE, %eax - movl PARAM_DST, %edx - - movl PARAM_SRC, %ebx - movl PARAM_SHIFT, %ecx - - cmp $UNROLL_THRESHOLD, %eax - jae L(unroll) - - movl -4(%ebx,%eax,4), %edi C src high limb - decl %eax - - jnz L(simple) - - shldl( %cl, %edi, %eax) C eax was decremented to zero - - shll %cl, %edi - - movl %edi, (%edx) C dst low limb - popl %edi C risk of data cache bank clash - - popl %ebx - - ret - - -C ----------------------------------------------------------------------------- -L(simple): - C eax size-1 - C ebx src - C ecx shift - C edx dst - C esi - C edi - C ebp -deflit(`FRAME',8) - - movd (%ebx,%eax,4), %mm5 C src high limb - - movd %ecx, %mm6 C lshift - negl %ecx - - psllq %mm6, %mm5 - addl $32, %ecx - - movd %ecx, %mm7 - psrlq $32, %mm5 C retval - - -L(simple_top): - C eax counter, limbs, negative - C ebx src - C ecx - C edx dst - C esi - C edi - C - C mm0 scratch - C mm5 return value - C mm6 shift - C mm7 32-shift - - movq -4(%ebx,%eax,4), %mm0 - decl %eax - - psrlq %mm7, %mm0 - - C - - movd %mm0, 4(%edx,%eax,4) - jnz L(simple_top) - - - movd (%ebx), %mm0 - - movd %mm5, %eax - psllq %mm6, %mm0 - - popl %edi - popl %ebx - - movd %mm0, (%edx) - - emms - - ret - - -C ----------------------------------------------------------------------------- - ALIGN(8) -L(unroll): - C eax size - C ebx src - C ecx shift - C edx dst - C esi - C edi - C ebp -deflit(`FRAME',8) - - movd -4(%ebx,%eax,4), %mm5 C src high limb - leal (%ebx,%eax,4), %edi - - movd %ecx, %mm6 C lshift - andl $4, %edi - - psllq %mm6, %mm5 - jz L(start_src_aligned) - - - C src isn't aligned, process high limb separately (marked xxx) to - C make it so. - C - C source -8(ebx,%eax,4) - C | - C +-------+-------+-------+-- - C | | - C +-------+-------+-------+-- - C 0mod8 4mod8 0mod8 - C - C dest - C -4(edx,%eax,4) - C | - C +-------+-------+-- - C | xxx | | - C +-------+-------+-- - - movq -8(%ebx,%eax,4), %mm0 C unaligned load - - psllq %mm6, %mm0 - decl %eax - - psrlq $32, %mm0 - - C - - movd %mm0, (%edx,%eax,4) -L(start_src_aligned): - - movq -8(%ebx,%eax,4), %mm1 C src high qword - leal (%edx,%eax,4), %edi - - andl $4, %edi - psrlq $32, %mm5 C return value - - movq -16(%ebx,%eax,4), %mm3 C src second highest qword - jz L(start_dst_aligned) - - C dst isn't aligned, subtract 4 to make it so, and pretend the shift - C is 32 bits extra. High limb of dst (marked xxx) handled here - C separately. - C - C source -8(ebx,%eax,4) - C | - C +-------+-------+-- - C | mm1 | - C +-------+-------+-- - C 0mod8 4mod8 - C - C dest - C -4(edx,%eax,4) - C | - C +-------+-------+-------+-- - C | xxx | | - C +-------+-------+-------+-- - C 0mod8 4mod8 0mod8 - - movq %mm1, %mm0 - addl $32, %ecx C new shift - - psllq %mm6, %mm0 - - movd %ecx, %mm6 - psrlq $32, %mm0 - - C wasted cycle here waiting for %mm0 - - movd %mm0, -4(%edx,%eax,4) - subl $4, %edx -L(start_dst_aligned): - - - psllq %mm6, %mm1 - negl %ecx C -shift - - addl $64, %ecx C 64-shift - movq %mm3, %mm2 - - movd %ecx, %mm7 - subl $8, %eax C size-8 - - psrlq %mm7, %mm3 - - por %mm1, %mm3 C mm3 ready to store - jc L(finish) - - - C The comments in mpn_rshift apply here too. - - ALIGN(8) -L(unroll_loop): - C eax counter, limbs - C ebx src - C ecx - C edx dst - C esi - C edi - C - C mm0 - C mm1 - C mm2 src qword from 48(%ebx,%eax,4) - C mm3 dst qword ready to store to 56(%edx,%eax,4) - C - C mm5 return value - C mm6 lshift - C mm7 rshift - - movq 8(%ebx,%eax,4), %mm0 - psllq %mm6, %mm2 - - movq %mm0, %mm1 - psrlq %mm7, %mm0 - - movq %mm3, 24(%edx,%eax,4) C prev - por %mm2, %mm0 - - movq (%ebx,%eax,4), %mm3 C - psllq %mm6, %mm1 C - - movq %mm0, 16(%edx,%eax,4) - movq %mm3, %mm2 C - - psrlq %mm7, %mm3 C - subl $4, %eax - - por %mm1, %mm3 C - jnc L(unroll_loop) - - - -L(finish): - C eax -4 to -1 representing respectively 0 to 3 limbs remaining - - testb $2, %al - - jz L(finish_no_two) - - movq 8(%ebx,%eax,4), %mm0 - psllq %mm6, %mm2 - - movq %mm0, %mm1 - psrlq %mm7, %mm0 - - movq %mm3, 24(%edx,%eax,4) C prev - por %mm2, %mm0 - - movq %mm1, %mm2 - movq %mm0, %mm3 - - subl $2, %eax -L(finish_no_two): - - - C eax -4 or -3 representing respectively 0 or 1 limbs remaining - C - C mm2 src prev qword, from 48(%ebx,%eax,4) - C mm3 dst qword, for 56(%edx,%eax,4) - - testb $1, %al - movd %mm5, %eax C retval - - popl %edi - jz L(finish_zero) - - - C One extra src limb, destination was aligned. - C - C source ebx - C --+---------------+-------+ - C | mm2 | | - C --+---------------+-------+ - C - C dest edx+12 edx+4 edx - C --+---------------+---------------+-------+ - C | mm3 | | | - C --+---------------+---------------+-------+ - C - C mm6 = shift - C mm7 = ecx = 64-shift - - - C One extra src limb, destination was unaligned. - C - C source ebx - C --+---------------+-------+ - C | mm2 | | - C --+---------------+-------+ - C - C dest edx+12 edx+4 - C --+---------------+---------------+ - C | mm3 | | - C --+---------------+---------------+ - C - C mm6 = shift+32 - C mm7 = ecx = 64-(shift+32) - - - C In both cases there's one extra limb of src to fetch and combine - C with mm2 to make a qword at 4(%edx), and in the aligned case - C there's an extra limb of dst to be formed from that extra src limb - C left shifted. - - - movd (%ebx), %mm0 - psllq %mm6, %mm2 - - movq %mm3, 12(%edx) - psllq $32, %mm0 - - movq %mm0, %mm1 - psrlq %mm7, %mm0 - - por %mm2, %mm0 - psllq %mm6, %mm1 - - movq %mm0, 4(%edx) - psrlq $32, %mm1 - - andl $32, %ecx - popl %ebx - - jz L(finish_one_unaligned) - - movd %mm1, (%edx) -L(finish_one_unaligned): - - emms - - ret - - -L(finish_zero): - - C No extra src limbs, destination was aligned. - C - C source ebx - C --+---------------+ - C | mm2 | - C --+---------------+ - C - C dest edx+8 edx - C --+---------------+---------------+ - C | mm3 | | - C --+---------------+---------------+ - C - C mm6 = shift - C mm7 = ecx = 64-shift - - - C No extra src limbs, destination was unaligned. - C - C source ebx - C --+---------------+ - C | mm2 | - C --+---------------+ - C - C dest edx+8 edx+4 - C --+---------------+-------+ - C | mm3 | | - C --+---------------+-------+ - C - C mm6 = shift+32 - C mm7 = ecx = 64-(shift+32) - - - C The movd for the unaligned case writes the same data to 4(%edx) - C that the movq does for the aligned case. - - - movq %mm3, 8(%edx) - andl $32, %ecx - - psllq %mm6, %mm2 - jz L(finish_zero_unaligned) - - movq %mm2, (%edx) -L(finish_zero_unaligned): - - psrlq $32, %mm2 - popl %ebx - - movd %mm5, %eax C retval - - movd %mm2, 4(%edx) - - emms - - ret - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/pentium/mmx/popham.asm b/rts/gmp/mpn/x86/pentium/mmx/popham.asm deleted file mode 100644 index 587a07a..0000000 --- a/rts/gmp/mpn/x86/pentium/mmx/popham.asm +++ /dev/null @@ -1,30 +0,0 @@ -dnl Intel P55 mpn_popcount, mpn_hamdist -- population count and hamming -dnl distance. -dnl -dnl P55: popcount 11.5 cycles/limb, hamdist 12.0 cycles/limb - - -dnl Copyright (C) 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - -MULFUNC_PROLOGUE(mpn_popcount mpn_hamdist) -include_mpn(`x86/k6/mmx/popham.asm') diff --git a/rts/gmp/mpn/x86/pentium/mmx/rshift.asm b/rts/gmp/mpn/x86/pentium/mmx/rshift.asm deleted file mode 100644 index 7672630..0000000 --- a/rts/gmp/mpn/x86/pentium/mmx/rshift.asm +++ /dev/null @@ -1,460 +0,0 @@ -dnl Intel P5 mpn_rshift -- mpn right shift. -dnl -dnl P5: 1.75 cycles/limb. - - -dnl Copyright (C) 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -C mp_limb_t mpn_rshift (mp_ptr dst, mp_srcptr src, mp_size_t size, -C unsigned shift); -C -C Shift src,size right by shift many bits and store the result in dst,size. -C Zeros are shifted in at the left. Return the bits shifted out at the -C right. -C -C It takes 6 mmx instructions to process 2 limbs, making 1.5 cycles/limb, -C and with a 4 limb loop and 1 cycle of loop overhead the total is 1.75 c/l. -C -C Full speed depends on source and destination being aligned. Unaligned mmx -C loads and stores on P5 don't pair and have a 2 cycle penalty. Some hairy -C setups and finish-ups are done to ensure alignment for the loop. -C -C MMX shifts work out a bit faster even for the simple loop. - -defframe(PARAM_SHIFT,16) -defframe(PARAM_SIZE, 12) -defframe(PARAM_SRC, 8) -defframe(PARAM_DST, 4) -deflit(`FRAME',0) - -dnl Minimum 5, because the unrolled loop can't handle less. -deflit(UNROLL_THRESHOLD, 5) - - .text - ALIGN(8) - -PROLOGUE(mpn_rshift) - - pushl %ebx - pushl %edi -deflit(`FRAME',8) - - movl PARAM_SIZE, %eax - movl PARAM_DST, %edx - - movl PARAM_SRC, %ebx - movl PARAM_SHIFT, %ecx - - cmp $UNROLL_THRESHOLD, %eax - jae L(unroll) - - decl %eax - movl (%ebx), %edi C src low limb - - jnz L(simple) - - shrdl( %cl, %edi, %eax) C eax was decremented to zero - - shrl %cl, %edi - - movl %edi, (%edx) C dst low limb - popl %edi C risk of data cache bank clash - - popl %ebx - - ret - - -C ----------------------------------------------------------------------------- - ALIGN(8) -L(simple): - C eax size-1 - C ebx src - C ecx shift - C edx dst - C esi - C edi - C ebp -deflit(`FRAME',8) - - movd (%ebx), %mm5 C src[0] - leal (%ebx,%eax,4), %ebx C &src[size-1] - - movd %ecx, %mm6 C rshift - leal -4(%edx,%eax,4), %edx C &dst[size-2] - - psllq $32, %mm5 - negl %eax - - -C This loop is 5 or 8 cycles, with every second load unaligned and a wasted -C cycle waiting for the mm0 result to be ready. For comparison a shrdl is 4 -C cycles and would be 8 in a simple loop. Using mmx helps the return value -C and last limb calculations too. - -L(simple_top): - C eax counter, limbs, negative - C ebx &src[size-1] - C ecx return value - C edx &dst[size-2] - C - C mm0 scratch - C mm5 return value - C mm6 shift - - movq (%ebx,%eax,4), %mm0 - incl %eax - - psrlq %mm6, %mm0 - - movd %mm0, (%edx,%eax,4) - jnz L(simple_top) - - - movd (%ebx), %mm0 - psrlq %mm6, %mm5 C return value - - psrlq %mm6, %mm0 - popl %edi - - movd %mm5, %eax - popl %ebx - - movd %mm0, 4(%edx) - - emms - - ret - - -C ----------------------------------------------------------------------------- - ALIGN(8) -L(unroll): - C eax size - C ebx src - C ecx shift - C edx dst - C esi - C edi - C ebp -deflit(`FRAME',8) - - movd (%ebx), %mm5 C src[0] - movl $4, %edi - - movd %ecx, %mm6 C rshift - testl %edi, %ebx - - psllq $32, %mm5 - jz L(start_src_aligned) - - - C src isn't aligned, process low limb separately (marked xxx) and - C step src and dst by one limb, making src aligned. - C - C source ebx - C --+-------+-------+-------+ - C | xxx | - C --+-------+-------+-------+ - C 4mod8 0mod8 4mod8 - C - C dest edx - C --+-------+-------+ - C | | xxx | - C --+-------+-------+ - - movq (%ebx), %mm0 C unaligned load - - psrlq %mm6, %mm0 - addl $4, %ebx - - decl %eax - - movd %mm0, (%edx) - addl $4, %edx -L(start_src_aligned): - - - movq (%ebx), %mm1 - testl %edi, %edx - - psrlq %mm6, %mm5 C retval - jz L(start_dst_aligned) - - C dst isn't aligned, add 4 to make it so, and pretend the shift is - C 32 bits extra. Low limb of dst (marked xxx) handled here - C separately. - C - C source ebx - C --+-------+-------+ - C | mm1 | - C --+-------+-------+ - C 4mod8 0mod8 - C - C dest edx - C --+-------+-------+-------+ - C | xxx | - C --+-------+-------+-------+ - C 4mod8 0mod8 4mod8 - - movq %mm1, %mm0 - addl $32, %ecx C new shift - - psrlq %mm6, %mm0 - - movd %ecx, %mm6 - - movd %mm0, (%edx) - addl $4, %edx -L(start_dst_aligned): - - - movq 8(%ebx), %mm3 - negl %ecx - - movq %mm3, %mm2 C mm2 src qword - addl $64, %ecx - - movd %ecx, %mm7 - psrlq %mm6, %mm1 - - leal -12(%ebx,%eax,4), %ebx - leal -20(%edx,%eax,4), %edx - - psllq %mm7, %mm3 - subl $7, %eax C size-7 - - por %mm1, %mm3 C mm3 ready to store - negl %eax C -(size-7) - - jns L(finish) - - - C This loop is the important bit, the rest is just support. Careful - C instruction scheduling achieves the claimed 1.75 c/l. The - C relevant parts of the pairing rules are: - C - C - mmx loads and stores execute only in the U pipe - C - only one mmx shift in a pair - C - wait one cycle before storing an mmx register result - C - the usual address generation interlock - C - C Two qword calculations are slightly interleaved. The instructions - C marked "C" belong to the second qword, and the "C prev" one is for - C the second qword from the previous iteration. - - ALIGN(8) -L(unroll_loop): - C eax counter, limbs, negative - C ebx &src[size-12] - C ecx - C edx &dst[size-12] - C esi - C edi - C - C mm0 - C mm1 - C mm2 src qword from -8(%ebx,%eax,4) - C mm3 dst qword ready to store to -8(%edx,%eax,4) - C - C mm5 return value - C mm6 rshift - C mm7 lshift - - movq (%ebx,%eax,4), %mm0 - psrlq %mm6, %mm2 - - movq %mm0, %mm1 - psllq %mm7, %mm0 - - movq %mm3, -8(%edx,%eax,4) C prev - por %mm2, %mm0 - - movq 8(%ebx,%eax,4), %mm3 C - psrlq %mm6, %mm1 C - - movq %mm0, (%edx,%eax,4) - movq %mm3, %mm2 C - - psllq %mm7, %mm3 C - addl $4, %eax - - por %mm1, %mm3 C - js L(unroll_loop) - - -L(finish): - C eax 0 to 3 representing respectively 3 to 0 limbs remaining - - testb $2, %al - - jnz L(finish_no_two) - - movq (%ebx,%eax,4), %mm0 - psrlq %mm6, %mm2 - - movq %mm0, %mm1 - psllq %mm7, %mm0 - - movq %mm3, -8(%edx,%eax,4) C prev - por %mm2, %mm0 - - movq %mm1, %mm2 - movq %mm0, %mm3 - - addl $2, %eax -L(finish_no_two): - - - C eax 2 or 3 representing respectively 1 or 0 limbs remaining - C - C mm2 src prev qword, from -8(%ebx,%eax,4) - C mm3 dst qword, for -8(%edx,%eax,4) - - testb $1, %al - popl %edi - - movd %mm5, %eax C retval - jnz L(finish_zero) - - - C One extra limb, destination was aligned. - C - C source ebx - C +-------+---------------+-- - C | | mm2 | - C +-------+---------------+-- - C - C dest edx - C +-------+---------------+---------------+-- - C | | | mm3 | - C +-------+---------------+---------------+-- - C - C mm6 = shift - C mm7 = ecx = 64-shift - - - C One extra limb, destination was unaligned. - C - C source ebx - C +-------+---------------+-- - C | | mm2 | - C +-------+---------------+-- - C - C dest edx - C +---------------+---------------+-- - C | | mm3 | - C +---------------+---------------+-- - C - C mm6 = shift+32 - C mm7 = ecx = 64-(shift+32) - - - C In both cases there's one extra limb of src to fetch and combine - C with mm2 to make a qword at 8(%edx), and in the aligned case - C there's a further extra limb of dst to be formed. - - - movd 8(%ebx), %mm0 - psrlq %mm6, %mm2 - - movq %mm0, %mm1 - psllq %mm7, %mm0 - - movq %mm3, (%edx) - por %mm2, %mm0 - - psrlq %mm6, %mm1 - andl $32, %ecx - - popl %ebx - jz L(finish_one_unaligned) - - C dst was aligned, must store one extra limb - movd %mm1, 16(%edx) -L(finish_one_unaligned): - - movq %mm0, 8(%edx) - - emms - - ret - - -L(finish_zero): - - C No extra limbs, destination was aligned. - C - C source ebx - C +---------------+-- - C | mm2 | - C +---------------+-- - C - C dest edx+4 - C +---------------+---------------+-- - C | | mm3 | - C +---------------+---------------+-- - C - C mm6 = shift - C mm7 = ecx = 64-shift - - - C No extra limbs, destination was unaligned. - C - C source ebx - C +---------------+-- - C | mm2 | - C +---------------+-- - C - C dest edx+4 - C +-------+---------------+-- - C | | mm3 | - C +-------+---------------+-- - C - C mm6 = shift+32 - C mm7 = 64-(shift+32) - - - C The movd for the unaligned case is clearly the same data as the - C movq for the aligned case, it's just a choice between whether one - C or two limbs should be written. - - - movq %mm3, 4(%edx) - psrlq %mm6, %mm2 - - movd %mm2, 12(%edx) - andl $32, %ecx - - popl %ebx - jz L(finish_zero_unaligned) - - movq %mm2, 12(%edx) -L(finish_zero_unaligned): - - emms - - ret - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/pentium/mul_1.asm b/rts/gmp/mpn/x86/pentium/mul_1.asm deleted file mode 100644 index 08639ec..0000000 --- a/rts/gmp/mpn/x86/pentium/mul_1.asm +++ /dev/null @@ -1,79 +0,0 @@ -dnl Intel Pentium mpn_mul_1 -- mpn by limb multiplication. -dnl -dnl P5: 13.0 cycles/limb - -dnl Copyright (C) 1992, 1994, 1996, 1999, 2000 Free Software Foundation, -dnl Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. */ - - -include(`../config.m4') - - -C mp_limb_t mpn_mul_1 (mp_ptr dst, mp_srcptr src, mp_size_t size, -C mp_limb_t multiplier); - -defframe(PARAM_MULTIPLIER,16) -defframe(PARAM_SIZE, 12) -defframe(PARAM_SRC, 8) -defframe(PARAM_DST, 4) - - .text - ALIGN(8) -PROLOGUE(mpn_mul_1) - - pushl %edi - pushl %esi - pushl %ebx - pushl %ebp -deflit(`FRAME',16) - - movl PARAM_DST, %edi - movl PARAM_SRC, %esi - movl PARAM_SIZE, %ecx - movl PARAM_MULTIPLIER, %ebp - - leal (%edi,%ecx,4), %edi - leal (%esi,%ecx,4), %esi - negl %ecx - xorl %ebx, %ebx - ALIGN(8) - -L(oop): adcl $0, %ebx - movl (%esi,%ecx,4), %eax - - mull %ebp - - addl %eax, %ebx - - movl %ebx, (%edi,%ecx,4) - incl %ecx - - movl %edx, %ebx - jnz L(oop) - - adcl $0, %ebx - movl %ebx, %eax - popl %ebp - popl %ebx - popl %esi - popl %edi - ret - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/pentium/mul_basecase.asm b/rts/gmp/mpn/x86/pentium/mul_basecase.asm deleted file mode 100644 index d9f79a0..0000000 --- a/rts/gmp/mpn/x86/pentium/mul_basecase.asm +++ /dev/null @@ -1,135 +0,0 @@ -dnl Intel Pentium mpn_mul_basecase -- mpn by mpn multiplication. -dnl -dnl P5: 14.2 cycles/crossproduct (approx) - - -dnl Copyright (C) 1996, 1998, 1999, 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -C void mpn_mul_basecase (mp_ptr wp, -C mp_srcptr xp, mp_size_t xsize, -C mp_srcptr yp, mp_size_t ysize); - -defframe(PARAM_YSIZE, 20) -defframe(PARAM_YP, 16) -defframe(PARAM_XSIZE, 12) -defframe(PARAM_XP, 8) -defframe(PARAM_WP, 4) - -defframe(VAR_COUNTER, -4) - - .text - ALIGN(8) -PROLOGUE(mpn_mul_basecase) - - pushl %eax C dummy push for allocating stack slot - pushl %esi - pushl %ebp - pushl %edi -deflit(`FRAME',16) - - movl PARAM_XP,%esi - movl PARAM_WP,%edi - movl PARAM_YP,%ebp - - movl (%esi),%eax C load xp[0] - mull (%ebp) C multiply by yp[0] - movl %eax,(%edi) C store to wp[0] - movl PARAM_XSIZE,%ecx C xsize - decl %ecx C If xsize = 1, ysize = 1 too - jz L(done) - - movl PARAM_XSIZE,%eax - pushl %ebx -FRAME_pushl() - movl %edx,%ebx - leal (%esi,%eax,4),%esi C make xp point at end - leal (%edi,%eax,4),%edi C offset wp by xsize - negl %ecx C negate j size/index for inner loop - xorl %eax,%eax C clear carry - - ALIGN(8) -L(oop1): adcl $0,%ebx - movl (%esi,%ecx,4),%eax C load next limb at xp[j] - mull (%ebp) - addl %ebx,%eax - movl %eax,(%edi,%ecx,4) - incl %ecx - movl %edx,%ebx - jnz L(oop1) - - adcl $0,%ebx - movl PARAM_YSIZE,%eax - movl %ebx,(%edi) C most significant limb of product - addl $4,%edi C increment wp - decl %eax - jz L(skip) - movl %eax,VAR_COUNTER C set index i to ysize - -L(outer): - addl $4,%ebp C make ebp point to next y limb - movl PARAM_XSIZE,%ecx - negl %ecx - xorl %ebx,%ebx - - C code at 0x61 here, close enough to aligned -L(oop2): - adcl $0,%ebx - movl (%esi,%ecx,4),%eax - mull (%ebp) - addl %ebx,%eax - movl (%edi,%ecx,4),%ebx - adcl $0,%edx - addl %eax,%ebx - movl %ebx,(%edi,%ecx,4) - incl %ecx - movl %edx,%ebx - jnz L(oop2) - - adcl $0,%ebx - - movl %ebx,(%edi) - addl $4,%edi - movl VAR_COUNTER,%eax - decl %eax - movl %eax,VAR_COUNTER - jnz L(outer) - -L(skip): - popl %ebx - popl %edi - popl %ebp - popl %esi - addl $4,%esp - ret - -L(done): - movl %edx,4(%edi) C store to wp[1] - popl %edi - popl %ebp - popl %esi - popl %eax C dummy pop for deallocating stack slot - ret - -EPILOGUE() - diff --git a/rts/gmp/mpn/x86/pentium/rshift.asm b/rts/gmp/mpn/x86/pentium/rshift.asm deleted file mode 100644 index e8f5ae8..0000000 --- a/rts/gmp/mpn/x86/pentium/rshift.asm +++ /dev/null @@ -1,236 +0,0 @@ -dnl Intel Pentium mpn_rshift -- mpn right shift. -dnl -dnl cycles/limb -dnl P5,P54: 6.0 -dnl P55: 5.375 - - -dnl Copyright (C) 1992, 1994, 1995, 1996, 1999, 2000 Free Software -dnl Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -C mp_limb_t mpn_rshift (mp_ptr dst, mp_srcptr src, mp_size_t size, -C unsigned shift); -C -C The main shift-by-N loop should run at 5.375 c/l and that's what P55 does, -C but P5 and P54 run only at 6.0 c/l, which is 4 cycles lost somewhere. - -defframe(PARAM_SHIFT,16) -defframe(PARAM_SIZE, 12) -defframe(PARAM_SRC, 8) -defframe(PARAM_DST, 4) - - .text - ALIGN(8) -PROLOGUE(mpn_rshift) - - pushl %edi - pushl %esi - pushl %ebx - pushl %ebp -deflit(`FRAME',16) - - movl PARAM_DST,%edi - movl PARAM_SRC,%esi - movl PARAM_SIZE,%ebp - movl PARAM_SHIFT,%ecx - -C We can use faster code for shift-by-1 under certain conditions. - cmp $1,%ecx - jne L(normal) - leal 4(%edi),%eax - cmpl %esi,%eax - jnc L(special) C jump if res_ptr + 1 >= s_ptr - leal (%edi,%ebp,4),%eax - cmpl %eax,%esi - jnc L(special) C jump if s_ptr >= res_ptr + size - -L(normal): - movl (%esi),%edx - addl $4,%esi - xorl %eax,%eax - shrdl( %cl, %edx, %eax) C compute carry limb - pushl %eax C push carry limb onto stack - - decl %ebp - pushl %ebp - shrl $3,%ebp - jz L(end) - - movl (%edi),%eax C fetch destination cache line - - ALIGN(4) -L(oop): movl 28(%edi),%eax C fetch destination cache line - movl %edx,%ebx - - movl (%esi),%eax - movl 4(%esi),%edx - shrdl( %cl, %eax, %ebx) - shrdl( %cl, %edx, %eax) - movl %ebx,(%edi) - movl %eax,4(%edi) - - movl 8(%esi),%ebx - movl 12(%esi),%eax - shrdl( %cl, %ebx, %edx) - shrdl( %cl, %eax, %ebx) - movl %edx,8(%edi) - movl %ebx,12(%edi) - - movl 16(%esi),%edx - movl 20(%esi),%ebx - shrdl( %cl, %edx, %eax) - shrdl( %cl, %ebx, %edx) - movl %eax,16(%edi) - movl %edx,20(%edi) - - movl 24(%esi),%eax - movl 28(%esi),%edx - shrdl( %cl, %eax, %ebx) - shrdl( %cl, %edx, %eax) - movl %ebx,24(%edi) - movl %eax,28(%edi) - - addl $32,%esi - addl $32,%edi - decl %ebp - jnz L(oop) - -L(end): popl %ebp - andl $7,%ebp - jz L(end2) -L(oop2): - movl (%esi),%eax - shrdl( %cl,%eax,%edx) C compute result limb - movl %edx,(%edi) - movl %eax,%edx - addl $4,%esi - addl $4,%edi - decl %ebp - jnz L(oop2) - -L(end2): - shrl %cl,%edx C compute most significant limb - movl %edx,(%edi) C store it - - popl %eax C pop carry limb - - popl %ebp - popl %ebx - popl %esi - popl %edi - ret - - -C We loop from least significant end of the arrays, which is only -C permissable if the source and destination don't overlap, since the -C function is documented to work for overlapping source and destination. - -L(special): - leal -4(%edi,%ebp,4),%edi - leal -4(%esi,%ebp,4),%esi - - movl (%esi),%edx - subl $4,%esi - - decl %ebp - pushl %ebp - shrl $3,%ebp - - shrl %edx - incl %ebp - decl %ebp - jz L(Lend) - - movl (%edi),%eax C fetch destination cache line - - ALIGN(4) -L(Loop): - movl -28(%edi),%eax C fetch destination cache line - movl %edx,%ebx - - movl (%esi),%eax - movl -4(%esi),%edx - rcrl %eax - movl %ebx,(%edi) - rcrl %edx - movl %eax,-4(%edi) - - movl -8(%esi),%ebx - movl -12(%esi),%eax - rcrl %ebx - movl %edx,-8(%edi) - rcrl %eax - movl %ebx,-12(%edi) - - movl -16(%esi),%edx - movl -20(%esi),%ebx - rcrl %edx - movl %eax,-16(%edi) - rcrl %ebx - movl %edx,-20(%edi) - - movl -24(%esi),%eax - movl -28(%esi),%edx - rcrl %eax - movl %ebx,-24(%edi) - rcrl %edx - movl %eax,-28(%edi) - - leal -32(%esi),%esi C use leal not to clobber carry - leal -32(%edi),%edi - decl %ebp - jnz L(Loop) - -L(Lend): - popl %ebp - sbbl %eax,%eax C save carry in %eax - andl $7,%ebp - jz L(Lend2) - addl %eax,%eax C restore carry from eax -L(Loop2): - movl %edx,%ebx - movl (%esi),%edx - rcrl %edx - movl %ebx,(%edi) - - leal -4(%esi),%esi C use leal not to clobber carry - leal -4(%edi),%edi - decl %ebp - jnz L(Loop2) - - jmp L(L1) -L(Lend2): - addl %eax,%eax C restore carry from eax -L(L1): movl %edx,(%edi) C store last limb - - movl $0,%eax - rcrl %eax - - popl %ebp - popl %ebx - popl %esi - popl %edi - ret - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/pentium/sqr_basecase.asm b/rts/gmp/mpn/x86/pentium/sqr_basecase.asm deleted file mode 100644 index c8584df..0000000 --- a/rts/gmp/mpn/x86/pentium/sqr_basecase.asm +++ /dev/null @@ -1,520 +0,0 @@ -dnl Intel P5 mpn_sqr_basecase -- square an mpn number. -dnl -dnl P5: approx 8 cycles per crossproduct, or 15.5 cycles per triangular -dnl product at around 20x20 limbs. - - -dnl Copyright (C) 1999, 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -C void mpn_sqr_basecase (mp_ptr dst, mp_srcptr src, mp_size_t size); -C -C Calculate src,size squared, storing the result in dst,2*size. -C -C The algorithm is basically the same as mpn/generic/sqr_basecase.c, but a -C lot of function call overheads are avoided, especially when the size is -C small. - -defframe(PARAM_SIZE,12) -defframe(PARAM_SRC, 8) -defframe(PARAM_DST, 4) - - .text - ALIGN(8) -PROLOGUE(mpn_sqr_basecase) -deflit(`FRAME',0) - - movl PARAM_SIZE, %edx - movl PARAM_SRC, %eax - - cmpl $2, %edx - movl PARAM_DST, %ecx - - je L(two_limbs) - - movl (%eax), %eax - ja L(three_or_more) - -C ----------------------------------------------------------------------------- -C one limb only - C eax src - C ebx - C ecx dst - C edx - - mull %eax - - movl %eax, (%ecx) - movl %edx, 4(%ecx) - - ret - -C ----------------------------------------------------------------------------- - ALIGN(8) -L(two_limbs): - C eax src - C ebx - C ecx dst - C edx size - - pushl %ebp - pushl %edi - - pushl %esi - pushl %ebx - - movl %eax, %ebx - movl (%eax), %eax - - mull %eax C src[0]^2 - - movl %eax, (%ecx) C dst[0] - movl %edx, %esi C dst[1] - - movl 4(%ebx), %eax - - mull %eax C src[1]^2 - - movl %eax, %edi C dst[2] - movl %edx, %ebp C dst[3] - - movl (%ebx), %eax - - mull 4(%ebx) C src[0]*src[1] - - addl %eax, %esi - popl %ebx - - adcl %edx, %edi - - adcl $0, %ebp - addl %esi, %eax - - adcl %edi, %edx - movl %eax, 4(%ecx) - - adcl $0, %ebp - popl %esi - - movl %edx, 8(%ecx) - movl %ebp, 12(%ecx) - - popl %edi - popl %ebp - - ret - - -C ----------------------------------------------------------------------------- - ALIGN(8) -L(three_or_more): - C eax src low limb - C ebx - C ecx dst - C edx size - - cmpl $4, %edx - pushl %ebx -deflit(`FRAME',4) - - movl PARAM_SRC, %ebx - jae L(four_or_more) - - -C ----------------------------------------------------------------------------- -C three limbs - C eax src low limb - C ebx src - C ecx dst - C edx size - - pushl %ebp - pushl %edi - - mull %eax C src[0] ^ 2 - - movl %eax, (%ecx) - movl %edx, 4(%ecx) - - movl 4(%ebx), %eax - xorl %ebp, %ebp - - mull %eax C src[1] ^ 2 - - movl %eax, 8(%ecx) - movl %edx, 12(%ecx) - - movl 8(%ebx), %eax - pushl %esi C risk of cache bank clash - - mull %eax C src[2] ^ 2 - - movl %eax, 16(%ecx) - movl %edx, 20(%ecx) - - movl (%ebx), %eax - - mull 4(%ebx) C src[0] * src[1] - - movl %eax, %esi - movl %edx, %edi - - movl (%ebx), %eax - - mull 8(%ebx) C src[0] * src[2] - - addl %eax, %edi - movl %edx, %ebp - - adcl $0, %ebp - movl 4(%ebx), %eax - - mull 8(%ebx) C src[1] * src[2] - - xorl %ebx, %ebx - addl %eax, %ebp - - C eax - C ebx zero, will be dst[5] - C ecx dst - C edx dst[4] - C esi dst[1] - C edi dst[2] - C ebp dst[3] - - adcl $0, %edx - addl %esi, %esi - - adcl %edi, %edi - - adcl %ebp, %ebp - - adcl %edx, %edx - movl 4(%ecx), %eax - - adcl $0, %ebx - addl %esi, %eax - - movl %eax, 4(%ecx) - movl 8(%ecx), %eax - - adcl %edi, %eax - movl 12(%ecx), %esi - - adcl %ebp, %esi - movl 16(%ecx), %edi - - movl %eax, 8(%ecx) - movl %esi, 12(%ecx) - - adcl %edx, %edi - popl %esi - - movl 20(%ecx), %eax - movl %edi, 16(%ecx) - - popl %edi - popl %ebp - - adcl %ebx, %eax C no carry out of this - popl %ebx - - movl %eax, 20(%ecx) - - ret - - -C ----------------------------------------------------------------------------- - ALIGN(8) -L(four_or_more): - C eax src low limb - C ebx src - C ecx dst - C edx size - C esi - C edi - C ebp - C - C First multiply src[0]*src[1..size-1] and store at dst[1..size]. - -deflit(`FRAME',4) - - pushl %edi -FRAME_pushl() - pushl %esi -FRAME_pushl() - - pushl %ebp -FRAME_pushl() - leal (%ecx,%edx,4), %edi C dst end of this mul1 - - leal (%ebx,%edx,4), %esi C src end - movl %ebx, %ebp C src - - negl %edx C -size - xorl %ebx, %ebx C clear carry limb and carry flag - - leal 1(%edx), %ecx C -(size-1) - -L(mul1): - C eax scratch - C ebx carry - C ecx counter, negative - C edx scratch - C esi &src[size] - C edi &dst[size] - C ebp src - - adcl $0, %ebx - movl (%esi,%ecx,4), %eax - - mull (%ebp) - - addl %eax, %ebx - - movl %ebx, (%edi,%ecx,4) - incl %ecx - - movl %edx, %ebx - jnz L(mul1) - - - C Add products src[n]*src[n+1..size-1] at dst[2*n-1...], for - C n=1..size-2. - C - C The last two products, which are the end corner of the product - C triangle, are handled separately to save looping overhead. These - C are src[size-3]*src[size-2,size-1] and src[size-2]*src[size-1]. - C If size is 4 then it's only these that need to be done. - C - C In the outer loop %esi is a constant, and %edi just advances by 1 - C limb each time. The size of the operation decreases by 1 limb - C each time. - - C eax - C ebx carry (needing carry flag added) - C ecx - C edx - C esi &src[size] - C edi &dst[size] - C ebp - - adcl $0, %ebx - movl PARAM_SIZE, %edx - - movl %ebx, (%edi) - subl $4, %edx - - negl %edx - jz L(corner) - - -L(outer): - C ebx previous carry limb to store - C edx outer loop counter (negative) - C esi &src[size] - C edi dst, pointing at stored carry limb of previous loop - - pushl %edx C new outer loop counter - leal -2(%edx), %ecx - - movl %ebx, (%edi) - addl $4, %edi - - addl $4, %ebp - xorl %ebx, %ebx C initial carry limb, clear carry flag - -L(inner): - C eax scratch - C ebx carry (needing carry flag added) - C ecx counter, negative - C edx scratch - C esi &src[size] - C edi dst end of this addmul - C ebp &src[j] - - adcl $0, %ebx - movl (%esi,%ecx,4), %eax - - mull (%ebp) - - addl %ebx, %eax - movl (%edi,%ecx,4), %ebx - - adcl $0, %edx - addl %eax, %ebx - - movl %ebx, (%edi,%ecx,4) - incl %ecx - - movl %edx, %ebx - jnz L(inner) - - - adcl $0, %ebx - popl %edx C outer loop counter - - incl %edx - jnz L(outer) - - - movl %ebx, (%edi) - -L(corner): - C esi &src[size] - C edi &dst[2*size-4] - - movl -8(%esi), %eax - movl -4(%edi), %ebx C risk of data cache bank clash here - - mull -12(%esi) C src[size-2]*src[size-3] - - addl %eax, %ebx - movl %edx, %ecx - - adcl $0, %ecx - movl -4(%esi), %eax - - mull -12(%esi) C src[size-1]*src[size-3] - - addl %ecx, %eax - movl (%edi), %ecx - - adcl $0, %edx - movl %ebx, -4(%edi) - - addl %eax, %ecx - movl %edx, %ebx - - adcl $0, %ebx - movl -4(%esi), %eax - - mull -8(%esi) C src[size-1]*src[size-2] - - movl %ecx, 0(%edi) - addl %eax, %ebx - - adcl $0, %edx - movl PARAM_SIZE, %eax - - negl %eax - movl %ebx, 4(%edi) - - addl $1, %eax C -(size-1) and clear carry - movl %edx, 8(%edi) - - -C ----------------------------------------------------------------------------- -C Left shift of dst[1..2*size-2], high bit shifted out becomes dst[2*size-1]. - -L(lshift): - C eax counter, negative - C ebx next limb - C ecx - C edx - C esi - C edi &dst[2*size-4] - C ebp - - movl 12(%edi,%eax,8), %ebx - - rcll %ebx - movl 16(%edi,%eax,8), %ecx - - rcll %ecx - movl %ebx, 12(%edi,%eax,8) - - movl %ecx, 16(%edi,%eax,8) - incl %eax - - jnz L(lshift) - - - adcl %eax, %eax C high bit out - movl PARAM_SRC, %esi - - movl PARAM_SIZE, %ecx C risk of cache bank clash - movl %eax, 12(%edi) C dst most significant limb - - -C ----------------------------------------------------------------------------- -C Now add in the squares on the diagonal, namely src[0]^2, src[1]^2, ..., -C src[size-1]^2. dst[0] hasn't yet been set at all yet, and just gets the -C low limb of src[0]^2. - - movl (%esi), %eax C src[0] - leal (%esi,%ecx,4), %esi C src end - - negl %ecx - - mull %eax - - movl %eax, 16(%edi,%ecx,8) C dst[0] - movl %edx, %ebx - - addl $1, %ecx C size-1 and clear carry - -L(diag): - C eax scratch (low product) - C ebx carry limb - C ecx counter, negative - C edx scratch (high product) - C esi &src[size] - C edi &dst[2*size-4] - C ebp scratch (fetched dst limbs) - - movl (%esi,%ecx,4), %eax - adcl $0, %ebx - - mull %eax - - movl 16-4(%edi,%ecx,8), %ebp - - addl %ebp, %ebx - movl 16(%edi,%ecx,8), %ebp - - adcl %eax, %ebp - movl %ebx, 16-4(%edi,%ecx,8) - - movl %ebp, 16(%edi,%ecx,8) - incl %ecx - - movl %edx, %ebx - jnz L(diag) - - - adcl $0, %edx - movl 16-4(%edi), %eax C dst most significant limb - - addl %eax, %edx - popl %ebp - - movl %edx, 16-4(%edi) - popl %esi C risk of cache bank clash - - popl %edi - popl %ebx - - ret - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/rshift.asm b/rts/gmp/mpn/x86/rshift.asm deleted file mode 100644 index c9881fd..0000000 --- a/rts/gmp/mpn/x86/rshift.asm +++ /dev/null @@ -1,92 +0,0 @@ -dnl x86 mpn_rshift -- mpn right shift. - -dnl Copyright (C) 1992, 1994, 1996, 1999, 2000 Free Software Foundation, -dnl Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -C mp_limb_t mpn_rshift (mp_ptr dst, mp_srcptr src, mp_size_t size, -C unsigned shift); - -defframe(PARAM_SHIFT,16) -defframe(PARAM_SIZE, 12) -defframe(PARAM_SRC, 8) -defframe(PARAM_DST, 4) - - .text - ALIGN(8) -PROLOGUE(mpn_rshift) - - pushl %edi - pushl %esi - pushl %ebx -deflit(`FRAME',12) - - movl PARAM_DST,%edi - movl PARAM_SRC,%esi - movl PARAM_SIZE,%edx - movl PARAM_SHIFT,%ecx - - leal -4(%edi,%edx,4),%edi - leal (%esi,%edx,4),%esi - negl %edx - - movl (%esi,%edx,4),%ebx C read least significant limb - xorl %eax,%eax - shrdl( %cl, %ebx, %eax) C compute carry limb - incl %edx - jz L(end) - pushl %eax C push carry limb onto stack - testb $1,%dl - jnz L(1) C enter loop in the middle - movl %ebx,%eax - - ALIGN(8) -L(oop): movl (%esi,%edx,4),%ebx C load next higher limb - shrdl( %cl, %ebx, %eax) C compute result limb - movl %eax,(%edi,%edx,4) C store it - incl %edx -L(1): movl (%esi,%edx,4),%eax - shrdl( %cl, %eax, %ebx) - movl %ebx,(%edi,%edx,4) - incl %edx - jnz L(oop) - - shrl %cl,%eax C compute most significant limb - movl %eax,(%edi) C store it - - popl %eax C pop carry limb - - popl %ebx - popl %esi - popl %edi - ret - -L(end): shrl %cl,%ebx C compute most significant limb - movl %ebx,(%edi) C store it - - popl %ebx - popl %esi - popl %edi - ret - -EPILOGUE() diff --git a/rts/gmp/mpn/x86/udiv.asm b/rts/gmp/mpn/x86/udiv.asm deleted file mode 100644 index 9fe022b..0000000 --- a/rts/gmp/mpn/x86/udiv.asm +++ /dev/null @@ -1,44 +0,0 @@ -dnl x86 mpn_udiv_qrnnd -- 2 by 1 limb division - -dnl Copyright (C) 1999, 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -C mp_limb_t mpn_udiv_qrnnd (mp_limb_t *remptr, mp_limb_t high, mp_limb_t low, -C mp_limb_t divisor); - -defframe(PARAM_DIVISOR, 16) -defframe(PARAM_LOW, 12) -defframe(PARAM_HIGH, 8) -defframe(PARAM_REMPTR, 4) - - TEXT - ALIGN(8) -PROLOGUE(mpn_udiv_qrnnd) -deflit(`FRAME',0) - movl PARAM_LOW, %eax - movl PARAM_HIGH, %edx - divl PARAM_DIVISOR - movl PARAM_REMPTR, %ecx - movl %edx, (%ecx) - ret -EPILOGUE() diff --git a/rts/gmp/mpn/x86/umul.asm b/rts/gmp/mpn/x86/umul.asm deleted file mode 100644 index 3d289d1..0000000 --- a/rts/gmp/mpn/x86/umul.asm +++ /dev/null @@ -1,43 +0,0 @@ -dnl mpn_umul_ppmm -- 1x1->2 limb multiplication - -dnl Copyright (C) 1999, 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -include(`../config.m4') - - -C mp_limb_t mpn_umul_ppmm (mp_limb_t *lowptr, mp_limb_t m1, mp_limb_t m2); -C - -defframe(PARAM_M2, 12) -defframe(PARAM_M1, 8) -defframe(PARAM_LOWPTR, 4) - - TEXT - ALIGN(8) -PROLOGUE(mpn_umul_ppmm) -deflit(`FRAME',0) - movl PARAM_LOWPTR, %ecx - movl PARAM_M1, %eax - mull PARAM_M2 - movl %eax, (%ecx) - movl %edx, %eax - ret -EPILOGUE() diff --git a/rts/gmp/mpn/x86/x86-defs.m4 b/rts/gmp/mpn/x86/x86-defs.m4 deleted file mode 100644 index 2dad698..0000000 --- a/rts/gmp/mpn/x86/x86-defs.m4 +++ /dev/null @@ -1,713 +0,0 @@ -divert(-1) - -dnl m4 macros for x86 assembler. - - -dnl Copyright (C) 1999, 2000 Free Software Foundation, Inc. -dnl -dnl This file is part of the GNU MP Library. -dnl -dnl The GNU MP Library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public License as -dnl published by the Free Software Foundation; either version 2.1 of the -dnl License, or (at your option) any later version. -dnl -dnl The GNU MP Library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with the GNU MP Library; see the file COPYING.LIB. If -dnl not, write to the Free Software Foundation, Inc., 59 Temple Place - -dnl Suite 330, Boston, MA 02111-1307, USA. - - -dnl Notes: -dnl -dnl m4 isn't perfect for processing BSD style x86 assembler code, the main -dnl problems are, -dnl -dnl 1. Doing define(foo,123) and then using foo in an addressing mode like -dnl foo(%ebx) expands as a macro rather than a constant. This is worked -dnl around by using deflit() from asm-defs.m4, instead of define(). -dnl -dnl 2. Immediates in macro definitions need a space or `' to stop the $ -dnl looking like a macro parameter. For example, -dnl -dnl define(foo, `mov $ 123, %eax') -dnl -dnl This is only a problem in macro definitions, not in ordinary text, -dnl nor in macro parameters like text passed to forloop() or ifdef(). - - -deflit(BYTES_PER_MP_LIMB, 4) - - -dnl -------------------------------------------------------------------------- -dnl Replacement PROLOGUE/EPILOGUE with more sophisticated error checking. -dnl Nesting and overlapping not allowed. -dnl - - -dnl Usage: PROLOGUE(functionname) -dnl -dnl Generate a function prologue. functionname gets GSYM_PREFIX added. -dnl Examples, -dnl -dnl PROLOGUE(mpn_add_n) -dnl PROLOGUE(somefun) - -define(`PROLOGUE', -m4_assert_numargs(1) -m4_assert_defined(`PROLOGUE_cpu') -`ifdef(`PROLOGUE_current_function', -`m4_error(`PROLOGUE'(`PROLOGUE_current_function') needs an `EPILOGUE'() before `PROLOGUE'($1) -)')dnl -m4_file_seen()dnl -define(`PROLOGUE_current_function',`$1')dnl -PROLOGUE_cpu(GSYM_PREFIX`'$1)') - - -dnl Usage: EPILOGUE() -dnl -dnl Notice the function name is passed to EPILOGUE_cpu(), letting it use $1 -dnl instead of the long PROLOGUE_current_function symbol. - -define(`EPILOGUE', -m4_assert_numargs(0) -m4_assert_defined(`EPILOGUE_cpu') -`ifdef(`PROLOGUE_current_function',, -`m4_error(`EPILOGUE'() with no `PROLOGUE'() -)')dnl -EPILOGUE_cpu(GSYM_PREFIX`'PROLOGUE_current_function)`'dnl -undefine(`PROLOGUE_current_function')') - -m4wrap_prepend( -`ifdef(`PROLOGUE_current_function', -`m4_error(`EPILOGUE() for PROLOGUE('PROLOGUE_current_function`) never seen -')')') - - -dnl Usage: PROLOGUE_assert_inside() -dnl -dnl Use this unquoted on a line on its own at the start of a macro -dnl definition to add some code to check the macro is only used inside a -dnl PROLOGUE/EPILOGUE pair, and that hence PROLOGUE_current_function is -dnl defined. - -define(PROLOGUE_assert_inside, -m4_assert_numargs(0) -``PROLOGUE_assert_inside_internal'(m4_doublequote($`'0))`dnl '') - -define(PROLOGUE_assert_inside_internal, -m4_assert_numargs(1) -`ifdef(`PROLOGUE_current_function',, -`m4_error(`$1 used outside a PROLOGUE / EPILOGUE pair -')')') - - -dnl Usage: L(labelname) -dnl LF(functionname,labelname) -dnl -dnl Generate a local label in the current or given function. For LF(), -dnl functionname gets GSYM_PREFIX added, the same as with PROLOGUE(). -dnl -dnl For example, in a function mpn_add_n (and with MPN_PREFIX __gmpn), -dnl -dnl L(bar) => L__gmpn_add_n__bar -dnl LF(somefun,bar) => Lsomefun__bar -dnl -dnl The funtion name and label name get two underscores between them rather -dnl than one to guard against clashing with a separate external symbol that -dnl happened to be called functionname_labelname. (Though this would only -dnl happen if the local label prefix is is empty.) Underscores are used so -dnl the whole label will still be a valid C identifier and so can be easily -dnl used in gdb. - -dnl LSYM_PREFIX can be L$, so defn() is used to prevent L expanding as the -dnl L macro and making an infinite recursion. -define(LF, -m4_assert_numargs(2) -m4_assert_defined(`LSYM_PREFIX') -`defn(`LSYM_PREFIX')GSYM_PREFIX`'$1`'__$2') - -define(`L', -m4_assert_numargs(1) -PROLOGUE_assert_inside() -`LF(PROLOGUE_current_function,`$1')') - - -dnl Called: PROLOGUE_cpu(gsym) -dnl EPILOGUE_cpu(gsym) - -define(PROLOGUE_cpu, -m4_assert_numargs(1) - `GLOBL $1 - TYPE($1,`function') -$1:') - -define(EPILOGUE_cpu, -m4_assert_numargs(1) -` SIZE($1,.-$1)') - - - -dnl -------------------------------------------------------------------------- -dnl Various x86 macros. -dnl - - -dnl Usage: ALIGN_OFFSET(bytes,offset) -dnl -dnl Align to `offset' away from a multiple of `bytes'. -dnl -dnl This is useful for testing, for example align to something very strict -dnl and see what effect offsets from it have, "ALIGN_OFFSET(256,32)". -dnl -dnl Generally you wouldn't execute across the padding, but it's done with -dnl nop's so it'll work. - -define(ALIGN_OFFSET, -m4_assert_numargs(2) -`ALIGN($1) -forloop(`i',1,$2,` nop -')') - - -dnl Usage: defframe(name,offset) -dnl -dnl Make a definition like the following with which to access a parameter -dnl or variable on the stack. -dnl -dnl define(name,`FRAME+offset(%esp)') -dnl -dnl Actually m4_empty_if_zero(FRAME+offset) is used, which will save one -dnl byte if FRAME+offset is zero, by putting (%esp) rather than 0(%esp). -dnl Use define(`defframe_empty_if_zero_disabled',1) if for some reason the -dnl zero offset is wanted. -dnl -dnl The new macro also gets a check that when it's used FRAME is actually -dnl defined, and that the final %esp offset isn't negative, which would -dnl mean an attempt to access something below the current %esp. -dnl -dnl deflit() is used rather than a plain define(), so the new macro won't -dnl delete any following parenthesized expression. name(%edi) will come -dnl out say as 16(%esp)(%edi). This isn't valid assembler and should -dnl provoke an error, which is better than silently giving just 16(%esp). -dnl -dnl See README.family for more on the suggested way to access the stack -dnl frame. - -define(defframe, -m4_assert_numargs(2) -`deflit(`$1', -m4_assert_defined(`FRAME') -`defframe_check_notbelow(`$1',$2,FRAME)dnl -defframe_empty_if_zero(FRAME+($2))(%esp)')') - -dnl Called: defframe_empty_if_zero(expression) -define(defframe_empty_if_zero, -`ifelse(defframe_empty_if_zero_disabled,1, -`eval($1)', -`m4_empty_if_zero($1)')') - -dnl Called: defframe_check_notbelow(`name',offset,FRAME) -define(defframe_check_notbelow, -m4_assert_numargs(3) -`ifelse(eval(($3)+($2)<0),1, -`m4_error(`$1 at frame offset $2 used when FRAME is only $3 bytes -')')') - - -dnl Usage: FRAME_pushl() -dnl FRAME_popl() -dnl FRAME_addl_esp(n) -dnl FRAME_subl_esp(n) -dnl -dnl Adjust FRAME appropriately for a pushl or popl, or for an addl or subl -dnl %esp of n bytes. -dnl -dnl Using these macros is completely optional. Sometimes it makes more -dnl sense to put explicit deflit(`FRAME',N) forms, especially when there's -dnl jumps and different sequences of FRAME values need to be used in -dnl different places. - -define(FRAME_pushl, -m4_assert_numargs(0) -m4_assert_defined(`FRAME') -`deflit(`FRAME',eval(FRAME+4))') - -define(FRAME_popl, -m4_assert_numargs(0) -m4_assert_defined(`FRAME') -`deflit(`FRAME',eval(FRAME-4))') - -define(FRAME_addl_esp, -m4_assert_numargs(1) -m4_assert_defined(`FRAME') -`deflit(`FRAME',eval(FRAME-($1)))') - -define(FRAME_subl_esp, -m4_assert_numargs(1) -m4_assert_defined(`FRAME') -`deflit(`FRAME',eval(FRAME+($1)))') - - -dnl Usage: defframe_pushl(name) -dnl -dnl Do a combination of a FRAME_pushl() and a defframe() to name the stack -dnl location just pushed. This should come after a pushl instruction. -dnl Putting it on the same line works and avoids lengthening the code. For -dnl example, -dnl -dnl pushl %eax defframe_pushl(VAR_COUNTER) -dnl -dnl Notice the defframe() is done with an unquoted -FRAME thus giving its -dnl current value without tracking future changes. - -define(defframe_pushl, -`FRAME_pushl()defframe(`$1',-FRAME)') - - -dnl -------------------------------------------------------------------------- -dnl Assembler instruction macros. -dnl - - -dnl Usage: emms_or_femms -dnl femms_available_p -dnl -dnl femms_available_p expands to 1 or 0 according to whether the AMD 3DNow -dnl femms instruction is available. emms_or_femms expands to femms if -dnl available, or emms if not. -dnl -dnl emms_or_femms is meant for use in the K6 directory where plain K6 -dnl (without femms) and K6-2 and K6-3 (with a slightly faster femms) are -dnl supported together. -dnl -dnl On K7 femms is no longer faster and is just an alias for emms, so plain -dnl emms may as well be used. - -define(femms_available_p, -m4_assert_numargs(-1) -`m4_ifdef_anyof_p( - `HAVE_TARGET_CPU_k62', - `HAVE_TARGET_CPU_k63', - `HAVE_TARGET_CPU_athlon')') - -define(emms_or_femms, -m4_assert_numargs(-1) -`ifelse(femms_available_p,1,`femms',`emms')') - - -dnl Usage: femms -dnl -dnl The gas 2.9.1 that comes with FreeBSD 3.4 doesn't support femms, so the -dnl following is a replacement using .byte. -dnl -dnl If femms isn't available, an emms is generated instead, for convenience -dnl when testing on a machine without femms. - -define(femms, -m4_assert_numargs(-1) -`ifelse(femms_available_p,1, -`.byte 15,14 C AMD 3DNow femms', -`emms`'dnl -m4_warning(`warning, using emms in place of femms, use for testing only -')')') - - -dnl Usage: jadcl0(op) -dnl -dnl Issue a jnc/incl as a substitute for adcl $0,op. This isn't an exact -dnl replacement, since it doesn't set the flags like adcl does. -dnl -dnl This finds a use in K6 mpn_addmul_1, mpn_submul_1, mpn_mul_basecase and -dnl mpn_sqr_basecase because on K6 an adcl is slow, the branch -dnl misprediction penalty is small, and the multiply algorithm used leads -dnl to a carry bit on average only 1/4 of the time. -dnl -dnl jadcl0_disabled can be set to 1 to instead issue an ordinary adcl for -dnl comparison. For example, -dnl -dnl define(`jadcl0_disabled',1) -dnl -dnl When using a register operand, eg. "jadcl0(%edx)", the jnc/incl code is -dnl the same size as an adcl. This makes it possible to use the exact same -dnl computed jump code when testing the relative speed of jnc/incl and adcl -dnl with jadcl0_disabled. - -define(jadcl0, -m4_assert_numargs(1) -`ifelse(jadcl0_disabled,1, - `adcl $`'0, $1', - `jnc 1f - incl $1 -1:dnl')') - - -dnl Usage: cmov_available_p -dnl -dnl Expand to 1 if cmov is available, 0 if not. - -define(cmov_available_p, -`m4_ifdef_anyof_p( - `HAVE_TARGET_CPU_pentiumpro', - `HAVE_TARGET_CPU_pentium2', - `HAVE_TARGET_CPU_pentium3', - `HAVE_TARGET_CPU_athlon')') - - -dnl Usage: x86_lookup(target, key,value, key,value, ...) -dnl x86_lookup_p(target, key,value, key,value, ...) -dnl -dnl Look for `target' among the `key' parameters. -dnl -dnl x86_lookup expands to the corresponding `value', or generates an error -dnl if `target' isn't found. -dnl -dnl x86_lookup_p expands to 1 if `target' is found, or 0 if not. - -define(x86_lookup, -`ifelse(eval($#<3),1, -`m4_error(`unrecognised part of x86 instruction: $1 -')', -`ifelse(`$1',`$2', `$3', -`x86_lookup(`$1',shift(shift(shift($@))))')')') - -define(x86_lookup_p, -`ifelse(eval($#<3),1, `0', -`ifelse(`$1',`$2', `1', -`x86_lookup_p(`$1',shift(shift(shift($@))))')')') - - -dnl Usage: x86_opcode_reg32(reg) -dnl x86_opcode_reg32_p(reg) -dnl -dnl x86_opcode_reg32 expands to the standard 3 bit encoding for the given -dnl 32-bit register, eg. `%ebp' turns into 5. -dnl -dnl x86_opcode_reg32_p expands to 1 if reg is a valid 32-bit register, or 0 -dnl if not. - -define(x86_opcode_reg32, -m4_assert_numargs(1) -`x86_lookup(`$1',x86_opcode_reg32_list)') - -define(x86_opcode_reg32_p, -m4_assert_onearg() -`x86_lookup_p(`$1',x86_opcode_reg32_list)') - -define(x86_opcode_reg32_list, -``%eax',0, -`%ecx',1, -`%edx',2, -`%ebx',3, -`%esp',4, -`%ebp',5, -`%esi',6, -`%edi',7') - - -dnl Usage: x86_opcode_tttn(cond) -dnl -dnl Expand to the 4-bit "tttn" field value for the given x86 branch -dnl condition (like `c', `ae', etc). - -define(x86_opcode_tttn, -m4_assert_numargs(1) -`x86_lookup(`$1',x86_opcode_ttn_list)') - -define(x86_opcode_tttn_list, -``o', 0, -`no', 1, -`b', 2, `c', 2, `nae',2, -`nb', 3, `nc', 3, `ae', 3, -`e', 4, `z', 4, -`ne', 5, `nz', 5, -`be', 6, `na', 6, -`nbe', 7, `a', 7, -`s', 8, -`ns', 9, -`p', 10, `pe', 10, `npo',10, -`np', 11, `npe',11, `po', 11, -`l', 12, `nge',12, -`nl', 13, `ge', 13, -`le', 14, `ng', 14, -`nle',15, `g', 15') - - -dnl Usage: cmovCC(srcreg,dstreg) -dnl -dnl Generate a cmov instruction if the target supports cmov, or simulate it -dnl with a conditional jump if not (the latter being meant only for -dnl testing). For example, -dnl -dnl cmovz( %eax, %ebx) -dnl -dnl cmov instructions are generated using .byte sequences, since only -dnl recent versions of gas know cmov. -dnl -dnl The source operand can only be a plain register. (m4 code implementing -dnl full memory addressing modes exists, believe it or not, but isn't -dnl currently needed and isn't included.) -dnl -dnl All the standard conditions are defined. Attempting to use one without -dnl the macro parentheses, such as just "cmovbe %eax, %ebx", will provoke -dnl an error. This ensures the necessary .byte sequences aren't -dnl accidentally missed. - -dnl Called: define_cmov_many(cond,tttn,cond,tttn,...) -define(define_cmov_many, -`ifelse(m4_length(`$1'),0,, -`define_cmov(`$1',`$2')define_cmov_many(shift(shift($@)))')') - -dnl Called: define_cmov(cond,tttn) -define(define_cmov, -m4_assert_numargs(2) -`define(`cmov$1', -m4_instruction_wrapper() -m4_assert_numargs(2) -`cmov_internal'(m4_doublequote($`'0),``$1',`$2'',dnl -m4_doublequote($`'1),m4_doublequote($`'2)))') - -define_cmov_many(x86_opcode_tttn_list) - - -dnl Called: cmov_internal(name,cond,tttn,src,dst) -define(cmov_internal, -m4_assert_numargs(5) -`ifelse(cmov_available_p,1, -`cmov_bytes_tttn(`$1',`$3',`$4',`$5')', -`m4_warning(`warning, simulating cmov with jump, use for testing only -')cmov_simulate(`$2',`$4',`$5')')') - -dnl Called: cmov_simulate(cond,src,dst) -dnl If this is going to be used with memory operands for the source it will -dnl need to be changed to do a fetch even if the condition is false, so as -dnl to trigger exceptions the same way a real cmov does. -define(cmov_simulate, -m4_assert_numargs(3) - `j$1 1f C cmov$1 $2, $3 - jmp 2f -1: movl $2, $3 -2:') - -dnl Called: cmov_bytes_tttn(name,tttn,src,dst) -define(cmov_bytes_tttn, -m4_assert_numargs(4) -`.byte dnl -15, dnl -eval(64+$2), dnl -eval(192+8*x86_opcode_reg32(`$4')+x86_opcode_reg32(`$3')) dnl - C `$1 $3, $4'') - - -dnl Usage: loop_or_decljnz label -dnl -dnl Generate either a "loop" instruction or a "decl %ecx / jnz", whichever -dnl is better. "loop" is better on K6 and probably on 386, on other chips -dnl separate decl/jnz is better. -dnl -dnl This macro is just for mpn/x86/divrem_1.asm and mpn/x86/mod_1.asm where -dnl this loop_or_decljnz variation is enough to let the code be shared by -dnl all chips. - -define(loop_or_decljnz, -`ifelse(loop_is_better_p,1, - `loop', - `decl %ecx - jnz')') - -define(loop_is_better_p, -`m4_ifdef_anyof_p(`HAVE_TARGET_CPU_k6', - `HAVE_TARGET_CPU_k62', - `HAVE_TARGET_CPU_k63', - `HAVE_TARGET_CPU_i386')') - - -dnl Usage: Zdisp(inst,op,op,op) -dnl -dnl Generate explicit .byte sequences if necessary to force a byte-sized -dnl zero displacement on an instruction. For example, -dnl -dnl Zdisp( movl, 0,(%esi), %eax) -dnl -dnl expands to -dnl -dnl .byte 139,70,0 C movl 0(%esi), %eax -dnl -dnl If the displacement given isn't 0, then normal assembler code is -dnl generated. For example, -dnl -dnl Zdisp( movl, 4,(%esi), %eax) -dnl -dnl expands to -dnl -dnl movl 4(%esi), %eax -dnl -dnl This means a single Zdisp() form can be used with an expression for the -dnl displacement, and .byte will be used only if necessary. The -dnl displacement argument is eval()ed. -dnl -dnl Because there aren't many places a 0(reg) form is wanted, Zdisp is -dnl implemented with a table of instructions and encodings. A new entry is -dnl needed for any different operation or registers. - -define(Zdisp, -`define(`Zdisp_found',0)dnl -Zdisp_match( movl, %eax, 0,(%edi), `137,71,0', $@)`'dnl -Zdisp_match( movl, %ebx, 0,(%edi), `137,95,0', $@)`'dnl -Zdisp_match( movl, %esi, 0,(%edi), `137,119,0', $@)`'dnl -Zdisp_match( movl, 0,(%ebx), %eax, `139,67,0', $@)`'dnl -Zdisp_match( movl, 0,(%ebx), %esi, `139,115,0', $@)`'dnl -Zdisp_match( movl, 0,(%esi), %eax, `139,70,0', $@)`'dnl -Zdisp_match( movl, 0,(%esi,%ecx,4), %eax, `0x8b,0x44,0x8e,0x00', $@)`'dnl -Zdisp_match( addl, %ebx, 0,(%edi), `1,95,0', $@)`'dnl -Zdisp_match( addl, %ecx, 0,(%edi), `1,79,0', $@)`'dnl -Zdisp_match( addl, %esi, 0,(%edi), `1,119,0', $@)`'dnl -Zdisp_match( subl, %ecx, 0,(%edi), `41,79,0', $@)`'dnl -Zdisp_match( adcl, 0,(%edx), %esi, `19,114,0', $@)`'dnl -Zdisp_match( sbbl, 0,(%edx), %esi, `27,114,0', $@)`'dnl -Zdisp_match( movq, 0,(%eax,%ecx,8), %mm0, `0x0f,0x6f,0x44,0xc8,0x00', $@)`'dnl -Zdisp_match( movq, 0,(%ebx,%eax,4), %mm0, `0x0f,0x6f,0x44,0x83,0x00', $@)`'dnl -Zdisp_match( movq, 0,(%ebx,%eax,4), %mm2, `0x0f,0x6f,0x54,0x83,0x00', $@)`'dnl -Zdisp_match( movq, 0,(%esi), %mm0, `15,111,70,0', $@)`'dnl -Zdisp_match( movq, %mm0, 0,(%edi), `15,127,71,0', $@)`'dnl -Zdisp_match( movq, %mm2, 0,(%ecx,%eax,4), `0x0f,0x7f,0x54,0x81,0x00', $@)`'dnl -Zdisp_match( movq, %mm2, 0,(%edx,%eax,4), `0x0f,0x7f,0x54,0x82,0x00', $@)`'dnl -Zdisp_match( movq, %mm0, 0,(%edx,%ecx,8), `0x0f,0x7f,0x44,0xca,0x00', $@)`'dnl -Zdisp_match( movd, 0,(%eax,%ecx,8), %mm1, `0x0f,0x6e,0x4c,0xc8,0x00', $@)`'dnl -Zdisp_match( movd, 0,(%edx,%ecx,8), %mm0, `0x0f,0x6e,0x44,0xca,0x00', $@)`'dnl -Zdisp_match( movd, %mm0, 0,(%eax,%ecx,4), `0x0f,0x7e,0x44,0x88,0x00', $@)`'dnl -Zdisp_match( movd, %mm0, 0,(%ecx,%eax,4), `0x0f,0x7e,0x44,0x81,0x00', $@)`'dnl -Zdisp_match( movd, %mm2, 0,(%ecx,%eax,4), `0x0f,0x7e,0x54,0x81,0x00', $@)`'dnl -ifelse(Zdisp_found,0, -`m4_error(`unrecognised instruction in Zdisp: $1 $2 $3 $4 -')')') - -define(Zdisp_match, -`ifelse(eval(m4_stringequal_p(`$1',`$6') - && m4_stringequal_p(`$2',0) - && m4_stringequal_p(`$3',`$8') - && m4_stringequal_p(`$4',`$9')),1, -`define(`Zdisp_found',1)dnl -ifelse(eval(`$7'),0, -` .byte $5 C `$1 0$3, $4'', -` $6 $7$8, $9')', - -`ifelse(eval(m4_stringequal_p(`$1',`$6') - && m4_stringequal_p(`$2',`$7') - && m4_stringequal_p(`$3',0) - && m4_stringequal_p(`$4',`$9')),1, -`define(`Zdisp_found',1)dnl -ifelse(eval(`$8'),0, -` .byte $5 C `$1 $2, 0$4'', -` $6 $7, $8$9')')')') - - -dnl Usage: shldl(count,src,dst) -dnl shrdl(count,src,dst) -dnl shldw(count,src,dst) -dnl shrdw(count,src,dst) -dnl -dnl Generate a double-shift instruction, possibly omitting a %cl count -dnl parameter if that's what the assembler requires, as indicated by -dnl WANT_SHLDL_CL in config.m4. For example, -dnl -dnl shldl( %cl, %eax, %ebx) -dnl -dnl turns into either -dnl -dnl shldl %cl, %eax, %ebx -dnl or -dnl shldl %eax, %ebx -dnl -dnl Immediate counts are always passed through unchanged. For example, -dnl -dnl shrdl( $2, %esi, %edi) -dnl becomes -dnl shrdl $2, %esi, %edi -dnl -dnl -dnl If you forget to use the macro form "shldl( ...)" and instead write -dnl just a plain "shldl ...", an error results. This ensures the necessary -dnl variant treatment of %cl isn't accidentally bypassed. - -define(define_shd_instruction, -`define($1, -m4_instruction_wrapper() -m4_assert_numargs(3) -`shd_instruction'(m4_doublequote($`'0),m4_doublequote($`'1),dnl -m4_doublequote($`'2),m4_doublequote($`'3)))') - -dnl Effectively: define(shldl,`shd_instruction(`$0',`$1',`$2',`$3')') etc -define_shd_instruction(shldl) -define_shd_instruction(shrdl) -define_shd_instruction(shldw) -define_shd_instruction(shrdw) - -dnl Called: shd_instruction(op,count,src,dst) -define(shd_instruction, -m4_assert_numargs(4) -m4_assert_defined(`WANT_SHLDL_CL') -`ifelse(eval(m4_stringequal_p(`$2',`%cl') && !WANT_SHLDL_CL),1, -``$1' `$3', `$4'', -``$1' `$2', `$3', `$4'')') - - -dnl Usage: ASSERT(cond, instructions) -dnl -dnl If WANT_ASSERT is 1, output the given instructions and expect the given -dnl flags condition to then be satisfied. For example, -dnl -dnl ASSERT(ne, `cmpl %eax, %ebx') -dnl -dnl The instructions can be omitted to just assert a flags condition with -dnl no extra calculation. For example, -dnl -dnl ASSERT(nc) -dnl -dnl When `instructions' is not empty, a pushf/popf is added to preserve the -dnl flags, but the instructions themselves must preserve any registers that -dnl matter. FRAME is adjusted for the push and pop, so the instructions -dnl given can use defframe() stack variables. - -define(ASSERT, -m4_assert_numargs_range(1,2) -`ifelse(WANT_ASSERT,1, - `C ASSERT -ifelse(`$2',,,` pushf ifdef(`FRAME',`FRAME_pushl()')') - $2 - j`$1' 1f - ud2 C assertion failed -1: -ifelse(`$2',,,` popf ifdef(`FRAME',`FRAME_popl()')') -')') - - -dnl Usage: movl_text_address(label,register) -dnl -dnl Get the address of a text segment label, using either a plain movl or a -dnl position-independent calculation, as necessary. For example, -dnl -dnl movl_code_address(L(foo),%eax) -dnl -dnl This macro is only meant for use in ASSERT()s or when testing, since -dnl the PIC sequence it generates will want to be done with a ret balancing -dnl the call on CPUs with return address branch predition. -dnl -dnl The addl generated here has a backward reference to 1b, and so won't -dnl suffer from the two forwards references bug in old gas (described in -dnl mpn/x86/README.family). - -define(movl_text_address, -`ifdef(`PIC', - `call 1f -1: popl $2 C %eip - addl `$'$1-1b, $2', - `movl `$'$1, $2')') - - -divert`'dnl diff --git a/rts/gmp/mpn/z8000/add_n.s b/rts/gmp/mpn/z8000/add_n.s deleted file mode 100644 index 3a13610..0000000 --- a/rts/gmp/mpn/z8000/add_n.s +++ /dev/null @@ -1,53 +0,0 @@ -! Z8000 __gmpn_add_n -- Add two limb vectors of equal, non-zero length. - -! Copyright (C) 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. - - -! INPUT PARAMETERS -! res_ptr r7 -! s1_ptr r6 -! s2_ptr r5 -! size r4 - -! If we are really crazy, we can use push to write a few result words -! backwards, using push just because it is faster than reg+disp. We'd -! then add 2x the number of words written to r7... - - unseg - .text - even - global ___gmpn_add_n -___gmpn_add_n: - pop r0,@r6 - pop r1,@r5 - add r0,r1 - ld @r7,r0 - dec r4 - jr eq,Lend -Loop: pop r0,@r6 - pop r1,@r5 - adc r0,r1 - inc r7,#2 - ld @r7,r0 - dec r4 - jr ne,Loop -Lend: ld r2,r4 ! use 0 already in r4 - adc r2,r2 - ret t diff --git a/rts/gmp/mpn/z8000/gmp-mparam.h b/rts/gmp/mpn/z8000/gmp-mparam.h deleted file mode 100644 index 4216df6..0000000 --- a/rts/gmp/mpn/z8000/gmp-mparam.h +++ /dev/null @@ -1,27 +0,0 @@ -/* gmp-mparam.h -- Compiler/machine parameter header file. - -Copyright (C) 1991, 1993, 1994 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. */ - -#define BITS_PER_MP_LIMB 16 -#define BYTES_PER_MP_LIMB 2 -#define BITS_PER_LONGINT 32 -#define BITS_PER_INT 16 -#define BITS_PER_SHORTINT 16 -#define BITS_PER_CHAR 8 diff --git a/rts/gmp/mpn/z8000/mul_1.s b/rts/gmp/mpn/z8000/mul_1.s deleted file mode 100644 index 20fadd3..0000000 --- a/rts/gmp/mpn/z8000/mul_1.s +++ /dev/null @@ -1,68 +0,0 @@ -! Z8000 __gmpn_mul_1 -- Multiply a limb vector with a limb and store -! the result in a second limb vector. - -! Copyright (C) 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. - - -! INPUT PARAMETERS -! res_ptr r7 -! s1_ptr r6 -! size r5 -! s2_limb r4 - - unseg - .text - even - global ___gmpn_mul_1 -___gmpn_mul_1: - sub r2,r2 ! zero carry limb - and r4,r4 - jr mi,Lneg - -Lpos: pop r1,@r6 - ld r9,r1 - mult rr8,r4 - and r1,r1 ! shift msb of loaded limb into cy - jr mi,Lp ! branch if loaded limb's msb is set - add r8,r4 ! hi_limb += sign_comp2 -Lp: add r9,r2 ! lo_limb += cy_limb - xor r2,r2 - adc r2,r8 - ld @r7,r9 - inc r7,#2 - dec r5 - jr ne,Lpos - ret t - -Lneg: pop r1,@r6 - ld r9,r1 - mult rr8,r4 - add r8,r1 ! hi_limb += sign_comp1 - and r1,r1 - jr mi,Ln - add r8,r4 ! hi_limb += sign_comp2 -Ln: add r9,r2 ! lo_limb += cy_limb - xor r2,r2 - adc r2,r8 - ld @r7,r9 - inc r7,#2 - dec r5 - jr ne,Lneg - ret t diff --git a/rts/gmp/mpn/z8000/sub_n.s b/rts/gmp/mpn/z8000/sub_n.s deleted file mode 100644 index bd9a7ad..0000000 --- a/rts/gmp/mpn/z8000/sub_n.s +++ /dev/null @@ -1,54 +0,0 @@ -! Z8000 __gmpn_sub_n -- Subtract two limb vectors of the same length > 0 and -! store difference in a third limb vector. - -! Copyright (C) 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. - - -! INPUT PARAMETERS -! res_ptr r7 -! s1_ptr r6 -! s2_ptr r5 -! size r4 - -! If we are really crazy, we can use push to write a few result words -! backwards, using push just because it is faster than reg+disp. We'd -! then add 2x the number of words written to r7... - - unseg - .text - even - global ___gmpn_sub_n -___gmpn_sub_n: - pop r0,@r6 - pop r1,@r5 - sub r0,r1 - ld @r7,r0 - dec r4 - jr eq,Lend -Loop: pop r0,@r6 - pop r1,@r5 - sbc r0,r1 - inc r7,#2 - ld @r7,r0 - dec r4 - jr ne,Loop -Lend: ld r2,r4 ! use 0 already in r4 - adc r2,r2 - ret t diff --git a/rts/gmp/mpn/z8000x/add_n.s b/rts/gmp/mpn/z8000x/add_n.s deleted file mode 100644 index 7f13078..0000000 --- a/rts/gmp/mpn/z8000x/add_n.s +++ /dev/null @@ -1,56 +0,0 @@ -! Z8000 (32 bit limb version) __gmpn_add_n -- Add two limb vectors of equal, -! non-zero length. - -! Copyright (C) 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. - - -! INPUT PARAMETERS -! res_ptr r7 -! s1_ptr r6 -! s2_ptr r5 -! size r4 - -! If we are really crazy, we can use push to write a few result words -! backwards, using push just because it is faster than reg+disp. We'd -! then add 2x the number of words written to r7... - - segm - .text - even - global ___gmpn_add_n -___gmpn_add_n: - popl rr0,@r6 - popl rr8,@r5 - addl rr0,rr8 - ldl @r7,rr0 - dec r4 - jr eq,Lend -Loop: popl rr0,@r6 - popl rr8,@r5 - adc r1,r9 - adc r0,r8 - inc r7,#4 - ldl @r7,rr0 - dec r4 - jr ne,Loop -Lend: ld r2,r4 ! use 0 already in r4 - ld r3,r4 - adc r2,r2 - ret t diff --git a/rts/gmp/mpn/z8000x/sub_n.s b/rts/gmp/mpn/z8000x/sub_n.s deleted file mode 100644 index f416d1d..0000000 --- a/rts/gmp/mpn/z8000x/sub_n.s +++ /dev/null @@ -1,56 +0,0 @@ -! Z8000 (32 bit limb version) __gmpn_sub_n -- Subtract two limb vectors of the -! same length > 0 and store difference in a third limb vector. - -! Copyright (C) 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. - - -! INPUT PARAMETERS -! res_ptr r7 -! s1_ptr r6 -! s2_ptr r5 -! size r4 - -! If we are really crazy, we can use push to write a few result words -! backwards, using push just because it is faster than reg+disp. We'd -! then add 2x the number of words written to r7... - - segm - .text - even - global ___gmpn_sub_n -___gmpn_sub_n: - popl rr0,@r6 - popl rr8,@r5 - subl rr0,rr8 - ldl @r7,rr0 - dec r4 - jr eq,Lend -Loop: popl rr0,@r6 - popl rr8,@r5 - sbc r1,r9 - sbc r0,r8 - inc r7,#4 - ldl @r7,rr0 - dec r4 - jr ne,Loop -Lend: ld r2,r4 ! use 0 already in r4 - ld r3,r4 - adc r2,r2 - ret t diff --git a/rts/gmp/mpz/Makefile.am b/rts/gmp/mpz/Makefile.am deleted file mode 100644 index cd6fec4..0000000 --- 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 e0f2cdc..0000000 --- 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 06b481d..0000000 --- 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 0b5eab1..0000000 --- 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 a22c377..0000000 --- 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 28dbd71..0000000 --- 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 7b38d36..0000000 --- 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 354e945..0000000 --- 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 1c22046..0000000 --- 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 a7a6c98..0000000 --- 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>= 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 b37541b..0000000 --- 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 b15ba8a..0000000 --- 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 74f3a90..0000000 --- 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 29c7c41..0000000 --- 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 a7873c6..0000000 --- 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 e96ce7e..0000000 --- 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 e17e238..0000000 --- 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 63547a7..0000000 --- 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 5224553..0000000 --- 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 865d849..0000000 --- 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 6062834..0000000 --- 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 0c2212f..0000000 --- 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 fd84f30..0000000 --- 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 037d7a9..0000000 --- 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 db816b5..0000000 --- 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 18d6427..0000000 --- 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 c297045..0000000 --- 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 dc318ac..0000000 --- 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 -#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 85f40f2..0000000 --- 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 -#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 9d75ca3..0000000 --- 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 8e02180..0000000 --- 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 55d2498..0000000 --- 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 06ce506..0000000 --- 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 600c0da..0000000 --- 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 a365283..0000000 --- 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 081ce19..0000000 --- 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 dd5c743..0000000 --- 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 f937b5f..0000000 --- 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 4bebb80..0000000 --- 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 82e32a2..0000000 --- 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 e0669b5..0000000 --- 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 5b8e31a..0000000 --- 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 72f62fa..0000000 --- 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 92eb42e..0000000 --- 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 bde0eda..0000000 --- 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 0d950dd..0000000 --- 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 f3bec58..0000000 --- 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 /* 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 3ba04c8..0000000 --- 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 /* 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 6a7c585..0000000 --- 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 8a5d0e4..0000000 --- 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 c7278af..0000000 --- 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 a8ec9e0..0000000 --- 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 b772ed0..0000000 --- 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 b039a65..0000000 --- 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 2e8e4d2..0000000 --- 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 15e6012..0000000 --- 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 - -#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 7aa5e1f..0000000 --- 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 -#include -#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 749a096..0000000 --- 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 0bb5a80..0000000 --- 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 114bc2d..0000000 --- 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 502a893..0000000 --- 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 842db14..0000000 --- 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 dfb8c6b..0000000 --- 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 759182c..0000000 --- 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 9d49e1d..0000000 --- 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 c8c6752..0000000 --- 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 b877e6f..0000000 --- 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 edfb465..0000000 --- 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 749be5d..0000000 --- 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 7495882..0000000 --- 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 ab665f7..0000000 --- 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 -#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 87033b3..0000000 --- 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 7854788..0000000 --- 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 /* 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 abea5fe..0000000 --- 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 9849cd4..0000000 --- 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 566c3a9..0000000 --- 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 f024dd1..0000000 --- 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 6270947..0000000 --- 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 - -#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 bf971b0..0000000 --- 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 -#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 e71670a..0000000 --- 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 /* 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 92e8d08..0000000 --- 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 3105258..0000000 --- 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 96ca114..0000000 --- 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 e6af855..0000000 --- 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< 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<> 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 00f70bd..0000000 --- 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 /* 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 82eb678..0000000 --- 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 60d9113..0000000 --- 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 a90af11..0000000 --- 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 0b9e447..0000000 --- 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 bc6675f..0000000 --- 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 0920bf2..0000000 --- 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 /* 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 7d78243..0000000 --- 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 6c59cf8..0000000 --- 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 3b84e34..0000000 --- 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 06b2eef..0000000 --- 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 e90ed9b..0000000 --- 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 2273953..0000000 --- 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 72d3222..0000000 --- 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 9ba2fba..0000000 --- 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 3ab79c0..0000000 --- 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 -#include -#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 d6097c1..0000000 --- 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 d4249a4..0000000 --- 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 6574756..0000000 --- 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 734f9c4..0000000 --- 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 fe82fe4..0000000 --- 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 /* 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 99a6453..0000000 --- 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 /* 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 f3ae7c2..0000000 --- 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 327add8..0000000 --- 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 0070d6f..0000000 --- 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 21db4ab..0000000 --- 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 03d1e01..0000000 --- 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 a2e3462..0000000 --- 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 d66f57d..0000000 --- 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 10368cd..0000000 --- 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 9eb87df..0000000 --- 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 91de170..0000000 --- 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 2ea411f..0000000 --- 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 7a40a6a..0000000 --- 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 b0a8b0b..0000000 --- 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 edd2dee..0000000 --- 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 caca086..0000000 --- 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 69e1bae..0000000 --- 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 69898d1..0000000 --- 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); - } -} diff --git a/rts/gmp/rand.c b/rts/gmp/rand.c deleted file mode 100644 index d1f9354..0000000 --- a/rts/gmp/rand.c +++ /dev/null @@ -1,171 +0,0 @@ -/* gmp_randinit (state, algorithm, ...) -- Initialize a random state. - -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 /* for NULL */ -#if __STDC__ -# include -#else -# include -#endif - -#include "gmp.h" -#include "gmp-impl.h" - -/* Array of CL-schemes, ordered in increasing order of the first - member (the 'm2exp' value). The end of the array is indicated with - an entry containing all zeros. */ - -/* All multipliers are in the range 0.01*m and 0.99*m, and are -congruent to 5 (mod 8). -They all pass the spectral test with Vt >= 2^(30/t) and merit >= 1. -(Up to and including 196 bits, merit is >= 3.) */ - -struct __gmp_rand_lc_scheme_struct -{ - unsigned long int m2exp; /* Modulus is 2 ^ m2exp. */ - char *astr; /* Multiplier in string form. */ - unsigned long int c; /* Adder. */ -}; - -struct __gmp_rand_lc_scheme_struct __gmp_rand_lc_scheme[] = -{ - {32, "43840821", 1}, - {33, "85943917", 1}, - {34, "171799469", 1}, - {35, "343825285", 1}, - {36, "687285701", 1}, - {37, "1374564613", 1}, - {38, "2749193437", 1}, - {39, "5497652029", 1}, - {40, "10995212661", 1}, - {56, "47988680294711517", 1}, - {64, "13469374875402548381", 1}, - {100, "203786806069096950756900463357", 1}, - {128, "96573135900076068624591706046897650309", 1}, - {156, "43051576988660538262511726153887323360449035333", 1}, - {196, "1611627857640767981443524165616850972435303571524033586421", 1}, - {200, "491824250216153841876046962368396460896019632211283945747141", 1}, - {256, "79336254595106925775099152154558630917988041692672147726148065355845551082677", 1}, - {0, NULL, 0} /* End of array. */ -}; - -void -#if __STDC__ -gmp_randinit (gmp_randstate_t rstate, - gmp_randalg_t alg, - ...) -#else -gmp_randinit (va_alist) - va_dcl -#endif -{ - va_list ap; -#if __STDC__ -#else - __gmp_randstate_struct *rstate; - gmp_randalg_t alg; -#endif - -#if __STDC__ - va_start (ap, alg); -#else - va_start (ap); - - rstate = va_arg (ap, __gmp_randstate_struct *); - alg = va_arg (ap, gmp_randalg_t); -#endif - - switch (alg) - { - case GMP_RAND_ALG_LC: /* Linear congruential. */ - { - unsigned long int size; - struct __gmp_rand_lc_scheme_struct *sp; - mpz_t a; - - size = va_arg (ap, unsigned long int); - - /* Pick a scheme. */ - for (sp = __gmp_rand_lc_scheme; sp->m2exp != 0; sp++) - if (sp->m2exp / 2 >= size) - break; - - if (sp->m2exp == 0) /* Nothing big enough found. */ - { - gmp_errno |= GMP_ERROR_INVALID_ARGUMENT; - return; - } - - /* Install scheme. */ - mpz_init_set_str (a, sp->astr, 0); - gmp_randinit_lc_2exp (rstate, a, sp->c, sp->m2exp); - mpz_clear (a); - break; - } - -#if 0 - case GMP_RAND_ALG_BBS: /* Blum, Blum, and Shub. */ - { - mpz_t p, q; - mpz_t ztmp; - - /* FIXME: Generate p and q. They must be ``large'' primes, - congruent to 3 mod 4. Should we ensure that they meet some - of the criterias for being ``hard primes''?*/ - - /* These are around 128 bits. */ - mpz_init_set_str (p, "148028650191182616877187862194899201391", 10); - mpz_init_set_str (q, "315270837425234199477225845240496832591", 10); - - /* Allocate algorithm specific data. */ - rstate->data.bbs = (__gmp_rand_data_bbs *) - (*_mp_allocate_func) (sizeof (__gmp_rand_data_bbs)); - - mpz_init (rstate->data.bbs->bi); /* The Blum integer. */ - mpz_mul (rstate->data.bbs->bi, p, q); - - /* Find a seed, x, with gcd (x, bi) == 1. */ - mpz_init (ztmp); - while (1) - { - mpz_gcd (ztmp, seed, rstate->data.bbs->bi); - if (!mpz_cmp_ui (ztmp, 1)) - break; - mpz_add_ui (seed, seed, 1); - } - - rstate->alg = alg; - rstate->size = size; /* FIXME: Remove. */ - mpz_set (rstate->seed, seed); - - mpz_clear (p); - mpz_clear (q); - mpz_clear (ztmp); - break; - } -#endif /* 0 */ - - default: /* Bad choice. */ - gmp_errno |= GMP_ERROR_UNSUPPORTED_ARGUMENT; - } - - va_end (ap); -} diff --git a/rts/gmp/randclr.c b/rts/gmp/randclr.c deleted file mode 100644 index 5cb0291..0000000 --- a/rts/gmp/randclr.c +++ /dev/null @@ -1,54 +0,0 @@ -/* gmp_randclear (state) -- Clear and deallocate random state STATE. - -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__ -gmp_randclear (gmp_randstate_t rstate) -#else -gmp_randclear (rstate) - gmp_randstate_t rstate; -#endif -{ - mpz_clear (rstate->seed); - - switch (rstate->alg) - { - case GMP_RAND_ALG_LC: - mpz_clear (rstate->algdata.lc->a); - if (rstate->algdata.lc->m2exp == 0) - mpz_clear (rstate->algdata.lc->m); - (*_mp_free_func) (rstate->algdata.lc, sizeof (*rstate->algdata.lc)); - break; - -#if 0 - case GMP_RAND_ALG_BBS: - mpz_clear (rstate->algdata.bbs->bi); - (*_mp_free_func) (rstate->algdata.bbs, sizeof (*rstate->algdata.bbs)); - break; -#endif /* 0 */ - - default: - gmp_errno |= GMP_ERROR_UNSUPPORTED_ARGUMENT; - } -} diff --git a/rts/gmp/randlc.c b/rts/gmp/randlc.c deleted file mode 100644 index 7079db8..0000000 --- a/rts/gmp/randlc.c +++ /dev/null @@ -1,56 +0,0 @@ -/* gmp_randinit_lc (state, a, c, m) -- Initialize a random state for a - linear congruential generator with multiplier A, adder C, and - modulus M. - -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__ -gmp_randinit_lc (gmp_randstate_t rstate, - mpz_t a, - unsigned long int c, - mpz_t m) -#else -gmp_randinit_lc (rstate, a, c, m) - gmp_randstate_t rstate; - mpz_t a; - unsigned long int c; - mpz_t m; -#endif -{ - /* FIXME: Not finished. We don't handle this in _gmp_rand() yet. */ - abort (); - - mpz_init_set_ui (rstate->seed, 1); - _mpz_realloc (rstate->seed, ABSIZ (m)); - - /* Allocate algorithm specific data. */ - rstate->algdata.lc = (__gmp_randata_lc *) - (*_mp_allocate_func) (sizeof (__gmp_randata_lc)); - - mpz_init_set (rstate->algdata.lc->a, a); - rstate->algdata.lc->c = c; - mpz_init_set (rstate->algdata.lc->m, m); - - rstate->alg = GMP_RAND_ALG_LC; -} diff --git a/rts/gmp/randlc2x.c b/rts/gmp/randlc2x.c deleted file mode 100644 index dbd5f04..0000000 --- a/rts/gmp/randlc2x.c +++ /dev/null @@ -1,59 +0,0 @@ -/* gmp_randinit_lc_2exp (state, a, c, m2exp) -- Initialize random - state STATE for a linear congruential generator with multiplier A, - adder C, and modulus 2 ^ M2EXP. - -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" - -void -#if __STDC__ -gmp_randinit_lc_2exp (gmp_randstate_t rstate, - mpz_t a, - unsigned long int c, - unsigned long int m2exp) -#else -gmp_randinit_lc_2exp (rstate, a, c, m2exp) - gmp_randstate_t rstate; - mpz_t a; - unsigned long int c; - unsigned long int m2exp; -#endif -{ - mpz_init_set_ui (rstate->seed, 1); - _mpz_realloc (rstate->seed, m2exp / BITS_PER_MP_LIMB - + (m2exp % BITS_PER_MP_LIMB != 0)); - - /* Allocate algorithm specific data. */ - rstate->algdata.lc = (__gmp_randata_lc *) - (*_mp_allocate_func) (sizeof (__gmp_randata_lc)); - - mpz_init_set (rstate->algdata.lc->a, a); - rstate->algdata.lc->c = c; - - /* Cover weird case where m2exp is 0, which means that m is used - instead of m2exp. */ - if (m2exp == 0) - mpz_init_set_ui (rstate->algdata.lc->m, 0); - rstate->algdata.lc->m2exp = m2exp; - - rstate->alg = GMP_RAND_ALG_LC; -} diff --git a/rts/gmp/randraw.c b/rts/gmp/randraw.c deleted file mode 100644 index c0c3889..0000000 --- a/rts/gmp/randraw.c +++ /dev/null @@ -1,360 +0,0 @@ -/* _gmp_rand (rp, state, nbits) -- Generate a random bitstream of - length NBITS in RP. RP must have enough space allocated to hold - NBITS. - -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" - -/* For linear congruential (LC), we use one of algorithms (1) or (2). - (gmp-3.0 uses algorithm (1) with 'm' as a power of 2.) - -LC algorithm (1). - - X = (aX + c) mod m - -[D. Knuth, "The Art of Computer Programming: Volume 2, Seminumerical Algorithms", -Third Edition, Addison Wesley, 1998, pp. 184-185.] - - X is the seed and the result - a is chosen so that - a mod 8 = 5 [3.2.1.2] and [3.2.1.3] - .01m < a < .99m - its binary or decimal digits is not a simple, regular pattern - it has no large quotients when Euclid's algorithm is used to find - gcd(a, m) [3.3.3] - it passes the spectral test [3.3.4] - it passes several tests of [3.3.2] - c has no factor in common with m (c=1 or c=a can be good) - m is large (2^30) - is a power of 2 [3.2.1.1] - -The least significant digits of the generated number are not very -random. It should be regarded as a random fraction X/m. To get a -random integer between 0 and n-1, multiply X/m by n and truncate. -(Don't use X/n [ex 3.4.1-3]) - -The ``accuracy'' in t dimensions is one part in ``the t'th root of m'' [3.3.4]. - -Don't generate more than about m/1000 numbers without changing a, c, or m. - -The sequence length depends on chosen a,c,m. - - -LC algorithm (2). - - X = a * (X mod q) - r * (long) (X/q) - if X<0 then X+=m - -[Knuth, pp. 185-186.] - - X is the seed and the result - as a seed is nonzero and less than m - a is a primitive root of m (which means that a^2 <= m) - q is (long) m / a - r is m mod a - m is a prime number near the largest easily computed integer - -which gives - - X = a * (X % ((long) m / a)) - - (M % a) * ((long) (X / ((long) m / a))) - -Since m is prime, the least-significant bits of X are just as random as -the most-significant bits. */ - -/* Blum, Blum, and Shub. - - [Bruce Schneier, "Applied Cryptography", Second Edition, John Wiley - & Sons, Inc., 1996, pp. 417-418.] - - "Find two large prime numbers, p and q, which are congruent to 3 - modulo 4. The product of those numbers, n, is a blum integer. - Choose another random integer, x, which is relatively prime to n. - Compute - x[0] = x^2 mod n - That's the seed for the generator." - - To generate a random bit, compute - x[i] = x[i-1]^2 mod n - The least significant bit of x[i] is the one we want. - - We can use more than one bit from x[i], namely the - log2(bitlength of x[i]) - least significant bits of x[i]. - - So, for a 32-bit seed we get 5 bits per computation. - - The non-predictability of this generator is based on the difficulty - of factoring n. - */ - -/* -------------------------------------------------- */ - -/* lc (rp, state) -- Generate next number in LC sequence. Return the - number of valid bits in the result. NOTE: If 'm' is a power of 2 - (m2exp != 0), discard the lower half of the result. */ - -static -unsigned long int -#if __STDC__ -lc (mp_ptr rp, gmp_randstate_t rstate) -#else -lc (rp, rstate) - mp_ptr rp; - gmp_randstate_t rstate; -#endif -{ - mp_ptr tp, seedp, ap; - mp_size_t ta; - mp_size_t tn, seedn, an; - mp_size_t retval; - int shiftcount = 0; - unsigned long int m2exp; - mp_limb_t c; - TMP_DECL (mark); - - m2exp = rstate->algdata.lc->m2exp; - c = (mp_limb_t) rstate->algdata.lc->c; - - seedp = PTR (rstate->seed); - seedn = SIZ (rstate->seed); - - if (seedn == 0) - { - /* Seed is 0. Result is C % M. */ - *rp = c; - - if (m2exp != 0) - { - /* M is a power of 2. */ - if (m2exp < BITS_PER_MP_LIMB) - { - /* Only necessary when M may be smaller than C. */ - *rp &= (((mp_limb_t) 1 << m2exp) - 1); - } - } - else - { - /* M is not a power of 2. */ - abort (); /* FIXME. */ - } - - /* Save result as next seed. */ - *seedp = *rp; - SIZ (rstate->seed) = 1; - return BITS_PER_MP_LIMB; - } - - ap = PTR (rstate->algdata.lc->a); - an = SIZ (rstate->algdata.lc->a); - - /* Allocate temporary storage. Let there be room for calculation of - (A * seed + C) % M, or M if bigger than that. */ - - ASSERT_ALWAYS (m2exp != 0); /* FIXME. */ - - TMP_MARK (mark); - ta = an + seedn + 1; - tp = (mp_ptr) TMP_ALLOC (ta * BYTES_PER_MP_LIMB); - MPN_ZERO (tp, ta); - - /* t = a * seed */ - if (seedn >= an) - mpn_mul_basecase (tp, seedp, seedn, ap, an); - else - mpn_mul_basecase (tp, ap, an, seedp, seedn); - tn = an + seedn; - - /* t = t + c */ - mpn_incr_u (tp, c); - - /* t = t % m */ - if (m2exp != 0) - { - /* M is a power of 2. The mod operation is trivial. */ - - tp[m2exp / BITS_PER_MP_LIMB] &= ((mp_limb_t) 1 << m2exp % BITS_PER_MP_LIMB) - 1; - tn = (m2exp + BITS_PER_MP_LIMB - 1) / BITS_PER_MP_LIMB; - } - else - { - abort (); /* FIXME. */ - } - - /* Save result as next seed. */ - MPN_COPY (PTR (rstate->seed), tp, tn); - SIZ (rstate->seed) = tn; - - if (m2exp != 0) - { - /* Discard the lower half of the result. */ - unsigned long int discardb = m2exp / 2; - mp_size_t discardl = discardb / BITS_PER_MP_LIMB; - - tn -= discardl; - if (tn > 0) - { - if (discardb % BITS_PER_MP_LIMB != 0) - { - mpn_rshift (tp, tp + discardl, tn, discardb % BITS_PER_MP_LIMB); - MPN_COPY (rp, tp, (discardb + BITS_PER_MP_LIMB -1) / BITS_PER_MP_LIMB); - } - else /* Even limb boundary. */ - MPN_COPY_INCR (rp, tp + discardl, tn); - } - } - else - { - MPN_COPY (rp, tp, tn); - } - - TMP_FREE (mark); - - /* Return number of valid bits in the result. */ - if (m2exp != 0) - retval = (m2exp + 1) / 2; - else - retval = SIZ (rstate->algdata.lc->m) * BITS_PER_MP_LIMB - shiftcount; - return retval; -} - -#ifdef RAWRANDEBUG -/* Set even bits to EVENBITS and odd bits to ! EVENBITS in RP. - Number of bits is m2exp in state. */ -/* FIXME: Remove. */ -unsigned long int -lc_test (mp_ptr rp, gmp_randstate_t s, const int evenbits) -{ - unsigned long int rn, nbits; - int f; - - nbits = s->algdata.lc->m2exp / 2; - rn = nbits / BITS_PER_MP_LIMB + (nbits % BITS_PER_MP_LIMB != 0); - MPN_ZERO (rp, rn); - - for (f = 0; f < nbits; f++) - { - mpn_lshift (rp, rp, rn, 1); - if (f % 2 == ! evenbits) - rp[0] += 1; - } - - return nbits; -} -#endif /* RAWRANDEBUG */ - -void -#if __STDC__ -_gmp_rand (mp_ptr rp, gmp_randstate_t rstate, unsigned long int nbits) -#else -_gmp_rand (rp, rstate, nbits) - mp_ptr rp; - gmp_randstate_t rstate; - unsigned long int nbits; -#endif -{ - mp_size_t rn; /* Size of R. */ - - rn = (nbits + BITS_PER_MP_LIMB - 1) / BITS_PER_MP_LIMB; - - switch (rstate->alg) - { - case GMP_RAND_ALG_LC: - { - unsigned long int rbitpos; - int chunk_nbits; - mp_ptr tp; - mp_size_t tn; - TMP_DECL (lcmark); - - TMP_MARK (lcmark); - - chunk_nbits = rstate->algdata.lc->m2exp / 2; - tn = (chunk_nbits + BITS_PER_MP_LIMB - 1) / BITS_PER_MP_LIMB; - - tp = (mp_ptr) TMP_ALLOC (tn * BYTES_PER_MP_LIMB); - - rbitpos = 0; - while (rbitpos + chunk_nbits <= nbits) - { - mp_ptr r2p = rp + rbitpos / BITS_PER_MP_LIMB; - - if (rbitpos % BITS_PER_MP_LIMB != 0) - { - mp_limb_t savelimb, rcy; - /* Target of of new chunk is not bit aligned. Use temp space - and align things by shifting it up. */ - lc (tp, rstate); - savelimb = r2p[0]; - rcy = mpn_lshift (r2p, tp, tn, rbitpos % BITS_PER_MP_LIMB); - r2p[0] |= savelimb; -/* bogus */ if ((chunk_nbits % BITS_PER_MP_LIMB + rbitpos % BITS_PER_MP_LIMB) - > BITS_PER_MP_LIMB) - r2p[tn] = rcy; - } - else - { - /* Target of of new chunk is bit aligned. Let `lc' put bits - directly into our target variable. */ - lc (r2p, rstate); - } - rbitpos += chunk_nbits; - } - - /* Handle last [0..chunk_nbits) bits. */ - if (rbitpos != nbits) - { - mp_ptr r2p = rp + rbitpos / BITS_PER_MP_LIMB; - int last_nbits = nbits - rbitpos; - tn = (last_nbits + BITS_PER_MP_LIMB - 1) / BITS_PER_MP_LIMB; - lc (tp, rstate); - if (rbitpos % BITS_PER_MP_LIMB != 0) - { - mp_limb_t savelimb, rcy; - /* Target of of new chunk is not bit aligned. Use temp space - and align things by shifting it up. */ - savelimb = r2p[0]; - rcy = mpn_lshift (r2p, tp, tn, rbitpos % BITS_PER_MP_LIMB); - r2p[0] |= savelimb; - if (rbitpos + tn * BITS_PER_MP_LIMB - rbitpos % BITS_PER_MP_LIMB < nbits) - r2p[tn] = rcy; - } - else - { - MPN_COPY (r2p, tp, tn); - } - /* Mask off top bits if needed. */ - if (nbits % BITS_PER_MP_LIMB != 0) - rp[nbits / BITS_PER_MP_LIMB] - &= ~ ((~(mp_limb_t) 0) << nbits % BITS_PER_MP_LIMB); - } - - TMP_FREE (lcmark); - break; - } - - default: - gmp_errno |= GMP_ERROR_UNSUPPORTED_ARGUMENT; - break; - } -} diff --git a/rts/gmp/randsd.c b/rts/gmp/randsd.c deleted file mode 100644 index 3bed14b..0000000 --- a/rts/gmp/randsd.c +++ /dev/null @@ -1,37 +0,0 @@ -/* gmp_randseed (state, seed) -- Set initial seed SEED in random state - STATE. - -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" - -void -#if __STDC__ -gmp_randseed (gmp_randstate_t rstate, - mpz_t seed) -#else -gmp_randseed (rstate, seed) - gmp_randstate_t rstate; - mpz_t seed; -#endif -{ - mpz_set (rstate->seed, seed); -} diff --git a/rts/gmp/randsdui.c b/rts/gmp/randsdui.c deleted file mode 100644 index 92f412f..0000000 --- a/rts/gmp/randsdui.c +++ /dev/null @@ -1,37 +0,0 @@ -/* gmp_randseed_ui (state, seed) -- Set initial seed SEED in random - state STATE. - -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" - -void -#if __STDC__ -gmp_randseed_ui (gmp_randstate_t rstate, - unsigned long int seed) -#else -gmp_randseed_ui (rstate, seed) - gmp_randstate_t rstate; - mpz_t seed; -#endif -{ - mpz_set_ui (rstate->seed, seed); -} diff --git a/rts/gmp/stack-alloc.c b/rts/gmp/stack-alloc.c deleted file mode 100644 index 9ab98fe..0000000 --- a/rts/gmp/stack-alloc.c +++ /dev/null @@ -1,136 +0,0 @@ -/* Stack allocation routines. This is intended for machines without support - for the `alloca' function. - -Copyright (C) 1996, 1997, 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 "stack-alloc.h" - -#define __need_size_t -#include -#undef __need_size_t - -/* gmp-impl.h and stack-alloc.h conflict when not USE_STACK_ALLOC, so these - declarations are copied here */ -#if __STDC__ -extern void * (*__gmp_allocate_func) (size_t); -extern void (*__gmp_free_func) (void *, size_t); -#else -extern void * (*__gmp_allocate_func) (); -extern void (*__gmp_free_func) (); -#endif - -typedef struct tmp_stack tmp_stack; - -static unsigned long max_total_allocation = 0; -static unsigned long current_total_allocation = 0; - -static tmp_stack xxx = {&xxx, &xxx, 0}; -static tmp_stack *current = &xxx; - -/* The rounded size of the header of each allocation block. */ -#define HSIZ ((sizeof (tmp_stack) + __TMP_ALIGN - 1) & -__TMP_ALIGN) - -/* Allocate a block of exactly bytes. This should only be called - through the TMP_ALLOC macro, which takes care of rounding/alignment. */ -void * -#if __STDC__ -__gmp_tmp_alloc (unsigned long size) -#else -__gmp_tmp_alloc (size) - unsigned long size; -#endif -{ - void *that; - - if (size > (char *) current->end - (char *) current->alloc_point) - { - void *chunk; - tmp_stack *header; - unsigned long chunk_size; - unsigned long now; - - /* Allocate a chunk that makes the total current allocation somewhat - larger than the maximum allocation ever. If size is very large, we - allocate that much. */ - - now = current_total_allocation + size; - if (now > max_total_allocation) - { - /* We need more temporary memory than ever before. Increase - for future needs. */ - now = now * 3 / 2; - chunk_size = now - current_total_allocation + HSIZ; - current_total_allocation = now; - max_total_allocation = current_total_allocation; - } - else - { - chunk_size = max_total_allocation - current_total_allocation + HSIZ; - current_total_allocation = max_total_allocation; - } - - chunk = (*__gmp_allocate_func) (chunk_size); - header = (tmp_stack *) chunk; - header->end = (char *) chunk + chunk_size; - header->alloc_point = (char *) chunk + HSIZ; - header->prev = current; - current = header; - } - - that = current->alloc_point; - current->alloc_point = (char *) that + size; - return that; -} - -/* Typically called at function entry. is assigned so that - __gmp_tmp_free can later be used to reclaim all subsequently allocated - storage. */ -void -#if __STDC__ -__gmp_tmp_mark (tmp_marker *mark) -#else -__gmp_tmp_mark (mark) - tmp_marker *mark; -#endif -{ - mark->which_chunk = current; - mark->alloc_point = current->alloc_point; -} - -/* Free everything allocated since was assigned by __gmp_tmp_mark */ -void -#if __STDC__ -__gmp_tmp_free (tmp_marker *mark) -#else -__gmp_tmp_free (mark) - tmp_marker *mark; -#endif -{ - while (mark->which_chunk != current) - { - tmp_stack *tmp; - - tmp = current; - current = tmp->prev; - current_total_allocation -= (((char *) (tmp->end) - (char *) tmp) - HSIZ); - (*__gmp_free_func) (tmp, (char *) tmp->end - (char *) tmp); - } - current->alloc_point = mark->alloc_point; -} diff --git a/rts/gmp/stack-alloc.h b/rts/gmp/stack-alloc.h deleted file mode 100644 index f59beec..0000000 --- a/rts/gmp/stack-alloc.h +++ /dev/null @@ -1,64 +0,0 @@ -/* Stack allocation routines. This is intended for machines without support - for the `alloca' function. - -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. */ - -struct tmp_stack -{ - void *end; - void *alloc_point; - struct tmp_stack *prev; -}; - -struct tmp_marker -{ - struct tmp_stack *which_chunk; - void *alloc_point; -}; - -typedef struct tmp_marker tmp_marker; - -#if defined (__cplusplus) -extern "C" { -#endif - -#if __STDC__ -void *__gmp_tmp_alloc (unsigned long); -void __gmp_tmp_mark (tmp_marker *); -void __gmp_tmp_free (tmp_marker *); -#else -void *__gmp_tmp_alloc (); -void __gmp_tmp_mark (); -void __gmp_tmp_free (); -#endif - -#if defined (__cplusplus) -} -#endif - -#ifndef __TMP_ALIGN -#define __TMP_ALIGN 8 -#endif - -#define TMP_DECL(marker) tmp_marker marker -#define TMP_ALLOC(size) \ - __gmp_tmp_alloc (((unsigned long) (size) + __TMP_ALIGN - 1) & -__TMP_ALIGN) -#define TMP_MARK(marker) __gmp_tmp_mark (&marker) -#define TMP_FREE(marker) __gmp_tmp_free (&marker) diff --git a/rts/gmp/stamp-h.in b/rts/gmp/stamp-h.in deleted file mode 100644 index 9788f70..0000000 --- a/rts/gmp/stamp-h.in +++ /dev/null @@ -1 +0,0 @@ -timestamp diff --git a/rts/gmp/stamp-vti b/rts/gmp/stamp-vti deleted file mode 100644 index e318618..0000000 --- a/rts/gmp/stamp-vti +++ /dev/null @@ -1,3 +0,0 @@ -@set UPDATED 5 October 2000 -@set EDITION 3.1.1 -@set VERSION 3.1.1 diff --git a/rts/gmp/urandom.h b/rts/gmp/urandom.h deleted file mode 100644 index 313479e..0000000 --- a/rts/gmp/urandom.h +++ /dev/null @@ -1,86 +0,0 @@ -/* urandom.h -- define urandom returning a full unsigned long random value. - -Copyright (C) 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. */ - -#if defined (__hpux) || defined (__svr4__) || defined (__SVR4) -/* HPUX lacks random(). */ -static inline mp_limb_t -urandom () -{ - return mrand48 (); -} -#define __URANDOM -#endif - -#if defined(_WIN32) && !(defined(__CYGWIN__) || defined(__CYGWIN32__)) -/* MS CRT supplies just the poxy rand(), with an upper bound of 0x7fff */ -static inline unsigned long -urandom () -{ - return rand () ^ (rand () << 16) ^ (rand() << 32); -} -#define __URANDOM -#endif - -#if defined (__alpha) && !defined (__URANDOM) -/* DEC OSF/1 1.2 random() returns a double. */ -long mrand48 (); -static inline mp_limb_t -urandom () -{ - return mrand48 () | (mrand48 () << 32); -} -#define __URANDOM -#endif - -#if BITS_PER_MP_LIMB == 32 && !defined (__URANDOM) -#if defined (__cplusplus) -extern "C" { -#endif -long random (); -#if defined (__cplusplus) -} -#endif -static inline mp_limb_t -urandom () -{ - /* random() returns 31 bits, we want 32. */ - return random () ^ (random () << 1); -} -#define __URANDOM -#endif - -#if BITS_PER_MP_LIMB == 64 && !defined (__URANDOM) -#if defined (__cplusplus) -extern "C" { -#endif -long random (); -#if defined (__cplusplus) -} -#endif -static inline mp_limb_t -urandom () -{ - /* random() returns 31 bits, we want 64. */ - return random () ^ ((mp_limb_t) random () << 31) ^ ((mp_limb_t) random () << 62); -} -#define __URANDOM -#endif - diff --git a/rts/gmp/version.c b/rts/gmp/version.c deleted file mode 100644 index 9d544ee..0000000 --- a/rts/gmp/version.c +++ /dev/null @@ -1,26 +0,0 @@ -/* gmp_version -- version number compiled into the library */ - -/* -Copyright (C) 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 "gmp.h" -#include "gmp-impl.h" - -const char *gmp_version = VERSION; diff --git a/rts/gmp/version.texi b/rts/gmp/version.texi deleted file mode 100644 index e318618..0000000 --- a/rts/gmp/version.texi +++ /dev/null @@ -1,3 +0,0 @@ -@set UPDATED 5 October 2000 -@set EDITION 3.1.1 -@set VERSION 3.1.1 diff --git a/rts/package.conf.in b/rts/package.conf.in index 77fb192..e45ecce 100644 --- a/rts/package.conf.in +++ b/rts/package.conf.in @@ -23,7 +23,7 @@ library-dirs: LIB_DIR GMP_LIB_DIRS #else /* !INSTALLING */ library-dirs: FPTOOLS_TOP_ABS"/rts" GMP_LIB_DIRS # if !defined(HAVE_LIBGMP) && !defined(HAVE_FRAMEWORK_GMP) - , FPTOOLS_TOP_ABS"/rts/gmp" + , FPTOOLS_TOP_ABS"/gmp/gmpbuild" # endif #endif @@ -64,6 +64,8 @@ include-dirs: INCLUDE_DIR GMP_INCLUDE_DIRS # endif #else /* !INSTALLING */ include-dirs: FPTOOLS_TOP_ABS"/includes" + FPTOOLS_TOP_ABS"/rts" + FPTOOLS_TOP_ABS"/gmp/gmpbuild" #endif includes: Stg.h diff --git a/utils/hsc2hs/Makefile b/utils/hsc2hs/Makefile index b11617f..c60705f 100644 --- a/utils/hsc2hs/Makefile +++ b/utils/hsc2hs/Makefile @@ -45,7 +45,7 @@ endif $(INPLACE_HS): Makefile $(FPTOOLS_TOP)/mk/config.mk echo "import System.Cmd; import System.Environment; import System.Exit" > $@ - echo "main = do args <- getArgs; rawSystem \"$(TOP_ABS)/$(GHC_HSC2HS_DIR_REL)/$(HS_PROG)\" (\"--template=$(TOP_ABS)/$(GHC_HSC2HS_DIR_REL)/template-hsc.h\":\"--cc=$(CC)\":\"--ld=$(CC)\"$(patsubst %,:\"%\",$(extra_flags)):\"--cflag=-D__GLASGOW_HASKELL__=$(ProjectVersionInt)\":\"-I$(TOP_ABS)/$(GHC_INCLUDE_DIR_REL)\":args) >>= exitWith" >> $@ + echo "main = do args <- getArgs; rawSystem \"$(TOP_ABS)/$(GHC_HSC2HS_DIR_REL)/$(HS_PROG)\" (\"--template=$(TOP_ABS)/$(GHC_HSC2HS_DIR_REL)/template-hsc.h\":\"--cc=$(CC)\":\"--ld=$(CC)\"$(patsubst %,:\"%\",$(extra_flags)):\"--cflag=-D__GLASGOW_HASKELL__=$(ProjectVersionInt)\":\"-I$(TOP_ABS)/$(GHC_INCLUDE_DIR_REL)\":\"-I$(TOP_ABS)/gmp/gmpbuild\":args) >>= exitWith" >> $@ $(INPLACE_PROG): $(INPLACE_HS) $(GHC) --make $< -o $@