OLD | NEW |
| (Empty) |
1 dnl SPARC mpn_rshift -- Shift a number right. | |
2 | |
3 dnl Copyright 1995, 1996, 2000 Free Software Foundation, Inc. | |
4 | |
5 dnl This file is part of the GNU MP Library. | |
6 | |
7 dnl The GNU MP Library is free software; you can redistribute it and/or modify | |
8 dnl it under the terms of the GNU Lesser General Public License as published | |
9 dnl by the Free Software Foundation; either version 3 of the License, or (at | |
10 dnl your option) any later version. | |
11 | |
12 dnl The GNU MP Library is distributed in the hope that it will be useful, but | |
13 dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY | |
14 dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public | |
15 dnl License for more details. | |
16 | |
17 dnl You should have received a copy of the GNU Lesser General Public License | |
18 dnl along with the GNU MP Library. If not, see http://www.gnu.org/licenses/. | |
19 | |
20 | |
21 include(`../config.m4') | |
22 | |
23 C INPUT PARAMETERS | |
24 C res_ptr %o0 | |
25 C src_ptr %o1 | |
26 C size %o2 | |
27 C cnt %o3 | |
28 | |
29 ASM_START() | |
30 PROLOGUE(mpn_rshift) | |
31 ld [%o1],%g2 C load first limb | |
32 sub %g0,%o3,%o5 C negate shift count | |
33 add %o2,-1,%o2 | |
34 andcc %o2,4-1,%g4 C number of limbs in first loop | |
35 sll %g2,%o5,%g1 C compute function result | |
36 be L(0) C if multiple of 4 limbs, skip first loop | |
37 st %g1,[%sp+80] | |
38 | |
39 sub %o2,%g4,%o2 C adjust count for main loop | |
40 | |
41 L(loop0): | |
42 ld [%o1+4],%g3 | |
43 add %o0,4,%o0 | |
44 add %o1,4,%o1 | |
45 addcc %g4,-1,%g4 | |
46 srl %g2,%o3,%o4 | |
47 sll %g3,%o5,%g1 | |
48 mov %g3,%g2 | |
49 or %o4,%g1,%o4 | |
50 bne L(loop0) | |
51 st %o4,[%o0-4] | |
52 | |
53 L(0): tst %o2 | |
54 be L(end) | |
55 nop | |
56 | |
57 L(loop): | |
58 ld [%o1+4],%g3 | |
59 add %o0,16,%o0 | |
60 addcc %o2,-4,%o2 | |
61 srl %g2,%o3,%o4 | |
62 sll %g3,%o5,%g1 | |
63 | |
64 ld [%o1+8],%g2 | |
65 srl %g3,%o3,%g4 | |
66 or %o4,%g1,%o4 | |
67 st %o4,[%o0-16] | |
68 sll %g2,%o5,%g1 | |
69 | |
70 ld [%o1+12],%g3 | |
71 srl %g2,%o3,%o4 | |
72 or %g4,%g1,%g4 | |
73 st %g4,[%o0-12] | |
74 sll %g3,%o5,%g1 | |
75 | |
76 ld [%o1+16],%g2 | |
77 srl %g3,%o3,%g4 | |
78 or %o4,%g1,%o4 | |
79 st %o4,[%o0-8] | |
80 sll %g2,%o5,%g1 | |
81 | |
82 add %o1,16,%o1 | |
83 or %g4,%g1,%g4 | |
84 bne L(loop) | |
85 st %g4,[%o0-4] | |
86 | |
87 L(end): srl %g2,%o3,%g2 | |
88 st %g2,[%o0-0] | |
89 retl | |
90 ld [%sp+80],%o0 | |
91 EPILOGUE(mpn_rshift) | |
OLD | NEW |