Commit 5c6a0628b798b8409fd1212c9df7689057c06083

Authored by blueswir1
1 parent 8210169a

Avoid brcond problems, use temps for cpu_src1 & cpu_src2

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4771 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 32 additions and 35 deletions
target-sparc/translate.c
... ... @@ -450,8 +450,7 @@ static inline void gen_op_add_cc(TCGv dst, TCGv src1, TCGv src2)
450 450 {
451 451 tcg_gen_mov_tl(cpu_cc_src, src1);
452 452 tcg_gen_mov_tl(cpu_cc_src2, src2);
453   - tcg_gen_add_tl(dst, src1, src2);
454   - tcg_gen_mov_tl(cpu_cc_dst, dst);
  453 + tcg_gen_add_tl(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);
455 454 gen_cc_clear_icc();
456 455 gen_cc_NZ_icc(cpu_cc_dst);
457 456 gen_cc_C_add_icc(cpu_cc_dst, cpu_cc_src);
... ... @@ -462,6 +461,7 @@ static inline void gen_op_add_cc(TCGv dst, TCGv src1, TCGv src2)
462 461 gen_cc_C_add_xcc(cpu_cc_dst, cpu_cc_src);
463 462 gen_cc_V_add_xcc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);
464 463 #endif
  464 + tcg_gen_mov_tl(dst, cpu_cc_dst);
465 465 }
466 466  
467 467 static inline void gen_op_addx_cc(TCGv dst, TCGv src1, TCGv src2)
... ... @@ -469,15 +469,14 @@ static inline void gen_op_addx_cc(TCGv dst, TCGv src1, TCGv src2)
469 469 tcg_gen_mov_tl(cpu_cc_src, src1);
470 470 tcg_gen_mov_tl(cpu_cc_src2, src2);
471 471 gen_mov_reg_C(cpu_tmp0, cpu_psr);
472   - tcg_gen_add_tl(dst, src1, cpu_tmp0);
  472 + tcg_gen_add_tl(cpu_cc_dst, cpu_cc_src, cpu_tmp0);
473 473 gen_cc_clear_icc();
474   - gen_cc_C_add_icc(dst, cpu_cc_src);
  474 + gen_cc_C_add_icc(cpu_cc_dst, cpu_cc_src);
475 475 #ifdef TARGET_SPARC64
476 476 gen_cc_clear_xcc();
477   - gen_cc_C_add_xcc(dst, cpu_cc_src);
  477 + gen_cc_C_add_xcc(cpu_cc_dst, cpu_cc_src);
478 478 #endif
479   - tcg_gen_add_tl(dst, dst, cpu_cc_src2);
480   - tcg_gen_mov_tl(cpu_cc_dst, dst);
  479 + tcg_gen_add_tl(cpu_cc_dst, cpu_cc_dst, cpu_cc_src2);
481 480 gen_cc_NZ_icc(cpu_cc_dst);
482 481 gen_cc_C_add_icc(cpu_cc_dst, cpu_cc_src);
483 482 gen_cc_V_add_icc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);
... ... @@ -486,14 +485,14 @@ static inline void gen_op_addx_cc(TCGv dst, TCGv src1, TCGv src2)
486 485 gen_cc_C_add_xcc(cpu_cc_dst, cpu_cc_src);
487 486 gen_cc_V_add_xcc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);
488 487 #endif
  488 + tcg_gen_mov_tl(dst, cpu_cc_dst);
