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 #define EXCESS 126L
00054 #define SIGNBIT 0x80000000L
00055 #define HIDDEN (1L << 23L)
00056 #define SIGN(fp) ((fp) & SIGNBIT)
00057 #define EXP(fp) (((fp) >> 23L) & 0xFF)
00058 #define MANT(fp) (((fp) & 0x7FFFFFL) | HIDDEN)
00059 #define PACK(s,e,m) ((s) | ((e) << 23L) | (m))
00060
00061
00062 #define EXCESSD 1022
00063 #define HIDDEND (1L << 20L)
00064 #define EXPDBITS 11
00065 #define EXPDMASK 0x7FF
00066 #define EXPD(fp) (((fp.l.upper) >> 20L) & 0x7FFL)
00067 #define SIGND(fp) ((fp.l.upper) & SIGNBIT)
00068 #define MANTD(fp) (((((fp.l.upper) & 0xFFFFF) | HIDDEND) << 10) | \
00069 (fp.l.lower >> 22))
00070 #define MANTDMASK 0xFFFFF
00071
00072
00073 #define EXCESSX 16382
00074 #define HIDDENX (1L << 31L)
00075 #define EXPXBITS 15
00076 #define EXPXMASK 0x7FFF
00077 #define EXPX(fp) (((fp.l.upper) >> 16) & EXPXMASK)
00078 #define SIGNX(fp) ((fp.l.upper) & SIGNBIT)
00079 #define MANTXMASK 0x7FFFFFFF
00080
00081 union double_long
00082 {
00083 double d;
00084 struct {
00085 long upper;
00086 unsigned long lower;
00087 } l;
00088 };
00089
00090 union float_long {
00091 float f;
00092 long l;
00093 };
00094
00095 union long_double_long
00096 {
00097 long double ld;
00098 struct
00099 {
00100 long upper;
00101 unsigned long middle;
00102 unsigned long lower;
00103 } l;
00104 };
00105
00106 #ifndef EXTFLOAT
00107
00108
00109 double
00110 __floatsidf (int a1)
00111 {
00112 long sign = 0, exp = 31 + EXCESSD;
00113 union double_long dl;
00114
00115 if (!a1)
00116 {
00117 dl.l.upper = dl.l.lower = 0;
00118 return dl.d;
00119 }
00120
00121 if (a1 < 0)
00122 {
00123 sign = SIGNBIT;
00124 a1 = -a1;
00125 if (a1 < 0)
00126 {
00127 dl.l.upper = SIGNBIT | ((32 + EXCESSD) << 20L);
00128 dl.l.lower = 0;
00129 return dl.d;
00130 }
00131 }
00132
00133 while (a1 < 0x1000000)
00134 {
00135 a1 <<= 4;
00136 exp -= 4;
00137 }
00138
00139 while (a1 < 0x40000000)
00140 {
00141 a1 <<= 1;
00142 exp--;
00143 }
00144
00145
00146 dl.l.upper = sign;
00147 dl.l.upper |= exp << 20L;
00148 dl.l.upper |= (a1 >> 10L) & ~HIDDEND;
00149 dl.l.lower = a1 << 22L;
00150
00151 return dl.d;
00152 }
00153
00154
00155 float
00156 __floatsisf (int l)
00157 {
00158 double foo = __floatsidf (l);
00159 return foo;
00160 }
00161
00162
00163 double
00164 __extendsfdf2 (float a1)
00165 {
00166 register union float_long fl1;
00167 register union double_long dl;
00168 register long exp;
00169
00170 fl1.f = a1;
00171
00172 if (!fl1.l)
00173 {
00174 dl.l.upper = dl.l.lower = 0;
00175 return dl.d;
00176 }
00177
00178 dl.l.upper = SIGN (fl1.l);
00179 exp = EXP (fl1.l) - EXCESS + EXCESSD;
00180 dl.l.upper |= exp << 20;
00181 dl.l.upper |= (MANT (fl1.l) & ~HIDDEN) >> 3;
00182 dl.l.lower = MANT (fl1.l) << 29;
00183
00184 return dl.d;
00185 }
00186
00187
00188 float
00189 __truncdfsf2 (double a1)
00190 {
00191 register long exp;
00192 register long mant;
00193 register union float_long fl;
00194 register union double_long dl1;
00195
00196 dl1.d = a1;
00197
00198 if (!dl1.l.upper && !dl1.l.lower)
00199 return 0;
00200
00201 exp = EXPD (dl1) - EXCESSD + EXCESS;
00202
00203
00204 mant = MANTD (dl1) >> 6;
00205
00206
00207 mant += 1;
00208 mant >>= 1;
00209
00210
00211 if (mant & 0xFF000000)
00212 {
00213 mant >>= 1;
00214 exp++;
00215 }
00216
00217 mant &= ~HIDDEN;
00218
00219
00220 fl.l = PACK (SIGND (dl1), exp, mant);
00221 return (fl.f);
00222 }
00223
00224
00225 int
00226 __fixdfsi (double a1)
00227 {
00228 register union double_long dl1;
00229 register long exp;
00230 register long l;
00231
00232 dl1.d = a1;
00233
00234 if (!dl1.l.upper && !dl1.l.lower)
00235 return 0;
00236
00237 exp = EXPD (dl1) - EXCESSD - 31;
00238 l = MANTD (dl1);
00239
00240 if (exp > 0)
00241 {
00242
00243 return SIGND (dl1) ? 0x80000000 : 0x7fffffff;
00244 }
00245
00246 if (exp <= -32)
00247 return 0;
00248
00249
00250 if (exp < 0)
00251 l >>= -exp;
00252
00253 return (SIGND (dl1) ? -l : l);
00254 }
00255
00256
00257 int
00258 __fixsfsi (float a1)
00259 {
00260 double foo = a1;
00261 return __fixdfsi (foo);
00262 }
00263
00264 #else
00265
00266
00267
00268
00269
00270
00271 double __floatsidf (int);
00272 float __floatsisf (int);
00273 double __extendsfdf2 (float);
00274 float __truncdfsf2 (double);
00275 int __fixdfsi (double);
00276 int __fixsfsi (float);
00277
00278
00279 long double
00280 __extenddfxf2 (double d)
00281 {
00282 register union double_long dl;
00283 register union long_double_long ldl;
00284 register long exp;
00285
00286 dl.d = d;
00287
00288
00289 if (!dl.l.upper && !dl.l.lower)
00290 return 0;
00291
00292 ldl.l.upper = SIGND (dl);
00293 exp = EXPD (dl) - EXCESSD + EXCESSX;
00294 ldl.l.upper |= exp << 16;
00295 ldl.l.middle = HIDDENX;
00296
00297 ldl.l.middle |= (dl.l.upper & MANTDMASK) << (31 - 20);
00298
00299 ldl.l.middle |= dl.l.lower >> (1 + 20);
00300
00301 ldl.l.lower = dl.l.lower << (32 - 21);
00302
00303
00304 return ldl.ld;
00305 }
00306
00307
00308 double
00309 __truncxfdf2 (long double ld)
00310 {
00311 register long exp;
00312 register union double_long dl;
00313 register union long_double_long ldl;
00314
00315 ldl.ld = ld;
00316
00317
00318 if (!ldl.l.upper && !ldl.l.middle && !ldl.l.lower)
00319 return 0;
00320
00321 exp = EXPX (ldl) - EXCESSX + EXCESSD;
00322
00323 if (exp >= EXPDMASK)
00324 exp = EXPDMASK - 1;
00325 dl.l.upper = SIGNX (ldl);
00326 dl.l.upper |= exp << (32 - (EXPDBITS + 1));
00327
00328 dl.l.upper |= (ldl.l.middle & MANTXMASK) >> (EXPDBITS + 1 - 1);
00329 dl.l.lower = (ldl.l.middle & MANTXMASK) << (32 - (EXPDBITS + 1 - 1));
00330 dl.l.lower |= ldl.l.lower >> (EXPDBITS + 1 - 1);
00331
00332
00333 return dl.d;
00334 }
00335
00336
00337 long double
00338 __extendsfxf2 (float f)
00339 {
00340 long double foo = __extenddfxf2 (__extendsfdf2 (f));
00341 return foo;
00342 }
00343
00344
00345 float
00346 __truncxfsf2 (long double ld)
00347 {
00348 float foo = __truncdfsf2 (__truncxfdf2 (ld));
00349 return foo;
00350 }
00351
00352
00353 long double
00354 __floatsixf (int l)
00355 {
00356 double foo = __floatsidf (l);
00357 return foo;
00358 }
00359
00360
00361 int
00362 __fixxfsi (long double ld)
00363 {
00364 int foo = __fixdfsi ((double) ld);
00365 return foo;
00366 }
00367
00368
00369
00370 long double
00371 __addxf3 (long double x1, long double x2)
00372 {
00373 return (double) x1 + (double) x2;
00374 }
00375
00376 long double
00377 __subxf3 (long double x1, long double x2)
00378 {
00379 return (double) x1 - (double) x2;
00380 }
00381
00382 long double
00383 __mulxf3 (long double x1, long double x2)
00384 {
00385 return (double) x1 * (double) x2;
00386 }
00387
00388 long double
00389 __divxf3 (long double x1, long double x2)
00390 {
00391 return (double) x1 / (double) x2;
00392 }
00393
00394 long double
00395 __negxf2 (long double x1)
00396 {
00397 return - (double) x1;
00398 }
00399
00400 long
00401 __cmpxf2 (long double x1, long double x2)
00402 {
00403 return __cmpdf2 ((double) x1, (double) x2);
00404 }
00405
00406 long
00407 __eqxf2 (long double x1, long double x2)
00408 {
00409 return __cmpdf2 ((double) x1, (double) x2);
00410 }
00411
00412 long
00413 __nexf2 (long double x1, long double x2)
00414 {
00415 return __cmpdf2 ((double) x1, (double) x2);
00416 }
00417
00418 long
00419 __ltxf2 (long double x1, long double x2)
00420 {
00421 return __cmpdf2 ((double) x1, (double) x2);
00422 }
00423
00424 long
00425 __lexf2 (long double x1, long double x2)
00426 {
00427 return __cmpdf2 ((double) x1, (double) x2);
00428 }
00429
00430 long
00431 __gtxf2 (long double x1, long double x2)
00432 {
00433 return __cmpdf2 ((double) x1, (double) x2);
00434 }
00435
00436 long
00437 __gexf2 (long double x1, long double x2)
00438 {
00439 return __cmpdf2 ((double) x1, (double) x2);
00440 }
00441
00442 #endif