See ChangeLog: Mon Jul 17 16:35:47 CEST 2000 Werner Koch
authorWerner Koch <wk@gnupg.org>
Mon, 17 Jul 2000 14:32:20 +0000 (14:32 +0000)
committerWerner Koch <wk@gnupg.org>
Mon, 17 Jul 2000 14:32:20 +0000 (14:32 +0000)
24 files changed:
ChangeLog
cipher/ChangeLog
cipher/Makefile.am
cipher/random.c
configure.in
mpi/ChangeLog
mpi/Makefile.am
mpi/config.links
mpi/longlong.h
mpi/mpi-internal.h
mpi/mpi-pow.c
mpi/mpih-div.c
mpi/mpih-mul.c
mpi/power/distfiles
mpi/power/mpih-add1.S [new file with mode: 0644]
mpi/power/mpih-lshift.S [new file with mode: 0644]
mpi/power/mpih-mul1.S [new file with mode: 0644]
mpi/power/mpih-mul2.S [new file with mode: 0644]
mpi/power/mpih-mul3.S [new file with mode: 0644]
mpi/power/mpih-rshift.S [new file with mode: 0644]
mpi/power/mpih-sub1.S [new file with mode: 0644]
scripts/ChangeLog
scripts/config.guess
scripts/config.sub

index d33da81..6a445a9 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+Mon Jul 17 16:35:47 CEST 2000  Werner Koch  <wk@>
+
+  * configure.in (mingw32): Changes to allow for mingw32msvc
+
 Fri Jul 14 19:38:23 CEST 2000  Werner Koch  <wk@>
 
   The big merge between this one and the stable branch 1.0.  Still need
index 877a2ad..72129a8 100644 (file)
@@ -1,3 +1,7 @@
+Mon Jul 17 16:35:47 CEST 2000  Werner Koch  <wk@>
+
+  * random.c (gather_faked): Replaced make_timestamp by time(2) again.
+
 Fri Jul 14 19:38:23 CEST 2000  Werner Koch  <wk@>
 
   * md.c (gcry_md_ctl): Support GCRYCTL_{START,STOP}_DUMP.
index 9792419..2ed370f 100644 (file)
@@ -1,4 +1,4 @@
-## Process this file with automake to produce Makefile.in
+# Process this file with automake to produce Makefile.in
 
 
 INCLUDES = -I$(top_srcdir)/gcrypt
@@ -56,9 +56,8 @@ libcipher_la_SOURCES = cipher.c  \
 # configure creates the constructor file
 BUILT_SOURCES = construct.c
 
-
 libcipher_la_DEPENDENCIES = @STATIC_CIPHER_OBJS@
-libcipher_la_LIBADD =      @STATIC_CIPHER_OBJS@
+libcipher_la_LIBADD =    @STATIC_CIPHER_OBJS@
 
 
 # If I remember it correct, automake 1.4 has a feature to set
index f8faeeb..0258f5d 100644 (file)
@@ -666,9 +666,9 @@ gather_faked( void (*add)(const void*, size_t, int), int requester,
       #endif
        initialized=1;
       #ifdef HAVE_RAND
-       srand(make_timestamp()*getpid());
+       srand( time(NULL)*getpid());
       #else
-       srandom(make_timestamp()*getpid());
+       srandom( time(NULL)*getpid());
       #endif
     }
 
index b3e44ec..9cc324f 100644 (file)
@@ -134,7 +134,7 @@ dnl
 dnl Setup some stuff depending on host/target.
 dnl
 case "${target}" in
-    *-*-mingw32)
+    *-*-mingw32*)
         # special stuff for Windoze NT
         # Do we need to set cross_compiling here or is it sufficient
         # to rely on AC_PROG_CC which is called later?
@@ -170,8 +170,7 @@ dnl
 dnl Build shared libraries only when compilation of libgcrypt
 dnl has been requested
 dnl
-dnl AM_DISABLE_STATIC
-dnl enable_shared="$compile_libgcrypt"
+AM_DISABLE_STATIC
 AM_PROG_LIBTOOL
 
 
@@ -181,7 +180,7 @@ MPI_OPT_FLAGS=""
 try_gettext=yes
 try_gdbm=yes
 case "${target}" in
-    *-*-mingw32)
+    *-*-mingw32*)
         # special stuff for Windoze NT
         ac_cv_have_dev_random=no
         AC_DEFINE(USE_ONLY_8DOT3)
@@ -243,7 +242,7 @@ fi
 
 
 case "${target}" in
-    *-*-mingw32)
+    *-*-mingw32*)
         PRINTABLE_OS_NAME="MingW32"
         ;;
     i?86-emx-os2 | i?86-*-os2*emx )
@@ -500,7 +499,7 @@ if test "$use_static_rnd" = default; then
       static_random_module="rndlinux"
   else
       case "${target}" in
-          *-*-mingw32)
+          *-*-mingw32*)
               static_random_module="rndw32"
               AC_DEFINE(USE_STATIC_RNDW32)
               ;;
@@ -576,7 +575,7 @@ for name in $MODULES_IN_CIPHER; do
         done;
         if test $x = yes; then
             STATIC_CIPHER_NAMES="$STATIC_CIPHER_NAMES $name"
-            STATIC_CIPHER_OBJS="$STATIC_CIPHER_OBJS $name.o"
+            STATIC_CIPHER_OBJS="$STATIC_CIPHER_OBJS $name.lo"
         else
             DYNAMIC_CIPHER_MODS="$DYNAMIC_CIPHER_MODS $name"
             GNUPG_MSG_PRINT([$name])
index d9e7faa..7119d1e 100644 (file)
@@ -1,3 +1,30 @@
+Mon Jul 17 16:35:47 CEST 2000  Werner Koch  <wk@>
+
+  * power/: Add all files from GMP for this CPU. Converted comments to
+  CPP comments because some ASes complain about ' in comments.
+
+  * config.links:  Support for BSDI 4.x; by Wayne Chapeskie. Add support
+  for FreeBSD 5 and made the case stmt looking nicer; by Jun Kuriyama.
+  Add support for NetBSD.
+  (sparc8): Made the search path the same as sparc9
+  (sparc64-unknown-linux-gnu): use udiv module; by Adam Mitchell.
+
+  * Makefile.am: c/SFLAGS/ASFLAGS/. This has only been used by the
+  powerpc and actually never passed the -Wa,foo to the cc.
+
+  * mpih-div.c (mpihelp_divrem): The MPN_COPY_DECR copied one element
+  too many.  This is a gmp2.0.2p9.txt patch.
+
+  * longlong.h (umul_ppmm): Fixes for ARM-4. By Sean MacLennan.
+
+  * mpi-internal.h (karatsuba_ctx): New.
+  * mpih-mul.c (mpihelp_release_karatsuba_ctx): New.
+  (mpihelp_mul_karatsuba_case): New.
+  (mpihelp_mul): Splitted to make use of the new functions.
+  * mpi-pow.c (mpi_powm): Make use of the new splitted function to avoid
+  multiple allocation of temporary memory during the karatsuba operations.
+  * mpi_mpow.c: Removed the unused Barrett code.
+
 2000-03-21 16:17:30  Werner Koch  (wk@habibti.openit.de)
 
        * config.links: Add support for FreeBSD 5.
