1 | ! Sparc __mpn_lshift -- |
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_lshift) |
31 | sll %o2,2,%g1 |
32 | add %o1,%g1,%o1 ! make %o1 point at end of src |
33 | ld [%o1-4],%g2 ! load first limb |
34 | sub %g0,%o3,%o5 ! negate shift count |
35 | add %o0,%g1,%o0 ! make %o0 point at end of res |
36 | add %o2,-1,%o2 |
37 | andcc %o2,4-1,%g4 ! number of limbs in first loop |
38 | srl %g2,%o5,%g1 ! compute function result |
39 | be LOC(0) ! if multiple of 4 limbs, skip first loop |
40 | st %g1,[%sp+80] |
41 | |
42 | sub %o2,%g4,%o2 ! adjust count for main loop |
43 | |
44 | LOC(loop0): |
45 | ld [%o1-8],%g3 |
46 | add %o0,-4,%o0 |
47 | add %o1,-4,%o1 |
48 | addcc %g4,-1,%g4 |
49 | sll %g2,%o3,%o4 |
50 | srl %g3,%o5,%g1 |
51 | mov %g3,%g2 |
52 | or %o4,%g1,%o4 |
53 | bne LOC(loop0) |
54 | st %o4,[%o0+0] |
55 | |
56 | LOC(0): tst %o2 |
57 | be LOC(end) |
58 | nop |
59 | |
60 | LOC(loop): |
61 | ld [%o1-8],%g3 |
62 | add %o0,-16,%o0 |
63 | addcc %o2,-4,%o2 |
64 | sll %g2,%o3,%o4 |
65 | srl %g3,%o5,%g1 |
66 | |
67 | ld [%o1-12],%g2 |
68 | sll %g3,%o3,%g4 |
69 | or %o4,%g1,%o4 |
70 | st %o4,[%o0+12] |
71 | srl %g2,%o5,%g1 |
72 | |
73 | ld [%o1-16],%g3 |
74 | sll %g2,%o3,%o4 |
75 | or %g4,%g1,%g4 |
76 | st %g4,[%o0+8] |
77 | srl %g3,%o5,%g1 |
78 | |
79 | ld [%o1-20],%g2 |
80 | sll %g3,%o3,%g4 |
81 | or %o4,%g1,%o4 |
82 | st %o4,[%o0+4] |
83 | srl %g2,%o5,%g1 |
84 | |
85 | add %o1,-16,%o1 |
86 | or %g4,%g1,%g4 |
87 | bne LOC(loop) |
88 | st %g4,[%o0+0] |
89 | |
90 | LOC(end): |
91 | sll %g2,%o3,%g2 |
92 | st %g2,[%o0-4] |
93 | retl |
94 | ld [%sp+80],%o0 |
95 | |
96 | END(__mpn_lshift) |
97 | |