~pmdj/ubuntu/trusty/qemu/2.9+applesmc+fadtv3

« back to all changes in this revision

Viewing changes to roms/u-boot/arch/arm/lib/_udivsi3.S

  • Committer: Phil Dennis-Jordan
  • Date: 2017-07-21 08:03:43 UTC
  • mfrom: (1.1.1)
  • Revision ID: phil@philjordan.eu-20170721080343-2yr2vdj7713czahv
New upstream release 2.9.0.

Show diffs side-by-side

added added

removed removed

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