Commit 9bf3eb2ca542dd9306cb2e72fc68e02ba3e56e2e

Authored by aurel32
1 parent 2a0ab998

target-mips: optimize movc*()

Optimize code generation in gen_movc*():
- Temp variables are valid up to and *including* the brcond instruction.
  Use them instead of temp local variables.
- Avoid using temporary variables to transfer values.
- Access fpu_fcr31 directly in gen_movcf_ps().

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

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5683 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 33 additions and 48 deletions
target-mips/translate.c
... ... @@ -5930,8 +5930,7 @@ static void gen_movci (DisasContext *ctx, int rd, int rs, int cc, int tf)
5930 5930 uint32_t ccbit;
5931 5931 TCGCond cond;
5932 5932 TCGv t0 = tcg_temp_local_new(TCG_TYPE_TL);
5933   - TCGv t1 = tcg_temp_local_new(TCG_TYPE_TL);
5934   - TCGv r_tmp = tcg_temp_local_new(TCG_TYPE_I32);
  5933 + TCGv r_tmp = tcg_temp_new(TCG_TYPE_I32);
5935 5934  
5936 5935 if (cc)
5937 5936 ccbit = 1 << (24 + cc);
... ... @@ -5943,14 +5942,9 @@ static void gen_movci (DisasContext *ctx, int rd, int rs, int cc, int tf)
5943 5942 cond = TCG_COND_NE;
5944 5943  
5945 5944 gen_load_gpr(t0, rd);
5946   - gen_load_gpr(t1, rs);
5947 5945 tcg_gen_andi_i32(r_tmp, fpu_fcr31, ccbit);
5948 5946 tcg_gen_brcondi_i32(cond, r_tmp, 0, l1);
5949   - tcg_temp_free(r_tmp);
5950   -
5951   - tcg_gen_mov_tl(t0, t1);
5952   - tcg_temp_free(t1);
5953   -
  5947 + gen_load_gpr(t0, rs);