index 98ad5fc..f7567e5 100644 (file)
@@ -3,12 +3,13 @@
 
 INCLUDES =  -I$(top_srcdir)/gcrypt
 CFLAGS = @CFLAGS@ @MPI_OPT_FLAGS@
-SFLAGS = @MPI_SFLAGS@
+ASFLAGS = @MPI_SFLAGS@
 
 EXTRA_DIST = config.links
 DISTCLEANFILES = mpih-add1.S mpih-mul1.S mpih-mul2.S mpih-mul3.S  \
                 mpih-lshift.S mpih-rshift.S mpih-sub1.S asm-syntax.h sysdep.h
 # Note: we only use .S files so we should delete all left over .s
+# CLEANFILES = _*.s
 CLEANFILES = *.s
 
 noinst_LTLIBRARIES = libmpi.la
@@ -56,4 +57,9 @@ libmpi_la_LIBADD = $(common_asm_objects) @MPI_EXTRA_ASM_OBJS@
 .S.s:
         $(CPP) $(INCLUDES) $(DEFS) $< | grep -v '^#' >$*.s
 
+# Hmmm, we should use this, so that OSes which do not distinguish
+# filename case still work.  We have to see how libtool can handle this
+#   $(CPP) $(INCLUDES) $(DEFS) $< | grep -v '^#' > _$*.s
+#   $(COMPILE) -c _$*.s
+#   mv -f _$*.o $*.o
 
index 40125e4..6a2cbfb 100644 (file)
@@ -1,4 +1,4 @@
-# sourced my ../configure to get the list of files to link
+# sourced by ../configure to get the list of files to link
 # this should set $mpi_ln_src and mpi_ln_dst.
 # Note: this is called from the above directory.
 
@@ -12,23 +12,40 @@ echo '/* created by config.links - do not edit */' >./mpi/asm-syntax.h
 
 if test "$try_asm_modules" = "yes" ; then
 case "${target}" in
-    i[34]86*-*-freebsd*-elf | i[34]86*-*-freebsd[3-9]* | i[34]86*-*-freebsdelf*)
+    i[34]86*-*-freebsd*-elf  | \
+    i[34]86*-*-freebsd[3-9]* | \
+    i[34]86*-*-freebsdelf*   | \
+    i[34]86*-*-netbsd* )
        echo '#define ELF_SYNTAX' >>./mpi/asm-syntax.h
        cat  $srcdir/mpi/i386/syntax.h     >>./mpi/asm-syntax.h
        path="i386"
        ;;
-    i[56]86*-*-freebsd*-elf | i[56]86*-*-freebsd[3-9]* | i[56]86*-*-freebsdelf*)
+    i[56]86*-*-freebsd*-elf  | \
+    i[56]86*-*-freebsd[3-9]* | \
+    i[56]86*-*-freebsdelf*   | \
+    i[56]86*-*-netbsd*      | \
+    pentium-*-netbsd*       | \
+    pentiumpro-*-netbsd*)
        echo '#define ELF_SYNTAX' >>./mpi/asm-syntax.h
        cat  $srcdir/mpi/i386/syntax.h     >>./mpi/asm-syntax.h
        path="i586 i386"
        ;;
-    i[34]86*-*-linuxaout* | i[34]86*-*-linuxoldld* | i[34]86*-*-*bsd*)
+    i[34]86*-*-bsdi4*)
+       echo '#define ELF_SYNTAX' >>./mpi/asm-syntax.h
+       cat  $srcdir/mpi/i386/syntax.h   >>./mpi/asm-syntax.h
+       path="i386"
+       ;;
+    i[34]86*-*-linuxaout*  | \
+    i[34]86*-*-linuxoldld* | \
+    i[34]86*-*-*bsd*)
        echo '#define BSD_SYNTAX' >>./mpi/asm-syntax.h
        echo '#define X86_BROKEN_ALIGN' >>./mpi/asm-syntax.h
        cat  $srcdir/mpi/i386/syntax.h      >>./mpi/asm-syntax.h
        path="i386"
        ;;
-    i[56]86*-*-linuxaout* | i[56]86*-*-linuxoldld* | i[56]86*-*-*bsd*)
+    i[56]86*-*-linuxaout*  | \
+    i[56]86*-*-linuxoldld* | \
+    i[56]86*-*-*bsd*)
        echo '#define BSD_SYNTAX' >>./mpi/asm-syntax.h
        echo '#define X86_BROKEN_ALIGN' >>./mpi/asm-syntax.h
        cat  $srcdir/mpi/i386/syntax.h      >>./mpi/asm-syntax.h
@@ -49,7 +66,9 @@ case "${target}" in
        cat  $srcdir/mpi/i386/syntax.h      >>./mpi/asm-syntax.h
        path="i386"
        ;;
-    i[56]86*-*-* | pentium-*-* | pentiumpro-*-*)
+    i[56]86*-*-*  | \
+    pentium-*-*   | \
+    pentiumpro-*-*)
        echo '#define ELF_SYNTAX' >>./mpi/asm-syntax.h
        cat  $srcdir/mpi/i386/syntax.h      >>./mpi/asm-syntax.h
        path="i586 i386"
@@ -74,13 +93,23 @@ case "${target}" in
        path="pa7100 hppa1.1 hppa"
        mpi_extra_modules="udiv-qrnnd"
        ;;
-    sparc9*-*-* | sparc64*-*-* | ultrasparc*-*-*)
+    sparc64-*-linux-gnu)
+       # An extra rule because we have an report for this one only.
+       # Should be compared against the next GMP version
+       echo '/* configured for sparc64-*-linux-gnu */' >>./mpi/asm-syntax.h
+       path="sparc32v8 sparc32"
+       mpi_extra_modules="udiv"
+       ;;
+    sparc9*-*-*     | \
+    sparc64*-*-*    | \
+    ultrasparc*-*-* )
        echo '/* configured for sparc9 or higher */' >>./mpi/asm-syntax.h
        path="sparc32v8 sparc32"
        ;;
-    sparc8*-*-* | microsparc*-*-*)
+    sparc8*-*-*     | \
+    microsparc*-*-*)
        echo '/* configured for sparc8 */' >>./mpi/asm-syntax.h
-       path="sparc32v8"
+       path="sparc32v8 sparc32"
        ;;
     supersparc*-*-*)
        echo '/* configured for supersparc */' >>./mpi/asm-syntax.h
@@ -92,7 +121,8 @@ case "${target}" in
        path="sparc32"
        mpi_extra_modules="udiv"
        ;;
