]> git.proxmox.com Git - mirror_edk2.git/blob - ArmPkg/Library/CompilerIntrinsicsLib/Arm/uldiv.asm
e143052a712f2a678654ce66088b506c67d8fd8b
[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 // SPDX-License-Identifier: BSD-2-Clause-Patent
7 //
8 //------------------------------------------------------------------------------
9
10
11 EXPORT __aeabi_uldivmod
12 EXPORT __rt_udiv64
13
14 AREA s___aeabi_uldivmod, CODE, READONLY, ARM
15
16 ARM
17
18 ;
19 ;UINT64
20 ;EFIAPI
21 ;__rt_udiv64 (
22 ; IN UINT64 Divisor
23 ; IN UINT64 Dividend
24 ; )
25 ;
26 __rt_udiv64
27 ; Swap r0-r1 and r2-r3
28 mov r12, r0
29 mov r0, r2
30 mov r2, r12
31 mov r12, r1
32 mov r1, r3
33 mov r3, r12
34 b __aeabi_uldivmod
35
36 ;
37 ;UINT64
38 ;EFIAPI
39 ;__aeabi_uldivmod (
40 ; IN UINT64 Dividend
41 ; IN UINT64 Divisor
42 ; )
43 ;
44 __aeabi_uldivmod
45 stmdb sp!, {r4, r5, r6, lr}
46 mov r4, r1
47 mov r5, r0
48 mov r6, #0 ; 0x0
49 orrs ip, r3, r2, lsr #31
50 bne __aeabi_uldivmod_label1
51 tst r2, r2
52 beq _ll_div0
53 movs ip, r2, lsr #15
54 addeq r6, r6, #16 ; 0x10
55 mov ip, r2, lsl r6
56 movs lr, ip, lsr #23
57 moveq ip, ip, lsl #8
58 addeq r6, r6, #8 ; 0x8
59 movs lr, ip, lsr #27
60 moveq ip, ip, lsl #4
61 addeq r6, r6, #4 ; 0x4
62 movs lr, ip, lsr #29
63 moveq ip, ip, lsl #2
64 addeq r6, r6, #2 ; 0x2
65 movs lr, ip, lsr #30
66 moveq ip, ip, lsl #1
67 addeq r6, r6, #1 ; 0x1
68 b _ll_udiv_small
69 __aeabi_uldivmod_label1
70 tst r3, #-2147483648 ; 0x80000000
71 bne __aeabi_uldivmod_label2
72 movs ip, r3, lsr #15
73 addeq r6, r6, #16 ; 0x10
74 mov ip, r3, lsl r6
75 movs lr, ip, lsr #23
76 moveq ip, ip, lsl #8
77 addeq r6, r6, #8 ; 0x8
78 movs lr, ip, lsr #27
79 moveq ip, ip, lsl #4
80 addeq r6, r6, #4 ; 0x4
81 movs lr, ip, lsr #29
82 moveq ip, ip, lsl #2
83 addeq r6, r6, #2 ; 0x2
84 movs lr, ip, lsr #30
85 addeq r6, r6, #1 ; 0x1
86 rsb r3, r6, #32 ; 0x20
87 moveq ip, ip, lsl #1
88 orr ip, ip, r2, lsr r3
89 mov lr, r2, lsl r6
90 b _ll_udiv_big
91 __aeabi_uldivmod_label2
92 mov ip, r3
93 mov lr, r2
94 b _ll_udiv_ginormous
95
96 _ll_udiv_small
97 cmp r4, ip, lsl #1
98 mov r3, #0 ; 0x0
99 subcs r4, r4, ip, lsl #1
100 addcs r3, r3, #2 ; 0x2
101 cmp r4, ip
102 subcs r4, r4, ip
103 adcs r3, r3, #0 ; 0x0
104 add r2, r6, #32 ; 0x20
105 cmp r2, #32 ; 0x20
106 rsb ip, ip, #0 ; 0x0
107 bcc _ll_udiv_small_label1
108 orrs r0, r4, r5, lsr #30
109 moveq r4, r5
110 moveq r5, #0 ; 0x0
111 subeq r2, r2, #32 ; 0x20
112 _ll_udiv_small_label1
113 mov r1, #0 ; 0x0
114 cmp r2, #16 ; 0x10
115 bcc _ll_udiv_small_label2
116 movs r0, r4, lsr #14
117 moveq r4, r4, lsl #16
118 addeq r1, r1, #16 ; 0x10
119 _ll_udiv_small_label2
120 sub lr, r2, r1
121 cmp lr, #8 ; 0x8
122 bcc _ll_udiv_small_label3
123 movs r0, r4, lsr #22
124 moveq r4, r4, lsl #8
125 addeq r1, r1, #8 ; 0x8
126 _ll_udiv_small_label3
127 rsb r0, r1, #32 ; 0x20
128 sub r2, r2, r1
129 orr r4, r4, r5, lsr r0
130 mov r5, r5, lsl r1
131 cmp r2, #1 ; 0x1
132 bcc _ll_udiv_small_label5
133 sub r2, r2, #1 ; 0x1
134 and r0, r2, #7 ; 0x7
135 eor r0, r0, #7 ; 0x7
136 adds r0, r0, r0, lsl #1
137 add pc, pc, r0, lsl #2
138 nop ; (mov r0,r0)
139 _ll_udiv_small_label4
140 adcs r5, r5, r5
141 adcs r4, ip, r4, lsl #1
142 rsbcc r4, ip, r4
143 adcs r5, r5, r5
144 adcs r4, ip, r4, lsl #1
145 rsbcc r4, ip, r4
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 sub r2, r2, #8 ; 0x8
164 tst r2, r2
165 rsbcc r4, ip, r4
166 bpl _ll_udiv_small_label4
167 _ll_udiv_small_label5
168 mov r2, r4, lsr r6
169 bic r4, r4, r2, lsl r6
170 adcs r0, r5, r5
171 adc r1, r4, r4
172 add r1, r1, r3, lsl r6
173 mov r3, #0 ; 0x0
174 ldmia sp!, {r4, r5, r6, pc}
175
176 _ll_udiv_big
177 subs r0, r5, lr
178 mov r3, #0 ; 0x0
179 sbcs r1, r4, ip
180 movcs r5, r0
181 movcs r4, r1
182 adcs r3, r3, #0 ; 0x0
183 subs r0, r5, lr
184 sbcs r1, r4, ip
185 movcs r5, r0
186 movcs r4, r1
187 adcs r3, r3, #0 ; 0x0
188 subs r0, r5, lr
189 sbcs r1, r4, ip
190 movcs r5, r0
191 movcs r4, r1
192 adcs r3, r3, #0 ; 0x0
193 mov r1, #0 ; 0x0
194 rsbs lr, lr, #0 ; 0x0
195 rsc ip, ip, #0 ; 0x0
196 cmp r6, #16 ; 0x10
197 bcc _ll_udiv_big_label1
198 movs r0, r4, lsr #14
199 moveq r4, r4, lsl #16
200 addeq r1, r1, #16 ; 0x10
201 _ll_udiv_big_label1
202 sub r2, r6, r1
203 cmp r2, #8 ; 0x8
204 bcc _ll_udiv_big_label2
205 movs r0, r4, lsr #22
206 moveq r4, r4, lsl #8
207 addeq r1, r1, #8 ; 0x8
208 _ll_udiv_big_label2
209 rsb r0, r1, #32 ; 0x20
210 sub r2, r6, r1
211 orr r4, r4, r5, lsr r0
212 mov r5, r5, lsl r1
213 cmp r2, #1 ; 0x1
214 bcc _ll_udiv_big_label4
215 sub r2, r2, #1 ; 0x1
216 and r0, r2, #3 ; 0x3
217 rsb r0, r0, #3 ; 0x3
218 adds r0, r0, r0, lsl #1
219 add pc, pc, r0, lsl #3
220 nop ; (mov r0,r0)
221 _ll_udiv_big_label3
222 adcs r5, r5, r5
223 adcs r4, r4, r4
224 adcs r0, lr, r5
225 adcs r1, ip, r4
226 movcs r5, r0
227 movcs r4, r1
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 sub r2, r2, #4 ; 0x4
241 adcs r5, r5, r5
242 adcs r4, r4, r4
243 adcs r0, lr, r5
244 adcs r1, ip, r4
245 tst r2, r2
246 movcs r5, r0
247 movcs r4, r1
248 bpl _ll_udiv_big_label3
249 _ll_udiv_big_label4
250 mov r1, #0 ; 0x0
251 mov r2, r5, lsr r6
252 bic r5, r5, r2, lsl r6
253 adcs r0, r5, r5
254 adc r1, r1, #0 ; 0x0
255 movs lr, r3, lsl r6
256 mov r3, r4, lsr r6
257 bic r4, r4, r3, lsl r6
258 adc r1, r1, #0 ; 0x0
259 adds r0, r0, lr
260 orr r2, r2, r4, ror r6
261 adc r1, r1, #0 ; 0x0
262 ldmia sp!, {r4, r5, r6, pc}
263
264 _ll_udiv_ginormous
265 subs r2, r5, lr
266 mov r1, #0 ; 0x0
267 sbcs r3, r4, ip
268 adc r0, r1, r1
269 movcc r2, r5
270 movcc r3, r4
271 ldmia sp!, {r4, r5, r6, pc}
272
273 _ll_div0
274 ldmia sp!, {r4, r5, r6, lr}
275 mov r0, #0 ; 0x0
276 mov r1, #0 ; 0x0
277 b __aeabi_ldiv0
278
279 __aeabi_ldiv0
280 bx r14
281
282 END