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.
160 lines
2.8 KiB
160 lines
2.8 KiB
;/***
|
|
;*trigl.a - sin, cos, tan functions
|
|
;*
|
|
;* Copyright (c) 1991-1991, Microsoft Corporation. All rights reserved.
|
|
;*
|
|
;*Purpose:
|
|
;* Trig functions to be used with M68K version
|
|
;*
|
|
;*Revision History:
|
|
;* 06-02-92 XY based on trig.a
|
|
;*
|
|
;*******************************************************************************/
|
|
|
|
#include <traps.a>
|
|
#ifdef SANE
|
|
#include <sane.a>
|
|
#endif
|
|
|
|
externW _errno
|
|
|
|
;long double sinl(long double x)
|
|
|
|
cProc sinl,PUBLIC
|
|
parmT x
|
|
localW fpstat
|
|
localV xlocalx,10
|
|
localW xtestw
|
|
cBegin sinl
|
|
#ifdef SANE
|
|
pea fpstat
|
|
move.w #FOPROCENTRY,-(a7)
|
|
FP68K ;save current status & set default control
|
|
|
|
pea x
|
|
move.w #FOSINX,-(a7)
|
|
Elems68K ;sin x
|
|
|
|
lea x,a1
|
|
move.w (a1)+,d0 ;load result for return
|
|
move.l (a1)+,d1
|
|
move.l (a1),a0
|
|
|
|
pea fpstat
|
|
move.w #FOPROCEXIT,-(a7)
|
|
FP68K ;set result status & restore control
|
|
#else
|
|
fmove.l fpcr,d0
|
|
|
|
fmove.x x, fp0
|
|
ftst.x fp0 ;see if it is a valid number
|
|
fmove.l fpsr, d1 ;get status word
|
|
and.l #0x03007c00, d1 ;see if we get an exception
|
|
cmp.l #0, d1
|
|
bne domain_error_fpu
|
|
|
|
fmove.l #0,fpcr
|
|
fsin.x x,fp0
|
|
jra to_end_fpu
|
|
|
|
domain_error_fpu:
|
|
move.l #33, _errno
|
|
to_end_fpu:
|
|
fmove.l d0,fpcr
|
|
#endif
|
|
cEnd sinl
|
|
|
|
;long double cosl(long double x)
|
|
|
|
cProc cosl,PUBLIC
|
|
parmT x
|
|
localW fpstat
|
|
localV xlocalx,10
|
|
localW xtestw
|
|
cBegin cosl
|
|
#ifdef SANE
|
|
pea fpstat
|
|
move.w #FOPROCENTRY,-(a7)
|
|
FP68K ;save current status & set default control
|
|
|
|
pea x
|
|
move.w #FOCOSX,-(a7)
|
|
Elems68K ;cos x
|
|
|
|
lea x,a1
|
|
move.w (a1)+,d0 ;load result for return
|
|
move.l (a1)+,d1
|
|
move.l (a1),a0
|
|
|
|
pea fpstat
|
|
move.w #FOPROCEXIT,-(a7)
|
|
FP68K ;set result status & restore control
|
|
#else
|
|
fmove.l fpcr,d0
|
|
|
|
fmove.x x, fp0
|
|
ftst.x fp0 ;see if it is a valid number
|
|
fmove.l fpsr, d1 ;get status word
|
|
and.l #0x03007c00, d1 ;see if we get an exception
|
|
cmp.l #0, d1
|
|
bne domain_error_fpu2
|
|
|
|
fmove.l #0,fpcr
|
|
fcos.x x,fp0
|
|
jra to_end_fpu2
|
|
|
|
domain_error_fpu2:
|
|
move.l #33, _errno
|
|
to_end_fpu2:
|
|
fmove.l d0,fpcr
|
|
#endif
|
|
cEnd cosl
|
|
|
|
;long double tanl(long double x)
|
|
|
|
|
|
cProc tanl,PUBLIC
|
|
parmT x
|
|
localW fpstat
|
|
localV xlocalx,10
|
|
localW xtestw
|
|
cBegin tanl
|
|
#ifdef SANE
|
|
pea fpstat
|
|
move.w #FOPROCENTRY,-(a7)
|
|
FP68K ;save current status & set default control
|
|
|
|
pea x
|
|
move.w #FOTANX,-(a7)
|
|
Elems68K ;tan x
|
|
|
|
lea x,a1
|
|
move.w (a1)+,d0 ;load result for return
|
|
move.l (a1)+,d1
|
|
move.l (a1),a0
|
|
|
|
pea fpstat
|
|
move.w #FOPROCEXIT,-(a7)
|
|
FP68K ;set result status & restore control
|
|
#else
|
|
fmove.l fpcr,d0
|
|
|
|
fmove.x x, fp0
|
|
ftst.x fp0 ;see if it is a valid number
|
|
fmove.l fpsr, d1 ;get status word
|
|
and.l #0x03007c00, d1 ;see if we get an exception
|
|
cmp.l #0, d1
|
|
bne domain_error_fpu3
|
|
|
|
fmove.l #0,fpcr
|
|
ftan.x x,fp0
|
|
jra to_end_fpu3
|
|
|
|
domain_error_fpu3:
|
|
move.l #33, _errno
|
|
to_end_fpu3:
|
|
fmove.l d0,fpcr
|
|
#endif
|
|
cEnd tanl
|
|
|
|
|