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