lib1funcs.S (9938b04472d5c59f8bd8152a548533a8599596a2) lib1funcs.S (4dd1837d7589f468ed109556513f476e7a7f9121)
1/*
2 * linux/arch/arm/lib/lib1funcs.S: Optimized ARM division routines
3 *
4 * Author: Nicolas Pitre <nico@fluxnic.net>
5 * - contributed to gcc-3.4 on Sep 30, 2003
6 * - adapted for the Linux kernel on Oct 2, 2003
7 */
8

--- 22 unchanged lines hidden (view full) ---

31along with this program; see the file COPYING. If not, write to
32the Free Software Foundation, 59 Temple Place - Suite 330,
33Boston, MA 02111-1307, USA. */
34
35
36#include <linux/linkage.h>
37#include <asm/assembler.h>
38#include <asm/unwind.h>
1/*
2 * linux/arch/arm/lib/lib1funcs.S: Optimized ARM division routines
3 *
4 * Author: Nicolas Pitre <nico@fluxnic.net>
5 * - contributed to gcc-3.4 on Sep 30, 2003
6 * - adapted for the Linux kernel on Oct 2, 2003
7 */
8

--- 22 unchanged lines hidden (view full) ---

31along with this program; see the file COPYING. If not, write to
32the Free Software Foundation, 59 Temple Place - Suite 330,
33Boston, MA 02111-1307, USA. */
34
35
36#include <linux/linkage.h>
37#include <asm/assembler.h>
38#include <asm/unwind.h>
39#include <asm/export.h>
39
40.macro ARM_DIV_BODY dividend, divisor, result, curbit
41
42#if __LINUX_ARM_ARCH__ >= 5
43
44 clz \curbit, \divisor
45 clz \result, \dividend
46 sub \result, \curbit, \result

--- 186 unchanged lines hidden (view full) ---

23312: ARM_DIV2_ORDER r1, r2
234
235 mov r0, r0, lsr r2
236 ret lr
237
238UNWIND(.fnend)
239ENDPROC(__udivsi3)
240ENDPROC(__aeabi_uidiv)
40
41.macro ARM_DIV_BODY dividend, divisor, result, curbit
42
43#if __LINUX_ARM_ARCH__ >= 5
44
45 clz \curbit, \divisor
46 clz \result, \dividend
47 sub \result, \curbit, \result

--- 186 unchanged lines hidden (view full) ---

23412: ARM_DIV2_ORDER r1, r2
235
236 mov r0, r0, lsr r2
237 ret lr
238
239UNWIND(.fnend)
240ENDPROC(__udivsi3)
241ENDPROC(__aeabi_uidiv)
242EXPORT_SYMBOL(__udivsi3)
243EXPORT_SYMBOL(__aeabi_uidiv)
241
242ENTRY(__umodsi3)
243UNWIND(.fnstart)
244
245 subs r2, r1, #1 @ compare divisor with 1
246 bcc Ldiv0
247 cmpne r0, r1 @ compare dividend with divisor
248 moveq r0, #0
249 tsthi r1, r2 @ see if divisor is power of 2
250 andeq r0, r0, r2
251 retls lr
252
253 ARM_MOD_BODY r0, r1, r2, r3
254
255 ret lr
256
257UNWIND(.fnend)
258ENDPROC(__umodsi3)
244
245ENTRY(__umodsi3)
246UNWIND(.fnstart)
247
248 subs r2, r1, #1 @ compare divisor with 1
249 bcc Ldiv0
250 cmpne r0, r1 @ compare dividend with divisor
251 moveq r0, #0
252 tsthi r1, r2 @ see if divisor is power of 2
253 andeq r0, r0, r2
254 retls lr
255
256 ARM_MOD_BODY r0, r1, r2, r3
257
258 ret lr
259
260UNWIND(.fnend)
261ENDPROC(__umodsi3)
262EXPORT_SYMBOL(__umodsi3)
259
260#ifdef CONFIG_ARM_PATCH_IDIV
261 .align 3
262#endif
263
264ENTRY(__divsi3)
265ENTRY(__aeabi_idiv)
266UNWIND(.fnstart)

--- 31 unchanged lines hidden (view full) ---

298 cmp ip, #0
299 mov r0, r3, lsr r2
300 rsbmi r0, r0, #0
301 ret lr
302
303UNWIND(.fnend)
304ENDPROC(__divsi3)
305ENDPROC(__aeabi_idiv)
263
264#ifdef CONFIG_ARM_PATCH_IDIV
265 .align 3
266#endif
267
268ENTRY(__divsi3)
269ENTRY(__aeabi_idiv)
270UNWIND(.fnstart)

