Not yet completed changes to support PPC
authorWerner Koch <wk@gnupg.org>
Tue, 10 Nov 1998 18:35:11 +0000 (18:35 +0000)
committerWerner Koch <wk@gnupg.org>
Tue, 10 Nov 1998 18:35:11 +0000 (18:35 +0000)
19 files changed:
ChangeLog
configure.in
mpi/ChangeLog
mpi/Makefile.am
mpi/config.links
mpi/generic/distfiles
mpi/generic/mpih-lshift.c [moved from mpi/generic/mpih-shift.c with 68% similarity]
mpi/generic/mpih-rshift.c [new file with mode: 0644]
mpi/generic/udiv-w-sdiv.c [new file with mode: 0644]
mpi/power/distfiles [new file with mode: 0644]
mpi/powerpc32/distfiles [new file with mode: 0644]
mpi/powerpc32/mpih-add1.S [new file with mode: 0644]
mpi/powerpc32/mpih-lshift.S [new file with mode: 0644]
mpi/powerpc32/mpih-mul1.S [new file with mode: 0644]
mpi/powerpc32/mpih-mul2.S [new file with mode: 0644]
mpi/powerpc32/mpih-mul3.S [new file with mode: 0644]
mpi/powerpc32/mpih-rshift.S [new file with mode: 0644]
mpi/powerpc32/mpih-sub1.S [new file with mode: 0644]
mpi/powerpc64/distfiles [new file with mode: 0644]

index 4fd60bb..9e472db 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,7 +1,11 @@
+Tue Nov 10 19:32:40 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * configure.in (MPI_SFLAGS): New.
+
 Tue Nov 10 13:44:53 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
        * ABOUT-NLS: New
-       * configure-in (AC_REVISION): New.
+       * configure.in (AC_REVISION): New.
 
 Sun Nov  8 18:20:35 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
index e7fec0c..c782357 100644 (file)
@@ -231,6 +231,7 @@ if test -f $srcdir/mpi/config.links ; then
     . $srcdir/mpi/config.links
     WK_LINK_FILES($mpi_ln_src, $mpi_ln_dst)
     ac_cv_mpi_extra_asm_modules="$mpi_extra_modules"
+    ac_cv_mpi_sflags="$mpi_sflags"
     ac_cv_mpi_config_done="yes"
     AC_MSG_RESULT(done)
 else
@@ -247,6 +248,8 @@ done
 AC_MSG_RESULT()
 fi
 AC_SUBST(MPI_EXTRA_ASM_OBJS)
+MPI_SFLAGS="$ac_cv_mpi_sflags"
+AC_SUBST(MPI_SFLAGS)
 
 dnl Do we have zlib? Must do it here because Solaris failed
 dnl when compiling a conftest (due to the "-lz" from LIBS).
index 893c4c2..1fb336e 100644 (file)
@@ -1,3 +1,9 @@
+Tue Nov 10 19:31:37 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * power*/ : Started with stuff for PPC
+       * config.links: Some stuff for PPC.
+       * generic/udiv-w-sdiv.c: New but disabled.
+
 Tue Oct 27 12:37:46 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
        * config.links (freebsd): Fixes for FreeBSD 3.0
index 11a18bf..8a30288 100644 (file)
@@ -2,6 +2,7 @@
 
 INCLUDES =  -I$(top_srcdir)/include
 CFLAGS += -O2
+SFLAGS = @MPI_SFLAGS@
 
 SUFFIXES = .S .s
 
index 308733c..df8d1bb 100644 (file)
@@ -4,6 +4,7 @@
 
 
 mpi_extra_modules=
+mpi_sflags=
 
 test -d ./mpi || mkdir ./mpi
 
@@ -92,35 +93,59 @@ 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*)
-       echo '#define MIT_SYNTAX'            >./mpi/asm-syntax.h
+       echo '#define MIT_SYNTAX'           >>./mpi/asm-syntax.h
        cat  $srcdir/mpi/m68k/syntax.h      >>./mpi/asm-syntax.h
        path="m68k/mc68020 m68k"
        ;;
     m68060*-*-linuxaout*)
-       echo '#define MIT_SYNTAX'            >./mpi/asm-syntax.h
+       echo '#define MIT_SYNTAX'           >>./mpi/asm-syntax.h
        cat  $srcdir/mpi/m68k/syntax.h      >>./mpi/asm-syntax.h
        path="m68k"
        ;;
     m680[234]0*-*-linux* | m68k*-*-linux*)
