Updated from /src/gmp-1.937
authorroland <roland>
Fri, 1 Mar 1996 18:42:31 +0000 (18:42 +0000)
committerroland <roland>
Fri, 1 Mar 1996 18:42:31 +0000 (18:42 +0000)
25 files changed:
sysdeps/i386/gmp-mparam.h
sysdeps/i386/i586/add_n.S
sysdeps/i386/i586/addmul_1.S
sysdeps/i386/i586/mul_1.S
sysdeps/i386/i586/sub_n.S
sysdeps/i386/i586/submul_1.S
sysdeps/m68k/m68020/addmul_1.S
sysdeps/m68k/m68020/mul_1.S
sysdeps/m68k/m68020/submul_1.S
sysdeps/m88k/m88110/add_n.S [new file with mode: 0644]
sysdeps/m88k/m88110/addmul_1.s [new file with mode: 0644]
sysdeps/m88k/m88110/mul_1.s
sysdeps/m88k/m88110/sub_n.S [new file with mode: 0644]
sysdeps/sparc/add_n.S
sysdeps/sparc/lshift.S
sysdeps/sparc/rshift.S
sysdeps/sparc/sparc64/gmp-mparam.h [new file with mode: 0644]
sysdeps/sparc/sparc64/lshift.s [new file with mode: 0644]
sysdeps/sparc/sparc64/mul_1.s [new file with mode: 0644]
sysdeps/sparc/sparc64/rshift.s [new file with mode: 0644]
sysdeps/sparc/sparc64/sub_n.s [new file with mode: 0644]
sysdeps/sparc/sparc64/submul_1.s [new file with mode: 0644]
sysdeps/sparc/sparc8/addmul_1.S
sysdeps/sparc/sparc8/mul_1.S
sysdeps/sparc/sub_n.S

index 687f12a..ddc308a 100644 (file)
@@ -1,6 +1,6 @@
 /* gmp-mparam.h -- Compiler/machine parameter header file.
 
-Copyright (C) 1991, 1993, 1994 Free Software Foundation, Inc.
+Copyright (C) 1991, 1993, 1994, 1995 Free Software Foundation, Inc.
 
 This file is part of the GNU MP Library.
 
index f52f9c6..f214c8c 100644 (file)
@@ -1,7 +1,7 @@
 /* Pentium __mpn_add_n -- Add two limb vectors of the same length > 0 and store
    sum in a third limb vector.
 
-Copyright (C) 1992, 1994, 1995 Free Software Foundation, Inc.
+Copyright (C) 1992, 1994, 1995, 1996 Free Software Foundation, Inc.
 
 This file is part of the GNU MP Library.
 
@@ -30,13 +30,6 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
 #include "sysdep.h"
 #include "asm-syntax.h"
 
-#define t1     %eax
-#define t2     %edx
-#define src1   %esi
-#define src2   %ebp
-#define dst    %edi
-#define x      %ebx
-
 .text
        ALIGN (3)
        .globl C_SYMBOL_NAME(__mpn_add_n)
@@ -46,85 +39,85 @@ C_SYMBOL_NAME(__mpn_add_n:)
        pushl   %ebx
        pushl   %ebp
 
-       movl    20(%esp),dst            /* res_ptr */
-       movl    24(%esp),src1           /* s1_ptr */
-       movl    28(%esp),src2           /* s2_ptr */
+       movl    20(%esp),%edi           /* res_ptr */
+       movl    24(%esp),%esi           /* s1_ptr */
+       movl    28(%esp),%ebp           /* s2_ptr */
        movl    32(%esp),%ecx           /* size */
 
-       movl    (src2),x
+       movl    (%ebp),%ebx
 
        decl    %ecx
-       movl    %ecx,t2
+       movl    %ecx,%edx
        shrl    $3,%ecx
-       andl    $7,t2
+       andl    $7,%edx
        testl   %ecx,%ecx               /* zero carry flag */
        jz      Lend
-       pushl   t2
+       pushl   %edx
 
        ALIGN (3)
-Loop:  movl    28(dst),%eax            /* fetch destination cache line */
-       leal    32(dst),dst
-
-L1:    movl    (src1),t1
-       movl    4(src1),t2
-       adcl    x,t1
-       movl    4(src2),x
-       adcl    x,t2
-       movl    8(src2),x
-       movl    t1,-32(dst)
-       movl    t2,-28(dst)
-
-L2:    movl    8(src1),t1
-       movl    12(src1),t2
-       adcl    x,t1
-       movl    12(src2),x
-       adcl    x,t2
-       movl    16(src2),x
-       movl    t1,-24(dst)
-       movl    t2,-20(dst)
-
-L3:    movl    16(src1),t1
-       movl    20(src1),t2
-       adcl    x,t1
-       movl    20(src2),x
-       adcl    x,t2
-       movl    24(src2),x
-       movl    t1,-16(dst)
-       movl    t2,-12(dst)
-
-L4:    movl    24(src1),t1
-       movl    28(src1),t2
-       adcl    x,t1
-       movl    28(src2),x
-       adcl    x,t2
-       movl    32(src2),x
-       movl    t1,-8(dst)
-       movl    t2,-4(dst)
-
-       leal    32(src1),src1
-       leal    32(src2),src2
+Loop:  movl    28(%edi),%eax           /* fetch destination cache line */
+       leal    32(%edi),%edi
+
+L1:    movl    (%esi),%eax
+       movl    4(%esi),%edx
+       adcl    %ebx,%eax
+       movl    4(%ebp),%ebx
+       adcl    %ebx,%edx
+       movl    8(%ebp),%ebx
+       movl    %eax,-32(%edi)
+       movl    %edx,-28(%edi)
+
+L2:    movl    8(%esi),%eax
+       movl    12(%esi),%edx
+       adcl    %ebx,%eax
+       movl    12(%ebp),%ebx
+       adcl    %ebx,%edx
+       movl    16(%ebp),%ebx
+       movl    %eax,-24(%edi)
+       movl    %edx,-20(%edi)
+
+L3:    movl    16(%esi),%eax
+       movl    20(%esi),%edx
+       adcl    %ebx,%eax
+       movl    20(%ebp),%ebx
+       adcl    %ebx,%edx
+       movl    24(%ebp),%ebx
+       movl    %eax,-16(%edi)
+       movl    %edx,-12(%edi)
+
+L4:    movl    24(%esi),%eax
+       movl    28(%esi),%edx
+       adcl    %ebx,%eax
+       movl    28(%ebp),%ebx
+       adcl    %ebx,%edx
+       movl    32(%ebp),%ebx
+       movl    %eax,-8(%edi)
+       movl    %edx,-4(%edi)
+
+       leal    32(%esi),%esi
+       leal    32(%ebp),%ebp
        decl    %ecx
        jnz     Loop
 
-       popl    t2
+       popl    %edx
 Lend:
-       decl    t2                      /* test t2 w/o clobbering carry */
+       decl    %edx                    /* test %edx w/o clobbering carry */
        js      Lend2
-       incl    t2
+       incl    %edx
 Loop2:
-       leal    4(dst),dst
-       movl    (src1),t1
-       adcl    x,t1
-       movl    4(src2),x
-       movl    t1,-4(dst)
-       leal    4(src1),src1
-       leal    4(src2),src2
-       decl    t2
+       leal    4(%edi),%edi
+       movl    (%esi),%eax
+       adcl    %ebx,%eax
+       movl    4(%ebp),%ebx
+       movl    %eax,-4(%edi)
+       leal    4(%esi),%esi
+       leal    4(%ebp),%ebp
+       decl    %edx
        jnz     Loop2
 Lend2:
-       movl    (src1),t1
-       adcl    x,t1
-       movl    t1,(dst)
+       movl    (%esi),%eax
+       adcl    %ebx,%eax
+       movl    %eax,(%edi)
 
        sbbl    %eax,%eax
        negl    %eax
