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