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