Commit 000a2d866a65d7aca6ee2b0214306c14507eb207
1 parent
e924bbec
Do not try handle "special" arguments of and/or/xor/shl/shr, upper level does it
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4961 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
76 additions
and
128 deletions
tcg/ppc/tcg-target.c
... | ... | @@ -1113,22 +1113,14 @@ static void tcg_out_op(TCGContext *s, int opc, const TCGArg *args, |
1113 | 1113 | |
1114 | 1114 | case INDEX_op_and_i32: |
1115 | 1115 | if (const_args[2]) { |
1116 | - if (!args[2]) | |
1117 | - tcg_out_movi (s, TCG_TYPE_I32, args[0], 0); | |
1116 | + if ((args[2] & 0xffff) == args[2]) | |
1117 | + tcg_out32 (s, ANDI | RS (args[1]) | RA (args[0]) | args[2]); | |
1118 | + else if ((args[2] & 0xffff0000) == args[2]) | |
1119 | + tcg_out32 (s, ANDIS | RS (args[1]) | RA (args[0]) | |
1120 | + | ((args[2] >> 16) & 0xffff)); | |
1118 | 1121 | else { |
1119 | - if ((args[2] & 0xffff) == args[2]) | |
1120 | - tcg_out32 (s, ANDI | RS (args[1]) | RA (args[0]) | args[2]); | |
1121 | - else if ((args[2] & 0xffff0000) == args[2]) | |
1122 | - tcg_out32 (s, ANDIS | RS (args[1]) | RA (args[0]) | |
1123 | - | ((args[2] >> 16) & 0xffff)); | |
1124 | - else if (args[2] == 0xffffffff) { | |
1125 | - if (args[0] != args[1]) | |
1126 | - tcg_out_mov (s, args[0], args[1]); | |
1127 | - } | |
1128 | - else { | |
1129 | - tcg_out_movi (s, TCG_TYPE_I32, 0, args[2]); | |
1130 | - tcg_out32 (s, AND | SAB (args[1], args[0], 0)); | |
1131 | - } | |
1122 | + tcg_out_movi (s, TCG_TYPE_I32, 0, args[2]); | |
1123 | + tcg_out32 (s, AND | SAB (args[1], args[0], 0)); | |
1132 | 1124 | } |
1133 | 1125 | } |
1134 | 1126 | else |
... | ... | @@ -1136,22 +1128,16 @@ static void tcg_out_op(TCGContext *s, int opc, const TCGArg *args, |
1136 | 1128 | break; |
1137 | 1129 | case INDEX_op_or_i32: |
1138 | 1130 | if (const_args[2]) { |
1139 | - if (args[2]) { | |
1140 | - if (args[2] & 0xffff) { | |
1141 | - tcg_out32 (s, ORI | RS (args[1]) | RA (args[0]) | |
1142 | - | (args[2] & 0xffff)); | |
1143 | - if (args[2] >> 16) | |
1144 | - tcg_out32 (s, ORIS | RS (args[0]) | RA (args[0]) | |
1145 | - | ((args[2] >> 16) & 0xffff)); | |
1146 | - } | |
1147 | - else { | |
1148 | - tcg_out32 (s, ORIS | RS (args[1]) | RA (args[0]) | |
1131 | + if (args[2] & 0xffff) { | |
1132 | + tcg_out32 (s, ORI | RS (args[1]) | RA (args[0]) | |
1133 | + | (args[2] & 0xffff)); | |
1134 | + if (args[2] >> 16) | |
1135 | + tcg_out32 (s, ORIS | RS (args[0]) | RA (args[0]) | |
1149 | 1136 | | ((args[2] >> 16) & 0xffff)); |
1150 | - } | |
1151 | 1137 | } |
1152 | 1138 | else { |
1153 | - if (args[0] != args[1]) | |
1154 | - tcg_out_mov (s, args[0], args[1]); | |
1139 | + tcg_out32 (s, ORIS | RS (args[1]) | RA (args[0]) | |
1140 | + | ((args[2] >> 16) & 0xffff)); | |
1155 | 1141 | } |
1156 | 1142 | } |
1157 | 1143 | else |
... | ... | @@ -1159,21 +1145,15 @@ static void tcg_out_op(TCGContext *s, int opc, const TCGArg *args, |
1159 | 1145 | break; |
1160 | 1146 | case INDEX_op_xor_i32: |
1161 | 1147 | if (const_args[2]) { |
1162 | - if (args[2]) { | |
1163 | - if ((args[2] & 0xffff) == args[2]) | |
1164 | - tcg_out32 (s, XORI | RS (args[1]) | RA (args[0]) | |
1165 | - | (args[2] & 0xffff)); | |
1166 | - else if ((args[2] & 0xffff0000) == args[2]) | |
1167 | - tcg_out32 (s, XORIS | RS (args[1]) | RA (args[0]) | |
1168 | - | ((args[2] >> 16) & 0xffff)); | |
1169 | - else { | |
1170 | - tcg_out_movi (s, TCG_TYPE_I32, 0, args[2]); | |
1171 | - tcg_out32 (s, XOR | SAB (args[1], args[0], 0)); | |
1172 | - } | |
1173 | - } | |
1148 | + if ((args[2] & 0xffff) == args[2]) | |
1149 | + tcg_out32 (s, XORI | RS (args[1]) | RA (args[0]) | |
1150 | + | (args[2] & 0xffff)); | |
1151 | + else if ((args[2] & 0xffff0000) == args[2]) | |
1152 | + tcg_out32 (s, XORIS | RS (args[1]) | RA (args[0]) | |
1153 | + | ((args[2] >> 16) & 0xffff)); | |
1174 | 1154 | else { |
1175 | - if (args[0] != args[1]) | |
1176 | - tcg_out_mov (s, args[0], args[1]); | |
1155 | + tcg_out_movi (s, TCG_TYPE_I32, 0, args[2]); | |
1156 | + tcg_out32 (s, XOR | SAB (args[1], args[0], 0)); | |
1177 | 1157 | } |
1178 | 1158 | } |
1179 | 1159 | else |
... | ... | @@ -1228,34 +1208,28 @@ static void tcg_out_op(TCGContext *s, int opc, const TCGArg *args, |
1228 | 1208 | |
1229 | 1209 | case INDEX_op_shl_i32: |
1230 | 1210 | if (const_args[2]) { |
1231 | - if (args[2]) | |
1232 | - tcg_out32 (s, (RLWINM | |
1233 | - | RA (args[0]) | |
1234 | - | RS (args[1]) | |
1235 | - | SH (args[2]) | |
1236 | - | MB (0) | |
1237 | - | ME (31 - args[2]) | |
1238 | - ) | |
1239 | - ); | |
1240 | - else | |
1241 | - tcg_out_mov (s, args[0], args[1]); | |
1211 | + tcg_out32 (s, (RLWINM | |
1212 | + | RA (args[0]) | |
1213 | + | RS (args[1]) | |
1214 | + | SH (args[2]) | |
1215 | + | MB (0) | |
1216 | + | ME (31 - args[2]) | |
1217 | + ) | |
1218 | + ); | |
1242 | 1219 | } |
1243 | 1220 | else |
1244 | 1221 | tcg_out32 (s, SLW | SAB (args[1], args[0], args[2])); |
1245 | 1222 | break; |
1246 | 1223 | case INDEX_op_shr_i32: |
1247 | 1224 | if (const_args[2]) { |
1248 | - if (args[2]) | |
1249 | - tcg_out32 (s, (RLWINM | |
1250 | - | RA (args[0]) | |
1251 | - | RS (args[1]) | |
1252 | - | SH (32 - args[2]) | |
1253 | - | MB (args[2]) | |
1254 | - | ME (31) | |
1255 | - ) | |
1256 | - ); | |
1257 | - else | |
1258 | - tcg_out_mov (s, args[0], args[1]); | |
1225 | + tcg_out32 (s, (RLWINM | |
1226 | + | RA (args[0]) | |
1227 | + | RS (args[1]) | |
1228 | + | SH (32 - args[2]) | |
1229 | + | MB (args[2]) | |
1230 | + | ME (31) | |
1231 | + ) | |
1232 | + ); | |
1259 | 1233 | } |
1260 | 1234 | else |
1261 | 1235 | tcg_out32 (s, SRW | SAB (args[1], args[0], args[2])); | ... | ... |
tcg/ppc64/tcg-target.c
... | ... | @@ -1104,22 +1104,14 @@ static void tcg_out_op (TCGContext *s, int opc, const TCGArg *args, |
1104 | 1104 | |
1105 | 1105 | case INDEX_op_and_i32: |
1106 | 1106 | if (const_args[2]) { |
1107 | - if (!args[2]) | |
1108 | - tcg_out_movi (s, TCG_TYPE_I32, args[0], 0); | |
1107 | + if ((args[2] & 0xffff) == args[2]) | |
1108 | + tcg_out32 (s, ANDI | RS (args[1]) | RA (args[0]) | args[2]); | |
1109 | + else if ((args[2] & 0xffff0000) == args[2]) | |
1110 | + tcg_out32 (s, ANDIS | RS (args[1]) | RA (args[0]) | |
1111 | + | ((args[2] >> 16) & 0xffff)); | |
1109 | 1112 | else { |
1110 | - if ((args[2] & 0xffff) == args[2]) | |
1111 | - tcg_out32 (s, ANDI | RS (args[1]) | RA (args[0]) | args[2]); | |
1112 | - else if ((args[2] & 0xffff0000) == args[2]) | |
1113 | - tcg_out32 (s, ANDIS | RS (args[1]) | RA (args[0]) | |
1114 | - | ((args[2] >> 16) & 0xffff)); | |
1115 | - else if (args[2] == 0xffffffff) { | |
1116 | - if (args[0] != args[1]) | |
1117 | - tcg_out_mov (s, args[0], args[1]); | |
1118 | - } | |
1119 | - else { | |
1120 | - tcg_out_movi (s, TCG_TYPE_I32, 0, args[2]); | |
1121 | - tcg_out32 (s, AND | SAB (args[1], args[0], 0)); | |
1122 | - } | |
1113 | + tcg_out_movi (s, TCG_TYPE_I32, 0, args[2]); | |
1114 | + tcg_out32 (s, AND | SAB (args[1], args[0], 0)); | |
1123 | 1115 | } |
1124 | 1116 | } |
1125 | 1117 | else |
... | ... | @@ -1127,22 +1119,16 @@ static void tcg_out_op (TCGContext *s, int opc, const TCGArg *args, |
1127 | 1119 | break; |
1128 | 1120 | case INDEX_op_or_i32: |
1129 | 1121 | if (const_args[2]) { |
1130 | - if (args[2]) { | |
1131 | - if (args[2] & 0xffff) { | |
1132 | - tcg_out32 (s, ORI | RS (args[1]) | RA (args[0]) | |
1133 | - | (args[2] & 0xffff)); | |
1134 | - if (args[2] >> 16) | |
1135 | - tcg_out32 (s, ORIS | RS (args[0]) | RA (args[0]) | |
1136 | - | ((args[2] >> 16) & 0xffff)); | |
1137 | - } | |
1138 | - else { | |
1139 | - tcg_out32 (s, ORIS | RS (args[1]) | RA (args[0]) | |
1122 | + if (args[2] & 0xffff) { | |
1123 | + tcg_out32 (s, ORI | RS (args[1]) | RA (args[0]) | |
1124 | + | (args[2] & 0xffff)); | |
1125 | + if (args[2] >> 16) | |
1126 | + tcg_out32 (s, ORIS | RS (args[0]) | RA (args[0]) | |
1140 | 1127 | | ((args[2] >> 16) & 0xffff)); |
1141 | - } | |
1142 | 1128 | } |
1143 | 1129 | else { |
1144 | - if (args[0] != args[1]) | |
1145 | - tcg_out_mov (s, args[0], args[1]); | |
1130 | + tcg_out32 (s, ORIS | RS (args[1]) | RA (args[0]) | |
1131 | + | ((args[2] >> 16) & 0xffff)); | |
1146 | 1132 | } |
1147 | 1133 | } |
1148 | 1134 | else |
... | ... | @@ -1150,21 +1136,15 @@ static void tcg_out_op (TCGContext *s, int opc, const TCGArg *args, |
1150 | 1136 | break; |
1151 | 1137 | case INDEX_op_xor_i32: |
1152 | 1138 | if (const_args[2]) { |
1153 | - if (args[2]) { | |
1154 | - if ((args[2] & 0xffff) == args[2]) | |
1155 | - tcg_out32 (s, XORI | RS (args[1]) | RA (args[0]) | |
1156 | - | (args[2] & 0xffff)); | |
1157 | - else if ((args[2] & 0xffff0000) == args[2]) | |
1158 | - tcg_out32 (s, XORIS | RS (args[1]) | RA (args[0]) | |
1159 | - | ((args[2] >> 16) & 0xffff)); | |
1160 | - else { | |
1161 | - tcg_out_movi (s, TCG_TYPE_I32, 0, args[2]); | |
1162 | - tcg_out32 (s, XOR | SAB (args[1], args[0], 0)); | |
1163 | - } | |
1164 | - } | |
1139 | + if ((args[2] & 0xffff) == args[2]) | |
1140 | + tcg_out32 (s, XORI | RS (args[1]) | RA (args[0]) | |
1141 | + | (args[2] & 0xffff)); | |
1142 | + else if ((args[2] & 0xffff0000) == args[2]) | |
1143 | + tcg_out32 (s, XORIS | RS (args[1]) | RA (args[0]) | |
1144 | + | ((args[2] >> 16) & 0xffff)); | |
1165 | 1145 | else { |
1166 | - if (args[0] != args[1]) | |
1167 | - tcg_out_mov (s, args[0], args[1]); | |
1146 | + tcg_out_movi (s, TCG_TYPE_I32, 0, args[2]); | |
1147 | + tcg_out32 (s, XOR | SAB (args[1], args[0], 0)); | |
1168 | 1148 | } |
1169 | 1149 | } |
1170 | 1150 | else |
... | ... | @@ -1207,34 +1187,28 @@ static void tcg_out_op (TCGContext *s, int opc, const TCGArg *args, |
1207 | 1187 | |
1208 | 1188 | case INDEX_op_shl_i32: |
1209 | 1189 | if (const_args[2]) { |
1210 | - if (args[2]) | |
1211 | - tcg_out32 (s, (RLWINM | |
1212 | - | RA (args[0]) | |
1213 | - | RS (args[1]) | |
1214 | - | SH (args[2]) | |
1215 | - | MB (0) | |
1216 | - | ME (31 - args[2]) | |
1217 | - ) | |
1218 | - ); | |
1219 | - else | |
1220 | - tcg_out_mov (s, args[0], args[1]); | |
1190 | + tcg_out32 (s, (RLWINM | |
1191 | + | RA (args[0]) | |
1192 | + | RS (args[1]) | |
1193 | + | SH (args[2]) | |
1194 | + | MB (0) | |
1195 | + | ME (31 - args[2]) | |
1196 | + ) | |
1197 | + ); | |
1221 | 1198 | } |
1222 | 1199 | else |
1223 | 1200 | tcg_out32 (s, SLW | SAB (args[1], args[0], args[2])); |
1224 | 1201 | break; |
1225 | 1202 | case INDEX_op_shr_i32: |
1226 | 1203 | if (const_args[2]) { |
1227 | - if (args[2]) | |
1228 | - tcg_out32 (s, (RLWINM | |
1229 | - | RA (args[0]) | |
1230 | - | RS (args[1]) | |
1231 | - | SH (32 - args[2]) | |
1232 | - | MB (args[2]) | |
1233 | - | ME (31) | |
1234 | - ) | |
1235 | - ); | |
1236 | - else | |
1237 | - tcg_out_mov (s, args[0], args[1]); | |
1204 | + tcg_out32 (s, (RLWINM | |
1205 | + | RA (args[0]) | |
1206 | + | RS (args[1]) | |
1207 | + | SH (32 - args[2]) | |
1208 | + | MB (args[2]) | |
1209 | + | ME (31) | |
1210 | + ) | |
1211 | + ); | |
1238 | 1212 | } |
1239 | 1213 | else |
1240 | 1214 | tcg_out32 (s, SRW | SAB (args[1], args[0], args[2])); | ... | ... |