Updated from /src/gmp-1.937
authorroland <roland>
Fri, 1 Mar 1996 18:43:25 +0000 (18:43 +0000)
committerroland <roland>
Fri, 1 Mar 1996 18:43:25 +0000 (18:43 +0000)
12 files changed:
sysdeps/alpha/addmul_1.s
sysdeps/alpha/lshift.s
sysdeps/alpha/mul_1.s
sysdeps/alpha/rshift.s
sysdeps/alpha/submul_1.s
sysdeps/alpha/udiv_qrnnd.S
sysdeps/generic/sub_n.c
sysdeps/generic/submul_1.c
sysdeps/m68k/add_n.S
sysdeps/m68k/lshift.S [new file with mode: 0644]
sysdeps/m68k/rshift.S [new file with mode: 0644]
sysdeps/m68k/sub_n.S

index 46d277d..8b168cb 100644 (file)
  # size                r18
  # s2_limb     r19
 
- # This code runs at 42 cycles/limb on the 21064.
-
- # To improve performance for long multiplications, we would use
- # 'fetch' for S1 and 'fetch_m' for RES.  It's not obvious how to use
- # these instructions without slowing down the general code: 1. We can
- # only have two prefetches in operation at any time in the Alpha
- # architecture.  2. There will seldom be any special alignment
- # between RES_PTR and S1_PTR.  Maybe we can simply divide the current
- # loop into an inner and outer loop, having the inner loop handle
- # exactly one prefetch block?
+ # This code runs at 42 cycles/limb on EV4 and 18 cycles/limb on EV5.
 
        .set    noreorder
        .set    noat
@@ -52,7 +43,7 @@ __mpn_addmul_1:
        mulq    $2,$19,$3       # $3 = prod_low
        ldq     $5,0($16)       # $5 = *res_ptr
        umulh   $2,$19,$0       # $0 = prod_high
-       beq     $18,Lend1       # jump if size was == 1
+       beq     $18,.Lend1      # jump if size was == 1
        ldq     $2,0($17)       # $2 = s1_limb
        addq    $17,8,$17       # s1_ptr++
        subq    $18,1,$18       # size--
@@ -60,10 +51,10 @@ __mpn_addmul_1:
        cmpult  $3,$5,$4
        stq     $3,0($16)
        addq    $16,8,$16       # res_ptr++
-       beq     $18,Lend2       # jump if size was == 2
+       beq     $18,.Lend2      # jump if size was == 2
 
        .align  3
-Loop:  mulq    $2,$19,$3       # $3 = prod_low
+.Loop: mulq    $2,$19,$3       # $3 = prod_low
        ldq     $5,0($16)       # $5 = *res_ptr
        addq    $4,$0,$0        # cy_limb = cy_limb + 'cy'
        subq    $18,1,$18       # size--
@@ -77,9 +68,9 @@ Loop: mulq    $2,$19,$3       # $3 = prod_low
        stq     $3,0($16)
        addq    $16,8,$16       # res_ptr++
        addq    $5,$0,$0        # combine carries
-       bne     $18,Loop
+       bne     $18,.Loop
 
-Lend2: mulq    $2,$19,$3       # $3 = prod_low
+.Lend2:        mulq    $2,$19,$3       # $3 = prod_low
        ldq     $5,0($16)       # $5 = *res_ptr
        addq    $4,$0,$0        # cy_limb = cy_limb + 'cy'
        umulh   $2,$19,$4       # $4 = cy_limb
@@ -91,7 +82,7 @@ Lend2:        mulq    $2,$19,$3       # $3 = prod_low
        addq    $5,$0,$0        # combine carries
        addq    $4,$0,$0        # cy_limb = prod_high + cy
        ret     $31,($26),1
-Lend1: addq    $5,$3,$3
+.Lend1:        addq    $5,$3,$3
        cmpult  $3,$5,$5
        stq     $3,0($16)
        addq    $0,$5,$0
index c284349..aa8417b 100644 (file)
@@ -53,11 +53,11 @@ __mpn_lshift:
        and     $18,4-1,$20     # number of limbs in first loop
        srl     $4,$7,$0        # compute function result
 
-       beq     $20,L0
+       beq     $20,.L0
        subq    $18,$20,$18
 
        .align  3
-Loop0:
+.Loop0:
        ldq     $3,-8($17)
        subq    $16,8,$16
        subq    $17,8,$17
@@ -67,12 +67,12 @@ Loop0:
        bis     $3,$3,$4
        bis     $5,$6,$8
        stq     $8,0($16)
-       bne     $20,Loop0
+       bne     $20,.Loop0
 
