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 GCC_ASM_EXPORT(__aeabi_uldivmod)
29 ASM_PFX(__aeabi_uldivmod):
30 stmdb sp!, {r4, r5, r6, lr}
34 orrs ip, r3, r2, lsr #31
35 bne ASM_PFX(__aeabi_uldivmod_label1)
39 addeq r6, r6, #16 // 0x10
43 addeq r6, r6, #8 // 0x8
46 addeq r6, r6, #4 // 0x4
49 addeq r6, r6, #2 // 0x2
52 addeq r6, r6, #1 // 0x1
53 b ASM_PFX(_ll_udiv_small)
54 ASM_PFX(__aeabi_uldivmod_label1):
55 tst r3, #-2147483648 // 0x80000000
56 bne ASM_PFX(__aeabi_uldivmod_label2)
58 addeq r6, r6, #16 // 0x10
62 addeq r6, r6, #8 // 0x8
65 addeq r6, r6, #4 // 0x4
68 addeq r6, r6, #2 // 0x2
70 addeq r6, r6, #1 // 0x1
71 rsb r3, r6, #32 // 0x20
73 orr ip, ip, r2, lsr r3
75 b ASM_PFX(_ll_udiv_big)
76 ASM_PFX(__aeabi_uldivmod_label2):
79 b ASM_PFX(_ll_udiv_ginormous)
81 ASM_PFX(_ll_udiv_small):
84 subcs r4, r4, ip, lsl #1
85 addcs r3, r3, #2 // 0x2
88 adcs r3, r3, #0 // 0x0
89 add r2, r6, #32 // 0x20
92 bcc ASM_PFX(_ll_udiv_small_label1)
93 orrs r0, r4, r5, lsr #30
96 subeq r2, r2, #32 // 0x20
97 ASM_PFX(_ll_udiv_small_label1):
100 bcc ASM_PFX(_ll_udiv_small_label2)
102 moveq r4, r4, lsl #16
103 addeq r1, r1, #16 // 0x10
104 ASM_PFX(_ll_udiv_small_label2):
107 bcc ASM_PFX(_ll_udiv_small_label3)
110 addeq r1, r1, #8 // 0x8
111 ASM_PFX(_ll_udiv_small_label3):
112 rsb r0, r1, #32 // 0x20
114 orr r4, r4, r5, lsr r0
117 bcc ASM_PFX(_ll_udiv_small_label5)
118 sub r2, r2, #1 // 0x1
119 and r0, r2, #7 // 0x7
120 eor r0, r0, #7 // 0x7
121 adds r0, r0, r0, lsl #1
122 add pc, pc, r0, lsl #2
124 ASM_PFX(_ll_udiv_small_label4):
126 adcs r4, ip, r4, lsl #1
129 adcs r4, ip, r4, lsl #1
132 adcs r4, ip, r4, lsl #1
135 adcs r4, ip, r4, lsl #1
138 adcs r4, ip, r4, lsl #1
141 adcs r4, ip, r4, lsl #1
144 adcs r4, ip, r4, lsl #1
147 adcs r4, ip, r4, lsl #1
148 sub r2, r2, #8 // 0x8
151 bpl ASM_PFX(_ll_udiv_small_label4)
152 ASM_PFX(_ll_udiv_small_label5):
154 bic r4, r4, r2, lsl r6
157 add r1, r1, r3, lsl r6
159 ldmia sp!, {r4, r5, r6, pc}
161 ASM_PFX(_ll_udiv_big):
167 adcs r3, r3, #0 // 0x0
172 adcs r3, r3, #0 // 0x0
177 adcs r3, r3, #0 // 0x0
179 rsbs lr, lr, #0 // 0x0
180 rsc ip, ip, #0 // 0x0
182 bcc ASM_PFX(_ll_udiv_big_label1)
184 moveq r4, r4, lsl #16
185 addeq r1, r1, #16 // 0x10
186 ASM_PFX(_ll_udiv_big_label1):
189 bcc ASM_PFX(_ll_udiv_big_label2)
192 addeq r1, r1, #8 // 0x8
193 ASM_PFX(_ll_udiv_big_label2):
194 rsb r0, r1, #32 // 0x20
196 orr r4, r4, r5, lsr r0
199 bcc ASM_PFX(_ll_udiv_big_label4)
200 sub r2, r2, #1 // 0x1
201 and r0, r2, #3 // 0x3
202 rsb r0, r0, #3 // 0x3
203 adds r0, r0, r0, lsl #1
204 add pc, pc, r0, lsl #3
206 ASM_PFX(_ll_udiv_big_label3):
225 sub r2, r2, #4 // 0x4
233 bpl ASM_PFX(_ll_udiv_big_label3)
234 ASM_PFX(_ll_udiv_big_label4):
237 bic r5, r5, r2, lsl r6
239 adc r1, r1, #0 // 0x0
242 bic r4, r4, r3, lsl r6
243 adc r1, r1, #0 // 0x0
245 orr r2, r2, r4, ror r6
246 adc r1, r1, #0 // 0x0
247 ldmia sp!, {r4, r5, r6, pc}
249 ASM_PFX(_ll_udiv_ginormous):
256 ldmia sp!, {r4, r5, r6, pc}
259 ldmia sp!, {r4, r5, r6, lr}
262 b ASM_PFX(__aeabi_ldiv0)
264 ASM_PFX(__aeabi_ldiv0):