-       echo '#define ELF_SYNTAX'            >./mpi/asm-syntax.h
+       echo '#define ELF_SYNTAX'           >>./mpi/asm-syntax.h
        cat  $srcdir/mpi/m68k/syntax.h      >>./mpi/asm-syntax.h
        path="m68k/mc68020 m68k"
        ;;
     m68060*-*-linux*)
-       echo '#define ELF_SYNTAX'            >./mpi/asm-syntax.h
+       echo '#define ELF_SYNTAX'           >>./mpi/asm-syntax.h
        cat  $srcdir/mpi/m68k/syntax.h      >>./mpi/asm-syntax.h
        path="m68k"
        ;;
     m68000*-*-* | m68060*-*-*)
-       echo '#define MIT_SYNTAX'            >./mpi/asm-syntax.h
+       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*-*-*)
-       echo '#define MIT_SYNTAX'            >./mpi/asm-syntax.h
+       echo '#define MIT_SYNTAX'           >>./mpi/asm-syntax.h
        cat  $srcdir/mpi/m68k/syntax.h      >>./mpi/asm-syntax.h
        path="m68k/mc68020 m68k"
        ;;
+
+    rs6000-*-aix[456789]* | rs6000-*-aix3.2.[456789])
+       mpi_sflags="-Wa,-mpwr"
+       path="power"
+       mpi_extra_modules="udiv-w-sdiv"
+       ;;
+    rs6000-*-* | power-*-* | power2-*-*)
+       mpi_sflags="-Wa,-mppc"
+       path="power"
+       mpi_extra_modules="udiv-w-sdiv"
+       ;;
+    ppc601-*-*)
+       mpi_sflags="-Wa,-mppc"
+       path="power powerpc32"
+       ;;
+    ppc60[234]*-*-* | powerpc*-*-*)
+       mpi_sflags="-Wa,-mppc"
+       path="powerpc32"
+       ;;
+    ppc620-*-* | powerpc64*-*-*)
+       mpi_sflags="-Wa,-mppc"
+       path="powerpc64"
+       ;;
+
     *)
        echo '/* No assembler modules configured */' >>./mpi/asm-syntax.h
        path=""
index 02a1ca4..0bf4600 100644 (file)
@@ -5,4 +5,5 @@ mpih-mul3.c
 mpih-lshift.c
 mpih-rshift.c
 mpih-sub1.c
+udiv-w-sdiv.c
 
