GNU Linux-libre 4.9-gnu1
[releases.git] / arch / sh / lib / ashrsi3.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 ! __ashrsi3
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 ! __ashrsi3_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         .global __ashrsi3
73         .global __ashrsi3_r0
74         
75         .align  2
76 __ashrsi3:
77         mov     r5,r0
78         .align  2
79 __ashrsi3_r0:
80         and     #31,r0
81         mov.l   r4,@-r15
82         mov     r0,r4
83         mova    ashrsi3_table,r0
84         mov.b   @(r0,r4),r4
85         add     r4,r0
86         jmp     @r0
87         mov.l   @r15+,r0
88
89         .align  2
90 ashrsi3_table:
91         .byte           ashrsi3_0-ashrsi3_table
92         .byte           ashrsi3_1-ashrsi3_table
93         .byte           ashrsi3_2-ashrsi3_table
94         .byte           ashrsi3_3-ashrsi3_table
95         .byte           ashrsi3_4-ashrsi3_table
96         .byte           ashrsi3_5-ashrsi3_table
97         .byte           ashrsi3_6-ashrsi3_table
98         .byte           ashrsi3_7-ashrsi3_table
99         .byte           ashrsi3_8-ashrsi3_table
100         .byte           ashrsi3_9-ashrsi3_table
101         .byte           ashrsi3_10-ashrsi3_table
102         .byte           ashrsi3_11-ashrsi3_table
103         .byte           ashrsi3_12-ashrsi3_table
104         .byte           ashrsi3_13-ashrsi3_table
105         .byte           ashrsi3_14-ashrsi3_table
106         .byte           ashrsi3_15-ashrsi3_table
107         .byte           ashrsi3_16-ashrsi3_table
108         .byte           ashrsi3_17-ashrsi3_table
109         .byte           ashrsi3_18-ashrsi3_table
110         .byte           ashrsi3_19-ashrsi3_table
111         .byte           ashrsi3_20-ashrsi3_table
112         .byte           ashrsi3_21-ashrsi3_table
113         .byte           ashrsi3_22-ashrsi3_table
114         .byte           ashrsi3_23-ashrsi3_table
115         .byte           ashrsi3_24-ashrsi3_table
116         .byte           ashrsi3_25-ashrsi3_table
117         .byte           ashrsi3_26-ashrsi3_table
118         .byte           ashrsi3_27-ashrsi3_table
119         .byte           ashrsi3_28-ashrsi3_table
120         .byte           ashrsi3_29-ashrsi3_table
121         .byte           ashrsi3_30-ashrsi3_table
122         .byte           ashrsi3_31-ashrsi3_table
123
124 ashrsi3_31:
125         rotcl   r0
126         rts
127         subc    r0,r0
128
129 ashrsi3_30:
130         shar    r0
131 ashrsi3_29:
132         shar    r0
133 ashrsi3_28:
134         shar    r0
135 ashrsi3_27:
136         shar    r0
137 ashrsi3_26:
138         shar    r0
139 ashrsi3_25:
140         shar    r0
141 ashrsi3_24:
142         shlr16  r0
143         shlr8   r0
144         rts
145         exts.b  r0,r0
146
147 ashrsi3_23:
148         shar    r0
149 ashrsi3_22:
150         shar    r0
151 ashrsi3_21:
152         shar    r0
153 ashrsi3_20:
154         shar    r0
155 ashrsi3_19:
156         shar    r0
157 ashrsi3_18:
158         shar    r0
159 ashrsi3_17:
160         shar    r0
161 ashrsi3_16:
162         shlr16  r0
163         rts
164         exts.w  r0,r0
165
166 ashrsi3_15:
167         shar    r0
168 ashrsi3_14:
169         shar    r0
170 ashrsi3_13:
171         shar    r0
172 ashrsi3_12:
173         shar    r0
174 ashrsi3_11:
175         shar    r0
176 ashrsi3_10:
177         shar    r0
178 ashrsi3_9:
179         shar    r0
180 ashrsi3_8:
181         shar    r0
182 ashrsi3_7:
183         shar    r0
184 ashrsi3_6:
185         shar    r0
186 ashrsi3_5:
187         shar    r0
188 ashrsi3_4:
189         shar    r0
190 ashrsi3_3:
191         shar    r0
192 ashrsi3_2:
193         shar    r0
194 ashrsi3_1:
195         rts
196         shar    r0
197
198 ashrsi3_0:
199         rts
200         nop