mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-22 13:00:06 +00:00
Add 64-bit VIS3 optimized GMP routines for sparc.
* math/Makefile: Recognize gmp-sysdep_routines. * sysdeps/sparc/sparc64/multiarch/Makefile: Add VIS3 optimized GMP routines to sysdeps. * sysdeps/sparc/sparc64/multiarch/add_n-vis3.S: New file. * sysdeps/sparc/sparc64/multiarch/add_n.S: New file. * sysdeps/sparc/sparc64/multiarch/addmul_1-vis3.S: New file. * sysdeps/sparc/sparc64/multiarch/addmul_1.S: New file. * sysdeps/sparc/sparc64/multiarch/mul_1-vis3.S: New file. * sysdeps/sparc/sparc64/multiarch/mul_1.S: New file. * sysdeps/sparc/sparc64/multiarch/sub_n-vis3.S: New file. * sysdeps/sparc/sparc64/multiarch/sub_n.S: New file. * sysdeps/sparc/sparc64/multiarch/submul_1-vis3.S: New file. * sysdeps/sparc/sparc64/multiarch/submul_1.S: New file.
This commit is contained in:
parent
4ae4244d4b
commit
32fcb36dbf
14
ChangeLog
14
ChangeLog
@ -1,5 +1,19 @@
|
||||
2013-01-11 David S. Miller <davem@davemloft.net>
|
||||
|
||||
* math/Makefile: Recognize gmp-sysdep_routines.
|
||||
* sysdeps/sparc/sparc64/multiarch/Makefile: Add VIS3 optimized GMP routines
|
||||
to sysdeps.
|
||||
* sysdeps/sparc/sparc64/multiarch/add_n-vis3.S: New file.
|
||||
* sysdeps/sparc/sparc64/multiarch/add_n.S: New file.
|
||||
* sysdeps/sparc/sparc64/multiarch/addmul_1-vis3.S: New file.
|
||||
* sysdeps/sparc/sparc64/multiarch/addmul_1.S: New file.
|
||||
* sysdeps/sparc/sparc64/multiarch/mul_1-vis3.S: New file.
|
||||
* sysdeps/sparc/sparc64/multiarch/mul_1.S: New file.
|
||||
* sysdeps/sparc/sparc64/multiarch/sub_n-vis3.S: New file.
|
||||
* sysdeps/sparc/sparc64/multiarch/sub_n.S: New file.
|
||||
* sysdeps/sparc/sparc64/multiarch/submul_1-vis3.S: New file.
|
||||
* sysdeps/sparc/sparc64/multiarch/submul_1.S: New file.
|
||||
|
||||
* sysdeps/sparc/sparc32/sparcv9/mul_1.S: Properly optimize for 32-bit
|
||||
sparc V9 rather than using V8 code.
|
||||
* sysdeps/sparc/sparc32/sparcv9/addmul_1.S: Likewise.
|
||||
|
@ -199,7 +199,8 @@ endif
|
||||
|
||||
gmp-objs = $(patsubst %,$(common-objpfx)stdlib/%.o,\
|
||||
add_n sub_n cmp addmul_1 mul_1 mul_n divmod_1 \
|
||||
lshift rshift mp_clz_tab udiv_qrnnd inlines)
|
||||
lshift rshift mp_clz_tab udiv_qrnnd inlines \
|
||||
$(gmp-sysdep_routines))
|
||||
$(objpfx)atest-exp: $(gmp-objs)
|
||||
$(objpfx)atest-sincos: $(gmp-objs)
|
||||
$(objpfx)atest-exp2: $(gmp-objs)
|
||||
|
@ -10,3 +10,11 @@ ifeq ($(subdir),string)
|
||||
sysdep_routines += memcpy-ultra3 memcpy-niagara1 memcpy-niagara2 \
|
||||
memset-niagara1 memcpy-niagara4 memset-niagara4
|
||||
endif
|
||||
|
||||
ifeq ($(subdir),stdlib)
|
||||
sysdep_routines += mul_1-vis3 addmul_1-vis3 submul_1-vis3 add_n-vis3 sub_n-vis3
|
||||
endif
|
||||
|
||||
ifeq ($(subdir),math)
|
||||
gmp-sysdep_routines = mul_1-vis3 addmul_1-vis3 submul_1-vis3 add_n-vis3 sub_n-vis3
|
||||
endif
|
||||
|
67
sysdeps/sparc/sparc64/multiarch/add_n-vis3.S
Normal file
67
sysdeps/sparc/sparc64/multiarch/add_n-vis3.S
Normal file
@ -0,0 +1,67 @@
|
||||
! SPARC v9 64-bit VIS3 __mpn_add_n -- Add two limb vectors of the same length > 0 and
|
||||
! store sum in a third limb vector.
|
||||
!
|
||||
! Copyright (C) 2013 Free Software Foundation, Inc.
|
||||
! This file is part of the GNU C Library.
|
||||
! Contributed by David S. Miller <davem@davemloft.net>
|
||||
!
|
||||
! The GNU C Library is free software; you can redistribute it and/or
|
||||
! modify it under the terms of the GNU Lesser General Public
|
||||
! License as published by the Free Software Foundation; either
|
||||
! version 2.1 of the License, or (at your option) any later version.
|
||||
!
|
||||
! The GNU C 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
|
||||
! Lesser General Public License for more details.
|
||||
!
|
||||
! You should have received a copy of the GNU Lesser General Public
|
||||
! License along with the GNU C Library; if not, see
|
||||
! <http://www.gnu.org/licenses/>.
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
#define res_ptr %o0
|
||||
#define s1_ptr %o1
|
||||
#define s2_ptr %o2
|
||||
#define sz %o3
|
||||
#define tmp1 %g1
|
||||
#define tmp2 %g2
|
||||
#define tmp3 %g3
|
||||
#define tmp4 %o4
|
||||
|
||||
.register %g2,#scratch
|
||||
.register %g3,#scratch
|
||||
ENTRY(__mpn_add_n_vis3)
|
||||
subcc sz, 1, sz
|
||||
be .Lfinal_limb
|
||||
cmp %g0, 0
|
||||
|
||||
.Lloop:
|
||||
ldx [s2_ptr + 0x00], tmp1
|
||||
add s2_ptr, 0x10, s2_ptr
|
||||
ldx [s1_ptr + 0x00], tmp2
|
||||
add s1_ptr, 0x10, s1_ptr
|
||||
ldx [s2_ptr - 0x08], tmp3
|
||||
add res_ptr, 0x10, res_ptr
|
||||
ldx [s1_ptr - 0x08], tmp4
|
||||
sub sz, 2, sz
|
||||
addxccc tmp1, tmp2, tmp1
|
||||
stx tmp1, [res_ptr - 0x10]
|
||||
addxccc tmp3, tmp4, tmp3
|
||||
brgz sz, .Lloop
|
||||
stx tmp3, [res_ptr - 0x08]
|
||||
|
||||
brlz,pt sz, .Lfinish
|
||||
nop
|
||||
|
||||
.Lfinal_limb:
|
||||
ldx [s2_ptr + 0x00], tmp1
|
||||
ldx [s1_ptr + 0x00], tmp2
|
||||
addxccc tmp1, tmp2, tmp1
|
||||
stx tmp1, [res_ptr + 0x00]
|
||||
|
||||
.Lfinish:
|
||||
retl
|
||||
addxc %g0, %g0, %o0
|
||||
END(__mpn_add_n_vis3)
|
56
sysdeps/sparc/sparc64/multiarch/add_n.S
Normal file
56
sysdeps/sparc/sparc64/multiarch/add_n.S
Normal file
@ -0,0 +1,56 @@
|
||||
/* Multiple versions of add_n
|
||||
|
||||
Copyright (C) 2013 Free Software Foundation, Inc.
|
||||
Contributed by David S. Miller (davem@davemloft.net)
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
ENTRY(__mpn_add_n)
|
||||
.type __mpn_add_n, @gnu_indirect_function
|
||||
# ifdef SHARED
|
||||
SETUP_PIC_REG_LEAF(o3, o5)
|
||||
# endif
|
||||
set HWCAP_SPARC_VIS3, %o1
|
||||
andcc %o0, %o1, %g0
|
||||
be 1f
|
||||
nop
|
||||
# ifdef SHARED
|
||||
sethi %gdop_hix22(__mpn_add_n_vis3), %o1
|
||||
xor %o1, %gdop_lox10(__mpn_add_n_vis3), %o1
|
||||
# else
|
||||
set __mpn_add_n_vis3, %o1
|
||||
# endif
|
||||
ba 10f
|
||||
nop
|
||||
1:
|
||||
# ifdef SHARED
|
||||
sethi %gdop_hix22(__mpn_add_n_generic), %o1
|
||||
xor %o1, %gdop_lox10(__mpn_add_n_generic), %o1
|
||||
# else
|
||||
set __mpn_add_n_vis3, %o1
|
||||
# endif
|
||||
10:
|
||||
# ifdef SHARED
|
||||
add %o3, %o1, %o1
|
||||
# endif
|
||||
retl
|
||||
mov %o1, %o0
|
||||
END(__mpn_add_n)
|
||||
|
||||
#define __mpn_add_n __mpn_add_n_generic
|
||||
#include "../add_n.S"
|
87
sysdeps/sparc/sparc64/multiarch/addmul_1-vis3.S
Normal file
87
sysdeps/sparc/sparc64/multiarch/addmul_1-vis3.S
Normal file
@ -0,0 +1,87 @@
|
||||
! SPARC v9 64-bit VIS3 __mpn_addmul_1 -- Multiply a limb vector with a
|
||||
! limb and add the result to a second limb vector.
|
||||
!
|
||||
! Copyright (C) 2013 Free Software Foundation, Inc.
|
||||
! This file is part of the GNU C Library.
|
||||
! Contributed by David S. Miller <davem@davemloft.net>
|
||||
!
|
||||
! The GNU C Library is free software; you can redistribute it and/or
|
||||
! modify it under the terms of the GNU Lesser General Public
|
||||
! License as published by the Free Software Foundation; either
|
||||
! version 2.1 of the License, or (at your option) any later version.
|
||||
!
|
||||
! The GNU C 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
|
||||
! Lesser General Public License for more details.
|
||||
!
|
||||
! You should have received a copy of the GNU Lesser General Public
|
||||
! License along with the GNU C Library; if not, see
|
||||
! <http://www.gnu.org/licenses/>.
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
#define res_ptr %i0
|
||||
#define s1_ptr %i1
|
||||
#define sz %i2
|
||||
#define s2_limb %i3
|
||||
#define carry %o5
|
||||
#define tmp1 %g1
|
||||
#define tmp2 %g2
|
||||
#define tmp3 %g3
|
||||
#define tmp4 %o4
|
||||
#define tmp5 %l0
|
||||
#define tmp6 %l1
|
||||
#define tmp7 %l2
|
||||
#define tmp8 %l3
|
||||
|
||||
.register %g2,#scratch
|
||||
.register %g3,#scratch
|
||||
ENTRY(__mpn_addmul_1_vis3)
|
||||
save %sp, -176, %sp
|
||||
subcc sz, 1, sz
|
||||
be .Lfinal_limb
|
||||
clr carry
|
||||
|
||||
.Lloop:
|
||||
ldx [s1_ptr + 0x00], tmp1
|
||||
ldx [res_ptr + 0x00], tmp3
|
||||
ldx [s1_ptr + 0x08], tmp2
|
||||
ldx [res_ptr + 0x08], tmp4
|
||||
mulx tmp1, s2_limb, tmp5
|
||||
add s1_ptr, 0x10, s1_ptr
|
||||
umulxhi tmp1, s2_limb, tmp6
|
||||
add res_ptr, 0x10, res_ptr
|
||||
mulx tmp2, s2_limb, tmp7
|
||||
sub sz, 2, sz
|
||||
umulxhi tmp2, s2_limb, tmp8
|
||||
addcc carry, tmp5, tmp5
|
||||
addxc %g0, tmp6, carry
|
||||
addcc tmp3, tmp5, tmp5
|
||||
addxc %g0, carry, carry
|
||||
stx tmp5, [res_ptr - 0x10]
|
||||
addcc carry, tmp7, tmp7
|
||||
addxc %g0, tmp8, carry
|
||||
addcc tmp4, tmp7, tmp7
|
||||
addxc %g0, carry, carry
|
||||
brgz sz, .Lloop
|
||||
stx tmp7, [res_ptr - 0x08]
|
||||
|
||||
brlz,pt sz, .Lfinish
|
||||
nop
|
||||
|
||||
.Lfinal_limb:
|
||||
ldx [s1_ptr + 0x00], tmp1
|
||||
ldx [res_ptr + 0x00], tmp3
|
||||
mulx tmp1, s2_limb, tmp5
|
||||
umulxhi tmp1, s2_limb, tmp6
|
||||
addcc carry, tmp5, tmp5
|
||||
addxc %g0, tmp6, carry
|
||||
addcc tmp3, tmp5, tmp5
|
||||
addxc %g0, carry, carry
|
||||
stx tmp5, [res_ptr + 0x00]
|
||||
|
||||
.Lfinish:
|
||||
jmpl %i7 + 8, %g0
|
||||
restore carry, 0, %o0
|
||||
END(__mpn_addmul_1_vis3)
|
56
sysdeps/sparc/sparc64/multiarch/addmul_1.S
Normal file
56
sysdeps/sparc/sparc64/multiarch/addmul_1.S
Normal file
@ -0,0 +1,56 @@
|
||||
/* Multiple versions of addmul_1
|
||||
|
||||
Copyright (C) 2013 Free Software Foundation, Inc.
|
||||
Contributed by David S. Miller (davem@davemloft.net)
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
ENTRY(__mpn_addmul_1)
|
||||
.type __mpn_addmul_1, @gnu_indirect_function
|
||||
# ifdef SHARED
|
||||
SETUP_PIC_REG_LEAF(o3, o5)
|
||||
# endif
|
||||
set HWCAP_SPARC_VIS3, %o1
|
||||
andcc %o0, %o1, %g0
|
||||
be 1f
|
||||
nop
|
||||
# ifdef SHARED
|
||||
sethi %gdop_hix22(__mpn_addmul_1_vis3), %o1
|
||||
xor %o1, %gdop_lox10(__mpn_addmul_1_vis3), %o1
|
||||
# else
|
||||
set __mpn_addmul_1_vis3, %o1
|
||||
# endif
|
||||
ba 10f
|
||||
nop
|
||||
1:
|
||||
# ifdef SHARED
|
||||
sethi %gdop_hix22(__mpn_addmul_1_generic), %o1
|
||||
xor %o1, %gdop_lox10(__mpn_addmul_1_generic), %o1
|
||||
# else
|
||||
set __mpn_addmul_1_vis3, %o1
|
||||
# endif
|
||||
10:
|
||||
# ifdef SHARED
|
||||
add %o3, %o1, %o1
|
||||
# endif
|
||||
retl
|
||||
mov %o1, %o0
|
||||
END(__mpn_addmul_1)
|
||||
|
||||
#define __mpn_addmul_1 __mpn_addmul_1_generic
|
||||
#include "../addmul_1.S"
|
73
sysdeps/sparc/sparc64/multiarch/mul_1-vis3.S
Normal file
73
sysdeps/sparc/sparc64/multiarch/mul_1-vis3.S
Normal file
@ -0,0 +1,73 @@
|
||||
! SPARC v9 64-bit VIS3 __mpn_mul_1 -- Multiply a limb vector with a single
|
||||
! limb and store the product in a second limb vector.
|
||||
!
|
||||
! Copyright (C) 2013 Free Software Foundation, Inc.
|
||||
! This file is part of the GNU C Library.
|
||||
! Contributed by David S. Miller <davem@davemloft.net>
|
||||
!
|
||||
! The GNU C Library is free software; you can redistribute it and/or
|
||||
! modify it under the terms of the GNU Lesser General Public
|
||||
! License as published by the Free Software Foundation; either
|
||||
! version 2.1 of the License, or (at your option) any later version.
|
||||
!
|
||||
! The GNU C 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
|
||||
! Lesser General Public License for more details.
|
||||
!
|
||||
! You should have received a copy of the GNU Lesser General Public
|
||||
! License along with the GNU C Library; if not, see
|
||||
! <http://www.gnu.org/licenses/>.
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
#define res_ptr %o0
|
||||
#define s1_ptr %o1
|
||||
#define sz %o2
|
||||
#define s2_limb %o3
|
||||
#define carry %o5
|
||||
#define tmp1 %g1
|
||||
#define tmp2 %g2
|
||||
#define tmp3 %g3
|
||||
#define tmp4 %o4
|
||||
|
||||
.register %g2,#scratch
|
||||
.register %g3,#scratch
|
||||
ENTRY(__mpn_mul_1_vis3)
|
||||
subcc sz, 1, sz
|
||||
be .Lfinal_limb
|
||||
clr carry
|
||||
|
||||
.Lloop:
|
||||
ldx [s1_ptr + 0x00], tmp1
|
||||
ldx [s1_ptr + 0x08], tmp4
|
||||
mulx tmp1, s2_limb, tmp3
|
||||
add s1_ptr, 0x10, s1_ptr
|
||||
umulxhi tmp1, s2_limb, tmp2
|
||||
sub sz, 2, sz
|
||||
mulx tmp4, s2_limb, tmp1
|
||||
add res_ptr, 0x10, res_ptr
|
||||
umulxhi tmp4, s2_limb, tmp4
|
||||
addcc carry, tmp3, tmp3
|
||||
stx tmp3, [res_ptr - 0x10]
|
||||
addxc %g0, tmp2, carry
|
||||
addcc carry, tmp1, tmp1
|
||||
addxc %g0, tmp4, carry
|
||||
brgz sz, .Lloop
|
||||
stx tmp1, [res_ptr - 0x08]
|
||||
|
||||
brlz,pt sz, .Lfinish
|
||||
nop
|
||||
|
||||
.Lfinal_limb:
|
||||
ldx [s1_ptr + 0x00], tmp1
|
||||
mulx tmp1, s2_limb, tmp3
|
||||
umulxhi tmp1, s2_limb, tmp2
|
||||
addcc carry, tmp3, tmp3
|
||||
addxc %g0, tmp2, carry
|
||||
stx tmp3, [res_ptr + 0x00]
|
||||
|
||||
.Lfinish:
|
||||
retl
|
||||
mov carry, %o0
|
||||
END(__mpn_mul_1_vis3)
|
56
sysdeps/sparc/sparc64/multiarch/mul_1.S
Normal file
56
sysdeps/sparc/sparc64/multiarch/mul_1.S
Normal file
@ -0,0 +1,56 @@
|
||||
/* Multiple versions of mul_1
|
||||
|
||||
Copyright (C) 2013 Free Software Foundation, Inc.
|
||||
Contributed by David S. Miller (davem@davemloft.net)
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
ENTRY(__mpn_mul_1)
|
||||
.type __mpn_mul_1, @gnu_indirect_function
|
||||
# ifdef SHARED
|
||||
SETUP_PIC_REG_LEAF(o3, o5)
|
||||
# endif
|
||||
set HWCAP_SPARC_VIS3, %o1
|
||||
andcc %o0, %o1, %g0
|
||||
be 1f
|
||||
nop
|
||||
# ifdef SHARED
|
||||
sethi %gdop_hix22(__mpn_mul_1_vis3), %o1
|
||||
xor %o1, %gdop_lox10(__mpn_mul_1_vis3), %o1
|
||||
# else
|
||||
set __mpn_mul_1_vis3, %o1
|
||||
# endif
|
||||
ba 10f
|
||||
nop
|
||||
1:
|
||||
# ifdef SHARED
|
||||
sethi %gdop_hix22(__mpn_mul_1_generic), %o1
|
||||
xor %o1, %gdop_lox10(__mpn_mul_1_generic), %o1
|
||||
# else
|
||||
set __mpn_mul_1_vis3, %o1
|
||||
# endif
|
||||
10:
|
||||
# ifdef SHARED
|
||||
add %o3, %o1, %o1
|
||||
# endif
|
||||
retl
|
||||
mov %o1, %o0
|
||||
END(__mpn_mul_1)
|
||||
|
||||
#define __mpn_mul_1 __mpn_mul_1_generic
|
||||
#include "../mul_1.S"
|
71
sysdeps/sparc/sparc64/multiarch/sub_n-vis3.S
Normal file
71
sysdeps/sparc/sparc64/multiarch/sub_n-vis3.S
Normal file
@ -0,0 +1,71 @@
|
||||
! SPARC v9 64-bit VIS3 __mpn_sub_n -- Subtract two limb vectors of the same length > 0
|
||||
! and store difference in a third limb vector.
|
||||
!
|
||||
! Copyright (C) 2013 Free Software Foundation, Inc.
|
||||
! This file is part of the GNU C Library.
|
||||
! Contributed by David S. Miller <davem@davemloft.net>
|
||||
!
|
||||
! The GNU C Library is free software; you can redistribute it and/or
|
||||
! modify it under the terms of the GNU Lesser General Public
|
||||
! License as published by the Free Software Foundation; either
|
||||
! version 2.1 of the License, or (at your option) any later version.
|
||||
!
|
||||
! The GNU C 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
|
||||
! Lesser General Public License for more details.
|
||||
!
|
||||
! You should have received a copy of the GNU Lesser General Public
|
||||
! License along with the GNU C Library; if not, see
|
||||
! <http://www.gnu.org/licenses/>.
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
#define res_ptr %o0
|
||||
#define s1_ptr %o1
|
||||
#define s2_ptr %o2
|
||||
#define sz %o3
|
||||
#define tmp1 %g1
|
||||
#define tmp2 %g2
|
||||
#define tmp3 %g3
|
||||
#define tmp4 %o4
|
||||
|
||||
.register %g2,#scratch
|
||||
.register %g3,#scratch
|
||||
ENTRY(__mpn_sub_n_vis3)
|
||||
subcc sz, 1, sz
|
||||
be .Lfinal_limb
|
||||
cmp %g0, 1
|
||||
|
||||
.Lloop:
|
||||
ldx [s2_ptr + 0x00], tmp1
|
||||
add s2_ptr, 0x10, s2_ptr
|
||||
ldx [s1_ptr + 0x00], tmp2
|
||||
add s1_ptr, 0x10, s1_ptr
|
||||
ldx [s2_ptr - 0x08], tmp3
|
||||
add res_ptr, 0x10, res_ptr
|
||||
ldx [s1_ptr - 0x08], tmp4
|
||||
sub sz, 2, sz
|
||||
xnor tmp1, %g0, tmp1
|
||||
addxccc tmp1, tmp2, tmp1
|
||||
stx tmp1, [res_ptr - 0x10]
|
||||
xnor tmp3, %g0, tmp3
|
||||
addxccc tmp3, tmp4, tmp3
|
||||
brgz sz, .Lloop
|
||||
stx tmp3, [res_ptr - 0x08]
|
||||
|
||||
brlz,pt sz, .Lfinish
|
||||
nop
|
||||
|
||||
.Lfinal_limb:
|
||||
ldx [s2_ptr + 0x00], tmp1
|
||||
ldx [s1_ptr + 0x00], tmp2
|
||||
xnor tmp1, %g0, tmp1
|
||||
addxccc tmp1, tmp2, tmp1
|
||||
stx tmp1, [res_ptr + 0x00]
|
||||
|
||||
.Lfinish:
|
||||
clr %o0
|
||||
retl
|
||||
movcc %xcc, 1, %o0
|
||||
END(__mpn_sub_n_vis3)
|
56
sysdeps/sparc/sparc64/multiarch/sub_n.S
Normal file
56
sysdeps/sparc/sparc64/multiarch/sub_n.S
Normal file
@ -0,0 +1,56 @@
|
||||
/* Multiple versions of sub_n
|
||||
|
||||
Copyright (C) 2013 Free Software Foundation, Inc.
|
||||
Contributed by David S. Miller (davem@davemloft.net)
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
ENTRY(__mpn_sub_n)
|
||||
.type __mpn_sub_n, @gnu_indirect_function
|
||||
# ifdef SHARED
|
||||
SETUP_PIC_REG_LEAF(o3, o5)
|
||||
# endif
|
||||
set HWCAP_SPARC_VIS3, %o1
|
||||
andcc %o0, %o1, %g0
|
||||
be 1f
|
||||
nop
|
||||
# ifdef SHARED
|
||||
sethi %gdop_hix22(__mpn_sub_n_vis3), %o1
|
||||
xor %o1, %gdop_lox10(__mpn_sub_n_vis3), %o1
|
||||
# else
|
||||
set __mpn_sub_n_vis3, %o1
|
||||
# endif
|
||||
ba 10f
|
||||
nop
|
||||
1:
|
||||
# ifdef SHARED
|
||||
sethi %gdop_hix22(__mpn_sub_n_generic), %o1
|
||||
xor %o1, %gdop_lox10(__mpn_sub_n_generic), %o1
|
||||
# else
|
||||
set __mpn_sub_n_vis3, %o1
|
||||
# endif
|
||||
10:
|
||||
# ifdef SHARED
|
||||
add %o3, %o1, %o1
|
||||
# endif
|
||||
retl
|
||||
mov %o1, %o0
|
||||
END(__mpn_sub_n)
|
||||
|
||||
#define __mpn_sub_n __mpn_sub_n_generic
|
||||
#include "../sub_n.S"
|
87
sysdeps/sparc/sparc64/multiarch/submul_1-vis3.S
Normal file
87
sysdeps/sparc/sparc64/multiarch/submul_1-vis3.S
Normal file
@ -0,0 +1,87 @@
|
||||
! SPARC v9 64-bit VIS3 __mpn_submul_1 -- Multiply a limb vector with a
|
||||
! limb and subtract the result from a second limb vector.
|
||||
!
|
||||
! Copyright (C) 2013 Free Software Foundation, Inc.
|
||||
! This file is part of the GNU C Library.
|
||||
! Contributed by David S. Miller <davem@davemloft.net>
|
||||
!
|
||||
! The GNU C Library is free software; you can redistribute it and/or
|
||||
! modify it under the terms of the GNU Lesser General Public
|
||||
! License as published by the Free Software Foundation; either
|
||||
! version 2.1 of the License, or (at your option) any later version.
|
||||
!
|
||||
! The GNU C 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
|
||||
! Lesser General Public License for more details.
|
||||
!
|
||||
! You should have received a copy of the GNU Lesser General Public
|
||||
! License along with the GNU C Library; if not, see
|
||||
! <http://www.gnu.org/licenses/>.
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
#define res_ptr %i0
|
||||
#define s1_ptr %i1
|
||||
#define sz %i2
|
||||
#define s2_limb %i3
|
||||
#define carry %o5
|
||||
#define tmp1 %g1
|
||||
#define tmp2 %g2
|
||||
#define tmp3 %g3
|
||||
#define tmp4 %o4
|
||||
#define tmp5 %l0
|
||||
#define tmp6 %l1
|
||||
#define tmp7 %l2
|
||||
#define tmp8 %l3
|
||||
|
||||
.register %g2,#scratch
|
||||
.register %g3,#scratch
|
||||
ENTRY(__mpn_submul_1_vis3)
|
||||
save %sp, -176, %sp
|
||||
subcc sz, 1, sz
|
||||
be .Lfinal_limb
|
||||
clr carry
|
||||
|
||||
.Lloop:
|
||||
ldx [s1_ptr + 0x00], tmp1
|
||||
ldx [res_ptr + 0x00], tmp3
|
||||
ldx [s1_ptr + 0x08], tmp2
|
||||
ldx [res_ptr + 0x08], tmp4
|
||||
mulx tmp1, s2_limb, tmp5
|
||||
add s1_ptr, 0x10, s1_ptr
|
||||
umulxhi tmp1, s2_limb, tmp6
|
||||
add res_ptr, 0x10, res_ptr
|
||||
mulx tmp2, s2_limb, tmp7
|
||||
sub sz, 2, sz
|
||||
umulxhi tmp2, s2_limb, tmp8
|
||||
addcc carry, tmp5, tmp5
|
||||
addxc %g0, tmp6, carry
|
||||
subcc tmp3, tmp5, tmp5
|
||||
addxc %g0, carry, carry
|
||||
stx tmp5, [res_ptr - 0x10]
|
||||
addcc carry, tmp7, tmp7
|
||||
addxc %g0, tmp8, carry
|
||||
subcc tmp4, tmp7, tmp7
|
||||
addxc %g0, carry, carry
|
||||
brgz sz, .Lloop
|
||||
stx tmp7, [res_ptr - 0x08]
|
||||
|
||||
brlz,pt sz, .Lfinish
|
||||
nop
|
||||
|
||||
.Lfinal_limb:
|
||||
ldx [s1_ptr + 0x00], tmp1
|
||||
ldx [res_ptr + 0x00], tmp3
|
||||
mulx tmp1, s2_limb, tmp5
|
||||
umulxhi tmp1, s2_limb, tmp6
|
||||
addcc carry, tmp5, tmp5
|
||||
addxc %g0, tmp6, carry
|
||||
subcc tmp3, tmp5, tmp5
|
||||
addxc %g0, carry, carry
|
||||
stx tmp5, [res_ptr + 0x00]
|
||||
|
||||
.Lfinish:
|
||||
jmpl %i7 + 8, %g0
|
||||
restore carry, 0, %o0
|
||||
END(__mpn_submul_1_vis3)
|
56
sysdeps/sparc/sparc64/multiarch/submul_1.S
Normal file
56
sysdeps/sparc/sparc64/multiarch/submul_1.S
Normal file
@ -0,0 +1,56 @@
|
||||
/* Multiple versions of submul_1
|
||||
|
||||
Copyright (C) 2013 Free Software Foundation, Inc.
|
||||
Contributed by David S. Miller (davem@davemloft.net)
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
ENTRY(__mpn_submul_1)
|
||||
.type __mpn_submul_1, @gnu_indirect_function
|
||||
# ifdef SHARED
|
||||
SETUP_PIC_REG_LEAF(o3, o5)
|
||||
# endif
|
||||
set HWCAP_SPARC_VIS3, %o1
|
||||
andcc %o0, %o1, %g0
|
||||
be 1f
|
||||
nop
|
||||
# ifdef SHARED
|
||||
sethi %gdop_hix22(__mpn_submul_1_vis3), %o1
|
||||
xor %o1, %gdop_lox10(__mpn_submul_1_vis3), %o1
|
||||
# else
|
||||
set __mpn_submul_1_vis3, %o1
|
||||
# endif
|
||||
ba 10f
|
||||
nop
|
||||
1:
|
||||
# ifdef SHARED
|
||||
sethi %gdop_hix22(__mpn_submul_1_generic), %o1
|
||||
xor %o1, %gdop_lox10(__mpn_submul_1_generic), %o1
|
||||
# else
|
||||
set __mpn_submul_1_vis3, %o1
|
||||
# endif
|
||||
10:
|
||||
# ifdef SHARED
|
||||
add %o3, %o1, %o1
|
||||
# endif
|
||||
retl
|
||||
mov %o1, %o0
|
||||
END(__mpn_submul_1)
|
||||
|
||||
#define __mpn_submul_1 __mpn_submul_1_generic
|
||||
#include "../submul_1.S"
|
Loading…
Reference in New Issue
Block a user