similarity index 68%
rename from mpi/generic/mpih-shift.c
rename to mpi/generic/mpih-lshift.c
index 2da2edd..698cd38 100644 (file)
@@ -1,6 +1,5 @@
-/* mpihelp-shift.c  -  MPI helper functions
- *     Copyright (c) 1997 by Werner Koch (dd9jn)
- *     Copyright (C) 1994, 1996 Free Software Foundation, Inc.
+/* mpihelp-lshift.c  - MPI helper functions
+ *     Copyright (C) 1994, 1996, 1998 Free Software Foundation, Inc.
  *
  * This file is part of G10.
  *
@@ -68,36 +67,3 @@ mpihelp_lshift( mpi_ptr_t wp, mpi_ptr_t up, mpi_size_t usize,
 }
 
 
-/* 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.
- */
-
-mpi_limb_t
-mpihelp_rshift( mpi_ptr_t wp, mpi_ptr_t up, mpi_size_t usize, unsigned cnt)
-{
-    mpi_limb_t high_limb, low_limb;
-    unsigned sh_1, sh_2;
-    mpi_size_t i;
-    mpi_limb_t retval;
-
-    sh_1 = cnt;
-    wp -= 1;
-    sh_2 = BITS_PER_MPI_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/mpi/generic/mpih-rshift.c b/mpi/generic/mpih-rshift.c
new file mode 100644 (file)
index 0000000..d8ca35f
--- /dev/null
@@ -0,0 +1,67 @@
+/* mpih-rshift.c  -  MPI helper functions
+ *     Copyright (C) 1994, 1996, 1998 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
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "mpi-internal.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.
+ */
+
+mpi_limb_t
+mpihelp_rshift( mpi_ptr_t wp, mpi_ptr_t up, mpi_size_t usize, unsigned cnt)
+{
+    mpi_limb_t high_limb, low_limb;
+    unsigned sh_1, sh_2;
+    mpi_size_t i;
+    mpi_limb_t retval;
+
+    sh_1 = cnt;
+    wp -= 1;
+    sh_2 = BITS_PER_MPI_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/mpi/generic/udiv-w-sdiv.c b/mpi/generic/udiv-w-sdiv.c
new file mode 100644 (file)
index 0000000..7ffec09
--- /dev/null
@@ -0,0 +1,135 @@
+/* mpihelp_udiv_w_sdiv -- implement udiv_qrnnd on machines with only signed
+ *                       division.
+ *
+ * Contributed by Peter L. Montgomery.
+ *
+ * Copyright (C) 1992, 1994, 1996, 1998 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 <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "mpi-internal.h"
+#include "longlong.h"
+
+
+#if 0  /* not yet ported to MPI */
+
+mpi_limb_t
+mpihelp_udiv_w_sdiv( mpi_limp_t *rp,
+                    mpi_limp_t *a1,
+                    mpi_limp_t *a0,
+                    mpi_limp_t *d   )
+{
+  mp_limb_t q, r;
+  mp_limb_t c0, c1, b1;
+
+  if ((mpi_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;
+}
+
+#endif
+
diff --git a/mpi/power/distfiles b/mpi/power/distfiles
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/mpi/powerpc32/distfiles b/mpi/powerpc32/distfiles
new file mode 100644 (file)
index 0000000..2a6f0e5
--- /dev/null
@@ -0,0 +1,8 @@
+mpih-add1.S
+mpih-sub1.S
+mpih-mul1.S
+mpih-mul2.S
+mpih-mul3.S
+mpih-lshift.S
+mpih-rshift.S
+
diff --git a/mpi/powerpc32/mpih-add1.S b/mpi/powerpc32/mpih-add1.S
new file mode 100644 (file)
index 0000000..b4c00df
--- /dev/null
@@ -0,0 +1,60 @@
+/* PowerPC-32 add_n -- Add two limb vectors of equal, non-zero length.
+ *
+ * Copyright (C) 1992, 1994, 1995, 1998 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
+ */
+
+
+
+/*******************
+ *  mpi_limb_t
+ *  mpihelp_add_n( mpi_ptr_t res_ptr,  (r3)
+ *                mpi_ptr_t s1_ptr,    (r4)
+ *                mpi_ptr_t s2_ptr,    (r5)
+ *                mpi_size_t 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:
+       mtctr   6               # copy size into CTR
+       lwz     8,0(4)          # load least significant s1 limb
+       lwz     0,0(5)          # load least significant s2 limb
+       addi    3,3,-4          # offset res_ptr, it's updated before used
+       addc    7,0,8           # add least significant limbs, set cy
+       bdz     Lend            # If done, skip loop
+Loop:  lwzu    8,4(4)          # load s1 limb and update s1_ptr
+       lwzu    0,4(5)          # load s2 limb and update s2_ptr
+       stwu    7,4(3)          # store previous limb in load latency slot
+       adde    7,0,8           # add new limbs with cy, set cy
+       bdnz    Loop            # decrement CTR and loop back
+Lend:  stw     7,4(3)          # store ultimate result limb
+       li      3,0             # load cy into ...
+       addze   3,3             # ... return value register
+       blr
+
+
diff --git a/mpi/powerpc32/mpih-lshift.S b/mpi/powerpc32/mpih-lshift.S
new file mode 100644 (file)
index 0000000..eb5bd50
--- /dev/null
@@ -0,0 +1,71 @@
+/* PowerPC-32 lshift
+ *
+ *     Copyright (C) 1995, 1998 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
+ */
+
+
+/*******************
+ * mpi_limb_t
+ * mpihelp_lshift( mpi_ptr_t wp,       (r3)
+ *                mpi_ptr_t up,        (r4)
+ *                mpi_size_t usize,    (r5)
+ *                unsigned cnt)        (r6)
+ */
+
+       .toc
+.csect .text[PR]
+       .align  2
+       .globl  mpihelp_lshift
+       .globl  .mpihelp_lshift
+       .csect  mpihelp_lshift[DS]
+mpihelp_lshift:
+       .long   .mpihelp_lshift,  TOC[tc0],       0
+       .csect  .text[PR]
+.mpihelp_lshift:
+       mtctr   5               # copy size into CTR
+       slwi    0,5,2
+       add     7,3,0           # make r7 point at end of res
+       add     4,4,0           # make r4 point at end of s1
+       subfic  8,6,32
+       lwzu    11,-4(4)        # load first s1 limb
+       srw     3,11,8          # compute function return value
+       bdz     Lend1
+
+Loop:  lwzu    10,-4(4)
+       slw     9,11,6
+       srw     12,10,8
+       or      9,9,12
+       stwu    9,-4(7)
+       bdz     Lend2
+       lwzu    11,-4(4)
+       slw     9,10,6
+       srw     12,11,8
+       or      9,9,12
+       stwu    9,-4(7)
+       bdnz    Loop
+
+Lend1: slw     0,11,6
+       stw     0,-4(7)
+       blr
+
+Lend2: slw     0,10,6
+       stw     0,-4(7)
+       blr
+
+
diff --git a/mpi/powerpc32/mpih-mul1.S b/mpi/powerpc32/mpih-mul1.S
new file mode 100644 (file)
index 0000000..854624d
--- /dev/null
@@ -0,0 +1,67 @@
+/* PowerPC-32 mul_1 -- Multiply a limb vector with a limb and store
+ *                    the result in a second limb vector.
+ *
+ * Copyright (C) 1993, 1994, 1995, 1998 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
+ */
+
+
+/*******************
+ * mpi_limb_t
+ * mpihelp_mul_1( mpi_ptr_t res_ptr,   (r3)
+ *               mpi_ptr_t s1_ptr,     (r4)
+ *               mpi_size_t s1_size,   (r5)
+ *               mpi_limb_t s2_limb)   (r6)
+ *
+ * This is a fairly straightforward implementation.  The timing of the PC601
+ * is hard to understand, so I will wait to optimize this until I have some
+ * hardware to play with.
+ *
+ * The code trivially generalizes to 64 bit limbs for the PC620.
+ */
+
+       .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:
+       mtctr   5
+
+       lwz     0,0(4)
+       mullw   7,0,6
+       mulhwu  10,0,6
+       addi    3,3,-4          # adjust res_ptr
+       addic   5,5,0           # clear cy with dummy insn
+       bdz     Lend
+
+Loop:  lwzu    0,4(4)
+       stwu    7,4(3)
+       mullw   8,0,6
+       adde    7,8,10
+       mulhwu  10,0,6
+       bdnz    Loop
+
+Lend:  stw     7,4(3)
+       addze   3,10
+       blr
+
diff --git a/mpi/powerpc32/mpih-mul2.S b/mpi/powerpc32/mpih-mul2.S
new file mode 100644 (file)
index 0000000..0b6486e
--- /dev/null
@@ -0,0 +1,73 @@
+/* PowerPC-32 addmul_1 -- Multiply a limb vector with a limb and add
+ *                       the result to a second limb vector.
+
+ * Copyright (C) 1995, 1998 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
+ */
+
+
+/*******************
+ * mpi_limb_t
+ * mpihelp_addmul_1( mpi_ptr_t res_ptr,      (r3)
+ *                  mpi_ptr_t s1_ptr,       (r4)
+ *                  mpi_size_t s1_size,     (r5)
+ *                  mpi_limb_t s2_limb)     (r6)
+ *
+ * This is a fairly straightforward implementation.  The timing of the PC601
+ * is hard to understand, so I will wait to optimize this until I have some
+ * hardware to play with.
+ *
+ * The code trivially generalizes to 64 bit limbs for the PC620.
+ */
+
+
+       .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:
+       mtctr   5
+
+       lwz     0,0(4)
+       mullw   7,0,6
+       mulhwu  10,0,6
+       lwz     9,0(3)
+       addc    8,7,9
+       addi    3,3,-4
+       bdz     Lend
+
+Loop:  lwzu    0,4(4)
+       stwu    8,4(3)
+       mullw   8,0,6
+       adde    7,8,10
+       mulhwu  10,0,6
+       lwz     9,4(3)
+       addze   10,10
+       addc    8,7,9
+       bdnz    Loop
+
+Lend:  stw     8,4(3)
+       addze   3,10
+       blr
+
+
diff --git a/mpi/powerpc32/mpih-mul3.S b/mpi/powerpc32/mpih-mul3.S
new file mode 100644 (file)
index 0000000..46e85f6
--- /dev/null
@@ -0,0 +1,74 @@
+/* PowerPC-32 submul_1 -- Multiply a limb vector with a limb and subtract
+ *                       the result from a second limb vector.
+ *
+ * Copyright (C) 1995, 1998 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
+ */
+
+
+/*******************
+ * mpi_limb_t
+ * mpihelp_submul_1( mpi_ptr_t res_ptr,      (r3)
+ *                  mpi_ptr_t s1_ptr,       (r4)
+ *                  mpi_size_t s1_size,     (r5)
+ *                  mpi_limb_t s2_limb)     (r6)
+ *
+ * This is a fairly straightforward implementation.  The timing of the PC601
+ * is hard to understand, so I will wait to optimize this until I have some
+ * hardware to play with.
+ *
+ * The code trivially generalizes to 64 bit limbs for the PC620.
+ */
+
+       .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:
+       mtctr   5
+
+       lwz     0,0(4)
+       mullw   7,0,6
+       mulhwu  10,0,6
+       lwz     9,0(3)
+       subfc   8,7,9
+       addc    7,7,8           # invert cy (r7 is junk)
+       addi    3,3,-4
+       bdz     Lend
+
+Loop:  lwzu    0,4(4)
+       stwu    8,4(3)
+       mullw   8,0,6
+       adde    7,8,10
+       mulhwu  10,0,6
+       lwz     9,4(3)
+       addze   10,10
+       subfc   8,7,9
+       addc    7,7,8           # invert cy (r7 is junk)
+       bdnz    Loop
+
+Lend:  stw     8,4(3)
+       addze   3,10
+       blr
+
+
diff --git a/mpi/powerpc32/mpih-rshift.S b/mpi/powerpc32/mpih-rshift.S
new file mode 100644 (file)
index 0000000..9d70759
--- /dev/null
@@ -0,0 +1,68 @@
+/* PowerPC-32 rshift
+ *
+ *     Copyright (C) 1995, 1998 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
+ */
+
+
+/*******************
+ * mpi_limb_t
+ * mpihelp_rshift( mpi_ptr_t wp,       (r3)
+ *                mpi_ptr_t up,        (r4)
+ *                mpi_size_t usize,    (r5)
+ *                unsigned cnt)        (r6)
+ */
+
+       .toc
+.csect .text[PR]
+       .align  2
+       .globl  mpihelp_rshift
+       .globl  .mpihelp_rshift
+       .csect  mpihelp_rshift[DS]
+mpihelp_rshift:
+       .long   .mpihelp_rshift,  TOC[tc0],       0
+       .csect  .text[PR]
+.mpihelp_rshift:
+       mtctr   5               # copy size into CTR
+       addi    7,3,-4          # move adjusted res_ptr to free return reg
+       subfic  8,6,32
+       lwz     11,0(4)         # load first s1 limb
+       slw     3,11,8          # compute function return value
+       bdz     Lend1
+
+Loop:  lwzu    10,4(4)
+       srw     9,11,6
+       slw     12,10,8
+       or      9,9,12
+       stwu    9,4(7)
+       bdz     Lend2
+       lwzu    11,4(4)
+       srw     9,10,6
+       slw     12,11,8
+       or      9,9,12
+       stwu    9,4(7)
+       bdnz    Loop
+
+Lend1: srw     0,11,6
+       stw     0,4(7)
+       blr
+
+Lend2: srw     0,10,6
+       stw     0,4(7)
+       blr
+
diff --git a/mpi/powerpc32/mpih-sub1.S b/mpi/powerpc32/mpih-sub1.S
new file mode 100644 (file)
index 0000000..b2e0590
--- /dev/null
@@ -0,0 +1,60 @@
+/* PowerPC-32  sub_n -- Subtract two limb vectors of the same length > 0
+ *                     and store difference in a third limb vector.
+ *
+ * Copyright (C) 1992, 1994, 1995, 1998 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
+ */
+
+
+/*******************
+ *  mpi_limb_t
+ *  mpihelp_sub_n( mpi_ptr_t res_ptr,  (r3)
+ *                mpi_ptr_t s1_ptr,    (r4)
+ *                mpi_ptr_t s2_ptr,    (r5)
+ *                mpi_size_t 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:
+       mtctr   6               # copy size into CTR
+       lwz     8,0(4)          # load least significant s1 limb
+       lwz     0,0(5)          # load least significant s2 limb
+       addi    3,3,-4          # offset res_ptr, it's updated before used
+       subfc   7,0,8           # add least significant limbs, set cy
+       bdz     Lend            # If done, skip loop
+Loop:  lwzu    8,4(4)          # load s1 limb and update s1_ptr
+       lwzu    0,4(5)          # load s2 limb and update s2_ptr
+       stwu    7,4(3)          # store previous limb in load latency slot
+       subfe   7,0,8           # add new limbs with cy, set cy
+       bdnz    Loop            # decrement CTR and loop back
+Lend:  stw     7,4(3)          # store ultimate result limb
+       subfe   3,0,0           # load !cy into ...
+       subfic  3,3,0           # ... return value register
+       blr
+
+
diff --git a/mpi/powerpc64/distfiles b/mpi/powerpc64/distfiles
new file mode 100644 (file)
index 0000000..e69de29