]> git.proxmox.com Git - mirror_edk2.git/blob - MdePkg/Library/BaseLib/Arm/Math64.S
ec12b10150a3247618200bb57cc7bc12f9a7bfd1
[mirror_edk2.git] / MdePkg / Library / BaseLib / Arm / Math64.S
1 #------------------------------------------------------------------------------
2 #
3 # Replacement for Math64.c that is coded to use older GCC intrinsics.
4 # Doing this reduces the number of intrinsics that are required when
5 # you port to a new version of gcc.
6 #
7 # Need to split this into multple files to size optimize the image.
8 #
9 # Copyright (c) 2009 - 2010, Apple Inc. All rights reserved.<BR>
10 # SPDX-License-Identifier: BSD-2-Clause-Patent
11 #
12 #------------------------------------------------------------------------------
13
14 .text
15 .align 2
16 GCC_ASM_EXPORT(InternalMathLShiftU64)
17
18 ASM_PFX(InternalMathLShiftU64):
19 stmfd sp!, {r4, r5, r6}
20 mov r6, r1
21 rsb ip, r2, #32
22 mov r4, r6, asl r2
23 subs r1, r2, #32
24 orr r4, r4, r0, lsr ip
25 mov r3, r0, asl r2
26 movpl r4, r0, asl r1
27 mov r5, r0
28 mov r0, r3
29 mov r1, r4
30 ldmfd sp!, {r4, r5, r6}
31 bx lr
32
33 .align 2
34 GCC_ASM_EXPORT(InternalMathRShiftU64)
35
36 ASM_PFX(InternalMathRShiftU64):
37 stmfd sp!, {r4, r5, r6}
38 mov r5, r0
39 rsb ip, r2, #32
40 mov r3, r5, lsr r2
41 subs r0, r2, #32
42 orr r3, r3, r1, asl ip
43 mov r4, r1, lsr r2
44 movpl r3, r1, lsr r0
45 mov r6, r1
46 mov r0, r3
47 mov r1, r4
48 ldmfd sp!, {r4, r5, r6}
49 bx lr
50
51 .align 2
52 GCC_ASM_EXPORT(InternalMathARShiftU64)
53
54 ASM_PFX(InternalMathARShiftU64):
55 stmfd sp!, {r4, r5, r6}
56 mov r5, r0
57 rsb ip, r2, #32
58 mov r3, r5, lsr r2
59 subs r0, r2, #32
60 orr r3, r3, r1, asl ip
61 mov r4, r1, asr r2
62 movpl r3, r1, asr r0
63 mov r6, r1
64 mov r0, r3
65 mov r1, r4
66 ldmfd sp!, {r4, r5, r6}
67 bx lr
68
69 .align 2
70 GCC_ASM_EXPORT(InternalMathLRotU64)
71
72 ASM_PFX(InternalMathLRotU64):
73 stmfd sp!, {r4, r5, r6, r7, lr}
74 add r7, sp, #12
75 mov r6, r1
76 rsb ip, r2, #32
77 mov r4, r6, asl r2
78 rsb lr, r2, #64
79 subs r1, r2, #32
80 orr r4, r4, r0, lsr ip
81 mov r3, r0, asl r2
82 movpl r4, r0, asl r1
83 sub ip, r2, #32
84 mov r5, r0
85 mov r0, r0, lsr lr
86 rsbs r2, r2, #32
87 orr r0, r0, r6, asl ip
88 mov r1, r6, lsr lr
89 movpl r0, r6, lsr r2
90 orr r1, r1, r4
91 orr r0, r0, r3
92 ldmfd sp!, {r4, r5, r6, r7, pc}
93
94
95 .align 2
96 GCC_ASM_EXPORT(InternalMathRRotU64)
97
98 ASM_PFX(InternalMathRRotU64):
99 stmfd sp!, {r4, r5, r6, r7, lr}
100 add r7, sp, #12
101 mov r5, r0
102 rsb ip, r2, #32
103 mov r3, r5, lsr r2
104 rsb lr, r2, #64
105 subs r0, r2, #32
106 orr r3, r3, r1, asl ip
107 mov r4, r1, lsr r2
108 movpl r3, r1, lsr r0
109 sub ip, r2, #32
110 mov r6, r1
111 mov r1, r1, asl lr
112 rsbs r2, r2, #32
113 orr r1, r1, r5, lsr ip
114 mov r0, r5, asl lr
115 movpl r1, r5, asl r2
116 orr r0, r0, r3
117 orr r1, r1, r4
118 ldmfd sp!, {r4, r5, r6, r7, pc}
119
120 .align 2
121 GCC_ASM_EXPORT(InternalMathMultU64x32)
122
123 ASM_PFX(InternalMathMultU64x32):
124 stmfd sp!, {r7, lr}
125 add r7, sp, #0
126 mov r3, #0
127 mov ip, r0
128 mov lr, r1
129 umull r0, r1, ip, r2
130 mla r1, lr, r2, r1
131 mla r1, ip, r3, r1
132 ldmfd sp!, {r7, pc}
133
134 .align 2
135 GCC_ASM_EXPORT(InternalMathMultU64x64)
136
137 ASM_PFX(InternalMathMultU64x64):
138 stmfd sp!, {r7, lr}
139 add r7, sp, #0
140 mov ip, r0
141 mov lr, r1
142 umull r0, r1, ip, r2
143 mla r1, lr, r2, r1
144 mla r1, ip, r3, r1
145 ldmfd sp!, {r7, pc}
146
147 .align 2
148 GCC_ASM_EXPORT(InternalMathDivU64x32)
149
150 ASM_PFX(InternalMathDivU64x32):
151 stmfd sp!, {r7, lr}
152 add r7, sp, #0
153 mov r3, #0
154 bl ASM_PFX(__udivdi3)
155 ldmfd sp!, {r7, pc}
156
157
158 .align 2
159 GCC_ASM_EXPORT(InternalMathModU64x32)
160
161 ASM_PFX(InternalMathModU64x32):
162 stmfd sp!, {r7, lr}
163 add r7, sp, #0
164 mov r3, #0
165 bl ASM_PFX(__umoddi3)
166 ldmfd sp!, {r7, pc}
167
168
169 .align 2
170 GCC_ASM_EXPORT(InternalMathDivRemU64x32)
171
172 ASM_PFX(InternalMathDivRemU64x32):
173 stmfd sp!, {r4, r5, r6, r7, lr}
174 add r7, sp, #12
175 stmfd sp!, {r10, r11}
176 subs r6, r3, #0
177 mov r10, r0
178 mov r11, r1
179 moveq r4, r2
180 moveq r5, #0
181 beq L22
182 mov r4, r2
183 mov r5, #0
184 mov r3, #0
185 bl ASM_PFX(__umoddi3)
186 str r0, [r6, #0]
187 L22:
188 mov r0, r10
189 mov r1, r11
190 mov r2, r4
191 mov r3, r5
192 bl ASM_PFX(__udivdi3)
193 ldmfd sp!, {r10, r11}
194 ldmfd sp!, {r4, r5, r6, r7, pc}
195
196
197 .align 2
198 GCC_ASM_EXPORT(InternalMathDivRemU64x64)
199
200 ASM_PFX(InternalMathDivRemU64x64):
201 stmfd sp!, {r4, r5, r6, r7, lr}
202 add r7, sp, #12
203 stmfd sp!, {r10, r11}
204 ldr r6, [sp, #28]
205 mov r4, r0
206 cmp r6, #0
207 mov r5, r1
208 mov r10, r2
209 mov r11, r3
210 beq L26
211 bl ASM_PFX(__umoddi3)
212 stmia r6, {r0-r1}
213 L26:
214 mov r0, r4
215 mov r1, r5
216 mov r2, r10
217 mov r3, r11
218 bl ASM_PFX(__udivdi3)
219 ldmfd sp!, {r10, r11}
220 ldmfd sp!, {r4, r5, r6, r7, pc}
221
222
223 .align 2
224 GCC_ASM_EXPORT(InternalMathDivRemS64x64)
225
226 ASM_PFX(InternalMathDivRemS64x64):
227 stmfd sp!, {r4, r5, r6, r7, lr}
228 add r7, sp, #12
229 stmfd sp!, {r10, r11}
230 ldr r6, [sp, #28]
231 mov r4, r0
232 cmp r6, #0
233 mov r5, r1
234 mov r10, r2
235 mov r11, r3
236 beq L30
237 bl ASM_PFX(__moddi3)
238 stmia r6, {r0-r1}
239 L30:
240 mov r0, r4
241 mov r1, r5
242 mov r2, r10
243 mov r3, r11
244 bl ASM_PFX(__divdi3)
245 ldmfd sp!, {r10, r11}
246 ldmfd sp!, {r4, r5, r6, r7, pc}
247
248
249 .align 2
250 GCC_ASM_EXPORT(InternalMathSwapBytes64)
251
252 ASM_PFX(InternalMathSwapBytes64):
253 stmfd sp!, {r4, r5, r7, lr}
254 mov r5, r1
255 bl ASM_PFX(SwapBytes32)
256 mov r4, r0
257 mov r0, r5
258 bl ASM_PFX(SwapBytes32)
259 mov r1, r4
260 ldmfd sp!, {r4, r5, r7, pc}
261
262
263 ASM_FUNCTION_REMOVE_IF_UNREFERENCED