-    mips[34]*-*-* | mips*-*-irix6*)
+    mips[34]*-*-* | \
+    mips*-*-irix6*)
        echo '/* configured for MIPS3 */' >>./mpi/asm-syntax.h
        path="mips3"
        ;;
@@ -103,7 +133,8 @@ case "${target}" in
 
     # Motorola 68k configurations.  Let m68k mean 68020-68040.
     # mc68000 or mc68060 configurations need to be specified explicitly
-    m680[234]0*-*-linuxaout* | m68k*-*-linuxaout*)
+    m680[234]0*-*-linuxaout* | \
+    m68k*-*-linuxaout*)
        echo '#define MIT_SYNTAX'           >>./mpi/asm-syntax.h
        cat  $srcdir/mpi/m68k/syntax.h      >>./mpi/asm-syntax.h
        path="m68k/mc68020 m68k"
@@ -113,7 +144,8 @@ case "${target}" in
        cat  $srcdir/mpi/m68k/syntax.h      >>./mpi/asm-syntax.h
        path="m68k"
        ;;
-    m680[234]0*-*-linux* | m68k*-*-linux*)
+    m680[234]0*-*-linux* | \
+    m68k*-*-linux*)
        echo '#define ELF_SYNTAX'           >>./mpi/asm-syntax.h
        cat  $srcdir/mpi/m68k/syntax.h      >>./mpi/asm-syntax.h
        ;;
@@ -127,12 +159,14 @@ case "${target}" in
        cat  $srcdir/mpi/m68k/syntax.h      >>./mpi/asm-syntax.h
        path="m68k/mc68020 m68k"
        ;;
-    m68000*-*-* | m68060*-*-*)
+    m68000*-*-* | \
+    m68060*-*-*)
        echo '#define MIT_SYNTAX'           >>./mpi/asm-syntax.h
        cat  $srcdir/mpi/m68k/syntax.h      >>./mpi/asm-syntax.h
        path="m68k/mc68000"
        ;;
-    m680[234]0*-*-* | m68k*-*-*)
+    m680[234]0*-*-* | \
+    m68k*-*-*)
        echo '#define MIT_SYNTAX'           >>./mpi/asm-syntax.h
        cat  $srcdir/mpi/m68k/syntax.h      >>./mpi/asm-syntax.h
        path="m68k/mc68020 m68k"
@@ -144,25 +178,37 @@ case "${target}" in
        cat   $srcdir/mpi/powerpc32/syntax.h    >>./mpi/asm-syntax.h
        path="powerpc32"
        ;;
-    rs6000-*-aix[456789]* | rs6000-*-aix3.2.[456789])
+    rs6000-*-aix[456789]*    | \
+    rs6000-*-aix3.2.[456789])
        mpi_sflags="-Wa,-mpwr"
        path="power"
        mpi_extra_modules="udiv-w-sdiv"
        ;;
-    rs6000-*-* | power-*-* | power2-*-*)
+    rs6000-*-* | \
+    power-*-*  | \
+    power2-*-*)
        mpi_sflags="-Wa,-mppc"
        path="power"
        mpi_extra_modules="udiv-w-sdiv"
        ;;
+    powerpc-ibm-aix4.2.* )
+       # I am not sure about this one but a machine identified by
+       # powerpc-ibm-aix4.2.1.0 cannot use the powerpc32 code.
+       mpi_sflags="-Wa,-mpwr"
+       path="power"
+       mpi_extra_modules="udiv-w-sdiv"
+       ;;
     ppc601-*-*)
        mpi_sflags="-Wa,-mppc"
        path="power powerpc32"
        ;;
-    ppc60[234]*-*-* | powerpc*-*-*)
+    ppc60[234]*-*-* | \
+    powerpc*-*-*)
        mpi_sflags="-Wa,-mppc"
        path="powerpc32"
        ;;
-    ppc620-*-* | powerpc64*-*-*)
+    ppc620-*-*     | \
+    powerpc64*-*-*)
        mpi_sflags="-Wa,-mppc"
        path="powerpc64"
        ;;
index c924355..e36beae 100644 (file)
@@ -199,6 +199,8 @@ extern UDItype __udiv_qrnnd ();
             "rI" ((USItype)(bh)),                                      \
             "r" ((USItype)(al)),                                       \
             "rI" ((USItype)(bl)))
+#ifdef __ARM_ARCH_3__
+/* SAM This does not work on arm4 */
 #define umul_ppmm(xh, xl, a, b) \
   __asm__ ("%@ Inlined umul_ppmm
        mov     %|r0, %2, lsr #16
@@ -218,6 +220,18 @@ extern UDItype __udiv_qrnnd ();
           : "r" ((USItype)(a)),                                        \
             "r" ((USItype)(b))                                         \
           : "r0", "r1", "r2")
