Update.
[glibc.git] / sysdeps / sparc / sparc64 / lshift.S
blob1678991529acbe283a73953d83d2e039e639acf4
1 /* SPARC v9 __mpn_lshift --
3    Copyright (C) 1996 Free Software Foundation, Inc.
5    This file is part of the GNU MP Library.
7    The GNU MP Library is free software; you can redistribute it and/or modify
8    it under the terms of the GNU Library General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or (at your
10    option) any later version.
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 Library General Public
15    License for more details.
17    You should have received a copy of the GNU Library General Public License
18    along with the GNU MP Library; see the file COPYING.LIB.  If not, write to
19    the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
20    MA 02111-1307, USA.  */
22 #include <sysdep.h>
24 /* INPUT PARAMETERS
25    res_ptr      %i0
26    src_ptr      %i1
27    size         %i2
28    cnt          %i3  */
30 ENTRY(__mpn_lshift)
31         save    %sp, -128, %sp
33         sllx    %i2,3,%g1
34         add     %i1,%g1,%i1     ! make %i1 point at end of src
35         ldx     [%i1-8],%g2     ! load first limb
36         sub     %g0,%i3,%i5     ! negate shift count
37         add     %i0,%g1,%i0     ! make %i0 point at end of res
38         add     %i2,-1,%i2
39         and     %i2,4-1,%l4     ! number of limbs in first loop
40         srlx    %g2,%i5,%g1     ! compute function result
41         brz,pn  %l4,.L0         ! if multiple of 4 limbs, skip first loop
42         mov     %g1,%l1
44         sub     %i2,%l4,%i2     ! adjust count for main loop
46 .Loop0: ldx     [%i1-16],%g3
47         add     %i0,-8,%i0
48         add     %i1,-8,%i1
49         add     %l4,-1,%l4
50         sllx    %g2,%i3,%i4
51         srlx    %g3,%i5,%g1
52         mov     %g3,%g2
53         or      %i4,%g1,%i4
54         brnz,pt %l4,.Loop0
55          stx    %i4,[%i0+0]
57 .L0:    brz,pn  %i2,.Lend
58          nop
60 .Loop:  ldx     [%i1-16],%g3
61         add     %i0,-32,%i0
62         add     %i2,-4,%i2
63         sllx    %g2,%i3,%i4
64         srlx    %g3,%i5,%g1
66         ldx     [%i1-24],%g2
67         sllx    %g3,%i3,%l4
68         or      %i4,%g1,%i4
69         stx     %i4,[%i0+24]
70         srlx    %g2,%i5,%g1
72         ldx     [%i1-32],%g3
73         sllx    %g2,%i3,%i4
74         or      %l4,%g1,%l4
75         stx     %l4,[%i0+16]
76         srlx    %g3,%i5,%g1
78         ldx     [%i1-40],%g2
79         sllx    %g3,%i3,%l4
80         or      %i4,%g1,%i4
81         stx     %i4,[%i0+8]
82         srlx    %g2,%i5,%g1
84         add     %i1,-32,%i1
85         or      %l4,%g1,%l4
86         brnz,pt %i2,.Loop
87          stx    %l4,[%i0+0]
89 .Lend:  sllx    %g2,%i3,%g2
90         stx     %g2,[%i0-8]
92         mov     %l1,%i0
93         jmpl    %i7+8, %g0
94          restore
96 END(__mpn_lshift)