00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059 static char *rcs_id = "$Source: /home/bos/bk/kpro64-pending/libm/SCCS/s.vlogf.c $ $Revision: 1.5 $";
00060
00061 #include "libm.h"
00062
00063 extern const du __log_ru[];
00064 extern const du _logtab[];
00065
00066 #if defined(mips) && !defined(__GNUC__)
00067 extern void vflog(float *, float *, long, long, long);
00068 extern void vlogf(float *, float *, long, long, long);
00069
00070 #pragma weak vflog = __vlogf
00071 #pragma weak vlogf = __vlogf
00072 #endif
00073
00074 #if defined(BUILD_OS_DARWIN)
00075 extern void __vlogf( float *x, float *y, long count, long stridex,
00076 long stridey );
00077 #pragma weak vlogf
00078 void vlogf( float *x, float *y, long count, long stridex, long stridey ) {
00079 __vlogf(x, y, count, stridex, stridey);
00080 }
00081 #elif defined(__GNUC__)
00082 extern void __vlogf(float *, float *, long, long, long);
00083 void vlogf() __attribute__ ((weak, alias ("__vlogf")));
00084 #endif
00085
00086 static const du log2 =
00087 {D(0x3fe62e42, 0xfefa39ef)};
00088
00089
00090
00091 static const du P[] =
00092 {
00093 {D(0x3fefffff, 0xffff6666)},
00094 {D(0xbfe00006, 0x000349d2)},
00095 {D(0x3fd55561, 0x555d346b)},
00096 };
00097
00098 static const int twop7 = {0x43000000};
00099
00100 static const fu twopm7 = {0x3c000000};
00101
00102 static const fu Scaleup = {0x4b000000};
00103
00104 static const fu Qnan = {QNANF};
00105
00106 static const fu Inf = {0x7f800000};
00107
00108 static const fu Neginf = {0xff800000};
00109
00110 #define MAXEXP 0xffu
00111
00112 #define MINEXP 0x01u
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124 #ifdef _SW_PIPELINE
00125
00126
00127
00128
00129
00130 void
00131 __vlogf( float *x, float *y, long count, long stridex, long stridey )
00132 {
00133 long i;
00134 unsigned int j;
00135 unsigned int ix;
00136 int m;
00137 int k;
00138 float u;
00139 double t;
00140 double xmu;
00141 double q;
00142 double l_lead;
00143 float w;
00144 float result;
00145
00146
00147
00148 for ( i=0; i<count; i++ )
00149 {
00150 #ifdef _PREFETCH
00151 #pragma prefetch_ref=*(x+8)
00152 #pragma prefetch_ref=*(y+8)
00153 #endif
00154
00155
00156
00157 ix = *(unsigned int *)x;
00158
00159 m = (ix >> MANTWIDTH);
00160 j = m - MINEXP;
00161
00162 m -= EXPBIAS;
00163
00164
00165
00166 ix &= (SIGNMASK & EXPMASK);
00167
00168
00169 ix |= twop7;
00170
00171 INT2FLT(ix, w);
00172
00173 k = ROUNDF(w);
00174
00175 u = k;
00176
00177 k -= 128;
00178
00179 xmu = twopm7.f*(w - u);
00180
00181 t = __log_ru[k].d*xmu;
00182
00183
00184
00185
00186
00187
00188 if ( k > 64 )
00189 m++;
00190
00191 q = ((P[2].d*t + P[1].d)*t + P[0].d);
00192
00193 l_lead = _logtab[k].d;
00194
00195 l_lead += m*log2.d;
00196
00197 result = l_lead + q*t;
00198
00199
00200
00201 if ( j >= (MAXEXP - MINEXP) )
00202 result = Qnan.f;
00203
00204 if ( *x == 0.0f )
00205 result = Neginf.f;
00206
00207 if ( *x == Inf.f )
00208 result = Inf.f;
00209
00210 *y = result;
00211
00212 x += stridex;
00213 y += stridey;
00214 }
00215 }
00216
00217 #else
00218
00219 void
00220 __vlogf( float *x, float *y, long count, long stridex, long stridey )
00221 {
00222 long i;
00223 unsigned int j;
00224 unsigned int ix;
00225 int m;
00226 int k;
00227 float u;
00228 double t;
00229 double xmu;
00230 double q;
00231 double l_lead;
00232 float w, z;
00233 float result;
00234
00235
00236
00237 for ( i=0; i<count; i++ )
00238 {
00239
00240
00241 w = z = *x;
00242
00243 FLT2INT(w, ix);
00244
00245 m = (ix >> MANTWIDTH);
00246 j = m;
00247
00248 if ( m == 0 )
00249 {
00250 z *= Scaleup.f;
00251 w = z;
00252
00253 FLT2INT(w, ix);
00254 m = (ix >> MANTWIDTH);
00255 m -= 23;
00256 }
00257
00258 m -= EXPBIAS;
00259
00260
00261
00262 ix &= (SIGNMASK & EXPMASK);
00263
00264
00265 ix |= twop7;
00266
00267 INT2FLT(ix, w);
00268
00269 k = ROUNDF(w);
00270
00271 u = k;
00272
00273 k -= 128;
00274
00275 xmu = twopm7.f*(w - u);
00276
00277 t = __log_ru[k].d*xmu;
00278
00279
00280
00281
00282
00283
00284 if ( k > 64 )
00285 m++;
00286
00287 q = ((P[2].d*t + P[1].d)*t + P[0].d);
00288
00289 l_lead = _logtab[k].d;
00290
00291 l_lead += m*log2.d;
00292
00293 result = l_lead + q*t;
00294
00295
00296
00297 if ( j >= MAXEXP )
00298 result = Qnan.f;
00299
00300 if ( z == 0.0f )
00301 result = Neginf.f;
00302
00303 if ( z == Inf.f )
00304 result = Inf.f;
00305
00306 *y = result;
00307
00308 x += stridex;
00309 y += stridey;
00310 }
00311 }
00312 #endif
00313