Update copyright notices with scripts/update-copyrights
[glibc.git] / sysdeps / sparc / sparc32 / submul_1.S
blob24812a92696ccf8ffb6b503bc9770999279dbbbf
1 ! SPARC __mpn_submul_1 -- Multiply a limb vector with a limb and subtract
2 ! the result from a second limb vector.
4 ! Copyright (C) 1992-2014 Free Software Foundation, Inc.
6 ! This file is part of the GNU MP Library.
8 ! The GNU MP Library is free software; you can redistribute it and/or modify
9 ! it under the terms of the GNU Lesser General Public License as published by
10 ! the Free Software Foundation; either version 2.1 of the License, or (at your
11 ! option) any later version.
13 ! The GNU MP Library is distributed in the hope that it will be useful, but
14 ! WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 ! or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
16 ! License for more details.
18 ! You should have received a copy of the GNU Lesser General Public License
19 ! along with the GNU MP Library; see the file COPYING.LIB.  If not,
20 ! see <http://www.gnu.org/licenses/>.
23 ! INPUT PARAMETERS
24 ! RES_PTR       o0
25 ! S1_PTR        o1
26 ! SIZE          o2
27 ! S2_LIMB       o3
29 #include <sysdep.h>
31 ENTRY(__mpn_submul_1)
32         ! Make S1_PTR and RES_PTR point at the end of their blocks
33         ! and put (- 4 x SIZE) in index/loop counter.
34         sll     %o2,2,%o2
35         add     %o0,%o2,%o4     ! RES_PTR in o4 since o0 is retval
36         add     %o1,%o2,%o1
37         sub     %g0,%o2,%o2
39         cmp     %o3,0xfff
40         bgu     LOC(large)
41         nop
43         ld      [%o1+%o2],%o5
44         mov     0,%o0
45         b       LOC(0)
46          add    %o4,-4,%o4
47 LOC(loop0):
48         subcc   %o5,%g1,%g1
49         ld      [%o1+%o2],%o5
50         addx    %o0,%g0,%o0
51         st      %g1,[%o4+%o2]
52 LOC(0): wr      %g0,%o3,%y
53         sra     %o5,31,%g2
54         and     %o3,%g2,%g2
55         andcc   %g1,0,%g1
56         mulscc  %g1,%o5,%g1
57         mulscc  %g1,%o5,%g1
58         mulscc  %g1,%o5,%g1
59         mulscc  %g1,%o5,%g1
60         mulscc  %g1,%o5,%g1
61         mulscc  %g1,%o5,%g1
62         mulscc  %g1,%o5,%g1
63         mulscc  %g1,%o5,%g1
64         mulscc  %g1,%o5,%g1
65         mulscc  %g1,%o5,%g1
66         mulscc  %g1,%o5,%g1
67         mulscc  %g1,%o5,%g1
68         mulscc  %g1,0,%g1
69         sra     %g1,20,%g4
70         sll     %g1,12,%g1
71         rd      %y,%g3
72         srl     %g3,20,%g3
73         or      %g1,%g3,%g1
75         addcc   %g1,%o0,%g1
76         addx    %g2,%g4,%o0     ! add sign-compensation and cy to hi limb
77         addcc   %o2,4,%o2       ! loop counter
78         bne     LOC(loop0)
79          ld     [%o4+%o2],%o5
81         subcc   %o5,%g1,%g1
82         addx    %o0,%g0,%o0
83         retl
84         st      %g1,[%o4+%o2]
87 LOC(large):
88         ld      [%o1+%o2],%o5
89         mov     0,%o0
90         sra     %o3,31,%g4      ! g4 = mask of ones iff S2_LIMB < 0
91         b       LOC(1)
92          add    %o4,-4,%o4
93 LOC(loop):
94         subcc   %o5,%g3,%g3
95         ld      [%o1+%o2],%o5
96         addx    %o0,%g0,%o0
97         st      %g3,[%o4+%o2]
98 LOC(1): wr      %g0,%o5,%y
99         and     %o5,%g4,%g2
100         andcc   %g0,%g0,%g1
101         mulscc  %g1,%o3,%g1
102         mulscc  %g1,%o3,%g1
103         mulscc  %g1,%o3,%g1
104         mulscc  %g1,%o3,%g1
105         mulscc  %g1,%o3,%g1
106         mulscc  %g1,%o3,%g1
107         mulscc  %g1,%o3,%g1
108         mulscc  %g1,%o3,%g1
109         mulscc  %g1,%o3,%g1
110         mulscc  %g1,%o3,%g1
111         mulscc  %g1,%o3,%g1
112         mulscc  %g1,%o3,%g1
113         mulscc  %g1,%o3,%g1
114         mulscc  %g1,%o3,%g1
115         mulscc  %g1,%o3,%g1
116         mulscc  %g1,%o3,%g1
117         mulscc  %g1,%o3,%g1
118         mulscc  %g1,%o3,%g1
119         mulscc  %g1,%o3,%g1
120         mulscc  %g1,%o3,%g1
121         mulscc  %g1,%o3,%g1
122         mulscc  %g1,%o3,%g1
123         mulscc  %g1,%o3,%g1
124         mulscc  %g1,%o3,%g1
125         mulscc  %g1,%o3,%g1
126         mulscc  %g1,%o3,%g1
127         mulscc  %g1,%o3,%g1
128         mulscc  %g1,%o3,%g1
129         mulscc  %g1,%o3,%g1
130         mulscc  %g1,%o3,%g1
131         mulscc  %g1,%o3,%g1
132         mulscc  %g1,%o3,%g1
133         mulscc  %g1,%g0,%g1
134         rd      %y,%g3
135         addcc   %g3,%o0,%g3
136         addx    %g2,%g1,%o0
137         addcc   %o2,4,%o2
138         bne     LOC(loop)
139          ld     [%o4+%o2],%o5
141         subcc   %o5,%g3,%g3
142         addx    %o0,%g0,%o0
143         retl
144         st      %g3,[%o4+%o2]
146 END(__mpn_submul_1)