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