xref: /netbsd-src/lib/libc_fp/arch/mips/fpsf.S (revision fdd524d4ccd2bb0c6f67401e938dabf773eb0372)
1/*-
2 * Copyright (c) 2016 The NetBSD Foundation, Inc.
3 * All rights reserved.
4 *
5 * This code is derived from software contributed to The NetBSD Foundation
6 * by Matt Thomas of 3am Software Foundry.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 *    notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in the
15 *    documentation and/or other materials provided with the distribution.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
18 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
19 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
21 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 * POSSIBILITY OF SUCH DAMAGE.
28 */
29
30#include <mips/asm.h>
31
32RCSID("$NetBSD: fpsf.S,v 1.1 2016/07/14 01:59:18 matt Exp $")
33
34/*
35 * This file provides softfloat compatible routines which use FP instructions
36 * to do the actual work.  This should give near hard-float performance while
37 * being compatible with soft-float code.
38 *
39 * This file implements the single precision floating point routines.
40 */
41
42#ifdef MIPS3
43#define	COP1_SYNC	nop
44#else
45#define	COP1_SYNC
46#endif
47
48LEAF_NOPROFILE(__addsf3)
49	mtc1		a0, $f12
50	mtc1		a1, $f14
51	COP1_SYNC
52	add.s		$f0, $f12, $f14
53	mfc1		v0, $f0
54	jr		ra
55END(__addsf3)
56
57LEAF_NOPROFILE(__subsf3)
58	mtc1		a0, $f12
59	mtc1		a1, $f14
60	COP1_SYNC
61	sub.s		$f0, $f12, $f14
62	mfc1		v0, $f0
63	jr		ra
64END(__subsf3)
65
66LEAF_NOPROFILE(__mulsf3)
67	mtc1		a0, $f12
68	mtc1		a1, $f14
69	COP1_SYNC
70	mul.s		$f0, $f12, $f14
71	mfc1		v0, $f0
72	jr		ra
73END(__mulsf3)
74
75LEAF_NOPROFILE(__divsf3)
76	mtc1		a0, $f12
77	mtc1		a1, $f14
78	COP1_SYNC
79	div.s		$f0, $f12, $f14
80	mfc1		v0, $f0
81	jr		ra
82END(__divsf3)
83
84LEAF_NOPROFILE(__negsf2)
85	mtc1		a0, $f12
86	COP1_SYNC
87	neg.s		$f0, $f12
88	mfc1		v0, $f0
89	jr		ra
90END(__negsf2)
91
92LEAF_NOPROFILE(__truncdfsf2)
93	dmtc1		a0, $f12
94	COP1_SYNC
95	cvt.s.d		$f0, $f12
96	mfc1		v0, $f0
97	jr		ra
98END(__truncdfsf2)
99
100LEAF_NOPROFILE(__fixsfdi)
101	mtc1		a0, $f12
102	COP1_SYNC
103	trunc.l.s	$f0, $f12
104	dmfc1		v0, $f0
105	jr		ra
106END(__fixsfdi)
107
108LEAF_NOPROFILE(__fixsfsi)
109	mtc1		a0, $f12
110	COP1_SYNC
111	trunc.w.s	$f0, $f12
112	mfc1		v0, $f0
113	jr		ra
114END(__fixsfsi)
115
116LEAF_NOPROFILE(__fixunssfdi)
117	lui		t0, 0x5f00	# 9223372036854775808.0
118	mtc1		t0, $f0
119	mtc1		a0, $f12
120	COP1_SYNC
121	sub.s		$f0, $f12, $f0	# convert to signed
122        trunc.l.s	$f0, $f0
123	dmfc1		v0, $f0
124	li		v1, 1
125	dsll		v1, v1, 63
126	add		v0, v0, v1	# convert to unsigned
127	jr		ra
128END(__fixunssfdi)
129
130LEAF_NOPROFILE(__fixunssfsi)
131	lui		t0, 0x4f00	# 2147483648.0
132	mtc1		t0, $f0
133	mtc1		a0, $f12
134	COP1_SYNC
135	sub.s		$f0, $f12, $f0	# convert to signed
136        trunc.w.s	$f0, $f0
137	mfc1		v0, $f0
138	lui		v1, 0x8000	# 0xffffffff80000000
139	add		v0, v0, v1	# convert to unsigned
140	jr		ra
141END(__fixunssfsi)
142
143LEAF_NOPROFILE(__floatdisf)
144	dmtc1		a0, $f12
145	COP1_SYNC
146	cvt.s.l		$f0, $f12
147	mfc1		v0, $f0
148	jr		ra
149END(__floatdisf)
150
151LEAF_NOPROFILE(__floatsisf)
152	mtc1		a0, $f12
153	COP1_SYNC
154	cvt.s.w		$f0, $f12
155	mfc1		v0, $f0
156	jr		ra
157END(__floatsisf)
158
159LEAF_NOPROFILE(__floatundisf)
160	li		t0, 1
161	dsll		t0, t0, 63	# 9223372036854775808.0
162	dsub		a0, a0, t0	# convert to signed
163	dmtc1		a0, $f12
164	dmtc1		t0, $f14
165	COP1_SYNC
166	cvt.s.l		$f0, $f12
167	cvt.s.l		$f2, $f14
168	add.s		$f0, $f0, $f2	# convert back to unsigned
169	mfc1		v0, $f0
170	jr		ra
171END(__floatundisf)
172
173LEAF_NOPROFILE(__floatunsisf)
174	sll		a0, a0, 0	# sign extend to 64 bits
175	dmtc1		a0, $f12
176	COP1_SYNC
177	cvt.s.l		$f0, $f12
178	mfc1		v0, $f0
179	jr		ra
180END(__floatunsisf)
181
182STRONG_ALIAS(__eqsf2, __nedf2)
183LEAF_NOPROFILE(__nesf2)
184	.set push
185	.set noreorder
186	mtc1		a0, $f12
187	mtc1		a1, $f14
188	COP1_SYNC
189	c.eq.s		$f12, $f14
190	bc1f		2f
191	 li		v0, 1
192	move		v0, zero
1932:	jr		ra
194	 nop
195	.set pop
196END(__nesf2)
197
198STRONG_ALIAS(__gesf2, __ltdf2)
199LEAF_NOPROFILE(__ltsf2)
200	.set push
201	.set noreorder
202	mtc1		a0, $f12
203	mtc1		a1, $f14
204	COP1_SYNC
205	c.olt.s		$f12, $f14
206	bc1t		2f
207	 li		v0, -1
208	move		v0, zero
2092:	jr		ra
210	 nop
211	.set pop
212END(__ltsf2)
213
214STRONG_ALIAS(__gtsf2, __ledf2)
215LEAF_NOPROFILE(__lesf2)
216	.set push
217	.set noreorder
218	mtc1		a0, $f12
219	mtc1		a1, $f14
220	COP1_SYNC
221	c.ole.s		$f12, $f14
222	bc1f		2f
223	 li		v0, 1
224	move		v0, zero
2252:	jr		ra
226	 nop
227	.set pop
228END(__lesf2)
229
230LEAF_NOPROFILE(__unordsf2)
231	.set push
232	.set noreorder
233	mtc1		a0, $f12
234	mtc1		a1, $f14
235	COP1_SYNC
236	c.un.s		$f12, $f14
237	bc1t		2f
238	 li		v0, 1
239	move		v0, zero
2402:	jr		ra
241	 nop
242	.set pop
243END(__unordsf2)
244