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.vexp.c $ $Revision: 1.5 $";
00060
00061 #include "libm.h"
00062
00063
00064
00065
00066
00067
00068
00069 #if defined(mips) && !defined(__GNUC__)
00070 extern void vexp(double *, double *, long, long, long);
00071
00072 #pragma weak vexp = __vexp
00073 #endif
00074
00075 #if defined(BUILD_OS_DARWIN)
00076 extern void __vexp( double *x, double *y, long count, long stridex,
00077 long stridey );
00078 #pragma weak vexp
00079 void vexp( double *x, double *y, long count, long stridex, long stridey ) {
00080 __vexp(x, y, count, stridex, stridey);
00081 }
00082 #elif defined(__GNUC__)
00083 extern void __vexp(double *, double *, long, long, long);
00084 void vexp() __attribute__ ((weak, alias ("__vexp")));
00085 #endif
00086
00087 extern const du __exptabhi[];
00088 extern const du __exptablo[];
00089
00090 static const du Ulimit =
00091 {D(0x40862e42, 0xfefa3940)};
00092
00093 static const du Llimit =
00094 {D(0xc0874910, 0xd52d3052)};
00095
00096 static const du rln2by32 =
00097 {D(0x40471547, 0x652b82fe)};
00098
00099 static const du ln2by32hi =
00100 {D(0x3f962e42, 0xfef00000)};
00101
00102 static const du ln2by32lo =
00103 {D(0x3d8473de, 0x6af278ed)};
00104
00105 static const du Twopm54 =
00106 {D(0x3c900000, 0x00000000)};
00107
00108 static const du Qnan =
00109 {D(QNANHI, QNANLO)};
00110
00111
00112
00113 static const du P[] =
00114 {
00115 {D(0x3ff00000, 0x00000000)},
00116 {D(0x3ff00000, 0x00000000)},
00117 {D(0x3fe00000, 0x00000000)},
00118 {D(0x3fc55555, 0x55548f7c)},
00119 {D(0x3fa55555, 0x55545d4e)},
00120 {D(0x3f811115, 0xb7aa905e)},
00121 {D(0x3f56c172, 0x8d739765)},
00122 };
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134 void
00135 __vexp( double *x, double *y, long count, long stridex, long stridey )
00136 {
00137 #ifdef _32BIT_MACHINE
00138
00139 int l;
00140
00141 #else
00142
00143 long long l;
00144
00145 #endif
00146
00147 long i;
00148 int m, m1, m2;
00149 int j, n;
00150 double w;
00151 double y1, y2, z;
00152 double p, q;
00153 double dx;
00154 double nd;
00155 double s, s_lead, s_trail;
00156 double twopm1, twopm2;
00157 double result;
00158
00159
00160
00161 for ( i=0; i<count; i++ )
00162 {
00163 #ifdef _PREFETCH
00164 #pragma prefetch_ref=*(x+8)
00165 #pragma prefetch_ref=*(y+8)
00166 #endif
00167
00168 dx = w = *x;
00169
00170 if ( dx != dx )
00171 dx = 0.0;
00172
00173 if ( dx > Ulimit.d )
00174 dx = Ulimit.d;
00175
00176 if ( dx < Llimit.d )
00177 dx = Llimit.d;
00178
00179 if ( fabs(dx) < Twopm54.d )
00180 dx = 0.0;
00181
00182
00183
00184 nd = dx*rln2by32.d;
00185 n = ROUND(nd);
00186 nd = n;
00187
00188 y1 = dx - nd*ln2by32hi.d;
00189 y2 = nd*ln2by32lo.d;
00190 z = y1 - y2;
00191
00192 j = n & 0x1f;
00193 m = n >> 5;
00194
00195 s_lead = __exptabhi[j].d;
00196 s_trail = __exptablo[j].d;
00197 s = s_lead + s_trail;
00198
00199 q = ((((P[6].d*z + P[5].d)*z + P[4].d)*z + P[3].d)*z +
00200 P[2].d)*(z*z);
00201
00202 p = (q - y2) + y1;
00203
00204 result = s_lead + (s_trail + s*p);
00205
00206 m1 = (m >> 1);
00207 m2 = m - m1;
00208
00209 #ifdef _32BIT_MACHINE
00210
00211 twopm1 = 0.0;
00212 l = m1 + DEXPBIAS;
00213 l <<= DMANTWIDTH;
00214
00215 INT2DBLHI(l, twopm1);
00216
00217 twopm2 = 0.0;
00218 l = m2 + DEXPBIAS;
00219 l <<= DMANTWIDTH;
00220
00221 INT2DBLHI(l, twopm2);
00222 #else
00223 l = m1 + DEXPBIAS;
00224 l <<= DMANTWIDTH;
00225
00226 LL2DBL(l, twopm1);
00227
00228 l = m2 + DEXPBIAS;
00229 l <<= DMANTWIDTH;
00230
00231 LL2DBL(l, twopm2);
00232 #endif
00233 result *= twopm1;
00234 result *= twopm2;
00235
00236 if ( w != w )
00237 result = Qnan.d;
00238
00239 *y = result;
00240
00241 x += stridex;
00242 y += stridey;
00243 }
00244 }
00245