+#elif __ARM_ARCH_4__
+#define umul_ppmm(xh, xl, a, b) \
+  __asm__ ("%@ Inlined umul_ppmm
+       umull   %r1, %r0, %r2, %r3" \
+                  : "=&r" ((USItype)(xh)), \
+                    "=r" ((USItype)(xl)) \
+                  : "r" ((USItype)(a)), \
+                    "r" ((USItype)(b)) \
+                  : "r0", "r1")
+#else
+#error Untested architecture
+#endif
 #define UMUL_TIME 20
 #define UDIV_TIME 100
 #endif /* __arm__ */
index 035d33c..cde1c0c 100644 (file)
@@ -1,6 +1,6 @@
 /* mpi-internal.h  -  Internal to the Multi Precision Integers
  *     Copyright (C) 1998 Free Software Foundation, Inc.
- *     Copyright (C) 1994, 1996 Free Software Foundation, Inc.
+ *     Copyright (C) 1994, 1996, 2000 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
@@ -186,6 +186,17 @@ mpi_limb_t mpihelp_sub(mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr, mpi_size_t s1_size,
 int mpihelp_cmp( mpi_ptr_t op1_ptr, mpi_ptr_t op2_ptr, mpi_size_t size );
 
 /*-- mpihelp-mul.c --*/
+
+struct karatsuba_ctx {
+    struct karatsuba_ctx *next;
+    mpi_ptr_t tspace;
+    mpi_size_t tspace_size;
+    mpi_ptr_t tp;
+    mpi_size_t tp_size;
+};
+
+void mpihelp_release_karatsuba_ctx( struct karatsuba_ctx *ctx );
+
 mpi_limb_t mpihelp_addmul_1( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr,
                             mpi_size_t s1_size, mpi_limb_t s2_limb);
 mpi_limb_t mpihelp_submul_1( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr,
@@ -198,6 +209,12 @@ void mpih_sqr_n_basecase( mpi_ptr_t prodp, mpi_ptr_t up, mpi_size_t size );
 void mpih_sqr_n( mpi_ptr_t prodp, mpi_ptr_t up, mpi_size_t size,
                                                mpi_ptr_t tspace);
 
+void mpihelp_mul_karatsuba_case( mpi_ptr_t prodp,
+                                mpi_ptr_t up, mpi_size_t usize,
+                                mpi_ptr_t vp, mpi_size_t vsize,
+                                struct karatsuba_ctx *ctx );
+
+
 /*-- mpihelp-mul_1.c (or xxx/cpu/ *.S) --*/
 mpi_limb_t mpihelp_mul_1( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr,
                          mpi_size_t s1_size, mpi_limb_t s2_limb);
index a57eff8..e0bed13 100644 (file)
@@ -1,6 +1,6 @@
 /* mpi-pow.c  -  MPI functions
  *     Copyright (C) 1998 Free Software Foundation, Inc.
- *     Copyright (C) 1994, 1996 Free Software Foundation, Inc.
+ *     Copyright (C) 1994, 1996, 2000 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
 #include <config.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <assert.h>
+#include <string.h>
 #include "mpi-internal.h"
 #include "longlong.h"
+#include <assert.h>
 
 
 /****************
@@ -159,7 +160,9 @@ gcry_mpi_powm( MPI res, MPI base, MPI exp, MPI mod)
        int c;
        mpi_limb_t e;
        mpi_limb_t carry_limb;
+       struct karatsuba_ctx karactx;
 
+       memset( &karactx, 0, sizeof karactx );
        negative_result = (ep[0] & 1) && base->sign;
 
        i = esize - 1;
@@ -177,6 +180,7 @@ gcry_mpi_powm( MPI res, MPI base, MPI exp, MPI mod)
         * by RP (==RES->d), and with 50% probability in the area originally
         * pointed to by XP.
         */
+
        for(;;) {
            while( c ) {
                mpi_ptr_t tp;
@@ -194,7 +198,6 @@ gcry_mpi_powm( MPI res, MPI base, MPI exp, MPI mod)
                        mpi_free_limb_space( tspace );
                        tsize = 2 * rsize;
                        tspace = mpi_alloc_limb_space( tsize, 0 );
-
                    }
                    mpih_sqr_n( xp, rp, rsize, tspace );
                }
@@ -209,7 +212,15 @@ gcry_mpi_powm( MPI res, MPI base, MPI exp, MPI mod)
                rsize = xsize;
 
                if( (mpi_limb_signed_t)e < 0 ) {
-                   mpihelp_mul( xp, rp, rsize, bp, bsize );
+                   /*mpihelp_mul( xp, rp, rsize, bp, bsize );*/
+                   if( bsize < KARATSUBA_THRESHOLD ) {
+                       mpihelp_mul( xp, rp, rsize, bp, bsize );
+                   }
+                   else {
+                       mpihelp_mul_karatsuba_case(
+                                    xp, rp, rsize, bp, bsize, &karactx );
+                   }
+
                    xsize = rsize + bsize;
                    if( xsize > msize ) {
                        mpihelp_divrem(xp + msize, 0, xp, xsize, mp, msize);
@@ -258,6 +269,8 @@ gcry_mpi_powm( MPI res, MPI base, MPI exp, MPI mod)
        if( mod_shift_cnt )
            mpihelp_rshift( rp, rp, rsize, mod_shift_cnt);
        MPN_NORMALIZE (rp, rsize);
+
+       mpihelp_release_karatsuba_ctx( &karactx );
     }
 
     if( negative_result && rsize ) {
index 0d711cb..3b90994 100644 (file)
@@ -1,6 +1,6 @@
 /* mpihelp-div.c  -  MPI helper functions
  *     Copyright (C) 1998 Free Software Foundation, Inc.
- *     Copyright (C) 1994, 1996 Free Software Foundation, Inc.
+ *     Copyright (C) 1994, 1996, 2000 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
@@ -338,7 +338,7 @@ mpihelp_divrem( mpi_ptr_t qp, mpi_size_t qextra_limbs,
                }
                else {
                    n2 = np[dsize - 1];
-                   MPN_COPY_DECR (np + 1, np, dsize);
+                   MPN_COPY_DECR (np + 1, np, dsize - 1);
                    np[0] = 0;
                }
 
index 67749f4..76d47fe 100644 (file)
@@ -1,5 +1,5 @@
 /* mpihelp-mul.c  -  MPI helper functions
- * Copyright (C) 1994, 1996, 1998, 1999 Free Software Foundation, Inc.
+ * Copyright (C) 1994, 1996, 1998, 1999, 2000 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
 #include <config.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 #include "mpi-internal.h"
 #include "longlong.h"
-#include "g10lib.h" /* for g10_is_secure() */
-
+#include "g10lib.h" /* g10_is_secure() */
 
 
 #define MPN_MUL_N_RECURSE(prodp, up, vp, size, tspace) \
@@ -373,6 +373,86 @@ mpihelp_mul_n( mpi_ptr_t prodp, mpi_ptr_t up, mpi_ptr_t vp, mpi_size_t size)
 }
 
 
+
+void
+mpihelp_mul_karatsuba_case( mpi_ptr_t prodp,
+                           mpi_ptr_t up, mpi_size_t usize,
+                           mpi_ptr_t vp, mpi_size_t vsize,
+                           struct karatsuba_ctx *ctx )
+{
+    mpi_limb_t cy;
+
+    if( !ctx->tspace || ctx->tspace_size < vsize ) {
+       if( ctx->tspace )
+           mpi_free_limb_space( ctx->tspace );
+       ctx->tspace = mpi_alloc_limb_space( 2 * vsize,
+                                      g10_is_secure( up ) || g10_is_secure( vp ) );
+       ctx->tspace_size = vsize;
+    }
+
+    MPN_MUL_N_RECURSE( prodp, up, vp, vsize, ctx->tspace );
+
+    prodp += vsize;
+    up += vsize;
+    usize -= vsize;
+    if( usize >= vsize ) {
+       if( !ctx->tp || ctx->tp_size < vsize ) {
+           if( ctx->tp )
+               mpi_free_limb_space( ctx->tp );
+           ctx->tp = mpi_alloc_limb_space( 2 * vsize, g10_is_secure( up )
+                                                     || g10_is_secure( vp ) );
+           ctx->tp_size = vsize;
+       }
+
+       do {
+           MPN_MUL_N_RECURSE( ctx->tp, up, vp, vsize, ctx->tspace );
+           cy = mpihelp_add_n( prodp, prodp, ctx->tp, vsize );
+           mpihelp_add_1( prodp + vsize, ctx->tp + vsize, vsize, cy );
+           prodp += vsize;
+           up += vsize;
+           usize -= vsize;
+       } while( usize >= vsize );
+    }
+
+    if( usize ) {
+       if( usize < KARATSUBA_THRESHOLD ) {
+           mpihelp_mul( ctx->tspace, vp, vsize, up, usize );
+       }
+       else {
+           if( !ctx->next ) {
+               ctx->next = g10_xcalloc( 1, sizeof *ctx );
+           }
+           mpihelp_mul_karatsuba_case( ctx->tspace,
+                                       vp, vsize,
+                                       up, usize,
+                                       ctx->next );
+       }
+
+       cy = mpihelp_add_n( prodp, prodp, ctx->tspace, vsize);
+       mpihelp_add_1( prodp + vsize, ctx->tspace + vsize, usize, cy );
+    }
+}
+
+
+void
+mpihelp_release_karatsuba_ctx( struct karatsuba_ctx *ctx )
+{
+    struct karatsuba_ctx *ctx2;
+
+    if( ctx->tp )
+       mpi_free_limb_space( ctx->tp );
+    if( ctx->tspace )
+       mpi_free_limb_space( ctx->tspace );
+    for( ctx=ctx->next; ctx; ctx = ctx2 ) {
+       ctx2 = ctx->next;
+       if( ctx->tp )
+           mpi_free_limb_space( ctx->tp );
+       if( ctx->tspace )
+           mpi_free_limb_space( ctx->tspace );
+       g10_free( ctx );
+    }
+}
+
 /* Multiply the natural numbers u (pointed to by UP, with USIZE limbs)
  * and v (pointed to by VP, with VSIZE limbs), and store the result at
  * PRODP.  USIZE + VSIZE limbs are always stored, but if the input
@@ -394,7 +474,7 @@ mpihelp_mul( mpi_ptr_t prodp, mpi_ptr_t up, mpi_size_t usize,
 {
     mpi_ptr_t prod_endp = prodp + usize + vsize - 1;
     mpi_limb_t cy;
-    mpi_ptr_t tspace;
+    struct karatsuba_ctx ctx;
 
     if( vsize < KARATSUBA_THRESHOLD ) {
        mpi_size_t i;
@@ -438,34 +518,9 @@ mpihelp_mul( mpi_ptr_t prodp, mpi_ptr_t up, mpi_size_t usize,
        return cy;
     }
 
-    tspace = mpi_alloc_limb_space( 2 * vsize,
-                                  g10_is_secure( up ) || g10_is_secure( vp ) );
-    MPN_MUL_N_RECURSE( prodp, up, vp, vsize, tspace );
-
-    prodp += vsize;
-    up += vsize;
-    usize -= vsize;
-    if( usize >= vsize ) {
-       mpi_ptr_t tp = mpi_alloc_limb_space( 2 * vsize, g10_is_secure( up )
-                                                       || g10_is_secure( vp ) );
-       do {
-           MPN_MUL_N_RECURSE( tp, up, vp, vsize, tspace );
-           cy = mpihelp_add_n( prodp, prodp, tp, vsize );
-           mpihelp_add_1( prodp + vsize, tp + vsize, vsize, cy );
-           prodp += vsize;
-           up += vsize;
-           usize -= vsize;
-       } while( usize >= vsize );
-       mpi_free_limb_space( tp );
-    }
-
-    if( usize ) {
-       mpihelp_mul( tspace, vp, vsize, up, usize );
-       cy = mpihelp_add_n( prodp, prodp, tspace, vsize);
-       mpihelp_add_1( prodp + vsize, tspace + vsize, usize, cy );
-    }
-
-    mpi_free_limb_space( tspace );
+    memset( &ctx, 0, sizeof ctx );
+    mpihelp_mul_karatsuba_case( prodp, up, usize, vp, vsize, &ctx );
+    mpihelp_release_karatsuba_ctx( &ctx );
     return *prod_endp;
 }
 
index e69de29..e664c8d 100644 (file)
@@ -0,0 +1,7 @@
+mpih-add1.S
+mpih-lshift.S
+mpih-mul1.S
+mpih-mul2.S
+mpih-mul3.S
+mpih-rshift.S
+mpih-sub1.S
diff --git a/mpi/power/mpih-add1.S b/mpi/power/mpih-add1.S
new file mode 100644 (file)
index 0000000..ad27f3d
--- /dev/null
@@ -0,0 +1,86 @@
+/* IBM POWER add_n -- Add two limb vectors of equal, non-zero length.
+ *
+ * Copyright (C) 1992, 1994, 1995, 1996, 1999 Free Software Foundation, Inc.
+ *
+ * This file is part of GnuPG.
+ *
+ * GnuPG 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.
+ *
+ * GnuPG is distributed in the hope that 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 "sysdep.h"
+#include "asm-syntax.h"
+
+/*
+# INPUT PARAMETERS
+# res_ptr      r3
+# s1_ptr       r4
+# s2_ptr       r5
+# size         r6
+ */
+
+       .toc
+       .extern mpihelp_add_n[DS]
+       .extern .mpihelp_add_n
+.csect [PR]
+       .align 2
+       .globl mpihelp_add_n
+       .globl .mpihelp_add_n
+       .csect mpihelp_add_n[DS]
+mpihelp_add_n:
+       .long .mpihelp_add_n, TOC[tc0], 0
+       .csect [PR]
+.mpihelp_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?
+       bne     1,L1            # branch if not
+       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/mpi/power/mpih-lshift.S b/mpi/power/mpih-lshift.S
new file mode 100644 (file)
index 0000000..5c53a0a
--- /dev/null
@@ -0,0 +1,64 @@
+/* IBM POWER lshift
+ *
+ * Copyright (C) 1992, 1994, 1999 Free Software Foundation, Inc.
+ *
+ * This file is part of GnuPG.
+ *
+ * GnuPG 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.
+ *
+ * GnuPG is distributed in the hope that 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 "sysdep.h"
+#include "asm-syntax.h"
+
+/*
+# INPUT PARAMETERS
+# res_ptr      r3
+# s_ptr        r4
+# size         r5
+# cnt          r6
+ */
+
+       .toc
+       .extern mpihelp_lshift[DS]
+       .extern .mpihelp_lshift
+.csect [PR]
+       .align 2
+       .globl mpihelp_lshift
+       .globl .mpihelp_lshift
+       .csect mpihelp_lshift[DS]
+mpihelp_lshift:
+       .long .mpihelp_lshift, TOC[tc0], 0
+       .csect [PR]
+.mpihelp_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/mpi/power/mpih-mul1.S b/mpi/power/mpih-mul1.S
new file mode 100644 (file)
index 0000000..3b71b5a
--- /dev/null
@@ -0,0 +1,115 @@
+/* IBM POWER  mul_1 -- Multiply a limb vector with a limb and store
+ * the result in a second limb vector.
+ *
+ * Copyright (C) 1992, 1994, 1999 Free Software Foundation, Inc.
+ *
+ * This file is part of GnuPG.
+ *
+ * GnuPG 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.
+ *
+ * GnuPG is distributed in the hope that 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 "sysdep.h"
+#include "asm-syntax.h"
+
+/*
+# INPUT PARAMETERS
+# res_ptr      r3
+# s1_ptr       r4
+# size         r5
+# s2_limb      r6
+
+# The RS/6000 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
+       .csect .mpihelp_mul_1[PR]
+       .align 2
+       .globl mpihelp_mul_1
+       .globl .mpihelp_mul_1
+       .csect mpihelp_mul_1[DS]
+mpihelp_mul_1:
+       .long .mpihelp_mul_1[PR], TOC[tc0], 0
+       .csect .mpihelp_mul_1[PR]
+.mpihelp_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/mpi/power/mpih-mul2.S b/mpi/power/mpih-mul2.S
new file mode 100644 (file)
index 0000000..19ddee8
--- /dev/null
@@ -0,0 +1,130 @@
+/* IBM POWER addmul_1 -- Multiply a limb vector with a limb and add
+ *                      the result to a second limb vector.
+ *
+ * Copyright (C) 1992, 1994, 1999 Free Software Foundation, Inc.
+ *
+ * This file is part of GnuPG.
+ *
+ * GnuPG 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.
+ *
+ * GnuPG is distributed in the hope that 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 "sysdep.h"
+#include "asm-syntax.h"
+
+
+
+/*
+# INPUT PARAMETERS
+# res_ptr      r3
+# s1_ptr       r4
+# size         r5
+# s2_limb      r6
+
+# The RS/6000 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
+       .csect .mpihelp_addmul_1[PR]
+       .align 2
+       .globl mpihelp_addmul_1
+       .globl .mpihelp_addmul_1
+       .csect mpihelp_addmul_1[DS]
+mpihelp_addmul_1:
+       .long .mpihelp_addmul_1[PR], TOC[tc0], 0
+       .csect .mpihelp_addmul_1[PR]
+.mpihelp_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/mpi/power/mpih-mul3.S b/mpi/power/mpih-mul3.S
new file mode 100644 (file)
index 0000000..e875e88
--- /dev/null
@@ -0,0 +1,135 @@
+/* IBM POWER submul_1 -- Multiply a limb vector with a limb and subtract
+ *                      the result from a second limb vector.
+ *
+ * Copyright (C) 1992, 1994, 1999 Free Software Foundation, Inc.
+ *
+ * This file is part of GnuPG.
+ *
+ * GnuPG 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.
+ *
+ * GnuPG is distributed in the hope that 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 "sysdep.h"
+#include "asm-syntax.h"
+
+
+/*
+
+# INPUT PARAMETERS
+# res_ptr      r3
+# s1_ptr       r4
+# size         r5
+# s2_limb      r6
+
+# The RS/6000 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
+       .csect .mpihelp_submul_1[PR]
+       .align 2
+       .globl mpihelp_submul_1
+       .globl .mpihelp_submul_1
+       .csect mpihelp_submul_1[DS]
+mpihelp_submul_1:
+       .long .mpihelp_submul_1[PR], TOC[tc0], 0
+       .csect .mpihelp_submul_1[PR]
+.mpihelp_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/mpi/power/mpih-rshift.S b/mpi/power/mpih-rshift.S
new file mode 100644 (file)
index 0000000..e296450
--- /dev/null
@@ -0,0 +1,64 @@
+/* IBM POWER rshift
+ *
+ * Copyright (C) 1992, 1994, 1999 Free Software Foundation, Inc.
+ *
+ * This file is part of GnuPG.
+ *
+ * GnuPG 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.
+ *
+ * GnuPG is distributed in the hope that 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 "sysdep.h"
+#include "asm-syntax.h"
+
+
+/*
+# INPUT PARAMETERS
+# res_ptr      r3
+# s_ptr        r4
+# size         r5
+# cnt          r6
+*/
+
+       .toc
+       .extern mpihelp_rshift[DS]
+       .extern .mpihelp_rshift
+.csect [PR]
+       .align 2
+       .globl mpihelp_rshift
+       .globl .mpihelp_rshift
+       .csect mpihelp_rshift[DS]
+mpihelp_rshift:
+       .long .mpihelp_rshift, TOC[tc0], 0
+       .csect [PR]
+.mpihelp_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/mpi/power/mpih-sub1.S b/mpi/power/mpih-sub1.S
new file mode 100644 (file)
index 0000000..a360553
--- /dev/null
@@ -0,0 +1,87 @@
+/* IBM POWER sub_n -- Subtract two limb vectors of equal, non-zero length.
+ *
+ * Copyright (C) 1992, 1994, 1995, 1996, 1999 Free Software Foundation, Inc.
+ *
+ * This file is part of GnuPG.
+ *
+ * GnuPG 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.
+ *
+ * GnuPG is distributed in the hope that 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 "sysdep.h"
+#include "asm-syntax.h"
+
+/*
+# INPUT PARAMETERS
+# res_ptr      r3
+# s1_ptr       r4
+# s2_ptr       r5
+# size         r6
+ */
+
+       .toc
+       .extern mpihelp_sub_n[DS]
+       .extern .mpihelp_sub_n
+.csect [PR]
+       .align 2
+       .globl mpihelp_sub_n
+       .globl .mpihelp_sub_n
+       .csect mpihelp_sub_n[DS]
+mpihelp_sub_n:
+       .long .mpihelp_sub_n, TOC[tc0], 0
+       .csect [PR]
+.mpihelp_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?
+       bne     1,L1            # branch if not
+       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
+
index e742055..16779ff 100644 (file)
@@ -1,3 +1,8 @@
+Mon Jul 17 16:35:47 CEST 2000  Werner Koch  <wk@>
+
+  * config.gues, config.sub: Support for s390-ibm-linux-gnu; thanks
+  to Holger Smolinski. Add support for QNX; by Sam Roberts.
+
 Tue Oct 26 14:10:21 CEST 1999  Werner Koch  <wk@gnupg.de>
 
        * commit: Remove leading and trailing empty lines when copying
index 46b3ea3..50fd53e 100755 (executable)
@@ -10,7 +10,7 @@
 #
 # 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
+# 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
@@ -68,6 +68,9 @@ trap 'rm -f $dummy.c $dummy.o $dummy; exit 1' 1 2 15
 # Note: order is significant - the case branches are not exclusive.
 
 case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    *:QNX:*:*)
+       echo i386-pc-qnx
+       exit 0 ;;
     alpha:OSF1:*:*)
        if test $UNAME_RELEASE = "V4.0"; then
                UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
@@ -226,30 +229,30 @@ EOF
        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 
+    # "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}
+       echo m68k-atari-mint${UNAME_RELEASE}
        exit 0 ;;
     atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
        echo m68k-atari-mint${UNAME_RELEASE}
-        exit 0 ;;
+       exit 0 ;;
     *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
-        echo m68k-atari-mint${UNAME_RELEASE}
+       echo m68k-atari-mint${UNAME_RELEASE}
        exit 0 ;;
     milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
-        echo m68k-milan-mint${UNAME_RELEASE}
-        exit 0 ;;
+       echo m68k-milan-mint${UNAME_RELEASE}
+       exit 0 ;;
     hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
-        echo m68k-hades-mint${UNAME_RELEASE}
-        exit 0 ;;
+       echo m68k-hades-mint${UNAME_RELEASE}
+       exit 0 ;;
     *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
-        echo m68k-unknown-mint${UNAME_RELEASE}
-        exit 0 ;;
+       echo m68k-unknown-mint${UNAME_RELEASE}
+       exit 0 ;;
     sun3*:NetBSD:*:*)
        echo m68k-sun-netbsd${UNAME_RELEASE}
        exit 0 ;;
