Optimize sparc 32-bit V9 GMP multiply routines.
[glibc.git] / sysdeps / sparc / sparc32 / sparcv9 / submul_1.S
blob9c89feb5d990cc3936549716dcc836925882a4c5
1 ! SPARC v9 32-bit mpn_submul_1.
3 ! Copyright 2010-2013 Free Software Foundation, Inc.
5 ! This file is part of the GNU MP Library.
7 ! The GNU MP Library is free software; you can redistribute it and/or modify
8 ! it under the terms of the GNU Lesser General Public License as published
9 ! by the Free Software Foundation; either version 3 of the License, or (at
10 ! your option) any later version.
12 ! The GNU MP Library is distributed in the hope that it will be useful, but
13 ! WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 ! or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
15 ! License for more details.
17 ! You should have received a copy of the GNU Lesser General Public License
18 ! along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
20 ! INPUT PARAMETERS
21 ! res_ptr       %i0
22 ! s1_ptr        %i1
23 ! size          %i2
24 ! s2_limb       %i3
26 #include <sysdep.h>
28 ENTRY(__mpn_submul_1)
29         save    %sp, -96, %sp
30         srl     %i2, 0, %o4
31         srl     %i3, 0, %g1
32         subcc   %o4, 1, %o4
33         be      .Lfinal_one
34          subcc  %g0, 0, %o5
36 .Ltop:
37         lduw    [%i1+0], %l0
38         lduw    [%i0+0], %l2
39         lduw    [%i1+4], %l1
40         lduw    [%i0+4], %l3
41         mulx    %l0, %g1, %g3
42         add     %i1, 8, %i1
43         mulx    %l1, %g1, %o3
44         sub     %o4, 2, %o4
45         add     %i0, 8, %i0
46         addx    %o5, %g3, %g3
47         srlx    %g3, 32, %o5
48         subcc   %l2, %g3, %g3
49         stw     %g3, [%i0-8]
50         addx    %o5, %o3, %o3
51         srlx    %o3, 32, %o5
52         subcc   %l3, %o3, %o3
53         brgz    %o4, .Ltop
54          stw    %o3, [%i0-4]
56         brlz,pt %o4, .Ldone
57          nop
59 .Lfinal_one:
60         lduw    [%i1+0], %l0
61         lduw    [%i0+0], %l2
62         mulx    %l0, %g1, %g3
63         addx    %o5, %g3, %g3
64         srlx    %g3, 32, %o5
65         subcc   %l2, %g3, %g3
66         stw     %g3, [%i0+0]
68 .Ldone:
69         addx    %o5, 0, %o5
70         jmpl    %i7 + 8, %g0
71          restore %o5, 0, %o0
72 END(__mpn_submul_1)