5954 5948 gen_set_label(l1);
5955 5949 gen_store_gpr(t0, rd);
5956 5950 tcg_temp_free(t0);
... ... @@ -5960,9 +5954,8 @@ static inline void gen_movcf_s (int fs, int fd, int cc, int tf)
5960 5954 {
5961 5955 uint32_t ccbit;
5962 5956 int cond;
5963   - TCGv r_tmp1 = tcg_temp_local_new(TCG_TYPE_I32);
  5957 + TCGv r_tmp1 = tcg_temp_new(TCG_TYPE_I32);
5964 5958 TCGv fp0 = tcg_temp_local_new(TCG_TYPE_I32);
5965   - TCGv fp1 = tcg_temp_local_new(TCG_TYPE_I32);
5966 5959 int l1 = gen_new_label();
5967 5960  
5968 5961 if (cc)
... ... @@ -5975,25 +5968,21 @@ static inline void gen_movcf_s (int fs, int fd, int cc, int tf)
5975 5968 else
5976 5969 cond = TCG_COND_NE;
5977 5970  
5978   - gen_load_fpr32(fp0, fs);
5979   - gen_load_fpr32(fp1, fd);
  5971 + gen_load_fpr32(fp0, fd);
5980 5972 tcg_gen_andi_i32(r_tmp1, fpu_fcr31, ccbit);
5981 5973 tcg_gen_brcondi_i32(cond, r_tmp1, 0, l1);
5982   - tcg_gen_mov_i32(fp1, fp0);
5983   - tcg_temp_free(fp0);
  5974 + gen_load_fpr32(fp0, fs);
5984 5975 gen_set_label(l1);
5985   - tcg_temp_free(r_tmp1);
5986   - gen_store_fpr32(fp1, fd);
5987   - tcg_temp_free(fp1);
  5976 + gen_store_fpr32(fp0, fd);
  5977 + tcg_temp_free(fp0);
5988 5978 }
5989 5979  
5990 5980 static inline void gen_movcf_d (DisasContext *ctx, int fs, int fd, int cc, int tf)
5991 5981 {
5992 5982 uint32_t ccbit;
5993 5983 int cond;
5994   - TCGv r_tmp1 = tcg_temp_local_new(TCG_TYPE_I32);
  5984 + TCGv r_tmp1 = tcg_temp_new(TCG_TYPE_I32);
5995 5985 TCGv fp0 = tcg_temp_local_new(TCG_TYPE_I64);
5996   - TCGv fp1 = tcg_temp_local_new(TCG_TYPE_I64);
5997 5986 int l1 = gen_new_label();
5998 5987  
5999 5988 if (cc)
... ... @@ -6006,57 +5995,53 @@ static inline void gen_movcf_d (DisasContext *ctx, int fs, int fd, int cc, int t
6006 5995 else
6007 5996 cond = TCG_COND_NE;
6008 5997  
6009   - gen_load_fpr64(ctx, fp0, fs);
6010   - gen_load_fpr64(ctx, fp1, fd);
  5998 + gen_load_fpr64(ctx, fp0, fd);
6011 5999 tcg_gen_andi_i32(r_tmp1, fpu_fcr31, ccbit);
6012 6000 tcg_gen_brcondi_i32(cond, r_tmp1, 0, l1);
6013   - tcg_gen_mov_i64(fp1, fp0);
6014   - tcg_temp_free(fp0);
  6001 + gen_load_fpr64(ctx, fp0, fs);
6015 6002 gen_set_label(l1);
6016   - tcg_temp_free(r_tmp1);
6017   - gen_store_fpr64(ctx, fp1, fd);
6018   - tcg_temp_free(fp1);
  6003 + gen_store_fpr64(ctx, fp0, fd);
  6004 + tcg_temp_free(fp0);
6019 6005 }
6020 6006  
6021 6007 static inline void gen_movcf_ps (int fs, int fd, int cc, int tf)
6022 6008 {
  6009 + uint32_t ccbit1, ccbit2;
6023 6010 int cond;
6024 6011 TCGv r_tmp1 = tcg_temp_local_new(TCG_TYPE_I32);
6025   - TCGv r_tmp2 = tcg_temp_local_new(TCG_TYPE_I32);
6026 6012 TCGv fp0 = tcg_temp_local_new(TCG_TYPE_I32);
6027   - TCGv fph0 = tcg_temp_local_new(TCG_TYPE_I32);
6028   - TCGv fp1 = tcg_temp_local_new(TCG_TYPE_I32);
6029   - TCGv fph1 = tcg_temp_local_new(TCG_TYPE_I32);
6030 6013 int l1 = gen_new_label();
6031 6014 int l2 = gen_new_label();
6032 6015  
  6016 + if (cc) {
  6017 + ccbit1 = 1 << (24 + cc);
  6018 + ccbit2 = 1 << (25 + cc);
  6019 + } else {
  6020 + ccbit1 = 1 << 23;
  6021 + ccbit2 = 1 << 25;
  6022 + }
  6023 +
6033 6024 if (tf)
6034 6025 cond = TCG_COND_EQ;
6035 6026 else
6036 6027 cond = TCG_COND_NE;
6037 6028  
  6029 + gen_load_fpr32(fp0, fd);
  6030 + tcg_gen_andi_i32(r_tmp1, fpu_fcr31, ccbit1);
  6031 + tcg_gen_brcondi_i32(cond, r_tmp1, 0, l1);
6038 6032 gen_load_fpr32(fp0, fs);
6039   - gen_load_fpr32h(fph0, fs);
6040   - gen_load_fpr32(fp1, fd);
6041   - gen_load_fpr32h(fph1, fd);
6042   - get_fp_cond(r_tmp1);
6043   - tcg_gen_shri_i32(r_tmp1, r_tmp1, cc);
6044   - tcg_gen_andi_i32(r_tmp2, r_tmp1, 0x1);
6045   - tcg_gen_brcondi_i32(cond, r_tmp2, 0, l1);
6046   - tcg_gen_mov_i32(fp1, fp0);
6047   - tcg_temp_free(fp0);
6048 6033 gen_set_label(l1);
6049   - tcg_gen_andi_i32(r_tmp2, r_tmp1, 0x2);
6050   - tcg_gen_brcondi_i32(cond, r_tmp2, 0, l2);
6051   - tcg_gen_mov_i32(fph1, fph0);
6052   - tcg_temp_free(fph0);
  6034 + gen_store_fpr32(fp0, fd);
  6035 +
  6036 + gen_load_fpr32h(fp0, fd);
  6037 + tcg_gen_andi_i32(r_tmp1, fpu_fcr31, ccbit2);
  6038 + tcg_gen_brcondi_i32(cond, r_tmp1, 0, l2);
  6039 + gen_load_fpr32h(fp0, fs);
6053 6040 gen_set_label(l2);
  6041 + gen_store_fpr32h(fp0, fd);
  6042 +
6054 6043 tcg_temp_free(r_tmp1);
6055   - tcg_temp_free(r_tmp2);
6056   - gen_store_fpr32(fp1, fd);
6057   - gen_store_fpr32h(fph1, fd);
6058   - tcg_temp_free(fp1);
6059   - tcg_temp_free(fph1);
  6044 + tcg_temp_free(fp0);
6060 6045 }
6061 6046  
6062 6047  
... ...