index b222840..5bf2603 100644 (file)
@@ -1,7 +1,7 @@
 /* Pentium __mpn_addmul_1 -- Multiply a limb vector with a limb and add
    the result to a second 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.
 
@@ -32,12 +32,12 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
 
 #define res_ptr edi
 #define s1_ptr esi
+#define size ecx
 #define s2_limb ebp
 
        TEXT
        ALIGN (3)
        GLOBL   C_SYMBOL_NAME(__mpn_addmul_1)
-       .type   C_SYMBOL_NAME(__mpn_addmul_1),@function
 C_SYMBOL_NAME(__mpn_addmul_1:)
 
        INSN1(push,l    ,R(edi))
@@ -47,38 +47,36 @@ C_SYMBOL_NAME(__mpn_addmul_1:)
 
        INSN2(mov,l     ,R(res_ptr),MEM_DISP(esp,20))
        INSN2(mov,l     ,R(s1_ptr),MEM_DISP(esp,24))
-       INSN2(mov,l     ,R(ecx),MEM_DISP(esp,28))
+       INSN2(mov,l     ,R(size),MEM_DISP(esp,28))
        INSN2(mov,l     ,R(s2_limb),MEM_DISP(esp,32))
 
-       INSN2(lea,l     ,R(res_ptr),MEM_INDEX(res_ptr,ecx,4))
-       INSN2(lea,l     ,R(s1_ptr),MEM_INDEX(s1_ptr,ecx,4))
-       INSN1(neg,l     ,R(ecx))
-       INSN2(xor,l     ,R(edx),R(edx))
+       INSN2(lea,l     ,R(res_ptr),MEM_INDEX(res_ptr,size,4))
+       INSN2(lea,l     ,R(s1_ptr),MEM_INDEX(s1_ptr,size,4))
+       INSN1(neg,l     ,R(size))
+       INSN2(xor,l     ,R(ebx),R(ebx))
        ALIGN (3)
-Loop:
-       INSN2(mov,l     ,R(ebx),R(edx))
-       INSN2(mov,l     ,R(eax),MEM_INDEX(s1_ptr,ecx,4))
+
+Loop:  INSN2(adc,l     ,R(ebx),$0)
+       INSN2(mov,l     ,R(eax),MEM_INDEX(s1_ptr,size,4))
 
        INSN1(mul,l     ,R(s2_limb))
 
        INSN2(add,l     ,R(eax),R(ebx))
-       INSN2(mov,l     ,R(ebx),MEM_INDEX(res_ptr,ecx,4))
+       INSN2(mov,l     ,R(ebx),MEM_INDEX(res_ptr,size,4))
 
        INSN2(adc,l     ,R(edx),$0)
        INSN2(add,l     ,R(ebx),R(eax))
 
-       INSN2(adc,l     ,R(edx),$0)
-       INSN2(mov,l     ,MEM_INDEX(res_ptr,ecx,4),R(ebx))
+       INSN2(mov,l     ,MEM_INDEX(res_ptr,size,4),R(ebx))
+       INSN1(inc,l     ,R(size))
 
-       INSN1(inc,l     ,R(ecx))
+       INSN2(mov,l     ,R(ebx),R(edx))
        INSN1(jnz,      ,Loop)
 
-
-       INSN2(mov,l     ,R(eax),R(edx))
+       INSN2(adc,l     ,R(ebx),$0)
+       INSN2(mov,l     ,R(eax),R(ebx))
        INSN1(pop,l     ,R(ebp))
        INSN1(pop,l     ,R(ebx))
        INSN1(pop,l     ,R(esi))
        INSN1(pop,l     ,R(edi))
        ret
-Lfe1:
-       .size   C_SYMBOL_NAME(__mpn_addmul_1),Lfe1-C_SYMBOL_NAME(__mpn_addmul_1)
index 2b7258e..048c060 100644 (file)
@@ -1,7 +1,7 @@
 /* Pentium __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, 1996 Free Software Foundation, Inc.
 
 This file is part of the GNU MP Library.
 
@@ -53,24 +53,24 @@ C_SYMBOL_NAME(__mpn_mul_1:)
        INSN2(lea,l     ,R(res_ptr),MEM_INDEX(res_ptr,size,4))
        INSN2(lea,l     ,R(s1_ptr),MEM_INDEX(s1_ptr,size,4))
        INSN1(neg,l     ,R(size))
-       INSN2(xor,l     ,R(edx),R(edx))
+       INSN2(xor,l     ,R(ebx),R(ebx))
        ALIGN (3)
-Loop:
-       INSN2(mov,l     ,R(ebx),R(edx))
+
+Loop:  INSN2(adc,l     ,R(ebx),$0)
        INSN2(mov,l     ,R(eax),MEM_INDEX(s1_ptr,size,4))
 
        INSN1(mul,l     ,R(s2_limb))
 
-       INSN2(add,l     ,R(eax),R(ebx))
-
-       INSN2(adc,l     ,R(edx),$0)
-       INSN2(mov,l     ,MEM_INDEX(res_ptr,size,4),R(eax))
+       INSN2(add,l     ,R(ebx),R(eax))
 
+       INSN2(mov,l     ,MEM_INDEX(res_ptr,size,4),R(ebx))
        INSN1(inc,l     ,R(size))
-       INSN1(jnz,      ,Loop)
 
+       INSN2(mov,l     ,R(ebx),R(edx))
+       INSN1(jnz,      ,Loop)
 
-       INSN2(mov,l     ,R(eax),R(edx))
+       INSN2(adc,l     ,R(ebx),$0)
+       INSN2(mov,l     ,R(eax),R(ebx))
        INSN1(pop,l     ,R(ebp))
        INSN1(pop,l     ,R(ebx))
        INSN1(pop,l     ,R(esi))
index 9c964a8..cd158a5 100644 (file)
@@ -1,7 +1,7 @@
 /* Pentium __mpn_sub_n -- Subtract two limb vectors of the same length > 0
    and store difference in a third limb vector.
 
-Copyright (C) 1992, 1994, 1995 Free Software Foundation, Inc.
+Copyright (C) 1992, 1994, 1995, 1996 Free Software Foundation, Inc.
 
 This file is part of the GNU MP Library.
 
@@ -30,13 +30,6 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
 #include "sysdep.h"
 #include "asm-syntax.h"
 
-#define t1     %eax
-#define t2     %edx
-#define src1   %esi
-#define src2   %ebp
-#define dst    %edi
-#define x      %ebx
-
 .text
        ALIGN (3)
        .globl C_SYMBOL_NAME(__mpn_sub_n)
@@ -46,85 +39,85 @@ C_SYMBOL_NAME(__mpn_sub_n:)
        pushl   %ebx
        pushl   %ebp
 
-       movl    20(%esp),dst            /* res_ptr */
-       movl    24(%esp),src1           /* s1_ptr */
-       movl    28(%esp),src2           /* s2_ptr */
+       movl    20(%esp),%edi           /* res_ptr */
+       movl    24(%esp),%esi           /* s1_ptr */
+       movl    28(%esp),%ebp           /* s2_ptr */
        movl    32(%esp),%ecx           /* size */
 
-       movl    (src2),x
+       movl    (%ebp),%ebx
 
        decl    %ecx
-       movl    %ecx,t2
+       movl    %ecx,%edx
        shrl    $3,%ecx
-       andl    $7,t2
+       andl    $7,%edx
        testl   %ecx,%ecx               /* zero carry flag */
        jz      Lend
-       pushl   t2
+       pushl   %edx
 
        ALIGN (3)
-Loop:  movl    28(dst),%eax            /* fetch destination cache line */
-       leal    32(dst),dst
-
-L1:    movl    (src1),t1
-       movl    4(src1),t2
-       sbbl    x,t1
-       movl    4(src2),x
-       sbbl    x,t2
-       movl    8(src2),x
-       movl    t1,-32(dst)
-       movl    t2,-28(dst)
-
-L2:    movl    8(src1),t1
-       movl    12(src1),t2
-       sbbl    x,t1
-       movl    12(src2),x
-       sbbl    x,t2
-       movl    16(src2),x
-       movl    t1,-24(dst)
-       movl    t2,-20(dst)
-
-L3:    movl    16(src1),t1
-       movl    20(src1),t2
-       sbbl    x,t1
-       movl    20(src2),x
-       sbbl    x,t2
-       movl    24(src2),x
-       movl    t1,-16(dst)
-       movl    t2,-12(dst)
-
-L4:    movl    24(src1),t1
-       movl    28(src1),t2
-       sbbl    x,t1
-       movl    28(src2),x
-       sbbl    x,t2
-       movl    32(src2),x
-       movl    t1,-8(dst)
-       movl    t2,-4(dst)
-
-       leal    32(src1),src1
-       leal    32(src2),src2
+Loop:  movl    28(%edi),%eax           /* fetch destination cache line */
+       leal    32(%edi),%edi
+
+L1:    movl    (%esi),%eax
+       movl    4(%esi),%edx
+       sbbl    %ebx,%eax
+       movl    4(%ebp),%ebx
+       sbbl    %ebx,%edx
+       movl    8(%ebp),%ebx
+       movl    %eax,-32(%edi)
+       movl    %edx,-28(%edi)
+
+L2:    movl    8(%esi),%eax
+       movl    12(%esi),%edx
+       sbbl    %ebx,%eax
+       movl    12(%ebp),%ebx
+       sbbl    %ebx,%edx
+       movl    16(%ebp),%ebx
+       movl    %eax,-24(%edi)
+       movl    %edx,-20(%edi)
+
+L3:    movl    16(%esi),%eax
+       movl    20(%esi),%edx
+       sbbl    %ebx,%eax
+       movl    20(%ebp),%ebx
+       sbbl    %ebx,%edx
+       movl    24(%ebp),%ebx
+       movl    %eax,-16(%edi)
+       movl    %edx,-12(%edi)
+
+L4:    movl    24(%esi),%eax
+       movl    28(%esi),%edx
+       sbbl    %ebx,%eax
+       movl    28(%ebp),%ebx
+       sbbl    %ebx,%edx
+       movl    32(%ebp),%ebx
+       movl    %eax,-8(%edi)
+       movl    %edx,-4(%edi)
+
+       leal    32(%esi),%esi
+       leal    32(%ebp),%ebp
        decl    %ecx
        jnz     Loop
 
-       popl    t2
+       popl    %edx
 Lend:
-       decl    t2                      /* test t2 w/o clobbering carry */
+       decl    %edx                    /* test %edx w/o clobbering carry */
        js      Lend2
-       incl    t2
+       incl    %edx
 Loop2:
-       leal    4(dst),dst
-       movl    (src1),t1
-       sbbl    x,t1
-       movl    4(src2),x
-       movl    t1,-4(dst)
-       leal    4(src1),src1
-       leal    4(src2),src2
-       decl    t2
+       leal    4(%edi),%edi
+       movl    (%esi),%eax
+       sbbl    %ebx,%eax
+       movl    4(%ebp),%ebx
+       movl    %eax,-4(%edi)
+       leal    4(%esi),%esi
+       leal    4(%ebp),%ebp
+       decl    %edx
        jnz     Loop2
 Lend2:
-       movl    (src1),t1
-       sbbl    x,t1
-       movl    t1,(dst)
+       movl    (%esi),%eax
+       sbbl    %ebx,%eax
+       movl    %eax,(%edi)
 
        sbbl    %eax,%eax
        negl    %eax
index 14bfe54..440f64f 100644 (file)
@@ -1,7 +1,7 @@
 /* Pentium __mpn_submul_1 -- Multiply a limb vector with a limb and subtract
    the result from a second 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.
 
@@ -53,10 +53,10 @@ C_SYMBOL_NAME(__mpn_submul_1:)
        INSN2(lea,l     ,R(res_ptr),MEM_INDEX(res_ptr,size,4))
        INSN2(lea,l     ,R(s1_ptr),MEM_INDEX(s1_ptr,size,4))
        INSN1(neg,l     ,R(size))
-       INSN2(xor,l     ,R(edx),R(edx))
+       INSN2(xor,l     ,R(ebx),R(ebx))
        ALIGN (3)
-Loop:
-       INSN2(mov,l     ,R(ebx),R(edx))
+
+Loop:  INSN2(adc,l     ,R(ebx),$0)
        INSN2(mov,l     ,R(eax),MEM_INDEX(s1_ptr,size,4))
 
        INSN1(mul,l     ,R(s2_limb))
@@ -67,14 +67,14 @@ Loop:
        INSN2(adc,l     ,R(edx),$0)
        INSN2(sub,l     ,R(ebx),R(eax))
 
-       INSN2(adc,l     ,R(edx),$0)
        INSN2(mov,l     ,MEM_INDEX(res_ptr,size,4),R(ebx))
-
        INSN1(inc,l     ,R(size))
-       INSN1(jnz,      ,Loop)
 
+       INSN2(mov,l     ,R(ebx),R(edx))
+       INSN1(jnz,      ,Loop)
 
-       INSN2(mov,l     ,R(eax),R(edx))
+       INSN2(adc,l     ,R(ebx),$0)
+       INSN2(mov,l     ,R(eax),R(ebx))
        INSN1(pop,l     ,R(ebp))
        INSN1(pop,l     ,R(ebx))
        INSN1(pop,l     ,R(esi))
index 3f244c4..169f113 100644 (file)
@@ -1,7 +1,7 @@
 /* mc68020 __mpn_addmul_1 -- Multiply a limb vector with a limb and add
    the result to a second 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.
 
@@ -23,58 +23,61 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
   INPUT PARAMETERS
   res_ptr      (sp + 4)
   s1_ptr       (sp + 8)
-  size         (sp + 12)
+  s1_size      (sp + 12)
   s2_limb      (sp + 16)
 */
 
