1 | ! sparc __mpn_rshift -- |
2 | ! |
3 | ! Copyright (C) 1995-2024 Free Software Foundation, Inc. |
4 | ! |
5 | ! This file is part of the GNU MP Library. |
6 | ! |
7 | ! The GNU MP Library is free software; you can redistribute it and/or modify |
8 | ! it under the terms of the GNU Lesser General Public License as published by |
9 | ! the Free Software Foundation; either version 2.1 of the License, or (at your |
10 | ! option) any later version. |
11 | ! |
12 | ! The GNU MP Library is distributed in the hope that it will be useful, but |
13 | ! WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY |
14 | ! or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public |
15 | ! License for more details. |
16 | ! |
17 | ! You should have received a copy of the GNU Lesser General Public License |
18 | ! along with the GNU MP Library; see the file COPYING.LIB. If not, |
19 | ! see <https://www.gnu.org/licenses/>. |
20 | |
21 | |
22 | ! INPUT PARAMETERS |
23 | ! RES_PTR %o0 |
24 | ! SRC_PTR %o1 |
25 | ! SIZE %o2 |
26 | ! CNT %o3 |
27 | |
28 | #include <sysdep.h> |
29 | |
30 | ENTRY(__mpn_rshift) |
31 | ld [%o1],%g2 ! load first limb |
32 | sub %g0,%o3,%o5 ! negate shift count |
33 | add %o2,-1,%o2 |
34 | andcc %o2,4-1,%g4 ! number of limbs in first loop |
35 | sll %g2,%o5,%g1 ! compute function result |
36 | be LOC(0) ! if multiple of 4 limbs, skip first loop |
37 | st %g1,[%sp+80] |
38 | |
39 | sub %o2,%g4,%o2 ! adjust count for main loop |
40 | |
41 | LOC(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 LOC(loop0) |
51 | st %o4,[%o0-4] |
52 | |
53 | LOC(0): tst %o2 |
54 | be LOC(end) |
55 | nop |
56 | |
57 | LOC(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 LOC(loop) |
85 | st %g4,[%o0-4] |
86 | |
87 | LOC(end): |
88 | srl %g2,%o3,%g2 |
89 | st %g2,[%o0-0] |
90 | retl |
91 | ld [%sp+80],%o0 |
92 | |
93 | END(__mpn_rshift) |
94 | |