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.
207 lines
5.1 KiB
207 lines
5.1 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: asincos.s,v 3000.7.1.10 92/01/29 15:51:20 zaineb Exp $ */
|
|
/* Algorithm from Cody and Waite. */
|
|
|
|
#include <kxmips.h>
|
|
#include <trans.h>
|
|
|
|
.extern _except1
|
|
.extern _d_ind 8
|
|
|
|
#define OP_ACOS 13 // _FpCodeAcos from crt32\h\fpieee.h, <trans.h>
|
|
#define OP_ASIN 14 // _FpCodeAsin from crt32\h\fpieee.h, <trans.h>
|
|
|
|
#define half 0.5
|
|
#define eps 3.72529029846191406250e-9
|
|
#define one 1.0
|
|
#define p5 -0.69674573447350646411e+0
|
|
#define p4 +0.10152522233806463645e+2
|
|
#define p3 -0.39688862997504877339e+2
|
|
#define p2 +0.57208227877891731407e+2
|
|
#define p1 -0.27368494524164255994e+2
|
|
#define q4 -0.23823859153670238830e+2
|
|
#define q3 +0.15095270841030604719e+3
|
|
#define q2 -0.38186303361750149284e+3
|
|
#define q1 +0.41714430248260412556e+3
|
|
#define q0 -0.16421096714498560795e+3
|
|
#define pio2 1.57079632679489661923
|
|
#define pi 3.14159265358979323846
|
|
|
|
|
|
#define FSIZE 48
|
|
.text .text$asincosm
|
|
.globl acos
|
|
.ent acos
|
|
acos:
|
|
.frame sp, FSIZE, ra
|
|
.mask 0x80000000, -4
|
|
subu sp, FSIZE
|
|
sw ra, FSIZE-4(sp)
|
|
.prologue 1
|
|
|
|
/*
|
|
* Clear all bits in fsr to avoid side effects (including flag bits).
|
|
* This is the same as calling _maskfp() and clearing flag bits.
|
|
* 'Save' the callers fsr in v0 to restore upon exit.
|
|
*/
|
|
|
|
cfc1 v0, $31
|
|
ctc1 $0, $31
|
|
|
|
li.d $f8, half
|
|
abs.d $f14, $f12
|
|
c.ole.d $f14, $f8
|
|
li.d $f10, eps
|
|
li t7, OP_ACOS
|
|
bc1f acos2
|
|
c.lt.d $f14, $f10
|
|
mov.d $f0, $f12
|
|
bc1t acos1
|
|
mul.d $f2, $f12, $f12
|
|
bal asincos2
|
|
acos1:
|
|
li.d $f8, pio2
|
|
sub.d $f0, $f8, $f0
|
|
b acosx
|
|
acos2:
|
|
bal asincos1
|
|
bltz t1, acos3
|
|
neg.d $f0
|
|
b acosx
|
|
acos3:
|
|
li.d $f8, pi
|
|
add.d $f0, $f8
|
|
acosx:
|
|
/* restore callers fsr and return */
|
|
ctc1 v0, $31
|
|
lw ra, FSIZE-4(sp)
|
|
addu sp, FSIZE
|
|
j ra
|
|
.end acos
|
|
|
|
|
|
.text .text$asincosm
|
|
.globl asin
|
|
.ent asin
|
|
asin:
|
|
.frame sp, FSIZE, ra
|
|
.mask 0x80000000, -4
|
|
subu sp, FSIZE
|
|
sw ra, FSIZE-4(sp)
|
|
.prologue 1
|
|
|
|
/*
|
|
* Clear all bits in fsr to avoid side effects (including flag bits).
|
|
* This is the same as calling _maskfp() and clearing flag bits.
|
|
* 'Save' the callers fsr in v0 to restore upon exit.
|
|
*/
|
|
|
|
cfc1 v0, $31
|
|
ctc1 $0, $31
|
|
|
|
li.d $f8, half
|
|
abs.d $f14, $f12
|
|
c.ole.d $f14, $f8
|
|
li.d $f10, eps
|
|
li t7, OP_ASIN
|
|
bc1f asin2
|
|
c.lt.d $f14, $f10
|
|
mov.d $f0, $f12
|
|
mul.d $f2, $f12, $f12
|
|
bc1t asinx
|
|
bal asincos2
|
|
b asinx
|
|
|
|
asin2:
|
|
bal asincos1
|
|
li.d $f8, pio2
|
|
add.d $f0, $f8
|
|
bgez t1, asinx
|
|
|
|
asin3:
|
|
neg.d $f0
|
|
|
|
asinx:
|
|
/* restore callers fsr and return */
|
|
ctc1 v0, $31
|
|
lw ra, FSIZE-4(sp)
|
|
addu sp, FSIZE
|
|
j ra
|
|
|
|
asincos1:
|
|
li.d $f10, one
|
|
mfc1 t1, $f13
|
|
c.ole.d $f14, $f10
|
|
sub.d $f0, $f10, $f14
|
|
mul.d $f2, $f0, $f8
|
|
bc1f error
|
|
sqrt.d $f0, $f2
|
|
add.d $f0, $f0
|
|
neg.d $f0
|
|
/* fall through */
|
|
asincos2:
|
|
li.d $f8, p5
|
|
li.d $f10, q4
|
|
mul.d $f4, $f2, $f8
|
|
add.d $f6, $f2, $f10
|
|
li.d $f8, p4
|
|
mul.d $f6, $f2
|
|
add.d $f4, $f8
|
|
li.d $f10, q3
|
|
mul.d $f4, $f2
|
|
add.d $f6, $f10
|
|
li.d $f8, p3
|
|
mul.d $f6, $f2
|
|
add.d $f4, $f8
|
|
li.d $f10, q2
|
|
mul.d $f4, $f2
|
|
add.d $f6, $f10
|
|
li.d $f8, p2
|
|
mul.d $f6, $f2
|
|
add.d $f4, $f8
|
|
li.d $f10, q1
|
|
mul.d $f4, $f2
|
|
add.d $f6, $f10
|
|
li.d $f8, p1
|
|
mul.d $f6, $f2
|
|
add.d $f4, $f8
|
|
li.d $f10, q0
|
|
mul.d $f4, $f2
|
|
add.d $f6, $f10
|
|
|
|
div.d $f4, $f6
|
|
mul.d $f4, $f0
|
|
add.d $f0, $f4
|
|
|
|
/* return to asin/acos */
|
|
j ra
|
|
|
|
error: // |x| > 1
|
|
li $4, FP_I // exception mask
|
|
move $5, t7 // operation code (funtion name index)
|
|
mfc1.d $6, $f12 // arg1
|
|
l.d $f0, _d_ind
|
|
s.d $f0, 16(sp) // default result (indefinite)
|
|
xor v0, v0, 0xf80 // inverse exception enable bits of
|
|
sw v0, 24(sp) // ... callers fsr to pass to _except1
|
|
jal _except1
|
|
lw ra, FSIZE-4(sp) // jump back to asin/acos caller
|
|
addu sp, FSIZE
|
|
j ra
|
|
|
|
#undef FSIZE
|
|
.end asin
|