@@ -272,8 +275,8 @@ EOF
        echo powerpc-apple-machten${UNAME_RELEASE}
        exit 0 ;;
     macppc:NetBSD:*:*)
-        echo powerpc-apple-netbsd${UNAME_RELEASE}
-        exit 0 ;;
+       echo powerpc-apple-netbsd${UNAME_RELEASE}
+       exit 0 ;;
     RISC*:Mach:*:*)
        echo mips-dec-mach_bsd4.3
        exit 0 ;;
@@ -287,7 +290,7 @@ EOF
        echo clipper-intergraph-clix${UNAME_RELEASE}
        exit 0 ;;
     mips:*:*:UMIPS | mips:*:*:RISCos)
-       sed 's/^        //' << EOF >$dummy.c
+       sed 's/^        //' << EOF >$dummy.c
 #ifdef __cplusplus
        int main (int argc, char *argv[]) {
 #else
@@ -326,19 +329,19 @@ EOF
        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 -o $UNAME_PROCESSOR = mc88110 ] ; then
+       # DG/UX returns AViiON for all architectures
+       UNAME_PROCESSOR=`/usr/bin/uname -p`
+       if [ $UNAME_PROCESSOR = mc88100 -o $UNAME_PROCESSOR = mc88110 ] ; then
        if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx \
             -o ${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)