--- 31 unchanged lines hidden (view full) ---

302 cmp ip, #0
303 mov r0, r3, lsr r2
304 rsbmi r0, r0, #0
305 ret lr
306
307UNWIND(.fnend)
308ENDPROC(__divsi3)
309ENDPROC(__aeabi_idiv)
310EXPORT_SYMBOL(__divsi3)
311EXPORT_SYMBOL(__aeabi_idiv)
306
307ENTRY(__modsi3)
308UNWIND(.fnstart)
309
310 cmp r1, #0
311 beq Ldiv0
312 rsbmi r1, r1, #0 @ loops below use unsigned.
313 movs ip, r0 @ preserve sign of dividend

--- 8 unchanged lines hidden (view full) ---

322 ARM_MOD_BODY r0, r1, r2, r3
323
32410: cmp ip, #0
325 rsbmi r0, r0, #0
326 ret lr
327
328UNWIND(.fnend)
329ENDPROC(__modsi3)
312
313ENTRY(__modsi3)
314UNWIND(.fnstart)
315
316 cmp r1, #0
317 beq Ldiv0
318 rsbmi r1, r1, #0 @ loops below use unsigned.
319 movs ip, r0 @ preserve sign of dividend

--- 8 unchanged lines hidden (view full) ---

328 ARM_MOD_BODY r0, r1, r2, r3
329
33010: cmp ip, #0
331 rsbmi r0, r0, #0
332 ret lr
333
334UNWIND(.fnend)
335ENDPROC(__modsi3)
336EXPORT_SYMBOL(__modsi3)
330
331#ifdef CONFIG_AEABI
332
333ENTRY(__aeabi_uidivmod)
334UNWIND(.fnstart)
335UNWIND(.save {r0, r1, ip, lr} )
336
337 stmfd sp!, {r0, r1, ip, lr}
338 bl __aeabi_uidiv
339 ldmfd sp!, {r1, r2, ip, lr}
340 mul r3, r0, r2
341 sub r1, r1, r3
342 ret lr
343
344UNWIND(.fnend)
345ENDPROC(__aeabi_uidivmod)
337
338#ifdef CONFIG_AEABI
339
340ENTRY(__aeabi_uidivmod)
341UNWIND(.fnstart)
342UNWIND(.save {r0, r1, ip, lr} )
343
344 stmfd sp!, {r0, r1, ip, lr}
345 bl __aeabi_uidiv
346 ldmfd sp!, {r1, r2, ip, lr}
347 mul r3, r0, r2
348 sub r1, r1, r3
349 ret lr
350
351UNWIND(.fnend)
352ENDPROC(__aeabi_uidivmod)
353EXPORT_SYMBOL(__aeabi_uidivmod)
346
347ENTRY(__aeabi_idivmod)
348UNWIND(.fnstart)
349UNWIND(.save {r0, r1, ip, lr} )
350 stmfd sp!, {r0, r1, ip, lr}
351 bl __aeabi_idiv
352 ldmfd sp!, {r1, r2, ip, lr}
353 mul r3, r0, r2
354 sub r1, r1, r3
355 ret lr
356
357UNWIND(.fnend)
358ENDPROC(__aeabi_idivmod)
354
355ENTRY(__aeabi_idivmod)
356UNWIND(.fnstart)
357UNWIND(.save {r0, r1, ip, lr} )
358 stmfd sp!, {r0, r1, ip, lr}
359 bl __aeabi_idiv
360 ldmfd sp!, {r1, r2, ip, lr}
361 mul r3, r0, r2
362 sub r1, r1, r3
363 ret lr
364
365UNWIND(.fnend)
366ENDPROC(__aeabi_idivmod)
367EXPORT_SYMBOL(__aeabi_idivmod)
359
360#endif
361
362Ldiv0:
363UNWIND(.fnstart)
364UNWIND(.pad #4)
365UNWIND(.save {lr})
366 str lr, [sp, #-8]!
367 bl __div0
368 mov r0, #0 @ About as wrong as it could be.
369 ldr pc, [sp], #8
370UNWIND(.fnend)
371ENDPROC(Ldiv0)
368
369#endif
370
371Ldiv0:
372UNWIND(.fnstart)
373UNWIND(.pad #4)
374UNWIND(.save {lr})
375 str lr, [sp, #-8]!
376 bl __div0
377 mov r0, #0 @ About as wrong as it could be.
378 ldr pc, [sp], #8
379UNWIND(.fnend)
380ENDPROC(Ldiv0)