1 .macro ARM_DIV_BODY dividend, divisor, result, curbit
3 #if __LINUX_ARM_ARCH__ >= 5
7 sub \result, \curbit, \result
9 mov \divisor, \divisor, lsl \result
10 mov \curbit, \curbit, lsl \result
15 @ Initially shift the divisor left 3 bits if possible,
16 @ set curbit accordingly. This allows for curbit to be located
17 @ at the left end of each 4 bit nibbles in the division loop
18 @ to save one loop in most cases.
19 tst \divisor, #0xe0000000
20 moveq \divisor, \divisor, lsl #3
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 1: cmp \divisor, #0x10000000
29 cmplo \divisor, \dividend
30 movlo \divisor, \divisor, lsl #4
31 movlo \curbit, \curbit, lsl #4
34 @ For very big divisors, we must shift it a bit at a time, or
35 @ we will be in danger of overflowing.
36 1: cmp \divisor, #0x80000000
37 cmplo \divisor, \dividend
38 movlo \divisor, \divisor, lsl #1
39 movlo \curbit, \curbit, lsl #1
47 1: cmp \dividend, \divisor
48 subhs \dividend, \dividend, \divisor
49 orrhs \result, \result, \curbit
50 cmp \dividend, \divisor, lsr #1
51 subhs \dividend, \dividend, \divisor, lsr #1
52 orrhs \result, \result, \curbit, lsr #1
53 cmp \dividend, \divisor, lsr #2
54 subhs \dividend, \dividend, \divisor, lsr #2
55 orrhs \result, \result, \curbit, lsr #2
56 cmp \dividend, \divisor, lsr #3
57 subhs \dividend, \dividend, \divisor, lsr #3
58 orrhs \result, \result, \curbit, lsr #3
59 cmp \dividend, #0 @ Early termination?
60 movnes \curbit, \curbit, lsr #4 @ No, any more bits to do?
61 movne \divisor, \divisor, lsr #4
66 .macro ARM_DIV2_ORDER divisor, order
68 #if __LINUX_ARM_ARCH__ >= 5
71 rsb \order, \order, #31
75 cmp \divisor, #(1 << 16)
76 movhs \divisor, \divisor, lsr #16
80 cmp \divisor, #(1 << 8)
81 movhs \divisor, \divisor, lsr #8
82 addhs \order, \order, #8
84 cmp \divisor, #(1 << 4)
85 movhs \divisor, \divisor, lsr #4
86 addhs \order, \order, #4
88 cmp \divisor, #(1 << 2)
89 addhi \order, \order, #3
90 addls \order, \order, \divisor, lsr #1
102 eor ip, r0, r1 @ save the sign of the result.
104 rsbmi r1, r1, #0 @ loops below use unsigned.
105 subs r2, r1, #1 @ division by 1 or -1 ?
108 rsbmi r3, r0, #0 @ positive dividend value
111 tst r1, r2 @ divisor is power of 2 ?
114 ARM_DIV_BODY r3, r1, r0, r2
120 10: teq ip, r0 @ same sign ?
125 moveq r0, ip, asr #31
129 12: ARM_DIV2_ORDER r1, r2
140 mov r0, #0 @ About as wrong as it could be.