-L0:    beq     $18,Lend
+.L0:   beq     $18,.Lend
 
        .align  3
-Loop:  ldq     $3,-8($17)
+.Loop: ldq     $3,-8($17)
        subq    $16,32,$16
        subq    $18,4,$18
        sll     $4,$19,$5
@@ -100,9 +100,9 @@ Loop:       ldq     $3,-8($17)
        bis     $1,$2,$8
        stq     $8,0($16)
 
-       bgt     $18,Loop
+       bgt     $18,.Loop
 
-Lend:  sll     $4,$19,$8
+.Lend: sll     $4,$19,$8
        stq     $8,-8($16)
        ret     $31,($26),1
        .end    __mpn_lshift
index 3ef194d..58a63df 100644 (file)
@@ -1,7 +1,7 @@
  # Alpha 21064 __mpn_mul_1 -- Multiply a limb vector with a limb and store
  # the result in a second limb vector.
 
- # Copyright (C) 1992, 1994 Free Software Foundation, Inc.
+ # Copyright (C) 1992, 1994, 1995 Free Software Foundation, Inc.
 
  # This file is part of the GNU MP Library.
 
index 74eab04..037b776 100644 (file)
@@ -34,7 +34,7 @@
  # 1. ldq has a 3 cycle delay, srl and sll have a 2 cycle delay.
  # 2. Only aligned instruction pairs can be paired.
  # 3. The store buffer or silo might not be able to deal with the bandwidth.
-      
+
        .set    noreorder
        .set    noat
 .text
@@ -51,11 +51,11 @@ __mpn_rshift:
        and     $18,4-1,$20     # number of limbs in first loop
        sll     $4,$7,$0        # compute function result
 
-       beq     $20,L0
+       beq     $20,.L0
        subq    $18,$20,$18
 
        .align  3
-Loop0:
+.Loop0:
        ldq     $3,0($17)
        addq    $16,8,$16
        addq    $17,8,$17
@@ -65,12 +65,12 @@ Loop0:
        bis     $3,$3,$4
        bis     $5,$6,$8
        stq     $8,-8($16)
-       bne     $20,Loop0
+       bne     $20,.Loop0
 
-L0:    beq     $18,Lend
+.L0:   beq     $18,.Lend
 
        .align  3
-Loop:  ldq     $3,0($17)
+.Loop: ldq     $3,0($17)
        addq    $16,32,$16
        subq    $18,4,$18
        srl     $4,$19,$5
@@ -98,9 +98,9 @@ Loop: ldq     $3,0($17)
        bis     $1,$2,$8
        stq     $8,-8($16)
 
-       bgt     $18,Loop
+       bgt     $18,.Loop
 
-Lend:  srl     $4,$19,$8
+.Lend: srl     $4,$19,$8
        stq     $8,0($16)
        ret     $31,($26),1
        .end    __mpn_rshift
index acaa11c..292b2c1 100644 (file)
  # size                r18
  # s2_limb     r19
 
- # This code runs at 42 cycles/limb on the 21064.
-
- # To improve performance for long multiplications, we would use
- # 'fetch' for S1 and 'fetch_m' for RES.  It's not obvious how to use
- # these instructions without slowing down the general code: 1. We can
- # only have two prefetches in operation at any time in the Alpha
- # architecture.  2. There will seldom be any special alignment
- # between RES_PTR and S1_PTR.  Maybe we can simply divide the current
- # loop into an inner and outer loop, having the inner loop handle
- # exactly one prefetch block?
+ # This code runs at 42 cycles/limb on EV4 and 18 cycles/limb on EV5.
 
        .set    noreorder
        .set    noat
@@ -52,7 +43,7 @@ __mpn_submul_1:
        mulq    $2,$19,$3       # $3 = prod_low
        ldq     $5,0($16)       # $5 = *res_ptr
        umulh   $2,$19,$0       # $0 = prod_high
-       beq     $18,Lend1       # jump if size was == 1
+       beq     $18,.Lend1      # jump if size was == 1
        ldq     $2,0($17)       # $2 = s1_limb
        addq    $17,8,$17       # s1_ptr++
        subq    $18,1,$18       # size--
@@ -60,10 +51,10 @@ __mpn_submul_1:
        cmpult  $5,$3,$4
        stq     $3,0($16)
        addq    $16,8,$16       # res_ptr++
-       beq     $18,Lend2       # jump if size was == 2
+       beq     $18,.Lend2      # jump if size was == 2
 
        .align  3
-Loop:  mulq    $2,$19,$3       # $3 = prod_low
+.Loop: mulq    $2,$19,$3       # $3 = prod_low
        ldq     $5,0($16)       # $5 = *res_ptr
        addq    $4,$0,$0        # cy_limb = cy_limb + 'cy'
        subq    $18,1,$18       # size--
