mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-23 16:34:07 +00:00
135 lines
5.5 KiB
ArmAsm
135 lines
5.5 KiB
ArmAsm
ttl ieee format equivalent hyperbolics (iefsinh)
|
|
***************************************
|
|
* (c) copyright 1981 by motorola inc. *
|
|
***************************************
|
|
|
|
*************************************************
|
|
* iefsinh/iefcosh/ieftanh *
|
|
* ieee equivalent floating point hyperbolics *
|
|
* *
|
|
* input: d7 - ieee format argument *
|
|
* *
|
|
* output: d7 - ieee format hyperbolic result *
|
|
* *
|
|
* all other registers are transparent *
|
|
* *
|
|
* maximum stack useage: 54 bytes *
|
|
* *
|
|
* calls: iefexp, iefdiv, iefadd and iefsub *
|
|
* *
|
|
* condition codes: *
|
|
* z - set if result is zero *
|
|
* n - set if result is negative *
|
|
* v - set if result is nan (not-a-number)*
|
|
* (returned if input was nan) *
|
|
* c - undefined *
|
|
* x - undefined *
|
|
* *
|
|
* notes: *
|
|
* 1) see the mc68344 user's guide for the *
|
|
* limitations on ieee format normalized *
|
|
* values. *
|
|
* 2) if the input argument is a nan, it will *
|
|
* be returned with the "v" bit set. *
|
|
* 3) spot checks show at least seven digit *
|
|
* precision. *
|
|
* *
|
|
*************************************************
|
|
page
|
|
iefsinh idnt 1,1 ieee format equivalent hyperbolics
|
|
|
|
opt pcs
|
|
|
|
section 9
|
|
|
|
xdef iefsinh,iefcosh,ieftanh entry points
|
|
|
|
xref iefexp,iefmul,iefdiv,iefadd,iefsub called
|
|
xref ffpcpyrt copyright stub
|
|
|
|
fpone equ $3f800000 floating one
|
|
fptwo equ $40000000 floating two
|
|
|
|
**********************************
|
|
* iefcosh *
|
|
* this function is defined as *
|
|
* x -x *
|
|
* e + e *
|
|
* -------- *
|
|
* 2 *
|
|
* we evaluate exactly as defined *
|
|
**********************************
|
|
|
|
iefcosh move.l d6,-(sp) save our work register
|
|
jsr iefexp evaluate e to the x
|
|
move.l d7,-(sp) save result
|
|
move.l d7,d6 setup for divide into one
|
|
move.l #fpone,d7 load floating point one
|
|
jsr iefdiv compute e to -x as the inverse
|
|
move.l (sp)+,d6 prepare to add together
|
|
jsr iefadd create the numerator
|
|
move.l #fptwo,d6 prepare to divide by two
|
|
jsr iefdiv divide by two
|
|
movem.l (sp)+,d6 restore work register
|
|
rts return to caller
|
|
page
|
|
**********************************
|
|
* iefsinh *
|
|
* this function is defined as *
|
|
* x -x *
|
|
* e - e *
|
|
* -------- *
|
|
* 2 *
|
|
* we evaluate exactly as defined *
|
|
**********************************
|
|
|
|
iefsinh move.l d6,-(sp) save our work register
|
|
jsr iefexp evaluate e to the x
|
|
move.l d7,-(sp) save result
|
|
move.l d7,d6 setup for divide into one
|
|
move.l #fpone,d7 load floating point one
|
|
jsr iefdiv compute e to -x as the inverse
|
|
move.l d7,d6 prepare to subtract
|
|
move.l (sp)+,d7 from first calculation
|
|
jsr iefsub create the numerator
|
|
move.l #fptwo,d6 prepare to divide by two
|
|
jsr iefdiv divide by two
|
|
movem.l (sp)+,d6 restore work register
|
|
rts return to caller
|
|
page
|
|
**********************************
|
|
* ieftanh *
|
|
* this function is defined as *
|
|
* sinh/cosh which reduces to: *
|
|
* 2x *
|
|
* e - 1 *
|
|
* ------ *
|
|
* 2x *
|
|
* e + 1 *
|
|
* *
|
|
* which we evaluate. *
|
|
**********************************
|
|
|
|
ieftanh move.l d6,-(sp) save our one work register
|
|
move.l #fptwo,d6 prepare to multiply times two
|
|
jsr iefmul get argument times two
|
|
jsr iefexp evaluate e to the 2x
|
|
move.l d7,-(sp) save result
|
|
move.l #fpone,d6 load floating point one
|
|
jsr iefadd add 1 to e**2x
|
|
move.l d7,-(sp) save denominator
|
|
move.l 4(sp),d7 now prepare to subtract
|
|
jsr iefsub create numerator
|
|
movem.l (sp)+,d6 restore denominator (keep ccr same)
|
|
bvs.s ieftrtn branch if nan here
|
|
cmp.l d6,d7 ***allow infinity by infinity to be one***
|
|
bne.s ieftdod branch to do divide if not same value
|
|
move.l #fpone,d7 result is a one
|
|
bra.s ieftrtn and return
|
|
ieftdod jsr iefdiv create result
|
|
ieftrtn add.l #4,sp free e**2x off of stack
|
|
movem.l (sp)+,d6 restore our work register
|
|
rts return to caller with answer and ccr set
|
|
|
|
end
|