+       else echo i586-dg-dgux${UNAME_RELEASE}
+       fi
+       exit 0 ;;
+    M88*:DolphinOS:*:*) # DolphinOS (SVR3)
        echo m88k-dolphin-sysv3
        exit 0 ;;
     M88*:*:R3*:*)
@@ -356,13 +359,13 @@ EOF
        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 '
+       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
+               sed 's/^                //' << EOF >$dummy.c
                #include <sys/systemcfg.h>
 
                main()
@@ -402,9 +405,9 @@ EOF
     ibmrt:4.4BSD:*|romp-ibm:BSD:*)
        echo romp-ibm-bsd4.4
        exit 0 ;;
-    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC NetBSD and
+    ibmrt:*BSD:*|romp-ibm:BSD:*)           # covers RT/PC NetBSD and
        echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
-       exit 0 ;;                           # report: romp-ibm BSD 4.3
+       exit 0 ;;                           # report: romp-ibm BSD 4.3
     *:BOSX:*:*)
        echo rs6000-bull-bosx
        exit 0 ;;
@@ -419,39 +422,39 @@ EOF
        exit 0 ;;
     9000/[34678]??:HP-UX:*:*)
        case "${UNAME_MACHINE}" in
-           9000/31? )            HP_ARCH=m68000 ;;
-           9000/[34]?? )         HP_ARCH=m68k ;;
+           9000/31? )            HP_ARCH=m68000 ;;
+           9000/[34]?? )         HP_ARCH=m68k ;;
            9000/[678][0-9][0-9])
