Mercurial > hg > CbC > CbC_gcc
comparison gcc/config/arm/bpabi-v6m.S @ 0:a06113de4d67
first commit
author | kent <kent@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 17 Jul 2009 14:47:48 +0900 |
parents | |
children | 77e2b8dfacca |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:a06113de4d67 |
---|---|
1 /* Miscellaneous BPABI functions. ARMv6M implementation | |
2 | |
3 Copyright (C) 2006, 2008, 2009 Free Software Foundation, Inc. | |
4 Contributed by CodeSourcery. | |
5 | |
6 This file is free software; you can redistribute it and/or modify it | |
7 under the terms of the GNU General Public License as published by the | |
8 Free Software Foundation; either version 3, or (at your option) any | |
9 later version. | |
10 | |
11 This file is distributed in the hope that it will be useful, but | |
12 WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
14 General Public License for more details. | |
15 | |
16 Under Section 7 of GPL version 3, you are granted additional | |
17 permissions described in the GCC Runtime Library Exception, version | |
18 3.1, as published by the Free Software Foundation. | |
19 | |
20 You should have received a copy of the GNU General Public License and | |
21 a copy of the GCC Runtime Library Exception along with this program; | |
22 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |
23 <http://www.gnu.org/licenses/>. */ | |
24 | |
25 #ifdef L_aeabi_lcmp | |
26 | |
27 FUNC_START aeabi_lcmp | |
28 cmp xxh, yyh | |
29 beq 1f | |
30 bgt 2f | |
31 mov r0, #1 | |
32 neg r0, r0 | |
33 RET | |
34 2: | |
35 mov r0, #1 | |
36 RET | |
37 1: | |
38 sub r0, xxl, yyl | |
39 beq 1f | |
40 bhi 2f | |
41 mov r0, #1 | |
42 neg r0, r0 | |
43 RET | |
44 2: | |
45 mov r0, #1 | |
46 1: | |
47 RET | |
48 FUNC_END aeabi_lcmp | |
49 | |
50 #endif /* L_aeabi_lcmp */ | |
51 | |
52 #ifdef L_aeabi_ulcmp | |
53 | |
54 FUNC_START aeabi_ulcmp | |
55 cmp xxh, yyh | |
56 bne 1f | |
57 sub r0, xxl, yyl | |
58 beq 2f | |
59 1: | |
60 bcs 1f | |
61 mov r0, #1 | |
62 neg r0, r0 | |
63 RET | |
64 1: | |
65 mov r0, #1 | |
66 2: | |
67 RET | |
68 FUNC_END aeabi_ulcmp | |
69 | |
70 #endif /* L_aeabi_ulcmp */ | |
71 | |
72 #ifdef L_aeabi_ldivmod | |
73 | |
74 FUNC_START aeabi_ldivmod | |
75 push {r0, r1} | |
76 mov r0, sp | |
77 push {r0, lr} | |
78 ldr r0, [sp, #8] | |
79 bl SYM(__gnu_ldivmod_helper) | |
80 ldr r3, [sp, #4] | |
81 mov lr, r3 | |
82 add sp, sp, #8 | |
83 pop {r2, r3} | |
84 RET | |
85 FUNC_END aeabi_ldivmod | |
86 | |
87 #endif /* L_aeabi_ldivmod */ | |
88 | |
89 #ifdef L_aeabi_uldivmod | |
90 | |
91 FUNC_START aeabi_uldivmod | |
92 push {r0, r1} | |
93 mov r0, sp | |
94 push {r0, lr} | |
95 ldr r0, [sp, #8] | |
96 bl SYM(__gnu_uldivmod_helper) | |
97 ldr r3, [sp, #4] | |
98 mov lr, r3 | |
99 add sp, sp, #8 | |
100 pop {r2, r3} | |
101 RET | |
102 FUNC_END aeabi_uldivmod | |
103 | |
104 #endif /* L_aeabi_uldivmod */ | |
105 | |
106 #ifdef L_arm_addsubsf3 | |
107 | |
108 FUNC_START aeabi_frsub | |
109 | |
110 push {r4, lr} | |
111 mov r4, #1 | |
112 lsl r4, #31 | |
113 eor r0, r0, r4 | |
114 bl __aeabi_fadd | |
115 pop {r4, pc} | |
116 | |
117 FUNC_END aeabi_frsub | |
118 | |
119 #endif /* L_arm_addsubsf3 */ | |
120 | |
121 #ifdef L_arm_cmpsf2 | |
122 | |
123 FUNC_START aeabi_cfrcmple | |
124 | |
125 mov ip, r0 | |
126 mov r0, r1 | |
127 mov r1, ip | |
128 b 6f | |
129 | |
130 FUNC_START aeabi_cfcmpeq | |
131 FUNC_ALIAS aeabi_cfcmple aeabi_cfcmpeq | |
132 | |
133 @ The status-returning routines are required to preserve all | |
134 @ registers except ip, lr, and cpsr. | |
135 6: push {r0, r1, r2, r3, r4, lr} | |
136 bl __lesf2 | |
137 @ Set the Z flag correctly, and the C flag unconditionally. | |
138 cmp r0, #0 | |
139 @ Clear the C flag if the return value was -1, indicating | |
140 @ that the first operand was smaller than the second. | |
141 bmi 1f | |
142 mov r1, #0 | |
143 cmn r0, r1 | |
144 1: | |
145 pop {r0, r1, r2, r3, r4, pc} | |
146 | |
147 FUNC_END aeabi_cfcmple | |
148 FUNC_END aeabi_cfcmpeq | |
149 FUNC_END aeabi_cfrcmple | |
150 | |
151 FUNC_START aeabi_fcmpeq | |
152 | |
153 push {r4, lr} | |
154 bl __eqsf2 | |
155 neg r0, r0 | |
156 add r0, r0, #1 | |
157 pop {r4, pc} | |
158 | |
159 FUNC_END aeabi_fcmpeq | |
160 | |
161 .macro COMPARISON cond, helper, mode=sf2 | |
162 FUNC_START aeabi_fcmp\cond | |
163 | |
164 push {r4, lr} | |
165 bl __\helper\mode | |
166 cmp r0, #0 | |
167 b\cond 1f | |
168 mov r0, #0 | |
169 pop {r4, pc} | |
170 1: | |
171 mov r0, #1 | |
172 pop {r4, pc} | |
173 | |
174 FUNC_END aeabi_fcmp\cond | |
175 .endm | |
176 | |
177 COMPARISON lt, le | |
178 COMPARISON le, le | |
179 COMPARISON gt, ge | |
180 COMPARISON ge, ge | |
181 | |
182 #endif /* L_arm_cmpsf2 */ | |
183 | |
184 #ifdef L_arm_addsubdf3 | |
185 | |
186 FUNC_START aeabi_drsub | |
187 | |
188 push {r4, lr} | |
189 mov r4, #1 | |
190 lsl r4, #31 | |
191 eor xxh, xxh, r4 | |
192 bl __aeabi_dadd | |
193 pop {r4, pc} | |
194 | |
195 FUNC_END aeabi_drsub | |
196 | |
197 #endif /* L_arm_addsubdf3 */ | |
198 | |
199 #ifdef L_arm_cmpdf2 | |
200 | |
201 FUNC_START aeabi_cdrcmple | |
202 | |
203 mov ip, r0 | |
204 mov r0, r2 | |
205 mov r2, ip | |
206 mov ip, r1 | |
207 mov r1, r3 | |
208 mov r3, ip | |
209 b 6f | |
210 | |
211 FUNC_START aeabi_cdcmpeq | |
212 FUNC_ALIAS aeabi_cdcmple aeabi_cdcmpeq | |
213 | |
214 @ The status-returning routines are required to preserve all | |
215 @ registers except ip, lr, and cpsr. | |
216 6: push {r0, r1, r2, r3, r4, lr} | |
217 bl __ledf2 | |
218 @ Set the Z flag correctly, and the C flag unconditionally. | |
219 cmp r0, #0 | |
220 @ Clear the C flag if the return value was -1, indicating | |
221 @ that the first operand was smaller than the second. | |
222 bmi 1f | |
223 mov r1, #0 | |
224 cmn r0, r1 | |
225 1: | |
226 pop {r0, r1, r2, r3, r4, pc} | |
227 | |
228 FUNC_END aeabi_cdcmple | |
229 FUNC_END aeabi_cdcmpeq | |
230 FUNC_END aeabi_cdrcmple | |
231 | |
232 FUNC_START aeabi_dcmpeq | |
233 | |
234 push {r4, lr} | |
235 bl __eqdf2 | |
236 neg r0, r0 | |
237 add r0, r0, #1 | |
238 pop {r4, pc} | |
239 | |
240 FUNC_END aeabi_dcmpeq | |
241 | |
242 .macro COMPARISON cond, helper, mode=df2 | |
243 FUNC_START aeabi_dcmp\cond | |
244 | |
245 push {r4, lr} | |
246 bl __\helper\mode | |
247 cmp r0, #0 | |
248 b\cond 1f | |
249 mov r0, #0 | |
250 pop {r4, pc} | |
251 1: | |
252 mov r0, #1 | |
253 pop {r4, pc} | |
254 | |
255 FUNC_END aeabi_dcmp\cond | |
256 .endm | |
257 | |
258 COMPARISON lt, le | |
259 COMPARISON le, le | |
260 COMPARISON gt, ge | |
261 COMPARISON ge, ge | |
262 | |
263 #endif /* L_arm_cmpdf2 */ |