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,8 +5930,7 @@ static void gen_movci (DisasContext *ctx, int rd, int rs, int cc, int tf)
5930 uint32_t ccbit; 5930 uint32_t ccbit;
5931 TCGCond cond; 5931 TCGCond cond;
5932 TCGv t0 = tcg_temp_local_new(TCG_TYPE_TL); 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 if (cc) 5935 if (cc)
5937 ccbit = 1 << (24 + cc); 5936 ccbit = 1 << (24 + cc);
@@ -5943,14 +5942,9 @@ static void gen_movci (DisasContext *ctx, int rd, int rs, int cc, int tf) @@ -5943,14 +5942,9 @@ static void gen_movci (DisasContext *ctx, int rd, int rs, int cc, int tf)
5943 cond = TCG_COND_NE; 5942 cond = TCG_COND_NE;
5944 5943
5945 gen_load_gpr(t0, rd); 5944 gen_load_gpr(t0, rd);
5946 - gen_load_gpr(t1, rs);  
5947 tcg_gen_andi_i32(r_tmp, fpu_fcr31, ccbit); 5945 tcg_gen_andi_i32(r_tmp, fpu_fcr31, ccbit);
5948 tcg_gen_brcondi_i32(cond, r_tmp, 0, l1); 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 gen_set_label(l1); 5948 gen_set_label(l1);
5955 gen_store_gpr(t0, rd); 5949 gen_store_gpr(t0, rd);
5956 tcg_temp_free(t0); 5950 tcg_temp_free(t0);
@@ -5960,9 +5954,8 @@ static inline void gen_movcf_s (int fs, int fd, int cc, int tf) @@ -5960,9 +5954,8 @@ static inline void gen_movcf_s (int fs, int fd, int cc, int tf)
5960 { 5954 {
5961 uint32_t ccbit; 5955 uint32_t ccbit;
5962 int cond; 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 TCGv fp0 = tcg_temp_local_new(TCG_TYPE_I32); 5958 TCGv fp0 = tcg_temp_local_new(TCG_TYPE_I32);
5965 - TCGv fp1 = tcg_temp_local_new(TCG_TYPE_I32);  
5966 int l1 = gen_new_label(); 5959 int l1 = gen_new_label();
5967 5960
5968 if (cc) 5961 if (cc)
@@ -5975,25 +5968,21 @@ static inline void gen_movcf_s (int fs, int fd, int cc, int tf) @@ -5975,25 +5968,21 @@ static inline void gen_movcf_s (int fs, int fd, int cc, int tf)
5975 else 5968 else
5976 cond = TCG_COND_NE; 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 tcg_gen_andi_i32(r_tmp1, fpu_fcr31, ccbit); 5972 tcg_gen_andi_i32(r_tmp1, fpu_fcr31, ccbit);
5981 tcg_gen_brcondi_i32(cond, r_tmp1, 0, l1); 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 gen_set_label(l1); 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 static inline void gen_movcf_d (DisasContext *ctx, int fs, int fd, int cc, int tf) 5980 static inline void gen_movcf_d (DisasContext *ctx, int fs, int fd, int cc, int tf)
5991 { 5981 {
5992 uint32_t ccbit; 5982 uint32_t ccbit;
5993 int cond; 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 TCGv fp0 = tcg_temp_local_new(TCG_TYPE_I64); 5985 TCGv fp0 = tcg_temp_local_new(TCG_TYPE_I64);
5996 - TCGv fp1 = tcg_temp_local_new(TCG_TYPE_I64);  
5997 int l1 = gen_new_label(); 5986 int l1 = gen_new_label();
5998 5987
5999 if (cc) 5988 if (cc)
@@ -6006,57 +5995,53 @@ static inline void gen_movcf_d (DisasContext *ctx, int fs, int fd, int cc, int t @@ -6006,57 +5995,53 @@ static inline void gen_movcf_d (DisasContext *ctx, int fs, int fd, int cc, int t
6006 else 5995 else
6007 cond = TCG_COND_NE; 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 tcg_gen_andi_i32(r_tmp1, fpu_fcr31, ccbit); 5999 tcg_gen_andi_i32(r_tmp1, fpu_fcr31, ccbit);
6012 tcg_gen_brcondi_i32(cond, r_tmp1, 0, l1); 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 gen_set_label(l1); 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 static inline void gen_movcf_ps (int fs, int fd, int cc, int tf) 6007 static inline void gen_movcf_ps (int fs, int fd, int cc, int tf)
6022 { 6008 {
  6009 + uint32_t ccbit1, ccbit2;
6023 int cond; 6010 int cond;
6024 TCGv r_tmp1 = tcg_temp_local_new(TCG_TYPE_I32); 6011 TCGv r_tmp1 = tcg_temp_local_new(TCG_TYPE_I32);
6025 - TCGv r_tmp2 = tcg_temp_local_new(TCG_TYPE_I32);  
6026 TCGv fp0 = tcg_temp_local_new(TCG_TYPE_I32); 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 int l1 = gen_new_label(); 6013 int l1 = gen_new_label();
6031 int l2 = gen_new_label(); 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 if (tf) 6024 if (tf)
6034 cond = TCG_COND_EQ; 6025 cond = TCG_COND_EQ;
6035 else 6026 else
6036 cond = TCG_COND_NE; 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 gen_load_fpr32(fp0, fs); 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 gen_set_label(l1); 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 gen_set_label(l2); 6040 gen_set_label(l2);
  6041 + gen_store_fpr32h(fp0, fd);
  6042 +
6054 tcg_temp_free(r_tmp1); 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