-              sed 's/^              //' << EOF >$dummy.c
-              #include <stdlib.h>
-              #include <unistd.h>
+             sed 's/^              //' << EOF >$dummy.c
+             #include <stdlib.h>
+             #include <unistd.h>
 
-              int main ()
-              {
-              #if defined(_SC_KERNEL_BITS)
-                  long bits = sysconf(_SC_KERNEL_BITS);
-              #endif
-                  long cpu  = sysconf (_SC_CPU_VERSION);
+             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);
-              }
+                 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
        ($CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy`
        rm -f $dummy.c $dummy
@@ -460,7 +463,7 @@ EOF
        echo ${HP_ARCH}-hp-hpux${HPUX_REV}
        exit 0 ;;
     3050*:HI-UX:*:*)
-       sed 's/^        //' << EOF >$dummy.c
+       sed 's/^        //' << EOF >$dummy.c
        #include <unistd.h>
        int
        main ()
@@ -468,7 +471,7 @@ EOF
          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.  */
+            results, however.  */
          if (CPU_IS_PA_RISC (cpu))
            {
              switch (cpu)
@@ -519,25 +522,25 @@ EOF
        exit 0 ;;
     C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
        echo c1-convex-bsd
-        exit 0 ;;
+       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 ;;
+       exit 0 ;;
     C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
        echo c34-convex-bsd
-        exit 0 ;;
+       exit 0 ;;
     C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
        echo c38-convex-bsd
-        exit 0 ;;
+       exit 0 ;;
     C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
        echo c4-convex-bsd
-        exit 0 ;;
+       exit 0 ;;
     CRAY*X-MP:*:*:*)
        echo xmp-cray-unicos
-        exit 0 ;;
+       exit 0 ;;
     CRAY*Y-MP:*:*:*)
        echo ymp-cray-unicos${UNAME_RELEASE}
        exit 0 ;;
@@ -554,12 +557,12 @@ EOF
        exit 0 ;;
     CRAY-2:*:*:*)
        echo cray2-cray-unicos
-        exit 0 ;;
+       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 ;;
+       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 ;;
@@ -631,16 +634,17 @@ EOF
        ld_help_string=`cd /; ld --help 2>&1`
        ld_supported_emulations=`echo $ld_help_string \
                         | sed -ne '/supported emulations:/!d
-                                   s/[         ][      ]*/ /g
+                                   s/[         ][      ]*/ /g
                                    s/.*supported emulations: *//
                                    s/ .*//
                                    p'`
-        case "$ld_supported_emulations" in
+       case "$ld_supported_emulations" in
          i?86linux)  echo "${UNAME_MACHINE}-pc-linux-gnuaout"      ; exit 0 ;;
          i?86coff)   echo "${UNAME_MACHINE}-pc-linux-gnucoff"      ; exit 0 ;;
          sparclinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
          armlinux)   echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
          m68klinux)  echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
+         elf_s390)   echo "${UNAME_MACHINE}-ibm-linux-gnu"         ; exit 0 ;;
          elf32ppc)
                # Determine Lib Version
                cat >$dummy.c <<EOF
@@ -668,13 +672,13 @@ EOF
                        if test "$?" = 0 ; then
                                LIBC="libc1"
                        fi
-               fi      
+               fi
                rm -f $dummy.c $dummy
                echo powerpc-unknown-linux-gnu${LIBC} ; exit 0 ;;
        esac
 
        if test "${UNAME_MACHINE}" = "alpha" ; then