+#include "sysdep.h"
 #include "asm-syntax.h"
 
        TEXT
        ALIGN
-       GLOBL   ___mpn_addmul_1
+       GLOBL   C_SYMBOL_NAME(__mpn_addmul_1)
 
-LAB(___mpn_addmul_1)
+C_SYMBOL_NAME(__mpn_addmul_1:)
+PROLOG(__mpn_addmul_1)
 
 #define res_ptr a0
 #define s1_ptr a1
-#define size d2
+#define s1_size d2
 #define s2_limb d4
 
 /* Save used registers on the stack.  */
-       INSN2(movem,l   ,MEM_PREDEC(sp),d2-d5)
+       moveml  R(d2)-R(d5),MEM_PREDEC(sp)
 
 /* Copy the arguments to registers.  Better use movem?  */
-       INSN2(move,l    ,res_ptr,MEM_DISP(sp,20))
-       INSN2(move,l    ,s1_ptr,MEM_DISP(sp,24))
-       INSN2(move,l    ,size,MEM_DISP(sp,28))
-       INSN2(move,l    ,s2_limb,MEM_DISP(sp,32))
-
-       INSN2(eor,w     ,size,#1)
-       INSN1(clr,l     ,d1)
-       INSN1(clr,l     ,d5)
-       INSN2(lsr,l     ,size,#1)
-       bcc     L1
-       INSN2(subq,l    ,size,#1)
-       INSN2(sub,l     ,d0,d0)         /* (d0,cy) <= (0,0) */
-
-LAB(Loop)
-       INSN2(move,l    ,d3,MEM_POSTINC(s1_ptr))
-       INSN2(mulu,l    ,d1:d3,s2_limb)
-       INSN2(addx,l    ,d3,d0)
-       INSN2(addx,l    ,d1,d5)
-       INSN2(add,l     ,MEM_POSTINC(res_ptr),d3)
-LAB(L1)        INSN2(move,l    ,d3,MEM_POSTINC(s1_ptr))
-       INSN2(mulu,l    ,d0:d3,s2_limb)
-       INSN2(addx,l    ,d3,d1)
-       INSN2(addx,l    ,d0,d5)
-       INSN2(add,l     ,MEM_POSTINC(res_ptr),d3)
-
-       dbf     size,Loop
-       INSN2(addx,l    ,d0,d5)
-       INSN2(sub,l     ,size,#0x10000)
-       bcc     Loop
+       movel   MEM_DISP(sp,20),R(res_ptr)
+       movel   MEM_DISP(sp,24),R(s1_ptr)
+       movel   MEM_DISP(sp,28),R(s1_size)
+       movel   MEM_DISP(sp,32),R(s2_limb)
+
+       eorw    #1,R(s1_size)
+       clrl    R(d1)
+       clrl    R(d5)
+       lsrl    #1,R(s1_size)
+       bcc     L(L1)
+       subql   #1,R(s1_size)
+       subl    R(d0),R(d0)             /* (d0,cy) <= (0,0) */
+
+L(Loop:)
+       movel   MEM_POSTINC(s1_ptr),R(d3)
+       mulul   R(s2_limb),R(d1):R(d3)
+       addxl   R(d0),R(d3)
+       addxl   R(d5),R(d1)
+       addl    R(d3),MEM_POSTINC(res_ptr)
+L(L1:) movel   MEM_POSTINC(s1_ptr),R(d3)
+       mulul   R(s2_limb),R(d0):R(d3)
+       addxl   R(d1),R(d3)
+       addxl   R(d5),R(d0)
+       addl    R(d3),MEM_POSTINC(res_ptr)
+
+       dbf     R(s1_size),L(Loop)
+       addxl   R(d5),R(d0)
+       subl    #0x10000,R(s1_size)
+       bcc     L(Loop)
 
 /* Restore used registers from stack frame.  */
-       INSN2(movem,l   ,d2-d5,MEM_POSTINC(sp))
+       moveml  MEM_POSTINC(sp),R(d2)-R(d5)
 
        rts
+EPILOG(__mpn_addmul_1)
index 548ca00..4db1cca 100644 (file)
@@ -1,7 +1,7 @@
 /* mc68020 __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, 1996 Free Software Foundation, Inc.
 
 This file is part of the GNU MP Library.
 
@@ -23,65 +23,68 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
   INPUT PARAMETERS
   res_ptr      (sp + 4)
   s1_ptr       (sp + 8)
-  size         (sp + 12)
+  s1_size      (sp + 12)
   s2_limb      (sp + 16)
 */
 
+#include "sysdep.h"
 #include "asm-syntax.h"
 
        TEXT
        ALIGN
-       GLOBL   ___mpn_mul_1
+       GLOBL   C_SYMBOL_NAME(__mpn_mul_1)
 
-LAB(___mpn_mul_1)
+C_SYMBOL_NAME(__mpn_mul_1:)
+PROLOG(__mpn_mul_1)
 
 #define res_ptr a0
 #define s1_ptr a1
-#define size d2
+#define s1_size d2
 #define s2_limb d4
 
 /* Save used registers on the stack.  */
-       INSN2(movem,l   ,MEM_PREDEC(sp),d2-d4)
+       moveml  R(d2)-R(d4),MEM_PREDEC(sp)
 #if 0
-       INSN2(move,l    ,MEM_PREDEC(sp),d2)
-       INSN2(move,l    ,MEM_PREDEC(sp),d3)
-       INSN2(move,l    ,MEM_PREDEC(sp),d4)
+       movel   R(d2),MEM_PREDEC(sp)
+       movel   R(d3),MEM_PREDEC(sp)
+       movel   R(d4),MEM_PREDEC(sp)
 #endif
 
 /* Copy the arguments to registers.  Better use movem?  */
-       INSN2(move,l    ,res_ptr,MEM_DISP(sp,16))
-       INSN2(move,l    ,s1_ptr,MEM_DISP(sp,20))
-       INSN2(move,l    ,size,MEM_DISP(sp,24))
-       INSN2(move,l    ,s2_limb,MEM_DISP(sp,28))
-
-       INSN2(eor,w     ,size,#1)
-       INSN1(clr,l     ,d1)
-       INSN2(lsr,l     ,size,#1)
-       bcc     L1
-       INSN2(subq,l    ,size,#1)
-       INSN2(sub,l     ,d0,d0)         /* (d0,cy) <= (0,0) */
-
-LAB(Loop)
-       INSN2(move,l    ,d3,MEM_POSTINC(s1_ptr))
-       INSN2(mulu,l    ,d1:d3,s2_limb)
-       INSN2(addx,l    ,d3,d0)
-       INSN2(move,l    ,MEM_POSTINC(res_ptr),d3)
-LAB(L1)        INSN2(move,l    ,d3,MEM_POSTINC(s1_ptr))
-       INSN2(mulu,l    ,d0:d3,s2_limb)
-       INSN2(addx,l    ,d3,d1)
-       INSN2(move,l    ,MEM_POSTINC(res_ptr),d3)
-
-       dbf     size,Loop
-       INSN1(clr,l     ,d3)
-       INSN2(addx,l    ,d0,d3)
-       INSN2(sub,l     ,size,#0x10000)
-       bcc     Loop
+       movel   MEM_DISP(sp,16),R(res_ptr)
+       movel   MEM_DISP(sp,20),R(s1_ptr)
+       movel   MEM_DISP(sp,24),R(s1_size)
+       movel   MEM_DISP(sp,28),R(s2_limb)
+
+       eorw    #1,R(s1_size)
+       clrl    R(d1)
+       lsrl    #1,R(s1_size)
+       bcc     L(L1)
+       subql   #1,R(s1_size)
+       subl    R(d0),R(d0)     /* (d0,cy) <= (0,0) */
+
+L(Loop:)
+       movel   MEM_POSTINC(s1_ptr),R(d3)
+       mulul   R(s2_limb),R(d1):R(d3)
+       addxl   R(d0),R(d3)
+       movel   R(d3),MEM_POSTINC(res_ptr)
+L(L1:) movel   MEM_POSTINC(s1_ptr),R(d3)
+       mulul   R(s2_limb),R(d0):R(d3)
+       addxl   R(d1),R(d3)
+       movel   R(d3),MEM_POSTINC(res_ptr)
+
+       dbf     R(s1_size),L(Loop)
+       clrl    R(d3)
+       addxl   R(d3),R(d0)
+       subl    #0x10000,R(s1_size)
+       bcc     L(Loop)
 
 /* Restore used registers from stack frame.  */
-       INSN2(movem,l   ,d2-d4,MEM_POSTINC(sp))
+       moveml  MEM_POSTINC(sp),R(d2)-R(d4)
 #if 0
-       INSN2(move,l    ,d4,MEM_POSTINC(sp))
-       INSN2(move,l    ,d3,MEM_POSTINC(sp))
-       INSN2(move,l    ,d2,MEM_POSTINC(sp))
+       movel   MEM_POSTINC(sp),R(d4)
+       movel   MEM_POSTINC(sp),R(d3)
+       movel   MEM_POSTINC(sp),R(d2)
 #endif
        rts
+EPILOG(__mpn_mul_1)
index ef7f39d..cf30029 100644 (file)
@@ -1,7 +1,7 @@
 /* mc68020 __mpn_submul_1 -- Multiply a limb vector with a limb and subtract
    the result from a second 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.
 
@@ -23,58 +23,61 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
   INPUT PARAMETERS
   res_ptr      (sp + 4)
   s1_ptr       (sp + 8)
-  size         (sp + 12)
+  s1_size      (sp + 12)
   s2_limb      (sp + 16)
 */
 
+#include "sysdep.h"
 #include "asm-syntax.h"
 
        TEXT
        ALIGN
-       GLOBL   ___mpn_submul_1
+       GLOBL   C_SYMBOL_NAME(__mpn_submul_1)
 
-LAB(___mpn_submul_1)
+C_SYMBOL_NAME(__mpn_submul_1:)
+PROLOG(__mpn_submul_1)
 
 #define res_ptr a0
 #define s1_ptr a1
-#define size d2
+#define s1_size d2
 #define s2_limb d4
 
 /* Save used registers on the stack.  */
-       INSN2(movem,l   ,MEM_PREDEC(sp),d2-d5)
+       moveml  R(d2)-R(d5),MEM_PREDEC(sp)
 
 /* Copy the arguments to registers.  Better use movem?  */
-       INSN2(move,l    ,res_ptr,MEM_DISP(sp,20))
-       INSN2(move,l    ,s1_ptr,MEM_DISP(sp,24))
-       INSN2(move,l    ,size,MEM_DISP(sp,28))
-       INSN2(move,l    ,s2_limb,MEM_DISP(sp,32))
-
-       INSN2(eor,w     ,size,#1)
-       INSN1(clr,l     ,d1)
-       INSN1(clr,l     ,d5)
-       INSN2(lsr,l     ,size,#1)
-       bcc     L1
-       INSN2(subq,l    ,size,#1)
-       INSN2(sub,l     ,d0,d0)         /* (d0,cy) <= (0,0) */
-
-LAB(Loop)
-       INSN2(move,l    ,d3,MEM_POSTINC(s1_ptr))
-       INSN2(mulu,l    ,d1:d3,s2_limb)
-       INSN2(addx,l    ,d3,d0)
-       INSN2(addx,l    ,d1,d5)
-       INSN2(sub,l     ,MEM_POSTINC(res_ptr),d3)
-LAB(L1)        INSN2(move,l    ,d3,MEM_POSTINC(s1_ptr))
-       INSN2(mulu,l    ,d0:d3,s2_limb)
-       INSN2(addx,l    ,d3,d1)
-       INSN2(addx,l    ,d0,d5)
-       INSN2(sub,l     ,MEM_POSTINC(res_ptr),d3)
-
-       dbf     size,Loop
-       INSN2(addx,l    ,d0,d5)
-       INSN2(sub,l     ,size,#0x10000)
-       bcc     Loop
+       movel   MEM_DISP(sp,20),R(res_ptr)
+       movel   MEM_DISP(sp,24),R(s1_ptr)
+       movel   MEM_DISP(sp,28),R(s1_size)
+       movel   MEM_DISP(sp,32),R(s2_limb)
+
+       eorw    #1,R(s1_size)
+       clrl    R(d1)
+       clrl    R(d5)
+       lsrl    #1,R(s1_size)
+       bcc     L(L1)
+       subql   #1,R(s1_size)
+       subl    R(d0),R(d0)     /* (d0,cy) <= (0,0) */
+
+L(Loop:)
+       movel   MEM_POSTINC(s1_ptr),R(d3)
+       mulul   R(s2_limb),R(d1):R(d3)
+       addxl   R(d0),R(d3)
+       addxl   R(d5),R(d1)
+       subl    R(d3),MEM_POSTINC(res_ptr)
+L(L1:) movel   MEM_POSTINC(s1_ptr),R(d3)
+       mulul   R(s2_limb),R(d0):R(d3)
+       addxl   R(d1),R(d3)
+       addxl   R(d5),R(d0)
+       subl    R(d3),MEM_POSTINC(res_ptr)
+
+       dbf     R(s1_size),L(Loop)
+       addxl   R(d5),R(d0)
+       subl    #0x10000,R(s1_size)
+       bcc     L(Loop)
 
 /* Restore used registers from stack frame.  */
-       INSN2(movem,l   ,d2-d5,MEM_POSTINC(sp))
+       moveml  MEM_POSTINC(sp),R(d2)-R(d5)
 
        rts
+EPILOG(__mpn_submul_1)
diff --git a/sysdeps/m88k/m88110/add_n.S b/sysdeps/m88k/m88110/add_n.S
new file mode 100644 (file)
index 0000000..ab20630
--- /dev/null
@@ -0,0 +1,199 @@
+; mc88110 __mpn_add_n -- Add two limb vectors of the same length > 0 and store
+; sum in a third limb vector.
+
+; Copyright (C) 1995, 1996 Free Software Foundation, Inc.
+
+; This file is part of the GNU MP Library.
+
+; The GNU MP Library is free software; you can redistribute it and/or modify
+; it under the terms of the GNU 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
+#define res_ptr        r2
+#define s1_ptr r3
+#define s2_ptr r4
+#define size   r5
+
+#include "sysdep.h"
+
+       text
+       align   16
+       global  C_SYMBOL_NAME(__mpn_add_n)
+C_SYMBOL_NAME(__mpn_add_n):
+       addu.co  r0,r0,r0               ; clear cy flag
+       xor      r12,s2_ptr,res_ptr
+       bb1      2,r12,L1
+; **  V1a  **
+L0:    bb0      2,res_ptr,L_v1         ; branch if res_ptr is aligned?
+/* Add least significant limb separately to align res_ptr and s2_ptr */
+       ld       r10,s1_ptr,0
+       addu     s1_ptr,s1_ptr,4
+       ld       r8,s2_ptr,0
+       addu     s2_ptr,s2_ptr,4
+       subu     size,size,1
+       addu.co  r6,r10,r8
+       st       r6,res_ptr,0
+       addu     res_ptr,res_ptr,4
+L_v1:  cmp      r12,size,2
+       bb1      lt,r12,Lend2
+
+       ld       r10,s1_ptr,0
+       ld       r12,s1_ptr,4
+       ld.d     r8,s2_ptr,0
+       subu     size,size,10
+       bcnd     lt0,size,Lfin1
+/* Add blocks of 8 limbs until less than 8 limbs remain */
+       align    8
+Loop1: subu     size,size,8
+       addu.cio r6,r10,r8
+       ld       r10,s1_ptr,8
+       addu.cio r7,r12,r9
+       ld       r12,s1_ptr,12
+       ld.d     r8,s2_ptr,8
+       st.d     r6,res_ptr,0
+       addu.cio r6,r10,r8
+       ld       r10,s1_ptr,16
+       addu.cio r7,r12,r9
+       ld       r12,s1_ptr,20
+       ld.d     r8,s2_ptr,16
+       st.d     r6,res_ptr,8
+       addu.cio r6,r10,r8
+       ld       r10,s1_ptr,24
+       addu.cio r7,r12,r9
+       ld       r12,s1_ptr,28
+       ld.d     r8,s2_ptr,24
+       st.d     r6,res_ptr,16
+       addu.cio r6,r10,r8
+       ld       r10,s1_ptr,32
+       addu.cio r7,r12,r9
+       ld       r12,s1_ptr,36
+       addu     s1_ptr,s1_ptr,32
+       ld.d     r8,s2_ptr,32
+       addu     s2_ptr,s2_ptr,32
+       st.d     r6,res_ptr,24
+       addu     res_ptr,res_ptr,32
+       bcnd     ge0,size,Loop1
+
+Lfin1: addu     size,size,8-2
+       bcnd     lt0,size,Lend1
+/* Add blocks of 2 limbs until less than 2 limbs remain */
+Loope1:        addu.cio r6,r10,r8
+       ld       r10,s1_ptr,8
+       addu.cio r7,r12,r9
+       ld       r12,s1_ptr,12
+       ld.d     r8,s2_ptr,8
+       st.d     r6,res_ptr,0
+       subu     size,size,2
+       addu     s1_ptr,s1_ptr,8
+       addu     s2_ptr,s2_ptr,8
+       addu     res_ptr,res_ptr,8
+       bcnd     ge0,size,Loope1
+Lend1: addu.cio r6,r10,r8
+       addu.cio r7,r12,r9
+       st.d     r6,res_ptr,0
+
+       bb0      0,size,Lret1
+/* Add last limb */
+       ld       r10,s1_ptr,8
+       ld       r8,s2_ptr,8
+       addu.cio r6,r10,r8
+       st       r6,res_ptr,8
+
+Lret1: jmp.n    r1
+       addu.ci  r2,r0,r0               ; return carry-out from most sign. limb
+
+L1:    xor      r12,s1_ptr,res_ptr
+       bb1      2,r12,L2
+; **  V1b  **
+       or       r12,r0,s2_ptr
+       or       s2_ptr,r0,s1_ptr
+       or       s1_ptr,r0,r12
+       br       L0
+
+; **  V2  **
+/* If we come here, the alignment of s1_ptr and res_ptr as well as the
+   alignment of s2_ptr and res_ptr differ.  Since there are only two ways
+   things can be aligned (that we care about) we now know that the alignment
+   of s1_ptr and s2_ptr are the same.  */
+
+L2:    cmp      r12,size,1
+       bb1      eq,r12,Ljone
+       bb0      2,s1_ptr,L_v2          ; branch if s1_ptr is aligned
+/* Add least significant limb separately to align res_ptr and s2_ptr */
+       ld       r10,s1_ptr,0
+       addu     s1_ptr,s1_ptr,4
+       ld       r8,s2_ptr,0
+       addu     s2_ptr,s2_ptr,4
+       subu     size,size,1
+       addu.co  r6,r10,r8
+       st       r6,res_ptr,0
+       addu     res_ptr,res_ptr,4
+
+L_v2:  subu     size,size,8
+       bcnd     lt0,size,Lfin2
+/* Add blocks of 8 limbs until less than 8 limbs remain */
+       align    8
+Loop2: subu     size,size,8
+       ld.d     r8,s1_ptr,0
+       ld.d     r6,s2_ptr,0
+       addu.cio r8,r8,r6
+       st       r8,res_ptr,0
+       addu.cio r9,r9,r7
+       st       r9,res_ptr,4
+       ld.d     r8,s1_ptr,8
+       ld.d     r6,s2_ptr,8
+       addu.cio r8,r8,r6
+       st       r8,res_ptr,8
+       addu.cio r9,r9,r7
+       st       r9,res_ptr,12
+       ld.d     r8,s1_ptr,16
+       ld.d     r6,s2_ptr,16
+       addu.cio r8,r8,r6
+       st       r8,res_ptr,16
+       addu.cio r9,r9,r7
+       st       r9,res_ptr,20
+       ld.d     r8,s1_ptr,24
+       ld.d     r6,s2_ptr,24
+       addu.cio r8,r8,r6
+       st       r8,res_ptr,24
+       addu.cio r9,r9,r7
+       st       r9,res_ptr,28
+       addu     s1_ptr,s1_ptr,32
+       addu     s2_ptr,s2_ptr,32
+       addu     res_ptr,res_ptr,32
+       bcnd     ge0,size,Loop2
+
+Lfin2: addu     size,size,8-2
+       bcnd     lt0,size,Lend2
+Loope2:        ld.d     r8,s1_ptr,0
+       ld.d     r6,s2_ptr,0
+       addu.cio r8,r8,r6
+       st       r8,res_ptr,0
+       addu.cio r9,r9,r7
+       st       r9,res_ptr,4
+       subu     size,size,2
+       addu     s1_ptr,s1_ptr,8
+       addu     s2_ptr,s2_ptr,8
+       addu     res_ptr,res_ptr,8
+       bcnd     ge0,size,Loope2
+Lend2: bb0      0,size,Lret2
+/* Add last limb */
+Ljone: ld       r10,s1_ptr,0
+       ld       r8,s2_ptr,0
+       addu.cio r6,r10,r8
+       st       r6,res_ptr,0
+
+Lret2: jmp.n    r1
+       addu.ci  r2,r0,r0               ; return carry-out from most sign. limb
diff --git a/sysdeps/m88k/m88110/addmul_1.s b/sysdeps/m88k/m88110/addmul_1.s
new file mode 100644 (file)
index 0000000..1a4dfa1
--- /dev/null
@@ -0,0 +1,60 @@
+; mc88110 __mpn_addmul_1 -- Multiply a limb vector with a single limb and
+; store the product in a second limb vector.
+
+; 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      r2
+; s1_ptr       r3
+; size         r4
+; s2_limb      r5
+
+       text
+       align   16
+       global  ___mpn_addmul_1
+___mpn_addmul_1:
+       lda      r3,r3[r4]
+       lda      r8,r2[r4]              ; RES_PTR in r8 since r2 is retval
+       subu     r4,r0,r4
+       addu.co  r2,r0,r0               ; r2 = cy = 0
+
+       ld       r6,r3[r4]
+       addu     r4,r4,1
+       subu     r8,r8,4
+       bcnd.n   eq0,r4,Lend
+        mulu.d  r10,r6,r5
+
+Loop:  ld       r7,r8[r4]
+       ld       r6,r3[r4]
+       addu.cio r9,r11,r2
+       addu.ci  r2,r10,r0
+       addu.co  r9,r9,r7
+       st       r9,r8[r4]
+       addu     r4,r4,1
+       mulu.d   r10,r6,r5
+       bcnd     ne0,r4,Loop
+
+Lend:  ld       r7,r8,0
+       addu.cio r9,r11,r2
+       addu.ci  r2,r10,r0
+       addu.co  r9,r9,r7
+       st       r9,r8,0
+       jmp.n    r1
+        addu.ci r2,r2,r0
index 08c3ca0..b1352ce 100644 (file)
@@ -1,7 +1,7 @@
 ; mc88110 __mpn_mul_1 -- Multiply a limb vector with a single limb and
 ; store the product 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.
 
@@ -56,29 +56,3 @@ Lend:        addu.cio r9,r11,r2
        st       r9,r8,4
        jmp.n    r1
         addu.ci r2,r10,r0
-
-; This is the Right Way to do this on '110.  4 cycles / 64-bit limb.
-;      ld.d    r10,
-;      mulu.d
-;      addu.cio
-;      addu.cio
-;      st.d
-;      mulu.d  ,r11,r5
-;      ld.d    r12,
-;      mulu.d  ,r10,r5
-;      addu.cio
-;      addu.cio
-;      st.d
-;      mulu.d
-;      ld.d    r10,
-;      mulu.d
-;      addu.cio
-;      addu.cio
-;      st.d
-;      mulu.d
-;      ld.d    r10,
-;      mulu.d
-;      addu.cio
-;      addu.cio
-;      st.d
-;      mulu.d
diff --git a/sysdeps/m88k/m88110/sub_n.S b/sysdeps/m88k/m88110/sub_n.S
new file mode 100644 (file)
index 0000000..74ee0ae
--- /dev/null
@@ -0,0 +1,275 @@
+; mc88110 __mpn_sub_n -- Subtract two limb vectors of the same length > 0 and
+; store difference in a third limb vector.
+
+; Copyright (C) 1995, 1996 Free Software Foundation, Inc.
+
+; This file is part of the GNU MP Library.
+
+; The GNU MP Library is free software; you can redistribute it and/or modify
+; it under the terms of the GNU 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
+#define res_ptr        r2
+#define s1_ptr r3
+#define s2_ptr r4
+#define size   r5
+
+#include "sysdep.h"
+
+       text
+       align   16
+       global  C_SYMBOL_NAME(__mpn_sub_n)
+C_SYMBOL_NAME(__mpn_sub_n):
+       subu.co  r0,r0,r0               ; set cy flag
+       xor      r12,s2_ptr,res_ptr
+       bb1      2,r12,L1
+; **  V1a  **
+L0:    bb0      2,res_ptr,L_v1         ; branch if res_ptr is aligned
+/* Add least significant limb separately to align res_ptr and s2_ptr */
+       ld       r10,s1_ptr,0
+       addu     s1_ptr,s1_ptr,4
+       ld       r8,s2_ptr,0
+       addu     s2_ptr,s2_ptr,4
+       subu     size,size,1
+       subu.co  r6,r10,r8
+       st       r6,res_ptr,0
+       addu     res_ptr,res_ptr,4
+L_v1:  cmp      r12,size,2
+       bb1      lt,r12,Lend2
+
+       ld       r10,s1_ptr,0
+       ld       r12,s1_ptr,4
+       ld.d     r8,s2_ptr,0
+       subu     size,size,10
+       bcnd     lt0,size,Lfin1
+/* Add blocks of 8 limbs until less than 8 limbs remain */
+       align    8
+Loop1: subu     size,size,8
+       subu.cio r6,r10,r8
+       ld       r10,s1_ptr,8
+       subu.cio r7,r12,r9
+       ld       r12,s1_ptr,12
+       ld.d     r8,s2_ptr,8
+       st.d     r6,res_ptr,0
+       subu.cio r6,r10,r8
+       ld       r10,s1_ptr,16
+       subu.cio r7,r12,r9
+       ld       r12,s1_ptr,20
+       ld.d     r8,s2_ptr,16
+       st.d     r6,res_ptr,8
+       subu.cio r6,r10,r8
+       ld       r10,s1_ptr,24
+       subu.cio r7,r12,r9
+       ld       r12,s1_ptr,28
+       ld.d     r8,s2_ptr,24
+       st.d     r6,res_ptr,16
+       subu.cio r6,r10,r8
+       ld       r10,s1_ptr,32
+       subu.cio r7,r12,r9
+       ld       r12,s1_ptr,36
+       addu     s1_ptr,s1_ptr,32
+       ld.d     r8,s2_ptr,32
+       addu     s2_ptr,s2_ptr,32
+       st.d     r6,res_ptr,24
+       addu     res_ptr,res_ptr,32
+       bcnd     ge0,size,Loop1
+
+Lfin1: addu     size,size,8-2
+       bcnd     lt0,size,Lend1
+/* Add blocks of 2 limbs until less than 2 limbs remain */
+Loope1:        subu.cio r6,r10,r8
+       ld       r10,s1_ptr,8
+       subu.cio r7,r12,r9
+       ld       r12,s1_ptr,12
+       ld.d     r8,s2_ptr,8
+       st.d     r6,res_ptr,0
+       subu     size,size,2
+       addu     s1_ptr,s1_ptr,8
+       addu     s2_ptr,s2_ptr,8
+       addu     res_ptr,res_ptr,8
+       bcnd     ge0,size,Loope1
+Lend1: subu.cio r6,r10,r8
+       subu.cio r7,r12,r9
+       st.d     r6,res_ptr,0
+
+       bb0      0,size,Lret1
+/* Add last limb */
+       ld       r10,s1_ptr,8
+       ld       r8,s2_ptr,8
+       subu.cio r6,r10,r8
+       st       r6,res_ptr,8
+
+Lret1: addu.ci r2,r0,r0                ; return carry-out from most sign. limb
+       jmp.n    r1
+        xor    r2,r2,1
+
+L1:    xor      r12,s1_ptr,res_ptr
+       bb1      2,r12,L2
+; **  V1b  **
+       bb0      2,res_ptr,L_v1b        ; branch if res_ptr is aligned
+/* Add least significant limb separately to align res_ptr and s1_ptr */
+       ld       r10,s2_ptr,0
+       addu     s2_ptr,s2_ptr,4
+       ld       r8,s1_ptr,0
+       addu     s1_ptr,s1_ptr,4
+       subu     size,size,1
+       subu.co  r6,r8,r10
+       st       r6,res_ptr,0
+       addu     res_ptr,res_ptr,4
+L_v1b: cmp      r12,size,2
+       bb1      lt,r12,Lend2
+
+       ld       r10,s2_ptr,0
+       ld       r12,s2_ptr,4
+       ld.d     r8,s1_ptr,0
+       subu     size,size,10
+       bcnd     lt0,size,Lfin1b
+/* Add blocks of 8 limbs until less than 8 limbs remain */
+       align    8
+Loop1b:        subu     size,size,8
+       subu.cio r6,r8,r10
+       ld       r10,s2_ptr,8
+       subu.cio r7,r9,r12
+       ld       r12,s2_ptr,12
+       ld.d     r8,s1_ptr,8
+       st.d     r6,res_ptr,0
+       subu.cio r6,r8,r10
+       ld       r10,s2_ptr,16
+       subu.cio r7,r9,r12
+       ld       r12,s2_ptr,20
+       ld.d     r8,s1_ptr,16
+       st.d     r6,res_ptr,8
+       subu.cio r6,r8,r10
+       ld       r10,s2_ptr,24
+       subu.cio r7,r9,r12
+       ld       r12,s2_ptr,28
+       ld.d     r8,s1_ptr,24
+       st.d     r6,res_ptr,16
+       subu.cio r6,r8,r10
+       ld       r10,s2_ptr,32
+       subu.cio r7,r9,r12
+       ld       r12,s2_ptr,36
+       addu     s2_ptr,s2_ptr,32
+       ld.d     r8,s1_ptr,32
+       addu     s1_ptr,s1_ptr,32
+       st.d     r6,res_ptr,24
+       addu     res_ptr,res_ptr,32
+       bcnd     ge0,size,Loop1b
+
+Lfin1b:        addu     size,size,8-2
+       bcnd     lt0,size,Lend1b
+/* Add blocks of 2 limbs until less than 2 limbs remain */
+Loope1b:subu.cio r6,r8,r10
+       ld       r10,s2_ptr,8
+       subu.cio r7,r9,r12
+       ld       r12,s2_ptr,12
+       ld.d     r8,s1_ptr,8
+       st.d     r6,res_ptr,0
+       subu     size,size,2
+       addu     s1_ptr,s1_ptr,8
+       addu     s2_ptr,s2_ptr,8
+       addu     res_ptr,res_ptr,8
+       bcnd     ge0,size,Loope1b
+Lend1b:        subu.cio r6,r8,r10
+       subu.cio r7,r9,r12
+       st.d     r6,res_ptr,0
+
+       bb0      0,size,Lret1b
+/* Add last limb */
+       ld       r10,s2_ptr,8
+       ld       r8,s1_ptr,8
+       subu.cio r6,r8,r10
+       st       r6,res_ptr,8
+
+Lret1b:        addu.ci r2,r0,r0                ; return carry-out from most sign. limb
+       jmp.n    r1
+        xor    r2,r2,1
+
+; **  V2  **
+/* If we come here, the alignment of s1_ptr and res_ptr as well as the
+   alignment of s2_ptr and res_ptr differ.  Since there are only two ways
+   things can be aligned (that we care about) we now know that the alignment
+   of s1_ptr and s2_ptr are the same.  */
+
+L2:    cmp      r12,size,1
+       bb1      eq,r12,Ljone
+       bb0      2,s1_ptr,L_v2          ; branch if s1_ptr is aligned
+/* Add least significant limb separately to align res_ptr and s2_ptr */
+       ld       r10,s1_ptr,0
+       addu     s1_ptr,s1_ptr,4
+       ld       r8,s2_ptr,0
+       addu     s2_ptr,s2_ptr,4
+       subu     size,size,1
+       subu.co  r6,r10,r8
+       st       r6,res_ptr,0
+       addu     res_ptr,res_ptr,4
+
+L_v2:  subu     size,size,8
+       bcnd     lt0,size,Lfin2
+/* Add blocks of 8 limbs until less than 8 limbs remain */
+       align    8
+Loop2: subu     size,size,8
+       ld.d     r8,s1_ptr,0
+       ld.d     r6,s2_ptr,0
+       subu.cio r8,r8,r6
+       st       r8,res_ptr,0
+       subu.cio r9,r9,r7
+       st       r9,res_ptr,4
+       ld.d     r8,s1_ptr,8
+       ld.d     r6,s2_ptr,8
+       subu.cio r8,r8,r6
+       st       r8,res_ptr,8
+       subu.cio r9,r9,r7
+       st       r9,res_ptr,12
+       ld.d     r8,s1_ptr,16
+       ld.d     r6,s2_ptr,16
+       subu.cio r8,r8,r6
+       st       r8,res_ptr,16
+       subu.cio r9,r9,r7
+       st       r9,res_ptr,20
+       ld.d     r8,s1_ptr,24
+       ld.d     r6,s2_ptr,24
+       subu.cio r8,r8,r6
+       st       r8,res_ptr,24
+       subu.cio r9,r9,r7
+       st       r9,res_ptr,28
+       addu     s1_ptr,s1_ptr,32
+       addu     s2_ptr,s2_ptr,32
+       addu     res_ptr,res_ptr,32
+       bcnd     ge0,size,Loop2
+
+Lfin2: addu     size,size,8-2
+       bcnd     lt0,size,Lend2
+Loope2:        ld.d     r8,s1_ptr,0
+       ld.d     r6,s2_ptr,0
+       subu.cio r8,r8,r6
+       st       r8,res_ptr,0
+       subu.cio r9,r9,r7
+       st       r9,res_ptr,4
+       subu     size,size,2
+       addu     s1_ptr,s1_ptr,8
+       addu     s2_ptr,s2_ptr,8
+       addu     res_ptr,res_ptr,8
+       bcnd     ge0,size,Loope2
+Lend2: bb0      0,size,Lret2
+/* Add last limb */
+Ljone: ld       r10,s1_ptr,0
+       ld       r8,s2_ptr,0
+       subu.cio r6,r10,r8
+       st       r6,res_ptr,0
+
+Lret2: addu.ci r2,r0,r0                ; return carry-out from most sign. limb
+       jmp.n    r1
+        xor    r2,r2,1
index 80c3b99..49b31fc 100644 (file)
@@ -1,7 +1,7 @@
-! sparc __mpn_add_n -- Add two limb vectors of the same length > 0 and store
+! SPARC __mpn_add_n -- Add two limb vectors of the same length > 0 and store
 ! sum in a third limb vector.
 
-! Copyright (C) 1995 Free Software Foundation, Inc.
+! Copyright (C) 1995, 1996 Free Software Foundation, Inc.
 
 ! This file is part of the GNU MP Library.
 
        .align  4
        .global C_SYMBOL_NAME(__mpn_add_n)
 C_SYMBOL_NAME(__mpn_add_n):
-       cmp     size,8
-       mov     0,%o4                   ! clear cy-save register
-       blt,a   Ltriv
-       addcc   size,-2,size
        xor     s2_ptr,res_ptr,%g1
        andcc   %g1,4,%g0
        bne     L1                      ! branch if alignment differs
        nop
+! **  V1a  **
 L0:    andcc   res_ptr,4,%g0           ! res_ptr unaligned? Side effect: cy=0
-       beq     L_v1                    ! if no, branch
+       be      L_v1                    ! if no, branch
        nop
-! **  V1a  **
 /* Add least significant limb separately to align res_ptr and s2_ptr */
        ld      [s1_ptr],%g4
        add     s1_ptr,4,s1_ptr
@@ -53,12 +49,15 @@ L0: andcc   res_ptr,4,%g0           ! res_ptr unaligned? Side effect: cy=0
        addcc   %g4,%g2,%o4
        st      %o4,[res_ptr]
        add     res_ptr,4,res_ptr
+L_v1:  addx    %g0,%g0,%o4             ! save cy in register
+       cmp     size,2                  ! if size < 2 ...
+       bl      Lend2                   ! ... branch to tail code
+       subcc   %g0,%o4,%g0             ! restore cy
 
-L_v1:  ld      [s1_ptr+0],%g4
+       ld      [s1_ptr+0],%g4
+       addcc   size,-10,size
        ld      [s1_ptr+4],%g1
        ldd     [s2_ptr+0],%g2
-       addx    %g0,%g0,%o4             ! save cy in register
-       addcc   size,-10,size
        blt     Lfin1
        subcc   %g0,%o4,%g0             ! restore cy
 /* Add blocks of 8 limbs until less than 8 limbs remain */
@@ -98,7 +97,7 @@ Lfin1:        addcc   size,8-2,size
        blt     Lend1
        subcc   %g0,%o4,%g0             ! restore cy
 /* Add blocks of 2 limbs until less than 2 limbs remain */
-Loop1b:        addxcc  %g4,%g2,%o4
+Loope1:        addxcc  %g4,%g2,%o4
        ld      [s1_ptr+8],%g4
        addxcc  %g1,%g3,%o5
        ld      [s1_ptr+12],%g1
@@ -109,7 +108,7 @@ Loop1b:     addxcc  %g4,%g2,%o4
        add     s1_ptr,8,s1_ptr
        add     s2_ptr,8,s2_ptr
        add     res_ptr,8,res_ptr
-       bge     Loop1b
+       bge     Loope1
        subcc   %g0,%o4,%g0             ! restore cy
 Lend1: addxcc  %g4,%g2,%o4
        addxcc  %g1,%g3,%o5
@@ -144,10 +143,13 @@ L1:       xor     s1_ptr,res_ptr,%g1
    things can be aligned (that we care about) we now know that the alignment
    of s1_ptr and s2_ptr are the same.  */
 
-L2:    andcc   s1_ptr,4,%g0            ! s1_ptr unaligned? Side effect: cy=0
-       beq     L_v2                    ! if no, branch
+L2:    cmp     size,1
+       be      Ljone
        nop
-/* Add least significant limb separately to align res_ptr and s2_ptr */
+       andcc   s1_ptr,4,%g0            ! s1_ptr unaligned? Side effect: cy=0
+       be      L_v2                    ! if no, branch
+       nop
+/* Add least significant limb separately to align s1_ptr and s2_ptr */
        ld      [s1_ptr],%g4
        add     s1_ptr,4,s1_ptr
        ld      [s2_ptr],%g2
@@ -195,9 +197,9 @@ Loop2:      ldd     [s1_ptr+0],%g2
        subcc   %g0,%o4,%g0             ! restore cy
 
 Lfin2: addcc   size,8-2,size
-Ltriv: blt     Lend2
+       blt     Lend2
        subcc   %g0,%o4,%g0             ! restore cy
-Loop2b:        ldd     [s1_ptr+0],%g2
+Loope2:        ldd     [s1_ptr+0],%g2
        ldd     [s2_ptr+0],%o4
        addxcc  %g2,%o4,%g2
        st      %g2,[res_ptr+0]
@@ -208,13 +210,13 @@ Loop2b:   ldd     [s1_ptr+0],%g2
        add     s1_ptr,8,s1_ptr
        add     s2_ptr,8,s2_ptr
        add     res_ptr,8,res_ptr
-       bge     Loop2b
+       bge     Loope2
        subcc   %g0,%o4,%g0             ! restore cy
 Lend2: andcc   size,1,%g0
        be      Lret2
        subcc   %g0,%o4,%g0             ! restore cy
 /* Add last limb */
-       ld      [s1_ptr],%g4
+Ljone: ld      [s1_ptr],%g4
        ld      [s2_ptr],%g2
        addxcc  %g4,%g2,%o4
        st      %o4,[res_ptr]
index 497272a..6844fa2 100644 (file)
@@ -1,6 +1,6 @@
 ! sparc __mpn_lshift --
 
-! Copyright (C) 1995 Free Software Foundation, Inc.
+! Copyright (C) 1995, 1996 Free Software Foundation, Inc.
 
 ! This file is part of the GNU MP Library.
 
@@ -39,7 +39,7 @@ C_SYMBOL_NAME(__mpn_lshift):
        add     %o2,-1,%o2
        andcc   %o2,4-1,%g4     ! number of limbs in first loop
        srl     %g2,%o5,%g1     ! compute function result
-       beq     L0              ! if multiple of 4 limbs, skip first loop
+       be      L0              ! if multiple of 4 limbs, skip first loop
        st      %g1,[%sp+80]
 
        sub     %o2,%g4,%o2     ! adjust count for main loop
@@ -56,7 +56,7 @@ Loop0:        ld      [%o1-8],%g3
         st     %o4,[%o0+0]
 
 L0:    tst     %o2
-       beq     Lend
+       be      Lend
         nop
 
 Loop:  ld      [%o1-8],%g3
index 3428cfe..5a47926 100644 (file)
@@ -1,6 +1,6 @@
 ! sparc __mpn_rshift --
 
-! Copyright (C) 1995 Free Software Foundation, Inc.
+! Copyright (C) 1995, 1996 Free Software Foundation, Inc.
 
 ! This file is part of the GNU MP Library.
 
@@ -36,7 +36,7 @@ C_SYMBOL_NAME(__mpn_rshift):
        add     %o2,-1,%o2
        andcc   %o2,4-1,%g4     ! number of limbs in first loop
        sll     %g2,%o5,%g1     ! compute function result
-       beq     L0              ! if multiple of 4 limbs, skip first loop
+       be      L0              ! if multiple of 4 limbs, skip first loop
        st      %g1,[%sp+80]
 
        sub     %o2,%g4,%o2     ! adjust count for main loop
@@ -53,7 +53,7 @@ Loop0:        ld      [%o1+4],%g3
         st     %o4,[%o0-4]
 
 L0:    tst     %o2
-       beq     Lend
+       be      Lend
         nop
 
 Loop:  ld      [%o1+4],%g3
diff --git a/sysdeps/sparc/sparc64/gmp-mparam.h b/sysdeps/sparc/sparc64/gmp-mparam.h
new file mode 100644 (file)
index 0000000..05c893f
--- /dev/null
@@ -0,0 +1,26 @@
+/* gmp-mparam.h -- Compiler/machine parameter header file.
+
+Copyright (C) 1991, 1993, 1994 Free Software Foundation, Inc.
+
+This file is part of the GNU MP Library.
+
+The GNU MP Library is free software; you can redistribute it and/or modify
+it under the terms of the GNU 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. */
+
+#define BITS_PER_MP_LIMB 64
+#define BYTES_PER_MP_LIMB 8
+#define BITS_PER_LONGINT 64
+#define BITS_PER_INT 32
+#define BITS_PER_SHORTINT 16
+#define BITS_PER_CHAR 8
diff --git a/sysdeps/sparc/sparc64/lshift.s b/sysdeps/sparc/sparc64/lshift.s
new file mode 100644 (file)
index 0000000..bd7fa01
--- /dev/null
@@ -0,0 +1,95 @@
+! SPARC v9 __mpn_lshift --
+
+! 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      %o0
+! src_ptr      %o1
+! size         %o2
+! cnt          %o3
+
+.section       ".text"
+       .align 4
+       .global __mpn_lshift
+       .type    __mpn_lshift,#function
+       .proc   04
+__mpn_lshift:
+       sllx    %o2,3,%g1
+       add     %o1,%g1,%o1     ! make %o1 point at end of src
+       ldx     [%o1-8],%g2     ! load first limb
+       sub     %g0,%o3,%o5     ! negate shift count
+       add     %o0,%g1,%o0     ! make %o0 point at end of res
+       add     %o2,-1,%o2
+       and     %o2,4-1,%g4     ! number of limbs in first loop
+       srlx    %g2,%o5,%g1     ! compute function result
+       brz,pn  %g4,.L0         ! if multiple of 4 limbs, skip first loop
+       stx     %g1,[%sp+80]
+
+       sub     %o2,%g4,%o2     ! adjust count for main loop
+
+.Loop0:        ldx     [%o1-16],%g3
+       add     %o0,-8,%o0
+       add     %o1,-8,%o1
+       add     %g4,-1,%g4
+       sllx    %g2,%o3,%o4
+       srlx    %g3,%o5,%g1
+       mov     %g3,%g2
+       or      %o4,%g1,%o4
+       brnz,pt %g4,.Loop0
+        stx    %o4,[%o0+0]
+
+.L0:   brz,pn  %o2,.Lend
+        nop
+
+.Loop: ldx     [%o1-16],%g3
+       add     %o0,-32,%o0
+       add     %o2,-4,%o2
+       sllx    %g2,%o3,%o4
+       srlx    %g3,%o5,%g1
+
+       ldx     [%o1-24],%g2
+       sllx    %g3,%o3,%g4
+       or      %o4,%g1,%o4
+       stx     %o4,[%o0+24]
+       srlx    %g2,%o5,%g1
+
+       ldx     [%o1-32],%g3
+       sllx    %g2,%o3,%o4
+       or      %g4,%g1,%g4
+       stx     %g4,[%o0+16]
+       srlx    %g3,%o5,%g1
+
+       ldx     [%o1-40],%g2
+       sllx    %g3,%o3,%g4
+       or      %o4,%g1,%o4
+       stx     %o4,[%o0+8]
+       srlx    %g2,%o5,%g1
+
+       add     %o1,-32,%o1
+       or      %g4,%g1,%g4
+       brnz,pt %o2,.Loop
+        stx    %g4,[%o0+0]
+
+.Lend: sllx    %g2,%o3,%g2
+       stx     %g2,[%o0-8]
+       retl
+       ldx     [%sp+80],%o0
+.LLfe1:
+       .size    __mpn_lshift,.LLfe1-__mpn_lshift
diff --git a/sysdeps/sparc/sparc64/mul_1.s b/sysdeps/sparc/sparc64/mul_1.s
new file mode 100644 (file)
index 0000000..41be370
--- /dev/null
@@ -0,0 +1,85 @@
+! SPARC v9 __mpn_mul_1 -- Multiply a limb vector with a single limb and
+! store the product in a second limb vector.
+
+! Copyright (C) 1995, 1996 Free Software Foundation, Inc.
+
+! This file is part of the GNU MP Library.
+
+! The GNU MP Library is free software; you can redistribute it and/or modify
+! it under the terms of the GNU 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      o0
+! s1_ptr       o1
+! size         o2
+! s2_limb      o3
+
+.section       ".text"
+       .align 4
+       .global __mpn_mul_1
+       .type    __mpn_mul_1,#function
+       .proc   016
+__mpn_mul_1:
+       !#PROLOGUE#     0
+       save    %sp,-160,%sp
+       !#PROLOGUE#     1
+       sub     %g0,%i2,%o7
+       sllx    %o7,3,%g5
+       sub     %i1,%g5,%o3
+       sub     %i0,%g5,%o4
+       mov     0,%o0                   ! zero cy_limb
+
+       srl     %i3,0,%o1               ! extract low 32 bits of s2_limb
+       srlx    %i3,32,%i3              ! extract high 32 bits of s2_limb
+       mov     1,%o2
+       sllx    %o2,32,%o2              ! o2 = 0x100000000
+
+       !   hi   !
+             !  mid-1 !
+             !  mid-2 !
+                !   lo   !
+.Loop:
+       sllx    %o7,3,%g1
+       ldx     [%o3+%g1],%g5
+       srl     %g5,0,%i0               ! zero hi bits
+       srlx    %g5,32,%g5
+       mulx    %o1,%i0,%i4             ! lo product
+       mulx    %i3,%i0,%i1             ! mid-1 product
+       mulx    %o1,%g5,%l2             ! mid-2 product
+       mulx    %i3,%g5,%i5             ! hi product
+       srlx    %i4,32,%i0              ! extract high 32 bits of lo product...
+       add     %i1,%i0,%i1             ! ...and add it to the mid-1 product
+       addcc   %i1,%l2,%i1             ! add mid products
+       mov     0,%l0                   ! we need the carry from that add...
+       movcs   %xcc,%o2,%l0            ! ...compute it and...
+       add     %i5,%l0,%i5             ! ...add to bit 32 of the hi product
+       sllx    %i1,32,%i0              ! align low bits of mid product
+       srl     %i4,0,%g5               ! zero high 32 bits of lo product
+       add     %i0,%g5,%i0             ! combine into low 64 bits of result
+       srlx    %i1,32,%i1              ! extract high bits of mid product...
+       add     %i5,%i1,%i1             ! ...and add them to the high result
+       addcc   %i0,%o0,%i0             ! add cy_limb to low 64 bits of result
+       mov     0,%g5
+       movcs   %xcc,1,%g5
+       add     %o7,1,%o7
+       stx     %i0,[%o4+%g1]
+       brnz    %o7,.Loop
+       add     %i1,%g5,%o0             ! compute new cy_limb
+
+       mov     %o0,%i0
+       ret
+       restore
+.LLfe1:
+       .size  __mpn_mul_1,.LLfe1-__mpn_mul_1
diff --git a/sysdeps/sparc/sparc64/rshift.s b/sysdeps/sparc/sparc64/rshift.s
new file mode 100644 (file)
index 0000000..971deec
--- /dev/null
@@ -0,0 +1,92 @@
+! SPARC v9 __mpn_rshift --
+
+! 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      %o0
+! src_ptr      %o1
+! size         %o2
+! cnt          %o3
+
+.section       ".text"
+       .align  4
+       .global __mpn_rshift
+       .type   __mpn_rshift,#function
+       .proc   04
+__mpn_rshift:
+       ldx     [%o1],%g2       ! load first limb
+       sub     %g0,%o3,%o5     ! negate shift count
+       add     %o2,-1,%o2
+       and     %o2,4-1,%g4     ! number of limbs in first loop
+       sllx    %g2,%o5,%g1     ! compute function result
+       brz,pn  %g4,.L0         ! if multiple of 4 limbs, skip first loop
+       stx     %g1,[%sp+80]
+
+       sub     %o2,%g4,%o2     ! adjust count for main loop
+
+.Loop0:        ldx     [%o1+8],%g3
+       add     %o0,8,%o0
+       add     %o1,8,%o1
+       add     %g4,-1,%g4
+       srlx    %g2,%o3,%o4
+       sllx    %g3,%o5,%g1
+       mov     %g3,%g2
+       or      %o4,%g1,%o4
+       brnz,pt %g4,.Loop0
+        stx    %o4,[%o0-8]
+
+.L0:   brz,pn  %o2,.Lend
+        nop
+
+.Loop: ldx     [%o1+8],%g3
+       add     %o0,32,%o0
+       add     %o2,-4,%o2
+       srlx    %g2,%o3,%o4
+       sllx    %g3,%o5,%g1
+
+       ldx     [%o1+16],%g2
+       srlx    %g3,%o3,%g4
+       or      %o4,%g1,%o4
+       stx     %o4,[%o0-32]
+       sllx    %g2,%o5,%g1
+
+       ldx     [%o1+24],%g3
+       srlx    %g2,%o3,%o4
+       or      %g4,%g1,%g4
+       stx     %g4,[%o0-24]
+       sllx    %g3,%o5,%g1
+
+       ldx     [%o1+32],%g2
+       srlx    %g3,%o3,%g4
+       or      %o4,%g1,%o4
+       stx     %o4,[%o0-16]
+       sllx    %g2,%o5,%g1
+
+       add     %o1,32,%o1
+       or      %g4,%g1,%g4
+       brnz    %o2,.Loop
+        stx    %g4,[%o0-8]
+
+.Lend: srlx    %g2,%o3,%g2
+       stx     %g2,[%o0-0]
+       retl
+       ldx     [%sp+80],%o0
+.LLfe1:
+       .size   __mpn_rshift,.LLfe1-__mpn_rshift
diff --git a/sysdeps/sparc/sparc64/sub_n.s b/sysdeps/sparc/sparc64/sub_n.s
new file mode 100644 (file)
index 0000000..7099bf4
--- /dev/null
@@ -0,0 +1,57 @@
+! SPARC v9 __mpn_sub_n -- Subtract two limb vectors of the same length > 0 and
+! store difference in a third limb vector.
+
+! Copyright (C) 1995, 1996 Free Software Foundation, Inc.
+
+! This file is part of the GNU MP Library.
+
+! The GNU MP Library is free software; you can redistribute it and/or modify
+! it under the terms of the GNU 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      %o0
+! s1_ptr       %o1
+! s2_ptr       %o2
+! size         %o3
+
+.section       ".text"
+       .align 4
+       .global __mpn_sub_n
+       .type    __mpn_sub_n,#function
+       .proc   04
+__mpn_sub_n:
+       sub %g0,%o3,%g3
+       sllx %o3,3,%g1
+       add %o1,%g1,%o1                 ! make s1_ptr point at end
+       add %o2,%g1,%o2                 ! make s2_ptr point at end
+       add %o0,%g1,%o0                 ! make res_ptr point at end
+       mov 0,%o4                       ! clear carry variable
+       sllx %g3,3,%o5                  ! compute initial address index
+
+.Loop: ldx [%o2+%o5],%g1               ! load s2 limb
+       add %g3,1,%g3                   ! increment loop count
+       ldx [%o1+%o5],%g2               ! load s1 limb
+       addcc %g1,%o4,%g1               ! add s2 limb and carry variable
+       movcc %xcc,0,%o4                ! if carry-out, o4 was 1; clear it
+       subcc %g1,%g2,%g1               ! subtract s1 limb from sum
+       stx %g1,[%o0+%o5]               ! store result
+       add %o5,8,%o5                   ! increment address index
+       brnz,pt %g3,.Loop
+       movcs %xcc,1,%o4                ! if s1 subtract gave carry, record it
+
+       retl
+       mov %o4,%o0
+.LLfe1:
+       .size    __mpn_sub_n,.LLfe1-__mpn_sub_n
diff --git a/sysdeps/sparc/sparc64/submul_1.s b/sysdeps/sparc/sparc64/submul_1.s
new file mode 100644 (file)
index 0000000..f0df38c
--- /dev/null
@@ -0,0 +1,88 @@
+! SPARC v9 __mpn_submul_1 -- Multiply a limb vector with a single limb and
+! subtract the product from a second limb vector.
+
+! 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      o0
+! s1_ptr       o1
+! size         o2
+! s2_limb      o3
+
+.section       ".text"
+       .align 4
+       .global __mpn_submul_1
+       .type    __mpn_submul_1,#function
+       .proc   016
+__mpn_submul_1:
+       !#PROLOGUE#     0
+       save    %sp,-160,%sp
+       !#PROLOGUE#     1
+       sub     %g0,%i2,%o7
+       sllx    %o7,3,%g5
+       sub     %i1,%g5,%o3
+       sub     %i0,%g5,%o4
+       mov     0,%o0                   ! zero cy_limb
+
+       srl     %i3,0,%o1               ! extract low 32 bits of s2_limb
+       srlx    %i3,32,%i3              ! extract high 32 bits of s2_limb
+       mov     1,%o2
+       sllx    %o2,32,%o2              ! o2 = 0x100000000
+
+       !   hi   !
+             !  mid-1 !
+             !  mid-2 !
+                !   lo   !
+.Loop:
+       sllx    %o7,3,%g1
+       ldx     [%o3+%g1],%g5
+       srl     %g5,0,%i0               ! zero hi bits
+       srlx    %g5,32,%g5
+       mulx    %o1,%i0,%i4             ! lo product
+       mulx    %i3,%i0,%i1             ! mid-1 product
+       mulx    %o1,%g5,%l2             ! mid-2 product
+       mulx    %i3,%g5,%i5             ! hi product
+       srlx    %i4,32,%i0              ! extract high 32 bits of lo product...
+       add     %i1,%i0,%i1             ! ...and add it to the mid-1 product
+       addcc   %i1,%l2,%i1             ! add mid products
+       mov     0,%l0                   ! we need the carry from that add...
+       movcs   %xcc,%o2,%l0            ! ...compute it and...
+       add     %i5,%l0,%i5             ! ...add to bit 32 of the hi product
+       sllx    %i1,32,%i0              ! align low bits of mid product
+       srl     %i4,0,%g5               ! zero high 32 bits of lo product
+       add     %i0,%g5,%i0             ! combine into low 64 bits of result
+       srlx    %i1,32,%i1              ! extract high bits of mid product...
+       add     %i5,%i1,%i1             ! ...and add them to the high result
+       addcc   %i0,%o0,%i0             ! add cy_limb to low 64 bits of result
+       mov     0,%g5
+       movcs   %xcc,1,%g5
+       add     %o7,1,%o7
+       ldx     [%o4+%g1],%l1
+       subcc   %l1,%i0,%i0
+       movcs   %xcc,1,%g5
+       stx     %i0,[%o4+%g1]
+       brnz    %o7,.Loop
+       add     %i1,%g5,%o0             ! compute new cy_limb
+
+       mov     %o0,%i0
+       ret
+       restore
+.LLfe1:
+       .size  __mpn_submul_1,.LLfe1-__mpn_submul_1
index d1de0c3..1cf5128 100644 (file)
@@ -1,7 +1,7 @@
 ! SPARC v8 __mpn_addmul_1 -- Multiply a limb vector with a limb and
 ! add the result to a second limb vector.
 
-! Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc.
+! Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
 
 ! This file is part of the GNU MP Library.
 
index 42717be..d56394e 100644 (file)
@@ -1,7 +1,7 @@
 ! SPARC v8 __mpn_mul_1 -- Multiply a limb vector with a single limb and
 ! store the product 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 2e217ed..9ff5b7b 100644 (file)
@@ -1,7 +1,7 @@
-! sparc __mpn_sub_n -- Subtract two limb vectors of the same length > 0 and
+! SPARC __mpn_sub_n -- Subtract two limb vectors of the same length > 0 and
 ! store difference in a third limb vector.
 
-! Copyright (C) 1995 Free Software Foundation, Inc.
+! Copyright (C) 1995, 1996 Free Software Foundation, Inc.
 
 ! This file is part of the GNU MP Library.
 
@@ -38,7 +38,7 @@ C_SYMBOL_NAME(__mpn_sub_n):
        nop
 ! **  V1a  **
        andcc   res_ptr,4,%g0           ! res_ptr unaligned? Side effect: cy=0
-       beq     L_v1                    ! if no, branch
+       be      L_v1                    ! if no, branch
        nop
 /* Add least significant limb separately to align res_ptr and s2_ptr */
        ld      [s1_ptr],%g4
@@ -133,9 +133,9 @@ L1: xor     s1_ptr,res_ptr,%g1
        nop
 ! **  V1b  **
        andcc   res_ptr,4,%g0           ! res_ptr unaligned? Side effect: cy=0
-       beq     L_v1b                   ! if no, branch
+       be      L_v1b                   ! if no, branch
        nop
-/* Add least significant limb separately to align res_ptr and s2_ptr */
+/* Add least significant limb separately to align res_ptr and s1_ptr */
        ld      [s2_ptr],%g4
        add     s2_ptr,4,s2_ptr
        ld      [s1_ptr],%g2
@@ -232,7 +232,7 @@ L2: cmp     size,1
        be      Ljone
        nop
        andcc   s1_ptr,4,%g0            ! s1_ptr unaligned? Side effect: cy=0
-       beq     L_v2                    ! if no, branch
+       be      L_v2                    ! if no, branch
        nop
 /* Add least significant limb separately to align s1_ptr and s2_ptr */
        ld      [s1_ptr],%g4