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 1022L
00063 #define HIDDEND (1L << 20L)
00064 #define EXPDBITS 11
00065 #define EXPDMASK 0x7FFL
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 0xFFFFFL
00071
00072
00073 #define EXCESSX 16382L
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 0x7FFFFFFFL
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 int
00109 __unordsf2(float a, float b)
00110 {
00111 union float_long fl;
00112
00113 fl.f = a;
00114 if (EXP(fl.l) == EXP(~0u) && (MANT(fl.l) & ~HIDDEN) != 0)
00115 return 1;
00116 fl.f = b;
00117 if (EXP(fl.l) == EXP(~0u) && (MANT(fl.l) & ~HIDDEN) != 0)
00118 return 1;
00119 return 0;
00120 }
00121
00122 int
00123 __unorddf2(double a, double b)
00124 {
00125 union double_long dl;
00126
00127 dl.d = a;
00128 if (EXPD(dl) == EXPDMASK
00129 && ((dl.l.upper & MANTDMASK) != 0 || dl.l.lower != 0))
00130 return 1;
00131 dl.d = b;
00132 if (EXPD(dl) == EXPDMASK
00133 && ((dl.l.upper & MANTDMASK) != 0 || dl.l.lower != 0))
00134 return 1;
00135 return 0;
00136 }
00137
00138
00139 double
00140 __floatunsidf (unsigned long a1)
00141 {
00142 long exp = 32 + EXCESSD;
00143 union double_long dl;
00144
00145 if (!a1)
00146 {
00147 dl.l.upper = dl.l.lower = 0;
00148 return dl.d;
00149 }
00150
00151 while (a1 < 0x2000000L)
00152 {
00153 a1 <<= 4;
00154 exp -= 4;
00155 }
00156
00157 while (a1 < 0x80000000L)
00158 {
00159 a1 <<= 1;
00160 exp--;
00161 }
00162
00163
00164 dl.l.upper = exp << 20L;
00165 dl.l.upper |= (a1 >> 11L) & ~HIDDEND;
00166 dl.l.lower = a1 << 21L;
00167
00168 return dl.d;
00169 }
00170
00171
00172 double
00173 __floatsidf (long a1)
00174 {
00175 long sign = 0, exp = 31 + EXCESSD;
00176 union double_long dl;
00177
00178 if (!a1)
00179 {
00180 dl.l.upper = dl.l.lower = 0;
00181 return dl.d;
00182 }
00183
00184 if (a1 < 0)
00185 {
00186 sign = SIGNBIT;
00187 a1 = (long)-(unsigned long)a1;
00188 if (a1 < 0)
00189 {
00190 dl.l.upper = SIGNBIT | ((32 + EXCESSD) << 20L);
00191 dl.l.lower = 0;
00192 return dl.d;
00193 }
00194 }
00195
00196 while (a1 < 0x1000000L)
00197 {
00198 a1 <<= 4;
00199 exp -= 4;
00200 }
00201
00202 while (a1 < 0x40000000L)
00203 {
00204 a1 <<= 1;
00205 exp--;
00206 }
00207
00208
00209 dl.l.upper = sign;
00210 dl.l.upper |= exp << 20L;
00211 dl.l.upper |= (a1 >> 10L) & ~HIDDEND;
00212 dl.l.lower = a1 << 22L;
00213
00214 return dl.d;
00215 }
00216
00217
00218 float
00219 __floatunsisf (unsigned long l)
00220 {
00221 double foo = __floatunsidf (l);
00222 return foo;
00223 }
00224
00225
00226 float
00227 __floatsisf (long l)
00228 {
00229 double foo = __floatsidf (l);
00230 return foo;
00231 }
00232
00233
00234 double
00235 __extendsfdf2 (float a1)
00236 {
00237 register union float_long fl1;
00238 register union double_long dl;
00239 register long exp;
00240 register long mant;
00241
00242 fl1.f = a1;
00243
00244 dl.l.upper = SIGN (fl1.l);
00245 if ((fl1.l & ~SIGNBIT) == 0)
00246 {
00247 dl.l.lower = 0;
00248 return dl.d;
00249 }
00250
00251 exp = EXP(fl1.l);
00252 mant = MANT (fl1.l) & ~HIDDEN;
00253 if (exp == 0)
00254 {
00255
00256 exp = 1;
00257 while (!(mant & HIDDEN))
00258 {
00259 mant <<= 1;
00260 exp--;
00261 }
00262 mant &= ~HIDDEN;
00263 }
00264 exp = exp - EXCESS + EXCESSD;
00265 dl.l.upper |= exp << 20;
00266 dl.l.upper |= mant >> 3;
00267 dl.l.lower = mant << 29;
00268
00269 return dl.d;
00270 }
00271
00272
00273 float
00274 __truncdfsf2 (double a1)
00275 {
00276 register long exp;
00277 register long mant;
00278 register union float_long fl;
00279 register union double_long dl1;
00280
00281 dl1.d = a1;
00282
00283 if ((dl1.l.upper & ~SIGNBIT) == 0 && !dl1.l.lower)
00284 {
00285 fl.l = SIGND(dl1);
00286 return fl.f;
00287 }
00288
00289 exp = EXPD (dl1) - EXCESSD + EXCESS;
00290
00291
00292 mant = MANTD (dl1) >> 6;
00293
00294
00295 if (exp <= 0)
00296 {
00297 if (exp < -24)
00298 mant = 0;
00299 else
00300 mant >>= 1 - exp;
00301 exp = 0;
00302 }
00303
00304
00305 mant += 1;
00306 mant >>= 1;
00307
00308
00309 if (mant & 0xFF000000L)
00310 {
00311 mant >>= 1;
00312 exp++;
00313 }
00314
00315 mant &= ~HIDDEN;
00316
00317
00318 fl.l = PACK (SIGND (dl1), exp, mant);
00319 return (fl.f);
00320 }
00321
00322
00323 long
00324 __fixdfsi (double a1)
00325 {
00326 register union double_long dl1;
00327 register long exp;
00328 register long l;
00329
00330 dl1.d = a1;
00331
00332 if (!dl1.l.upper && !dl1.l.lower)
00333 return 0;
00334
00335 exp = EXPD (dl1) - EXCESSD - 31;
00336 l = MANTD (dl1);
00337
00338 if (exp > 0)
00339 {
00340
00341 return SIGND (dl1) ? 0x80000000L : 0x7fffffffL;
00342 }
00343
00344 if (exp <= -32)
00345 return 0;
00346
00347
00348 if (exp < 0)
00349 l >>= -exp;
00350
00351 return (SIGND (dl1) ? -l : l);
00352 }
00353
00354
00355 long
00356 __fixsfsi (float a1)
00357 {
00358 double foo = a1;
00359 return __fixdfsi (foo);
00360 }
00361
00362 #else
00363
00364
00365
00366
00367
00368
00369 double __floatunsidf (unsigned long);
00370 double __floatsidf (long);
00371 float __floatsisf (long);
00372 double __extendsfdf2 (float);
00373 float __truncdfsf2 (double);
00374 long __fixdfsi (double);
00375 long __fixsfsi (float);
00376
00377 int
00378 __unordxf2(long double a, long double b)
00379 {
00380 union long_double_long ldl;
00381
00382 ldl.ld = a;
00383 if (EXPX(ldl) == EXPXMASK
00384 && ((ldl.l.middle & MANTXMASK) != 0 || ldl.l.lower != 0))
00385 return 1;
00386 ldl.ld = b;
00387 if (EXPX(ldl) == EXPXMASK
00388 && ((ldl.l.middle & MANTXMASK) != 0 || ldl.l.lower != 0))
00389 return 1;
00390 return 0;
00391 }
00392
00393
00394 long double
00395 __extenddfxf2 (double d)
00396 {
00397 register union double_long dl;
00398 register union long_double_long ldl;
00399 register long exp;
00400
00401 dl.d = d;
00402
00403
00404 ldl.l.upper = SIGND (dl);
00405 if ((dl.l.upper & ~SIGNBIT) == 0 && !dl.l.lower)
00406 {
00407 ldl.l.middle = 0;
00408 ldl.l.lower = 0;
00409 return ldl.ld;
00410 }
00411
00412 exp = EXPD (dl) - EXCESSD + EXCESSX;
00413 ldl.l.upper |= exp << 16;
00414 ldl.l.middle = HIDDENX;
00415
00416 ldl.l.middle |= (dl.l.upper & MANTDMASK) << (31 - 20);
00417
00418 ldl.l.middle |= dl.l.lower >> (1 + 20);
00419
00420 ldl.l.lower = dl.l.lower << (32 - 21);
00421
00422
00423 return ldl.ld;
00424 }
00425
00426
00427 double
00428 __truncxfdf2 (long double ld)
00429 {
00430 register long exp;
00431 register union double_long dl;
00432 register union long_double_long ldl;
00433
00434 ldl.ld = ld;
00435
00436
00437 dl.l.upper = SIGNX (ldl);
00438 if ((ldl.l.upper & ~SIGNBIT) == 0 && !ldl.l.middle && !ldl.l.lower)
00439 {
00440 dl.l.lower = 0;
00441 return dl.d;
00442 }
00443
00444 exp = EXPX (ldl) - EXCESSX + EXCESSD;
00445
00446 if (exp >= EXPDMASK)
00447 exp = EXPDMASK - 1;
00448 dl.l.upper |= exp << (32 - (EXPDBITS + 1));
00449
00450 dl.l.upper |= (ldl.l.middle & MANTXMASK) >> (EXPDBITS + 1 - 1);
00451 dl.l.lower = (ldl.l.middle & MANTXMASK) << (32 - (EXPDBITS + 1 - 1));
00452 dl.l.lower |= ldl.l.lower >> (EXPDBITS + 1 - 1);
00453
00454
00455 return dl.d;
00456 }
00457
00458
00459 long double
00460 __extendsfxf2 (float f)
00461 {
00462 long double foo = __extenddfxf2 (__extendsfdf2 (f));
00463 return foo;
00464 }
00465
00466
00467 float
00468 __truncxfsf2 (long double ld)
00469 {
00470 float foo = __truncdfsf2 (__truncxfdf2 (ld));
00471 return foo;
00472 }
00473
00474
00475 long double
00476 __floatsixf (long l)
00477 {
00478 double foo = __floatsidf (l);
00479 return foo;
00480 }
00481
00482
00483 long double
00484 __floatunsixf (unsigned long l)
00485 {
00486 double foo = __floatunsidf (l);
00487 return foo;
00488 }
00489
00490
00491 long
00492 __fixxfsi (long double ld)
00493 {
00494 long foo = __fixdfsi ((double) ld);
00495 return foo;
00496 }
00497
00498
00499
00500 long double
00501 __addxf3 (long double x1, long double x2)
00502 {
00503 return (double) x1 + (double) x2;
00504 }
00505
00506 long double
00507 __subxf3 (long double x1, long double x2)
00508 {
00509 return (double) x1 - (double) x2;
00510 }
00511
00512 long double
00513 __mulxf3 (long double x1, long double x2)
00514 {
00515 return (double) x1 * (double) x2;
00516 }
00517
00518 long double
00519 __divxf3 (long double x1, long double x2)
00520 {
00521 return (double) x1 / (double) x2;
00522 }
00523
00524 long double
00525 __negxf2 (long double x1)
00526 {
00527 return - (double) x1;
00528 }
00529
00530 long
00531 __cmpxf2 (long double x1, long double x2)
00532 {
00533 return __cmpdf2 ((double) x1, (double) x2);
00534 }
00535
00536 long
00537 __eqxf2 (long double x1, long double x2)
00538 {
00539 return __cmpdf2 ((double) x1, (double) x2);
00540 }
00541
00542 long
00543 __nexf2 (long double x1, long double x2)
00544 {
00545 return __cmpdf2 ((double) x1, (double) x2);
00546 }
00547
00548 long
00549 __ltxf2 (long double x1, long double x2)
00550 {
00551 return __cmpdf2 ((double) x1, (double) x2);
00552 }
00553
00554 long
00555 __lexf2 (long double x1, long double x2)
00556 {
00557 return __cmpdf2 ((double) x1, (double) x2);
00558 }
00559
00560 long
00561 __gtxf2 (long double x1, long double x2)
00562 {
00563 return __cmpdf2 ((double) x1, (double) x2);
00564 }
00565
00566 long
00567 __gexf2 (long double x1, long double x2)
00568 {
00569 return __cmpdf2 ((double) x1, (double) x2);
00570 }
00571
00572 #endif