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