489 489 }
490 490  
491 491 static inline void gen_op_tadd_cc(TCGv dst, TCGv src1, TCGv src2)
492 492 {
493 493 tcg_gen_mov_tl(cpu_cc_src, src1);
494 494 tcg_gen_mov_tl(cpu_cc_src2, src2);
495   - tcg_gen_add_tl(dst, src1, src2);
496   - tcg_gen_mov_tl(cpu_cc_dst, dst);
  495 + tcg_gen_add_tl(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);
497 496 gen_cc_clear_icc();
498 497 gen_cc_NZ_icc(cpu_cc_dst);
499 498 gen_cc_C_add_icc(cpu_cc_dst, cpu_cc_src);
... ... @@ -505,6 +504,7 @@ static inline void gen_op_tadd_cc(TCGv dst, TCGv src1, TCGv src2)
505 504 gen_cc_C_add_xcc(cpu_cc_dst, cpu_cc_src);
506 505 gen_cc_V_add_xcc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);
507 506 #endif
  507 + tcg_gen_mov_tl(dst, cpu_cc_dst);
508 508 }
509 509  
510 510 static inline void gen_op_tadd_ccTV(TCGv dst, TCGv src1, TCGv src2)
... ... @@ -512,9 +512,8 @@ static inline void gen_op_tadd_ccTV(TCGv dst, TCGv src1, TCGv src2)
512 512 tcg_gen_mov_tl(cpu_cc_src, src1);
513 513 tcg_gen_mov_tl(cpu_cc_src2, src2);
514 514 gen_tag_tv(cpu_cc_src, cpu_cc_src2);
515   - tcg_gen_add_tl(dst, src1, src2);
516   - tcg_gen_mov_tl(cpu_cc_dst, dst);
517   - gen_add_tv(dst, cpu_cc_src, cpu_cc_src2);
  515 + tcg_gen_add_tl(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);
  516 + gen_add_tv(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);
518 517 gen_cc_clear_icc();
519 518 gen_cc_NZ_icc(cpu_cc_dst);
520 519 gen_cc_C_add_icc(cpu_cc_dst, cpu_cc_src);
... ... @@ -524,6 +523,7 @@ static inline void gen_op_tadd_ccTV(TCGv dst, TCGv src1, TCGv src2)
524 523 gen_cc_C_add_xcc(cpu_cc_dst, cpu_cc_src);
525 524 gen_cc_V_add_xcc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);
526 525 #endif
  526 + tcg_gen_mov_tl(dst, cpu_cc_dst);
