]> git.ipfire.org Git - thirdparty/glibc.git/blame - sysdeps/sparc/sparc32/lshift.S
Update copyright notices with scripts/update-copyrights
[thirdparty/glibc.git] / sysdeps / sparc / sparc32 / lshift.S
CommitLineData
f41c8091
UD
1! Sparc __mpn_lshift --
2!
d4697bc9 3! Copyright (C) 1995-2014 Free Software Foundation, Inc.
f41c8091 4!
ba848785 5! This file is part of the GNU MP Library.
f41c8091 6!
ba848785 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
ba848785 10! option) any later version.
f41c8091 11!
ba848785
RM
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
ba848785 15! License for more details.
f41c8091 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/>.
ba848785
RM
20
21
22! INPUT PARAMETERS
f41c8091
UD
23! RES_PTR %o0
24! SRC_PTR %o1
25! SIZE %o2
26! CNT %o3
ba848785 27
f41c8091 28#include <sysdep.h>
ba848785 29
f41c8091 30ENTRY(__mpn_lshift)
ba848785
RM
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
f41c8091 39 be LOC(0) ! if multiple of 4 limbs, skip first loop
ba848785
RM
40 st %g1,[%sp+80]
41
42 sub %o2,%g4,%o2 ! adjust count for main loop
43
f41c8091
UD
44LOC(loop0):
45 ld [%o1-8],%g3
ba848785
RM
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
f41c8091 53 bne LOC(loop0)
ba848785
RM
54 st %o4,[%o0+0]
55
f41c8091
UD
56LOC(0): tst %o2
57 be LOC(end)
ba848785
RM
58 nop
59
f41c8091
UD
60LOC(loop):
61 ld [%o1-8],%g3
ba848785
RM
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
f41c8091 87 bne LOC(loop)
ba848785
RM
88 st %g4,[%o0+0]
89
f41c8091
UD
90LOC(end):
91 sll %g2,%o3,%g2
ba848785
RM
92 st %g2,[%o0-4]
93 retl
94 ld [%sp+80],%o0
f41c8091
UD
95
96END(__mpn_lshift)