]> git.ipfire.org Git - thirdparty/glibc.git/blame - sysdeps/sparc/sparc64/rshift.S
Update copyright dates with scripts/update-copyrights.
[thirdparty/glibc.git] / sysdeps / sparc / sparc64 / rshift.S
CommitLineData
5ae3e846
UD
1/* SPARC v9 __mpn_rshift --
2
b168057a 3 Copyright (C) 1996-2015 Free Software Foundation, Inc.
5ae3e846
UD
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
6d84f89a
AJ
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
5ae3e846
UD
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
6d84f89a 14 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
5ae3e846
UD
15 License for more details.
16
6d84f89a 17 You should have received a copy of the GNU Lesser General Public License
59ba27a6
PE
18 along with the GNU MP Library; see the file COPYING.LIB. If not,
19 see <http://www.gnu.org/licenses/>. */
5ae3e846
UD
20
21#include <sysdep.h>
22
23/* INPUT PARAMETERS
2e65ca2b
UD
24 res_ptr %o0
25 src_ptr %o1
26 size %o2
27 cnt %o3 */
5ae3e846 28
8cb079d4
UD
29 .register %g2, #scratch
30 .register %g3, #scratch
31
5ae3e846 32ENTRY(__mpn_rshift)
2e65ca2b
UD
33 ldx [%o1],%g2 ! load first limb
34 sub %g0,%o3,%o5 ! negate shift count
35 add %o2,-1,%o2
36 andcc %o2,4-1,%g4 ! number of limbs in first loop
37 sllx %g2,%o5,%g1 ! compute function result
38 be,pn %xcc,.L0 ! if multiple of 4 limbs, skip first loop
39 mov %g1,%g5
40
41 sub %o2,%g4,%o2 ! adjust count for main loop
42
43.Loop0: ldx [%o1+8],%g3
44 add %o0,8,%o0
45 add %o1,8,%o1
46 srlx %g2,%o3,%o4
47 addcc %g4,-1,%g4
48 sllx %g3,%o5,%g1
5ae3e846 49 mov %g3,%g2
2e65ca2b
UD
50 or %o4,%g1,%o4
51 bne,pt %xcc,.Loop0
52 stx %o4,[%o0-8]
5ae3e846 53
2e65ca2b 54.L0: brz,pn %o2,.Lend
5ae3e846
UD
55 nop
56
2e65ca2b
UD
57.Loop: ldx [%o1+8],%g3
58 add %o0,32,%o0
59 srlx %g2,%o3,%o4
60 addcc %o2,-4,%o2
61 sllx %g3,%o5,%g1
62
63 ldx [%o1+16],%g2
64 srlx %g3,%o3,%g4
65 or %o4,%g1,%o4
66 stx %o4,[%o0-32]
67 sllx %g2,%o5,%g1
68
69 ldx [%o1+24],%g3
70 srlx %g2,%o3,%o4
71 or %g4,%g1,%g4
72 stx %g4,[%o0-24]
73 sllx %g3,%o5,%g1
74
75 ldx [%o1+32],%g2
76 srlx %g3,%o3,%g4
77 or %o4,%g1,%o4
78 stx %o4,[%o0-16]
79 sllx %g2,%o5,%g1
80
81 add %o1,32,%o1
82 or %g4,%g1,%g4
83 bne,pt %xcc,.Loop
84 stx %g4,[%o0-8]
85
86.Lend: srlx %g2,%o3,%g2
87 stx %g2,[%o0-0]
88
89 jmpl %o7+8,%g0
90 mov %g5,%o0
5ae3e846
UD
91
92END(__mpn_rshift)