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
18ASM_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
36ASM_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
54ASM_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
72ASM_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
98ASM_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
123ASM_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
137ASM_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
150ASM_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
161ASM_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
172ASM_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]
187L22:
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
200ASM_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}
213L26:
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
226ASM_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}
239L30:
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
252ASM_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
263ASM_FUNCTION_REMOVE_IF_UNREFERENCED
264