@@ -77,9 +68,9 @@ Loop: mulq    $2,$19,$3       # $3 = prod_low
        stq     $3,0($16)
        addq    $16,8,$16       # res_ptr++
        addq    $5,$0,$0        # combine carries
-       bne     $18,Loop
+       bne     $18,.Loop
 
-Lend2: mulq    $2,$19,$3       # $3 = prod_low
+.Lend2:        mulq    $2,$19,$3       # $3 = prod_low
        ldq     $5,0($16)       # $5 = *res_ptr
        addq    $4,$0,$0        # cy_limb = cy_limb + 'cy'
        umulh   $2,$19,$4       # $4 = cy_limb
@@ -91,7 +82,7 @@ Lend2:        mulq    $2,$19,$3       # $3 = prod_low
        addq    $5,$0,$0        # combine carries
        addq    $4,$0,$0        # cy_limb = prod_high + cy
        ret     $31,($26),1
-Lend1: subq    $5,$3,$3
+.Lend1:        subq    $5,$3,$3
        cmpult  $5,$3,$5
        stq     $3,0($16)
        addq    $0,$5,$0
index bafafd6..ce590ed 100644 (file)
@@ -1,6 +1,6 @@
  # Alpha 21064 __udiv_qrnnd
 
- # Copyright (C) 1992, 1994 Free Software Foundation, Inc.
+ # Copyright (C) 1992, 1994, 1995 Free Software Foundation, Inc.
 
  # This file is part of the GNU MP Library.
 
 
         .set noreorder
         .set noat
-
 .text
-        .align 3
-        .globl __udiv_qrnnd
-        .ent __udiv_qrnnd 0
+        .align 3
+        .globl __udiv_qrnnd
+        .ent   __udiv_qrnnd
 __udiv_qrnnd:
-__udiv_qrnnd..ng:
         .frame $30,0,$26,0
         .prologue 0
 #define cnt    $2
@@ -39,9 +37,9 @@ __udiv_qrnnd..ng:
 #define qb     $20
 
        ldiq    cnt,16
-       blt     d,Largedivisor
+       blt     d,.Largedivisor
 
-Loop1: cmplt   n0,0,tmp
+.Loop1:        cmplt   n0,0,tmp
        addq    n1,n1,n1
        bis     n1,tmp,n1
        addq    n0,n0,n0
@@ -74,12 +72,12 @@ Loop1:      cmplt   n0,0,tmp
        cmovne  qb,tmp,n1
        bis     n0,qb,n0
        subq    cnt,1,cnt
-       bgt     cnt,Loop1
+       bgt     cnt,.Loop1
        stq     n1,0(rem_ptr)
        bis     $31,n0,$0
        ret     $31,($26),1
 
-Largedivisor:
+.Largedivisor:
        and     n0,1,$4
 
        srl     n0,1,n0
@@ -91,7 +89,7 @@ Largedivisor:
        srl     d,1,$5
        addq    $5,$6,$5
 
-Loop2: cmplt   n0,0,tmp
+.Loop2:        cmplt   n0,0,tmp
        addq    n1,n1,n1
        bis     n1,tmp,n1
        addq    n0,n0,n0
@@ -124,27 +122,27 @@ Loop2:    cmplt   n0,0,tmp
        cmovne  qb,tmp,n1
        bis     n0,qb,n0
        subq    cnt,1,cnt
-       bgt     cnt,Loop2
+       bgt     cnt,.Loop2
 
        addq    n1,n1,n1
        addq    $4,n1,n1
-       bne     $6,Odd
+       bne     $6,.LOdd
        stq     n1,0(rem_ptr)
        bis     $31,n0,$0
        ret     $31,($26),1
 
-Odd:
+.LOdd:
        /* q' in n0. r' in n1 */
        addq    n1,n0,n1
        cmpult  n1,n0,tmp       # tmp := carry from addq
-       beq     tmp,LLp6
+       beq     tmp,.LLp6
        addq    n0,1,n0
        subq    n1,d,n1
-LLp6:  cmpult  n1,d,tmp
-       bne     tmp,LLp7
+.LLp6: cmpult  n1,d,tmp
+       bne     tmp,.LLp7
        addq    n0,1,n0
        subq    n1,d,n1
-LLp7:
+.LLp7:
        stq     n1,0(rem_ptr)
        bis     $31,n0,$0
        ret     $31,($26),1
