Annotation of OpenXM/src/kan96xx/gmp-2.0.2/mpn/sparc32/mul_1.S, Revision 1.1.1.1
1.1 maekawa 1: ! SPARC __mpn_mul_1 -- Multiply a limb vector with a limb and store
2: ! the result in a second limb vector.
3:
4: ! Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc.
5:
6: ! This file is part of the GNU MP Library.
7:
8: ! The GNU MP Library is free software; you can redistribute it and/or modify
9: ! it under the terms of the GNU Library General Public License as published by
10: ! the Free Software Foundation; either version 2 of the License, or (at your
11: ! option) any later version.
12:
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 Library General Public
16: ! License for more details.
17:
18: ! You should have received a copy of the GNU Library General Public License
19: ! along with the GNU MP Library; see the file COPYING.LIB. If not, write to
20: ! the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
21: ! MA 02111-1307, USA.
22:
23:
24: ! INPUT PARAMETERS
25: ! res_ptr o0
26: ! s1_ptr o1
27: ! size o2
28: ! s2_limb o3
29:
30: ! ADD CODE FOR SMALL MULTIPLIERS!
31: !1: ld
32: ! st
33: !
34: !2: ld ,a
35: ! addxcc a,a,x
36: ! st x,
37: !
38: !3_unrolled:
39: ! ld ,a
40: ! addxcc a,a,x1 ! 2a + cy
41: ! addx %g0,%g0,x2
42: ! addcc a,x1,x ! 3a + c
43: ! st x,
44: !
45: ! ld ,a
46: ! addxcc a,a,y1
47: ! addx %g0,%g0,y2
48: ! addcc a,y1,x
49: ! st x,
50: !
51: !4_unrolled:
52: ! ld ,a
53: ! srl a,2,x1 ! 4a
54: ! addxcc y2,x1,x
55: ! sll a,30,x2
56: ! st x,
57: !
58: ! ld ,a
59: ! srl a,2,y1
60: ! addxcc x2,y1,y
61: ! sll a,30,y2
62: ! st x,
63: !
64: !5_unrolled:
65: ! ld ,a
66: ! srl a,2,x1 ! 4a
67: ! addxcc a,x1,x ! 5a + c
68: ! sll a,30,x2
69: ! addx %g0,x2,x2
70: ! st x,
71: !
72: ! ld ,a
73: ! srl a,2,y1
74: ! addxcc a,y1,x
75: ! sll a,30,y2
76: ! addx %g0,y2,y2
77: ! st x,
78: !
79: !8_unrolled:
80: ! ld ,a
81: ! srl a,3,x1 ! 8a
82: ! addxcc y2,x1,x
83: ! sll a,29,x2
84: ! st x,
85: !
86: ! ld ,a
87: ! srl a,3,y1
88: ! addxcc x2,y1,y
89: ! sll a,29,y2
90: ! st x,
91:
92: #include "sysdep.h"
93:
94: .text
95: .align 4
96: .global C_SYMBOL_NAME(__mpn_mul_1)
97: C_SYMBOL_NAME(__mpn_mul_1):
98: ! Make S1_PTR and RES_PTR point at the end of their blocks
99: ! and put (- 4 x SIZE) in index/loop counter.
100: sll %o2,2,%o2
101: add %o0,%o2,%o4 ! RES_PTR in o4 since o0 is retval
102: add %o1,%o2,%o1
103: sub %g0,%o2,%o2
104:
105: cmp %o3,0xfff
106: bgu Large
107: nop
108:
109: ld [%o1+%o2],%o5
110: mov 0,%o0
111: b L0
112: add %o4,-4,%o4
113: Loop0:
114: st %g1,[%o4+%o2]
115: L0: wr %g0,%o3,%y
116: sra %o5,31,%g2
117: and %o3,%g2,%g2
118: andcc %g1,0,%g1
119: mulscc %g1,%o5,%g1
120: mulscc %g1,%o5,%g1
121: mulscc %g1,%o5,%g1
122: mulscc %g1,%o5,%g1
123: mulscc %g1,%o5,%g1
124: mulscc %g1,%o5,%g1
125: mulscc %g1,%o5,%g1
126: mulscc %g1,%o5,%g1
127: mulscc %g1,%o5,%g1
128: mulscc %g1,%o5,%g1
129: mulscc %g1,%o5,%g1
130: mulscc %g1,%o5,%g1
131: mulscc %g1,0,%g1
132: sra %g1,20,%g4
133: sll %g1,12,%g1
134: rd %y,%g3
135: srl %g3,20,%g3
136: or %g1,%g3,%g1
137:
138: addcc %g1,%o0,%g1
139: addx %g2,%g4,%o0 ! add sign-compensation and cy to hi limb
140: addcc %o2,4,%o2 ! loop counter
141: bne,a Loop0
142: ld [%o1+%o2],%o5
143:
144: retl
145: st %g1,[%o4+%o2]
146:
147:
148: Large: ld [%o1+%o2],%o5
149: mov 0,%o0
150: sra %o3,31,%g4 ! g4 = mask of ones iff S2_LIMB < 0
151: b L1
152: add %o4,-4,%o4
153: Loop:
154: st %g3,[%o4+%o2]
155: L1: wr %g0,%o5,%y
156: and %o5,%g4,%g2 ! g2 = S1_LIMB iff S2_LIMB < 0, else 0
157: andcc %g0,%g0,%g1
158: mulscc %g1,%o3,%g1
159: mulscc %g1,%o3,%g1
160: mulscc %g1,%o3,%g1
161: mulscc %g1,%o3,%g1
162: mulscc %g1,%o3,%g1
163: mulscc %g1,%o3,%g1
164: mulscc %g1,%o3,%g1
165: mulscc %g1,%o3,%g1
166: mulscc %g1,%o3,%g1
167: mulscc %g1,%o3,%g1
168: mulscc %g1,%o3,%g1
169: mulscc %g1,%o3,%g1
170: mulscc %g1,%o3,%g1
171: mulscc %g1,%o3,%g1
172: mulscc %g1,%o3,%g1
173: mulscc %g1,%o3,%g1
174: mulscc %g1,%o3,%g1
175: mulscc %g1,%o3,%g1
176: mulscc %g1,%o3,%g1
177: mulscc %g1,%o3,%g1
178: mulscc %g1,%o3,%g1
179: mulscc %g1,%o3,%g1
180: mulscc %g1,%o3,%g1
181: mulscc %g1,%o3,%g1
182: mulscc %g1,%o3,%g1
183: mulscc %g1,%o3,%g1
184: mulscc %g1,%o3,%g1
185: mulscc %g1,%o3,%g1
186: mulscc %g1,%o3,%g1
187: mulscc %g1,%o3,%g1
188: mulscc %g1,%o3,%g1
189: mulscc %g1,%o3,%g1
190: mulscc %g1,%g0,%g1
191: rd %y,%g3
192: addcc %g3,%o0,%g3
193: addx %g2,%g1,%o0 ! add sign-compensation and cy to hi limb
194: addcc %o2,4,%o2 ! loop counter
195: bne,a Loop
196: ld [%o1+%o2],%o5
197:
198: retl
199: st %g3,[%o4+%o2]
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>