mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-29 11:41:21 +03:00
* stdlib/Makefile (mpn-stuff): New target.
(copy-mpn): Use it. * Code copied from GMP updated to 1.937 version. * stdlib/strtod.c (HAVE_ALLOCA): Define this for gmp headers.
This commit is contained in:
57
sysdeps/sparc/sparc64/add_n.s
Normal file
57
sysdeps/sparc/sparc64/add_n.s
Normal file
@ -0,0 +1,57 @@
|
||||
! 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., 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_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
|
88
sysdeps/sparc/sparc64/addmul_1.s
Normal file
88
sysdeps/sparc/sparc64/addmul_1.s
Normal file
@ -0,0 +1,88 @@
|
||||
! 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., 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_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
|
26
sysdeps/sparc/sparc64/gmp-mparam.h
Normal file
26
sysdeps/sparc/sparc64/gmp-mparam.h
Normal file
@ -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
|
95
sysdeps/sparc/sparc64/lshift.s
Normal file
95
sysdeps/sparc/sparc64/lshift.s
Normal file
@ -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
|
85
sysdeps/sparc/sparc64/mul_1.s
Normal file
85
sysdeps/sparc/sparc64/mul_1.s
Normal file
@ -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
|
92
sysdeps/sparc/sparc64/rshift.s
Normal file
92
sysdeps/sparc/sparc64/rshift.s
Normal file
@ -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
|
57
sysdeps/sparc/sparc64/sub_n.s
Normal file
57
sysdeps/sparc/sparc64/sub_n.s
Normal file
@ -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
|
88
sysdeps/sparc/sparc64/submul_1.s
Normal file
88
sysdeps/sparc/sparc64/submul_1.s
Normal file
@ -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
|
Reference in New Issue
Block a user