uldiv.S revision 1.1.1.1.6.2 1 1.1.1.1.6.2 christos /* $NetBSD: uldiv.S,v 1.1.1.1.6.2 2019/06/10 22:08:36 christos Exp $ */
2 1.1.1.1.6.2 christos
3 1.1.1.1.6.2 christos //------------------------------------------------------------------------------
4 1.1.1.1.6.2 christos //
5 1.1.1.1.6.2 christos // Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
6 1.1.1.1.6.2 christos //
7 1.1.1.1.6.2 christos // This program and the accompanying materials
8 1.1.1.1.6.2 christos // are licensed and made available under the terms and conditions of the BSD License
9 1.1.1.1.6.2 christos // which accompanies this distribution. The full text of the license may be found at
10 1.1.1.1.6.2 christos // http://opensource.org/licenses/bsd-license.php
11 1.1.1.1.6.2 christos //
12 1.1.1.1.6.2 christos // THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13 1.1.1.1.6.2 christos // WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
14 1.1.1.1.6.2 christos //
15 1.1.1.1.6.2 christos //------------------------------------------------------------------------------
16 1.1.1.1.6.2 christos
17 1.1.1.1.6.2 christos #include "edk2asm.h"
18 1.1.1.1.6.2 christos
19 1.1.1.1.6.2 christos .text
20 1.1.1.1.6.2 christos .align 2
21 1.1.1.1.6.2 christos GCC_ASM_EXPORT(__aeabi_uldivmod)
22 1.1.1.1.6.2 christos
23 1.1.1.1.6.2 christos //
24 1.1.1.1.6.2 christos //UINT64
25 1.1.1.1.6.2 christos //EFIAPI
26 1.1.1.1.6.2 christos //__aeabi_uldivmod (
27 1.1.1.1.6.2 christos // IN UINT64 Dividend
28 1.1.1.1.6.2 christos // IN UINT64 Divisor
29 1.1.1.1.6.2 christos // )
30 1.1.1.1.6.2 christos //
31 1.1.1.1.6.2 christos ASM_PFX(__aeabi_uldivmod):
32 1.1.1.1.6.2 christos stmdb sp!, {r4, r5, r6, lr}
33 1.1.1.1.6.2 christos mov r4, r1
34 1.1.1.1.6.2 christos mov r5, r0
35 1.1.1.1.6.2 christos mov r6, #0 // 0x0
36 1.1.1.1.6.2 christos orrs ip, r3, r2, lsr #31
37 1.1.1.1.6.2 christos bne ASM_PFX(__aeabi_uldivmod_label1)
38 1.1.1.1.6.2 christos tst r2, r2
39 1.1.1.1.6.2 christos beq ASM_PFX(_ll_div0)
40 1.1.1.1.6.2 christos movs ip, r2, lsr #15
41 1.1.1.1.6.2 christos addeq r6, r6, #16 // 0x10
42 1.1.1.1.6.2 christos mov ip, r2, lsl r6
43 1.1.1.1.6.2 christos movs lr, ip, lsr #23
44 1.1.1.1.6.2 christos moveq ip, ip, lsl #8
45 1.1.1.1.6.2 christos addeq r6, r6, #8 // 0x8
46 1.1.1.1.6.2 christos movs lr, ip, lsr #27
47 1.1.1.1.6.2 christos moveq ip, ip, lsl #4
48 1.1.1.1.6.2 christos addeq r6, r6, #4 // 0x4
49 1.1.1.1.6.2 christos movs lr, ip, lsr #29
50 1.1.1.1.6.2 christos moveq ip, ip, lsl #2
51 1.1.1.1.6.2 christos addeq r6, r6, #2 // 0x2
52 1.1.1.1.6.2 christos movs lr, ip, lsr #30
53 1.1.1.1.6.2 christos moveq ip, ip, lsl #1
54 1.1.1.1.6.2 christos addeq r6, r6, #1 // 0x1
55 1.1.1.1.6.2 christos b ASM_PFX(_ll_udiv_small)
56 1.1.1.1.6.2 christos ASM_PFX(__aeabi_uldivmod_label1):
57 1.1.1.1.6.2 christos tst r3, #-2147483648 // 0x80000000
58 1.1.1.1.6.2 christos bne ASM_PFX(__aeabi_uldivmod_label2)
59 1.1.1.1.6.2 christos movs ip, r3, lsr #15
60 1.1.1.1.6.2 christos addeq r6, r6, #16 // 0x10
61 1.1.1.1.6.2 christos mov ip, r3, lsl r6
62 1.1.1.1.6.2 christos movs lr, ip, lsr #23
63 1.1.1.1.6.2 christos moveq ip, ip, lsl #8
64 1.1.1.1.6.2 christos addeq r6, r6, #8 // 0x8
65 1.1.1.1.6.2 christos movs lr, ip, lsr #27
66 1.1.1.1.6.2 christos moveq ip, ip, lsl #4
67 1.1.1.1.6.2 christos addeq r6, r6, #4 // 0x4
68 1.1.1.1.6.2 christos movs lr, ip, lsr #29
69 1.1.1.1.6.2 christos moveq ip, ip, lsl #2
70 1.1.1.1.6.2 christos addeq r6, r6, #2 // 0x2
71 1.1.1.1.6.2 christos movs lr, ip, lsr #30
72 1.1.1.1.6.2 christos addeq r6, r6, #1 // 0x1
73 1.1.1.1.6.2 christos rsb r3, r6, #32 // 0x20
74 1.1.1.1.6.2 christos moveq ip, ip, lsl #1
75 1.1.1.1.6.2 christos orr ip, ip, r2, lsr r3
76 1.1.1.1.6.2 christos mov lr, r2, lsl r6
77 1.1.1.1.6.2 christos b ASM_PFX(_ll_udiv_big)
78 1.1.1.1.6.2 christos ASM_PFX(__aeabi_uldivmod_label2):
79 1.1.1.1.6.2 christos mov ip, r3
80 1.1.1.1.6.2 christos mov lr, r2
81 1.1.1.1.6.2 christos b ASM_PFX(_ll_udiv_ginormous)
82 1.1.1.1.6.2 christos
83 1.1.1.1.6.2 christos ASM_PFX(_ll_udiv_small):
84 1.1.1.1.6.2 christos cmp r4, ip, lsl #1
85 1.1.1.1.6.2 christos mov r3, #0 // 0x0
86 1.1.1.1.6.2 christos subcs r4, r4, ip, lsl #1
87 1.1.1.1.6.2 christos addcs r3, r3, #2 // 0x2
88 1.1.1.1.6.2 christos cmp r4, ip
89 1.1.1.1.6.2 christos subcs r4, r4, ip
90 1.1.1.1.6.2 christos adcs r3, r3, #0 // 0x0
91 1.1.1.1.6.2 christos add r2, r6, #32 // 0x20
92 1.1.1.1.6.2 christos cmp r2, #32 // 0x20
93 1.1.1.1.6.2 christos rsb ip, ip, #0 // 0x0
94 1.1.1.1.6.2 christos bcc ASM_PFX(_ll_udiv_small_label1)
95 1.1.1.1.6.2 christos orrs r0, r4, r5, lsr #30
96 1.1.1.1.6.2 christos moveq r4, r5
97 1.1.1.1.6.2 christos moveq r5, #0 // 0x0
98 1.1.1.1.6.2 christos subeq r2, r2, #32 // 0x20
99 1.1.1.1.6.2 christos ASM_PFX(_ll_udiv_small_label1):
100 1.1.1.1.6.2 christos mov r1, #0 // 0x0
101 1.1.1.1.6.2 christos cmp r2, #16 // 0x10
102 1.1.1.1.6.2 christos bcc ASM_PFX(_ll_udiv_small_label2)
103 1.1.1.1.6.2 christos movs r0, r4, lsr #14
104 1.1.1.1.6.2 christos moveq r4, r4, lsl #16
105 1.1.1.1.6.2 christos addeq r1, r1, #16 // 0x10
106 1.1.1.1.6.2 christos ASM_PFX(_ll_udiv_small_label2):
107 1.1.1.1.6.2 christos sub lr, r2, r1
108 1.1.1.1.6.2 christos cmp lr, #8 // 0x8
109 1.1.1.1.6.2 christos bcc ASM_PFX(_ll_udiv_small_label3)
110 1.1.1.1.6.2 christos movs r0, r4, lsr #22
111 1.1.1.1.6.2 christos moveq r4, r4, lsl #8
112 1.1.1.1.6.2 christos addeq r1, r1, #8 // 0x8
113 1.1.1.1.6.2 christos ASM_PFX(_ll_udiv_small_label3):
114 1.1.1.1.6.2 christos rsb r0, r1, #32 // 0x20
115 1.1.1.1.6.2 christos sub r2, r2, r1
116 1.1.1.1.6.2 christos orr r4, r4, r5, lsr r0
117 1.1.1.1.6.2 christos mov r5, r5, lsl r1
118 1.1.1.1.6.2 christos cmp r2, #1 // 0x1
119 1.1.1.1.6.2 christos bcc ASM_PFX(_ll_udiv_small_label5)
120 1.1.1.1.6.2 christos sub r2, r2, #1 // 0x1
121 1.1.1.1.6.2 christos and r0, r2, #7 // 0x7
122 1.1.1.1.6.2 christos eor r0, r0, #7 // 0x7
123 1.1.1.1.6.2 christos adds r0, r0, r0, lsl #1
124 1.1.1.1.6.2 christos add pc, pc, r0, lsl #2
125 1.1.1.1.6.2 christos nop // (mov r0,r0)
126 1.1.1.1.6.2 christos ASM_PFX(_ll_udiv_small_label4):
127 1.1.1.1.6.2 christos adcs r5, r5, r5
128 1.1.1.1.6.2 christos adcs r4, ip, r4, lsl #1
129 1.1.1.1.6.2 christos rsbcc r4, ip, r4
130 1.1.1.1.6.2 christos adcs r5, r5, r5
131 1.1.1.1.6.2 christos adcs r4, ip, r4, lsl #1
132 1.1.1.1.6.2 christos rsbcc r4, ip, r4
133 1.1.1.1.6.2 christos adcs r5, r5, r5
134 1.1.1.1.6.2 christos adcs r4, ip, r4, lsl #1
135 1.1.1.1.6.2 christos rsbcc r4, ip, r4
136 1.1.1.1.6.2 christos adcs r5, r5, r5
137 1.1.1.1.6.2 christos adcs r4, ip, r4, lsl #1
138 1.1.1.1.6.2 christos rsbcc r4, ip, r4
139 1.1.1.1.6.2 christos adcs r5, r5, r5
140 1.1.1.1.6.2 christos adcs r4, ip, r4, lsl #1
141 1.1.1.1.6.2 christos rsbcc r4, ip, r4
142 1.1.1.1.6.2 christos adcs r5, r5, r5
143 1.1.1.1.6.2 christos adcs r4, ip, r4, lsl #1
144 1.1.1.1.6.2 christos rsbcc r4, ip, r4
145 1.1.1.1.6.2 christos adcs r5, r5, r5
146 1.1.1.1.6.2 christos adcs r4, ip, r4, lsl #1
147 1.1.1.1.6.2 christos rsbcc r4, ip, r4
148 1.1.1.1.6.2 christos adcs r5, r5, r5
149 1.1.1.1.6.2 christos adcs r4, ip, r4, lsl #1
150 1.1.1.1.6.2 christos sub r2, r2, #8 // 0x8
151 1.1.1.1.6.2 christos tst r2, r2
152 1.1.1.1.6.2 christos rsbcc r4, ip, r4
153 1.1.1.1.6.2 christos bpl ASM_PFX(_ll_udiv_small_label4)
154 1.1.1.1.6.2 christos ASM_PFX(_ll_udiv_small_label5):
155 1.1.1.1.6.2 christos mov r2, r4, lsr r6
156 1.1.1.1.6.2 christos bic r4, r4, r2, lsl r6
157 1.1.1.1.6.2 christos adcs r0, r5, r5
158 1.1.1.1.6.2 christos adc r1, r4, r4
159 1.1.1.1.6.2 christos add r1, r1, r3, lsl r6
160 1.1.1.1.6.2 christos mov r3, #0 // 0x0
161 1.1.1.1.6.2 christos ldmia sp!, {r4, r5, r6, pc}
162 1.1.1.1.6.2 christos
163 1.1.1.1.6.2 christos ASM_PFX(_ll_udiv_big):
164 1.1.1.1.6.2 christos subs r0, r5, lr
165 1.1.1.1.6.2 christos mov r3, #0 // 0x0
166 1.1.1.1.6.2 christos sbcs r1, r4, ip
167 1.1.1.1.6.2 christos movcs r5, r0
168 1.1.1.1.6.2 christos movcs r4, r1
169 1.1.1.1.6.2 christos adcs r3, r3, #0 // 0x0
170 1.1.1.1.6.2 christos subs r0, r5, lr
171 1.1.1.1.6.2 christos sbcs r1, r4, ip
172 1.1.1.1.6.2 christos movcs r5, r0
173 1.1.1.1.6.2 christos movcs r4, r1
174 1.1.1.1.6.2 christos adcs r3, r3, #0 // 0x0
175 1.1.1.1.6.2 christos subs r0, r5, lr
176 1.1.1.1.6.2 christos sbcs r1, r4, ip
177 1.1.1.1.6.2 christos movcs r5, r0
178 1.1.1.1.6.2 christos movcs r4, r1
179 1.1.1.1.6.2 christos adcs r3, r3, #0 // 0x0
180 1.1.1.1.6.2 christos mov r1, #0 // 0x0
181 1.1.1.1.6.2 christos rsbs lr, lr, #0 // 0x0
182 1.1.1.1.6.2 christos rsc ip, ip, #0 // 0x0
183 1.1.1.1.6.2 christos cmp r6, #16 // 0x10
184 1.1.1.1.6.2 christos bcc ASM_PFX(_ll_udiv_big_label1)
185 1.1.1.1.6.2 christos movs r0, r4, lsr #14
186 1.1.1.1.6.2 christos moveq r4, r4, lsl #16
187 1.1.1.1.6.2 christos addeq r1, r1, #16 // 0x10
188 1.1.1.1.6.2 christos ASM_PFX(_ll_udiv_big_label1):
189 1.1.1.1.6.2 christos sub r2, r6, r1
190 1.1.1.1.6.2 christos cmp r2, #8 // 0x8
191 1.1.1.1.6.2 christos bcc ASM_PFX(_ll_udiv_big_label2)
192 1.1.1.1.6.2 christos movs r0, r4, lsr #22
193 1.1.1.1.6.2 christos moveq r4, r4, lsl #8
194 1.1.1.1.6.2 christos addeq r1, r1, #8 // 0x8
195 1.1.1.1.6.2 christos ASM_PFX(_ll_udiv_big_label2):
196 1.1.1.1.6.2 christos rsb r0, r1, #32 // 0x20
197 1.1.1.1.6.2 christos sub r2, r6, r1
198 1.1.1.1.6.2 christos orr r4, r4, r5, lsr r0
199 1.1.1.1.6.2 christos mov r5, r5, lsl r1
200 1.1.1.1.6.2 christos cmp r2, #1 // 0x1
201 1.1.1.1.6.2 christos bcc ASM_PFX(_ll_udiv_big_label4)
202 1.1.1.1.6.2 christos sub r2, r2, #1 // 0x1
203 1.1.1.1.6.2 christos and r0, r2, #3 // 0x3
204 1.1.1.1.6.2 christos rsb r0, r0, #3 // 0x3
205 1.1.1.1.6.2 christos adds r0, r0, r0, lsl #1
206 1.1.1.1.6.2 christos add pc, pc, r0, lsl #3
207 1.1.1.1.6.2 christos nop // (mov r0,r0)
208 1.1.1.1.6.2 christos ASM_PFX(_ll_udiv_big_label3):
209 1.1.1.1.6.2 christos adcs r5, r5, r5
210 1.1.1.1.6.2 christos adcs r4, r4, r4
211 1.1.1.1.6.2 christos adcs r0, lr, r5
212 1.1.1.1.6.2 christos adcs r1, ip, r4
213 1.1.1.1.6.2 christos movcs r5, r0
214 1.1.1.1.6.2 christos movcs r4, r1
215 1.1.1.1.6.2 christos adcs r5, r5, r5
216 1.1.1.1.6.2 christos adcs r4, r4, r4
217 1.1.1.1.6.2 christos adcs r0, lr, r5
218 1.1.1.1.6.2 christos adcs r1, ip, r4
219 1.1.1.1.6.2 christos movcs r5, r0
220 1.1.1.1.6.2 christos movcs r4, r1
221 1.1.1.1.6.2 christos adcs r5, r5, r5
222 1.1.1.1.6.2 christos adcs r4, r4, r4
223 1.1.1.1.6.2 christos adcs r0, lr, r5
224 1.1.1.1.6.2 christos adcs r1, ip, r4
225 1.1.1.1.6.2 christos movcs r5, r0
226 1.1.1.1.6.2 christos movcs r4, r1
227 1.1.1.1.6.2 christos sub r2, r2, #4 // 0x4
228 1.1.1.1.6.2 christos adcs r5, r5, r5
229 1.1.1.1.6.2 christos adcs r4, r4, r4
230 1.1.1.1.6.2 christos adcs r0, lr, r5
231 1.1.1.1.6.2 christos adcs r1, ip, r4
232 1.1.1.1.6.2 christos tst r2, r2
233 1.1.1.1.6.2 christos movcs r5, r0
234 1.1.1.1.6.2 christos movcs r4, r1
235 1.1.1.1.6.2 christos bpl ASM_PFX(_ll_udiv_big_label3)
236 1.1.1.1.6.2 christos ASM_PFX(_ll_udiv_big_label4):
237 1.1.1.1.6.2 christos mov r1, #0 // 0x0
238 1.1.1.1.6.2 christos mov r2, r5, lsr r6
239 1.1.1.1.6.2 christos bic r5, r5, r2, lsl r6
240 1.1.1.1.6.2 christos adcs r0, r5, r5
241 1.1.1.1.6.2 christos adc r1, r1, #0 // 0x0
242 1.1.1.1.6.2 christos movs lr, r3, lsl r6
243 1.1.1.1.6.2 christos mov r3, r4, lsr r6
244 1.1.1.1.6.2 christos bic r4, r4, r3, lsl r6
245 1.1.1.1.6.2 christos adc r1, r1, #0 // 0x0
246 1.1.1.1.6.2 christos adds r0, r0, lr
247 1.1.1.1.6.2 christos orr r2, r2, r4, ror r6
248 1.1.1.1.6.2 christos adc r1, r1, #0 // 0x0
249 1.1.1.1.6.2 christos ldmia sp!, {r4, r5, r6, pc}
250 1.1.1.1.6.2 christos
251 1.1.1.1.6.2 christos ASM_PFX(_ll_udiv_ginormous):
252 1.1.1.1.6.2 christos subs r2, r5, lr
253 1.1.1.1.6.2 christos mov r1, #0 // 0x0
254 1.1.1.1.6.2 christos sbcs r3, r4, ip
255 1.1.1.1.6.2 christos adc r0, r1, r1
256 1.1.1.1.6.2 christos movcc r2, r5
257 1.1.1.1.6.2 christos movcc r3, r4
258 1.1.1.1.6.2 christos ldmia sp!, {r4, r5, r6, pc}
259 1.1.1.1.6.2 christos
260 1.1.1.1.6.2 christos ASM_PFX(_ll_div0):
261 1.1.1.1.6.2 christos ldmia sp!, {r4, r5, r6, lr}
262 1.1.1.1.6.2 christos mov r0, #0 // 0x0
263 1.1.1.1.6.2 christos mov r1, #0 // 0x0
264 1.1.1.1.6.2 christos b ASM_PFX(__aeabi_ldiv0)
265 1.1.1.1.6.2 christos
266 1.1.1.1.6.2 christos ASM_PFX(__aeabi_ldiv0):
267 1.1.1.1.6.2 christos bx r14
268 1.1.1.1.6.2 christos
269 1.1.1.1.6.2 christos
270