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