OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "test/unittests/compiler/node-test-utils.h" | 5 #include "test/unittests/compiler/node-test-utils.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "src/assembler.h" | 9 #include "src/assembler.h" |
10 #include "src/compiler/common-operator.h" | 10 #include "src/compiler/common-operator.h" |
(...skipping 1176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1187 | 1187 |
1188 private: | 1188 private: |
1189 const Matcher<ElementAccess> access_matcher_; | 1189 const Matcher<ElementAccess> access_matcher_; |
1190 const Matcher<Node*> base_matcher_; | 1190 const Matcher<Node*> base_matcher_; |
1191 const Matcher<Node*> index_matcher_; | 1191 const Matcher<Node*> index_matcher_; |
1192 const Matcher<Node*> value_matcher_; | 1192 const Matcher<Node*> value_matcher_; |
1193 const Matcher<Node*> effect_matcher_; | 1193 const Matcher<Node*> effect_matcher_; |
1194 const Matcher<Node*> control_matcher_; | 1194 const Matcher<Node*> control_matcher_; |
1195 }; | 1195 }; |
1196 | 1196 |
| 1197 #define LOAD_MATCHER(kLoad) \ |
| 1198 class Is##kLoad##Matcher final : public NodeMatcher { \ |
| 1199 public: \ |
| 1200 Is##kLoad##Matcher(const Matcher<kLoad##Representation>& rep_matcher, \ |
| 1201 const Matcher<Node*>& base_matcher, \ |
| 1202 const Matcher<Node*>& index_matcher, \ |
| 1203 const Matcher<Node*>& effect_matcher, \ |
| 1204 const Matcher<Node*>& control_matcher) \ |
| 1205 : NodeMatcher(IrOpcode::k##kLoad), \ |
| 1206 rep_matcher_(rep_matcher), \ |
| 1207 base_matcher_(base_matcher), \ |
| 1208 index_matcher_(index_matcher), \ |
| 1209 effect_matcher_(effect_matcher), \ |
| 1210 control_matcher_(control_matcher) {} \ |
| 1211 \ |
| 1212 void DescribeTo(std::ostream* os) const final { \ |
| 1213 NodeMatcher::DescribeTo(os); \ |
| 1214 *os << " whose rep ("; \ |
| 1215 rep_matcher_.DescribeTo(os); \ |
| 1216 *os << "), base ("; \ |
| 1217 base_matcher_.DescribeTo(os); \ |
| 1218 *os << "), index ("; \ |
| 1219 index_matcher_.DescribeTo(os); \ |
| 1220 *os << "), effect ("; \ |
| 1221 effect_matcher_.DescribeTo(os); \ |
| 1222 *os << ") and control ("; \ |
| 1223 control_matcher_.DescribeTo(os); \ |
| 1224 *os << ")"; \ |
| 1225 } \ |
| 1226 \ |
| 1227 bool MatchAndExplain(Node* node, \ |
| 1228 MatchResultListener* listener) const final { \ |
| 1229 Node* effect_node = nullptr; \ |
| 1230 Node* control_node = nullptr; \ |
| 1231 if (NodeProperties::FirstEffectIndex(node) < node->InputCount()) { \ |
| 1232 effect_node = NodeProperties::GetEffectInput(node); \ |
| 1233 } \ |
| 1234 if (NodeProperties::FirstControlIndex(node) < node->InputCount()) { \ |
| 1235 control_node = NodeProperties::GetControlInput(node); \ |
| 1236 } \ |
| 1237 return (NodeMatcher::MatchAndExplain(node, listener) && \ |
| 1238 PrintMatchAndExplain(OpParameter<kLoad##Representation>(node), \ |
| 1239 "rep", rep_matcher_, listener) && \ |
| 1240 PrintMatchAndExplain(NodeProperties::GetValueInput(node, 0), \ |
| 1241 "base", base_matcher_, listener) && \ |
| 1242 PrintMatchAndExplain(NodeProperties::GetValueInput(node, 1), \ |
| 1243 "index", index_matcher_, listener) && \ |
| 1244 PrintMatchAndExplain(effect_node, "effect", effect_matcher_, \ |
| 1245 listener) && \ |
| 1246 PrintMatchAndExplain(control_node, "control", control_matcher_, \ |
| 1247 listener)); \ |
| 1248 } \ |
| 1249 \ |
| 1250 private: \ |
| 1251 const Matcher<kLoad##Representation> rep_matcher_; \ |
| 1252 const Matcher<Node*> base_matcher_; \ |
| 1253 const Matcher<Node*> index_matcher_; \ |
| 1254 const Matcher<Node*> effect_matcher_; \ |
| 1255 const Matcher<Node*> control_matcher_; \ |
| 1256 }; |
1197 | 1257 |
1198 class IsLoadMatcher final : public NodeMatcher { | 1258 LOAD_MATCHER(Load) |
1199 public: | 1259 LOAD_MATCHER(UnalignedLoad) |
1200 IsLoadMatcher(const Matcher<LoadRepresentation>& rep_matcher, | |
1201 const Matcher<Node*>& base_matcher, | |
1202 const Matcher<Node*>& index_matcher, | |
1203 const Matcher<Node*>& effect_matcher, | |
1204 const Matcher<Node*>& control_matcher) | |
1205 : NodeMatcher(IrOpcode::kLoad), | |
1206 rep_matcher_(rep_matcher), | |
1207 base_matcher_(base_matcher), | |
1208 index_matcher_(index_matcher), | |
1209 effect_matcher_(effect_matcher), | |
1210 control_matcher_(control_matcher) {} | |
1211 | 1260 |
1212 void DescribeTo(std::ostream* os) const final { | 1261 #define STORE_MATCHER(kStore) \ |
1213 NodeMatcher::DescribeTo(os); | 1262 class Is##kStore##Matcher final : public NodeMatcher { \ |
1214 *os << " whose rep ("; | 1263 public: \ |
1215 rep_matcher_.DescribeTo(os); | 1264 Is##kStore##Matcher(const Matcher<kStore##Representation>& rep_matcher, \ |
1216 *os << "), base ("; | 1265 const Matcher<Node*>& base_matcher, \ |
1217 base_matcher_.DescribeTo(os); | 1266 const Matcher<Node*>& index_matcher, \ |
1218 *os << "), index ("; | 1267 const Matcher<Node*>& value_matcher, \ |
1219 index_matcher_.DescribeTo(os); | 1268 const Matcher<Node*>& effect_matcher, \ |
1220 *os << "), effect ("; | 1269 const Matcher<Node*>& control_matcher) \ |
1221 effect_matcher_.DescribeTo(os); | 1270 : NodeMatcher(IrOpcode::k##kStore), \ |
1222 *os << ") and control ("; | 1271 rep_matcher_(rep_matcher), \ |
1223 control_matcher_.DescribeTo(os); | 1272 base_matcher_(base_matcher), \ |
1224 *os << ")"; | 1273 index_matcher_(index_matcher), \ |
1225 } | 1274 value_matcher_(value_matcher), \ |
| 1275 effect_matcher_(effect_matcher), \ |
| 1276 control_matcher_(control_matcher) {} \ |
| 1277 \ |
| 1278 void DescribeTo(std::ostream* os) const final { \ |
| 1279 NodeMatcher::DescribeTo(os); \ |
| 1280 *os << " whose rep ("; \ |
| 1281 rep_matcher_.DescribeTo(os); \ |
| 1282 *os << "), base ("; \ |
| 1283 base_matcher_.DescribeTo(os); \ |
| 1284 *os << "), index ("; \ |
| 1285 index_matcher_.DescribeTo(os); \ |
| 1286 *os << "), value ("; \ |
| 1287 value_matcher_.DescribeTo(os); \ |
| 1288 *os << "), effect ("; \ |
| 1289 effect_matcher_.DescribeTo(os); \ |
| 1290 *os << ") and control ("; \ |
| 1291 control_matcher_.DescribeTo(os); \ |
| 1292 *os << ")"; \ |
| 1293 } \ |
| 1294 \ |
| 1295 bool MatchAndExplain(Node* node, \ |
| 1296 MatchResultListener* listener) const final { \ |
| 1297 Node* effect_node = nullptr; \ |
| 1298 Node* control_node = nullptr; \ |
| 1299 if (NodeProperties::FirstEffectIndex(node) < node->InputCount()) { \ |
| 1300 effect_node = NodeProperties::GetEffectInput(node); \ |
| 1301 } \ |
| 1302 if (NodeProperties::FirstControlIndex(node) < node->InputCount()) { \ |
| 1303 control_node = NodeProperties::GetControlInput(node); \ |
| 1304 } \ |
| 1305 return (NodeMatcher::MatchAndExplain(node, listener) && \ |
| 1306 PrintMatchAndExplain(OpParameter<kStore##Representation>(node), \ |
| 1307 "rep", rep_matcher_, listener) && \ |
| 1308 PrintMatchAndExplain(NodeProperties::GetValueInput(node, 0), \ |
| 1309 "base", base_matcher_, listener) && \ |
| 1310 PrintMatchAndExplain(NodeProperties::GetValueInput(node, 1), \ |
| 1311 "index", index_matcher_, listener) && \ |
| 1312 PrintMatchAndExplain(NodeProperties::GetValueInput(node, 2), \ |
| 1313 "value", value_matcher_, listener) && \ |
| 1314 PrintMatchAndExplain(effect_node, "effect", effect_matcher_, \ |
| 1315 listener) && \ |
| 1316 PrintMatchAndExplain(control_node, "control", control_matcher_, \ |
| 1317 listener)); \ |
| 1318 } \ |
| 1319 \ |
| 1320 private: \ |
| 1321 const Matcher<kStore##Representation> rep_matcher_; \ |
| 1322 const Matcher<Node*> base_matcher_; \ |
| 1323 const Matcher<Node*> index_matcher_; \ |
| 1324 const Matcher<Node*> value_matcher_; \ |
| 1325 const Matcher<Node*> effect_matcher_; \ |
| 1326 const Matcher<Node*> control_matcher_; \ |
| 1327 }; |
1226 | 1328 |
1227 bool MatchAndExplain(Node* node, MatchResultListener* listener) const final { | 1329 STORE_MATCHER(Store) |
1228 Node* effect_node = nullptr; | 1330 STORE_MATCHER(UnalignedStore) |
1229 Node* control_node = nullptr; | |
1230 if (NodeProperties::FirstEffectIndex(node) < node->InputCount()) { | |
1231 effect_node = NodeProperties::GetEffectInput(node); | |
1232 } | |
1233 if (NodeProperties::FirstControlIndex(node) < node->InputCount()) { | |
1234 control_node = NodeProperties::GetControlInput(node); | |
1235 } | |
1236 return (NodeMatcher::MatchAndExplain(node, listener) && | |
1237 PrintMatchAndExplain(OpParameter<LoadRepresentation>(node), "rep", | |
1238 rep_matcher_, listener) && | |
1239 PrintMatchAndExplain(NodeProperties::GetValueInput(node, 0), "base", | |
1240 base_matcher_, listener) && | |
1241 PrintMatchAndExplain(NodeProperties::GetValueInput(node, 1), | |
1242 "index", index_matcher_, listener) && | |
1243 PrintMatchAndExplain(effect_node, "effect", effect_matcher_, | |
1244 listener) && | |
1245 PrintMatchAndExplain(control_node, "control", control_matcher_, | |
1246 listener)); | |
1247 } | |
1248 | |
1249 private: | |
1250 const Matcher<LoadRepresentation> rep_matcher_; | |
1251 const Matcher<Node*> base_matcher_; | |
1252 const Matcher<Node*> index_matcher_; | |
1253 const Matcher<Node*> effect_matcher_; | |
1254 const Matcher<Node*> control_matcher_; | |
1255 }; | |
1256 | |
1257 | |
1258 class IsStoreMatcher final : public NodeMatcher { | |
1259 public: | |
1260 IsStoreMatcher(const Matcher<StoreRepresentation>& rep_matcher, | |
1261 const Matcher<Node*>& base_matcher, | |
1262 const Matcher<Node*>& index_matcher, | |
1263 const Matcher<Node*>& value_matcher, | |
1264 const Matcher<Node*>& effect_matcher, | |
1265 const Matcher<Node*>& control_matcher) | |
1266 : NodeMatcher(IrOpcode::kStore), | |
1267 rep_matcher_(rep_matcher), | |
1268 base_matcher_(base_matcher), | |
1269 index_matcher_(index_matcher), | |
1270 value_matcher_(value_matcher), | |
1271 effect_matcher_(effect_matcher), | |
1272 control_matcher_(control_matcher) {} | |
1273 | |
1274 void DescribeTo(std::ostream* os) const final { | |
1275 NodeMatcher::DescribeTo(os); | |
1276 *os << " whose rep ("; | |
1277 rep_matcher_.DescribeTo(os); | |
1278 *os << "), base ("; | |
1279 base_matcher_.DescribeTo(os); | |
1280 *os << "), index ("; | |
1281 index_matcher_.DescribeTo(os); | |
1282 *os << "), value ("; | |
1283 value_matcher_.DescribeTo(os); | |
1284 *os << "), effect ("; | |
1285 effect_matcher_.DescribeTo(os); | |
1286 *os << ") and control ("; | |
1287 control_matcher_.DescribeTo(os); | |
1288 *os << ")"; | |
1289 } | |
1290 | |
1291 bool MatchAndExplain(Node* node, MatchResultListener* listener) const final { | |
1292 Node* effect_node = nullptr; | |
1293 Node* control_node = nullptr; | |
1294 if (NodeProperties::FirstEffectIndex(node) < node->InputCount()) { | |
1295 effect_node = NodeProperties::GetEffectInput(node); | |
1296 } | |
1297 if (NodeProperties::FirstControlIndex(node) < node->InputCount()) { | |
1298 control_node = NodeProperties::GetControlInput(node); | |
1299 } | |
1300 return (NodeMatcher::MatchAndExplain(node, listener) && | |
1301 PrintMatchAndExplain(OpParameter<StoreRepresentation>(node), "rep", | |
1302 rep_matcher_, listener) && | |
1303 PrintMatchAndExplain(NodeProperties::GetValueInput(node, 0), "base", | |
1304 base_matcher_, listener) && | |
1305 PrintMatchAndExplain(NodeProperties::GetValueInput(node, 1), | |
1306 "index", index_matcher_, listener) && | |
1307 PrintMatchAndExplain(NodeProperties::GetValueInput(node, 2), | |
1308 "value", value_matcher_, listener) && | |
1309 PrintMatchAndExplain(effect_node, "effect", effect_matcher_, | |
1310 listener) && | |
1311 PrintMatchAndExplain(control_node, "control", control_matcher_, | |
1312 listener)); | |
1313 } | |
1314 | |
1315 private: | |
1316 const Matcher<StoreRepresentation> rep_matcher_; | |
1317 const Matcher<Node*> base_matcher_; | |
1318 const Matcher<Node*> index_matcher_; | |
1319 const Matcher<Node*> value_matcher_; | |
1320 const Matcher<Node*> effect_matcher_; | |
1321 const Matcher<Node*> control_matcher_; | |
1322 }; | |
1323 | 1331 |
1324 class IsStackSlotMatcher final : public NodeMatcher { | 1332 class IsStackSlotMatcher final : public NodeMatcher { |
1325 public: | 1333 public: |
1326 explicit IsStackSlotMatcher(const Matcher<MachineRepresentation>& rep_matcher) | 1334 explicit IsStackSlotMatcher(const Matcher<MachineRepresentation>& rep_matcher) |
1327 : NodeMatcher(IrOpcode::kStackSlot), rep_matcher_(rep_matcher) {} | 1335 : NodeMatcher(IrOpcode::kStackSlot), rep_matcher_(rep_matcher) {} |
1328 | 1336 |
1329 void DescribeTo(std::ostream* os) const final { | 1337 void DescribeTo(std::ostream* os) const final { |
1330 NodeMatcher::DescribeTo(os); | 1338 NodeMatcher::DescribeTo(os); |
1331 *os << " whose rep ("; | 1339 *os << " whose rep ("; |
1332 rep_matcher_.DescribeTo(os); | 1340 rep_matcher_.DescribeTo(os); |
(...skipping 795 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2128 const Matcher<Node*>& base_matcher, | 2136 const Matcher<Node*>& base_matcher, |
2129 const Matcher<Node*>& index_matcher, | 2137 const Matcher<Node*>& index_matcher, |
2130 const Matcher<Node*>& value_matcher, | 2138 const Matcher<Node*>& value_matcher, |
2131 const Matcher<Node*>& effect_matcher, | 2139 const Matcher<Node*>& effect_matcher, |
2132 const Matcher<Node*>& control_matcher) { | 2140 const Matcher<Node*>& control_matcher) { |
2133 return MakeMatcher(new IsStoreElementMatcher( | 2141 return MakeMatcher(new IsStoreElementMatcher( |
2134 access_matcher, base_matcher, index_matcher, value_matcher, | 2142 access_matcher, base_matcher, index_matcher, value_matcher, |
2135 effect_matcher, control_matcher)); | 2143 effect_matcher, control_matcher)); |
2136 } | 2144 } |
2137 | 2145 |
2138 | |
2139 Matcher<Node*> IsLoad(const Matcher<LoadRepresentation>& rep_matcher, | 2146 Matcher<Node*> IsLoad(const Matcher<LoadRepresentation>& rep_matcher, |
2140 const Matcher<Node*>& base_matcher, | 2147 const Matcher<Node*>& base_matcher, |
2141 const Matcher<Node*>& index_matcher, | 2148 const Matcher<Node*>& index_matcher, |
2142 const Matcher<Node*>& effect_matcher, | 2149 const Matcher<Node*>& effect_matcher, |
2143 const Matcher<Node*>& control_matcher) { | 2150 const Matcher<Node*>& control_matcher) { |
2144 return MakeMatcher(new IsLoadMatcher(rep_matcher, base_matcher, index_matcher, | 2151 return MakeMatcher(new IsLoadMatcher(rep_matcher, base_matcher, index_matcher, |
2145 effect_matcher, control_matcher)); | 2152 effect_matcher, control_matcher)); |
2146 } | 2153 } |
2147 | 2154 |
| 2155 Matcher<Node*> IsUnalignedLoad( |
| 2156 const Matcher<UnalignedLoadRepresentation>& rep_matcher, |
| 2157 const Matcher<Node*>& base_matcher, const Matcher<Node*>& index_matcher, |
| 2158 const Matcher<Node*>& effect_matcher, |
| 2159 const Matcher<Node*>& control_matcher) { |
| 2160 return MakeMatcher(new IsUnalignedLoadMatcher(rep_matcher, base_matcher, |
| 2161 index_matcher, effect_matcher, |
| 2162 control_matcher)); |
| 2163 } |
2148 | 2164 |
2149 Matcher<Node*> IsStore(const Matcher<StoreRepresentation>& rep_matcher, | 2165 Matcher<Node*> IsStore(const Matcher<StoreRepresentation>& rep_matcher, |
2150 const Matcher<Node*>& base_matcher, | 2166 const Matcher<Node*>& base_matcher, |
2151 const Matcher<Node*>& index_matcher, | 2167 const Matcher<Node*>& index_matcher, |
2152 const Matcher<Node*>& value_matcher, | 2168 const Matcher<Node*>& value_matcher, |
2153 const Matcher<Node*>& effect_matcher, | 2169 const Matcher<Node*>& effect_matcher, |
2154 const Matcher<Node*>& control_matcher) { | 2170 const Matcher<Node*>& control_matcher) { |
2155 return MakeMatcher(new IsStoreMatcher(rep_matcher, base_matcher, | 2171 return MakeMatcher(new IsStoreMatcher(rep_matcher, base_matcher, |
2156 index_matcher, value_matcher, | 2172 index_matcher, value_matcher, |
2157 effect_matcher, control_matcher)); | 2173 effect_matcher, control_matcher)); |
2158 } | 2174 } |
2159 | 2175 |
| 2176 Matcher<Node*> IsUnalignedStore( |
| 2177 const Matcher<UnalignedStoreRepresentation>& rep_matcher, |
| 2178 const Matcher<Node*>& base_matcher, const Matcher<Node*>& index_matcher, |
| 2179 const Matcher<Node*>& value_matcher, const Matcher<Node*>& effect_matcher, |
| 2180 const Matcher<Node*>& control_matcher) { |
| 2181 return MakeMatcher(new IsUnalignedStoreMatcher( |
| 2182 rep_matcher, base_matcher, index_matcher, value_matcher, effect_matcher, |
| 2183 control_matcher)); |
| 2184 } |
| 2185 |
2160 Matcher<Node*> IsStackSlot(const Matcher<MachineRepresentation>& rep_matcher) { | 2186 Matcher<Node*> IsStackSlot(const Matcher<MachineRepresentation>& rep_matcher) { |
2161 return MakeMatcher(new IsStackSlotMatcher(rep_matcher)); | 2187 return MakeMatcher(new IsStackSlotMatcher(rep_matcher)); |
2162 } | 2188 } |
2163 | 2189 |
2164 Matcher<Node*> IsToNumber(const Matcher<Node*>& base_matcher, | 2190 Matcher<Node*> IsToNumber(const Matcher<Node*>& base_matcher, |
2165 const Matcher<Node*>& context_matcher, | 2191 const Matcher<Node*>& context_matcher, |
2166 const Matcher<Node*>& effect_matcher, | 2192 const Matcher<Node*>& effect_matcher, |
2167 const Matcher<Node*>& control_matcher) { | 2193 const Matcher<Node*>& control_matcher) { |
2168 return MakeMatcher(new IsToNumberMatcher(base_matcher, context_matcher, | 2194 return MakeMatcher(new IsToNumberMatcher(base_matcher, context_matcher, |
2169 effect_matcher, control_matcher)); | 2195 effect_matcher, control_matcher)); |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2324 IS_UNOP_MATCHER(ObjectIsSmi) | 2350 IS_UNOP_MATCHER(ObjectIsSmi) |
2325 IS_UNOP_MATCHER(StringFromCharCode) | 2351 IS_UNOP_MATCHER(StringFromCharCode) |
2326 IS_UNOP_MATCHER(Word32Clz) | 2352 IS_UNOP_MATCHER(Word32Clz) |
2327 IS_UNOP_MATCHER(Word32Ctz) | 2353 IS_UNOP_MATCHER(Word32Ctz) |
2328 IS_UNOP_MATCHER(Word32Popcnt) | 2354 IS_UNOP_MATCHER(Word32Popcnt) |
2329 #undef IS_UNOP_MATCHER | 2355 #undef IS_UNOP_MATCHER |
2330 | 2356 |
2331 } // namespace compiler | 2357 } // namespace compiler |
2332 } // namespace internal | 2358 } // namespace internal |
2333 } // namespace v8 | 2359 } // namespace v8 |
OLD | NEW |