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