Commit a6e92a658b99b4ab3b19b2f32352005e6190556f

Authored by aurel32
1 parent 9bf3eb2c

target-mips: gen_compute_branch1()

Optimize code generation in gen_compute_branch1():
- Directly use I32 variables instead of converting values from _tl to
  _i32 and back to _tl.
- Write the result directly to bcond instead of passing by a local
  variable.
- Temp variables are valid up to and *including* the brcond instruction.
  Use them instead of temp local variables.

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

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5684 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 41 additions and 81 deletions
target-mips/translate.c
@@ -5634,8 +5634,7 @@ static void gen_compute_branch1 (CPUState *env, DisasContext *ctx, uint32_t op, @@ -5634,8 +5634,7 @@ static void gen_compute_branch1 (CPUState *env, DisasContext *ctx, uint32_t op,
5634 { 5634 {
5635 target_ulong btarget; 5635 target_ulong btarget;
5636 const char *opn = "cp1 cond branch"; 5636 const char *opn = "cp1 cond branch";
5637 - TCGv t0 = tcg_temp_local_new(TCG_TYPE_TL);  
5638 - TCGv t1 = tcg_temp_local_new(TCG_TYPE_TL); 5637 + TCGv t0 = tcg_temp_new(TCG_TYPE_TL);
5639 5638
5640 if (cc != 0) 5639 if (cc != 0)
5641 check_insn(env, ctx, ISA_MIPS4 | ISA_MIPS32); 5640 check_insn(env, ctx, ISA_MIPS4 | ISA_MIPS32);
@@ -5647,19 +5646,14 @@ static void gen_compute_branch1 (CPUState *env, DisasContext *ctx, uint32_t op, @@ -5647,19 +5646,14 @@ static void gen_compute_branch1 (CPUState *env, DisasContext *ctx, uint32_t op,
5647 { 5646 {
5648 int l1 = gen_new_label(); 5647 int l1 = gen_new_label();
5649 int l2 = gen_new_label(); 5648 int l2 = gen_new_label();
5650 - TCGv r_tmp1 = tcg_temp_new(TCG_TYPE_I32);  
5651 5649
5652 - get_fp_cond(r_tmp1);  
5653 - tcg_gen_ext_i32_tl(t0, r_tmp1);  
5654 - tcg_temp_free(r_tmp1);  
5655 - tcg_gen_not_tl(t0, t0);  
5656 - tcg_gen_movi_tl(t1, 0x1 << cc);  
5657 - tcg_gen_and_tl(t0, t0, t1);  
5658 - tcg_gen_brcondi_tl(TCG_COND_NE, t0, 0, l1);  
5659 - tcg_gen_movi_tl(t0, 0); 5650 + get_fp_cond(t0);
  5651 + tcg_gen_andi_i32(t0, t0, 0x1 << cc);
  5652 + tcg_gen_brcondi_i32(TCG_COND_EQ, t0, 0, l1);
  5653 + tcg_gen_movi_i32(bcond, 0);
5660 tcg_gen_br(l2); 5654 tcg_gen_br(l2);
5661 gen_set_label(l1); 5655 gen_set_label(l1);
5662 - tcg_gen_movi_tl(t0, 1); 5656 + tcg_gen_movi_i32(bcond, 1);
5663 gen_set_label(l2); 5657 gen_set_label(l2);
5664 } 5658 }
5665 opn = "bc1f"; 5659 opn = "bc1f";
@@ -5668,19 +5662,14 @@ static void gen_compute_branch1 (CPUState *env, DisasContext *ctx, uint32_t op, @@ -5668,19 +5662,14 @@ static void gen_compute_branch1 (CPUState *env, DisasContext *ctx, uint32_t op,
5668 { 5662 {
5669 int l1 = gen_new_label(); 5663 int l1 = gen_new_label();
5670 int l2 = gen_new_label(); 5664 int l2 = gen_new_label();
5671 - TCGv r_tmp1 = tcg_temp_new(TCG_TYPE_I32);  
5672 5665
5673 - get_fp_cond(r_tmp1);  
5674 - tcg_gen_ext_i32_tl(t0, r_tmp1);  
5675 - tcg_temp_free(r_tmp1);  
5676 - tcg_gen_not_tl(t0, t0);  
5677 - tcg_gen_movi_tl(t1, 0x1 << cc);  
5678 - tcg_gen_and_tl(t0, t0, t1);  
5679 - tcg_gen_brcondi_tl(TCG_COND_NE, t0, 0, l1);  
5680 - tcg_gen_movi_tl(t0, 0); 5666 + get_fp_cond(t0);
  5667 + tcg_gen_andi_i32(t0, t0, 0x1 << cc);
  5668 + tcg_gen_brcondi_i32(TCG_COND_EQ, t0, 0, l1);
  5669 + tcg_gen_movi_i32(bcond, 0);
5681 tcg_gen_br(l2); 5670 tcg_gen_br(l2);
5682 gen_set_label(l1); 5671 gen_set_label(l1);
5683 - tcg_gen_movi_tl(t0, 1); 5672 + tcg_gen_movi_i32(bcond, 1);
5684 gen_set_label(l2); 5673 gen_set_label(l2);
5685 } 5674 }
5686 opn = "bc1fl"; 5675 opn = "bc1fl";
@@ -5689,18 +5678,14 @@ static void gen_compute_branch1 (CPUState *env, DisasContext *ctx, uint32_t op, @@ -5689,18 +5678,14 @@ static void gen_compute_branch1 (CPUState *env, DisasContext *ctx, uint32_t op,
5689 { 5678 {
5690 int l1 = gen_new_label(); 5679 int l1 = gen_new_label();
5691 int l2 = gen_new_label(); 5680 int l2 = gen_new_label();
5692 - TCGv r_tmp1 = tcg_temp_new(TCG_TYPE_I32);  
5693 5681
5694 - get_fp_cond(r_tmp1);  
5695 - tcg_gen_ext_i32_tl(t0, r_tmp1);  
5696 - tcg_temp_free(r_tmp1);  
5697 - tcg_gen_movi_tl(t1, 0x1 << cc);  
5698 - tcg_gen_and_tl(t0, t0, t1);  
5699 - tcg_gen_brcondi_tl(TCG_COND_NE, t0, 0, l1);  
5700 - tcg_gen_movi_tl(t0, 0); 5682 + get_fp_cond(t0);
  5683 + tcg_gen_andi_i32(t0, t0, 0x1 << cc);
  5684 + tcg_gen_brcondi_i32(TCG_COND_NE, t0, 0, l1);
  5685 + tcg_gen_movi_i32(bcond, 0);
5701 tcg_gen_br(l2); 5686 tcg_gen_br(l2);
5702 gen_set_label(l1); 5687 gen_set_label(l1);
5703 - tcg_gen_movi_tl(t0, 1); 5688 + tcg_gen_movi_i32(bcond, 1);
5704 gen_set_label(l2); 5689 gen_set_label(l2);
5705 } 5690 }
5706 opn = "bc1t"; 5691 opn = "bc1t";
@@ -5709,42 +5694,32 @@ static void gen_compute_branch1 (CPUState *env, DisasContext *ctx, uint32_t op, @@ -5709,42 +5694,32 @@ static void gen_compute_branch1 (CPUState *env, DisasContext *ctx, uint32_t op,
5709 { 5694 {
5710 int l1 = gen_new_label(); 5695 int l1 = gen_new_label();
5711 int l2 = gen_new_label(); 5696 int l2 = gen_new_label();
5712 - TCGv r_tmp1 = tcg_temp_new(TCG_TYPE_I32);  
5713 5697
5714 - get_fp_cond(r_tmp1);  
5715 - tcg_gen_ext_i32_tl(t0, r_tmp1);  
5716 - tcg_temp_free(r_tmp1);  
5717 - tcg_gen_movi_tl(t1, 0x1 << cc);  
5718 - tcg_gen_and_tl(t0, t0, t1);  
5719 - tcg_gen_brcondi_tl(TCG_COND_NE, t0, 0, l1);  
5720 - tcg_gen_movi_tl(t0, 0); 5698 + get_fp_cond(t0);
  5699 + tcg_gen_andi_i32(t0, t0, 0x1 << cc);
  5700 + tcg_gen_brcondi_i32(TCG_COND_NE, t0, 0, l1);
  5701 + tcg_gen_movi_i32(bcond, 0);
5721 tcg_gen_br(l2); 5702 tcg_gen_br(l2);
5722 gen_set_label(l1); 5703 gen_set_label(l1);
5723 - tcg_gen_movi_tl(t0, 1); 5704 + tcg_gen_movi_i32(bcond, 1);
5724 gen_set_label(l2); 5705 gen_set_label(l2);
5725 } 5706 }
5726 opn = "bc1tl"; 5707 opn = "bc1tl";
5727 likely: 5708 likely:
5728 ctx->hflags |= MIPS_HFLAG_BL; 5709 ctx->hflags |= MIPS_HFLAG_BL;
5729 - tcg_gen_trunc_tl_i32(bcond, t0);  
5730 break; 5710 break;
5731 case OPC_BC1FANY2: 5711 case OPC_BC1FANY2:
5732 { 5712 {
5733 int l1 = gen_new_label(); 5713 int l1 = gen_new_label();
5734 int l2 = gen_new_label(); 5714 int l2 = gen_new_label();
5735 - TCGv r_tmp1 = tcg_temp_new(TCG_TYPE_I32);  
5736 5715
5737 - get_fp_cond(r_tmp1);  
5738 - tcg_gen_ext_i32_tl(t0, r_tmp1);  
5739 - tcg_temp_free(r_tmp1);  
5740 - tcg_gen_not_tl(t0, t0);  
5741 - tcg_gen_movi_tl(t1, 0x3 << cc);  
5742 - tcg_gen_and_tl(t0, t0, t1);  
5743 - tcg_gen_brcondi_tl(TCG_COND_NE, t0, 0, l1);  
5744 - tcg_gen_movi_tl(t0, 0); 5716 + get_fp_cond(t0);
  5717 + tcg_gen_andi_i32(t0, t0, 0x3 << cc);
  5718 + tcg_gen_brcondi_i32(TCG_COND_EQ, t0, 0, l1);
  5719 + tcg_gen_movi_i32(bcond, 0);
5745 tcg_gen_br(l2); 5720 tcg_gen_br(l2);
5746 gen_set_label(l1); 5721 gen_set_label(l1);
5747 - tcg_gen_movi_tl(t0, 1); 5722 + tcg_gen_movi_i32(bcond, 1);
5748 gen_set_label(l2); 5723 gen_set_label(l2);
5749 } 5724 }
5750 opn = "bc1any2f"; 5725 opn = "bc1any2f";
@@ -5753,18 +5728,14 @@ static void gen_compute_branch1 (CPUState *env, DisasContext *ctx, uint32_t op, @@ -5753,18 +5728,14 @@ static void gen_compute_branch1 (CPUState *env, DisasContext *ctx, uint32_t op,
5753 { 5728 {
5754 int l1 = gen_new_label(); 5729 int l1 = gen_new_label();
5755 int l2 = gen_new_label(); 5730 int l2 = gen_new_label();
5756 - TCGv r_tmp1 = tcg_temp_new(TCG_TYPE_I32);  
5757 5731
5758 - get_fp_cond(r_tmp1);  
5759 - tcg_gen_ext_i32_tl(t0, r_tmp1);  
5760 - tcg_temp_free(r_tmp1);  
5761 - tcg_gen_movi_tl(t1, 0x3 << cc);  
5762 - tcg_gen_and_tl(t0, t0, t1);  
5763 - tcg_gen_brcondi_tl(TCG_COND_NE, t0, 0, l1);  
5764 - tcg_gen_movi_tl(t0, 0); 5732 + get_fp_cond(t0);
  5733 + tcg_gen_andi_i32(t0, t0, 0x3 << cc);
  5734 + tcg_gen_brcondi_i32(TCG_COND_NE, t0, 0, l1);
  5735 + tcg_gen_movi_i32(bcond, 0);
5765 tcg_gen_br(l2); 5736 tcg_gen_br(l2);
5766 gen_set_label(l1); 5737 gen_set_label(l1);
5767 - tcg_gen_movi_tl(t0, 1); 5738 + tcg_gen_movi_i32(bcond, 1);
5768 gen_set_label(l2); 5739 gen_set_label(l2);
5769 } 5740 }
5770 opn = "bc1any2t"; 5741 opn = "bc1any2t";
@@ -5773,19 +5744,14 @@ static void gen_compute_branch1 (CPUState *env, DisasContext *ctx, uint32_t op, @@ -5773,19 +5744,14 @@ static void gen_compute_branch1 (CPUState *env, DisasContext *ctx, uint32_t op,
5773 { 5744 {
5774 int l1 = gen_new_label(); 5745 int l1 = gen_new_label();
5775 int l2 = gen_new_label(); 5746 int l2 = gen_new_label();
5776 - TCGv r_tmp1 = tcg_temp_new(TCG_TYPE_I32);  
5777 5747
5778 - get_fp_cond(r_tmp1);  
5779 - tcg_gen_ext_i32_tl(t0, r_tmp1);  
5780 - tcg_temp_free(r_tmp1);  
5781 - tcg_gen_not_tl(t0, t0);  
5782 - tcg_gen_movi_tl(t1, 0xf << cc);  
5783 - tcg_gen_and_tl(t0, t0, t1);  
5784 - tcg_gen_brcondi_tl(TCG_COND_NE, t0, 0, l1);  
5785 - tcg_gen_movi_tl(t0, 0); 5748 + get_fp_cond(t0);
  5749 + tcg_gen_andi_i32(t0, t0, 0xf << cc);
  5750 + tcg_gen_brcondi_i32(TCG_COND_EQ, t0, 0, l1);
  5751 + tcg_gen_movi_i32(bcond, 0);
5786 tcg_gen_br(l2); 5752 tcg_gen_br(l2);
5787 gen_set_label(l1); 5753 gen_set_label(l1);
5788 - tcg_gen_movi_tl(t0, 1); 5754 + tcg_gen_movi_i32(bcond, 1);
5789 gen_set_label(l2); 5755 gen_set_label(l2);
5790 } 5756 }
5791 opn = "bc1any4f"; 5757 opn = "bc1any4f";
@@ -5794,24 +5760,19 @@ static void gen_compute_branch1 (CPUState *env, DisasContext *ctx, uint32_t op, @@ -5794,24 +5760,19 @@ static void gen_compute_branch1 (CPUState *env, DisasContext *ctx, uint32_t op,
5794 { 5760 {
5795 int l1 = gen_new_label(); 5761 int l1 = gen_new_label();
5796 int l2 = gen_new_label(); 5762 int l2 = gen_new_label();
5797 - TCGv r_tmp1 = tcg_temp_new(TCG_TYPE_I32);  
5798 5763
5799 - get_fp_cond(r_tmp1);  
5800 - tcg_gen_ext_i32_tl(t0, r_tmp1);  
5801 - tcg_temp_free(r_tmp1);  
5802 - tcg_gen_movi_tl(t1, 0xf << cc);  
5803 - tcg_gen_and_tl(t0, t0, t1);  
5804 - tcg_gen_brcondi_tl(TCG_COND_NE, t0, 0, l1);  
5805 - tcg_gen_movi_tl(t0, 0); 5764 + get_fp_cond(t0);
  5765 + tcg_gen_andi_i32(t0, t0, 0xf << cc);
  5766 + tcg_gen_brcondi_i32(TCG_COND_NE, t0, 0, l1);
  5767 + tcg_gen_movi_i32(bcond, 0);
5806 tcg_gen_br(l2); 5768 tcg_gen_br(l2);
5807 gen_set_label(l1); 5769 gen_set_label(l1);
5808 - tcg_gen_movi_tl(t0, 1); 5770 + tcg_gen_movi_i32(bcond, 1);
5809 gen_set_label(l2); 5771 gen_set_label(l2);
5810 } 5772 }
5811 opn = "bc1any4t"; 5773 opn = "bc1any4t";
5812 not_likely: 5774 not_likely:
5813 ctx->hflags |= MIPS_HFLAG_BC; 5775 ctx->hflags |= MIPS_HFLAG_BC;
5814 - tcg_gen_trunc_tl_i32(bcond, t0);  
5815 break; 5776 break;
5816 default: 5777 default:
5817 MIPS_INVAL(opn); 5778 MIPS_INVAL(opn);
@@ -5824,7 +5785,6 @@ static void gen_compute_branch1 (CPUState *env, DisasContext *ctx, uint32_t op, @@ -5824,7 +5785,6 @@ static void gen_compute_branch1 (CPUState *env, DisasContext *ctx, uint32_t op,
5824 5785
5825 out: 5786 out:
5826 tcg_temp_free(t0); 5787 tcg_temp_free(t0);
5827 - tcg_temp_free(t1);  
5828 } 5788 }
5829 5789
5830 /* Coprocessor 1 (FPU) */ 5790 /* Coprocessor 1 (FPU) */