Update.
[glibc.git] / sysdeps / powerpc / lshift.S
blobb1487a1c17c6bad8927bd2054409e959a81eb3ed
1 /* Shift a limb left, low level routine.
2    Copyright (C) 1996, 1997 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Library General Public License as
7    published by the Free Software Foundation; either version 2 of the
8    License, or (at your option) any later version.
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Library General Public License for more details.
15    You should have received a copy of the GNU Library General Public
16    License along with the GNU C Library; see the file COPYING.LIB.  If not,
17    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18    Boston, MA 02111-1307, USA.  */
20 #include <sysdep.h>
22 /* mp_limb_t mpn_lshift (mp_ptr wp, mp_srcptr up, mp_size_t usize,
23                          unsigned int cnt)  */
25 EALIGN(__mpn_lshift,3,0)
26         mtctr   %r5             # copy size into CTR
27         cmplwi  %cr0,%r5,16     # is size < 16
28         slwi    %r0,%r5,2
29         add     %r7,%r3,%r0     # make r7 point at end of res
30         add     %r4,%r4,%r0     # make r4 point at end of s1
31         lwzu    %r11,-4(%r4)    # load first s1 limb
32         subfic  %r8,%r6,32
33         srw     %r3,%r11,%r8    # compute function return value
34         bge     %cr0,L(big)     # branch if size >= 16
36         bdz     L(end1)
38 0:      lwzu    %r10,-4(%r4)
39         slw     %r9,%r11,%r6
40         srw     %r12,%r10,%r8
41         or      %r9,%r9,%r12
42         stwu    %r9,-4(%r7)
43         bdz     L(end2)
44         lwzu    %r11,-4(%r4)
45         slw     %r9,%r10,%r6
46         srw     %r12,%r11,%r8
47         or      %r9,%r9,%r12
48         stwu    %r9,-4(%r7)
49         bdnz    0b
51 L(end1):slw     %r0,%r11,%r6
52         stw     %r0,-4(%r7)
53         blr
56 /* Guaranteed not to succeed.  */
57 L(boom): tweq    %r0,%r0
59 /* We imitate a case statement, by using (yuk!) fixed-length code chunks,
60    of size 4*12 bytes.  We have to do this (or something) to make this PIC.  */
61 L(big): mflr    %r9
62         bltl-   %cr0,L(boom)    # Never taken, only used to set LR.
63         slwi    %r10,%r6,4
64         mflr    %r12
65         add     %r10,%r12,%r10
66         slwi    %r8,%r6,5
67         add     %r10,%r8,%r10
68         mtctr   %r10
69         addi    %r5,%r5,-1
70         mtlr    %r9
71         bctr
73 L(end2):slw     %r0,%r10,%r6
74         stw     %r0,-4(%r7)
75         blr
77 #define DO_LSHIFT(n) \
78         mtctr   %r5;                                                    \
79 0:      lwzu    %r10,-4(%r4);                                           \
80         slwi    %r9,%r11,n;                                             \
81         inslwi  %r9,%r10,n,32-n;                                        \
82         stwu    %r9,-4(%r7);                                            \
83         bdz-    L(end2);                                                \
84         lwzu    %r11,-4(%r4);                                           \
85         slwi    %r9,%r10,n;                                             \
86         inslwi  %r9,%r11,n,32-n;                                        \
87         stwu    %r9,-4(%r7);                                            \
88         bdnz    0b;                                                     \
89         b       L(end1)
91         DO_LSHIFT(1)
92         DO_LSHIFT(2)
93         DO_LSHIFT(3)
94         DO_LSHIFT(4)
95         DO_LSHIFT(5)
96         DO_LSHIFT(6)
97         DO_LSHIFT(7)
98         DO_LSHIFT(8)
99         DO_LSHIFT(9)
100         DO_LSHIFT(10)
101         DO_LSHIFT(11)
102         DO_LSHIFT(12)
103         DO_LSHIFT(13)
104         DO_LSHIFT(14)
105         DO_LSHIFT(15)
106         DO_LSHIFT(16)
107         DO_LSHIFT(17)
108         DO_LSHIFT(18)
109         DO_LSHIFT(19)
110         DO_LSHIFT(20)
111         DO_LSHIFT(21)
112         DO_LSHIFT(22)
113         DO_LSHIFT(23)
114         DO_LSHIFT(24)
115         DO_LSHIFT(25)
116         DO_LSHIFT(26)
117         DO_LSHIFT(27)
118         DO_LSHIFT(28)
119         DO_LSHIFT(29)
120         DO_LSHIFT(30)
121         DO_LSHIFT(31)
123 END(__mpn_lshift)