diff options
author | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2019-11-13 12:32:17 +0000 |
---|---|---|
committer | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2019-11-27 09:37:57 -0300 |
commit | 5d9b7b9fa734c5381e0295c85c0e40520d9f6063 (patch) | |
tree | d8f050c206fdbe03167d31f8ff3916e2d52d8dc1 /sysdeps/sparc/sparc32/submul_1.S | |
parent | bfdb731438206b0f70fe7afa890681155c30b419 (diff) | |
download | glibc-5d9b7b9fa734c5381e0295c85c0e40520d9f6063.tar.gz glibc-5d9b7b9fa734c5381e0295c85c0e40520d9f6063.tar.xz glibc-5d9b7b9fa734c5381e0295c85c0e40520d9f6063.zip |
Remove 32 bit sparc v7 support
The patch is straighforward: - The sparc32 v8 implementations are moved as the generic ones. - A configure test is added to check for either __sparc_v8__ or __sparc_v9__. - The triple names are simplified and sparc implies sparcv8. The idea is to keep support on sparcv8 architectures that does support CAS instructions, such as LEON3/LEON4. Checked on a sparcv9-linux-gnu and sparc64-linux-gnu. Tested-by: Andreas Larsson <andreas@gaisler.com>
Diffstat (limited to 'sysdeps/sparc/sparc32/submul_1.S')
-rw-r--r-- | sysdeps/sparc/sparc32/submul_1.S | 143 |
1 files changed, 27 insertions, 116 deletions
diff --git a/sysdeps/sparc/sparc32/submul_1.S b/sysdeps/sparc/sparc32/submul_1.S index 920422adf1..11eef05300 100644 --- a/sysdeps/sparc/sparc32/submul_1.S +++ b/sysdeps/sparc/sparc32/submul_1.S @@ -1,146 +1,57 @@ -! SPARC __mpn_submul_1 -- Multiply a limb vector with a limb and subtract -! the result from a second limb vector. -! +! SPARC v8 __mpn_submul_1 -- Multiply a limb vector with a limb and +! subtract the result from a second limb vector. + ! Copyright (C) 1992-2019 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 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 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 Lesser General Public ! License for more details. -! + ! You should have received a copy of the GNU Lesser General Public License ! along with the GNU MP Library; see the file COPYING.LIB. If not, ! see <https://www.gnu.org/licenses/>. ! INPUT PARAMETERS -! RES_PTR o0 -! S1_PTR o1 -! SIZE o2 -! S2_LIMB o3 +! res_ptr o0 +! s1_ptr o1 +! size o2 +! s2_limb o3 #include <sysdep.h> ENTRY(__mpn_submul_1) - ! Make S1_PTR and RES_PTR point at the end of their blocks - ! and put (- 4 x SIZE) in index/loop counter. - sll %o2,2,%o2 - add %o0,%o2,%o4 ! RES_PTR in o4 since o0 is retval - add %o1,%o2,%o1 - sub %g0,%o2,%o2 - - cmp %o3,0xfff - bgu LOC(large) - nop + sub %g0,%o2,%o2 ! negate ... + sll %o2,2,%o2 ! ... and scale size + sub %o1,%o2,%o1 ! o1 is offset s1_ptr + sub %o0,%o2,%g1 ! g1 is offset res_ptr - ld [%o1+%o2],%o5 - mov 0,%o0 - b LOC(0) - add %o4,-4,%o4 -LOC(loop0): - subcc %o5,%g1,%g1 - ld [%o1+%o2],%o5 - addx %o0,%g0,%o0 - st %g1,[%o4+%o2] -LOC(0): wr %g0,%o3,%y - sra %o5,31,%g2 - and %o3,%g2,%g2 - andcc %g1,0,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,0,%g1 - sra %g1,20,%g4 - sll %g1,12,%g1 - rd %y,%g3 - srl %g3,20,%g3 - or %g1,%g3,%g1 + mov 0,%o0 ! clear cy_limb - addcc %g1,%o0,%g1 - addx %g2,%g4,%o0 ! add sign-compensation and cy to hi limb - addcc %o2,4,%o2 ! loop counter - bne LOC(loop0) - ld [%o4+%o2],%o5 - - subcc %o5,%g1,%g1 - addx %o0,%g0,%o0 - retl - st %g1,[%o4+%o2] - - -LOC(large): - ld [%o1+%o2],%o5 - mov 0,%o0 - sra %o3,31,%g4 ! g4 = mask of ones iff S2_LIMB < 0 - b LOC(1) - add %o4,-4,%o4 LOC(loop): - subcc %o5,%g3,%g3 - ld [%o1+%o2],%o5 - addx %o0,%g0,%o0 - st %g3,[%o4+%o2] -LOC(1): wr %g0,%o5,%y - and %o5,%g4,%g2 - andcc %g0,%g0,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%g0,%g1 + ld [%o1+%o2],%o4 + ld [%g1+%o2],%g2 + umul %o4,%o3,%o5 rd %y,%g3 - addcc %g3,%o0,%g3 - addx %g2,%g1,%o0 + addcc %o5,%o0,%o5 + addx %g3,0,%o0 + subcc %g2,%o5,%g2 + addx %o0,0,%o0 + st %g2,[%g1+%o2] + addcc %o2,4,%o2 bne LOC(loop) - ld [%o4+%o2],%o5 + nop - subcc %o5,%g3,%g3 - addx %o0,%g0,%o0 retl - st %g3,[%o4+%o2] + nop END(__mpn_submul_1) |