527 527 }
528 528  
529 529 /* old op:
... ... @@ -619,8 +619,7 @@ static inline void gen_op_sub_cc(TCGv dst, TCGv src1, TCGv src2)
619 619 {
620 620 tcg_gen_mov_tl(cpu_cc_src, src1);
621 621 tcg_gen_mov_tl(cpu_cc_src2, src2);
622   - tcg_gen_sub_tl(dst, src1, src2);
623   - tcg_gen_mov_tl(cpu_cc_dst, dst);
  622 + tcg_gen_sub_tl(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);
624 623 gen_cc_clear_icc();
625 624 gen_cc_NZ_icc(cpu_cc_dst);
626 625 gen_cc_C_sub_icc(cpu_cc_src, cpu_cc_src2);
... ... @@ -631,6 +630,7 @@ static inline void gen_op_sub_cc(TCGv dst, TCGv src1, TCGv src2)
631 630 gen_cc_C_sub_xcc(cpu_cc_src, cpu_cc_src2);
632 631 gen_cc_V_sub_xcc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);
633 632 #endif
  633 + tcg_gen_mov_tl(dst, cpu_cc_dst);
634 634 }
635 635  
636 636 static inline void gen_op_subx_cc(TCGv dst, TCGv src1, TCGv src2)
... ... @@ -638,15 +638,14 @@ static inline void gen_op_subx_cc(TCGv dst, TCGv src1, TCGv src2)
638 638 tcg_gen_mov_tl(cpu_cc_src, src1);
639 639 tcg_gen_mov_tl(cpu_cc_src2, src2);
640 640 gen_mov_reg_C(cpu_tmp0, cpu_psr);
641   - tcg_gen_sub_tl(dst, src1, cpu_tmp0);
  641 + tcg_gen_sub_tl(cpu_cc_dst, cpu_cc_src, cpu_tmp0);
642 642 gen_cc_clear_icc();
643   - gen_cc_C_sub_icc(dst, cpu_cc_src);
  643 + gen_cc_C_sub_icc(cpu_cc_dst, cpu_cc_src);
644 644 #ifdef TARGET_SPARC64
645 645 gen_cc_clear_xcc();
646   - gen_cc_C_sub_xcc(dst, cpu_cc_src);
  646 + gen_cc_C_sub_xcc(cpu_cc_dst, cpu_cc_src);
647 647 #endif
648   - tcg_gen_sub_tl(dst, dst, cpu_cc_src2);
649   - tcg_gen_mov_tl(cpu_cc_dst, dst);
  648 + tcg_gen_sub_tl(cpu_cc_dst, cpu_cc_dst, cpu_cc_src2);
650 649 gen_cc_NZ_icc(cpu_cc_dst);
651 650 gen_cc_C_sub_icc(cpu_cc_dst, cpu_cc_src);
652 651 gen_cc_V_sub_icc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);
... ... @@ -655,14 +654,14 @@ static inline void gen_op_subx_cc(TCGv dst, TCGv src1, TCGv src2)
655 654 gen_cc_C_sub_xcc(cpu_cc_dst, cpu_cc_src);
656 655 gen_cc_V_sub_xcc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);
657 656 #endif
  657 + tcg_gen_mov_tl(dst, cpu_cc_dst);
658 658 }
659 659  
660 660 static inline void gen_op_tsub_cc(TCGv dst, TCGv src1, TCGv src2)
661 661 {
662 662 tcg_gen_mov_tl(cpu_cc_src, src1);
663 663 tcg_gen_mov_tl(cpu_cc_src2, src2);
664   - tcg_gen_sub_tl(dst, src1, src2);
665   - tcg_gen_mov_tl(cpu_cc_dst, dst);
  664 + tcg_gen_sub_tl(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);
666 665 gen_cc_clear_icc();
667 666 gen_cc_NZ_icc(cpu_cc_dst);
668 667 gen_cc_C_sub_icc(cpu_cc_src, cpu_cc_src2);
... ... @@ -674,6 +673,7 @@ static inline void gen_op_tsub_cc(TCGv dst, TCGv src1, TCGv src2)
674 673 gen_cc_C_sub_xcc(cpu_cc_src, cpu_cc_src2);
675 674 gen_cc_V_sub_xcc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);
676 675 #endif
  676 + tcg_gen_mov_tl(dst, cpu_cc_dst);
677 677 }
678 678  
679 679 static inline void gen_op_tsub_ccTV(TCGv dst, TCGv src1, TCGv src2)
... ... @@ -681,9 +681,8 @@ static inline void gen_op_tsub_ccTV(TCGv dst, TCGv src1, TCGv src2)
681 681 tcg_gen_mov_tl(cpu_cc_src, src1);
682 682 tcg_gen_mov_tl(cpu_cc_src2, src2);
683 683 gen_tag_tv(cpu_cc_src, cpu_cc_src2);
684   - tcg_gen_sub_tl(dst, src1, src2);
685   - tcg_gen_mov_tl(cpu_cc_dst, dst);
686   - gen_sub_tv(dst, cpu_cc_src, cpu_cc_src2);
  684 + tcg_gen_sub_tl(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);
  685 + gen_sub_tv(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);
687 686 gen_cc_clear_icc();
688 687 gen_cc_NZ_icc(cpu_cc_dst);
689 688 gen_cc_C_sub_icc(cpu_cc_src, cpu_cc_src2);
... ... @@ -693,6 +692,7 @@ static inline void gen_op_tsub_ccTV(TCGv dst, TCGv src1, TCGv src2)
693 692 gen_cc_C_sub_xcc(cpu_cc_src, cpu_cc_src2);
694 693 gen_cc_V_sub_xcc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);
695 694 #endif
  695 + tcg_gen_mov_tl(dst, cpu_cc_dst);
696 696 }
697 697  
698 698 static inline void gen_op_mulscc(TCGv dst, TCGv src1, TCGv src2)
... ... @@ -741,13 +741,13 @@ static inline void gen_op_mulscc(TCGv dst, TCGv src1, TCGv src2)
741 741 tcg_gen_or_tl(cpu_cc_src, cpu_cc_src, cpu_tmp0);
742 742  
743 743 /* do addition and update flags */
744   - tcg_gen_add_tl(dst, cpu_cc_src, cpu_cc_src2);
745   - tcg_gen_mov_tl(cpu_cc_dst, dst);
  744 + tcg_gen_add_tl(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);
