Files
Digital-Research-Source-Code/CPM OPERATING SYSTEMS/CPM 68K/1.0X SOURCES/v103/libe/iefsin.s
Sepp J Morris 31738079c4 Upload
Digital Research
2020-11-06 18:50:37 +01:00

111 lines
4.5 KiB
ArmAsm

ttl ieee format equivalent (iefsin/iefcos/ieftan)
***************************************
* (c) copyright 1981 by motorola inc. *
***************************************
*************************************************
* iefsin iefcos ieftan *
* ieee format equivalent sine/cosine/tangent *
* *
* input: d7 - ieee format argument (radians) *
* *
* output: d7 - ieee format function result *
* *
* all other registers totally transparent *
* *
* maximum stack used: 54 bytes *
* *
* condition codes: *
* z - set if result in d7 is zero *
* n - set if result in d7 is negative *
* c - undefined *
* v - set if result is nan (not-a-number)*
* (input magnitude too large or nan) *
* x - undefined *
* *
* functions: *
* iefsin - sine result *
* iefcos - cosine result *
* ieftan - tangent result *
* *
* notes: *
* 1) input values are in radians. *
* 2) input arguments larger than two pi *
* suffer reduced precision. the larger *
* the argument, the smaller the precision.*
* excessively large arguments which have *
* less than 5 bits of precision are *
* returned as a nan with the "v" bit set. *
* 3) the sign of tangents with infinite *
* value is undefined, however we return *
* a positive infinity. *
* 4) spot checks show relative errors bounded*
* by 4 x 10**-7 but for arguments close to*
* pi/2 intervals where 10**-5 is seen. *
* *
*************************************************
page
iefsin idnt 1,1 ieee format equivalent sine/cosine/tangent
opt pcs
section 9
xdef iefsin,iefcos,ieftan entry points
xref ffpsin,ffpcos,ffptan ffp transcendentals
xref iefsop single operand front-ender
xref ieftieee back-end convert back to ieee format
xref iefrtnan back-end return ieee nan routine
xref ffpcpyrt copyright stub
vbit equ $0002 condition code register "v" bit mask
ffpsign equ.b $80 sign in fast floating point value
***********************
* tangent entry point *
***********************
ieftan jsr iefsop parse the operand
bra.s ieftnrm +0 branch not infinity or nan
jmp iefrtnan +2 return nan for infinity
* perform tangent function with normalized number
ieftnrm jsr ffptan find tangent
bra.s iefcmn enter common exit code
**********************
* cosine entry point *
**********************
iefcos jsr iefsop parse the operand
bra.s iefcnrm +0 branch not infinity or nan
jmp iefrtnan +2 return nan for infinity
* perform cosine function with normalized number
iefcnrm jsr ffpcos find cosine
bra.s iefcmn enter common exit code
********************
* sine entry point *
********************
iefsin jsr iefsop parse the operand
bra.s iefsnrm +0 branch not infinity or nan
jmp iefrtnan +2 return nan for infinity
* perform sine function with normalized number
iefsnrm jsr ffpsin find sine
iefcmn bvc ieftieee return if had enough precision
* overflow can mean true infinity result or not enough precision
* we can test for not enough precision by checking for largest possible value
move.l d7,d5 copy over ffp format result
or.b #ffpsign,d5 set sign bit to a one
sub.l #1,d5 test for all one bits
* bne iefrtnan no, not enough precision, return a nan
bne dobranch for 16-bit non-MMU problem
tst.b d7 reset ccr as it was
or.b #vbit,ccr and show overflow occured
jmp ieftieee restore with infinity of proper sign
dobranch:
jmp iefrtnan
end