index 6b33e66..f3c83d1 100644 (file)
@@ -1,6 +1,6 @@
-/* __mpn_sub_n -- Subtract two limb vectors of equal, non-zero length.
+/* mpn_sub_n -- Subtract two limb vectors of equal, non-zero length.
 
-Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc.
+Copyright (C) 1992, 1993, 1994, 1996 Free Software Foundation, Inc.
 
 This file is part of the GNU MP Library.
 
@@ -23,9 +23,9 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
 
 mp_limb
 #if __STDC__
-__mpn_sub_n (mp_ptr res_ptr, mp_srcptr s1_ptr, mp_srcptr s2_ptr, mp_size_t size)
+mpn_sub_n (mp_ptr res_ptr, mp_srcptr s1_ptr, mp_srcptr s2_ptr, mp_size_t size)
 #else
-__mpn_sub_n (res_ptr, s1_ptr, s2_ptr, size)
+mpn_sub_n (res_ptr, s1_ptr, s2_ptr, size)
      register mp_ptr res_ptr;
      register mp_srcptr s1_ptr;
      register mp_srcptr s2_ptr;
index 855dd3f..57122a5 100644 (file)
@@ -1,9 +1,9 @@
-/* __mpn_submul_1 -- multiply the S1_SIZE long limb vector pointed to by S1_PTR
+/* mpn_submul_1 -- multiply the S1_SIZE long limb vector pointed to by S1_PTR
    by S2_LIMB, subtract the S1_SIZE least significant limbs of the product
    from the limb vector pointed to by RES_PTR.  Return the most significant
    limb of the product, adjusted for carry-out from the subtraction.
 
-Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc.
+Copyright (C) 1992, 1993, 1994, 1996 Free Software Foundation, Inc.
 
 This file is part of the GNU MP Library.
 
@@ -26,7 +26,7 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
 #include "longlong.h"
 
 mp_limb
-__mpn_submul_1 (res_ptr, s1_ptr, s1_size, s2_limb)
+mpn_submul_1 (res_ptr, s1_ptr, s1_size, s2_limb)
      register mp_ptr res_ptr;
      register mp_srcptr s1_ptr;
      mp_size_t s1_size;
index ea7a445..754af9f 100644 (file)
@@ -1,7 +1,7 @@
 /* mc68020 __mpn_add_n -- Add two limb vectors of the same length > 0 and store
    sum in a third limb vector.
 
-Copyright (C) 1992, 1994 Free Software Foundation, Inc.
+Copyright (C) 1992, 1994, 1996 Free Software Foundation, Inc.
 
 This file is part of the GNU MP Library.
 
@@ -27,50 +27,53 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
   size         (sp + 12)
 */
 
+#include "sysdep.h"
 #include "asm-syntax.h"
 
        TEXT
        ALIGN
-       GLOBL   ___mpn_add_n
+       GLOBL   C_SYMBOL_NAME(__mpn_add_n)
 
-LAB(___mpn_add_n)
+C_SYMBOL_NAME(__mpn_add_n:)
+PROLOG(__mpn_add_n)
 /* Save used registers on the stack.  */
-       INSN2(move,l    ,MEM_PREDEC(sp),d2)
-       INSN2(move,l    ,MEM_PREDEC(sp),a2)
+       movel   R(d2),MEM_PREDEC(sp)
+       movel   R(a2),MEM_PREDEC(sp)
 
 /* Copy the arguments to registers.  Better use movem?  */
