Commit e2eb279809e0e2e158d65dd7b448c70bd773f6b7

Authored by aurel32
1 parent cf7055bd

target-alpha: use CPU_Float/CPU_Double instead of ugly casts

Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5771 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 34 additions and 26 deletions
target-alpha/op_helper.c
... ... @@ -345,13 +345,13 @@ uint64_t helper_cmpbge (uint64_t op1, uint64_t op2)
345 345 /* F floating (VAX) */
346 346 static always_inline uint64_t float32_to_f (float32 fa)
347 347 {
348   - uint32_t a;
349 348 uint64_t r, exp, mant, sig;
  349 + CPU_FloatU a;
350 350  
351   - a = *(uint32_t*)(&fa);
352   - sig = ((uint64_t)a & 0x80000000) << 32;
353   - exp = (a >> 23) & 0xff;
354   - mant = ((uint64_t)a & 0x007fffff) << 29;
  351 + a.f = fa;
  352 + sig = ((uint64_t)a.l & 0x80000000) << 32;
  353 + exp = (a.l >> 23) & 0xff;
  354 + mant = ((uint64_t)a.l & 0x007fffff) << 29;
355 355  
356 356 if (exp == 255) {
357 357 /* NaN or infinity */
... ... @@ -378,7 +378,8 @@ static always_inline uint64_t float32_to_f (float32 fa)
378 378  
379 379 static always_inline float32 f_to_float32 (uint64_t a)
380 380 {
381   - uint32_t r, exp, mant_sig;
  381 + uint32_t exp, mant_sig;
  382 + CPU_FloatU r;
382 383  
383 384 exp = ((a >> 55) & 0x80) | ((a >> 52) & 0x7f);
384 385 mant_sig = ((a >> 32) & 0x80000000) | ((a >> 29) & 0x007fffff);
... ... @@ -390,12 +391,12 @@ static always_inline float32 f_to_float32 (uint64_t a)
390 391  
391 392 if (exp < 3) {
392 393 /* Underflow */
393   - r = 0;
  394 + r.l = 0;
394 395 } else {
395   - r = ((exp - 2) << 23) | mant_sig;
  396 + r.l = ((exp - 2) << 23) | mant_sig;
396 397 }
397 398  
398   - return *(float32*)(&a);
  399 + return r.f;
399 400 }
400 401  
401 402 uint32_t helper_f_to_memory (uint64_t a)
... ... @@ -471,12 +472,13 @@ uint64_t helper_sqrtf (uint64_t t)
471 472 /* G floating (VAX) */
472 473 static always_inline uint64_t float64_to_g (float64 fa)
473 474 {
474   - uint64_t a, r, exp, mant, sig;
  475 + uint64_t r, exp, mant, sig;
  476 + CPU_DoubleU a;
475 477  
476   - a = *(uint64_t*)(&fa);
477   - sig = a & 0x8000000000000000ull;
478   - exp = (a >> 52) & 0x7ff;
479   - mant = a & 0x000fffffffffffffull;
  478 + a.d = fa;
  479 + sig = a.ll & 0x8000000000000000ull;
  480 + exp = (a.ll >> 52) & 0x7ff;
  481 + mant = a.ll & 0x000fffffffffffffull;
480 482  
481 483 if (exp == 2047) {
482 484 /* NaN or infinity */
... ... @@ -503,7 +505,8 @@ static always_inline uint64_t float64_to_g (float64 fa)
503 505  
504 506 static always_inline float64 g_to_float64 (uint64_t a)
505 507 {
506   - uint64_t r, exp, mant_sig;
  508 + uint64_t exp, mant_sig;
  509 + CPU_DoubleU r;
507 510  
508 511 exp = (a >> 52) & 0x7ff;
509 512 mant_sig = a & 0x800fffffffffffffull;
... ... @@ -515,12 +518,12 @@ static always_inline float64 g_to_float64 (uint64_t a)
515 518  
516 519 if (exp < 3) {
517 520 /* Underflow */
518   - r = 0;
  521 + r.ll = 0;
519 522 } else {
520   - r = ((exp - 2) << 52) | mant_sig;
  523 + r.ll = ((exp - 2) << 52) | mant_sig;
521 524 }
522 525  
523   - return *(float64*)(&a);
  526 + return r.d;
524 527 }
525 528  
526 529 uint64_t helper_g_to_memory (uint64_t a)
... ... @@ -596,21 +599,22 @@ uint64_t helper_sqrtg (uint64_t a)
596 599 /* S floating (single) */
597 600 static always_inline uint64_t float32_to_s (float32 fa)
598 601 {
599   - uint32_t a;
  602 + CPU_FloatU a;
600 603 uint64_t r;
601 604  
602   - a = *(uint32_t*)(&fa);
  605 + a.f = fa;
603 606  
604   - r = (((uint64_t)(a & 0xc0000000)) << 32) | (((uint64_t)(a & 0x3fffffff)) << 29);
605   - if (((a & 0x7f800000) != 0x7f800000) && (!(a & 0x40000000)))
  607 + r = (((uint64_t)(a.l & 0xc0000000)) << 32) | (((uint64_t)(a.l & 0x3fffffff)) << 29);
  608 + if (((a.l & 0x7f800000) != 0x7f800000) && (!(a.l & 0x40000000)))
606 609 r |= 0x7ll << 59;
607 610 return r;
608 611 }
609 612  
610 613 static always_inline float32 s_to_float32 (uint64_t a)
611 614 {
612   - uint32_t r = ((a >> 32) & 0xc0000000) | ((a >> 29) & 0x3fffffff);
613   - return *(float32*)(&r);
  615 + CPU_FloatU r;
  616 + r.l = ((a >> 32) & 0xc0000000) | ((a >> 29) & 0x3fffffff);
  617 + return r.f;
614 618 }
615 619  
616 620 uint32_t helper_s_to_memory (uint64_t a)
... ... @@ -680,13 +684,17 @@ uint64_t helper_sqrts (uint64_t a)
680 684 static always_inline float64 t_to_float64 (uint64_t a)
681 685 {
682 686 /* Memory format is the same as float64 */
683   - return *(float64*)(&a);
  687 + CPU_DoubleU r;
  688 + r.ll = a;
  689 + return r.d;
684 690 }
685 691  
686 692 static always_inline uint64_t float64_to_t (float64 fa)
687 693 {
688 694 /* Memory format is the same as float64 */
689   - return *(uint64*)(&fa);
  695 + CPU_DoubleU r;
  696 + r.d = fa;
  697 + return r.ll;
690 698 }
691 699  
692 700 uint64_t helper_addt (uint64_t a, uint64_t b)
... ...