remove empty dir
[ghc-hetmet.git] / rts / gmp / 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 (C) 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 2.1 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; see the file COPYING.LIB.  If not, write to
20 dnl  the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
21 dnl  MA 02111-1307, USA.
22
23
24 include(`../config.m4')
25
26 C INPUT PARAMETERS
27 C res_ptr       o0
28 C s1_ptr        o1
29 C size          o2
30 C s2_limb       o3
31
32 ASM_START()
33 PROLOGUE(mpn_submul_1)
34         C Make S1_PTR and RES_PTR point at the end of their blocks
35         C and put (- 4 x SIZE) in index/loop counter.
36         sll     %o2,2,%o2
37         add     %o0,%o2,%o4     C RES_PTR in o4 since o0 is retval
38         add     %o1,%o2,%o1
39         sub     %g0,%o2,%o2
40
41         cmp     %o3,0xfff
42         bgu     L(large)
43         nop
44
45         ld      [%o1+%o2],%o5
46         mov     0,%o0
47         b       L(0)
48          add    %o4,-4,%o4
49 L(loop0):
50         subcc   %o5,%g1,%g1
51         ld      [%o1+%o2],%o5
52         addx    %o0,%g0,%o0
53         st      %g1,[%o4+%o2]
54 L(0):   wr      %g0,%o3,%y
55         sra     %o5,31,%g2
56         and     %o3,%g2,%g2
57         andcc   %g1,0,%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,%o5,%g1
69         mulscc  %g1,%o5,%g1
70         mulscc  %g1,0,%g1
71         sra     %g1,20,%g4
72         sll     %g1,12,%g1
73         rd      %y,%g3
74         srl     %g3,20,%g3
75         or      %g1,%g3,%g1
76
77         addcc   %g1,%o0,%g1
78         addx    %g2,%g4,%o0     C add sign-compensation and cy to hi limb
79         addcc   %o2,4,%o2       C loop counter
80         bne     L(loop0)
81          ld     [%o4+%o2],%o5
82
83         subcc   %o5,%g1,%g1
84         addx    %o0,%g0,%o0
85         retl
86         st      %g1,[%o4+%o2]
87
88 L(large):
89         ld      [%o1+%o2],%o5
90         mov     0,%o0
91         sra     %o3,31,%g4      C g4 = mask of ones iff S2_LIMB < 0
92         b       L(1)
93          add    %o4,-4,%o4
94 L(loop):
95         subcc   %o5,%g3,%g3
96         ld      [%o1+%o2],%o5
97         addx    %o0,%g0,%o0
98         st      %g3,[%o4+%o2]
99 L(1):   wr      %g0,%o5,%y
100         and     %o5,%g4,%g2
101         andcc   %g0,%g0,%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,%o3,%g1
134         mulscc  %g1,%g0,%g1
135         rd      %y,%g3
136         addcc   %g3,%o0,%g3
137         addx    %g2,%g1,%o0
138         addcc   %o2,4,%o2
139         bne     L(loop)
140          ld     [%o4+%o2],%o5
141
142         subcc   %o5,%g3,%g3
143         addx    %o0,%g0,%o0
144         retl
145         st      %g3,[%o4+%o2]
146 EPILOGUE(mpn_submul_1)