summaryrefslogtreecommitdiffstats
path: root/private/fp32/tran/mips/fsinh.s
diff options
context:
space:
mode:
Diffstat (limited to 'private/fp32/tran/mips/fsinh.s')
-rw-r--r--private/fp32/tran/mips/fsinh.s122
1 files changed, 122 insertions, 0 deletions
diff --git a/private/fp32/tran/mips/fsinh.s b/private/fp32/tran/mips/fsinh.s
new file mode 100644
index 000000000..96ec24228
--- /dev/null
+++ b/private/fp32/tran/mips/fsinh.s
@@ -0,0 +1,122 @@
+/*
+ * |-----------------------------------------------------------|
+ * | Copyright (c) 1991, 1990 MIPS Computer Systems, Inc. |
+ * | All Rights Reserved |
+ * |-----------------------------------------------------------|
+ * | Restricted Rights Legend |
+ * | Use, duplication, or disclosure by the Government is |
+ * | subject to restrictions as set forth in |
+ * | subparagraph (c)(1)(ii) of the Rights in Technical |
+ * | Data and Computer Software Clause of DFARS 252.227-7013. |
+ * | MIPS Computer Systems, Inc. |
+ * | 950 DeGuigne Avenue |
+ * | Sunnyvale, California 94088-3650, USA |
+ * |-----------------------------------------------------------|
+ */
+/* $Header: fsinh.s,v 3000.5.1.3 91/08/01 18:34:47 zaineb Exp $ */
+/* Algorithm from Cody and Waite. */
+
+#include <kxmips.h>
+
+#define one 1.0
+#define eps 3.72529029846191406250e-9
+#define p1 -0.190333399e+0
+#define p0 -0.713793159e+1
+#define q0 -0.428277109e+2
+#define half 0.5
+#define expmax 88.7228317
+#define sinhmax 89.4159851
+
+.text
+
+.globl fsinh
+.globl sinhf
+
+.ent fsinh
+.aent sinhf
+fsinh:
+sinhf:
+
+ .frame sp, 16, ra
+ subu sp, 16
+ sw ra, 16(sp)
+ .prologue 1
+ li.s $f8, one
+ abs.s $f0, $f12
+ c.ole.s $f0, $f8
+ li.s $f8, eps
+ bc1f fsinh2
+ c.lt.s $f0, $f8
+ bc1t fsinh1
+
+fsinh0:
+ cvt.d.s $f12
+ mul.d $f2, $f12, $f12
+ li.d $f10, p1
+ li.d $f8, q0
+ mul.d $f4, $f2, $f10
+ li.d $f10, p0
+ add.d $f6, $f2, $f8
+ add.d $f4, $f10
+ mul.d $f4, $f2
+ div.d $f4, $f6
+ mul.d $f4, $f12
+ add.d $f0, $f12, $f4
+ cvt.s.d $f0
+ j ret
+
+fsinh1:
+ mov.s $f0, $f12
+ j ret
+fsinh2:
+ li.s $f8, expmax
+ s.s $f12, 20(sp)
+ c.ole.s $f0, $f8
+ bc1f fsinh3
+ mov.s $f12, $f0
+ jal fexp
+ li.s $f8, half
+ div.s $f2, $f8, $f0
+ mul.s $f0, $f8
+ lw t0, 20(sp)
+ bltz t0, 1f
+ sub.s $f0, $f0, $f2
+ j ret
+1: sub.s $f0, $f2, $f0
+ j ret
+
+fsinh3:
+ li.s $f6, sinhmax
+ li.s $f8, 0.69316101074218750000
+ c.ole.s $f0, $f6
+ bc1f error
+ sub.s $f12, $f0, $f8
+ jal fexp
+ li.s $f6, 0.13830277879601902638e-4
+ mul.s $f2, $f0, $f6
+ lw t0, 20(sp)
+ bltz t0, 1f
+ add.s $f0, $f2
+ j ret
+1: add.s $f0, $f2
+ neg.s $f0
+ j ret
+
+error:
+ // raise Overflow and return +-Infinity
+ lw t0, 20(sp)
+ sll t1, t0, 1
+ srl t1, 23+1
+ beq t1, 255, 1f
+ li.s $f0, 2e38
+ add.s $f0, $f0
+1: bltz t0, 2f
+ j ret1
+2: neg.s $f0
+ret:
+ lw ra, 16(sp)
+ret1:
+ addu sp, 16
+ j ra
+
+.end fsinh