ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/BasiliskII/src/uae_cpu/fpu/fpu_ieee.cpp
(Generate patch)

Comparing BasiliskII/src/uae_cpu/fpu/fpu_ieee.cpp (file contents):
Revision 1.5 by gbeauche, 2002-09-19T16:02:13Z vs.
Revision 1.6 by gbeauche, 2002-09-19T20:52:50Z

# Line 251 | Line 251 | PRIVATE inline fpu_register FFPU make_ex
251                  return 0.0;
252  
253          fpu_register result;
254 < #ifndef USE_LONG_DOUBLE
254 > #if USE_QUAD_DOUBLE
255 >        // is it NaN?
256 >        if ((wrd1 & 0x7fff0000) == 0x7fff0000 && wrd2 != 0 && wrd3 != 0) {
257 >                make_nan(result);
258 >                return result;
259 >        }
260 >        // is it inf?
261 >        if ((wrd1 & 0x7ffff000) == 0x7fff0000 && wrd2 == 0 && wrd3 == 0) {
262 >                if ((wrd1 & 0x80000000) == 0)
263 >                        make_inf_positive(result);
264 >                else
265 >                        make_inf_negative(result);
266 >                return result;
267 >        }
268 >        fp_declare_init_shape(srp, result, extended);
269 >        srp->ieee.negative  = (wrd1 >> 31) & 1;
270 >        srp->ieee.exponent  = (wrd1 >> 16) & FP_EXTENDED_EXP_MAX;
271 >        srp->ieee.mantissa0 = (wrd2 >> 16) & 0xffff;
272 >        srp->ieee.mantissa1 = ((wrd2 & 0xffff) << 16) | ((wrd3 >> 16) & 0xffff);
273 >        srp->ieee.mantissa2 = (wrd3 & 0xffff) << 16;
274 >        srp->ieee.mantissa3 = 0;
275 > #elif USE_LONG_DOUBLE
276 >        fp_declare_init_shape(srp, result, extended);
277 >        srp->ieee.negative      = (wrd1 >> 31) & 1;
278 >        srp->ieee.exponent      = (wrd1 >> 16) & FP_EXTENDED_EXP_MAX;
279 >        srp->ieee.mantissa0     = wrd2;
280 >        srp->ieee.mantissa1     = wrd3;
281 > #else
282          uae_u32 sgn = (wrd1 >> 31) & 1;
283          uae_u32 exp = (wrd1 >> 16) & 0x7fff;
284  
# Line 285 | Line 312 | PRIVATE inline fpu_register FFPU make_ex
312          // drop the explicit integer bit
313          srp->ieee.mantissa0 = (wrd2 & 0x7fffffff) >> 11;
314          srp->ieee.mantissa1 = (wrd2 << 21) | (wrd3 >> 11);
288 #elif USE_QUAD_DOUBLE
289        fp_declare_init_shape(srp, result, extended);
290        srp->ieee.negative  = (wrd1 >> 31) & 1;
291        srp->ieee.exponent  = (wrd1 >> 16) & FP_EXTENDED_EXP_MAX;
292        srp->ieee.mantissa0 = (wrd2 >> 16) & 0xffff;
293        srp->ieee.mantissa1 = ((wrd2 & 0xffff) << 16) | ((wrd3 >> 16) & 0xffff);
294        srp->ieee.mantissa2 = (wrd3 & 0xffff) << 16;
295 #else
296        fp_declare_init_shape(srp, result, extended);
297        srp->ieee.negative      = (wrd1 >> 31) & 1;
298        srp->ieee.exponent      = (wrd1 >> 16) & FP_EXTENDED_EXP_MAX;
299        srp->ieee.mantissa0     = wrd2;
300        srp->ieee.mantissa1     = wrd3;
315   #endif
316          fpu_debug(("make_extended (%X,%X,%X) = %.04f\n",wrd1,wrd2,wrd3,(double)result));
317          return result;
# Line 322 | Line 336 | PRIVATE inline void FFPU make_extended_n
336                  make_nan(result);
337                  return;
338          }
339 < #ifndef USE_LONG_DOUBLE
339 > #if USE_QUAD_DOUBLE
340 >        // is it inf?
341 >        if ((wrd1 & 0x7ffff000) == 0x7fff0000 && wrd2 == 0 && wrd3 == 0) {
342 >                if ((wrd1 & 0x80000000) == 0)
343 >                        make_inf_positive(result);
344 >                else
345 >                        make_inf_negative(result);
346 >                return;
347 >        }
348 >        fp_declare_init_shape(srp, result, extended);
349 >        srp->ieee.negative  = (wrd1 >> 31) & 1;
350 >        srp->ieee.exponent  = (wrd1 >> 16) & FP_EXTENDED_EXP_MAX;
351 >        srp->ieee.mantissa0 = (wrd2 >> 16) & 0xffff;
352 >        srp->ieee.mantissa1 = ((wrd2 & 0xffff) << 16) | ((wrd3 >> 16) & 0xffff);
353 >        srp->ieee.mantissa2 = (wrd3 & 0xffff) << 16;
354 >        srp->ieee.mantissa3 = 0;
355 > #elif USE_LONG_DOUBLE
356 >        fp_declare_init_shape(srp, result, extended);
357 >        srp->ieee.negative      = (wrd1 >> 31) & 1;
358 >        srp->ieee.exponent      = (wrd1 >> 16) & FP_EXTENDED_EXP_MAX;
359 >        srp->ieee.mantissa0     = wrd2;
360 >        srp->ieee.mantissa1     = wrd3;
361 > #else
362          uae_u32 exp = (wrd1 >> 16) & 0x7fff;
363          if (exp < FP_EXTENDED_EXP_BIAS - FP_DOUBLE_EXP_BIAS)
364                  exp = 0;
# Line 337 | Line 373 | PRIVATE inline void FFPU make_extended_n
373          // drop the explicit integer bit
374          srp->ieee.mantissa0 = (wrd2 & 0x7fffffff) >> 11;
375          srp->ieee.mantissa1 = (wrd2 << 21) | (wrd3 >> 11);
340 #else
341        // FIXME: USE_QUAD_DOUBLE
342        fp_declare_init_shape(srp, result, extended);
343        srp->ieee.negative      = (wrd1 & 0x80000000) != 0;
344        srp->ieee.exponent      = (wrd1 >> 16) & 0x7fff;
345        srp->ieee.mantissa0     = wrd2;
346        srp->ieee.mantissa1     = wrd3;
376   #endif
377          fpu_debug(("make_extended (%X,%X,%X) = %.04f\n",wrd1,wrd2,wrd3,(double)result));
378   }
# Line 357 | Line 386 | PRIVATE inline void FFPU extract_extende
386                  *wrd1 = *wrd2 = *wrd3 = 0;
387                  return;
388          }
389 < #ifndef USE_LONG_DOUBLE
389 > #if USE_QUAD_DOUBLE
390 >        // FIXME: deal with denormals?
391 >        fp_declare_init_shape(srp, src, extended);
392 >        *wrd1 = (srp->ieee.negative << 31) | (srp->ieee.exponent << 16);
393 >        // always set the explicit integer bit.
394 >        *wrd2 = 0x80000000 | (srp->ieee.mantissa0 << 15) | ((srp->ieee.mantissa1 & 0xfffe0000) >> 17);
395 >        *wrd3 = (srp->ieee.mantissa1 << 15) | ((srp->ieee.mantissa2 & 0xfffe0000) >> 17);
396 > #elif USE_LONG_DOUBLE
397 >        uae_u32 *p = (uae_u32 *)&src;
398 > #ifdef WORDS_BIGENDIAN
399 >        *wrd1 = p[0];
400 >        *wrd2 = p[1];
401 >        *wrd3 = p[2];
402 > #else
403 >        *wrd3 = p[0];
404 >        *wrd2 = p[1];
405 >        *wrd1 = ( (uae_u32)*((uae_u16 *)&p[2]) ) << 16;
406 > #endif
407 > #else
408          fp_declare_init_shape(srp, src, double);
409          fpu_debug(("extract_extended (%d,%d,%X,%X)\n",
410                             srp->ieee.negative , srp->ieee.exponent,
# Line 374 | Line 421 | PRIVATE inline void FFPU extract_extende
421          // always set the explicit integer bit.
422          *wrd2 = 0x80000000 | (srp->ieee.mantissa0 << 11) | ((srp->ieee.mantissa1 & 0xffe00000) >> 21);
423          *wrd3 = srp->ieee.mantissa1 << 11;
377 #else
378        // FIXME: USE_QUAD_DOUBLE
379        uae_u32 *p = (uae_u32 *)&src;
380 #ifdef WORDS_BIGENDIAN
381        *wrd1 = p[0];
382        *wrd2 = p[1];
383        *wrd3 = p[2];
384 #else
385        *wrd3 = p[0];
386        *wrd2 = p[1];
387        *wrd1 = ( (uae_u32)*((uae_u16 *)&p[2]) ) << 16;
388 #endif
424   #endif
425          fpu_debug(("extract_extended (%.04f) = %X,%X,%X\n",(double)src,*wrd1,*wrd2,*wrd3));
426   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines