1/* Library functions.
2   Copyright (C) 2000, 2003 Free Software Foundation, Inc.
3   Contributed by Red Hat, Inc.
4
5   This file is part of GCC.
6
7   GCC is free software ; you can redistribute it and/or modify
8   it under the terms of the GNU General Public License as published by
9   the Free Software Foundation * either version 2, or (at your option)
10   any later version.
11
12   GCC is distributed in the hope that it will be useful,
13   but WITHOUT ANY WARRANTY ; without even the implied warranty of
14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   GNU General Public License for more details.
16
17   You should have received a copy of the GNU General Public License
18   along with GCC; see the file COPYING.  If not, write to
19   the Free Software Foundation, 59 Temple Place - Suite 330,
20   Boston, MA 02111-1307, USA.  */
21
22/* As a special exception, if you link this library with other files,
23   some of which are compiled with GCC, to produce an executable,
24   this library does not by itself cause the resulting executable
25   to be covered by the GNU General Public License.
26   This exception does not however invalidate any other reasons why
27   the executable file might be covered by the GNU General Public License.  */
28
29#include <frv-asm.h>
30
31
32#ifdef L_cmpll
33/* icc0 = __cmpll (long long a, long long b)  */
34
35	.file	"_cmpll.s"
36	.globl	EXT(__cmpll)
37	.type	EXT(__cmpll),@function
38	.text
39	.p2align 4
40EXT(__cmpll):
41	cmp	gr8, gr10, icc0
42	ckeq	icc0, cc4
43	P(ccmp)	gr9, gr11, cc4, 1
44	ret
45.Lend:
46	.size	EXT(__cmpll),.Lend-EXT(__cmpll)
47#endif /* L_cmpll */
48
49#ifdef L_cmpf
50/* icc0 = __cmpf (float a, float b) */
51/* Note, because this function returns the result in ICC0, it means it can't
52   handle NaNs.  */
53
54	.file	"_cmpf.s"
55	.globl	EXT(__cmpf)
56	.type	EXT(__cmpf),@function
57	.text
58	.p2align 4
59EXT(__cmpf):
60#ifdef __FRV_HARD_FLOAT__	/* floating point instructions available */
61	movgf	gr8, fr0
62	P(movgf) gr9, fr1
63	setlos	#1, gr8
64	fcmps	fr0, fr1, fcc0
65	P(fcklt) fcc0, cc0
66	fckeq	fcc0, cc1
67	csub	gr0, gr8, gr8, cc0, 1
68	cmov	gr0, gr8, cc1, 1
69	cmpi	gr8, 0, icc0
70	ret
71#else				/* no floating point instructions available */
72	movsg	lr, gr4
73	addi	sp, #-16, sp
74	sti	gr4, @(sp, 8)
75	st	fp, @(sp, gr0)
76	mov	sp, fp
77	call	EXT(__cmpsf2)
78	cmpi	gr8, #0, icc0
79	ldi	@(sp, 8), gr4
80	movgs	gr4, lr
81	ld	@(sp,gr0), fp
82	addi	sp, #16, sp
83	ret
84#endif
85.Lend:
86	.size	EXT(__cmpf),.Lend-EXT(__cmpf)
87#endif
88
89#ifdef L_cmpd
90/* icc0 = __cmpd (double a, double b) */
91/* Note, because this function returns the result in ICC0, it means it can't
92   handle NaNs.  */
93
94	.file	"_cmpd.s"
95	.globl	EXT(__cmpd)
96	.type	EXT(__cmpd),@function
97	.text
98	.p2align 4
99EXT(__cmpd):
100	movsg	lr, gr4
101	addi	sp, #-16, sp
102	sti	gr4, @(sp, 8)
103	st	fp, @(sp, gr0)
104	mov	sp, fp
105	call	EXT(__cmpdf2)
106	cmpi	gr8, #0, icc0
107	ldi	@(sp, 8), gr4
108	movgs	gr4, lr
109	ld	@(sp,gr0), fp
110	addi	sp, #16, sp
111	ret
112.Lend:
113	.size	EXT(__cmpd),.Lend-EXT(__cmpd)
114#endif
115
116#ifdef L_addll
117/* gr8,gr9 = __addll (long long a, long long b) */
118/* Note, gcc will never call this function, but it is present in case an
119   ABI program calls it.  */
120
121	.file	"_addll.s"
122	.globl	EXT(__addll)
123	.type	EXT(__addll),@function
124	.text
125	.p2align
126EXT(__addll):
127	addcc	gr9, gr11, gr9, icc0
128	addx	gr8, gr10, gr8, icc0
129	ret
130.Lend:
131	.size	EXT(__addll),.Lend-EXT(__addll)
132#endif
133
134#ifdef L_subll
135/* gr8,gr9 = __subll (long long a, long long b) */
136/* Note, gcc will never call this function, but it is present in case an
137   ABI program calls it.  */
138
139	.file	"_subll.s"
140	.globl	EXT(__subll)
141	.type	EXT(__subll),@function
142	.text
143	.p2align 4
144EXT(__subll):
145	subcc	gr9, gr11, gr9, icc0
146	subx	gr8, gr10, gr8, icc0
147	ret
148.Lend:
149	.size	EXT(__subll),.Lend-EXT(__subll)
150#endif
151
152#ifdef L_andll
153/* gr8,gr9 = __andll (long long a, long long b) */
154/* Note, gcc will never call this function, but it is present in case an
155   ABI program calls it.  */
156
157	.file	"_andll.s"
158	.globl	EXT(__andll)
159	.type	EXT(__andll),@function
160	.text
161	.p2align 4
162EXT(__andll):
163	P(and)	gr9, gr11, gr9
164	P2(and)	gr8, gr10, gr8
165	ret
166.Lend:
167	.size	EXT(__andll),.Lend-EXT(__andll)
168#endif
169
170#ifdef L_orll
171/* gr8,gr9 = __orll (long long a, long long b) */
172/* Note, gcc will never call this function, but it is present in case an
173   ABI program calls it.  */
174
175	.file	"_orll.s"
176	.globl	EXT(__orll)
177	.type	EXT(__orll),@function
178	.text
179	.p2align 4
180EXT(__orll):
181	P(or)	gr9, gr11, gr9
182	P2(or)	gr8, gr10, gr8
183	ret
184.Lend:
185	.size	EXT(__orll),.Lend-EXT(__orll)
186#endif
187
188#ifdef L_xorll
189/* gr8,gr9 = __xorll (long long a, long long b) */
190/* Note, gcc will never call this function, but it is present in case an
191   ABI program calls it.  */
192
193	.file	"_xorll.s"
194	.globl	EXT(__xorll)
195	.type	EXT(__xorll),@function
196	.text
197	.p2align 4
198EXT(__xorll):
199	P(xor)	gr9, gr11, gr9
200	P2(xor)	gr8, gr10, gr8
201	ret
202.Lend:
203	.size	EXT(__xorll),.Lend-EXT(__xorll)
204#endif
205
206#ifdef L_notll
207/* gr8,gr9 = __notll (long long a) */
208/* Note, gcc will never call this function, but it is present in case an
209   ABI program calls it.  */
210
211	.file	"_notll.s"
212	.globl	EXT(__notll)
213	.type	EXT(__notll),@function
214	.text
215	.p2align 4
216EXT(__notll):
217	P(not)	gr9, gr9
218	P2(not)	gr8, gr8
219	ret
220.Lend:
221	.size	EXT(__notll),.Lend-EXT(__notll)
222#endif
223
224#ifdef L_cmov
225/* (void) __cmov (char *dest, const char *src, size_t len) */
226/*
227 * void __cmov (char *dest, const char *src, size_t len)
228 * {
229 *   size_t i;
230 *
231 *   if (dest < src || dest > src+len)
232 *     {
233 *	 for (i = 0; i < len; i++)
234 *	 dest[i] = src[i];
235 *     }
236 *   else
237 *     {
238 *	 while (len-- > 0)
239 *	 dest[len] = src[len];
240 *     }
241 * }
242 */
243
244	.file	"_cmov.s"
245	.globl	EXT(__cmov)
246	.type	EXT(__cmov),@function
247	.text
248	.p2align 4
249EXT(__cmov):
250	P(cmp)	gr8, gr9, icc0
251	add	gr9, gr10, gr4
252	P(cmp)	gr8, gr4, icc1
253	bc	icc0, 0, .Lfwd
254	bls	icc1, 0, .Lback
255.Lfwd:
256	/* move bytes in a forward direction */
257	P(setlos) #0, gr5
258	cmp	gr0, gr10, icc0
259	P(subi)	gr9, #1, gr9
260	P2(subi) gr8, #1, gr8
261	bnc	icc0, 0, .Lret
262.Lfloop:
263	/* forward byte move loop */
264	addi	gr5, #1, gr5
265	P(ldsb)	@(gr9, gr5), gr4
266	cmp	gr5, gr10, icc0
267	P(stb)	gr4, @(gr8, gr5)
268	bc	icc0, 0, .Lfloop
269	ret
270.Lbloop:
271	/* backward byte move loop body */
272	ldsb	@(gr9,gr10),gr4
273	stb	gr4,@(gr8,gr10)
274.Lback:
275	P(cmpi)	gr10, #0, icc0
276	addi	gr10, #-1, gr10
277	bne	icc0, 0, .Lbloop
278.Lret:
279	ret
280.Lend:
281	.size	 EXT(__cmov),.Lend-EXT(__cmov)
282#endif
283