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# This program and the accompanying materials
11# are licensed and made available under the terms and conditions of the BSD License
12# which accompanies this distribution.  The full text of the license may be found at
13# http://opensource.org/licenses/bsd-license.php.
14#
15# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
16# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
17#
18#------------------------------------------------------------------------------
19
20	.text
21	.align 2
22	GCC_ASM_EXPORT(InternalMathLShiftU64)
23
24ASM_PFX(InternalMathLShiftU64):
25	stmfd	sp!, {r4, r5, r6}
26	mov	r6, r1
27	rsb	ip, r2, #32
28	mov	r4, r6, asl r2
29	subs	r1, r2, #32
30	orr	r4, r4, r0, lsr ip
31	mov	r3, r0, asl r2
32	movpl	r4, r0, asl r1
33	mov	r5, r0
34	mov	r0, r3
35	mov	r1, r4
36	ldmfd	sp!, {r4, r5, r6}
37	bx	lr
38
39	.align 2
40	GCC_ASM_EXPORT(InternalMathRShiftU64)
41
42ASM_PFX(InternalMathRShiftU64):
43	stmfd	sp!, {r4, r5, r6}
44	mov	r5, r0
45	rsb	ip, r2, #32
46	mov	r3, r5, lsr r2
47	subs	r0, r2, #32
48	orr	r3, r3, r1, asl ip
49	mov	r4, r1, lsr r2
50	movpl	r3, r1, lsr r0
51	mov	r6, r1
52	mov	r0, r3
53	mov	r1, r4
54	ldmfd	sp!, {r4, r5, r6}
55	bx	lr
56
57	.align 2
58	GCC_ASM_EXPORT(InternalMathARShiftU64)
59
60ASM_PFX(InternalMathARShiftU64):
61	stmfd	sp!, {r4, r5, r6}
62	mov	r5, r0
63	rsb	ip, r2, #32
64	mov	r3, r5, lsr r2
65	subs	r0, r2, #32
66	orr	r3, r3, r1, asl ip
67	mov	r4, r1, asr r2
68	movpl	r3, r1, asr r0
69	mov	r6, r1
70	mov	r0, r3
71	mov	r1, r4
72	ldmfd	sp!, {r4, r5, r6}
73	bx	lr
74
75	.align 2
76	GCC_ASM_EXPORT(InternalMathLRotU64)
77
78ASM_PFX(InternalMathLRotU64):
79	stmfd	sp!, {r4, r5, r6, r7, lr}
80	add	r7, sp, #12
81	mov	r6, r1
82	rsb	ip, r2, #32
83	mov	r4, r6, asl r2
84	rsb	lr, r2, #64
85	subs	r1, r2, #32
86	orr	r4, r4, r0, lsr ip
87	mov	r3, r0, asl r2
88	movpl	r4, r0, asl r1
89	sub	ip, r2, #32
90	mov	r5, r0
91	mov	r0, r0, lsr lr
92	rsbs	r2, r2, #32
93	orr	r0, r0, r6, asl ip
94	mov	r1, r6, lsr lr
95	movpl	r0, r6, lsr r2
96	orr	r1, r1, r4
97	orr	r0, r0, r3
98	ldmfd	sp!, {r4, r5, r6, r7, pc}
99
100
101	.align 2
102	GCC_ASM_EXPORT(InternalMathRRotU64)
103
104ASM_PFX(InternalMathRRotU64):
105	stmfd	sp!, {r4, r5, r6, r7, lr}
106	add	r7, sp, #12
107	mov	r5, r0
108	rsb	ip, r2, #32
109	mov	r3, r5, lsr r2
110	rsb	lr, r2, #64
111	subs	r0, r2, #32
112	orr	r3, r3, r1, asl ip
113	mov	r4, r1, lsr r2
114	movpl	r3, r1, lsr r0
115	sub	ip, r2, #32
116	mov	r6, r1
117	mov	r1, r1, asl lr
118	rsbs	r2, r2, #32
119	orr	r1, r1, r5, lsr ip
120	mov	r0, r5, asl lr
121	movpl	r1, r5, asl r2
122	orr	r0, r0, r3
123	orr	r1, r1, r4
124	ldmfd	sp!, {r4, r5, r6, r7, pc}
125
126	.align 2
127	GCC_ASM_EXPORT(InternalMathMultU64x32)
128
129ASM_PFX(InternalMathMultU64x32):
130	stmfd	sp!, {r7, lr}
131	add	r7, sp, #0
132	mov	r3, #0
133	mov	ip, r0
134	mov	lr, r1
135	umull	r0, r1, ip, r2
136	mla	r1, lr, r2, r1
137	mla	r1, ip, r3, r1
138	ldmfd	sp!, {r7, pc}
139
140	.align 2
141	GCC_ASM_EXPORT(InternalMathMultU64x64)
142
143ASM_PFX(InternalMathMultU64x64):
144	stmfd	sp!, {r7, lr}
145	add	r7, sp, #0
146	mov	ip, r0
147	mov	lr, r1
148	umull	r0, r1, ip, r2
149	mla	r1, lr, r2, r1
150	mla	r1, ip, r3, r1
151	ldmfd	sp!, {r7, pc}
152
153	.align 2
154	GCC_ASM_EXPORT(InternalMathDivU64x32)
155
156ASM_PFX(InternalMathDivU64x32):
157	stmfd	sp!, {r7, lr}
158	add	r7, sp, #0
159	mov	r3, #0
160	bl 	ASM_PFX(__udivdi3)
161	ldmfd	sp!, {r7, pc}
162
163
164	.align 2
165	GCC_ASM_EXPORT(InternalMathModU64x32)
166
167ASM_PFX(InternalMathModU64x32):
168	stmfd	sp!, {r7, lr}
169	add	r7, sp, #0
170	mov	r3, #0
171	bl 	ASM_PFX(__umoddi3)
172	ldmfd	sp!, {r7, pc}
173
174
175	.align 2
176	GCC_ASM_EXPORT(InternalMathDivRemU64x32)
177
178ASM_PFX(InternalMathDivRemU64x32):
179	stmfd	sp!, {r4, r5, r6, r7, lr}
180	add	r7, sp, #12
181	stmfd	sp!, {r10, r11}
182	subs	r6, r3, #0
183	mov	r10, r0
184	mov	r11, r1
185	moveq	r4, r2
186	moveq	r5, #0
187	beq	L22
188	mov	r4, r2
189	mov	r5, #0
190	mov	r3, #0
191	bl 	ASM_PFX(__umoddi3)
192	str	r0, [r6, #0]
193L22:
194	mov	r0, r10
195	mov	r1, r11
196	mov	r2, r4
197	mov	r3, r5
198	bl 	ASM_PFX(__udivdi3)
199	ldmfd	sp!, {r10, r11}
200	ldmfd	sp!, {r4, r5, r6, r7, pc}
201
202
203	.align 2
204	GCC_ASM_EXPORT(InternalMathDivRemU64x64)
205
206ASM_PFX(InternalMathDivRemU64x64):
207	stmfd	sp!, {r4, r5, r6, r7, lr}
208	add	r7, sp, #12
209	stmfd	sp!, {r10, r11}
210	ldr	r6, [sp, #28]
211	mov	r4, r0
212	cmp	r6, #0
213	mov	r5, r1
214	mov	r10, r2
215	mov	r11, r3
216	beq	L26
217	bl 	ASM_PFX(__umoddi3)
218	stmia	r6, {r0-r1}
219L26:
220	mov	r0, r4
221	mov	r1, r5
222	mov	r2, r10
223	mov	r3, r11
224	bl 	ASM_PFX(__udivdi3)
225	ldmfd	sp!, {r10, r11}
226	ldmfd	sp!, {r4, r5, r6, r7, pc}
227
228
229	.align 2
230	GCC_ASM_EXPORT(InternalMathDivRemS64x64)
231
232ASM_PFX(InternalMathDivRemS64x64):
233	stmfd	sp!, {r4, r5, r6, r7, lr}
234	add	r7, sp, #12
235	stmfd	sp!, {r10, r11}
236	ldr	r6, [sp, #28]
237	mov	r4, r0
238	cmp	r6, #0
239	mov	r5, r1
240	mov	r10, r2
241	mov	r11, r3
242	beq	L30
243	bl 	ASM_PFX(__moddi3)
244	stmia	r6, {r0-r1}
245L30:
246	mov	r0, r4
247	mov	r1, r5
248	mov	r2, r10
249	mov	r3, r11
250	bl 	ASM_PFX(__divdi3)
251	ldmfd	sp!, {r10, r11}
252	ldmfd	sp!, {r4, r5, r6, r7, pc}
253
254
255	.align 2
256	GCC_ASM_EXPORT(InternalMathSwapBytes64)
257
258ASM_PFX(InternalMathSwapBytes64):
259	stmfd	sp!, {r4, r5, r7, lr}
260	mov	r5, r1
261	bl	ASM_PFX(SwapBytes32)
262	mov	r4, r0
263	mov	r0, r5
264	bl	ASM_PFX(SwapBytes32)
265	mov	r1, r4
266	ldmfd	sp!, {r4, r5, r7, pc}
267
268
269ASM_FUNCTION_REMOVE_IF_UNREFERENCED