mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
122 lines
2.4 KiB
122 lines
2.4 KiB
/*
|
|
* |-----------------------------------------------------------|
|
|
* | 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
|