|
|
1.1 root 1: //////////
2: / /usr/src/libm/i387/log87.s
3: / i387 mathematics library
4: / log(x), log10(x), ylog2x
5: //////////
6:
7: RASIZE = 4
8:
9: .globl log10
10: .globl log
11: .globl _ylog2x
12: / .globl _cfcc
13: .globl _tstcc
14: .globl _edomain
15:
16: //////////
17: / double
18: / log(x)
19: / double x;
20: /
21: / double
22: / log10(x)
23: / double x;
24: /
25: / ylog2x does the work for log functions and pow().
26: / Passed args x, y on the NDP stack,
27: / it pops both and returns y * log base 2 of x on the NDP stacktop %st.
28: /
29: / Useful identity:
30: / log base n of x = log base n of 2 * log base 2 of x.
31: / Uses fyl2x, which requires x > 0.
32: //////////
33:
34: x = RASIZE / arg offset
35:
36: log10:
37: fldlg2 / Load y = log base 10 of 2.
38: jmp .L1
39:
40: log:
41: fldln2 / Load y = log base e of 2.
42:
43: .L1:
44: fldl x(%esp) / Load argument x.
45:
46: _ylog2x: / x, y
47: call _tstcc / Check sign of x.
48: ja ?2 / x > 0., ok.
49: fstp %st / x <= 0, pop y.
50: jmp _edomain / Issue EDOM error and return 0.
51:
52: ?2:
53: //////////
54: / The code below uses
55: / fyl2x if d <= 1 or d >= 2-sqrt(2)/2,
56: / fyl2xp1 if 1 < d < 2-sqrt(2)/2.
57: / Since the precision fyl2xp1 purports to save is already lost,
58: / this appears to make no difference in the result.
59: / The code is commented out for now and should be removed eventually.
60: / fdcom near1
61: / call _cfcc / Compare d to 2+sqrt(2)/2.
62: / jae ?4 / d >= 2+sqrt(2)/2, use fyl2x.
63: / fld1 / Load 1.
64: / fcom
65: / call _cfcc / Compare 1 to d.
66: / jae ?3 / 1 >= d, use fyl2x.
67: / fsub / d = d-1 and pop off the 1.
68: / fyl2xp1 / result = y * log base 2 of d+1.
69: / ret
70: /
71: /?3: fstp %st / Pop off the 1.
72: /
73: /?4:
74: //////////
75: fyl2x / result = y * log base 2 of x.
76: ret
77:
78: //////////
79: / Commented out as above...
80: /near?1: .byte 0x1A, 0x62, 0xC0, 0xCC, 0xB0, 0xAF, 0xF4, 0x3F / 2 - sqrt(2)/2
81: //////////
82:
83: / end of log87.s
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.