OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [rc203soc/] [sw/] [uClinux/] [arch/] [m68k/] [fpsp040/] [slog2.S] - Blame information for rev 1777

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1623 jcastillo
|
2
|       slog2.sa 3.1 12/10/90
3
|
4
|       The entry point slog10 computes the base-10
5
|       logarithm of an input argument X.
6
|       slog10d does the same except the input value is a
7
|       denormalized number.
8
|       sLog2 and sLog2d are the base-2 analogues.
9
|
10
|       INPUT:  Double-extended value in memory location pointed to
11
|               by address register a0.
12
|
13
|       OUTPUT: log_10(X) or log_2(X) returned in floating-point
14
|               register fp0.
15
|
16
|       ACCURACY and MONOTONICITY: The returned result is within 1.7
17
|               ulps in 64 significant bit, i.e. within 0.5003 ulp
18
|               to 53 bits if the result is subsequently rounded
19
|               to double precision. The result is provably monotonic
20
|               in double precision.
21
|
22
|       SPEED:  Two timings are measured, both in the copy-back mode.
23
|               The first one is measured when the function is invoked
24
|               the first time (so the instructions and data are not
25
|               in cache), and the second one is measured when the
26
|               function is reinvoked at the same input argument.
27
|
28
|       ALGORITHM and IMPLEMENTATION NOTES:
29
|
30
|       slog10d:
31
|
32
|       Step 0.   If X < 0, create a NaN and raise the invalid operation
33
|                 flag. Otherwise, save FPCR in D1; set FpCR to default.
34
|       Notes:    Default means round-to-nearest mode, no floating-point
35
|                 traps, and precision control = double extended.
36
|
37
|       Step 1.   Call slognd to obtain Y = log(X), the natural log of X.
38
|       Notes:    Even if X is denormalized, log(X) is always normalized.
39
|
40
|       Step 2.   Compute log_10(X) = log(X) * (1/log(10)).
41
|            2.1  Restore the user FPCR
42
|            2.2  Return ans := Y * INV_L10.
43
|
44
|
45
|       slog10:
46
|
47
|       Step 0.   If X < 0, create a NaN and raise the invalid operation
48
|                 flag. Otherwise, save FPCR in D1; set FpCR to default.
49
|       Notes:    Default means round-to-nearest mode, no floating-point
50
|                 traps, and precision control = double extended.
51
|
52
|       Step 1.   Call sLogN to obtain Y = log(X), the natural log of X.
53
|
54
|       Step 2.   Compute log_10(X) = log(X) * (1/log(10)).
55
|            2.1  Restore the user FPCR
56
|            2.2  Return ans := Y * INV_L10.
57
|
58
|
59
|       sLog2d:
60
|
61
|       Step 0.   If X < 0, create a NaN and raise the invalid operation
62
|                 flag. Otherwise, save FPCR in D1; set FpCR to default.
63
|       Notes:    Default means round-to-nearest mode, no floating-point
64
|                 traps, and precision control = double extended.
65
|
66
|       Step 1.   Call slognd to obtain Y = log(X), the natural log of X.
67
|       Notes:    Even if X is denormalized, log(X) is always normalized.
68
|
69
|       Step 2.   Compute log_10(X) = log(X) * (1/log(2)).
70
|            2.1  Restore the user FPCR
71
|            2.2  Return ans := Y * INV_L2.
72
|
73
|
74
|       sLog2:
75
|
76
|       Step 0.   If X < 0, create a NaN and raise the invalid operation
77
|                 flag. Otherwise, save FPCR in D1; set FpCR to default.
78
|       Notes:    Default means round-to-nearest mode, no floating-point
79
|                 traps, and precision control = double extended.
80
|
81
|       Step 1.   If X is not an integer power of two, i.e., X != 2^k,
82
|                 go to Step 3.
83
|
84
|       Step 2.   Return k.
85
|            2.1  Get integer k, X = 2^k.
86
|            2.2  Restore the user FPCR.
87
|            2.3  Return ans := convert-to-double-extended(k).
88
|
89
|       Step 3.   Call sLogN to obtain Y = log(X), the natural log of X.
90
|
91
|       Step 4.   Compute log_2(X) = log(X) * (1/log(2)).
92
|            4.1  Restore the user FPCR
93
|            4.2  Return ans := Y * INV_L2.
94
|
95
 
96
|               Copyright (C) Motorola, Inc. 1990
97
|                       All Rights Reserved
98
|
99
|       THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
100
|       The copyright notice above does not evidence any
101
|       actual or intended publication of such source code.
102
 
103
|SLOG2    idnt    2,1 | Motorola 040 Floating Point Software Package
104
 
105
        |section        8
106
 
107
        |xref   t_frcinx
108
        |xref   t_operr
109
        |xref   slogn
110
        |xref   slognd
111
 
112
INV_L10:  .long 0x3FFD0000,0xDE5BD8A9,0x37287195,0x00000000
113
 
114
INV_L2:   .long 0x3FFF0000,0xB8AA3B29,0x5C17F0BC,0x00000000
115
 
116
        .global slog10d
117
slog10d:
118
|--entry point for Log10(X), X is denormalized
119
        movel           (%a0),%d0
120
        blt             invalid
121
        movel           %d1,-(%sp)
122
        clrl            %d1
123
        bsr             slognd                  | ...log(X), X denorm.
124
        fmovel          (%sp)+,%fpcr
125
        fmulx           INV_L10,%fp0
126
        bra             t_frcinx
127
 
128
        .global slog10
129
slog10:
130
|--entry point for Log10(X), X is normalized
131
 
132
        movel           (%a0),%d0
133
        blt             invalid
134
        movel           %d1,-(%sp)
135
        clrl            %d1
136
        bsr             slogn                   | ...log(X), X normal.
137
        fmovel          (%sp)+,%fpcr
138
        fmulx           INV_L10,%fp0
139
        bra             t_frcinx
140
 
141
 
142
        .global slog2d
143
slog2d:
144
|--entry point for Log2(X), X is denormalized
145
 
146
        movel           (%a0),%d0
147
        blt             invalid
148
        movel           %d1,-(%sp)
149
        clrl            %d1
150
        bsr             slognd                  | ...log(X), X denorm.
151
        fmovel          (%sp)+,%fpcr
152
        fmulx           INV_L2,%fp0
153
        bra             t_frcinx
154
 
155
        .global slog2
156
slog2:
157
|--entry point for Log2(X), X is normalized
158
        movel           (%a0),%d0
159
        blt             invalid
160
 
161
        movel           8(%a0),%d0
162
        bnes            continue                | ...X is not 2^k
163
 
164
        movel           4(%a0),%d0
165
        andl            #0x7FFFFFFF,%d0
166
        tstl            %d0
167
        bnes            continue
168
 
169
|--X = 2^k.
170
        movew           (%a0),%d0
171
        andl            #0x00007FFF,%d0
172
        subl            #0x3FFF,%d0
173
        fmovel          %d1,%fpcr
174
        fmovel          %d0,%fp0
175
        bra             t_frcinx
176
 
177
continue:
178
        movel           %d1,-(%sp)
179
        clrl            %d1
180
        bsr             slogn                   | ...log(X), X normal.
181
        fmovel          (%sp)+,%fpcr
182
        fmulx           INV_L2,%fp0
183
        bra             t_frcinx
184
 
185
invalid:
186
        bra             t_operr
187
 
188
        |end

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.