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 |
|
|
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; |
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; |
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 |
|
} |
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, |
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 |
|
} |
2105 |
|
#if defined(FPU_USE_X86_ROUNDING) |
2106 |
|
// Initial state after boot, reset and frestore(null frame) |
2107 |
|
x86_control_word = CW_INITIAL; |
2108 |
< |
#elif defined(__i386__) && defined(X86_ASSEMBLY) |
2108 |
> |
#elif defined(USE_X87_ASSEMBLY) |
2109 |
|
volatile unsigned short int cw; |
2110 |
|
__asm__ __volatile__("fnstcw %0" : "=m" (cw)); |
2111 |
|
cw &= ~0x0300; cw |= 0x0300; // CW_PC_EXTENDED |