-               sed 's/^        //'  <<EOF >$dummy.s
+               sed 's/^        //'  <<EOF >$dummy.s
                .globl main
                .ent main
        main:
@@ -789,11 +793,11 @@ EOF
        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.
+       # 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 ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
        exit 0 ;;
     i?86:*:4.*:* | i?86:SYSTEM_V:4.*:*)
@@ -830,10 +834,10 @@ EOF
        fi
        exit 0 ;;
     pc:*:*:*)
-        # uname -m prints for DJGPP always 'pc', but it prints nothing about
-        # the processor, so we play safe by assuming i386.
+       # 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 ;;
+       exit 0 ;;
     Intel:Mach:3*:*)
        echo i386-pc-mach3
        exit 0 ;;
@@ -862,8 +866,8 @@ EOF
        /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 ;;
+       /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 ;;
@@ -897,9 +901,9 @@ EOF
        fi
        exit 0 ;;
     PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
-                           # says <Richard.M.Bartel@ccMail.Census.GOV>
-        echo i586-unisys-sysv4
-        exit 0 ;;
+                          # says <Richard.M.Bartel@ccMail.Census.GOV>
+       echo i586-unisys-sysv4
+       exit 0 ;;
     *:UNIX_System_V:4*:FTX*)
        # From Gerald Hewes <hewes@openmarket.com>.
        # How about differentiating between stratus architectures? -djm
@@ -917,11 +921,11 @@ EOF
        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}
+               echo mips-nec-sysv${UNAME_RELEASE}
        else
-               echo mips-unknown-sysv${UNAME_RELEASE}
+               echo mips-unknown-sysv${UNAME_RELEASE}
        fi
-        exit 0 ;;
+       exit 0 ;;
     BeBox:BeOS:*:*)    # BeOS running on hardware made by Be, PPC only.
        echo powerpc-be-beos
        exit 0 ;;
@@ -964,11 +968,11 @@ main ()
 #include <sys/param.h>
   printf ("m68k-sony-newsos%s\n",
 #ifdef NEWSOS4
-          "4"
+         "4"
 #else
          ""
 #endif
-         ); exit (0);
+        ); exit (0);
 #endif
 #endif
 
@@ -1046,7 +1050,7 @@ main ()
 #endif
 
 #if defined(__EMX__)
-  printf ("i386-pc-os2_emx"); exit(0);  
+  printf ("i386-pc-os2_emx"); exit(0);
 #endif
 
   exit (1);
index 2436b45..0159f72 100755 (executable)
@@ -12,7 +12,7 @@
 #
 # 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
+# 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
@@ -34,7 +34,7 @@
 # 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
+# it does not support. The user should be able to distinguish
 # a failure to support a valid configuration from a meaningless
 # configuration.
 
@@ -166,7 +166,7 @@ case $basic_machine in
                | arme[lb] | pyramid | mn10200 | mn10300 | tron | a29k \
                | 580 | i960 | h8300 \
                | hppa | hppa1.0 | hppa1.1 | hppa2.0 | hppa2.0w | hppa2.0n \
-               | alpha | alphaev[4-7] | alphaev56 | alphapca5[67] \
+               | alpha | alphaev[4-7] | alphaev56 | alphapca5[67] | s390 \
                | we32k | ns16k | clipper | i370 | sh | powerpc | powerpcle \
                | 1750a | dsp16xx | pdp11 | mips16 | mips64 | mipsel | mips64el \
                | mips64orion | mips64orionel | mipstx39 | mipstx39el \
@@ -185,6 +185,12 @@ case $basic_machine in
        i[34567]86)
          basic_machine=$basic_machine-pc
          ;;
+       s390 | s390-ibm)
+         basic_machine=s390-ibm
+         ;;
+       s390-redhat)
+         basic_machine=s390-redhat
+         ;;
        # Object if more than one company name word.
        *-*-*)
                echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
@@ -600,7 +606,7 @@ case $basic_machine in
        pbb)
                basic_machine=m68k-tti
                ;;
-        pc532 | pc532-*)
+       pc532 | pc532-*)
                basic_machine=ns32k-pc532
                ;;
        pentium | p5 | k5 | k6 | nexen)
@@ -627,12 +633,12 @@ case $basic_machine in
        power)  basic_machine=rs6000-ibm
                ;;
        ppc)    basic_machine=powerpc-unknown
-               ;;
+               ;;
        ppc-*)  basic_machine=powerpc-`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/^[^-]*-//'`
                ;;
@@ -756,8 +762,8 @@ case $basic_machine in
                os=-vms
                ;;
        vpp*|vx|vx-*)
-               basic_machine=f301-fujitsu
-               ;;
+              basic_machine=f301-fujitsu
+              ;;
        vxworks960)
                basic_machine=i960-wrs
                os=-vxworks
@@ -782,7 +788,7 @@ case $basic_machine in
                basic_machine=xmp-cray
                os=-unicos
                ;;
-        xps | xps100)
+       xps | xps100)
                basic_machine=xps100-honeywell
                ;;
        z8k-*-coff)
@@ -830,7 +836,7 @@ case $basic_machine in
        sparc | sparcv9)
                basic_machine=sparc-sun
                ;;
-        cydra)
+       cydra)
                basic_machine=cydra-cydrome
                ;;
        orion)
@@ -872,8 +878,8 @@ esac
 if [ x"$os" != x"" ]
 then
 case $os in
-        # First match some system type aliases
-        # that might get confused with valid system types.
+       # 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|'`
@@ -881,6 +887,9 @@ case $os in
        -solaris)
                os=-solaris2
                ;;
+       -qnx)
+               os=-qnx
+               ;;
        -svr4*)
                os=-sysv4
                ;;
@@ -948,7 +957,7 @@ case $os in
                os=-sysv
                ;;
        -ns2 )
-               os=-nextstep2
+               os=-nextstep2
                ;;
        # Preserve the version number of sinix5.
        -sinix5.*)
@@ -984,8 +993,8 @@ case $os in
        -xenix)
                os=-xenix
                ;;
-        -*mint | -*MiNT)
-               os=-mint
+       -*mint | -*MiNT)
+               os=-mint
                ;;
        -none)
                ;;
@@ -1018,7 +1027,7 @@ case $basic_machine in
        arm*-semi)
                os=-aout
                ;;
-        pdp11-*)
+       pdp11-*)
                os=-none
                ;;
        *-dec | vax-*)
@@ -1108,19 +1117,19 @@ case $basic_machine in
        *-next)
                os=-nextstep3
                ;;
-        *-gould)
+       *-gould)
                os=-sysv
                ;;
-        *-highlevel)
+       *-highlevel)
                os=-bsd
                ;;
        *-encore)
                os=-bsd
                ;;
-        *-sgi)
+       *-sgi)
                os=-irix
                ;;
-        *-siemens)
+       *-siemens)
                os=-sysv4
                ;;
        *-masscomp)