File:  [MW Coherent from dump] / coherent / b / lib / libm / i387 / tanh87.s
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Wed May 29 04:56:35 2019 UTC (7 years ago) by root
Branches: MarkWilliams, MAIN
CVS tags: relic, HEAD
coherent

//////////
/ /usr/src/libm/i387/tanh87.s
/ i387 mathematics library
/ tanh(d)
//////////

RASIZE	=	4

	.globl	tanh
	.globl	_exp
	.globl	_tstcc

//////////
/ double
/ tanh(d)
/ double d;
/
/ tanh(d) = (exp(d) - exp(-d)) / (exp(d) + exp(-d))
/	  = (1 - exp(-2 * d)) / (1 + exp(-2 * d))	(used for d > 0)
/	  = - (1 - exp(2 * d)) / (1 + exp(2 * d))	(used for d < 0)
//////////

d	=	RASIZE		/ arg offset

tanh:
	fldl	d(%esp)		/ Load argument d.

	call	_tstcc		/ Check sign of d.
	je	?1		/ d is zero, just return it.
	jb	?0		/ Jump if negative.
	fchs			/ Change positive to negative.

?0:
	pushf			/ Save the flags.
	fadd	%st, %st	/ 2 * d
	call	_exp		/ exp(2 * d)
	fld1			/ 1, exp(2 * d)
	fsub	%st, %st(1)	/ 1 - exp(2 * d), exp(2 * d)
	fld1			/ 1, 1 - exp(2 * d), exp(2 * d)
	faddp	%st(2), %st	/ 1 - exp(2 * d), 1 + exp(2 * d)
	fdiv			/ (1 -  exp(2 * d)) / (1 + exp(2 * d))
	popf			/ Restore the flags.
	ja	?1		/ d was positive, done.
	fchs			/ d was negative, flip result sign.

?1:
	ret

/ end of tanh87.s

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.