Upload Tizen:Base source
[external/gmp.git] / mpn / sparc32 / mul_1.asm
1 dnl  SPARC mpn_mul_1 -- Multiply a limb vector with a limb and store
2 dnl  the result in 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_mul_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         st      %g1,[%o4+%o2]
49 L(0):   wr      %g0,%o3,%y
50         sra     %o5,31,%g2
51         and     %o3,%g2,%g2
52         andcc   %g1,0,%g1
53         mulscc  %g1,%o5,%g1
54         mulscc  %g1,%o5,%g1
55         mulscc  %g1,%o5,%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,0,%g1
66         sra     %g1,20,%g4
67         sll     %g1,12,%g1
68         rd      %y,%g3
69         srl     %g3,20,%g3
70         or      %g1,%g3,%g1
71
72         addcc   %g1,%o0,%g1
73         addx    %g2,%g4,%o0     C add sign-compensation and cy to hi limb
74         addcc   %o2,4,%o2       C loop counter
75         bne,a   L(loop0)
76          ld     [%o1+%o2],%o5
77
78         retl
79         st      %g1,[%o4+%o2]
80
81
82 L(large):
83         ld      [%o1+%o2],%o5
84         mov     0,%o0
85         sra     %o3,31,%g4      C g4 = mask of ones iff S2_LIMB < 0
86         b       L(1)
87          add    %o4,-4,%o4
88 L(loop):
89         st      %g3,[%o4+%o2]
90 L(1):   wr      %g0,%o5,%y
91         and     %o5,%g4,%g2     C g2 = S1_LIMB iff S2_LIMB < 0, else 0
92         andcc   %g0,%g0,%g1
93         mulscc  %g1,%o3,%g1
94         mulscc  %g1,%o3,%g1
95         mulscc  %g1,%o3,%g1
96         mulscc  %g1,%o3,%g1
97         mulscc  %g1,%o3,%g1
98         mulscc  %g1,%o3,%g1
99         mulscc  %g1,%o3,%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,%g0,%g1
126         rd      %y,%g3
127         addcc   %g3,%o0,%g3
128         addx    %g2,%g1,%o0     C add sign-compensation and cy to hi limb
129         addcc   %o2,4,%o2       C loop counter
130         bne,a   L(loop)
131          ld     [%o1+%o2],%o5
132
133         retl
134         st      %g3,[%o4+%o2]
135 EPILOGUE(mpn_mul_1)