-       INSN2(move,l    ,a2,MEM_DISP(sp,12))
-       INSN2(move,l    ,a0,MEM_DISP(sp,16))
-       INSN2(move,l    ,a1,MEM_DISP(sp,20))
-       INSN2(move,l    ,d2,MEM_DISP(sp,24))
-
-       INSN2(eor,w     ,d2,#1)
-       INSN2(lsr,l     ,d2,#1)
-       bcc L1
-       INSN2(subq,l    ,d2,#1)         /* clears cy as side effect */
-
-LAB(Loop)
-       INSN2(move,l    ,d0,MEM_POSTINC(a0))
-       INSN2(move,l    ,d1,MEM_POSTINC(a1))
-       INSN2(addx,l    ,d0,d1)
-       INSN2(move,l    ,MEM_POSTINC(a2),d0)
-LAB(L1)        INSN2(move,l    ,d0,MEM_POSTINC(a0))
-       INSN2(move,l    ,d1,MEM_POSTINC(a1))
-       INSN2(addx,l    ,d0,d1)
-       INSN2(move,l    ,MEM_POSTINC(a2),d0)
-
-       dbf d2,Loop                     /* loop until 16 lsb of %4 == -1 */
-       INSN2(subx,l    ,d0,d0)         /* d0 <= -cy; save cy as 0 or -1 in d0 */
-       INSN2(sub,l     ,d2,#0x10000)
-       bcs L2
-       INSN2(add,l     ,d0,d0)         /* restore cy */
-       bra Loop
-
-LAB(L2)
-       INSN1(neg,l     ,d0)
+       movel   MEM_DISP(sp,12),R(a2)
+       movel   MEM_DISP(sp,16),R(a0)
+       movel   MEM_DISP(sp,20),R(a1)
+       movel   MEM_DISP(sp,24),R(d2)
+
+       eorw    #1,R(d2)
+       lsrl    #1,R(d2)
+       bcc     L(L1)
+       subql   #1,R(d2)        /* clears cy as side effect */
+
+L(Loop:)
+       movel   MEM_POSTINC(a0),R(d0)
+       movel   MEM_POSTINC(a1),R(d1)
+       addxl   R(d1),R(d0)
+       movel   R(d0),MEM_POSTINC(a2)
+L(L1:) movel   MEM_POSTINC(a0),R(d0)
+       movel   MEM_POSTINC(a1),R(d1)
+       addxl   R(d1),R(d0)
+       movel   R(d0),MEM_POSTINC(a2)
+
+       dbf     R(d2),L(Loop)           /* loop until 16 lsb of %4 == -1 */
+       subxl   R(d0),R(d0)     /* d0 <= -cy; save cy as 0 or -1 in d0 */
+       subl    #0x10000,R(d2)
+       bcs     L(L2)
+       addl    R(d0),R(d0)     /* restore cy */
+       bra     L(Loop)
+
+L(L2:)
+       negl    R(d0)
 
 /* Restore used registers from stack frame.  */
-       INSN2(move,l    ,a2,MEM_POSTINC(sp))
-       INSN2(move,l    ,d2,MEM_POSTINC(sp))
+       movel   MEM_POSTINC(sp),R(a2)
+       movel   MEM_POSTINC(sp),R(d2)
 
        rts
+EPILOG(__mpn_add_n)
diff --git a/sysdeps/m68k/lshift.S b/sysdeps/m68k/lshift.S
new file mode 100644 (file)
index 0000000..c58594a
--- /dev/null
@@ -0,0 +1,150 @@
+/* mc68020 __mpn_lshift -- Shift left a low-level natural-number integer.
+
+Copyright (C) 1996 Free Software Foundation, Inc.
+
+This file is part of the GNU MP Library.
+
+The GNU MP Library is free software; you can redistribute it and/or modify
+it under the terms of the GNU Library General Public License as published by
+the Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The GNU MP Library is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
+License for more details.
+
+You should have received a copy of the GNU Library General Public License
+along with the GNU MP Library; see the file COPYING.LIB.  If not, write to
+the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+/*
+  INPUT PARAMETERS
+  res_ptr      (sp + 4)
+  s_ptr                (sp + 8)
+  s_size       (sp + 16)
+  cnt          (sp + 12)
+*/
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+#define res_ptr a1
+#define s_ptr a0
+#define s_size d6
+#define cnt d4
+
+       TEXT
+       ALIGN
+       GLOBL   C_SYMBOL_NAME(__mpn_lshift)
+
+C_SYMBOL_NAME(__mpn_lshift:)
+PROLOG(__mpn_lshift)
+
+/* Save used registers on the stack.  */
+       moveml  R(d2)-R(d6)/R(a2),MEM_PREDEC(sp)
+
+/* Copy the arguments to registers.  */
+       movel   MEM_DISP(sp,28),R(res_ptr)
+       movel   MEM_DISP(sp,32),R(s_ptr)
+       movel   MEM_DISP(sp,36),R(s_size)
+       movel   MEM_DISP(sp,40),R(cnt)
+
+       moveql  #1,R(d5)
+       cmpl    R(d5),R(cnt)
+       bne     L(Lnormal)
+       cmpl    R(s_ptr),R(res_ptr)
+       bls     L(Lspecial)             /* jump if s_ptr >= res_ptr */
+#if (defined (__mc68020__) || defined (__NeXT__) || defined(mc68020))
+       lea     MEM_INDX1(s_ptr,s_size,l,4),R(a2)
+#else /* not mc68020 */
+       movel   R(s_size),R(d0)
+       asll    #2,R(d0)
+       lea     MEM_INDX(s_ptr,d0,l),R(a2)
+#endif
+       cmpl    R(res_ptr),R(a2)
+       bls     L(Lspecial)             /* jump if res_ptr >= s_ptr + s_size */
+
+L(Lnormal:)
+       moveql  #32,R(d5)
+       subl    R(cnt),R(d5)
+
+#if (defined (__mc68020__) || defined (__NeXT__) || defined(mc68020))
+       lea     MEM_INDX1(s_ptr,s_size,l,4),R(s_ptr)
+       lea     MEM_INDX1(res_ptr,s_size,l,4),R(res_ptr)
+#else /* not mc68000 */
+       movel   R(s_size),R(d0)
+       asll    #2,R(d0)
+       addl    R(s_size),R(s_ptr)
+       addl    R(s_size),R(res_ptr)
+#endif
+       movel   MEM_PREDEC(s_ptr),R(d2)
+       movel   R(d2),R(d0)
+       lsrl    R(d5),R(d0)             /* compute carry limb */
+
+       lsll    R(cnt),R(d2)
+       movel   R(d2),R(d1)
+       subql   #1,R(s_size)
+       beq     L(Lend)
+       lsrl    #1,R(s_size)
+       bcs     L(L1)
+       subql   #1,R(s_size)
+
+L(Loop:)
+       movel   MEM_PREDEC(s_ptr),R(d2)
+       movel   R(d2),R(d3)
+       lsrl    R(d5),R(d3)
+       orl     R(d3),R(d1)
+       movel   R(d1),MEM_PREDEC(res_ptr)
+       lsll    R(cnt),R(d2)
+L(L1:)
+       movel   MEM_PREDEC(s_ptr),R(d1)
+       movel   R(d1),R(d3)
+       lsrl    R(d5),R(d3)
+       orl     R(d3),R(d2)
+       movel   R(d2),MEM_PREDEC(res_ptr)
+       lsll    R(cnt),R(d1)
+
+       dbf     R(s_size),L(Loop)
+       subl    #0x10000,R(s_size)
+       bcc     L(Loop)
+
+L(Lend:)
+       movel   R(d1),MEM_PREDEC(res_ptr) /* store least significant limb */
+
+/* Restore used registers from stack frame.  */
+       moveml  MEM_POSTINC(sp),R(d2)-R(d6)/R(a2)
+       rts
+
+/* We loop from least significant end of the arrays, which is only
+   permissable if the source and destination don't overlap, since the
+   function is documented to work for overlapping source and destination.  */
+
+L(Lspecial:)
+       clrl    R(d0)                   /* initialize carry */
+       eorw    #1,R(s_size)
+       lsrl    #1,R(s_size)
+       bcc     L(LL1)
+       subql   #1,R(s_size)
+
+L(LLoop:)
+       movel   MEM_POSTINC(s_ptr),R(d2)
+       addxl   R(d2),R(d2)
+       movel   R(d2),MEM_POSTINC(res_ptr)
+L(LL1:)
+       movel   MEM_POSTINC(s_ptr),R(d2)
+       addxl   R(d2),R(d2)
+       movel   R(d2),MEM_POSTINC(res_ptr)
+
+       dbf     R(s_size),L(LLoop)
+       addxl   R(d0),R(d0)             /* save cy in lsb */
+       subl    #0x10000,R(s_size)
+       bcs     L(LLend)
+       lsrl    #1,R(d0)                /* restore cy */
+       bra     L(LLoop)
+
+L(LLend:)
+/* Restore used registers from stack frame.  */
+       moveml  MEM_POSTINC(sp),R(d2)-R(d6)/R(a2)
+       rts
+EPILOG(__mpn_lshift)
diff --git a/sysdeps/m68k/rshift.S b/sysdeps/m68k/rshift.S
new file mode 100644 (file)
index 0000000..494dfcb
--- /dev/null
@@ -0,0 +1,149 @@
+/* mc68020 __mpn_rshift -- Shift right a low-level natural-number integer.
+
+Copyright (C) 1996 Free Software Foundation, Inc.
+
+This file is part of the GNU MP Library.
+
+The GNU MP Library is free software; you can redistribute it and/or modify
+it under the terms of the GNU Library General Public License as published by
+the Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The GNU MP Library is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
+License for more details.
+
+You should have received a copy of the GNU Library General Public License
+along with the GNU MP Library; see the file COPYING.LIB.  If not, write to
+the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+/*
+  INPUT PARAMETERS
+  res_ptr      (sp + 4)
+  s_ptr                (sp + 8)
+  s_size       (sp + 16)
+  cnt          (sp + 12)
+*/
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+#define res_ptr a1
+#define s_ptr a0
+#define s_size d6
+#define cnt d4
+
+       TEXT
+       ALIGN
+       GLOBL   C_SYMBOL_NAME(__mpn_rshift)
+
+C_SYMBOL_NAME(__mpn_rshift:)
+PROLOG(__mpn_rshift)
+/* Save used registers on the stack.  */
+       moveml  R(d2)-R(d6)/R(a2),MEM_PREDEC(sp)
+
+/* Copy the arguments to registers.  */
+       movel   MEM_DISP(sp,28),R(res_ptr)
+       movel   MEM_DISP(sp,32),R(s_ptr)
+       movel   MEM_DISP(sp,36),R(s_size)
+       movel   MEM_DISP(sp,40),R(cnt)
+
+       moveql  #1,R(d5)
+       cmpl    R(d5),R(cnt)
+       bne     L(Lnormal)
+       cmpl    R(res_ptr),R(s_ptr)
+       bls     L(Lspecial)             /* jump if res_ptr >= s_ptr */
+#if (defined (__mc68020__) || defined (__NeXT__) || defined(mc68020))
+       lea     MEM_INDX1(res_ptr,s_size,l,4),R(a2)
+#else /* not mc68020 */
+       movel   R(s_size),R(d0)
+       asll    #2,R(d0)
+       lea     MEM_INDX(res_ptr,d0,l),R(a2)
+#endif
+       cmpl    R(s_ptr),R(a2)
+       bls     L(Lspecial)             /* jump if s_ptr >= res_ptr + s_size */
+
+L(Lnormal:)
+       moveql  #32,R(d5)
+       subl    R(cnt),R(d5)
+       movel   MEM_POSTINC(s_ptr),R(d2)
+       movel   R(d2),R(d0)
+       lsll    R(d5),R(d0)             /* compute carry limb */
+   
+       lsrl    R(cnt),R(d2)
+       movel   R(d2),R(d1)
+       subql   #1,R(s_size)
+       beq     L(Lend)
+       lsrl    #1,R(s_size)
+       bcs     L(L1)
+       subql   #1,R(s_size)
+
+L(Loop:)
+       movel   MEM_POSTINC(s_ptr),R(d2)
+       movel   R(d2),R(d3)
+       lsll    R(d5),R(d3)
+       orl     R(d3),R(d1)
+       movel   R(d1),MEM_POSTINC(res_ptr)
+       lsrl    R(cnt),R(d2)
+L(L1:)
+       movel   MEM_POSTINC(s_ptr),R(d1)
+       movel   R(d1),R(d3)
+       lsll    R(d5),R(d3)
+       orl     R(d3),R(d2)
+       movel   R(d2),MEM_POSTINC(res_ptr)
+       lsrl    R(cnt),R(d1)
+
+       dbf     R(s_size),L(Loop)
+       subl    #0x10000,R(s_size)
+       bcc     L(Loop)
+
+L(Lend:)
+       movel   R(d1),MEM(res_ptr) /* store most significant limb */
+
+/* Restore used registers from stack frame.  */
+       moveml  MEM_POSTINC(sp),R(d2)-R(d6)/R(a2)
+       rts
+
+/* We loop from most significant end of the arrays, which is only
+   permissable if the source and destination don't overlap, since the
+   function is documented to work for overlapping source and destination.  */
+
+L(Lspecial:)
+#if (defined (__mc68020__) || defined (__NeXT__) || defined(mc68020))
+       lea     MEM_INDX1(s_ptr,s_size,l,4),R(s_ptr)
+       lea     MEM_INDX1(res_ptr,s_size,l,4),R(res_ptr)
+#else /* not mc68000 */
+       movel   R(s_size),R(d0)
+       asll    #2,R(d0)
+       addl    R(s_size),R(s_ptr)
+       addl    R(s_size),R(res_ptr)
+#endif
+
+       clrl    R(d0)                   /* initialize carry */
+       eorw    #1,R(s_size)
+       lsrl    #1,R(s_size)
+       bcc     L(LL1)
+       subql   #1,R(s_size)
+
+L(LLoop:)
+       movel   MEM_PREDEC(s_ptr),R(d2)
+       roxrl   #1,R(d2)
+       movel   R(d2),MEM_PREDEC(res_ptr)
+L(LL1:)
+       movel   MEM_PREDEC(s_ptr),R(d2)
+       roxrl   #1,R(d2)
+       movel   R(d2),MEM_PREDEC(res_ptr)
+
+       dbf     R(s_size),L(LLoop)
+       roxrl   #1,R(d0)                /* save cy in msb */
+       subl    #0x10000,R(s_size)
+       bcs     L(LLend)
+       addl    R(d0),R(d0)             /* restore cy */
+       bra     L(LLoop)
+
+L(LLend:)
+/* Restore used registers from stack frame.  */
+       moveml  MEM_POSTINC(sp),R(d2)-R(d6)/R(a2)
+       rts
+EPILOG(__mpn_rshift)
index 19f0ec1..39f5161 100644 (file)
@@ -1,7 +1,7 @@
 /* mc68020 __mpn_sub_n -- Subtract two limb vectors of the same length > 0 and
    store difference in a third limb vector.
 
-Copyright (C) 1992, 1994 Free Software Foundation, Inc.
+Copyright (C) 1992, 1994, 1996 Free Software Foundation, Inc.
 
 This file is part of the GNU MP Library.
 
@@ -27,50 +27,53 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
   size         (sp + 12)
 */
 
+#include "sysdep.h"
 #include "asm-syntax.h"
 
        TEXT
        ALIGN
-       GLOBL   ___mpn_sub_n
+       GLOBL   C_SYMBOL_NAME(__mpn_sub_n)
 
-LAB(___mpn_sub_n)
+C_SYMBOL_NAME(__mpn_sub_n:)
+PROLOG(__mpn_sub_n)
 /* Save used registers on the stack.  */
-       INSN2(move,l    ,MEM_PREDEC(sp),d2)
-       INSN2(move,l    ,MEM_PREDEC(sp),a2)
+       movel   R(d2),MEM_PREDEC(sp)
+       movel   R(a2),MEM_PREDEC(sp)
 
 /* Copy the arguments to registers.  Better use movem?  */
-       INSN2(move,l    ,a2,MEM_DISP(sp,12))
-       INSN2(move,l    ,a0,MEM_DISP(sp,16))
-       INSN2(move,l    ,a1,MEM_DISP(sp,20))
-       INSN2(move,l    ,d2,MEM_DISP(sp,24))
-
-       INSN2(eor,w     ,d2,#1)
-       INSN2(lsr,l     ,d2,#1)
-       bcc L1
-       INSN2(subq,l    ,d2,#1)         /* clears cy as side effect */
-
-LAB(Loop)
-       INSN2(move,l    ,d0,MEM_POSTINC(a0))
-       INSN2(move,l    ,d1,MEM_POSTINC(a1))
-       INSN2(subx,l    ,d0,d1)
-       INSN2(move,l    ,MEM_POSTINC(a2),d0)
-LAB(L1)        INSN2(move,l    ,d0,MEM_POSTINC(a0))
-       INSN2(move,l    ,d1,MEM_POSTINC(a1))
-       INSN2(subx,l    ,d0,d1)
-       INSN2(move,l    ,MEM_POSTINC(a2),d0)
-
-       dbf d2,Loop                     /* loop until 16 lsb of %4 == -1 */
-       INSN2(subx,l    ,d0,d0)         /* d0 <= -cy; save cy as 0 or -1 in d0 */
-       INSN2(sub,l     ,d2,#0x10000)
-       bcs L2
-       INSN2(add,l     ,d0,d0)         /* restore cy */
-       bra Loop
-
-LAB(L2)
-       INSN1(neg,l     ,d0)
+       movel   MEM_DISP(sp,12),R(a2)
+       movel   MEM_DISP(sp,16),R(a0)
+       movel   MEM_DISP(sp,20),R(a1)
+       movel   MEM_DISP(sp,24),R(d2)
+
+       eorw    #1,R(d2)
+       lsrl    #1,R(d2)
+       bcc     L(L1)
+       subql   #1,R(d2)        /* clears cy as side effect */
+
+L(Loop:)
+       movel   MEM_POSTINC(a0),R(d0)
+       movel   MEM_POSTINC(a1),R(d1)
+       subxl   R(d1),R(d0)
+       movel   R(d0),MEM_POSTINC(a2)
+L(L1:) movel   MEM_POSTINC(a0),R(d0)
+       movel   MEM_POSTINC(a1),R(d1)
+       subxl   R(d1),R(d0)
+       movel   R(d0),MEM_POSTINC(a2)
+
+       dbf     R(d2),L(Loop)           /* loop until 16 lsb of %4 == -1 */
+       subxl   R(d0),R(d0)     /* d0 <= -cy; save cy as 0 or -1 in d0 */
+       subl    #0x10000,R(d2)
+       bcs     L(L2)
+       addl    R(d0),R(d0)     /* restore cy */
+       bra     L(Loop)
+
+L(L2:)
+       negl    R(d0)
 
 /* Restore used registers from stack frame.  */
-       INSN2(move,l    ,a2,MEM_POSTINC(sp))
-       INSN2(move,l    ,d2,MEM_POSTINC(sp))
+       movel   MEM_POSTINC(sp),R(a2)
+       movel   MEM_POSTINC(sp),R(d2)
 
        rts
+EPILOG(__mpn_sub_n)