Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 1158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1169 | 1169 |
| 1170 virtual void PrintDataTo(StringStream* stream) const; | 1170 virtual void PrintDataTo(StringStream* stream) const; |
| 1171 | 1171 |
| 1172 DECLARE_CONCRETE_INSTRUCTION(CallConstantFunction, "call_constant_function") | 1172 DECLARE_CONCRETE_INSTRUCTION(CallConstantFunction, "call_constant_function") |
| 1173 | 1173 |
| 1174 private: | 1174 private: |
| 1175 Handle<JSFunction> function_; | 1175 Handle<JSFunction> function_; |
| 1176 }; | 1176 }; |
| 1177 | 1177 |
| 1178 | 1178 |
| 1179 // TODO(3190496): This class uses hacks to get additional operands that ar | |
| 1180 // not arguments to work with the current setup. This _needs_ a cleanup. | |
| 1181 // (see HCall). | |
|
fschneider
2011/02/09 13:41:53
Maybe it would be less effort to land the refactor
| |
| 1179 class HCallKeyed: public HCall { | 1182 class HCallKeyed: public HCall { |
| 1180 public: | 1183 public: |
| 1181 HCallKeyed(HValue* key, int argument_count) | 1184 HCallKeyed(HValue* context, HValue* key, int argument_count) |
| 1182 : HCall(argument_count + 1) { | 1185 : HCall(argument_count + 1), context_(NULL) { |
| 1183 SetOperandAt(0, key); | 1186 SetOperandAt(0, key); |
| 1187 SetOperandAt(argument_count + 1, context); | |
| 1184 } | 1188 } |
| 1185 | 1189 |
| 1186 virtual Representation RequiredInputRepresentation(int index) const { | 1190 virtual Representation RequiredInputRepresentation(int index) const { |
| 1187 return Representation::Tagged(); | 1191 return Representation::Tagged(); |
| 1188 } | 1192 } |
| 1189 | 1193 |
| 1190 // TODO(3190496): This is a hack to get an additional operand that | |
| 1191 // is not an argument to work with the current setup. This _needs_ a cleanup. | |
| 1192 // (see HCall) | |
| 1193 virtual void PrintDataTo(StringStream* stream) const; | 1194 virtual void PrintDataTo(StringStream* stream) const; |
| 1195 | |
| 1194 HValue* key() const { return OperandAt(0); } | 1196 HValue* key() const { return OperandAt(0); } |
| 1197 HValue* context() const { return context_; } | |
| 1198 | |
| 1195 virtual int argument_count() const { return arguments_.length() - 1; } | 1199 virtual int argument_count() const { return arguments_.length() - 1; } |
| 1196 virtual int OperandCount() const { return arguments_.length(); } | 1200 virtual int OperandCount() const { return arguments_.length() + 1; } |
| 1197 virtual HValue* OperandAt(int index) const { return arguments_[index]; } | 1201 |
| 1202 virtual HValue* OperandAt(int index) const { | |
| 1203 // The key and all the arguments are stored in the base class's | |
| 1204 // arguments_ vector. The context is in the object itself. Ugly. | |
| 1205 return (index <= argument_count()) ? arguments_[index] : context_; | |
| 1206 } | |
| 1207 | |
| 1198 virtual HPushArgument* PushArgumentAt(int index) const { | 1208 virtual HPushArgument* PushArgumentAt(int index) const { |
| 1199 return HPushArgument::cast(OperandAt(index + 1)); | 1209 return HPushArgument::cast(OperandAt(index + 1)); |
| 1200 } | 1210 } |
| 1201 virtual void SetArgumentAt(int index, HPushArgument* push_argument) { | 1211 virtual void SetArgumentAt(int index, HPushArgument* push_argument) { |
| 1202 HCall::SetArgumentAt(index + 1, push_argument); | 1212 HCall::SetArgumentAt(index + 1, push_argument); |
| 1203 } | 1213 } |
| 1204 | 1214 |
| 1205 DECLARE_CONCRETE_INSTRUCTION(CallKeyed, "call_keyed") | 1215 DECLARE_CONCRETE_INSTRUCTION(CallKeyed, "call_keyed") |
| 1216 | |
| 1217 protected: | |
| 1218 virtual void InternalSetOperandAt(int index, HValue* value); | |
| 1219 | |
| 1220 private: | |
| 1221 HValue* context_; | |
| 1206 }; | 1222 }; |
| 1207 | 1223 |
| 1208 | 1224 |
| 1209 class HCallNamed: public HCall { | 1225 class HCallNamed: public HCall { |
| 1210 public: | 1226 public: |
| 1211 HCallNamed(Handle<String> name, int argument_count) | 1227 HCallNamed(HValue* context, Handle<String> name, int argument_count) |
| 1212 : HCall(argument_count), name_(name) { } | 1228 : HCall(argument_count), context_(NULL), name_(name) { |
| 1229 SetOperandAt(argument_count, context); | |
| 1230 } | |
| 1231 | |
| 1213 virtual void PrintDataTo(StringStream* stream) const; | 1232 virtual void PrintDataTo(StringStream* stream) const; |
| 1214 | 1233 |
| 1234 HValue* context() const { return context_; } | |
| 1215 Handle<String> name() const { return name_; } | 1235 Handle<String> name() const { return name_; } |
| 1216 | 1236 |
| 1237 virtual int OperandCount() const { return arguments_.length() + 1; } | |
| 1238 | |
| 1239 virtual HValue* OperandAt(int index) const { | |
| 1240 // The arguments are in the base class's arguments_ vector. The context | |
| 1241 // is in the object itself. | |
| 1242 return (index < argument_count()) ? arguments_[index] : context_; | |
| 1243 } | |
| 1244 | |
| 1217 DECLARE_CONCRETE_INSTRUCTION(CallNamed, "call_named") | 1245 DECLARE_CONCRETE_INSTRUCTION(CallNamed, "call_named") |
| 1218 | 1246 |
| 1247 protected: | |
| 1248 virtual void InternalSetOperandAt(int index, HValue* value); | |
| 1249 | |
| 1219 private: | 1250 private: |
| 1251 HValue* context_; | |
| 1220 Handle<String> name_; | 1252 Handle<String> name_; |
| 1221 }; | 1253 }; |
| 1222 | 1254 |
| 1223 | 1255 |
| 1224 class HCallFunction: public HCall { | 1256 class HCallFunction: public HCall { |
| 1225 public: | 1257 public: |
| 1226 explicit HCallFunction(int argument_count) : HCall(argument_count) { } | 1258 HCallFunction(HValue* context, int argument_count) |
| 1259 : HCall(argument_count), context_(NULL) { | |
| 1260 SetOperandAt(argument_count, context); | |
| 1261 } | |
| 1262 | |
| 1263 HValue* context() const { return context_; } | |
| 1264 | |
| 1265 virtual int OperandCount() const { return arguments_.length() + 1; } | |
| 1266 | |
| 1267 virtual HValue* OperandAt(int index) const { | |
| 1268 // The arguments are in the base class's arguments_ vector. The context | |
| 1269 // is in the object itself. | |
| 1270 return (index < argument_count()) ? arguments_[index] : context_; | |
| 1271 } | |
| 1227 | 1272 |
| 1228 DECLARE_CONCRETE_INSTRUCTION(CallFunction, "call_function") | 1273 DECLARE_CONCRETE_INSTRUCTION(CallFunction, "call_function") |
| 1274 | |
| 1275 protected: | |
| 1276 virtual void InternalSetOperandAt(int index, HValue* value); | |
| 1277 | |
| 1278 private: | |
| 1279 HValue* context_; | |
| 1229 }; | 1280 }; |
| 1230 | 1281 |
| 1231 | 1282 |
| 1232 class HCallGlobal: public HCall { | 1283 class HCallGlobal: public HCall { |
| 1233 public: | 1284 public: |
| 1234 HCallGlobal(Handle<String> name, int argument_count) | 1285 HCallGlobal(HValue* context, Handle<String> name, int argument_count) |
| 1235 : HCall(argument_count), name_(name) { } | 1286 : HCall(argument_count), context_(NULL), name_(name) { |
| 1287 SetOperandAt(argument_count, context); | |
| 1288 } | |
| 1236 | 1289 |
| 1237 virtual void PrintDataTo(StringStream* stream) const; | 1290 virtual void PrintDataTo(StringStream* stream) const; |
| 1238 | 1291 |
| 1292 HValue* context() const { return context_; } | |
| 1239 Handle<String> name() const { return name_; } | 1293 Handle<String> name() const { return name_; } |
| 1240 | 1294 |
| 1295 virtual int OperandCount() const { return arguments_.length() + 1; } | |
| 1296 | |
| 1297 virtual HValue* OperandAt(int index) const { | |
| 1298 // The arguments are in the base class's arguments_ vector. The context | |
| 1299 // is in the object itself. | |
| 1300 return (index < argument_count()) ? arguments_[index] : context_; | |
| 1301 } | |
| 1302 | |
| 1241 DECLARE_CONCRETE_INSTRUCTION(CallGlobal, "call_global") | 1303 DECLARE_CONCRETE_INSTRUCTION(CallGlobal, "call_global") |
| 1242 | 1304 |
| 1305 protected: | |
| 1306 virtual void InternalSetOperandAt(int index, HValue* value); | |
| 1307 | |
| 1243 private: | 1308 private: |
| 1309 HValue* context_; | |
| 1244 Handle<String> name_; | 1310 Handle<String> name_; |
| 1245 }; | 1311 }; |
| 1246 | 1312 |
| 1247 | 1313 |
| 1248 class HCallKnownGlobal: public HCall { | 1314 class HCallKnownGlobal: public HCall { |
| 1249 public: | 1315 public: |
| 1250 HCallKnownGlobal(Handle<JSFunction> target, | 1316 HCallKnownGlobal(Handle<JSFunction> target, |
| 1251 int argument_count) | 1317 int argument_count) |
| 1252 : HCall(argument_count), target_(target) { } | 1318 : HCall(argument_count), target_(target) { } |
| 1253 | 1319 |
| 1254 Handle<JSFunction> target() const { return target_; } | 1320 Handle<JSFunction> target() const { return target_; } |
| 1255 | 1321 |
| 1256 DECLARE_CONCRETE_INSTRUCTION(CallKnownGlobal, "call_known_global") | 1322 DECLARE_CONCRETE_INSTRUCTION(CallKnownGlobal, "call_known_global") |
| 1257 | 1323 |
| 1258 private: | 1324 private: |
| 1259 Handle<JSFunction> target_; | 1325 Handle<JSFunction> target_; |
| 1260 }; | 1326 }; |
| 1261 | 1327 |
| 1262 | 1328 |
| 1263 class HCallNew: public HCall { | 1329 class HCallNew: public HCall { |
| 1264 public: | 1330 public: |
| 1265 explicit HCallNew(int argument_count) : HCall(argument_count) { } | 1331 HCallNew(HValue* context, int argument_count) |
| 1332 : HCall(argument_count), context_(NULL) { | |
| 1333 SetOperandAt(argument_count, context); | |
| 1334 } | |
| 1266 | 1335 |
| 1267 virtual Representation RequiredInputRepresentation(int index) const { | 1336 virtual Representation RequiredInputRepresentation(int index) const { |
| 1268 return Representation::Tagged(); | 1337 return Representation::Tagged(); |
| 1269 } | 1338 } |
| 1270 | 1339 |
| 1340 HValue* context() const { return context_; } | |
| 1271 HValue* constructor() const { return ArgumentAt(0); } | 1341 HValue* constructor() const { return ArgumentAt(0); } |
| 1272 | 1342 |
| 1343 virtual int OperandCount() const { return arguments_.length() + 1; } | |
| 1344 | |
| 1345 virtual HValue* OperandAt(int index) const { | |
| 1346 // The arguments are in the base class's arguments_ vector. The context | |
| 1347 // is in the object itself. | |
| 1348 return (index < argument_count()) ? arguments_[index] : context_; | |
| 1349 } | |
| 1350 | |
| 1273 DECLARE_CONCRETE_INSTRUCTION(CallNew, "call_new") | 1351 DECLARE_CONCRETE_INSTRUCTION(CallNew, "call_new") |
| 1352 | |
| 1353 protected: | |
| 1354 virtual void InternalSetOperandAt(int index, HValue* value); | |
| 1355 | |
| 1356 private: | |
| 1357 HValue* context_; | |
| 1274 }; | 1358 }; |
| 1275 | 1359 |
| 1276 | 1360 |
| 1277 class HCallRuntime: public HCall { | 1361 class HCallRuntime: public HCall { |
| 1278 public: | 1362 public: |
| 1279 HCallRuntime(Handle<String> name, | 1363 HCallRuntime(Handle<String> name, |
| 1280 Runtime::Function* c_function, | 1364 Runtime::Function* c_function, |
| 1281 int argument_count) | 1365 int argument_count) |
| 1282 : HCall(argument_count), c_function_(c_function), name_(name) { } | 1366 : HCall(argument_count), c_function_(c_function), name_(name) { } |
| 1283 virtual void PrintDataTo(StringStream* stream) const; | 1367 virtual void PrintDataTo(StringStream* stream) const; |
| (...skipping 570 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1854 virtual int OperandCount() const { return operands_.length(); } | 1938 virtual int OperandCount() const { return operands_.length(); } |
| 1855 virtual HValue* OperandAt(int index) const { return operands_[index]; } | 1939 virtual HValue* OperandAt(int index) const { return operands_[index]; } |
| 1856 | 1940 |
| 1857 DECLARE_INSTRUCTION(BinaryOperation) | 1941 DECLARE_INSTRUCTION(BinaryOperation) |
| 1858 | 1942 |
| 1859 protected: | 1943 protected: |
| 1860 virtual void InternalSetOperandAt(int index, HValue* value) { | 1944 virtual void InternalSetOperandAt(int index, HValue* value) { |
| 1861 operands_[index] = value; | 1945 operands_[index] = value; |
| 1862 } | 1946 } |
| 1863 | 1947 |
| 1864 private: | |
| 1865 HOperandVector<2> operands_; | 1948 HOperandVector<2> operands_; |
| 1866 }; | 1949 }; |
| 1867 | 1950 |
| 1868 | 1951 |
| 1869 class HApplyArguments: public HInstruction { | 1952 class HApplyArguments: public HInstruction { |
| 1870 public: | 1953 public: |
| 1871 HApplyArguments(HValue* function, | 1954 HApplyArguments(HValue* function, |
| 1872 HValue* receiver, | 1955 HValue* receiver, |
| 1873 HValue* length, | 1956 HValue* length, |
| 1874 HValue* elements) { | 1957 HValue* elements) { |
| (...skipping 396 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2271 virtual bool DataEquals(HValue* other) const { | 2354 virtual bool DataEquals(HValue* other) const { |
| 2272 HTypeofIs* b = HTypeofIs::cast(other); | 2355 HTypeofIs* b = HTypeofIs::cast(other); |
| 2273 return type_literal_.is_identical_to(b->type_literal_); | 2356 return type_literal_.is_identical_to(b->type_literal_); |
| 2274 } | 2357 } |
| 2275 | 2358 |
| 2276 private: | 2359 private: |
| 2277 Handle<String> type_literal_; | 2360 Handle<String> type_literal_; |
| 2278 }; | 2361 }; |
| 2279 | 2362 |
| 2280 | 2363 |
| 2281 class HInstanceOf: public HBinaryOperation { | 2364 class HInstanceOf: public HInstruction { |
| 2282 public: | 2365 public: |
| 2283 HInstanceOf(HValue* left, HValue* right) : HBinaryOperation(left, right) { | 2366 HInstanceOf(HValue* context, HValue* left, HValue* right) { |
| 2367 SetOperandAt(0, context); | |
| 2368 SetOperandAt(1, left); | |
| 2369 SetOperandAt(2, right); | |
| 2284 set_representation(Representation::Tagged()); | 2370 set_representation(Representation::Tagged()); |
| 2285 SetAllSideEffects(); | 2371 SetAllSideEffects(); |
| 2286 } | 2372 } |
| 2287 | 2373 |
| 2374 HValue* context() const { return operands_[0]; } | |
| 2375 HValue* left() const { return operands_[1]; } | |
| 2376 HValue* right() const { return operands_[2]; } | |
| 2377 | |
| 2288 virtual bool EmitAtUses() const { return uses()->length() <= 1; } | 2378 virtual bool EmitAtUses() const { return uses()->length() <= 1; } |
| 2289 | 2379 |
| 2290 virtual Representation RequiredInputRepresentation(int index) const { | 2380 virtual Representation RequiredInputRepresentation(int index) const { |
| 2291 return Representation::Tagged(); | 2381 return Representation::Tagged(); |
| 2292 } | 2382 } |
| 2293 | 2383 |
| 2384 virtual void PrintDataTo(StringStream* stream) const; | |
| 2385 | |
| 2386 virtual int OperandCount() const { return 3; } | |
| 2387 virtual HValue* OperandAt(int index) const { return operands_[index]; } | |
| 2388 | |
| 2294 DECLARE_CONCRETE_INSTRUCTION(InstanceOf, "instance_of") | 2389 DECLARE_CONCRETE_INSTRUCTION(InstanceOf, "instance_of") |
| 2390 | |
| 2391 protected: | |
| 2392 virtual void InternalSetOperandAt(int index, HValue* value) { | |
| 2393 operands_[index] = value; | |
| 2394 } | |
| 2395 | |
| 2396 private: | |
| 2397 HOperandVector<3> operands_; | |
| 2295 }; | 2398 }; |
| 2296 | 2399 |
| 2297 | 2400 |
| 2298 class HInstanceOfKnownGlobal: public HUnaryOperation { | 2401 class HInstanceOfKnownGlobal: public HUnaryOperation { |
| 2299 public: | 2402 public: |
| 2300 HInstanceOfKnownGlobal(HValue* left, Handle<JSFunction> right) | 2403 HInstanceOfKnownGlobal(HValue* left, Handle<JSFunction> right) |
| 2301 : HUnaryOperation(left), function_(right) { | 2404 : HUnaryOperation(left), function_(right) { |
| 2302 set_representation(Representation::Tagged()); | 2405 set_representation(Representation::Tagged()); |
| 2303 SetAllSideEffects(); | 2406 SetAllSideEffects(); |
| 2304 } | 2407 } |
| (...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2553 | 2656 |
| 2554 virtual void PrintDataTo(StringStream* stream) const; | 2657 virtual void PrintDataTo(StringStream* stream) const; |
| 2555 | 2658 |
| 2556 DECLARE_CONCRETE_INSTRUCTION(Parameter, "parameter") | 2659 DECLARE_CONCRETE_INSTRUCTION(Parameter, "parameter") |
| 2557 | 2660 |
| 2558 private: | 2661 private: |
| 2559 unsigned index_; | 2662 unsigned index_; |
| 2560 }; | 2663 }; |
| 2561 | 2664 |
| 2562 | 2665 |
| 2563 class HCallStub: public HInstruction { | 2666 class HCallStub: public HUnaryOperation { |
| 2564 public: | 2667 public: |
| 2565 HCallStub(CodeStub::Major major_key, int argument_count) | 2668 HCallStub(HValue* context, CodeStub::Major major_key, int argument_count) |
| 2566 : major_key_(major_key), | 2669 : HUnaryOperation(context), |
| 2670 major_key_(major_key), | |
| 2567 argument_count_(argument_count), | 2671 argument_count_(argument_count), |
| 2568 transcendental_type_(TranscendentalCache::kNumberOfCaches) { | 2672 transcendental_type_(TranscendentalCache::kNumberOfCaches) { |
| 2569 set_representation(Representation::Tagged()); | 2673 set_representation(Representation::Tagged()); |
| 2570 SetAllSideEffects(); | 2674 SetAllSideEffects(); |
| 2571 } | 2675 } |
| 2572 | 2676 |
| 2573 CodeStub::Major major_key() { return major_key_; } | 2677 CodeStub::Major major_key() { return major_key_; } |
| 2574 int argument_count() { return argument_count_; } | 2678 int argument_count() { return argument_count_; } |
| 2679 HValue* context() { return OperandAt(0); } | |
| 2575 | 2680 |
| 2576 void set_transcendental_type(TranscendentalCache::Type transcendental_type) { | 2681 void set_transcendental_type(TranscendentalCache::Type transcendental_type) { |
| 2577 transcendental_type_ = transcendental_type; | 2682 transcendental_type_ = transcendental_type; |
| 2578 } | 2683 } |
| 2579 TranscendentalCache::Type transcendental_type() { | 2684 TranscendentalCache::Type transcendental_type() { |
| 2580 return transcendental_type_; | 2685 return transcendental_type_; |
| 2581 } | 2686 } |
| 2582 virtual void PrintDataTo(StringStream* stream) const; | 2687 virtual void PrintDataTo(StringStream* stream) const; |
| 2583 | 2688 |
| 2584 DECLARE_CONCRETE_INSTRUCTION(CallStub, "call_stub") | 2689 DECLARE_CONCRETE_INSTRUCTION(CallStub, "call_stub") |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2756 HLoadNamedField* b = HLoadNamedField::cast(other); | 2861 HLoadNamedField* b = HLoadNamedField::cast(other); |
| 2757 return is_in_object_ == b->is_in_object_ && offset_ == b->offset_; | 2862 return is_in_object_ == b->is_in_object_ && offset_ == b->offset_; |
| 2758 } | 2863 } |
| 2759 | 2864 |
| 2760 private: | 2865 private: |
| 2761 bool is_in_object_; | 2866 bool is_in_object_; |
| 2762 int offset_; | 2867 int offset_; |
| 2763 }; | 2868 }; |
| 2764 | 2869 |
| 2765 | 2870 |
| 2766 class HLoadNamedGeneric: public HUnaryOperation { | 2871 class HLoadNamedGeneric: public HBinaryOperation { |
| 2767 public: | 2872 public: |
| 2768 HLoadNamedGeneric(HValue* object, Handle<Object> name) | 2873 HLoadNamedGeneric(HValue* context, HValue* object, Handle<Object> name) |
| 2769 : HUnaryOperation(object), name_(name) { | 2874 : HBinaryOperation(context, object), name_(name) { |
| 2770 set_representation(Representation::Tagged()); | 2875 set_representation(Representation::Tagged()); |
| 2771 SetAllSideEffects(); | 2876 SetAllSideEffects(); |
| 2772 } | 2877 } |
| 2773 | 2878 |
| 2774 HValue* object() const { return OperandAt(0); } | 2879 HValue* context() const { return OperandAt(0); } |
| 2880 HValue* object() const { return OperandAt(1); } | |
| 2775 Handle<Object> name() const { return name_; } | 2881 Handle<Object> name() const { return name_; } |
| 2776 | 2882 |
| 2777 virtual Representation RequiredInputRepresentation(int index) const { | 2883 virtual Representation RequiredInputRepresentation(int index) const { |
| 2778 return Representation::Tagged(); | 2884 return Representation::Tagged(); |
| 2779 } | 2885 } |
| 2780 | 2886 |
| 2781 DECLARE_CONCRETE_INSTRUCTION(LoadNamedGeneric, "load_named_generic") | 2887 DECLARE_CONCRETE_INSTRUCTION(LoadNamedGeneric, "load_named_generic") |
| 2782 | 2888 |
| 2783 private: | 2889 private: |
| 2784 Handle<Object> name_; | 2890 Handle<Object> name_; |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2841 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedFastElement, | 2947 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedFastElement, |
| 2842 "load_keyed_fast_element") | 2948 "load_keyed_fast_element") |
| 2843 | 2949 |
| 2844 protected: | 2950 protected: |
| 2845 virtual bool DataEquals(HValue* other) const { return true; } | 2951 virtual bool DataEquals(HValue* other) const { return true; } |
| 2846 }; | 2952 }; |
| 2847 | 2953 |
| 2848 | 2954 |
| 2849 class HLoadKeyedGeneric: public HLoadKeyed { | 2955 class HLoadKeyedGeneric: public HLoadKeyed { |
| 2850 public: | 2956 public: |
| 2851 HLoadKeyedGeneric(HValue* obj, HValue* key) : HLoadKeyed(obj, key) { | 2957 HLoadKeyedGeneric(HContext* context, HValue* obj, HValue* key) |
| 2958 : HLoadKeyed(obj, key), context_(NULL) { | |
| 2959 SetOperandAt(2, context); | |
| 2852 SetAllSideEffects(); | 2960 SetAllSideEffects(); |
| 2853 } | 2961 } |
| 2854 | 2962 |
| 2963 HValue* context() const { return context_; } | |
| 2964 HValue* object() const { return operands_[0]; } | |
| 2965 HValue* key() const { return operands_[1]; } | |
| 2966 | |
| 2967 virtual int OperandCount() const { return 3; } | |
| 2968 virtual HValue* OperandAt(int index) const { | |
| 2969 return (index < 2) ? operands_[index] : context_; | |
| 2970 } | |
| 2971 | |
| 2855 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric, "load_keyed_generic") | 2972 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric, "load_keyed_generic") |
| 2973 | |
| 2974 protected: | |
| 2975 virtual void InternalSetOperandAt(int index, HValue* value); | |
| 2976 | |
| 2977 private: | |
| 2978 HValue* context_; | |
| 2856 }; | 2979 }; |
| 2857 | 2980 |
| 2858 | 2981 |
| 2859 class HStoreNamed: public HBinaryOperation { | 2982 class HStoreNamed: public HBinaryOperation { |
| 2860 public: | 2983 public: |
| 2861 HStoreNamed(HValue* obj, Handle<Object> name, HValue* val) | 2984 HStoreNamed(HValue* obj, Handle<String> name, HValue* val) |
| 2862 : HBinaryOperation(obj, val), name_(name) { | 2985 : HBinaryOperation(obj, val), name_(name) { |
| 2863 } | 2986 } |
| 2864 | 2987 |
| 2865 virtual Representation RequiredInputRepresentation(int index) const { | 2988 virtual Representation RequiredInputRepresentation(int index) const { |
| 2866 return Representation::Tagged(); | 2989 return Representation::Tagged(); |
| 2867 } | 2990 } |
| 2868 | 2991 |
| 2869 virtual void PrintDataTo(StringStream* stream) const; | 2992 virtual void PrintDataTo(StringStream* stream) const; |
| 2870 | 2993 |
| 2871 HValue* object() const { return OperandAt(0); } | 2994 HValue* object() const { return OperandAt(0); } |
| 2872 Handle<Object> name() const { return name_; } | 2995 Handle<String> name() const { return name_; } |
| 2873 HValue* value() const { return OperandAt(1); } | 2996 HValue* value() const { return OperandAt(1); } |
| 2874 void set_value(HValue* value) { SetOperandAt(1, value); } | 2997 void set_value(HValue* value) { SetOperandAt(1, value); } |
| 2875 | 2998 |
| 2876 DECLARE_INSTRUCTION(StoreNamed) | 2999 DECLARE_INSTRUCTION(StoreNamed) |
| 2877 | 3000 |
| 2878 private: | 3001 private: |
| 2879 Handle<Object> name_; | 3002 Handle<String> name_; |
| 2880 }; | 3003 }; |
| 2881 | 3004 |
| 2882 | 3005 |
| 2883 class HStoreNamedField: public HStoreNamed { | 3006 class HStoreNamedField: public HStoreNamed { |
| 2884 public: | 3007 public: |
| 2885 HStoreNamedField(HValue* obj, | 3008 HStoreNamedField(HValue* obj, |
| 2886 Handle<Object> name, | 3009 Handle<String> name, |
| 2887 HValue* val, | 3010 HValue* val, |
| 2888 bool in_object, | 3011 bool in_object, |
| 2889 int offset) | 3012 int offset) |
| 2890 : HStoreNamed(obj, name, val), | 3013 : HStoreNamed(obj, name, val), |
| 2891 is_in_object_(in_object), | 3014 is_in_object_(in_object), |
| 2892 offset_(offset) { | 3015 offset_(offset) { |
| 2893 if (is_in_object_) { | 3016 if (is_in_object_) { |
| 2894 SetFlag(kChangesInobjectFields); | 3017 SetFlag(kChangesInobjectFields); |
| 2895 } else { | 3018 } else { |
| 2896 SetFlag(kChangesBackingStoreFields); | 3019 SetFlag(kChangesBackingStoreFields); |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 2915 | 3038 |
| 2916 private: | 3039 private: |
| 2917 bool is_in_object_; | 3040 bool is_in_object_; |
| 2918 int offset_; | 3041 int offset_; |
| 2919 Handle<Map> transition_; | 3042 Handle<Map> transition_; |
| 2920 }; | 3043 }; |
| 2921 | 3044 |
| 2922 | 3045 |
| 2923 class HStoreNamedGeneric: public HStoreNamed { | 3046 class HStoreNamedGeneric: public HStoreNamed { |
| 2924 public: | 3047 public: |
| 2925 HStoreNamedGeneric(HValue* obj, Handle<Object> name, HValue* val) | 3048 HStoreNamedGeneric(HValue* context, |
| 2926 : HStoreNamed(obj, name, val) { | 3049 HValue* object, |
| 3050 Handle<String> name, | |
| 3051 HValue* value) | |
| 3052 : HStoreNamed(object, name, value), context_(NULL) { | |
| 3053 SetOperandAt(2, context); | |
| 2927 SetAllSideEffects(); | 3054 SetAllSideEffects(); |
| 2928 } | 3055 } |
| 2929 | 3056 |
| 3057 HValue* context() const { return context_; } | |
| 3058 HValue* object() const { return operands_[0]; } | |
| 3059 HValue* value() const { return operands_[1]; } | |
| 3060 | |
| 3061 virtual int OperandCount() const { return 3; } | |
| 3062 | |
| 3063 virtual HValue* OperandAt(int index) const { | |
| 3064 return (index < 2) ? operands_[index] : context_; | |
| 3065 } | |
| 3066 | |
| 2930 DECLARE_CONCRETE_INSTRUCTION(StoreNamedGeneric, "store_named_generic") | 3067 DECLARE_CONCRETE_INSTRUCTION(StoreNamedGeneric, "store_named_generic") |
| 3068 | |
| 3069 protected: | |
| 3070 virtual void InternalSetOperandAt(int index, HValue* value); | |
| 3071 | |
| 3072 private: | |
| 3073 HValue* context_; | |
| 2931 }; | 3074 }; |
| 2932 | 3075 |
| 2933 | 3076 |
| 2934 class HStoreKeyed: public HInstruction { | 3077 class HStoreKeyed: public HInstruction { |
| 2935 public: | 3078 public: |
| 2936 HStoreKeyed(HValue* obj, HValue* key, HValue* val) { | 3079 HStoreKeyed(HValue* obj, HValue* key, HValue* val) { |
| 2937 SetOperandAt(0, obj); | 3080 SetOperandAt(0, obj); |
| 2938 SetOperandAt(1, key); | 3081 SetOperandAt(1, key); |
| 2939 SetOperandAt(2, val); | 3082 SetOperandAt(2, val); |
| 2940 } | 3083 } |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 2955 return StoringValueNeedsWriteBarrier(value()); | 3098 return StoringValueNeedsWriteBarrier(value()); |
| 2956 } | 3099 } |
| 2957 | 3100 |
| 2958 DECLARE_INSTRUCTION(StoreKeyed) | 3101 DECLARE_INSTRUCTION(StoreKeyed) |
| 2959 | 3102 |
| 2960 protected: | 3103 protected: |
| 2961 virtual void InternalSetOperandAt(int index, HValue* value) { | 3104 virtual void InternalSetOperandAt(int index, HValue* value) { |
| 2962 operands_[index] = value; | 3105 operands_[index] = value; |
| 2963 } | 3106 } |
| 2964 | 3107 |
| 2965 private: | |
| 2966 HOperandVector<3> operands_; | 3108 HOperandVector<3> operands_; |
| 2967 }; | 3109 }; |
| 2968 | 3110 |
| 2969 | 3111 |
| 2970 class HStoreKeyedFastElement: public HStoreKeyed { | 3112 class HStoreKeyedFastElement: public HStoreKeyed { |
| 2971 public: | 3113 public: |
| 2972 HStoreKeyedFastElement(HValue* obj, HValue* key, HValue* val) | 3114 HStoreKeyedFastElement(HValue* obj, HValue* key, HValue* val) |
| 2973 : HStoreKeyed(obj, key, val) { | 3115 : HStoreKeyed(obj, key, val) { |
| 2974 SetFlag(kChangesArrayElements); | 3116 SetFlag(kChangesArrayElements); |
| 2975 } | 3117 } |
| 2976 | 3118 |
| 2977 virtual Representation RequiredInputRepresentation(int index) const { | 3119 virtual Representation RequiredInputRepresentation(int index) const { |
| 2978 // The key is supposed to be Integer32. | 3120 // The key is supposed to be Integer32. |
| 2979 return (index == 1) ? Representation::Integer32() | 3121 return (index == 1) ? Representation::Integer32() |
| 2980 : Representation::Tagged(); | 3122 : Representation::Tagged(); |
| 2981 } | 3123 } |
| 2982 | 3124 |
| 2983 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedFastElement, | 3125 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedFastElement, |
| 2984 "store_keyed_fast_element") | 3126 "store_keyed_fast_element") |
| 2985 }; | 3127 }; |
| 2986 | 3128 |
| 2987 | 3129 |
| 2988 class HStoreKeyedGeneric: public HStoreKeyed { | 3130 class HStoreKeyedGeneric: public HStoreKeyed { |
| 2989 public: | 3131 public: |
| 2990 HStoreKeyedGeneric(HValue* obj, HValue* key, HValue* val) | 3132 HStoreKeyedGeneric(HValue* context, |
| 2991 : HStoreKeyed(obj, key, val) { | 3133 HValue* object, |
| 3134 HValue* key, | |
| 3135 HValue* value) | |
| 3136 : HStoreKeyed(object, key, value), context_(NULL) { | |
| 3137 SetOperandAt(3, context); | |
| 2992 SetAllSideEffects(); | 3138 SetAllSideEffects(); |
| 2993 } | 3139 } |
| 2994 | 3140 |
| 3141 HValue* context() const { return context_; } | |
| 3142 HValue* object() const { return operands_[0]; } | |
| 3143 HValue* key() const { return operands_[1]; } | |
| 3144 HValue* value() const { return operands_[2]; } | |
| 3145 | |
| 3146 virtual int OperandCount() const { return 4; } | |
| 3147 | |
| 3148 virtual HValue* OperandAt(int index) const { | |
| 3149 return (index < 3) ? operands_[index] : context_; | |
| 3150 } | |
| 3151 | |
| 2995 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedGeneric, "store_keyed_generic") | 3152 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedGeneric, "store_keyed_generic") |
| 3153 | |
| 3154 protected: | |
| 3155 virtual void InternalSetOperandAt(int index, HValue* value); | |
| 3156 | |
| 3157 private: | |
| 3158 HValue* context_; | |
| 2996 }; | 3159 }; |
| 2997 | 3160 |
| 2998 | 3161 |
| 2999 class HStringCharCodeAt: public HBinaryOperation { | 3162 class HStringCharCodeAt: public HBinaryOperation { |
| 3000 public: | 3163 public: |
| 3001 HStringCharCodeAt(HValue* string, HValue* index) | 3164 HStringCharCodeAt(HValue* string, HValue* index) |
| 3002 : HBinaryOperation(string, index) { | 3165 : HBinaryOperation(string, index) { |
| 3003 set_representation(Representation::Integer32()); | 3166 set_representation(Representation::Integer32()); |
| 3004 SetFlag(kUseGVN); | 3167 SetFlag(kUseGVN); |
| 3005 } | 3168 } |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3087 DECLARE_CONCRETE_INSTRUCTION(ArrayLiteral, "array_literal") | 3250 DECLARE_CONCRETE_INSTRUCTION(ArrayLiteral, "array_literal") |
| 3088 | 3251 |
| 3089 private: | 3252 private: |
| 3090 int length_; | 3253 int length_; |
| 3091 Handle<FixedArray> constant_elements_; | 3254 Handle<FixedArray> constant_elements_; |
| 3092 }; | 3255 }; |
| 3093 | 3256 |
| 3094 | 3257 |
| 3095 class HObjectLiteral: public HMaterializedLiteral { | 3258 class HObjectLiteral: public HMaterializedLiteral { |
| 3096 public: | 3259 public: |
| 3097 HObjectLiteral(Handle<FixedArray> constant_properties, | 3260 HObjectLiteral(HValue* context, |
| 3261 Handle<FixedArray> constant_properties, | |
| 3098 bool fast_elements, | 3262 bool fast_elements, |
| 3099 int literal_index, | 3263 int literal_index, |
| 3100 int depth) | 3264 int depth) |
| 3101 : HMaterializedLiteral(literal_index, depth), | 3265 : HMaterializedLiteral(literal_index, depth), |
| 3266 context_(NULL), | |
| 3102 constant_properties_(constant_properties), | 3267 constant_properties_(constant_properties), |
| 3103 fast_elements_(fast_elements) {} | 3268 fast_elements_(fast_elements) { |
| 3269 SetOperandAt(0, context); | |
| 3270 } | |
| 3104 | 3271 |
| 3272 HValue* context() const { return context_; } | |
| 3105 Handle<FixedArray> constant_properties() const { | 3273 Handle<FixedArray> constant_properties() const { |
| 3106 return constant_properties_; | 3274 return constant_properties_; |
| 3107 } | 3275 } |
| 3108 bool fast_elements() const { return fast_elements_; } | 3276 bool fast_elements() const { return fast_elements_; } |
| 3109 | 3277 |
| 3278 virtual int OperandCount() const { return 1; } | |
| 3279 virtual HValue* OperandAt(int index) const { return context_; } | |
| 3280 | |
| 3110 DECLARE_CONCRETE_INSTRUCTION(ObjectLiteral, "object_literal") | 3281 DECLARE_CONCRETE_INSTRUCTION(ObjectLiteral, "object_literal") |
| 3111 | 3282 |
| 3283 protected: | |
| 3284 virtual void InternalSetOperandAt(int index, HValue* value) { | |
| 3285 context_ = value; | |
| 3286 } | |
| 3287 | |
| 3112 private: | 3288 private: |
| 3289 HValue* context_; | |
| 3113 Handle<FixedArray> constant_properties_; | 3290 Handle<FixedArray> constant_properties_; |
| 3114 bool fast_elements_; | 3291 bool fast_elements_; |
| 3115 }; | 3292 }; |
| 3116 | 3293 |
| 3117 | 3294 |
| 3118 class HRegExpLiteral: public HMaterializedLiteral { | 3295 class HRegExpLiteral: public HMaterializedLiteral { |
| 3119 public: | 3296 public: |
| 3120 HRegExpLiteral(Handle<String> pattern, | 3297 HRegExpLiteral(Handle<String> pattern, |
| 3121 Handle<String> flags, | 3298 Handle<String> flags, |
| 3122 int literal_index) | 3299 int literal_index) |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3194 HValue* object() const { return left(); } | 3371 HValue* object() const { return left(); } |
| 3195 HValue* key() const { return right(); } | 3372 HValue* key() const { return right(); } |
| 3196 }; | 3373 }; |
| 3197 | 3374 |
| 3198 #undef DECLARE_INSTRUCTION | 3375 #undef DECLARE_INSTRUCTION |
| 3199 #undef DECLARE_CONCRETE_INSTRUCTION | 3376 #undef DECLARE_CONCRETE_INSTRUCTION |
| 3200 | 3377 |
| 3201 } } // namespace v8::internal | 3378 } } // namespace v8::internal |
| 3202 | 3379 |
| 3203 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ | 3380 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ |
| OLD | NEW |