Linux-libre 4.4.228-gnu
[librecmc/linux-libre.git] / arch / sh / lib / ashlsi3.S
1 /* Copyright (C) 1994, 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
2    2004, 2005, 2006
3    Free Software Foundation, Inc.
4
5 This file is free software; you can redistribute it and/or modify it
6 under the terms of the GNU General Public License as published by the
7 Free Software Foundation; either version 2, or (at your option) any
8 later version.
9
10 In addition to the permissions in the GNU General Public License, the
11 Free Software Foundation gives you unlimited permission to link the
12 compiled version of this file into combinations with other programs,
13 and to distribute those combinations without any restriction coming
14 from the use of this file.  (The General Public License restrictions
15 do apply in other respects; for example, they cover modification of
16 the file, and distribution when not linked into a combine
17 executable.)
18
19 This file is distributed in the hope that it will be useful, but
20 WITHOUT ANY WARRANTY; without even the implied warranty of
21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
22 General Public License for more details.
23
24 You should have received a copy of the GNU General Public License
25 along with this program; see the file COPYING.  If not, write to
26 the Free Software Foundation, 51 Franklin Street, Fifth Floor,
27 Boston, MA 02110-1301, USA.  */
28
29 !! libgcc routines for the Renesas / SuperH SH CPUs.
30 !! Contributed by Steve Chamberlain.
31 !! sac@cygnus.com
32
33 !! ashiftrt_r4_x, ___ashrsi3, ___ashlsi3, ___lshrsi3 routines
34 !! recoded in assembly by Toshiyasu Morita
35 !! tm@netcom.com
36
37 /* SH2 optimizations for ___ashrsi3, ___ashlsi3, ___lshrsi3 and
38    ELF local label prefixes by J"orn Rennecke
39    amylaar@cygnus.com  */
40
41 !
42 ! __ashlsi3
43 !
44 ! Entry:
45 !
46 ! r4: Value to shift
47 ! r5: Shifts
48 !
49 ! Exit:
50 !
51 ! r0: Result
52 !
53 ! Destroys:
54 !
55 ! (none)
56 !
57 ! __ashlsi3_r0
58 !
59 ! Entry:
60 !
61 ! r4: Value to shift
62 ! r0: Shifts
63 !
64 ! Exit:
65 !
66 ! r0: Result
67 !
68 ! Destroys:
69 !
70 ! (none)
71
72
73         .global __ashlsi3
74         .global __ashlsi3_r0
75         
76         .align  2
77 __ashlsi3:
78         mov     r5,r0
79         .align  2
80 __ashlsi3_r0:
81         and     #31,r0
82         mov.l   r4,@-r15
83         mov     r0,r4
84         mova    ashlsi3_table,r0
85         mov.b   @(r0,r4),r4
86         add     r4,r0
87         jmp     @r0
88         mov.l   @r15+,r0
89
90         .align  2
91 ashlsi3_table:
92         .byte           ashlsi3_0-ashlsi3_table
93         .byte           ashlsi3_1-ashlsi3_table
94         .byte           ashlsi3_2-ashlsi3_table
95         .byte           ashlsi3_3-ashlsi3_table
96         .byte           ashlsi3_4-ashlsi3_table
97         .byte           ashlsi3_5-ashlsi3_table
98         .byte           ashlsi3_6-ashlsi3_table
99         .byte           ashlsi3_7-ashlsi3_table
100         .byte           ashlsi3_8-ashlsi3_table
101         .byte           ashlsi3_9-ashlsi3_table
102         .byte           ashlsi3_10-ashlsi3_table
103         .byte           ashlsi3_11-ashlsi3_table
104         .byte           ashlsi3_12-ashlsi3_table
105         .byte           ashlsi3_13-ashlsi3_table
106         .byte           ashlsi3_14-ashlsi3_table
107         .byte           ashlsi3_15-ashlsi3_table
108         .byte           ashlsi3_16-ashlsi3_table
109         .byte           ashlsi3_17-ashlsi3_table
110         .byte           ashlsi3_18-ashlsi3_table
111         .byte           ashlsi3_19-ashlsi3_table
112         .byte           ashlsi3_20-ashlsi3_table
113         .byte           ashlsi3_21-ashlsi3_table
114         .byte           ashlsi3_22-ashlsi3_table
115         .byte           ashlsi3_23-ashlsi3_table
116         .byte           ashlsi3_24-ashlsi3_table
117         .byte           ashlsi3_25-ashlsi3_table
118         .byte           ashlsi3_26-ashlsi3_table
119         .byte           ashlsi3_27-ashlsi3_table
120         .byte           ashlsi3_28-ashlsi3_table
121         .byte           ashlsi3_29-ashlsi3_table
122         .byte           ashlsi3_30-ashlsi3_table
123         .byte           ashlsi3_31-ashlsi3_table
124
125 ashlsi3_6:
126         shll2   r0
127 ashlsi3_4:
128         shll2   r0
129 ashlsi3_2:
130         rts
131         shll2   r0
132
133 ashlsi3_7:
134         shll2   r0
135 ashlsi3_5:
136         shll2   r0
137 ashlsi3_3:
138         shll2   r0
139 ashlsi3_1:
140         rts
141         shll    r0
142
143 ashlsi3_14:
144         shll2   r0
145 ashlsi3_12:
146         shll2   r0
147 ashlsi3_10:
148         shll2   r0
149 ashlsi3_8:
150         rts
151         shll8   r0
152
153 ashlsi3_15:
154         shll2   r0
155 ashlsi3_13:
156         shll2   r0
157 ashlsi3_11:
158         shll2   r0
159 ashlsi3_9:
160         shll8   r0
161         rts
162         shll    r0
163
164 ashlsi3_22:
165         shll2   r0
166 ashlsi3_20:
167         shll2   r0
168 ashlsi3_18:
169         shll2   r0
170 ashlsi3_16:
171         rts
172         shll16  r0
173
174 ashlsi3_23:
175         shll2   r0
176 ashlsi3_21:
177         shll2   r0
178 ashlsi3_19:
179         shll2   r0
180 ashlsi3_17:
181         shll16  r0
182         rts
183         shll    r0
184
185 ashlsi3_30:
186         shll2   r0
187 ashlsi3_28:
188         shll2   r0
189 ashlsi3_26:
190         shll2   r0
191 ashlsi3_24:
192         shll16  r0
193         rts
194         shll8   r0
195
196 ashlsi3_31:
197         shll2   r0
198 ashlsi3_29:
199         shll2   r0
200 ashlsi3_27:
201         shll2   r0
202 ashlsi3_25:
203         shll16  r0
204         shll8   r0
205         rts
206         shll    r0
207
208 ashlsi3_0:
209         rts
210         nop