Revision 9bf3eb2c target-mips/translate.c
b/target-mips/translate.c | ||
---|---|---|
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 | 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 | 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 | 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 | 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 |
|
Also available in: Unified diff