Commit cbc37b28b3d0803a7ed73801c2969ed35e70e2e4
1 parent
af58f9ca
target-mips: optimize gen_movcf_*()
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6957 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
23 additions
and
51 deletions
target-mips/translate.c
| @@ -5722,98 +5722,70 @@ static void gen_movci (DisasContext *ctx, int rd, int rs, int cc, int tf) | @@ -5722,98 +5722,70 @@ static void gen_movci (DisasContext *ctx, int rd, int rs, int cc, int tf) | ||
| 5722 | 5722 | ||
| 5723 | static inline void gen_movcf_s (int fs, int fd, int cc, int tf) | 5723 | static inline void gen_movcf_s (int fs, int fd, int cc, int tf) |
| 5724 | { | 5724 | { |
| 5725 | - uint32_t ccbit; | ||
| 5726 | int cond; | 5725 | int cond; |
| 5727 | - TCGv_i32 r_tmp1 = tcg_temp_new_i32(); | ||
| 5728 | - TCGv_i32 fp0 = tcg_temp_local_new_i32(); | 5726 | + TCGv_i32 t0 = tcg_temp_new_i32(); |
| 5729 | int l1 = gen_new_label(); | 5727 | int l1 = gen_new_label(); |
| 5730 | 5728 | ||
| 5731 | - if (cc) | ||
| 5732 | - ccbit = 1 << (24 + cc); | ||
| 5733 | - else | ||
| 5734 | - ccbit = 1 << 23; | ||
| 5735 | - | ||
| 5736 | if (tf) | 5729 | if (tf) |
| 5737 | cond = TCG_COND_EQ; | 5730 | cond = TCG_COND_EQ; |
| 5738 | else | 5731 | else |
| 5739 | cond = TCG_COND_NE; | 5732 | cond = TCG_COND_NE; |
| 5740 | 5733 | ||
| 5741 | - gen_load_fpr32(fp0, fd); | ||
| 5742 | - tcg_gen_andi_i32(r_tmp1, fpu_fcr31, ccbit); | ||
| 5743 | - tcg_gen_brcondi_i32(cond, r_tmp1, 0, l1); | ||
| 5744 | - tcg_temp_free_i32(r_tmp1); | ||
| 5745 | - gen_load_fpr32(fp0, fs); | 5734 | + tcg_gen_andi_i32(t0, fpu_fcr31, get_fp_bit(cc)); |
| 5735 | + tcg_gen_brcondi_i32(cond, t0, 0, l1); | ||
| 5736 | + gen_load_fpr32(t0, fs); | ||
| 5737 | + gen_store_fpr32(t0, fd); | ||
| 5746 | gen_set_label(l1); | 5738 | gen_set_label(l1); |
| 5747 | - gen_store_fpr32(fp0, fd); | ||
| 5748 | - tcg_temp_free_i32(fp0); | 5739 | + tcg_temp_free_i32(t0); |
| 5749 | } | 5740 | } |
| 5750 | 5741 | ||
| 5751 | static inline void gen_movcf_d (DisasContext *ctx, int fs, int fd, int cc, int tf) | 5742 | static inline void gen_movcf_d (DisasContext *ctx, int fs, int fd, int cc, int tf) |
| 5752 | { | 5743 | { |
| 5753 | - uint32_t ccbit; | ||
| 5754 | int cond; | 5744 | int cond; |
| 5755 | - TCGv_i32 r_tmp1 = tcg_temp_new_i32(); | ||
| 5756 | - TCGv_i64 fp0 = tcg_temp_local_new_i64(); | 5745 | + TCGv_i32 t0 = tcg_temp_new_i32(); |
| 5746 | + TCGv_i64 fp0; | ||
| 5757 | int l1 = gen_new_label(); | 5747 | int l1 = gen_new_label(); |
| 5758 | 5748 | ||
| 5759 | - if (cc) | ||
| 5760 | - ccbit = 1 << (24 + cc); | ||
| 5761 | - else | ||
| 5762 | - ccbit = 1 << 23; | ||
| 5763 | - | ||
| 5764 | if (tf) | 5749 | if (tf) |
| 5765 | cond = TCG_COND_EQ; | 5750 | cond = TCG_COND_EQ; |
| 5766 | else | 5751 | else |
| 5767 | cond = TCG_COND_NE; | 5752 | cond = TCG_COND_NE; |
| 5768 | 5753 | ||
| 5769 | - gen_load_fpr64(ctx, fp0, fd); | ||
| 5770 | - tcg_gen_andi_i32(r_tmp1, fpu_fcr31, ccbit); | ||
| 5771 | - tcg_gen_brcondi_i32(cond, r_tmp1, 0, l1); | ||
| 5772 | - tcg_temp_free_i32(r_tmp1); | 5754 | + tcg_gen_andi_i32(t0, fpu_fcr31, get_fp_bit(cc)); |
| 5755 | + tcg_gen_brcondi_i32(cond, t0, 0, l1); | ||
| 5756 | + fp0 = tcg_temp_local_new_i64(); | ||
| 5773 | gen_load_fpr64(ctx, fp0, fs); | 5757 | gen_load_fpr64(ctx, fp0, fs); |
| 5774 | - gen_set_label(l1); | ||
| 5775 | gen_store_fpr64(ctx, fp0, fd); | 5758 | gen_store_fpr64(ctx, fp0, fd); |
| 5776 | tcg_temp_free_i64(fp0); | 5759 | tcg_temp_free_i64(fp0); |
| 5760 | + gen_set_label(l1); | ||
| 5761 | + tcg_temp_free_i32(t0); | ||
| 5777 | } | 5762 | } |
| 5778 | 5763 | ||
| 5779 | static inline void gen_movcf_ps (int fs, int fd, int cc, int tf) | 5764 | static inline void gen_movcf_ps (int fs, int fd, int cc, int tf) |
| 5780 | { | 5765 | { |
| 5781 | - uint32_t ccbit1, ccbit2; | ||
| 5782 | int cond; | 5766 | int cond; |
| 5783 | - TCGv_i32 r_tmp1 = tcg_temp_new_i32(); | ||
| 5784 | - TCGv_i32 fp0 = tcg_temp_local_new_i32(); | 5767 | + TCGv_i32 t0 = tcg_temp_new_i32(); |
| 5785 | int l1 = gen_new_label(); | 5768 | int l1 = gen_new_label(); |
| 5786 | int l2 = gen_new_label(); | 5769 | int l2 = gen_new_label(); |
| 5787 | 5770 | ||
| 5788 | - if (cc) { | ||
| 5789 | - ccbit1 = 1 << (24 + cc); | ||
| 5790 | - ccbit2 = 1 << (25 + cc); | ||
| 5791 | - } else { | ||
| 5792 | - ccbit1 = 1 << 23; | ||
| 5793 | - ccbit2 = 1 << 25; | ||
| 5794 | - } | ||
| 5795 | - | ||
| 5796 | if (tf) | 5771 | if (tf) |
| 5797 | cond = TCG_COND_EQ; | 5772 | cond = TCG_COND_EQ; |
| 5798 | else | 5773 | else |
| 5799 | cond = TCG_COND_NE; | 5774 | cond = TCG_COND_NE; |
| 5800 | 5775 | ||
| 5801 | - gen_load_fpr32(fp0, fd); | ||
| 5802 | - tcg_gen_andi_i32(r_tmp1, fpu_fcr31, ccbit1); | ||
| 5803 | - tcg_gen_brcondi_i32(cond, r_tmp1, 0, l1); | ||
| 5804 | - gen_load_fpr32(fp0, fs); | 5776 | + tcg_gen_andi_i32(t0, fpu_fcr31, get_fp_bit(cc)); |
| 5777 | + tcg_gen_brcondi_i32(cond, t0, 0, l1); | ||
| 5778 | + gen_load_fpr32(t0, fs); | ||
| 5779 | + gen_store_fpr32(t0, fd); | ||
| 5805 | gen_set_label(l1); | 5780 | gen_set_label(l1); |
| 5806 | - gen_store_fpr32(fp0, fd); | ||
| 5807 | 5781 | ||
| 5808 | - gen_load_fpr32h(fp0, fd); | ||
| 5809 | - tcg_gen_andi_i32(r_tmp1, fpu_fcr31, ccbit2); | ||
| 5810 | - tcg_gen_brcondi_i32(cond, r_tmp1, 0, l2); | ||
| 5811 | - gen_load_fpr32h(fp0, fs); | 5782 | + tcg_gen_andi_i32(t0, fpu_fcr31, get_fp_bit(cc+1)); |
| 5783 | + tcg_gen_brcondi_i32(cond, t0, 0, l2); | ||
| 5784 | + gen_load_fpr32h(t0, fs); | ||
| 5785 | + gen_store_fpr32h(t0, fd); | ||
| 5812 | gen_set_label(l2); | 5786 | gen_set_label(l2); |
| 5813 | - gen_store_fpr32h(fp0, fd); | ||
| 5814 | 5787 | ||
| 5815 | - tcg_temp_free_i32(r_tmp1); | ||
| 5816 | - tcg_temp_free_i32(fp0); | 5788 | + tcg_temp_free_i32(t0); |
| 5817 | } | 5789 | } |
| 5818 | 5790 | ||
| 5819 | 5791 |