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