xref: /csrg-svn/old/libm/liboldnm/exp.s (revision 20008)
1*20008Sdist#
2*20008Sdist# Copyright (c) 1980 Regents of the University of California.
3*20008Sdist# All rights reserved.  The Berkeley software License Agreement
4*20008Sdist# specifies the terms and conditions for redistribution.
5*20008Sdist#
6*20008Sdist#	@(#)exp.s	5.1 (Berkeley) 05/08/85
7*20008Sdist#
8*20008Sdist#
919996Sdist# double exp(arg)
1019996Sdist# double arg; 0<= arg< 88
1119996Sdist# double exp10(arg)
1219996Sdist# method: range reduction to [-0.5,0.5], Hart&Chenet EXPB 1067
1319996Sdist# J F Jarvis, August 5, 1978
1419996Sdist.set	ERANGE,34
1519996Sdist.globl	_exp
1619996Sdist.globl	_exp10
1719996Sdist.globl	_errno
1819996Sdist.text
1919996Sdist.align	1
2019996Sdist_exp10:
2119996Sdist	.word	0x07c0
2219996Sdist	bispsw	$0xe0
2319996Sdist	muld3	4(ap),loge10,r0
2419996Sdist	jbr	argtst
2519996Sdist.align	1
2619996Sdist_exp:
2719996Sdist	.word	0x07c0
2819996Sdist	bispsw	$0xe0
2919996Sdist	movd	4(ap),r0
3019996Sdistargtst:
3119996Sdist	jnequ	smlarg
3219996Sdist	movd	$0d1.0e+0,r0
3319996Sdist	ret
3419996Sdistsmlarg:
3519996Sdist	cmpd	r0,minarg
3619996Sdist	jgeq	lrgarg
3719996Sdist	mnegd	huge,r0
3819996Sdist	ret
3919996Sdistlrgarg:
4019996Sdist	cmpd	r0,maxarg
4119996Sdist	jleq	range
4219996Sdist	movl	$ERANGE,_errno
4319996Sdist	movd	huge,r0
4419996Sdist	ret
4519996Sdistrange:
4619996Sdist	emodd	log2e,log2ex,r0,r10,r6	# r10=int(arg), r6=frac(arg)
4719996Sdist	tstd	r0
4819996Sdist	jgtr	l1
4919996Sdist	addd2	$0d0.5e+0,r6
5019996Sdist	subw2	$1,r10
5119996Sdist	jbr	l2
5219996Sdistl1:	subd2	$0d0.5e+0,r6
5319996Sdistl2:			# Hart&Cheney EXPB 1067
5419996Sdist	muld3	r6,r6,r8	# range [-.5,.5] D=18.1
5519996Sdist	polyd	r8,$2,pcoef
5619996Sdist	muld2	r0,r6
5719996Sdist	polyd	r8,$2,qcoef
5819996Sdist	subd3	r6,r0,r2
5919996Sdist	addd2	r6,r0
6019996Sdist	divd2	r2,r0
6119996Sdist	muld2	sqrt2,r0
6219996Sdist	extzv $7,$8,r0,r2
6319996Sdist	addl2	r2,r10
6419996Sdist	insv	r10,$7,$8,r0	# load correct exponent
6519996Sdist	ret
6619996Sdist.data
6719996Sdist.align	2
6819996Sdistpcoef:
6919996Sdist	.double	0d0.23093347753750233624e-1
7019996Sdist	.double	0d0.20202065651286927227886e+2
7119996Sdist	.double	0d0.15139067990543389159e+4
7219996Sdistqcoef:
7319996Sdist	.double	0d0.1e+1
7419996Sdist	.double	0d0.23318421142748162379e+3
7519996Sdist	.double	0d0.43682116627275584985e+4
7619996Sdistminarg:
7719996Sdist	.double	0d-88.028e+0
7819996Sdistmaxarg:
7919996Sdist	.double	0d88.028e+0
8019996Sdisthuge:	.double	0d1.7e+38
8119996Sdistloge10:
8219996Sdist	.double	0d2.30258509299404568401e+0
8319996Sdistsqrt2:
8419996Sdist	.double	0d1.41421356237309504880e+0
8519996Sdistlog2e:
8619996Sdist	.double	0d1.44269504088896340735e+0
8719996Sdistlog2ex:
8819996Sdist	.byte	0xbb
89