746 745  
747 746 gen_cc_clear_icc();
748 747 gen_cc_NZ_icc(cpu_cc_dst);
749 748 gen_cc_V_add_icc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);
750 749 gen_cc_C_add_icc(cpu_cc_dst, cpu_cc_src);
  750 + tcg_gen_mov_tl(dst, cpu_cc_dst);
751 751 }
752 752  
753 753 static inline void gen_op_umul(TCGv dst, TCGv src1, TCGv src2)
... ... @@ -818,7 +818,7 @@ static inline void gen_op_sdivx(TCGv dst, TCGv src1, TCGv src2)
818 818 l2 = gen_new_label();
819 819 tcg_gen_mov_tl(cpu_cc_src, src1);
820 820 tcg_gen_mov_tl(cpu_cc_src2, src2);
821   - gen_trap_ifdivzero_tl(src2);
  821 + gen_trap_ifdivzero_tl(cpu_cc_src2);
822 822 tcg_gen_brcondi_tl(TCG_COND_NE, cpu_cc_src, INT64_MIN, l1);
823 823 tcg_gen_brcondi_tl(TCG_COND_NE, cpu_cc_src2, -1, l1);
824 824 tcg_gen_movi_i64(dst, INT64_MIN);
... ... @@ -837,8 +837,7 @@ static inline void gen_op_div_cc(TCGv dst)
837 837 gen_cc_clear_icc();
838 838 gen_cc_NZ_icc(cpu_cc_dst);
839 839 l1 = gen_new_label();
840   - tcg_gen_ld_tl(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, cc_src2));
841   - tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_tmp0, 0, l1);
  840 + tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_cc_src2, 0, l1);
842 841 tcg_gen_ori_i32(cpu_psr, cpu_psr, PSR_OVF);
843 842 gen_set_label(l1);
844 843 }
... ... @@ -1866,11 +1865,9 @@ static inline TCGv get_src1(unsigned int insn, TCGv def)
1866 1865  
1867 1866 rs1 = GET_FIELD(insn, 13, 17);
1868 1867 if (rs1 == 0)
1869   - //r_rs1 = tcg_const_tl(0);
1870   - tcg_gen_movi_tl(def, 0);
  1868 + r_rs1 = tcg_const_tl(0); // XXX how to free?
1871 1869 else if (rs1 < 8)
1872   - //r_rs1 = cpu_gregs[rs1];
1873   - tcg_gen_mov_tl(def, cpu_gregs[rs1]);
  1870 + r_rs1 = cpu_gregs[rs1];
1874 1871 else
1875 1872 tcg_gen_ld_tl(def, cpu_regwptr, (rs1 - 8) * sizeof(target_ulong));
1876 1873 return r_rs1;
... ... @@ -1916,8 +1913,8 @@ static void disas_sparc_insn(DisasContext * dc)
1916 1913 rd = GET_FIELD(insn, 2, 6);
1917 1914  
1918 1915 cpu_dst = cpu_T[0];
1919   - cpu_src1 = cpu_T[0]; // const
1920   - cpu_src2 = cpu_T[1]; // const
  1916 + cpu_src1 = tcg_temp_new(TCG_TYPE_TL); // const
  1917 + cpu_src2 = tcg_temp_new(TCG_TYPE_TL); // const
1921 1918  
1922 1919 // loads and stores
1923 1920 cpu_addr = cpu_T[0];
... ...