xref: /csrg-svn/old/libm/liboldnm/log.s (revision 19997)
1*19997Sdist# double log(arg) ; natural logarithm
2*19997Sdist# double log10(arg); base 10 log
3*19997Sdist# double arg
4*19997Sdist# if(arg<=0){ errno=EDOM; return(-1.7e+38); }
5*19997Sdist# nat. log computed from Hart&Cheney LOGE 2706 D=22.1
6*19997Sdist# J F Jarvis August 3, 1978
7*19997Sdist.set	EDOM,33
8*19997Sdist.globl	_log
9*19997Sdist.globl	_log10
10*19997Sdist.globl	_errno
11*19997Sdist.text
12*19997Sdist.align	1
13*19997Sdist_log10:
14*19997Sdist	.word	0x0
15*19997Sdist	bispsw	$0xe0
16*19997Sdist	movd	4(ap),-(sp)
17*19997Sdist	calls	$2,_log
18*19997Sdist	muld2	log10e,r0
19*19997Sdist	ret
20*19997Sdist.align	1
21*19997Sdist_log:
22*19997Sdist	.word	0x07c0
23*19997Sdist	bispsw	$0xe0
24*19997Sdist	movd	4(ap),r0
25*19997Sdist	jgtr	range
26*19997Sdist	movl	$EDOM,_errno
27*19997Sdist	movd	$0d-1.7e+38,r0	# machine dept max neg
28*19997Sdist	ret
29*19997Sdistrange:
30*19997Sdist	extzv	$7,$8,r0,r10	# r10 = exp(arg)+128
31*19997Sdist	insv	$128,$7,$8,r0	# r0,r1: 0.5<=frac(arg)<1.0
32*19997Sdist	cmpd	r0,sqrt2d2
33*19997Sdist	jgeq	comp
34*19997Sdist	insv	$129,$7,$8,r0	# frac *= 2
35*19997Sdist	decl	r10				# exp -= 1
36*19997Sdistcomp:
37*19997Sdist	subl2	$128,r10	# signed exp for scaled arg
38*19997Sdist	subd3	$0d1.0e+0,r0,r6	# Hart&cheney LOGE 2706
39*19997Sdist	addd2	$0d1.0e+0,r0
40*19997Sdist	divd2	r0,r6	# r6,r7= (frac-1)/(frac+1)
41*19997Sdist	muld3	r6,r6,r8
42*19997Sdist	polyd	r8,$3,pcoef
43*19997Sdist	muld2	r0,r6
44*19997Sdist	polyd	r8,$4,qcoef
45*19997Sdist	divd3	r0,r6,r0
46*19997Sdist	cvtld	r10,r2
47*19997Sdist	muld2	log2,r2	# r2,r3= loge(2**exp)
48*19997Sdist	addd2	r2,r0
49*19997Sdist	ret
50*19997Sdist.data
51*19997Sdist.align	2
52*19997Sdistpcoef:
53*19997Sdist	.double	0d-0.24550691103445385056e+2
54*19997Sdist	.double	0d0.23616053565907671809e+3
55*19997Sdist	.double	0d-0.54904361859132995001e+3
56*19997Sdist	.double	0d0.35621151669903912407e+3
57*19997Sdistqcoef:
58*19997Sdist	.double	0d0.10e+1
59*19997Sdist	.double	0d-0.35526251110400238735e+2
60*19997Sdist	.double	0d0.19375591463035879517e+3
61*19997Sdist	.double	0d-0.33389039541217149928e+3
62*19997Sdist	.double 0d0.17810575834951956204e+3
63*19997Sdistlog10e:
64*19997Sdist	.double	0d0.43429448190325182765e+0
65*19997Sdistsqrt2d2:
66*19997Sdist	.double	0d0.70710678118654752440e+0
67*19997Sdistlog2:
68*19997Sdist	.double	0d0.69314718055994530941e+0
69