This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH COMMITTED] Optimize sparc 32-bit V9 GMP multiply routines.
- From: David Miller <davem at davemloft dot net>
- To: libc-alpha at sourceware dot org
- Date: Thu, 10 Jan 2013 16:16:01 -0800 (PST)
- Subject: [PATCH COMMITTED] Optimize sparc 32-bit V9 GMP multiply routines.
* 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.
* sysdeps/sparc/sparc32/sparcv9/submul_1.S: Likewise.
---
ChangeLog | 7 +++
sysdeps/sparc/sparc32/sparcv9/addmul_1.S | 72 ++++++++++++++++++++++++++++-
sysdeps/sparc/sparc32/sparcv9/mul_1.S | 65 +++++++++++++++++++++++++-
sysdeps/sparc/sparc32/sparcv9/submul_1.S | 73 +++++++++++++++++++++++++++++-
4 files changed, 214 insertions(+), 3 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index f1c80d3..4264204 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2013-01-10 David S. Miller <davem@davemloft.net>
+
+ * 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.
+ * sysdeps/sparc/sparc32/sparcv9/submul_1.S: Likewise.
+
2013-01-10 Roland McGrath <roland@hack.frob.com>
* elf/elf.h (DT_SPARC_REGISTER, DT_SPARC_NUM): Fix whitespace.
diff --git a/sysdeps/sparc/sparc32/sparcv9/addmul_1.S b/sysdeps/sparc/sparc32/sparcv9/addmul_1.S
index 563bfb1..875a808 100644
--- a/sysdeps/sparc/sparc32/sparcv9/addmul_1.S
+++ b/sysdeps/sparc/sparc32/sparcv9/addmul_1.S
@@ -1 +1,71 @@
-#include <sparcv8/addmul_1.S>
+! SPARC v9 32-bit mpn_addmul_1.
+!
+! Copyright 2010-2013 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 3 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. If not, see http://www.gnu.org/licenses/.
+
+! INPUT PARAMETERS
+! res_ptr %i0
+! s1_ptr %i1
+! size %i2
+! s2_limb %i3
+
+#include <sysdep.h>
+
+ENTRY(__mpn_addmul_1)
+ save %sp, -96, %sp
+ srl %i2, 0, %o4
+ srl %i3, 0, %g1
+ subcc %o4, 1, %o4
+ be .Lfinal_one
+ clr %o5
+
+.Ltop:
+ lduw [%i1+0], %l0
+ lduw [%i0+0], %l2
+ lduw [%i1+4], %l1
+ lduw [%i0+4], %l3
+ mulx %l0, %g1, %g3
+ add %i1, 8, %i1
+ mulx %l1, %g1, %o3
+ sub %o4, 2, %o4
+ add %i0, 8, %i0
+ add %l2, %g3, %g3
+ add %o5, %g3, %g3
+ stw %g3, [%i0-8]
+ srlx %g3, 32, %o5
+ add %l3, %o3, %o3
+ add %o5, %o3, %o3
+ stw %o3, [%i0-4]
+ brgz %o4, .Ltop
+ srlx %o3, 32, %o5
+
+ brlz,pt %o4, .Ldone
+ nop
+
+.Lfinal_one:
+ lduw [%i1+0], %l0
+ lduw [%i0+0], %l2
+ mulx %l0, %g1, %g3
+ add %l2, %g3, %g3
+ add %o5, %g3, %g3
+ stw %g3, [%i0+0]
+ srlx %g3, 32, %o5
+
+.Ldone:
+ jmpl %i7 + 8, %g0
+ restore %o5, 0, %o0
+END(__mpn_addmul_1)
diff --git a/sysdeps/sparc/sparc32/sparcv9/mul_1.S b/sysdeps/sparc/sparc32/sparcv9/mul_1.S
index 42284ea..af51ee4 100644
--- a/sysdeps/sparc/sparc32/sparcv9/mul_1.S
+++ b/sysdeps/sparc/sparc32/sparcv9/mul_1.S
@@ -1 +1,64 @@
-#include <sparcv8/mul_1.S>
+! SPARC v9 32-bit mpn_mul_1.
+!
+! Copyright 2010-2013 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 3 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. If not, see http://www.gnu.org/licenses/.
+
+! INPUT PARAMETERS
+! res_ptr %o0
+! s1_ptr %o1
+! size %o2
+! s2_limb %o3
+
+#include <sysdep.h>
+
+ENTRY(__mpn_mul_1)
+ srl %o2, 0, %o2
+ srl %o3, 0, %o3
+ subcc %o2, 1, %o2
+ be .Lfinal_one
+ clr %o5
+
+.Ltop:
+ lduw [%o1+0], %g1
+ lduw [%o1+4], %g2
+ mulx %g1, %o3, %g3
+ add %o1, 8, %o1
+ mulx %g2, %o3, %o4
+ sub %o2, 2, %o2
+ add %o0, 8, %o0
+ add %o5, %g3, %g3
+ stw %g3, [%o0-8]
+ srlx %g3, 32, %o5
+ add %o5, %o4, %o4
+ stw %o4, [%o0-4]
+ brgz %o2, .Ltop
+ srlx %o4, 32, %o5
+
+ brlz,pt %o2, .Ldone
+ nop
+
+.Lfinal_one:
+ lduw [%o1+0], %g1
+ mulx %g1, %o3, %g3
+ add %o5, %g3, %g3
+ stw %g3, [%o0+0]
+ srlx %g3, 32, %o5
+
+.Ldone:
+ retl
+ mov %o5, %o0
+END(__mpn_mul_1)
diff --git a/sysdeps/sparc/sparc32/sparcv9/submul_1.S b/sysdeps/sparc/sparc32/sparcv9/submul_1.S
index de69533..9c89feb 100644
--- a/sysdeps/sparc/sparc32/sparcv9/submul_1.S
+++ b/sysdeps/sparc/sparc32/sparcv9/submul_1.S
@@ -1 +1,72 @@
-#include <sparcv8/submul_1.S>
+! SPARC v9 32-bit mpn_submul_1.
+!
+! Copyright 2010-2013 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 3 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. If not, see http://www.gnu.org/licenses/.
+
+! INPUT PARAMETERS
+! res_ptr %i0
+! s1_ptr %i1
+! size %i2
+! s2_limb %i3
+
+#include <sysdep.h>
+
+ENTRY(__mpn_submul_1)
+ save %sp, -96, %sp
+ srl %i2, 0, %o4
+ srl %i3, 0, %g1
+ subcc %o4, 1, %o4
+ be .Lfinal_one
+ subcc %g0, 0, %o5
+
+.Ltop:
+ lduw [%i1+0], %l0
+ lduw [%i0+0], %l2
+ lduw [%i1+4], %l1
+ lduw [%i0+4], %l3
+ mulx %l0, %g1, %g3
+ add %i1, 8, %i1
+ mulx %l1, %g1, %o3
+ sub %o4, 2, %o4
+ add %i0, 8, %i0
+ addx %o5, %g3, %g3
+ srlx %g3, 32, %o5
+ subcc %l2, %g3, %g3
+ stw %g3, [%i0-8]
+ addx %o5, %o3, %o3
+ srlx %o3, 32, %o5
+ subcc %l3, %o3, %o3
+ brgz %o4, .Ltop
+ stw %o3, [%i0-4]
+
+ brlz,pt %o4, .Ldone
+ nop
+
+.Lfinal_one:
+ lduw [%i1+0], %l0
+ lduw [%i0+0], %l2
+ mulx %l0, %g1, %g3
+ addx %o5, %g3, %g3
+ srlx %g3, 32, %o5
+ subcc %l2, %g3, %g3
+ stw %g3, [%i0+0]
+
+.Ldone:
+ addx %o5, 0, %o5
+ jmpl %i7 + 8, %g0
+ restore %o5, 0, %o0
+END(__mpn_submul_1)
--
1.7.10.4