1/* # 1 "libgcc1.S" */ 2@ libgcc1 routines for ARM cpu. 3@ Division routines, written by Richard Earnshaw, (rearnsha@armltd.co.uk) 4dividend .req r0 5divisor .req r1 6result .req r2 7curbit .req r3 8/* ip .req r12 */ 9/* sp .req r13 */ 10/* lr .req r14 */ 11/* pc .req r15 */ 12 .text 13 .globl __udivsi3 14 .type __udivsi3 ,function 15 .align 0 16 __udivsi3 : 17 cmp divisor, #0 18 beq Ldiv0 19 mov curbit, #1 20 mov result, #0 21 cmp dividend, divisor 22 bcc Lgot_result 23Loop1: 24 @ Unless the divisor is very big, shift it up in multiples of 25 @ four bits, since this is the amount of unwinding in the main 26 @ division loop. Continue shifting until the divisor is 27 @ larger than the dividend. 28 cmp divisor, #0x10000000 29 cmpcc divisor, dividend 30 movcc divisor, divisor, lsl #4 31 movcc curbit, curbit, lsl #4 32 bcc Loop1 33Lbignum: 34 @ For very big divisors, we must shift it a bit at a time, or 35 @ we will be in danger of overflowing. 36 cmp divisor, #0x80000000 37 cmpcc divisor, dividend 38 movcc divisor, divisor, lsl #1 39 movcc curbit, curbit, lsl #1 40 bcc Lbignum 41Loop3: 42 @ Test for possible subtractions, and note which bits 43 @ are done in the result. On the final pass, this may subtract 44 @ too much from the dividend, but the result will be ok, since the 45 @ "bit" will have been shifted out at the bottom. 46 cmp dividend, divisor 47 subcs dividend, dividend, divisor 48 orrcs result, result, curbit 49 cmp dividend, divisor, lsr #1 50 subcs dividend, dividend, divisor, lsr #1 51 orrcs result, result, curbit, lsr #1 52 cmp dividend, divisor, lsr #2 53 subcs dividend, dividend, divisor, lsr #2 54 orrcs result, result, curbit, lsr #2 55 cmp dividend, divisor, lsr #3 56 subcs dividend, dividend, divisor, lsr #3 57 orrcs result, result, curbit, lsr #3 58 cmp dividend, #0 @ Early termination? 59 movnes curbit, curbit, lsr #4 @ No, any more bits to do? 60 movne divisor, divisor, lsr #4 61 bne Loop3 62Lgot_result: 63 mov r0, result 64 mov pc, lr 65Ldiv0: 66 str lr, [sp, #-4]! 67 bl __div0 (PLT) 68 mov r0, #0 @ about as wrong as it could be 69 ldmia sp!, {pc} 70 .size __udivsi3 , . - __udivsi3 71/* # 235 "libgcc1.S" */ 72/* # 320 "libgcc1.S" */ 73/* # 421 "libgcc1.S" */ 74/* # 433 "libgcc1.S" */ 75/* # 456 "libgcc1.S" */ 76/* # 500 "libgcc1.S" */ 77/* # 580 "libgcc1.S" */ 78