Commit c5631f487d5d3e328ca537be169d47d33e0fdf81
1 parent
7dcfb089
CRIS: Avoid using cpu_T[0] for testing condition codes.
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@gmail.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5547 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
41 additions
and
44 deletions
target-cris/translate.c
| ... | ... | @@ -973,7 +973,7 @@ static int arith_cc(DisasContext *dc) |
| 973 | 973 | return 0; |
| 974 | 974 | } |
| 975 | 975 | |
| 976 | -static void gen_tst_cc (DisasContext *dc, int cond) | |
| 976 | +static void gen_tst_cc (DisasContext *dc, TCGv cc, int cond) | |
| 977 | 977 | { |
| 978 | 978 | int arith_opt, move_opt; |
| 979 | 979 | |
| ... | ... | @@ -996,46 +996,46 @@ static void gen_tst_cc (DisasContext *dc, int cond) |
| 996 | 996 | non-zero otherwise T0 should be zero. */ |
| 997 | 997 | int l1; |
| 998 | 998 | l1 = gen_new_label(); |
| 999 | - tcg_gen_movi_tl(cpu_T[0], 0); | |
| 999 | + tcg_gen_movi_tl(cc, 0); | |
| 1000 | 1000 | tcg_gen_brcondi_tl(TCG_COND_NE, cc_result, |
| 1001 | 1001 | 0, l1); |
| 1002 | - tcg_gen_movi_tl(cpu_T[0], 1); | |
| 1002 | + tcg_gen_movi_tl(cc, 1); | |
| 1003 | 1003 | gen_set_label(l1); |
| 1004 | 1004 | } |
| 1005 | 1005 | else { |
| 1006 | 1006 | cris_evaluate_flags(dc); |
| 1007 | - tcg_gen_andi_tl(cpu_T[0], | |
| 1007 | + tcg_gen_andi_tl(cc, | |
| 1008 | 1008 | cpu_PR[PR_CCS], Z_FLAG); |
| 1009 | 1009 | } |
| 1010 | 1010 | break; |
| 1011 | 1011 | case CC_NE: |
| 1012 | 1012 | if (arith_opt || move_opt) |
| 1013 | - tcg_gen_mov_tl(cpu_T[0], cc_result); | |
| 1013 | + tcg_gen_mov_tl(cc, cc_result); | |
| 1014 | 1014 | else { |
| 1015 | 1015 | cris_evaluate_flags(dc); |
| 1016 | - tcg_gen_xori_tl(cpu_T[0], cpu_PR[PR_CCS], | |
| 1016 | + tcg_gen_xori_tl(cc, cpu_PR[PR_CCS], | |
| 1017 | 1017 | Z_FLAG); |
| 1018 | - tcg_gen_andi_tl(cpu_T[0], cpu_T[0], Z_FLAG); | |
| 1018 | + tcg_gen_andi_tl(cc, cc, Z_FLAG); | |
| 1019 | 1019 | } |
| 1020 | 1020 | break; |
| 1021 | 1021 | case CC_CS: |
| 1022 | 1022 | cris_evaluate_flags(dc); |
| 1023 | - tcg_gen_andi_tl(cpu_T[0], cpu_PR[PR_CCS], C_FLAG); | |
| 1023 | + tcg_gen_andi_tl(cc, cpu_PR[PR_CCS], C_FLAG); | |
| 1024 | 1024 | break; |
| 1025 | 1025 | case CC_CC: |
| 1026 | 1026 | cris_evaluate_flags(dc); |
| 1027 | - tcg_gen_xori_tl(cpu_T[0], cpu_PR[PR_CCS], C_FLAG); | |
| 1028 | - tcg_gen_andi_tl(cpu_T[0], cpu_T[0], C_FLAG); | |
| 1027 | + tcg_gen_xori_tl(cc, cpu_PR[PR_CCS], C_FLAG); | |
| 1028 | + tcg_gen_andi_tl(cc, cc, C_FLAG); | |
| 1029 | 1029 | break; |
| 1030 | 1030 | case CC_VS: |
| 1031 | 1031 | cris_evaluate_flags(dc); |
| 1032 | - tcg_gen_andi_tl(cpu_T[0], cpu_PR[PR_CCS], V_FLAG); | |
| 1032 | + tcg_gen_andi_tl(cc, cpu_PR[PR_CCS], V_FLAG); | |
| 1033 | 1033 | break; |
| 1034 | 1034 | case CC_VC: |
| 1035 | 1035 | cris_evaluate_flags(dc); |
| 1036 | - tcg_gen_xori_tl(cpu_T[0], cpu_PR[PR_CCS], | |
| 1036 | + tcg_gen_xori_tl(cc, cpu_PR[PR_CCS], | |
| 1037 | 1037 | V_FLAG); |
| 1038 | - tcg_gen_andi_tl(cpu_T[0], cpu_T[0], V_FLAG); | |
| 1038 | + tcg_gen_andi_tl(cc, cc, V_FLAG); | |
| 1039 | 1039 | break; |
| 1040 | 1040 | case CC_PL: |
| 1041 | 1041 | if (arith_opt || move_opt) { |
| ... | ... | @@ -1046,13 +1046,13 @@ static void gen_tst_cc (DisasContext *dc, int cond) |
| 1046 | 1046 | else if (dc->cc_size == 2) |
| 1047 | 1047 | bits = 15; |
| 1048 | 1048 | |
| 1049 | - tcg_gen_shri_tl(cpu_T[0], cc_result, bits); | |
| 1050 | - tcg_gen_xori_tl(cpu_T[0], cpu_T[0], 1); | |
| 1049 | + tcg_gen_shri_tl(cc, cc_result, bits); | |
| 1050 | + tcg_gen_xori_tl(cc, cc, 1); | |
| 1051 | 1051 | } else { |
| 1052 | 1052 | cris_evaluate_flags(dc); |
| 1053 | - tcg_gen_xori_tl(cpu_T[0], cpu_PR[PR_CCS], | |
| 1053 | + tcg_gen_xori_tl(cc, cpu_PR[PR_CCS], | |
| 1054 | 1054 | N_FLAG); |
| 1055 | - tcg_gen_andi_tl(cpu_T[0], cpu_T[0], N_FLAG); | |
| 1055 | + tcg_gen_andi_tl(cc, cc, N_FLAG); | |
| 1056 | 1056 | } |
| 1057 | 1057 | break; |
| 1058 | 1058 | case CC_MI: |
| ... | ... | @@ -1064,17 +1064,17 @@ static void gen_tst_cc (DisasContext *dc, int cond) |
| 1064 | 1064 | else if (dc->cc_size == 2) |
| 1065 | 1065 | bits = 15; |
| 1066 | 1066 | |
| 1067 | - tcg_gen_shri_tl(cpu_T[0], cc_result, 31); | |
| 1067 | + tcg_gen_shri_tl(cc, cc_result, 31); | |
| 1068 | 1068 | } |
| 1069 | 1069 | else { |
| 1070 | 1070 | cris_evaluate_flags(dc); |
| 1071 | - tcg_gen_andi_tl(cpu_T[0], cpu_PR[PR_CCS], | |
| 1071 | + tcg_gen_andi_tl(cc, cpu_PR[PR_CCS], | |
| 1072 | 1072 | N_FLAG); |
| 1073 | 1073 | } |
| 1074 | 1074 | break; |
| 1075 | 1075 | case CC_LS: |
| 1076 | 1076 | cris_evaluate_flags(dc); |
| 1077 | - tcg_gen_andi_tl(cpu_T[0], cpu_PR[PR_CCS], | |
| 1077 | + tcg_gen_andi_tl(cc, cpu_PR[PR_CCS], | |
| 1078 | 1078 | C_FLAG | Z_FLAG); |
| 1079 | 1079 | break; |
| 1080 | 1080 | case CC_HI: |
| ... | ... | @@ -1086,9 +1086,9 @@ static void gen_tst_cc (DisasContext *dc, int cond) |
| 1086 | 1086 | tcg_gen_xori_tl(tmp, cpu_PR[PR_CCS], |
| 1087 | 1087 | C_FLAG | Z_FLAG); |
| 1088 | 1088 | /* Overlay the C flag on top of the Z. */ |
| 1089 | - tcg_gen_shli_tl(cpu_T[0], tmp, 2); | |
| 1090 | - tcg_gen_and_tl(cpu_T[0], tmp, cpu_T[0]); | |
| 1091 | - tcg_gen_andi_tl(cpu_T[0], cpu_T[0], Z_FLAG); | |
| 1089 | + tcg_gen_shli_tl(cc, tmp, 2); | |
| 1090 | + tcg_gen_and_tl(cc, tmp, cc); | |
| 1091 | + tcg_gen_andi_tl(cc, cc, Z_FLAG); | |
| 1092 | 1092 | |
| 1093 | 1093 | tcg_temp_free(tmp); |
| 1094 | 1094 | } |
| ... | ... | @@ -1096,19 +1096,19 @@ static void gen_tst_cc (DisasContext *dc, int cond) |
| 1096 | 1096 | case CC_GE: |
| 1097 | 1097 | cris_evaluate_flags(dc); |
| 1098 | 1098 | /* Overlay the V flag on top of the N. */ |
| 1099 | - tcg_gen_shli_tl(cpu_T[0], cpu_PR[PR_CCS], 2); | |
| 1100 | - tcg_gen_xor_tl(cpu_T[0], | |
| 1101 | - cpu_PR[PR_CCS], cpu_T[0]); | |
| 1102 | - tcg_gen_andi_tl(cpu_T[0], cpu_T[0], N_FLAG); | |
| 1103 | - tcg_gen_xori_tl(cpu_T[0], cpu_T[0], N_FLAG); | |
| 1099 | + tcg_gen_shli_tl(cc, cpu_PR[PR_CCS], 2); | |
| 1100 | + tcg_gen_xor_tl(cc, | |
| 1101 | + cpu_PR[PR_CCS], cc); | |
| 1102 | + tcg_gen_andi_tl(cc, cc, N_FLAG); | |
| 1103 | + tcg_gen_xori_tl(cc, cc, N_FLAG); | |
| 1104 | 1104 | break; |
| 1105 | 1105 | case CC_LT: |
| 1106 | 1106 | cris_evaluate_flags(dc); |
| 1107 | 1107 | /* Overlay the V flag on top of the N. */ |
| 1108 | - tcg_gen_shli_tl(cpu_T[0], cpu_PR[PR_CCS], 2); | |
| 1109 | - tcg_gen_xor_tl(cpu_T[0], | |
| 1110 | - cpu_PR[PR_CCS], cpu_T[0]); | |
| 1111 | - tcg_gen_andi_tl(cpu_T[0], cpu_T[0], N_FLAG); | |
| 1108 | + tcg_gen_shli_tl(cc, cpu_PR[PR_CCS], 2); | |
| 1109 | + tcg_gen_xor_tl(cc, | |
| 1110 | + cpu_PR[PR_CCS], cc); | |
| 1111 | + tcg_gen_andi_tl(cc, cc, N_FLAG); | |
| 1112 | 1112 | break; |
| 1113 | 1113 | case CC_GT: |
| 1114 | 1114 | cris_evaluate_flags(dc); |
| ... | ... | @@ -1127,8 +1127,8 @@ static void gen_tst_cc (DisasContext *dc, int cond) |
| 1127 | 1127 | |
| 1128 | 1128 | tcg_gen_xor_tl(n, n, cpu_PR[PR_CCS]); |
| 1129 | 1129 | tcg_gen_xori_tl(n, n, 2); |
| 1130 | - tcg_gen_and_tl(cpu_T[0], z, n); | |
| 1131 | - tcg_gen_andi_tl(cpu_T[0], cpu_T[0], 2); | |
| 1130 | + tcg_gen_and_tl(cc, z, n); | |
| 1131 | + tcg_gen_andi_tl(cc, cc, 2); | |
| 1132 | 1132 | |
| 1133 | 1133 | tcg_temp_free(n); |
| 1134 | 1134 | tcg_temp_free(z); |
| ... | ... | @@ -1148,8 +1148,8 @@ static void gen_tst_cc (DisasContext *dc, int cond) |
| 1148 | 1148 | tcg_gen_shri_tl(z, cpu_PR[PR_CCS], 1); |
| 1149 | 1149 | |
| 1150 | 1150 | tcg_gen_xor_tl(n, n, cpu_PR[PR_CCS]); |
| 1151 | - tcg_gen_or_tl(cpu_T[0], z, n); | |
| 1152 | - tcg_gen_andi_tl(cpu_T[0], cpu_T[0], 2); | |
| 1151 | + tcg_gen_or_tl(cc, z, n); | |
| 1152 | + tcg_gen_andi_tl(cc, cc, 2); | |
| 1153 | 1153 | |
| 1154 | 1154 | tcg_temp_free(n); |
| 1155 | 1155 | tcg_temp_free(z); |
| ... | ... | @@ -1157,10 +1157,10 @@ static void gen_tst_cc (DisasContext *dc, int cond) |
| 1157 | 1157 | break; |
| 1158 | 1158 | case CC_P: |
| 1159 | 1159 | cris_evaluate_flags(dc); |
| 1160 | - tcg_gen_andi_tl(cpu_T[0], cpu_PR[PR_CCS], P_FLAG); | |
| 1160 | + tcg_gen_andi_tl(cc, cpu_PR[PR_CCS], P_FLAG); | |
| 1161 | 1161 | break; |
| 1162 | 1162 | case CC_A: |
| 1163 | - tcg_gen_movi_tl(cpu_T[0], 1); | |
| 1163 | + tcg_gen_movi_tl(cc, 1); | |
| 1164 | 1164 | break; |
| 1165 | 1165 | default: |
| 1166 | 1166 | BUG(); |
| ... | ... | @@ -1188,8 +1188,7 @@ static void cris_prepare_cc_branch (DisasContext *dc, |
| 1188 | 1188 | if (cond != CC_A) |
| 1189 | 1189 | { |
| 1190 | 1190 | dc->jmp = JMP_INDIRECT; |
| 1191 | - gen_tst_cc (dc, cond); | |
| 1192 | - tcg_gen_mov_tl(env_btaken, cpu_T[0]); | |
| 1191 | + gen_tst_cc (dc, env_btaken, cond); | |
| 1193 | 1192 | tcg_gen_movi_tl(env_btarget, dc->jmp_pc); |
| 1194 | 1193 | } else { |
| 1195 | 1194 | /* Allow chaining. */ |
| ... | ... | @@ -1623,11 +1622,9 @@ static unsigned int dec_scc_r(DisasContext *dc) |
| 1623 | 1622 | { |
| 1624 | 1623 | int l1; |
| 1625 | 1624 | |
| 1626 | - gen_tst_cc (dc, cond); | |
| 1627 | - | |
| 1625 | + gen_tst_cc (dc, cpu_R[dc->op1], cond); | |
| 1628 | 1626 | l1 = gen_new_label(); |
| 1629 | - tcg_gen_movi_tl(cpu_R[dc->op1], 0); | |
| 1630 | - tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_T[0], 0, l1); | |
| 1627 | + tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_R[dc->op1], 0, l1); | |
| 1631 | 1628 | tcg_gen_movi_tl(cpu_R[dc->op1], 1); |
| 1632 | 1629 | gen_set_label(l1); |
| 1633 | 1630 | } | ... | ... |