Commit 5c6a0628b798b8409fd1212c9df7689057c06083
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]; | ... | ... |