1 //------------------------------------------------------------------------------
3 // Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
5 // This program and the accompanying materials
6 // are licensed and made available under the terms and conditions of the BSD License
7 // which accompanies this distribution. The full text of the license may be found at
8 // http://opensource.org/licenses/bsd-license.php
10 // THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13 //------------------------------------------------------------------------------
19 .globl ASM_PFX(__aeabi_uldivmod)
20 INTERWORK_FUNC(__aeabi_uldivmod)
30 ASM_PFX(__aeabi_uldivmod):
31 stmdb sp!, {r4, r5, r6, lr}
35 orrs ip, r3, r2, lsr #31
36 bne ASM_PFX(__aeabi_uldivmod_label1)
40 addeq r6, r6, #16 // 0x10
44 addeq r6, r6, #8 // 0x8
47 addeq r6, r6, #4 // 0x4
50 addeq r6, r6, #2 // 0x2
53 addeq r6, r6, #1 // 0x1
54 b ASM_PFX(_ll_udiv_small)
55 ASM_PFX(__aeabi_uldivmod_label1):
56 tst r3, #-2147483648 // 0x80000000
57 bne ASM_PFX(__aeabi_uldivmod_label2)
59 addeq r6, r6, #16 // 0x10
63 addeq r6, r6, #8 // 0x8
66 addeq r6, r6, #4 // 0x4
69 addeq r6, r6, #2 // 0x2
71 addeq r6, r6, #1 // 0x1
72 rsb r3, r6, #32 // 0x20
74 orr ip, ip, r2, lsr r3
76 b ASM_PFX(_ll_udiv_big)
77 ASM_PFX(__aeabi_uldivmod_label2):
80 b ASM_PFX(_ll_udiv_ginormous)
82 ASM_PFX(_ll_udiv_small):
85 subcs r4, r4, ip, lsl #1
86 addcs r3, r3, #2 // 0x2
89 adcs r3, r3, #0 // 0x0
90 add r2, r6, #32 // 0x20
93 bcc ASM_PFX(_ll_udiv_small_label1)
94 orrs r0, r4, r5, lsr #30
97 subeq r2, r2, #32 // 0x20
98 ASM_PFX(_ll_udiv_small_label1):
101 bcc ASM_PFX(_ll_udiv_small_label2)
103 moveq r4, r4, lsl #16
104 addeq r1, r1, #16 // 0x10
105 ASM_PFX(_ll_udiv_small_label2):
108 bcc ASM_PFX(_ll_udiv_small_label3)
111 addeq r1, r1, #8 // 0x8
112 ASM_PFX(_ll_udiv_small_label3):
113 rsb r0, r1, #32 // 0x20
115 orr r4, r4, r5, lsr r0
118 bcc ASM_PFX(_ll_udiv_small_label5)
119 sub r2, r2, #1 // 0x1
120 and r0, r2, #7 // 0x7
121 eor r0, r0, #7 // 0x7
122 adds r0, r0, r0, lsl #1
123 add pc, pc, r0, lsl #2
125 ASM_PFX(_ll_udiv_small_label4):
127 adcs r4, ip, r4, lsl #1
130 adcs r4, ip, r4, lsl #1
133 adcs r4, ip, r4, lsl #1
136 adcs r4, ip, r4, lsl #1
139 adcs r4, ip, r4, lsl #1
142 adcs r4, ip, r4, lsl #1
145 adcs r4, ip, r4, lsl #1
148 adcs r4, ip, r4, lsl #1
149 sub r2, r2, #8 // 0x8
152 bpl ASM_PFX(_ll_udiv_small_label4)
153 ASM_PFX(_ll_udiv_small_label5):
155 bic r4, r4, r2, lsl r6
158 add r1, r1, r3, lsl r6
160 ldmia sp!, {r4, r5, r6, pc}
162 ASM_PFX(_ll_udiv_big):
168 adcs r3, r3, #0 // 0x0
173 adcs r3, r3, #0 // 0x0
178 adcs r3, r3, #0 // 0x0
180 rsbs lr, lr, #0 // 0x0
181 rsc ip, ip, #0 // 0x0
183 bcc ASM_PFX(_ll_udiv_big_label1)
185 moveq r4, r4, lsl #16
186 addeq r1, r1, #16 // 0x10
187 ASM_PFX(_ll_udiv_big_label1):
190 bcc ASM_PFX(_ll_udiv_big_label2)
193 addeq r1, r1, #8 // 0x8
194 ASM_PFX(_ll_udiv_big_label2):
195 rsb r0, r1, #32 // 0x20
197 orr r4, r4, r5, lsr r0
200 bcc ASM_PFX(_ll_udiv_big_label4)
201 sub r2, r2, #1 // 0x1
202 and r0, r2, #3 // 0x3
203 rsb r0, r0, #3 // 0x3
204 adds r0, r0, r0, lsl #1
205 add pc, pc, r0, lsl #3
207 ASM_PFX(_ll_udiv_big_label3):
226 sub r2, r2, #4 // 0x4
234 bpl ASM_PFX(_ll_udiv_big_label3)
235 ASM_PFX(_ll_udiv_big_label4):
238 bic r5, r5, r2, lsl r6
240 adc r1, r1, #0 // 0x0
243 bic r4, r4, r3, lsl r6
244 adc r1, r1, #0 // 0x0
246 orr r2, r2, r4, ror r6
247 adc r1, r1, #0 // 0x0
248 ldmia sp!, {r4, r5, r6, pc}
250 ASM_PFX(_ll_udiv_ginormous):
257 ldmia sp!, {r4, r5, r6, pc}
260 ldmia sp!, {r4, r5, r6, lr}
263 b ASM_PFX(__aeabi_ldiv0)
265 ASM_PFX(__aeabi_ldiv0):