Upload Tizen:Base source
[external/gmp.git] / mpn / sparc32 / submul_1.asm
1 dnl  SPARC mpn_submul_1 -- Multiply a limb vector with a limb and subtract
2 dnl  the result from a second limb vector.
3
4 dnl  Copyright 1992, 1993, 1994, 2000 Free Software Foundation, Inc.
5
6 dnl  This file is part of the GNU MP Library.
7
8 dnl  The GNU MP Library is free software; you can redistribute it and/or modify
9 dnl  it under the terms of the GNU Lesser General Public License as published
10 dnl  by the Free Software Foundation; either version 3 of the License, or (at
11 dnl  your option) any later version.
12
13 dnl  The GNU MP Library is distributed in the hope that it will be useful, but
14 dnl  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 dnl  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
16 dnl  License for more details.
17
18 dnl  You should have received a copy of the GNU Lesser General Public License
19 dnl  along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
20
21
22 include(`../config.m4')
23
24 C INPUT PARAMETERS
25 C res_ptr       o0
26 C s1_ptr        o1
27 C size          o2
28 C s2_limb       o3
29
30 ASM_START()
31 PROLOGUE(mpn_submul_1)
32         C Make S1_PTR and RES_PTR point at the end of their blocks
33         C and put (- 4 x SIZE) in index/loop counter.
34         sll     %o2,2,%o2
35         add     %o0,%o2,%o4     C RES_PTR in o4 since o0 is retval
36         add     %o1,%o2,%o1
37         sub     %g0,%o2,%o2
38
39         cmp     %o3,0xfff
40         bgu     L(large)
41         nop
42
43         ld      [%o1+%o2],%o5
44         mov     0,%o0
45         b       L(0)
46          add    %o4,-4,%o4
47 L(loop0):
48         subcc   %o5,%g1,%g1
49         ld      [%o1+%o2],%o5
50         addx    %o0,%g0,%o0
51         st      %g1,[%o4+%o2]
52 L(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
74
75         addcc   %g1,%o0,%g1
76         addx    %g2,%g4,%o0     C add sign-compensation and cy to hi limb
77         addcc   %o2,4,%o2       C loop counter
78         bne     L(loop0)
79          ld     [%o4+%o2],%o5
80
81         subcc   %o5,%g1,%g1
82         addx    %o0,%g0,%o0
83         retl
84         st      %g1,[%o4+%o2]
85
86 L(large):
87         ld      [%o1+%o2],%o5
88         mov     0,%o0
89         sra     %o3,31,%g4      C g4 = mask of ones iff S2_LIMB < 0
90         b       L(1)
91          add    %o4,-4,%o4
92 L(loop):
93         subcc   %o5,%g3,%g3
94         ld      [%o1+%o2],%o5
95         addx    %o0,%g0,%o0
96         st      %g3,[%o4+%o2]
97 L(1):   wr      %g0,%o5,%y
98         and     %o5,%g4,%g2
99         andcc   %g0,%g0,%g1
100         mulscc  %g1,%o3,%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,%g0,%g1
133         rd      %y,%g3
134         addcc   %g3,%o0,%g3
135         addx    %g2,%g1,%o0
136         addcc   %o2,4,%o2
137         bne     L(loop)
138          ld     [%o4+%o2],%o5
139
140         subcc   %o5,%g3,%g3
141         addx    %o0,%g0,%o0
142         retl
143         st      %g3,[%o4+%o2]
144 EPILOGUE(mpn_submul_1)