[project @ 1998-06-05 14:44:10 by simonm]
authorsimonm <unknown>
Fri, 5 Jun 1998 14:44:12 +0000 (14:44 +0000)
committersimonm <unknown>
Fri, 5 Jun 1998 14:44:12 +0000 (14:44 +0000)
Initial revision

ghc/rts/gmp/mpn/sparc64/add_n.s [new file with mode: 0644]
ghc/rts/gmp/mpn/sparc64/addmul_1.s [new file with mode: 0644]
ghc/rts/gmp/mpn/sparc64/lshift.s [new file with mode: 0644]
ghc/rts/gmp/mpn/sparc64/mul_1.s [new file with mode: 0644]
ghc/rts/gmp/mpn/sparc64/rshift.s [new file with mode: 0644]
ghc/rts/gmp/mpn/sparc64/sub_n.s [new file with mode: 0644]
ghc/rts/gmp/mpn/sparc64/submul_1.s [new file with mode: 0644]

diff --git a/ghc/rts/gmp/mpn/sparc64/add_n.s b/ghc/rts/gmp/mpn/sparc64/add_n.s
new file mode 100644 (file)
index 0000000..01d1f49
--- /dev/null
@@ -0,0 +1,58 @@
+! SPARC v9 __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., 59 Temple Place - Suite 330, Boston,
+! MA 02111-1307, USA.
+
+
+! INPUT PARAMETERS
+! res_ptr      %o0
+! s1_ptr       %o1
+! s2_ptr       %o2
+! size         %o3
+
+.section       ".text"
+       .align 4
+       .global __mpn_add_n
+       .type    __mpn_add_n,#function
+       .proc   04
+__mpn_add_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
+       addcc %g1,%g2,%g1               ! add s1 limb to sum
+       stx %g1,[%o0+%o5]               ! store result
+       add %o5,8,%o5                   ! increment address index
+       brnz,pt %g3,.Loop
+       movcs %xcc,1,%o4                ! if s1 add gave carry, record it
+
+       retl
+       mov %o4,%o0
+.LLfe1:
+       .size    __mpn_add_n,.LLfe1-__mpn_add_n
diff --git a/ghc/rts/gmp/mpn/sparc64/addmul_1.s b/ghc/rts/gmp/mpn/sparc64/addmul_1.s
new file mode 100644 (file)
index 0000000..8d86390
--- /dev/null
@@ -0,0 +1,89 @@
+! SPARC v9 __mpn_addmul_1 -- Multiply a limb vector with a single limb and
+! add the product to 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., 59 Temple Place - Suite 330, Boston,
+! MA 02111-1307, USA.
+
+
+! INPUT PARAMETERS
+! res_ptr      o0
+! s1_ptr       o1
+! size         o2
+! s2_limb      o3
+
+.section       ".text"
+       .align 4
+       .global __mpn_addmul_1
+       .type    __mpn_addmul_1,#function
+       .proc   016
+__mpn_addmul_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
+       addcc   %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_addmul_1,.LLfe1-__mpn_addmul_1
diff --git a/ghc/rts/gmp/mpn/sparc64/lshift.s b/ghc/rts/gmp/mpn/sparc64/lshift.s
new file mode 100644 (file)
index 0000000..ad1f667
--- /dev/null
@@ -0,0 +1,96 @@
+! 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., 59 Temple Place - Suite 330, Boston,
+! MA 02111-1307, 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/ghc/rts/gmp/mpn/sparc64/mul_1.s b/ghc/rts/gmp/mpn/sparc64/mul_1.s
new file mode 100644 (file)
index 0000000..91d6eb0
--- /dev/null
@@ -0,0 +1,86 @@
+! 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., 59 Temple Place - Suite 330, Boston,
+! MA 02111-1307, 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/ghc/rts/gmp/mpn/sparc64/rshift.s b/ghc/rts/gmp/mpn/sparc64/rshift.s
new file mode 100644 (file)
index 0000000..ff6a380
--- /dev/null
@@ -0,0 +1,93 @@
+! 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., 59 Temple Place - Suite 330, Boston,
+! MA 02111-1307, 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/ghc/rts/gmp/mpn/sparc64/sub_n.s b/ghc/rts/gmp/mpn/sparc64/sub_n.s
new file mode 100644 (file)
index 0000000..d4842b8
--- /dev/null
@@ -0,0 +1,58 @@
+! 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., 59 Temple Place - Suite 330, Boston,
+! MA 02111-1307, 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/ghc/rts/gmp/mpn/sparc64/submul_1.s b/ghc/rts/gmp/mpn/sparc64/submul_1.s
new file mode 100644 (file)
index 0000000..e796243
--- /dev/null
@@ -0,0 +1,89 @@
+! 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., 59 Temple Place - Suite 330, Boston,
+! MA 02111-1307, 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