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 994 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1005 | 1005 |
| 1006 virtual bool CanTruncateToInt32() const { | 1006 virtual bool CanTruncateToInt32() const { |
| 1007 return CheckFlag(kTruncatingToInt32); | 1007 return CheckFlag(kTruncatingToInt32); |
| 1008 } | 1008 } |
| 1009 | 1009 |
| 1010 HValue* value() { return OperandAt(0); } | 1010 HValue* value() { return OperandAt(0); } |
| 1011 virtual void PrintDataTo(StringStream* stream); | 1011 virtual void PrintDataTo(StringStream* stream); |
| 1012 }; | 1012 }; |
| 1013 | 1013 |
| 1014 | 1014 |
| 1015 class HThrow: public HUnaryOperation { | 1015 class HThrow: public HTemplateInstruction<2> { |
| 1016 public: | 1016 public: |
| 1017 explicit HThrow(HValue* value) : HUnaryOperation(value) { | 1017 HThrow(HValue* context, HValue* value) { |
| 1018 SetOperandAt(0, context); | |
| 1019 SetOperandAt(1, value); | |
| 1018 SetAllSideEffects(); | 1020 SetAllSideEffects(); |
| 1019 } | 1021 } |
| 1020 | 1022 |
| 1021 virtual Representation RequiredInputRepresentation(int index) const { | 1023 virtual Representation RequiredInputRepresentation(int index) const { |
| 1022 return Representation::Tagged(); | 1024 return Representation::Tagged(); |
| 1023 } | 1025 } |
| 1024 | 1026 |
| 1027 HValue* context() { return OperandAt(0); } | |
| 1028 HValue* value() { return OperandAt(1); } | |
| 1029 | |
| 1025 DECLARE_CONCRETE_INSTRUCTION(Throw) | 1030 DECLARE_CONCRETE_INSTRUCTION(Throw) |
| 1026 }; | 1031 }; |
| 1027 | 1032 |
| 1028 | 1033 |
| 1029 class HUseConst: public HUnaryOperation { | 1034 class HUseConst: public HUnaryOperation { |
| 1030 public: | 1035 public: |
| 1031 explicit HUseConst(HValue* old_value) : HUnaryOperation(old_value) { } | 1036 explicit HUseConst(HValue* old_value) : HUnaryOperation(old_value) { } |
| 1032 | 1037 |
| 1033 virtual Representation RequiredInputRepresentation(int index) const { | 1038 virtual Representation RequiredInputRepresentation(int index) const { |
| 1034 return Representation::None(); | 1039 return Representation::None(); |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1088 } | 1093 } |
| 1089 | 1094 |
| 1090 virtual void PrintDataTo(StringStream* stream); | 1095 virtual void PrintDataTo(StringStream* stream); |
| 1091 | 1096 |
| 1092 DECLARE_CONCRETE_INSTRUCTION(Change) | 1097 DECLARE_CONCRETE_INSTRUCTION(Change) |
| 1093 | 1098 |
| 1094 protected: | 1099 protected: |
| 1095 virtual bool DataEquals(HValue* other) { | 1100 virtual bool DataEquals(HValue* other) { |
| 1096 if (!other->IsChange()) return false; | 1101 if (!other->IsChange()) return false; |
| 1097 HChange* change = HChange::cast(other); | 1102 HChange* change = HChange::cast(other); |
| 1098 return value() == change->value() | 1103 return to().Equals(change->to()) |
| 1099 && to().Equals(change->to()) | |
| 1100 && deoptimize_on_undefined() == change->deoptimize_on_undefined(); | 1104 && deoptimize_on_undefined() == change->deoptimize_on_undefined(); |
| 1101 } | 1105 } |
| 1102 | 1106 |
| 1103 private: | 1107 private: |
| 1104 Representation from_; | 1108 Representation from_; |
| 1105 bool deoptimize_on_undefined_; | 1109 bool deoptimize_on_undefined_; |
| 1106 }; | 1110 }; |
| 1107 | 1111 |
| 1108 | 1112 |
| 1109 class HClampToUint8: public HUnaryOperation { | 1113 class HClampToUint8: public HUnaryOperation { |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1238 // use lists are correctly updated. | 1242 // use lists are correctly updated. |
| 1239 SetOperandAt(values_.length() - 1, value); | 1243 SetOperandAt(values_.length() - 1, value); |
| 1240 } | 1244 } |
| 1241 int ast_id_; | 1245 int ast_id_; |
| 1242 int pop_count_; | 1246 int pop_count_; |
| 1243 ZoneList<HValue*> values_; | 1247 ZoneList<HValue*> values_; |
| 1244 ZoneList<int> assigned_indexes_; | 1248 ZoneList<int> assigned_indexes_; |
| 1245 }; | 1249 }; |
| 1246 | 1250 |
| 1247 | 1251 |
| 1248 class HStackCheck: public HTemplateInstruction<0> { | 1252 class HStackCheck: public HTemplateInstruction<1> { |
| 1249 public: | 1253 public: |
| 1250 enum Type { | 1254 enum Type { |
| 1251 kFunctionEntry, | 1255 kFunctionEntry, |
| 1252 kBackwardsBranch | 1256 kBackwardsBranch |
| 1253 }; | 1257 }; |
| 1254 | 1258 |
| 1255 explicit HStackCheck(Type type) : type_(type) { } | 1259 explicit HStackCheck(HValue* context, Type type) : type_(type) { |
| 1260 SetOperandAt(0, context); | |
| 1261 } | |
| 1262 | |
| 1263 HValue* context() { return OperandAt(0); } | |
| 1256 | 1264 |
| 1257 virtual Representation RequiredInputRepresentation(int index) const { | 1265 virtual Representation RequiredInputRepresentation(int index) const { |
| 1258 return Representation::None(); | 1266 return Representation::Tagged(); |
| 1259 } | 1267 } |
| 1260 | 1268 |
| 1261 void Eliminate() { | 1269 void Eliminate() { |
| 1262 // The stack check eliminator might try to eliminate the same stack | 1270 // The stack check eliminator might try to eliminate the same stack |
| 1263 // check instruction multiple times. | 1271 // check instruction multiple times. |
| 1264 if (IsLinked()) { | 1272 if (IsLinked()) { |
| 1265 DeleteFromGraph(); | 1273 DeleteFromGraph(); |
| 1266 } | 1274 } |
| 1267 } | 1275 } |
| 1268 | 1276 |
| (...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1629 return Representation::Tagged(); | 1637 return Representation::Tagged(); |
| 1630 } | 1638 } |
| 1631 | 1639 |
| 1632 HValue* context() { return first(); } | 1640 HValue* context() { return first(); } |
| 1633 HValue* constructor() { return second(); } | 1641 HValue* constructor() { return second(); } |
| 1634 | 1642 |
| 1635 DECLARE_CONCRETE_INSTRUCTION(CallNew) | 1643 DECLARE_CONCRETE_INSTRUCTION(CallNew) |
| 1636 }; | 1644 }; |
| 1637 | 1645 |
| 1638 | 1646 |
| 1639 class HCallRuntime: public HCall<0> { | 1647 class HCallRuntime: public HCall<1> { |
| 1640 public: | 1648 public: |
| 1641 HCallRuntime(Handle<String> name, | 1649 HCallRuntime(HValue* context, |
| 1650 Handle<String> name, | |
| 1642 const Runtime::Function* c_function, | 1651 const Runtime::Function* c_function, |
| 1643 int argument_count) | 1652 int argument_count) |
| 1644 : HCall<0>(argument_count), c_function_(c_function), name_(name) { } | 1653 : HCall<1>(argument_count), c_function_(c_function), name_(name) { |
| 1654 SetOperandAt(0, context); | |
| 1655 } | |
| 1656 | |
| 1645 virtual void PrintDataTo(StringStream* stream); | 1657 virtual void PrintDataTo(StringStream* stream); |
| 1646 | 1658 |
| 1659 HValue* context() { return OperandAt(0); } | |
| 1647 const Runtime::Function* function() const { return c_function_; } | 1660 const Runtime::Function* function() const { return c_function_; } |
| 1648 Handle<String> name() const { return name_; } | 1661 Handle<String> name() const { return name_; } |
| 1649 | 1662 |
| 1650 virtual Representation RequiredInputRepresentation(int index) const { | 1663 virtual Representation RequiredInputRepresentation(int index) const { |
| 1651 return Representation::None(); | 1664 return Representation::Tagged(); |
| 1652 } | 1665 } |
| 1653 | 1666 |
| 1654 DECLARE_CONCRETE_INSTRUCTION(CallRuntime) | 1667 DECLARE_CONCRETE_INSTRUCTION(CallRuntime) |
| 1655 | 1668 |
| 1656 private: | 1669 private: |
| 1657 const Runtime::Function* c_function_; | 1670 const Runtime::Function* c_function_; |
| 1658 Handle<String> name_; | 1671 Handle<String> name_; |
| 1659 }; | 1672 }; |
| 1660 | 1673 |
| 1661 | 1674 |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1754 } | 1767 } |
| 1755 virtual HType CalculateInferredType(); | 1768 virtual HType CalculateInferredType(); |
| 1756 | 1769 |
| 1757 DECLARE_CONCRETE_INSTRUCTION(BitNot) | 1770 DECLARE_CONCRETE_INSTRUCTION(BitNot) |
| 1758 | 1771 |
| 1759 protected: | 1772 protected: |
| 1760 virtual bool DataEquals(HValue* other) { return true; } | 1773 virtual bool DataEquals(HValue* other) { return true; } |
| 1761 }; | 1774 }; |
| 1762 | 1775 |
| 1763 | 1776 |
| 1764 class HUnaryMathOperation: public HUnaryOperation { | 1777 class HUnaryMathOperation: public HTemplateInstruction<2> { |
| 1765 public: | 1778 public: |
| 1766 HUnaryMathOperation(HValue* value, BuiltinFunctionId op) | 1779 HUnaryMathOperation(HValue* context, HValue* value, BuiltinFunctionId op) |
| 1767 : HUnaryOperation(value), op_(op) { | 1780 : op_(op) { |
| 1781 SetOperandAt(0, context); | |
| 1782 SetOperandAt(1, value); | |
| 1768 switch (op) { | 1783 switch (op) { |
| 1769 case kMathFloor: | 1784 case kMathFloor: |
| 1770 case kMathRound: | 1785 case kMathRound: |
| 1771 case kMathCeil: | 1786 case kMathCeil: |
| 1772 set_representation(Representation::Integer32()); | 1787 set_representation(Representation::Integer32()); |
| 1773 break; | 1788 break; |
| 1774 case kMathAbs: | 1789 case kMathAbs: |
| 1775 set_representation(Representation::Tagged()); | 1790 set_representation(Representation::Tagged()); |
| 1776 SetFlag(kFlexibleRepresentation); | 1791 SetFlag(kFlexibleRepresentation); |
| 1777 break; | 1792 break; |
| 1778 case kMathSqrt: | 1793 case kMathSqrt: |
| 1779 case kMathPowHalf: | 1794 case kMathPowHalf: |
| 1780 case kMathLog: | 1795 case kMathLog: |
| 1781 case kMathSin: | 1796 case kMathSin: |
| 1782 case kMathCos: | 1797 case kMathCos: |
| 1783 set_representation(Representation::Double()); | 1798 set_representation(Representation::Double()); |
| 1784 break; | 1799 break; |
| 1785 default: | 1800 default: |
| 1786 UNREACHABLE(); | 1801 UNREACHABLE(); |
| 1787 } | 1802 } |
| 1788 SetFlag(kUseGVN); | 1803 SetFlag(kUseGVN); |
| 1789 } | 1804 } |
| 1790 | 1805 |
| 1806 HValue* context() { return OperandAt(0); } | |
| 1807 HValue* value() { return OperandAt(1); } | |
| 1808 | |
| 1791 virtual void PrintDataTo(StringStream* stream); | 1809 virtual void PrintDataTo(StringStream* stream); |
| 1792 | 1810 |
| 1793 virtual HType CalculateInferredType(); | 1811 virtual HType CalculateInferredType(); |
| 1794 | 1812 |
| 1795 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); | 1813 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); |
| 1796 | 1814 |
| 1797 virtual Representation RequiredInputRepresentation(int index) const { | 1815 virtual Representation RequiredInputRepresentation(int index) const { |
| 1798 switch (op_) { | 1816 if (index == 0) { |
| 1799 case kMathFloor: | 1817 return Representation::Tagged(); |
| 1800 case kMathRound: | 1818 } else { |
| 1801 case kMathCeil: | 1819 switch (op_) { |
| 1802 case kMathSqrt: | 1820 case kMathFloor: |
| 1803 case kMathPowHalf: | 1821 case kMathRound: |
| 1804 case kMathLog: | 1822 case kMathCeil: |
| 1805 case kMathSin: | 1823 case kMathSqrt: |
| 1806 case kMathCos: | 1824 case kMathPowHalf: |
| 1807 return Representation::Double(); | 1825 case kMathLog: |
| 1808 case kMathAbs: | 1826 case kMathSin: |
| 1809 return representation(); | 1827 case kMathCos: |
| 1810 default: | 1828 return Representation::Double(); |
| 1811 UNREACHABLE(); | 1829 case kMathAbs: |
| 1812 return Representation::None(); | 1830 return representation(); |
| 1831 default: | |
| 1832 UNREACHABLE(); | |
| 1833 return Representation::None(); | |
| 1834 } | |
| 1813 } | 1835 } |
| 1814 } | 1836 } |
| 1815 | 1837 |
| 1816 virtual HValue* Canonicalize() { | 1838 virtual HValue* Canonicalize() { |
| 1817 // If the input is integer32 then we replace the floor instruction | 1839 // If the input is integer32 then we replace the floor instruction |
| 1818 // with its inputs. This happens before the representation changes are | 1840 // with its inputs. This happens before the representation changes are |
| 1819 // introduced. | 1841 // introduced. |
| 1820 if (op() == kMathFloor) { | 1842 if (op() == kMathFloor) { |
| 1821 if (value()->representation().IsInteger32()) return value(); | 1843 if (value()->representation().IsInteger32()) return value(); |
| 1822 } | 1844 } |
| (...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2305 // The following two values represent the int32 and the double value of the | 2327 // The following two values represent the int32 and the double value of the |
| 2306 // given constant if there is a lossless conversion between the constant | 2328 // given constant if there is a lossless conversion between the constant |
| 2307 // and the specific representation. | 2329 // and the specific representation. |
| 2308 bool has_int32_value_ : 1; | 2330 bool has_int32_value_ : 1; |
| 2309 bool has_double_value_ : 1; | 2331 bool has_double_value_ : 1; |
| 2310 int32_t int32_value_; | 2332 int32_t int32_value_; |
| 2311 double double_value_; | 2333 double double_value_; |
| 2312 }; | 2334 }; |
| 2313 | 2335 |
| 2314 | 2336 |
| 2315 class HBinaryOperation: public HTemplateInstruction<2> { | 2337 class HBinaryOperation: public HTemplateInstruction<3> { |
| 2316 public: | 2338 public: |
| 2317 HBinaryOperation(HValue* left, HValue* right) { | 2339 HBinaryOperation(HValue* context, HValue* left, HValue* right) { |
| 2318 ASSERT(left != NULL && right != NULL); | 2340 ASSERT(left != NULL && right != NULL); |
| 2319 SetOperandAt(0, left); | 2341 SetOperandAt(0, context); |
| 2320 SetOperandAt(1, right); | 2342 SetOperandAt(1, left); |
| 2343 SetOperandAt(2, right); | |
| 2321 } | 2344 } |
| 2322 | 2345 |
| 2323 HValue* left() { return OperandAt(0); } | 2346 HValue* context() { return OperandAt(0); } |
| 2324 HValue* right() { return OperandAt(1); } | 2347 HValue* left() { return OperandAt(1); } |
| 2348 HValue* right() { return OperandAt(2); } | |
| 2325 | 2349 |
| 2326 // TODO(kasperl): Move these helpers to the IA-32 Lithium | 2350 // TODO(kasperl): Move these helpers to the IA-32 Lithium |
| 2327 // instruction sequence builder. | 2351 // instruction sequence builder. |
| 2328 HValue* LeastConstantOperand() { | 2352 HValue* LeastConstantOperand() { |
| 2329 if (IsCommutative() && left()->IsConstant()) return right(); | 2353 if (IsCommutative() && left()->IsConstant()) return right(); |
| 2330 return left(); | 2354 return left(); |
| 2331 } | 2355 } |
| 2332 HValue* MostConstantOperand() { | 2356 HValue* MostConstantOperand() { |
| 2333 if (IsCommutative() && left()->IsConstant()) return left(); | 2357 if (IsCommutative() && left()->IsConstant()) return left(); |
| 2334 return right(); | 2358 return right(); |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2430 HValue* arguments() { return OperandAt(0); } | 2454 HValue* arguments() { return OperandAt(0); } |
| 2431 HValue* length() { return OperandAt(1); } | 2455 HValue* length() { return OperandAt(1); } |
| 2432 HValue* index() { return OperandAt(2); } | 2456 HValue* index() { return OperandAt(2); } |
| 2433 | 2457 |
| 2434 DECLARE_CONCRETE_INSTRUCTION(AccessArgumentsAt) | 2458 DECLARE_CONCRETE_INSTRUCTION(AccessArgumentsAt) |
| 2435 | 2459 |
| 2436 virtual bool DataEquals(HValue* other) { return true; } | 2460 virtual bool DataEquals(HValue* other) { return true; } |
| 2437 }; | 2461 }; |
| 2438 | 2462 |
| 2439 | 2463 |
| 2440 class HBoundsCheck: public HBinaryOperation { | 2464 class HBoundsCheck: public HTemplateInstruction<2> { |
| 2441 public: | 2465 public: |
| 2442 HBoundsCheck(HValue* index, HValue* length) | 2466 HBoundsCheck(HValue* index, HValue* length) { |
| 2443 : HBinaryOperation(index, length) { | 2467 SetOperandAt(0, index); |
| 2468 SetOperandAt(1, length); | |
| 2444 set_representation(Representation::Integer32()); | 2469 set_representation(Representation::Integer32()); |
| 2445 SetFlag(kUseGVN); | 2470 SetFlag(kUseGVN); |
| 2446 } | 2471 } |
| 2447 | 2472 |
| 2448 virtual Representation RequiredInputRepresentation(int index) const { | 2473 virtual Representation RequiredInputRepresentation(int index) const { |
| 2449 return Representation::Integer32(); | 2474 return Representation::Integer32(); |
| 2450 } | 2475 } |
| 2451 | 2476 |
| 2452 #ifdef DEBUG | 2477 #ifdef DEBUG |
| 2453 virtual void Verify(); | 2478 virtual void Verify(); |
| 2454 #endif | 2479 #endif |
| 2455 | 2480 |
| 2456 HValue* index() { return left(); } | 2481 HValue* index() { return OperandAt(0); } |
| 2457 HValue* length() { return right(); } | 2482 HValue* length() { return OperandAt(1); } |
| 2458 | 2483 |
| 2459 DECLARE_CONCRETE_INSTRUCTION(BoundsCheck) | 2484 DECLARE_CONCRETE_INSTRUCTION(BoundsCheck) |
| 2460 | 2485 |
| 2461 protected: | 2486 protected: |
| 2462 virtual bool DataEquals(HValue* other) { return true; } | 2487 virtual bool DataEquals(HValue* other) { return true; } |
| 2463 }; | 2488 }; |
| 2464 | 2489 |
| 2465 | 2490 |
| 2466 class HBitwiseBinaryOperation: public HBinaryOperation { | 2491 class HBitwiseBinaryOperation: public HBinaryOperation { |
| 2467 public: | 2492 public: |
| 2468 HBitwiseBinaryOperation(HValue* left, HValue* right) | 2493 HBitwiseBinaryOperation(HValue* context, HValue* left, HValue* right) |
| 2469 : HBinaryOperation(left, right) { | 2494 : HBinaryOperation(context, left, right) { |
| 2470 set_representation(Representation::Tagged()); | 2495 set_representation(Representation::Tagged()); |
| 2471 SetFlag(kFlexibleRepresentation); | 2496 SetFlag(kFlexibleRepresentation); |
| 2472 SetAllSideEffects(); | 2497 SetAllSideEffects(); |
| 2473 } | 2498 } |
| 2474 | 2499 |
| 2475 virtual Representation RequiredInputRepresentation(int index) const { | 2500 virtual Representation RequiredInputRepresentation(int index) const { |
| 2476 return representation(); | 2501 if (index == 0) { |
|
Kevin Millikin (Chromium)
2011/06/29 08:36:20
I sort of prefer
return (index == 0) ? Representa
William Hesse
2011/06/29 10:30:21
All changed to
return cond
? value1
: valu
| |
| 2502 return Representation::Tagged(); | |
| 2503 } else { | |
| 2504 return representation(); | |
| 2505 } | |
| 2477 } | 2506 } |
| 2478 | 2507 |
| 2479 virtual void RepresentationChanged(Representation to) { | 2508 virtual void RepresentationChanged(Representation to) { |
| 2480 if (!to.IsTagged()) { | 2509 if (!to.IsTagged()) { |
| 2481 ASSERT(to.IsInteger32()); | 2510 ASSERT(to.IsInteger32()); |
| 2482 ClearAllSideEffects(); | 2511 ClearAllSideEffects(); |
| 2483 SetFlag(kTruncatingToInt32); | 2512 SetFlag(kTruncatingToInt32); |
| 2484 SetFlag(kUseGVN); | 2513 SetFlag(kUseGVN); |
| 2485 } | 2514 } |
| 2486 } | 2515 } |
| 2487 | 2516 |
| 2488 virtual HType CalculateInferredType(); | 2517 virtual HType CalculateInferredType(); |
| 2489 | 2518 |
| 2490 DECLARE_ABSTRACT_INSTRUCTION(BitwiseBinaryOperation) | 2519 DECLARE_ABSTRACT_INSTRUCTION(BitwiseBinaryOperation) |
| 2491 }; | 2520 }; |
| 2492 | 2521 |
| 2493 | 2522 |
| 2494 class HArithmeticBinaryOperation: public HBinaryOperation { | 2523 class HArithmeticBinaryOperation: public HBinaryOperation { |
| 2495 public: | 2524 public: |
| 2496 HArithmeticBinaryOperation(HValue* left, HValue* right) | 2525 HArithmeticBinaryOperation(HValue* context, HValue* left, HValue* right) |
| 2497 : HBinaryOperation(left, right) { | 2526 : HBinaryOperation(context, left, right) { |
| 2498 set_representation(Representation::Tagged()); | 2527 set_representation(Representation::Tagged()); |
| 2499 SetFlag(kFlexibleRepresentation); | 2528 SetFlag(kFlexibleRepresentation); |
| 2500 SetAllSideEffects(); | 2529 SetAllSideEffects(); |
| 2501 } | 2530 } |
| 2502 | 2531 |
| 2503 virtual void RepresentationChanged(Representation to) { | 2532 virtual void RepresentationChanged(Representation to) { |
| 2504 if (!to.IsTagged()) { | 2533 if (!to.IsTagged()) { |
| 2505 ClearAllSideEffects(); | 2534 ClearAllSideEffects(); |
| 2506 SetFlag(kUseGVN); | 2535 SetFlag(kUseGVN); |
| 2507 } | 2536 } |
| 2508 } | 2537 } |
| 2509 | 2538 |
| 2510 virtual HType CalculateInferredType(); | 2539 virtual HType CalculateInferredType(); |
| 2511 virtual Representation RequiredInputRepresentation(int index) const { | 2540 virtual Representation RequiredInputRepresentation(int index) const { |
| 2512 return representation(); | 2541 if (index == 0) { |
| 2542 return Representation::Tagged(); | |
| 2543 } else { | |
| 2544 return representation(); | |
| 2545 } | |
| 2513 } | 2546 } |
| 2514 virtual Representation InferredRepresentation() { | 2547 virtual Representation InferredRepresentation() { |
| 2515 if (left()->representation().Equals(right()->representation())) { | 2548 if (left()->representation().Equals(right()->representation())) { |
| 2516 return left()->representation(); | 2549 return left()->representation(); |
| 2517 } | 2550 } |
| 2518 return HValue::InferredRepresentation(); | 2551 return HValue::InferredRepresentation(); |
| 2519 } | 2552 } |
| 2520 }; | 2553 }; |
| 2521 | 2554 |
| 2522 | 2555 |
| 2523 class HCompare: public HBinaryOperation { | 2556 class HCompare: public HBinaryOperation { |
| 2524 public: | 2557 public: |
| 2525 HCompare(HValue* left, HValue* right, Token::Value token) | 2558 HCompare(HValue* context, HValue* left, HValue* right, Token::Value token) |
| 2526 : HBinaryOperation(left, right), token_(token) { | 2559 : HBinaryOperation(context, left, right), token_(token) { |
| 2527 ASSERT(Token::IsCompareOp(token)); | 2560 ASSERT(Token::IsCompareOp(token)); |
| 2528 set_representation(Representation::Tagged()); | 2561 set_representation(Representation::Tagged()); |
| 2529 SetAllSideEffects(); | 2562 SetAllSideEffects(); |
| 2530 } | 2563 } |
| 2531 | 2564 |
| 2532 void SetInputRepresentation(Representation r); | 2565 void SetInputRepresentation(Representation r); |
| 2533 | 2566 |
| 2534 virtual bool EmitAtUses() { | 2567 virtual bool EmitAtUses() { |
| 2535 return !HasSideEffects() && !HasMultipleUses(); | 2568 return !HasSideEffects() && !HasMultipleUses(); |
| 2536 } | 2569 } |
| 2537 | 2570 |
| 2538 virtual Representation RequiredInputRepresentation(int index) const { | 2571 virtual Representation RequiredInputRepresentation(int index) const { |
| 2539 return input_representation_; | 2572 if (index == 0) { |
| 2573 return Representation::Tagged(); | |
| 2574 } else { | |
| 2575 return input_representation_; | |
| 2576 } | |
| 2540 } | 2577 } |
| 2541 Representation GetInputRepresentation() const { | 2578 Representation GetInputRepresentation() const { |
| 2542 return input_representation_; | 2579 return input_representation_; |
| 2543 } | 2580 } |
| 2544 Token::Value token() const { return token_; } | 2581 Token::Value token() const { return token_; } |
| 2545 virtual void PrintDataTo(StringStream* stream); | 2582 virtual void PrintDataTo(StringStream* stream); |
| 2546 | 2583 |
| 2547 virtual HType CalculateInferredType(); | 2584 virtual HType CalculateInferredType(); |
| 2548 | 2585 |
| 2549 virtual intptr_t Hashcode() { | 2586 virtual intptr_t Hashcode() { |
| 2550 return HValue::Hashcode() * 7 + token_; | 2587 return HValue::Hashcode() * 7 + token_; |
| 2551 } | 2588 } |
| 2552 | 2589 |
| 2553 DECLARE_CONCRETE_INSTRUCTION(Compare) | 2590 DECLARE_CONCRETE_INSTRUCTION(Compare) |
| 2554 | 2591 |
| 2555 protected: | 2592 protected: |
| 2556 virtual bool DataEquals(HValue* other) { | 2593 virtual bool DataEquals(HValue* other) { |
| 2557 HCompare* comp = HCompare::cast(other); | 2594 HCompare* comp = HCompare::cast(other); |
| 2558 return token_ == comp->token(); | 2595 return token_ == comp->token(); |
| 2559 } | 2596 } |
| 2560 | 2597 |
| 2561 private: | 2598 private: |
| 2562 Representation input_representation_; | 2599 Representation input_representation_; |
| 2563 Token::Value token_; | 2600 Token::Value token_; |
| 2564 }; | 2601 }; |
| 2565 | 2602 |
| 2566 | 2603 |
| 2567 class HCompareObjectEq: public HBinaryOperation { | 2604 class HCompareObjectEq: public HTemplateInstruction<2> { |
| 2568 public: | 2605 public: |
| 2569 HCompareObjectEq(HValue* left, HValue* right) | 2606 HCompareObjectEq(HValue* left, HValue* right) { |
| 2570 : HBinaryOperation(left, right) { | 2607 SetOperandAt(0, left); |
| 2608 SetOperandAt(1, right); | |
| 2571 set_representation(Representation::Tagged()); | 2609 set_representation(Representation::Tagged()); |
| 2572 SetFlag(kUseGVN); | 2610 SetFlag(kUseGVN); |
| 2573 SetFlag(kDependsOnMaps); | 2611 SetFlag(kDependsOnMaps); |
| 2574 } | 2612 } |
| 2575 | 2613 |
| 2614 HValue* left() { return OperandAt(0); } | |
| 2615 HValue* right() { return OperandAt(1); } | |
| 2616 | |
| 2576 virtual bool EmitAtUses() { | 2617 virtual bool EmitAtUses() { |
| 2577 return !HasSideEffects() && !HasMultipleUses(); | 2618 return !HasSideEffects() && !HasMultipleUses(); |
| 2578 } | 2619 } |
| 2579 | 2620 |
| 2580 virtual Representation RequiredInputRepresentation(int index) const { | 2621 virtual Representation RequiredInputRepresentation(int index) const { |
| 2581 return Representation::Tagged(); | 2622 return Representation::Tagged(); |
| 2582 } | 2623 } |
| 2583 virtual HType CalculateInferredType(); | 2624 virtual HType CalculateInferredType(); |
| 2584 | 2625 |
| 2585 DECLARE_CONCRETE_INSTRUCTION(CompareObjectEq) | 2626 DECLARE_CONCRETE_INSTRUCTION(CompareObjectEq) |
| 2586 | 2627 |
| 2587 protected: | 2628 protected: |
| 2588 virtual bool DataEquals(HValue* other) { return true; } | 2629 virtual bool DataEquals(HValue* other) { return true; } |
| 2589 }; | 2630 }; |
| 2590 | 2631 |
| 2591 | 2632 |
| 2592 class HCompareConstantEq: public HUnaryOperation { | 2633 class HCompareConstantEq: public HUnaryOperation { |
| 2593 public: | 2634 public: |
| 2594 HCompareConstantEq(HValue* left, int right, Token::Value op) | 2635 HCompareConstantEq(HValue* left, int right, Token::Value op) |
| 2595 : HUnaryOperation(left), op_(op), right_(right) { | 2636 : HUnaryOperation(left), op_(op), right_(right) { |
| 2596 ASSERT(op == Token::EQ_STRICT); | 2637 ASSERT(op == Token::EQ_STRICT); |
| 2597 set_representation(Representation::Tagged()); | 2638 set_representation(Representation::Tagged()); |
| 2598 SetFlag(kUseGVN); | 2639 SetFlag(kUseGVN); |
| 2599 } | 2640 } |
| 2600 | 2641 |
| 2601 Token::Value op() const { return op_; } | 2642 Token::Value op() const { return op_; } |
| 2602 int right() const { return right_; } | 2643 int right() const { return right_; } |
| 2644 HValue* left() { return value(); } | |
|
Kevin Millikin (Chromium)
2011/06/29 08:36:20
It might make sense to define left() before right(
William Hesse
2011/06/29 10:30:21
Done.
| |
| 2603 | 2645 |
| 2604 virtual bool EmitAtUses() { | 2646 virtual bool EmitAtUses() { |
| 2605 return !HasSideEffects() && !HasMultipleUses(); | 2647 return !HasSideEffects() && !HasMultipleUses(); |
| 2606 } | 2648 } |
| 2607 | 2649 |
| 2608 virtual Representation RequiredInputRepresentation(int index) const { | 2650 virtual Representation RequiredInputRepresentation(int index) const { |
| 2609 return Representation::Integer32(); | 2651 return Representation::Integer32(); |
| 2610 } | 2652 } |
| 2611 | 2653 |
| 2612 virtual HType CalculateInferredType() { return HType::Boolean(); } | 2654 virtual HType CalculateInferredType() { return HType::Boolean(); } |
| (...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2816 virtual bool DataEquals(HValue* other) { | 2858 virtual bool DataEquals(HValue* other) { |
| 2817 HTypeofIs* b = HTypeofIs::cast(other); | 2859 HTypeofIs* b = HTypeofIs::cast(other); |
| 2818 return type_literal_.is_identical_to(b->type_literal_); | 2860 return type_literal_.is_identical_to(b->type_literal_); |
| 2819 } | 2861 } |
| 2820 | 2862 |
| 2821 private: | 2863 private: |
| 2822 Handle<String> type_literal_; | 2864 Handle<String> type_literal_; |
| 2823 }; | 2865 }; |
| 2824 | 2866 |
| 2825 | 2867 |
| 2826 class HInstanceOf: public HTemplateInstruction<3> { | 2868 class HInstanceOf: public HBinaryOperation { |
| 2827 public: | 2869 public: |
| 2828 HInstanceOf(HValue* context, HValue* left, HValue* right) { | 2870 HInstanceOf(HValue* context, HValue* left, HValue* right) |
| 2829 SetOperandAt(0, context); | 2871 : HBinaryOperation(context, left, right) { |
| 2830 SetOperandAt(1, left); | |
| 2831 SetOperandAt(2, right); | |
| 2832 set_representation(Representation::Tagged()); | 2872 set_representation(Representation::Tagged()); |
| 2833 SetAllSideEffects(); | 2873 SetAllSideEffects(); |
| 2834 } | 2874 } |
| 2835 | 2875 |
| 2836 HValue* context() { return OperandAt(0); } | |
| 2837 HValue* left() { return OperandAt(1); } | |
| 2838 HValue* right() { return OperandAt(2); } | |
| 2839 | |
| 2840 virtual Representation RequiredInputRepresentation(int index) const { | 2876 virtual Representation RequiredInputRepresentation(int index) const { |
| 2841 return Representation::Tagged(); | 2877 return Representation::Tagged(); |
| 2842 } | 2878 } |
| 2843 | 2879 |
| 2844 virtual HType CalculateInferredType(); | 2880 virtual HType CalculateInferredType(); |
| 2845 | 2881 |
| 2846 virtual void PrintDataTo(StringStream* stream); | 2882 virtual void PrintDataTo(StringStream* stream); |
| 2847 | 2883 |
| 2848 DECLARE_CONCRETE_INSTRUCTION(InstanceOf) | 2884 DECLARE_CONCRETE_INSTRUCTION(InstanceOf) |
| 2849 }; | 2885 }; |
| 2850 | 2886 |
| 2851 | 2887 |
| 2852 class HInstanceOfKnownGlobal: public HUnaryOperation { | 2888 class HInstanceOfKnownGlobal: public HTemplateInstruction<2> { |
| 2853 public: | 2889 public: |
| 2854 HInstanceOfKnownGlobal(HValue* left, Handle<JSFunction> right) | 2890 HInstanceOfKnownGlobal(HValue* context, |
| 2855 : HUnaryOperation(left), function_(right) { | 2891 HValue* left, |
| 2892 Handle<JSFunction> right) | |
| 2893 : function_(right) { | |
| 2894 SetOperandAt(0, context); | |
| 2895 SetOperandAt(1, left); | |
| 2856 set_representation(Representation::Tagged()); | 2896 set_representation(Representation::Tagged()); |
| 2857 SetAllSideEffects(); | 2897 SetAllSideEffects(); |
| 2858 } | 2898 } |
| 2859 | 2899 |
| 2900 HValue* context() { return OperandAt(0); } | |
| 2901 HValue* left() { return OperandAt(1); } | |
| 2860 Handle<JSFunction> function() { return function_; } | 2902 Handle<JSFunction> function() { return function_; } |
| 2861 | 2903 |
| 2862 virtual Representation RequiredInputRepresentation(int index) const { | 2904 virtual Representation RequiredInputRepresentation(int index) const { |
| 2863 return Representation::Tagged(); | 2905 return Representation::Tagged(); |
| 2864 } | 2906 } |
| 2865 | 2907 |
| 2866 virtual HType CalculateInferredType(); | 2908 virtual HType CalculateInferredType(); |
| 2867 | 2909 |
| 2868 DECLARE_CONCRETE_INSTRUCTION(InstanceOfKnownGlobal) | 2910 DECLARE_CONCRETE_INSTRUCTION(InstanceOfKnownGlobal) |
| 2869 | 2911 |
| 2870 private: | 2912 private: |
| 2871 Handle<JSFunction> function_; | 2913 Handle<JSFunction> function_; |
| 2872 }; | 2914 }; |
| 2873 | 2915 |
| 2874 | 2916 |
| 2875 class HPower: public HBinaryOperation { | 2917 class HPower: public HTemplateInstruction<2> { |
| 2876 public: | 2918 public: |
| 2877 HPower(HValue* left, HValue* right) | 2919 HPower(HValue* left, HValue* right) { |
| 2878 : HBinaryOperation(left, right) { | 2920 SetOperandAt(0, left); |
| 2921 SetOperandAt(1, right); | |
| 2879 set_representation(Representation::Double()); | 2922 set_representation(Representation::Double()); |
| 2880 SetFlag(kUseGVN); | 2923 SetFlag(kUseGVN); |
| 2881 } | 2924 } |
| 2882 | 2925 |
| 2926 HValue* left() { return OperandAt(0); } | |
| 2927 HValue* right() { return OperandAt(1); } | |
| 2928 | |
| 2883 virtual Representation RequiredInputRepresentation(int index) const { | 2929 virtual Representation RequiredInputRepresentation(int index) const { |
| 2884 return (index == 1) ? Representation::None() : Representation::Double(); | 2930 if (index == 0) { |
| 2931 return Representation::Double(); | |
| 2932 } else { | |
| 2933 return Representation::None(); | |
| 2934 } | |
| 2885 } | 2935 } |
| 2886 | 2936 |
| 2887 DECLARE_CONCRETE_INSTRUCTION(Power) | 2937 DECLARE_CONCRETE_INSTRUCTION(Power) |
| 2888 | 2938 |
| 2889 protected: | 2939 protected: |
| 2890 virtual bool DataEquals(HValue* other) { return true; } | 2940 virtual bool DataEquals(HValue* other) { return true; } |
| 2891 }; | 2941 }; |
| 2892 | 2942 |
| 2893 | 2943 |
| 2894 class HAdd: public HArithmeticBinaryOperation { | 2944 class HAdd: public HArithmeticBinaryOperation { |
| 2895 public: | 2945 public: |
| 2896 HAdd(HValue* left, HValue* right) : HArithmeticBinaryOperation(left, right) { | 2946 HAdd(HValue* context, HValue* left, HValue* right) |
| 2947 : HArithmeticBinaryOperation(context, left, right) { | |
| 2897 SetFlag(kCanOverflow); | 2948 SetFlag(kCanOverflow); |
| 2898 } | 2949 } |
| 2899 | 2950 |
| 2900 // Add is only commutative if two integer values are added and not if two | 2951 // Add is only commutative if two integer values are added and not if two |
| 2901 // tagged values are added (because it might be a String concatenation). | 2952 // tagged values are added (because it might be a String concatenation). |
| 2902 virtual bool IsCommutative() const { | 2953 virtual bool IsCommutative() const { |
| 2903 return !representation().IsTagged(); | 2954 return !representation().IsTagged(); |
| 2904 } | 2955 } |
| 2905 | 2956 |
| 2906 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); | 2957 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); |
| 2907 | 2958 |
| 2908 virtual HType CalculateInferredType(); | 2959 virtual HType CalculateInferredType(); |
| 2909 | 2960 |
| 2910 DECLARE_CONCRETE_INSTRUCTION(Add) | 2961 DECLARE_CONCRETE_INSTRUCTION(Add) |
| 2911 | 2962 |
| 2912 protected: | 2963 protected: |
| 2913 virtual bool DataEquals(HValue* other) { return true; } | 2964 virtual bool DataEquals(HValue* other) { return true; } |
| 2914 | 2965 |
| 2915 virtual Range* InferRange(); | 2966 virtual Range* InferRange(); |
| 2916 }; | 2967 }; |
| 2917 | 2968 |
| 2918 | 2969 |
| 2919 class HSub: public HArithmeticBinaryOperation { | 2970 class HSub: public HArithmeticBinaryOperation { |
| 2920 public: | 2971 public: |
| 2921 HSub(HValue* left, HValue* right) : HArithmeticBinaryOperation(left, right) { | 2972 HSub(HValue* context, HValue* left, HValue* right) |
| 2973 : HArithmeticBinaryOperation(context, left, right) { | |
| 2922 SetFlag(kCanOverflow); | 2974 SetFlag(kCanOverflow); |
| 2923 } | 2975 } |
| 2924 | 2976 |
| 2925 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); | 2977 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); |
| 2926 | 2978 |
| 2927 DECLARE_CONCRETE_INSTRUCTION(Sub) | 2979 DECLARE_CONCRETE_INSTRUCTION(Sub) |
| 2928 | 2980 |
| 2929 protected: | 2981 protected: |
| 2930 virtual bool DataEquals(HValue* other) { return true; } | 2982 virtual bool DataEquals(HValue* other) { return true; } |
| 2931 | 2983 |
| 2932 virtual Range* InferRange(); | 2984 virtual Range* InferRange(); |
| 2933 }; | 2985 }; |
| 2934 | 2986 |
| 2935 | 2987 |
| 2936 class HMul: public HArithmeticBinaryOperation { | 2988 class HMul: public HArithmeticBinaryOperation { |
| 2937 public: | 2989 public: |
| 2938 HMul(HValue* left, HValue* right) : HArithmeticBinaryOperation(left, right) { | 2990 HMul(HValue* context, HValue* left, HValue* right) |
| 2991 : HArithmeticBinaryOperation(context, left, right) { | |
| 2939 SetFlag(kCanOverflow); | 2992 SetFlag(kCanOverflow); |
| 2940 } | 2993 } |
| 2941 | 2994 |
| 2942 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); | 2995 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); |
| 2943 | 2996 |
| 2944 // Only commutative if it is certain that not two objects are multiplicated. | 2997 // Only commutative if it is certain that not two objects are multiplicated. |
| 2945 virtual bool IsCommutative() const { | 2998 virtual bool IsCommutative() const { |
| 2946 return !representation().IsTagged(); | 2999 return !representation().IsTagged(); |
| 2947 } | 3000 } |
| 2948 | 3001 |
| 2949 DECLARE_CONCRETE_INSTRUCTION(Mul) | 3002 DECLARE_CONCRETE_INSTRUCTION(Mul) |
| 2950 | 3003 |
| 2951 protected: | 3004 protected: |
| 2952 virtual bool DataEquals(HValue* other) { return true; } | 3005 virtual bool DataEquals(HValue* other) { return true; } |
| 2953 | 3006 |
| 2954 virtual Range* InferRange(); | 3007 virtual Range* InferRange(); |
| 2955 }; | 3008 }; |
| 2956 | 3009 |
| 2957 | 3010 |
| 2958 class HMod: public HArithmeticBinaryOperation { | 3011 class HMod: public HArithmeticBinaryOperation { |
| 2959 public: | 3012 public: |
| 2960 HMod(HValue* left, HValue* right) : HArithmeticBinaryOperation(left, right) { | 3013 HMod(HValue* context, HValue* left, HValue* right) |
| 3014 : HArithmeticBinaryOperation(context, left, right) { | |
| 2961 SetFlag(kCanBeDivByZero); | 3015 SetFlag(kCanBeDivByZero); |
| 2962 } | 3016 } |
| 2963 | 3017 |
| 2964 bool HasPowerOf2Divisor() { | 3018 bool HasPowerOf2Divisor() { |
| 2965 if (right()->IsConstant() && | 3019 if (right()->IsConstant() && |
| 2966 HConstant::cast(right())->HasInteger32Value()) { | 3020 HConstant::cast(right())->HasInteger32Value()) { |
| 2967 int32_t value = HConstant::cast(right())->Integer32Value(); | 3021 int32_t value = HConstant::cast(right())->Integer32Value(); |
| 2968 return value != 0 && (IsPowerOf2(value) || IsPowerOf2(-value)); | 3022 return value != 0 && (IsPowerOf2(value) || IsPowerOf2(-value)); |
| 2969 } | 3023 } |
| 2970 | 3024 |
| 2971 return false; | 3025 return false; |
| 2972 } | 3026 } |
| 2973 | 3027 |
| 2974 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); | 3028 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); |
| 2975 | 3029 |
| 2976 DECLARE_CONCRETE_INSTRUCTION(Mod) | 3030 DECLARE_CONCRETE_INSTRUCTION(Mod) |
| 2977 | 3031 |
| 2978 protected: | 3032 protected: |
| 2979 virtual bool DataEquals(HValue* other) { return true; } | 3033 virtual bool DataEquals(HValue* other) { return true; } |
| 2980 | 3034 |
| 2981 virtual Range* InferRange(); | 3035 virtual Range* InferRange(); |
| 2982 }; | 3036 }; |
| 2983 | 3037 |
| 2984 | 3038 |
| 2985 class HDiv: public HArithmeticBinaryOperation { | 3039 class HDiv: public HArithmeticBinaryOperation { |
| 2986 public: | 3040 public: |
| 2987 HDiv(HValue* left, HValue* right) : HArithmeticBinaryOperation(left, right) { | 3041 HDiv(HValue* context, HValue* left, HValue* right) |
| 3042 : HArithmeticBinaryOperation(context, left, right) { | |
| 2988 SetFlag(kCanBeDivByZero); | 3043 SetFlag(kCanBeDivByZero); |
| 2989 SetFlag(kCanOverflow); | 3044 SetFlag(kCanOverflow); |
| 2990 } | 3045 } |
| 2991 | 3046 |
| 2992 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); | 3047 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); |
| 2993 | 3048 |
| 2994 DECLARE_CONCRETE_INSTRUCTION(Div) | 3049 DECLARE_CONCRETE_INSTRUCTION(Div) |
| 2995 | 3050 |
| 2996 protected: | 3051 protected: |
| 2997 virtual bool DataEquals(HValue* other) { return true; } | 3052 virtual bool DataEquals(HValue* other) { return true; } |
| 2998 | 3053 |
| 2999 virtual Range* InferRange(); | 3054 virtual Range* InferRange(); |
| 3000 }; | 3055 }; |
| 3001 | 3056 |
| 3002 | 3057 |
| 3003 class HBitAnd: public HBitwiseBinaryOperation { | 3058 class HBitAnd: public HBitwiseBinaryOperation { |
| 3004 public: | 3059 public: |
| 3005 HBitAnd(HValue* left, HValue* right) | 3060 HBitAnd(HValue* context, HValue* left, HValue* right) |
| 3006 : HBitwiseBinaryOperation(left, right) { } | 3061 : HBitwiseBinaryOperation(context, left, right) { } |
| 3007 | 3062 |
| 3008 virtual bool IsCommutative() const { return true; } | 3063 virtual bool IsCommutative() const { return true; } |
| 3009 virtual HType CalculateInferredType(); | 3064 virtual HType CalculateInferredType(); |
| 3010 | 3065 |
| 3011 DECLARE_CONCRETE_INSTRUCTION(BitAnd) | 3066 DECLARE_CONCRETE_INSTRUCTION(BitAnd) |
| 3012 | 3067 |
| 3013 protected: | 3068 protected: |
| 3014 virtual bool DataEquals(HValue* other) { return true; } | 3069 virtual bool DataEquals(HValue* other) { return true; } |
| 3015 | 3070 |
| 3016 virtual Range* InferRange(); | 3071 virtual Range* InferRange(); |
| 3017 }; | 3072 }; |
| 3018 | 3073 |
| 3019 | 3074 |
| 3020 class HBitXor: public HBitwiseBinaryOperation { | 3075 class HBitXor: public HBitwiseBinaryOperation { |
| 3021 public: | 3076 public: |
| 3022 HBitXor(HValue* left, HValue* right) | 3077 HBitXor(HValue* context, HValue* left, HValue* right) |
| 3023 : HBitwiseBinaryOperation(left, right) { } | 3078 : HBitwiseBinaryOperation(context, left, right) { } |
| 3024 | 3079 |
| 3025 virtual bool IsCommutative() const { return true; } | 3080 virtual bool IsCommutative() const { return true; } |
| 3026 virtual HType CalculateInferredType(); | 3081 virtual HType CalculateInferredType(); |
| 3027 | 3082 |
| 3028 DECLARE_CONCRETE_INSTRUCTION(BitXor) | 3083 DECLARE_CONCRETE_INSTRUCTION(BitXor) |
| 3029 | 3084 |
| 3030 protected: | 3085 protected: |
| 3031 virtual bool DataEquals(HValue* other) { return true; } | 3086 virtual bool DataEquals(HValue* other) { return true; } |
| 3032 }; | 3087 }; |
| 3033 | 3088 |
| 3034 | 3089 |
| 3035 class HBitOr: public HBitwiseBinaryOperation { | 3090 class HBitOr: public HBitwiseBinaryOperation { |
| 3036 public: | 3091 public: |
| 3037 HBitOr(HValue* left, HValue* right) | 3092 HBitOr(HValue* context, HValue* left, HValue* right) |
| 3038 : HBitwiseBinaryOperation(left, right) { } | 3093 : HBitwiseBinaryOperation(context, left, right) { } |
| 3039 | 3094 |
| 3040 virtual bool IsCommutative() const { return true; } | 3095 virtual bool IsCommutative() const { return true; } |
| 3041 virtual HType CalculateInferredType(); | 3096 virtual HType CalculateInferredType(); |
| 3042 | 3097 |
| 3043 DECLARE_CONCRETE_INSTRUCTION(BitOr) | 3098 DECLARE_CONCRETE_INSTRUCTION(BitOr) |
| 3044 | 3099 |
| 3045 protected: | 3100 protected: |
| 3046 virtual bool DataEquals(HValue* other) { return true; } | 3101 virtual bool DataEquals(HValue* other) { return true; } |
| 3047 | 3102 |
| 3048 virtual Range* InferRange(); | 3103 virtual Range* InferRange(); |
| 3049 }; | 3104 }; |
| 3050 | 3105 |
| 3051 | 3106 |
| 3052 class HShl: public HBitwiseBinaryOperation { | 3107 class HShl: public HBitwiseBinaryOperation { |
| 3053 public: | 3108 public: |
| 3054 HShl(HValue* left, HValue* right) | 3109 HShl(HValue* context, HValue* left, HValue* right) |
| 3055 : HBitwiseBinaryOperation(left, right) { } | 3110 : HBitwiseBinaryOperation(context, left, right) { } |
| 3056 | 3111 |
| 3057 virtual Range* InferRange(); | 3112 virtual Range* InferRange(); |
| 3058 virtual HType CalculateInferredType(); | 3113 virtual HType CalculateInferredType(); |
| 3059 | 3114 |
| 3060 DECLARE_CONCRETE_INSTRUCTION(Shl) | 3115 DECLARE_CONCRETE_INSTRUCTION(Shl) |
| 3061 | 3116 |
| 3062 protected: | 3117 protected: |
| 3063 virtual bool DataEquals(HValue* other) { return true; } | 3118 virtual bool DataEquals(HValue* other) { return true; } |
| 3064 }; | 3119 }; |
| 3065 | 3120 |
| 3066 | 3121 |
| 3067 class HShr: public HBitwiseBinaryOperation { | 3122 class HShr: public HBitwiseBinaryOperation { |
| 3068 public: | 3123 public: |
| 3069 HShr(HValue* left, HValue* right) | 3124 HShr(HValue* context, HValue* left, HValue* right) |
| 3070 : HBitwiseBinaryOperation(left, right) { } | 3125 : HBitwiseBinaryOperation(context, left, right) { } |
| 3071 | 3126 |
| 3072 virtual HType CalculateInferredType(); | 3127 virtual HType CalculateInferredType(); |
| 3073 | 3128 |
| 3074 DECLARE_CONCRETE_INSTRUCTION(Shr) | 3129 DECLARE_CONCRETE_INSTRUCTION(Shr) |
| 3075 | 3130 |
| 3076 protected: | 3131 protected: |
| 3077 virtual bool DataEquals(HValue* other) { return true; } | 3132 virtual bool DataEquals(HValue* other) { return true; } |
| 3078 }; | 3133 }; |
| 3079 | 3134 |
| 3080 | 3135 |
| 3081 class HSar: public HBitwiseBinaryOperation { | 3136 class HSar: public HBitwiseBinaryOperation { |
| 3082 public: | 3137 public: |
| 3083 HSar(HValue* left, HValue* right) | 3138 HSar(HValue* context, HValue* left, HValue* right) |
| 3084 : HBitwiseBinaryOperation(left, right) { } | 3139 : HBitwiseBinaryOperation(context, left, right) { } |
| 3085 | 3140 |
| 3086 virtual Range* InferRange(); | 3141 virtual Range* InferRange(); |
| 3087 virtual HType CalculateInferredType(); | 3142 virtual HType CalculateInferredType(); |
| 3088 | 3143 |
| 3089 DECLARE_CONCRETE_INSTRUCTION(Sar) | 3144 DECLARE_CONCRETE_INSTRUCTION(Sar) |
| 3090 | 3145 |
| 3091 protected: | 3146 protected: |
| 3092 virtual bool DataEquals(HValue* other) { return true; } | 3147 virtual bool DataEquals(HValue* other) { return true; } |
| 3093 }; | 3148 }; |
| 3094 | 3149 |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3208 HLoadGlobalCell* b = HLoadGlobalCell::cast(other); | 3263 HLoadGlobalCell* b = HLoadGlobalCell::cast(other); |
| 3209 return cell_.is_identical_to(b->cell()); | 3264 return cell_.is_identical_to(b->cell()); |
| 3210 } | 3265 } |
| 3211 | 3266 |
| 3212 private: | 3267 private: |
| 3213 Handle<JSGlobalPropertyCell> cell_; | 3268 Handle<JSGlobalPropertyCell> cell_; |
| 3214 bool check_hole_value_; | 3269 bool check_hole_value_; |
| 3215 }; | 3270 }; |
| 3216 | 3271 |
| 3217 | 3272 |
| 3218 class HLoadGlobalGeneric: public HBinaryOperation { | 3273 class HLoadGlobalGeneric: public HTemplateInstruction<2> { |
| 3219 public: | 3274 public: |
| 3220 HLoadGlobalGeneric(HValue* context, | 3275 HLoadGlobalGeneric(HValue* context, |
| 3221 HValue* global_object, | 3276 HValue* global_object, |
| 3222 Handle<Object> name, | 3277 Handle<Object> name, |
| 3223 bool for_typeof) | 3278 bool for_typeof) |
| 3224 : HBinaryOperation(context, global_object), | 3279 : name_(name), |
| 3225 name_(name), | |
| 3226 for_typeof_(for_typeof) { | 3280 for_typeof_(for_typeof) { |
| 3281 SetOperandAt(0, context); | |
| 3282 SetOperandAt(1, global_object); | |
| 3227 set_representation(Representation::Tagged()); | 3283 set_representation(Representation::Tagged()); |
| 3228 SetAllSideEffects(); | 3284 SetAllSideEffects(); |
| 3229 } | 3285 } |
| 3230 | 3286 |
| 3231 HValue* context() { return OperandAt(0); } | 3287 HValue* context() { return OperandAt(0); } |
| 3232 HValue* global_object() { return OperandAt(1); } | 3288 HValue* global_object() { return OperandAt(1); } |
| 3233 Handle<Object> name() const { return name_; } | 3289 Handle<Object> name() const { return name_; } |
| 3234 bool for_typeof() const { return for_typeof_; } | 3290 bool for_typeof() const { return for_typeof_; } |
| 3235 | 3291 |
| 3236 virtual void PrintDataTo(StringStream* stream); | 3292 virtual void PrintDataTo(StringStream* stream); |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3339 int slot_index_; | 3395 int slot_index_; |
| 3340 }; | 3396 }; |
| 3341 | 3397 |
| 3342 | 3398 |
| 3343 static inline bool StoringValueNeedsWriteBarrier(HValue* value) { | 3399 static inline bool StoringValueNeedsWriteBarrier(HValue* value) { |
| 3344 return !value->type().IsSmi() && | 3400 return !value->type().IsSmi() && |
| 3345 !(value->IsConstant() && HConstant::cast(value)->InOldSpace()); | 3401 !(value->IsConstant() && HConstant::cast(value)->InOldSpace()); |
| 3346 } | 3402 } |
| 3347 | 3403 |
| 3348 | 3404 |
| 3349 class HStoreContextSlot: public HBinaryOperation { | 3405 class HStoreContextSlot: public HTemplateInstruction<2> { |
| 3350 public: | 3406 public: |
| 3351 HStoreContextSlot(HValue* context, int slot_index, HValue* value) | 3407 HStoreContextSlot(HValue* context, int slot_index, HValue* value) |
| 3352 : HBinaryOperation(context, value), slot_index_(slot_index) { | 3408 : slot_index_(slot_index) { |
| 3409 SetOperandAt(0, context); | |
| 3410 SetOperandAt(1, value); | |
| 3353 SetFlag(kChangesContextSlots); | 3411 SetFlag(kChangesContextSlots); |
| 3354 } | 3412 } |
| 3355 | 3413 |
| 3356 HValue* context() { return OperandAt(0); } | 3414 HValue* context() { return OperandAt(0); } |
| 3357 HValue* value() { return OperandAt(1); } | 3415 HValue* value() { return OperandAt(1); } |
| 3358 int slot_index() const { return slot_index_; } | 3416 int slot_index() const { return slot_index_; } |
| 3359 | 3417 |
| 3360 bool NeedsWriteBarrier() { | 3418 bool NeedsWriteBarrier() { |
| 3361 return StoringValueNeedsWriteBarrier(value()); | 3419 return StoringValueNeedsWriteBarrier(value()); |
| 3362 } | 3420 } |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3406 HLoadNamedField* b = HLoadNamedField::cast(other); | 3464 HLoadNamedField* b = HLoadNamedField::cast(other); |
| 3407 return is_in_object_ == b->is_in_object_ && offset_ == b->offset_; | 3465 return is_in_object_ == b->is_in_object_ && offset_ == b->offset_; |
| 3408 } | 3466 } |
| 3409 | 3467 |
| 3410 private: | 3468 private: |
| 3411 bool is_in_object_; | 3469 bool is_in_object_; |
| 3412 int offset_; | 3470 int offset_; |
| 3413 }; | 3471 }; |
| 3414 | 3472 |
| 3415 | 3473 |
| 3416 class HLoadNamedFieldPolymorphic: public HUnaryOperation { | 3474 class HLoadNamedFieldPolymorphic: public HTemplateInstruction<2> { |
| 3417 public: | 3475 public: |
| 3418 HLoadNamedFieldPolymorphic(HValue* object, | 3476 HLoadNamedFieldPolymorphic(HValue* context, |
| 3477 HValue* object, | |
| 3419 ZoneMapList* types, | 3478 ZoneMapList* types, |
| 3420 Handle<String> name); | 3479 Handle<String> name); |
| 3421 | 3480 |
| 3422 HValue* object() { return OperandAt(0); } | 3481 HValue* context() { return OperandAt(0); } |
| 3482 HValue* object() { return OperandAt(1); } | |
| 3423 ZoneMapList* types() { return &types_; } | 3483 ZoneMapList* types() { return &types_; } |
| 3424 Handle<String> name() { return name_; } | 3484 Handle<String> name() { return name_; } |
| 3425 bool need_generic() { return need_generic_; } | 3485 bool need_generic() { return need_generic_; } |
| 3426 | 3486 |
| 3427 virtual Representation RequiredInputRepresentation(int index) const { | 3487 virtual Representation RequiredInputRepresentation(int index) const { |
| 3428 return Representation::Tagged(); | 3488 return Representation::Tagged(); |
| 3429 } | 3489 } |
| 3430 | 3490 |
| 3431 DECLARE_CONCRETE_INSTRUCTION(LoadNamedFieldPolymorphic) | 3491 DECLARE_CONCRETE_INSTRUCTION(LoadNamedFieldPolymorphic) |
| 3432 | 3492 |
| 3433 static const int kMaxLoadPolymorphism = 4; | 3493 static const int kMaxLoadPolymorphism = 4; |
| 3434 | 3494 |
| 3435 protected: | 3495 protected: |
| 3436 virtual bool DataEquals(HValue* value); | 3496 virtual bool DataEquals(HValue* value); |
| 3437 | 3497 |
| 3438 private: | 3498 private: |
| 3439 ZoneMapList types_; | 3499 ZoneMapList types_; |
| 3440 Handle<String> name_; | 3500 Handle<String> name_; |
| 3441 bool need_generic_; | 3501 bool need_generic_; |
| 3442 }; | 3502 }; |
| 3443 | 3503 |
| 3444 | 3504 |
| 3445 | 3505 |
| 3446 class HLoadNamedGeneric: public HBinaryOperation { | 3506 class HLoadNamedGeneric: public HTemplateInstruction<2> { |
| 3447 public: | 3507 public: |
| 3448 HLoadNamedGeneric(HValue* context, HValue* object, Handle<Object> name) | 3508 HLoadNamedGeneric(HValue* context, HValue* object, Handle<Object> name) |
| 3449 : HBinaryOperation(context, object), name_(name) { | 3509 : name_(name) { |
| 3510 SetOperandAt(0, context); | |
| 3511 SetOperandAt(1, object); | |
| 3450 set_representation(Representation::Tagged()); | 3512 set_representation(Representation::Tagged()); |
| 3451 SetAllSideEffects(); | 3513 SetAllSideEffects(); |
| 3452 } | 3514 } |
| 3453 | 3515 |
| 3454 HValue* context() { return OperandAt(0); } | 3516 HValue* context() { return OperandAt(0); } |
| 3455 HValue* object() { return OperandAt(1); } | 3517 HValue* object() { return OperandAt(1); } |
| 3456 Handle<Object> name() const { return name_; } | 3518 Handle<Object> name() const { return name_; } |
| 3457 | 3519 |
| 3458 virtual Representation RequiredInputRepresentation(int index) const { | 3520 virtual Representation RequiredInputRepresentation(int index) const { |
| 3459 return Representation::Tagged(); | 3521 return Representation::Tagged(); |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 3481 return Representation::Tagged(); | 3543 return Representation::Tagged(); |
| 3482 } | 3544 } |
| 3483 | 3545 |
| 3484 DECLARE_CONCRETE_INSTRUCTION(LoadFunctionPrototype) | 3546 DECLARE_CONCRETE_INSTRUCTION(LoadFunctionPrototype) |
| 3485 | 3547 |
| 3486 protected: | 3548 protected: |
| 3487 virtual bool DataEquals(HValue* other) { return true; } | 3549 virtual bool DataEquals(HValue* other) { return true; } |
| 3488 }; | 3550 }; |
| 3489 | 3551 |
| 3490 | 3552 |
| 3491 class HLoadKeyedFastElement: public HBinaryOperation { | 3553 class HLoadKeyedFastElement: public HTemplateInstruction<2> { |
| 3492 public: | 3554 public: |
| 3493 HLoadKeyedFastElement(HValue* obj, HValue* key) : HBinaryOperation(obj, key) { | 3555 HLoadKeyedFastElement(HValue* obj, HValue* key) { |
| 3556 SetOperandAt(0, obj); | |
| 3557 SetOperandAt(1, key); | |
| 3494 set_representation(Representation::Tagged()); | 3558 set_representation(Representation::Tagged()); |
| 3495 SetFlag(kDependsOnArrayElements); | 3559 SetFlag(kDependsOnArrayElements); |
| 3496 SetFlag(kUseGVN); | 3560 SetFlag(kUseGVN); |
| 3497 } | 3561 } |
| 3498 | 3562 |
| 3499 HValue* object() { return OperandAt(0); } | 3563 HValue* object() { return OperandAt(0); } |
| 3500 HValue* key() { return OperandAt(1); } | 3564 HValue* key() { return OperandAt(1); } |
| 3501 | 3565 |
| 3502 virtual Representation RequiredInputRepresentation(int index) const { | 3566 virtual Representation RequiredInputRepresentation(int index) const { |
| 3503 // The key is supposed to be Integer32. | 3567 // The key is supposed to be Integer32. |
| 3504 return (index == 1) ? Representation::Integer32() | 3568 return (index == 1) ? Representation::Integer32() |
| 3505 : Representation::Tagged(); | 3569 : Representation::Tagged(); |
| 3506 } | 3570 } |
| 3507 | 3571 |
| 3508 virtual void PrintDataTo(StringStream* stream); | 3572 virtual void PrintDataTo(StringStream* stream); |
| 3509 | 3573 |
| 3510 bool RequiresHoleCheck() const; | 3574 bool RequiresHoleCheck() const; |
| 3511 | 3575 |
| 3512 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedFastElement) | 3576 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedFastElement) |
| 3513 | 3577 |
| 3514 protected: | 3578 protected: |
| 3515 virtual bool DataEquals(HValue* other) { return true; } | 3579 virtual bool DataEquals(HValue* other) { return true; } |
| 3516 }; | 3580 }; |
| 3517 | 3581 |
| 3518 | 3582 |
| 3519 class HLoadKeyedSpecializedArrayElement: public HBinaryOperation { | 3583 class HLoadKeyedSpecializedArrayElement: public HTemplateInstruction<2> { |
| 3520 public: | 3584 public: |
| 3521 HLoadKeyedSpecializedArrayElement(HValue* external_elements, | 3585 HLoadKeyedSpecializedArrayElement(HValue* external_elements, |
| 3522 HValue* key, | 3586 HValue* key, |
| 3523 JSObject::ElementsKind elements_kind) | 3587 JSObject::ElementsKind elements_kind) |
| 3524 : HBinaryOperation(external_elements, key), | 3588 : elements_kind_(elements_kind) { |
| 3525 elements_kind_(elements_kind) { | 3589 SetOperandAt(0, external_elements); |
| 3590 SetOperandAt(1, key); | |
| 3526 if (elements_kind == JSObject::EXTERNAL_FLOAT_ELEMENTS || | 3591 if (elements_kind == JSObject::EXTERNAL_FLOAT_ELEMENTS || |
| 3527 elements_kind == JSObject::EXTERNAL_DOUBLE_ELEMENTS) { | 3592 elements_kind == JSObject::EXTERNAL_DOUBLE_ELEMENTS) { |
| 3528 set_representation(Representation::Double()); | 3593 set_representation(Representation::Double()); |
| 3529 } else { | 3594 } else { |
| 3530 set_representation(Representation::Integer32()); | 3595 set_representation(Representation::Integer32()); |
| 3531 } | 3596 } |
| 3532 SetFlag(kDependsOnSpecializedArrayElements); | 3597 SetFlag(kDependsOnSpecializedArrayElements); |
| 3533 // Native code could change the specialized array. | 3598 // Native code could change the specialized array. |
| 3534 SetFlag(kDependsOnCalls); | 3599 SetFlag(kDependsOnCalls); |
| 3535 SetFlag(kUseGVN); | 3600 SetFlag(kUseGVN); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3580 virtual void PrintDataTo(StringStream* stream); | 3645 virtual void PrintDataTo(StringStream* stream); |
| 3581 | 3646 |
| 3582 virtual Representation RequiredInputRepresentation(int index) const { | 3647 virtual Representation RequiredInputRepresentation(int index) const { |
| 3583 return Representation::Tagged(); | 3648 return Representation::Tagged(); |
| 3584 } | 3649 } |
| 3585 | 3650 |
| 3586 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric) | 3651 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric) |
| 3587 }; | 3652 }; |
| 3588 | 3653 |
| 3589 | 3654 |
| 3590 class HStoreNamedField: public HBinaryOperation { | 3655 class HStoreNamedField: public HTemplateInstruction<2> { |
| 3591 public: | 3656 public: |
| 3592 HStoreNamedField(HValue* obj, | 3657 HStoreNamedField(HValue* obj, |
| 3593 Handle<String> name, | 3658 Handle<String> name, |
| 3594 HValue* val, | 3659 HValue* val, |
| 3595 bool in_object, | 3660 bool in_object, |
| 3596 int offset) | 3661 int offset) |
| 3597 : HBinaryOperation(obj, val), | 3662 : name_(name), |
| 3598 name_(name), | |
| 3599 is_in_object_(in_object), | 3663 is_in_object_(in_object), |
| 3600 offset_(offset) { | 3664 offset_(offset) { |
| 3665 SetOperandAt(0, obj); | |
| 3666 SetOperandAt(1, val); | |
| 3601 if (is_in_object_) { | 3667 if (is_in_object_) { |
| 3602 SetFlag(kChangesInobjectFields); | 3668 SetFlag(kChangesInobjectFields); |
| 3603 } else { | 3669 } else { |
| 3604 SetFlag(kChangesBackingStoreFields); | 3670 SetFlag(kChangesBackingStoreFields); |
| 3605 } | 3671 } |
| 3606 } | 3672 } |
| 3607 | 3673 |
| 3608 DECLARE_CONCRETE_INSTRUCTION(StoreNamedField) | 3674 DECLARE_CONCRETE_INSTRUCTION(StoreNamedField) |
| 3609 | 3675 |
| 3610 virtual Representation RequiredInputRepresentation(int index) const { | 3676 virtual Representation RequiredInputRepresentation(int index) const { |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3768 | 3834 |
| 3769 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedGeneric) | 3835 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedGeneric) |
| 3770 | 3836 |
| 3771 private: | 3837 private: |
| 3772 bool strict_mode_; | 3838 bool strict_mode_; |
| 3773 }; | 3839 }; |
| 3774 | 3840 |
| 3775 | 3841 |
| 3776 class HStringAdd: public HBinaryOperation { | 3842 class HStringAdd: public HBinaryOperation { |
| 3777 public: | 3843 public: |
| 3778 HStringAdd(HValue* left, HValue* right) : HBinaryOperation(left, right) { | 3844 HStringAdd(HValue* context, HValue* left, HValue* right) |
| 3845 : HBinaryOperation(context, left, right) { | |
| 3779 set_representation(Representation::Tagged()); | 3846 set_representation(Representation::Tagged()); |
| 3780 SetFlag(kUseGVN); | 3847 SetFlag(kUseGVN); |
| 3781 SetFlag(kDependsOnMaps); | 3848 SetFlag(kDependsOnMaps); |
| 3782 } | 3849 } |
| 3783 | 3850 |
| 3784 virtual Representation RequiredInputRepresentation(int index) const { | 3851 virtual Representation RequiredInputRepresentation(int index) const { |
| 3785 return Representation::Tagged(); | 3852 return Representation::Tagged(); |
| 3786 } | 3853 } |
| 3787 | 3854 |
| 3788 virtual HType CalculateInferredType() { | 3855 virtual HType CalculateInferredType() { |
| 3789 return HType::String(); | 3856 return HType::String(); |
| 3790 } | 3857 } |
| 3791 | 3858 |
| 3792 DECLARE_CONCRETE_INSTRUCTION(StringAdd) | 3859 DECLARE_CONCRETE_INSTRUCTION(StringAdd) |
| 3793 | 3860 |
| 3794 protected: | 3861 protected: |
| 3795 virtual bool DataEquals(HValue* other) { return true; } | 3862 virtual bool DataEquals(HValue* other) { return true; } |
| 3796 }; | 3863 }; |
| 3797 | 3864 |
| 3798 | 3865 |
| 3799 class HStringCharCodeAt: public HBinaryOperation { | 3866 class HStringCharCodeAt: public HTemplateInstruction<3> { |
| 3800 public: | 3867 public: |
| 3801 HStringCharCodeAt(HValue* string, HValue* index) | 3868 HStringCharCodeAt(HValue* context, HValue* string, HValue* index) { |
| 3802 : HBinaryOperation(string, index) { | 3869 SetOperandAt(0, context); |
| 3870 SetOperandAt(1, string); | |
| 3871 SetOperandAt(2, index); | |
| 3803 set_representation(Representation::Integer32()); | 3872 set_representation(Representation::Integer32()); |
| 3804 SetFlag(kUseGVN); | 3873 SetFlag(kUseGVN); |
| 3805 SetFlag(kDependsOnMaps); | 3874 SetFlag(kDependsOnMaps); |
| 3806 } | 3875 } |
| 3807 | 3876 |
| 3808 virtual Representation RequiredInputRepresentation(int index) const { | 3877 virtual Representation RequiredInputRepresentation(int index) const { |
| 3809 // The index is supposed to be Integer32. | 3878 // The index is supposed to be Integer32. |
| 3810 return (index == 1) ? Representation::Integer32() | 3879 return (index == 2) ? Representation::Integer32() |
| 3811 : Representation::Tagged(); | 3880 : Representation::Tagged(); |
| 3812 } | 3881 } |
| 3813 | 3882 |
| 3814 HValue* string() { return OperandAt(0); } | 3883 HValue* context() { return OperandAt(0); } |
| 3815 HValue* index() { return OperandAt(1); } | 3884 HValue* string() { return OperandAt(1); } |
| 3885 HValue* index() { return OperandAt(2); } | |
| 3816 | 3886 |
| 3817 DECLARE_CONCRETE_INSTRUCTION(StringCharCodeAt) | 3887 DECLARE_CONCRETE_INSTRUCTION(StringCharCodeAt) |
| 3818 | 3888 |
| 3819 protected: | 3889 protected: |
| 3820 virtual bool DataEquals(HValue* other) { return true; } | 3890 virtual bool DataEquals(HValue* other) { return true; } |
| 3821 | 3891 |
| 3822 virtual Range* InferRange() { | 3892 virtual Range* InferRange() { |
| 3823 return new Range(0, String::kMaxUC16CharCode); | 3893 return new Range(0, String::kMaxUC16CharCode); |
| 3824 } | 3894 } |
| 3825 }; | 3895 }; |
| 3826 | 3896 |
| 3827 | 3897 |
| 3828 class HStringCharFromCode: public HUnaryOperation { | 3898 class HStringCharFromCode: public HTemplateInstruction<2> { |
| 3829 public: | 3899 public: |
| 3830 explicit HStringCharFromCode(HValue* char_code) : HUnaryOperation(char_code) { | 3900 explicit HStringCharFromCode(HValue* context, HValue* char_code) { |
| 3831 set_representation(Representation::Tagged()); | 3901 SetOperandAt(0, context); |
| 3902 SetOperandAt(1, char_code); | |
| 3903 set_representation(Representation::Tagged()); | |
| 3832 SetFlag(kUseGVN); | 3904 SetFlag(kUseGVN); |
| 3833 } | 3905 } |
| 3834 | 3906 |
| 3835 virtual Representation RequiredInputRepresentation(int index) const { | 3907 virtual Representation RequiredInputRepresentation(int index) const { |
| 3836 return Representation::Integer32(); | 3908 return Representation::Integer32(); |
|
Kevin Millikin (Chromium)
2011/06/29 08:36:20
Context should be tagged.
| |
| 3837 } | 3909 } |
| 3838 | 3910 |
| 3911 HValue* context() { return OperandAt(0); } | |
| 3912 HValue* value() { return OperandAt(1); } | |
| 3913 | |
| 3839 virtual bool DataEquals(HValue* other) { return true; } | 3914 virtual bool DataEquals(HValue* other) { return true; } |
| 3840 | 3915 |
| 3841 DECLARE_CONCRETE_INSTRUCTION(StringCharFromCode) | 3916 DECLARE_CONCRETE_INSTRUCTION(StringCharFromCode) |
| 3842 }; | 3917 }; |
| 3843 | 3918 |
| 3844 | 3919 |
| 3845 class HStringLength: public HUnaryOperation { | 3920 class HStringLength: public HUnaryOperation { |
| 3846 public: | 3921 public: |
| 3847 explicit HStringLength(HValue* string) : HUnaryOperation(string) { | 3922 explicit HStringLength(HValue* string) : HUnaryOperation(string) { |
| 3848 set_representation(Representation::Tagged()); | 3923 set_representation(Representation::Tagged()); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3880 | 3955 |
| 3881 int literal_index() const { return literal_index_; } | 3956 int literal_index() const { return literal_index_; } |
| 3882 int depth() const { return depth_; } | 3957 int depth() const { return depth_; } |
| 3883 | 3958 |
| 3884 private: | 3959 private: |
| 3885 int literal_index_; | 3960 int literal_index_; |
| 3886 int depth_; | 3961 int depth_; |
| 3887 }; | 3962 }; |
| 3888 | 3963 |
| 3889 | 3964 |
| 3890 class HArrayLiteral: public HMaterializedLiteral<0> { | 3965 class HArrayLiteral: public HMaterializedLiteral<1> { |
| 3891 public: | 3966 public: |
| 3892 HArrayLiteral(Handle<FixedArray> constant_elements, | 3967 HArrayLiteral(HValue* context, |
| 3968 Handle<FixedArray> constant_elements, | |
| 3893 int length, | 3969 int length, |
| 3894 int literal_index, | 3970 int literal_index, |
| 3895 int depth) | 3971 int depth) |
| 3896 : HMaterializedLiteral<0>(literal_index, depth), | 3972 : HMaterializedLiteral<1>(literal_index, depth), |
| 3897 length_(length), | 3973 length_(length), |
| 3898 constant_elements_(constant_elements) {} | 3974 constant_elements_(constant_elements) { |
| 3975 SetOperandAt(0, context); | |
| 3976 } | |
| 3899 | 3977 |
| 3978 HValue* context() { return OperandAt(0); } | |
| 3900 Handle<FixedArray> constant_elements() const { return constant_elements_; } | 3979 Handle<FixedArray> constant_elements() const { return constant_elements_; } |
| 3901 int length() const { return length_; } | 3980 int length() const { return length_; } |
| 3902 | 3981 |
| 3903 bool IsCopyOnWrite() const; | 3982 bool IsCopyOnWrite() const; |
| 3904 | 3983 |
| 3905 virtual Representation RequiredInputRepresentation(int index) const { | 3984 virtual Representation RequiredInputRepresentation(int index) const { |
| 3906 return Representation::None(); | 3985 return Representation::Tagged(); |
| 3907 } | 3986 } |
| 3908 | 3987 |
| 3909 DECLARE_CONCRETE_INSTRUCTION(ArrayLiteral) | 3988 DECLARE_CONCRETE_INSTRUCTION(ArrayLiteral) |
| 3910 | 3989 |
| 3911 private: | 3990 private: |
| 3912 int length_; | 3991 int length_; |
| 3913 Handle<FixedArray> constant_elements_; | 3992 Handle<FixedArray> constant_elements_; |
| 3914 }; | 3993 }; |
| 3915 | 3994 |
| 3916 | 3995 |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 3942 | 4021 |
| 3943 DECLARE_CONCRETE_INSTRUCTION(ObjectLiteral) | 4022 DECLARE_CONCRETE_INSTRUCTION(ObjectLiteral) |
| 3944 | 4023 |
| 3945 private: | 4024 private: |
| 3946 Handle<FixedArray> constant_properties_; | 4025 Handle<FixedArray> constant_properties_; |
| 3947 bool fast_elements_; | 4026 bool fast_elements_; |
| 3948 bool has_function_; | 4027 bool has_function_; |
| 3949 }; | 4028 }; |
| 3950 | 4029 |
| 3951 | 4030 |
| 3952 class HRegExpLiteral: public HMaterializedLiteral<0> { | 4031 class HRegExpLiteral: public HMaterializedLiteral<1> { |
| 3953 public: | 4032 public: |
| 3954 HRegExpLiteral(Handle<String> pattern, | 4033 HRegExpLiteral(HValue* context, |
| 4034 Handle<String> pattern, | |
| 3955 Handle<String> flags, | 4035 Handle<String> flags, |
| 3956 int literal_index) | 4036 int literal_index) |
| 3957 : HMaterializedLiteral<0>(literal_index, 0), | 4037 : HMaterializedLiteral<1>(literal_index, 0), |
| 3958 pattern_(pattern), | 4038 pattern_(pattern), |
| 3959 flags_(flags) { } | 4039 flags_(flags) { |
| 4040 SetOperandAt(0, context); | |
| 4041 } | |
| 3960 | 4042 |
| 4043 HValue* context() { return OperandAt(0); } | |
| 3961 Handle<String> pattern() { return pattern_; } | 4044 Handle<String> pattern() { return pattern_; } |
| 3962 Handle<String> flags() { return flags_; } | 4045 Handle<String> flags() { return flags_; } |
| 3963 | 4046 |
| 3964 virtual Representation RequiredInputRepresentation(int index) const { | 4047 virtual Representation RequiredInputRepresentation(int index) const { |
| 3965 return Representation::None(); | 4048 return Representation::Tagged(); |
| 3966 } | 4049 } |
| 3967 | 4050 |
| 3968 DECLARE_CONCRETE_INSTRUCTION(RegExpLiteral) | 4051 DECLARE_CONCRETE_INSTRUCTION(RegExpLiteral) |
| 3969 | 4052 |
| 3970 private: | 4053 private: |
| 3971 Handle<String> pattern_; | 4054 Handle<String> pattern_; |
| 3972 Handle<String> flags_; | 4055 Handle<String> flags_; |
| 3973 }; | 4056 }; |
| 3974 | 4057 |
| 3975 | 4058 |
| 3976 class HFunctionLiteral: public HTemplateInstruction<0> { | 4059 class HFunctionLiteral: public HTemplateInstruction<1> { |
| 3977 public: | 4060 public: |
| 3978 HFunctionLiteral(Handle<SharedFunctionInfo> shared, bool pretenure) | 4061 HFunctionLiteral(HValue* context, |
| 4062 Handle<SharedFunctionInfo> shared, | |
| 4063 bool pretenure) | |
| 3979 : shared_info_(shared), pretenure_(pretenure) { | 4064 : shared_info_(shared), pretenure_(pretenure) { |
| 4065 SetOperandAt(0, context); | |
| 3980 set_representation(Representation::Tagged()); | 4066 set_representation(Representation::Tagged()); |
| 3981 } | 4067 } |
| 3982 | 4068 |
| 4069 HValue* context() { return OperandAt(0); } | |
| 4070 | |
| 3983 virtual Representation RequiredInputRepresentation(int index) const { | 4071 virtual Representation RequiredInputRepresentation(int index) const { |
| 3984 return Representation::None(); | 4072 return Representation::Tagged(); |
| 3985 } | 4073 } |
| 3986 | 4074 |
| 3987 DECLARE_CONCRETE_INSTRUCTION(FunctionLiteral) | 4075 DECLARE_CONCRETE_INSTRUCTION(FunctionLiteral) |
| 3988 | 4076 |
| 3989 Handle<SharedFunctionInfo> shared_info() const { return shared_info_; } | 4077 Handle<SharedFunctionInfo> shared_info() const { return shared_info_; } |
| 3990 bool pretenure() const { return pretenure_; } | 4078 bool pretenure() const { return pretenure_; } |
| 3991 | 4079 |
| 3992 private: | 4080 private: |
| 3993 Handle<SharedFunctionInfo> shared_info_; | 4081 Handle<SharedFunctionInfo> shared_info_; |
| 3994 bool pretenure_; | 4082 bool pretenure_; |
| 3995 }; | 4083 }; |
| 3996 | 4084 |
| 3997 | 4085 |
| 3998 class HTypeof: public HUnaryOperation { | 4086 class HTypeof: public HTemplateInstruction<2> { |
| 3999 public: | 4087 public: |
| 4000 explicit HTypeof(HValue* value) : HUnaryOperation(value) { | 4088 explicit HTypeof(HValue* context, HValue* value) { |
| 4089 SetOperandAt(0, context); | |
| 4090 SetOperandAt(1, value); | |
| 4001 set_representation(Representation::Tagged()); | 4091 set_representation(Representation::Tagged()); |
| 4002 } | 4092 } |
| 4003 | 4093 |
| 4094 HValue* context() { return OperandAt(0); } | |
| 4095 HValue* value() { return OperandAt(1); } | |
| 4096 | |
| 4004 virtual Representation RequiredInputRepresentation(int index) const { | 4097 virtual Representation RequiredInputRepresentation(int index) const { |
| 4005 return Representation::Tagged(); | 4098 return Representation::Tagged(); |
| 4006 } | 4099 } |
| 4007 | 4100 |
| 4008 DECLARE_CONCRETE_INSTRUCTION(Typeof) | 4101 DECLARE_CONCRETE_INSTRUCTION(Typeof) |
| 4009 }; | 4102 }; |
| 4010 | 4103 |
| 4011 | 4104 |
| 4012 class HToFastProperties: public HUnaryOperation { | 4105 class HToFastProperties: public HUnaryOperation { |
| 4013 public: | 4106 public: |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 4036 virtual Representation RequiredInputRepresentation(int index) const { | 4129 virtual Representation RequiredInputRepresentation(int index) const { |
| 4037 return Representation::Tagged(); | 4130 return Representation::Tagged(); |
| 4038 } | 4131 } |
| 4039 | 4132 |
| 4040 DECLARE_CONCRETE_INSTRUCTION(ValueOf) | 4133 DECLARE_CONCRETE_INSTRUCTION(ValueOf) |
| 4041 }; | 4134 }; |
| 4042 | 4135 |
| 4043 | 4136 |
| 4044 class HDeleteProperty: public HBinaryOperation { | 4137 class HDeleteProperty: public HBinaryOperation { |
| 4045 public: | 4138 public: |
| 4046 HDeleteProperty(HValue* obj, HValue* key) | 4139 HDeleteProperty(HValue* context, HValue* obj, HValue* key) |
| 4047 : HBinaryOperation(obj, key) { | 4140 : HBinaryOperation(context, obj, key) { |
| 4048 set_representation(Representation::Tagged()); | 4141 set_representation(Representation::Tagged()); |
| 4049 SetAllSideEffects(); | 4142 SetAllSideEffects(); |
| 4050 } | 4143 } |
| 4051 | 4144 |
| 4052 virtual Representation RequiredInputRepresentation(int index) const { | 4145 virtual Representation RequiredInputRepresentation(int index) const { |
| 4053 return Representation::Tagged(); | 4146 return Representation::Tagged(); |
| 4054 } | 4147 } |
| 4055 | 4148 |
| 4056 virtual HType CalculateInferredType(); | 4149 virtual HType CalculateInferredType(); |
| 4057 | 4150 |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 4086 | 4179 |
| 4087 DECLARE_CONCRETE_INSTRUCTION(In) | 4180 DECLARE_CONCRETE_INSTRUCTION(In) |
| 4088 }; | 4181 }; |
| 4089 | 4182 |
| 4090 #undef DECLARE_INSTRUCTION | 4183 #undef DECLARE_INSTRUCTION |
| 4091 #undef DECLARE_CONCRETE_INSTRUCTION | 4184 #undef DECLARE_CONCRETE_INSTRUCTION |
| 4092 | 4185 |
| 4093 } } // namespace v8::internal | 4186 } } // namespace v8::internal |
| 4094 | 4187 |
| 4095 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ | 4188 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ |
| OLD | NEW |