| Index: src/ia32/lithium-ia32.h
|
| ===================================================================
|
| --- src/ia32/lithium-ia32.h (revision 6437)
|
| +++ src/ia32/lithium-ia32.h (working copy)
|
| @@ -114,6 +114,7 @@
|
| // LStoreNamed
|
| // LStoreNamedField
|
| // LStoreNamedGeneric
|
| +// LStringCharCodeAt
|
| // LBitNotI
|
| // LCallNew
|
| // LCheckFunction
|
| @@ -141,6 +142,7 @@
|
| // LReturn
|
| // LSmiTag
|
| // LStoreGlobal
|
| +// LStringLength
|
| // LTaggedToI
|
| // LThrow
|
| // LTypeof
|
| @@ -253,6 +255,8 @@
|
| V(StoreKeyedGeneric) \
|
| V(StoreNamedField) \
|
| V(StoreNamedGeneric) \
|
| + V(StringCharCodeAt) \
|
| + V(StringLength) \
|
| V(SubI) \
|
| V(TaggedToI) \
|
| V(Throw) \
|
| @@ -335,33 +339,36 @@
|
| };
|
|
|
|
|
| -template<typename T, int N>
|
| +template<typename ElementType, int NumElements>
|
| class OperandContainer {
|
| public:
|
| OperandContainer() {
|
| - for (int i = 0; i < N; i++) elems_[i] = NULL;
|
| + for (int i = 0; i < NumElements; i++) elems_[i] = NULL;
|
| }
|
| - int length() { return N; }
|
| - T& operator[](int i) {
|
| + int length() { return NumElements; }
|
| + ElementType& operator[](int i) {
|
| ASSERT(i < length());
|
| return elems_[i];
|
| }
|
| void PrintOperandsTo(StringStream* stream);
|
|
|
| private:
|
| - T elems_[N];
|
| + ElementType elems_[NumElements];
|
| };
|
|
|
|
|
| -template<typename T>
|
| -class OperandContainer<T, 0> {
|
| +template<typename ElementType>
|
| +class OperandContainer<ElementType, 0> {
|
| public:
|
| int length() { return 0; }
|
| void PrintOperandsTo(StringStream* stream) { }
|
| };
|
|
|
|
|
| -template<int R, int I, int T = 0>
|
| +// R = number of result operands (0 or 1).
|
| +// I = number of input operands.
|
| +// T = number of temporary operands.
|
| +template<int R, int I, int T>
|
| class LTemplateInstruction: public LInstruction {
|
| public:
|
| // Allow 0 or 1 output operands.
|
| @@ -512,7 +519,7 @@
|
| };
|
|
|
|
|
| -template<int I, int T = 0>
|
| +template<int I, int T>
|
| class LControlInstruction: public LTemplateInstruction<0, I, T> {
|
| public:
|
| DECLARE_INSTRUCTION(ControlInstruction)
|
| @@ -570,7 +577,7 @@
|
| };
|
|
|
|
|
| -class LArgumentsLength: public LTemplateInstruction<1, 1> {
|
| +class LArgumentsLength: public LTemplateInstruction<1, 1, 0> {
|
| public:
|
| explicit LArgumentsLength(LOperand* elements) {
|
| inputs_[0] = elements;
|
| @@ -627,7 +634,7 @@
|
| };
|
|
|
|
|
| -class LCmpID: public LTemplateInstruction<1, 2> {
|
| +class LCmpID: public LTemplateInstruction<1, 2, 0> {
|
| public:
|
| LCmpID(LOperand* left, LOperand* right) {
|
| inputs_[0] = left;
|
| @@ -644,7 +651,7 @@
|
| };
|
|
|
|
|
| -class LCmpIDAndBranch: public LControlInstruction<2> {
|
| +class LCmpIDAndBranch: public LControlInstruction<2, 0> {
|
| public:
|
| LCmpIDAndBranch(LOperand* left, LOperand* right) {
|
| inputs_[0] = left;
|
| @@ -663,7 +670,7 @@
|
| };
|
|
|
|
|
| -class LUnaryMathOperation: public LTemplateInstruction<1, 1> {
|
| +class LUnaryMathOperation: public LTemplateInstruction<1, 1, 0> {
|
| public:
|
| explicit LUnaryMathOperation(LOperand* value) {
|
| inputs_[0] = value;
|
| @@ -677,7 +684,7 @@
|
| };
|
|
|
|
|
| -class LCmpJSObjectEq: public LTemplateInstruction<1, 2> {
|
| +class LCmpJSObjectEq: public LTemplateInstruction<1, 2, 0> {
|
| public:
|
| LCmpJSObjectEq(LOperand* left, LOperand* right) {
|
| inputs_[0] = left;
|
| @@ -688,7 +695,7 @@
|
| };
|
|
|
|
|
| -class LCmpJSObjectEqAndBranch: public LControlInstruction<2> {
|
| +class LCmpJSObjectEqAndBranch: public LControlInstruction<2, 0> {
|
| public:
|
| LCmpJSObjectEqAndBranch(LOperand* left, LOperand* right) {
|
| inputs_[0] = left;
|
| @@ -700,7 +707,7 @@
|
| };
|
|
|
|
|
| -class LIsNull: public LTemplateInstruction<1, 1> {
|
| +class LIsNull: public LTemplateInstruction<1, 1, 0> {
|
| public:
|
| explicit LIsNull(LOperand* value) {
|
| inputs_[0] = value;
|
| @@ -754,7 +761,7 @@
|
| };
|
|
|
|
|
| -class LIsSmi: public LTemplateInstruction<1, 1> {
|
| +class LIsSmi: public LTemplateInstruction<1, 1, 0> {
|
| public:
|
| explicit LIsSmi(LOperand* value) {
|
| inputs_[0] = value;
|
| @@ -765,7 +772,7 @@
|
| };
|
|
|
|
|
| -class LIsSmiAndBranch: public LControlInstruction<1> {
|
| +class LIsSmiAndBranch: public LControlInstruction<1, 0> {
|
| public:
|
| explicit LIsSmiAndBranch(LOperand* value) {
|
| inputs_[0] = value;
|
| @@ -777,7 +784,7 @@
|
| };
|
|
|
|
|
| -class LHasInstanceType: public LTemplateInstruction<1, 1> {
|
| +class LHasInstanceType: public LTemplateInstruction<1, 1, 0> {
|
| public:
|
| explicit LHasInstanceType(LOperand* value) {
|
| inputs_[0] = value;
|
| @@ -803,7 +810,7 @@
|
| };
|
|
|
|
|
| -class LHasCachedArrayIndex: public LTemplateInstruction<1, 1> {
|
| +class LHasCachedArrayIndex: public LTemplateInstruction<1, 1, 0> {
|
| public:
|
| explicit LHasCachedArrayIndex(LOperand* value) {
|
| inputs_[0] = value;
|
| @@ -814,7 +821,7 @@
|
| };
|
|
|
|
|
| -class LHasCachedArrayIndexAndBranch: public LControlInstruction<1> {
|
| +class LHasCachedArrayIndexAndBranch: public LControlInstruction<1, 0> {
|
| public:
|
| explicit LHasCachedArrayIndexAndBranch(LOperand* value) {
|
| inputs_[0] = value;
|
| @@ -856,7 +863,7 @@
|
| };
|
|
|
|
|
| -class LCmpT: public LTemplateInstruction<1, 2> {
|
| +class LCmpT: public LTemplateInstruction<1, 2, 0> {
|
| public:
|
| LCmpT(LOperand* left, LOperand* right) {
|
| inputs_[0] = left;
|
| @@ -870,7 +877,7 @@
|
| };
|
|
|
|
|
| -class LCmpTAndBranch: public LControlInstruction<2> {
|
| +class LCmpTAndBranch: public LControlInstruction<2, 0> {
|
| public:
|
| LCmpTAndBranch(LOperand* left, LOperand* right) {
|
| inputs_[0] = left;
|
| @@ -884,7 +891,7 @@
|
| };
|
|
|
|
|
| -class LInstanceOf: public LTemplateInstruction<1, 2> {
|
| +class LInstanceOf: public LTemplateInstruction<1, 2, 0> {
|
| public:
|
| LInstanceOf(LOperand* left, LOperand* right) {
|
| inputs_[0] = left;
|
| @@ -895,7 +902,7 @@
|
| };
|
|
|
|
|
| -class LInstanceOfAndBranch: public LControlInstruction<2> {
|
| +class LInstanceOfAndBranch: public LControlInstruction<2, 0> {
|
| public:
|
| LInstanceOfAndBranch(LOperand* left, LOperand* right) {
|
| inputs_[0] = left;
|
| @@ -935,7 +942,7 @@
|
| };
|
|
|
|
|
| -class LBitI: public LTemplateInstruction<1, 2> {
|
| +class LBitI: public LTemplateInstruction<1, 2, 0> {
|
| public:
|
| LBitI(Token::Value op, LOperand* left, LOperand* right)
|
| : op_(op) {
|
| @@ -952,7 +959,7 @@
|
| };
|
|
|
|
|
| -class LShiftI: public LTemplateInstruction<1, 2> {
|
| +class LShiftI: public LTemplateInstruction<1, 2, 0> {
|
| public:
|
| LShiftI(Token::Value op, LOperand* left, LOperand* right, bool can_deopt)
|
| : op_(op), can_deopt_(can_deopt) {
|
| @@ -972,7 +979,7 @@
|
| };
|
|
|
|
|
| -class LSubI: public LTemplateInstruction<1, 2> {
|
| +class LSubI: public LTemplateInstruction<1, 2, 0> {
|
| public:
|
| LSubI(LOperand* left, LOperand* right) {
|
| inputs_[0] = left;
|
| @@ -1025,7 +1032,7 @@
|
| };
|
|
|
|
|
| -class LBranch: public LControlInstruction<1> {
|
| +class LBranch: public LControlInstruction<1, 0> {
|
| public:
|
| explicit LBranch(LOperand* value) {
|
| inputs_[0] = value;
|
| @@ -1038,28 +1045,28 @@
|
| };
|
|
|
|
|
| -class LCmpMapAndBranch: public LTemplateInstruction<0, 1> {
|
| +class LCmpMapAndBranch: public LTemplateInstruction<0, 1, 0> {
|
| public:
|
| explicit LCmpMapAndBranch(LOperand* value) {
|
| inputs_[0] = value;
|
| }
|
|
|
| DECLARE_CONCRETE_INSTRUCTION(CmpMapAndBranch, "cmp-map-and-branch")
|
| - DECLARE_HYDROGEN_ACCESSOR(CompareMapAndBranch)
|
| + DECLARE_HYDROGEN_ACCESSOR(CompareMap)
|
|
|
| virtual bool IsControl() const { return true; }
|
|
|
| Handle<Map> map() const { return hydrogen()->map(); }
|
| int true_block_id() const {
|
| - return hydrogen()->true_destination()->block_id();
|
| + return hydrogen()->FirstSuccessor()->block_id();
|
| }
|
| int false_block_id() const {
|
| - return hydrogen()->false_destination()->block_id();
|
| + return hydrogen()->SecondSuccessor()->block_id();
|
| }
|
| };
|
|
|
|
|
| -class LJSArrayLength: public LTemplateInstruction<1, 1> {
|
| +class LJSArrayLength: public LTemplateInstruction<1, 1, 0> {
|
| public:
|
| explicit LJSArrayLength(LOperand* value) {
|
| inputs_[0] = value;
|
| @@ -1070,7 +1077,7 @@
|
| };
|
|
|
|
|
| -class LFixedArrayLength: public LTemplateInstruction<1, 1> {
|
| +class LFixedArrayLength: public LTemplateInstruction<1, 1, 0> {
|
| public:
|
| explicit LFixedArrayLength(LOperand* value) {
|
| inputs_[0] = value;
|
| @@ -1093,7 +1100,7 @@
|
| };
|
|
|
|
|
| -class LThrow: public LTemplateInstruction<0, 1> {
|
| +class LThrow: public LTemplateInstruction<0, 1, 0> {
|
| public:
|
| explicit LThrow(LOperand* value) {
|
| inputs_[0] = value;
|
| @@ -1103,7 +1110,7 @@
|
| };
|
|
|
|
|
| -class LBitNotI: public LTemplateInstruction<1, 1> {
|
| +class LBitNotI: public LTemplateInstruction<1, 1, 0> {
|
| public:
|
| explicit LBitNotI(LOperand* value) {
|
| inputs_[0] = value;
|
| @@ -1113,7 +1120,7 @@
|
| };
|
|
|
|
|
| -class LAddI: public LTemplateInstruction<1, 2> {
|
| +class LAddI: public LTemplateInstruction<1, 2, 0> {
|
| public:
|
| LAddI(LOperand* left, LOperand* right) {
|
| inputs_[0] = left;
|
| @@ -1125,7 +1132,7 @@
|
| };
|
|
|
|
|
| -class LPower: public LTemplateInstruction<1, 2> {
|
| +class LPower: public LTemplateInstruction<1, 2, 0> {
|
| public:
|
| LPower(LOperand* left, LOperand* right) {
|
| inputs_[0] = left;
|
| @@ -1137,7 +1144,7 @@
|
| };
|
|
|
|
|
| -class LArithmeticD: public LTemplateInstruction<1, 2> {
|
| +class LArithmeticD: public LTemplateInstruction<1, 2, 0> {
|
| public:
|
| LArithmeticD(Token::Value op, LOperand* left, LOperand* right)
|
| : op_(op) {
|
| @@ -1155,7 +1162,7 @@
|
| };
|
|
|
|
|
| -class LArithmeticT: public LTemplateInstruction<1, 2> {
|
| +class LArithmeticT: public LTemplateInstruction<1, 2, 0> {
|
| public:
|
| LArithmeticT(Token::Value op, LOperand* left, LOperand* right)
|
| : op_(op) {
|
| @@ -1173,7 +1180,7 @@
|
| };
|
|
|
|
|
| -class LReturn: public LTemplateInstruction<0, 1> {
|
| +class LReturn: public LTemplateInstruction<0, 1, 0> {
|
| public:
|
| explicit LReturn(LOperand* value) {
|
| inputs_[0] = value;
|
| @@ -1183,7 +1190,7 @@
|
| };
|
|
|
|
|
| -class LLoadNamedField: public LTemplateInstruction<1, 1> {
|
| +class LLoadNamedField: public LTemplateInstruction<1, 1, 0> {
|
| public:
|
| explicit LLoadNamedField(LOperand* object) {
|
| inputs_[0] = object;
|
| @@ -1194,7 +1201,7 @@
|
| };
|
|
|
|
|
| -class LLoadNamedGeneric: public LTemplateInstruction<1, 1> {
|
| +class LLoadNamedGeneric: public LTemplateInstruction<1, 1, 0> {
|
| public:
|
| explicit LLoadNamedGeneric(LOperand* object) {
|
| inputs_[0] = object;
|
| @@ -1222,7 +1229,7 @@
|
| };
|
|
|
|
|
| -class LLoadElements: public LTemplateInstruction<1, 1> {
|
| +class LLoadElements: public LTemplateInstruction<1, 1, 0> {
|
| public:
|
| explicit LLoadElements(LOperand* object) {
|
| inputs_[0] = object;
|
| @@ -1232,7 +1239,7 @@
|
| };
|
|
|
|
|
| -class LLoadKeyedFastElement: public LTemplateInstruction<1, 2> {
|
| +class LLoadKeyedFastElement: public LTemplateInstruction<1, 2, 0> {
|
| public:
|
| LLoadKeyedFastElement(LOperand* elements, LOperand* key) {
|
| inputs_[0] = elements;
|
| @@ -1247,7 +1254,7 @@
|
| };
|
|
|
|
|
| -class LLoadKeyedGeneric: public LTemplateInstruction<1, 2> {
|
| +class LLoadKeyedGeneric: public LTemplateInstruction<1, 2, 0> {
|
| public:
|
| LLoadKeyedGeneric(LOperand* obj, LOperand* key) {
|
| inputs_[0] = obj;
|
| @@ -1268,7 +1275,7 @@
|
| };
|
|
|
|
|
| -class LStoreGlobal: public LTemplateInstruction<0, 1> {
|
| +class LStoreGlobal: public LTemplateInstruction<0, 1, 0> {
|
| public:
|
| explicit LStoreGlobal(LOperand* value) {
|
| inputs_[0] = value;
|
| @@ -1291,7 +1298,7 @@
|
| };
|
|
|
|
|
| -class LPushArgument: public LTemplateInstruction<0, 1> {
|
| +class LPushArgument: public LTemplateInstruction<0, 1, 0> {
|
| public:
|
| explicit LPushArgument(LOperand* value) {
|
| inputs_[0] = value;
|
| @@ -1385,7 +1392,7 @@
|
| };
|
|
|
|
|
| -class LCallNew: public LTemplateInstruction<1, 1> {
|
| +class LCallNew: public LTemplateInstruction<1, 1, 0> {
|
| public:
|
| explicit LCallNew(LOperand* constructor) {
|
| inputs_[0] = constructor;
|
| @@ -1410,7 +1417,7 @@
|
| };
|
|
|
|
|
| -class LInteger32ToDouble: public LTemplateInstruction<1, 1> {
|
| +class LInteger32ToDouble: public LTemplateInstruction<1, 1, 0> {
|
| public:
|
| explicit LInteger32ToDouble(LOperand* value) {
|
| inputs_[0] = value;
|
| @@ -1420,7 +1427,7 @@
|
| };
|
|
|
|
|
| -class LNumberTagI: public LTemplateInstruction<1, 1> {
|
| +class LNumberTagI: public LTemplateInstruction<1, 1, 0> {
|
| public:
|
| explicit LNumberTagI(LOperand* value) {
|
| inputs_[0] = value;
|
| @@ -1432,7 +1439,7 @@
|
|
|
| class LNumberTagD: public LTemplateInstruction<1, 1, 1> {
|
| public:
|
| - explicit LNumberTagD(LOperand* value, LOperand* temp) {
|
| + LNumberTagD(LOperand* value, LOperand* temp) {
|
| inputs_[0] = value;
|
| temps_[0] = temp;
|
| }
|
| @@ -1471,7 +1478,7 @@
|
| };
|
|
|
|
|
| -class LSmiTag: public LTemplateInstruction<1, 1> {
|
| +class LSmiTag: public LTemplateInstruction<1, 1, 0> {
|
| public:
|
| explicit LSmiTag(LOperand* value) {
|
| inputs_[0] = value;
|
| @@ -1481,7 +1488,7 @@
|
| };
|
|
|
|
|
| -class LNumberUntagD: public LTemplateInstruction<1, 1> {
|
| +class LNumberUntagD: public LTemplateInstruction<1, 1, 0> {
|
| public:
|
| explicit LNumberUntagD(LOperand* value) {
|
| inputs_[0] = value;
|
| @@ -1491,7 +1498,7 @@
|
| };
|
|
|
|
|
| -class LSmiUntag: public LTemplateInstruction<1, 1> {
|
| +class LSmiUntag: public LTemplateInstruction<1, 1, 0> {
|
| public:
|
| LSmiUntag(LOperand* value, bool needs_check)
|
| : needs_check_(needs_check) {
|
| @@ -1590,8 +1597,36 @@
|
| };
|
|
|
|
|
| -class LCheckFunction: public LTemplateInstruction<0, 1> {
|
| +class LStringCharCodeAt: public LTemplateInstruction<1, 2, 0> {
|
| public:
|
| + LStringCharCodeAt(LOperand* string, LOperand* index) {
|
| + inputs_[0] = string;
|
| + inputs_[1] = index;
|
| + }
|
| +
|
| + DECLARE_CONCRETE_INSTRUCTION(StringCharCodeAt, "string-char-code-at")
|
| + DECLARE_HYDROGEN_ACCESSOR(StringCharCodeAt)
|
| +
|
| + LOperand* string() { return inputs_[0]; }
|
| + LOperand* index() { return inputs_[1]; }
|
| +};
|
| +
|
| +
|
| +class LStringLength: public LTemplateInstruction<1, 1, 0> {
|
| + public:
|
| + explicit LStringLength(LOperand* string) {
|
| + inputs_[0] = string;
|
| + }
|
| +
|
| + DECLARE_CONCRETE_INSTRUCTION(StringLength, "string-length")
|
| + DECLARE_HYDROGEN_ACCESSOR(StringLength)
|
| +
|
| + LOperand* string() { return inputs_[0]; }
|
| +};
|
| +
|
| +
|
| +class LCheckFunction: public LTemplateInstruction<0, 1, 0> {
|
| + public:
|
| explicit LCheckFunction(LOperand* value) {
|
| inputs_[0] = value;
|
| }
|
| @@ -1613,7 +1648,7 @@
|
| };
|
|
|
|
|
| -class LCheckMap: public LTemplateInstruction<0, 1> {
|
| +class LCheckMap: public LTemplateInstruction<0, 1, 0> {
|
| public:
|
| explicit LCheckMap(LOperand* value) {
|
| inputs_[0] = value;
|
| @@ -1638,7 +1673,7 @@
|
| };
|
|
|
|
|
| -class LCheckSmi: public LTemplateInstruction<0, 1> {
|
| +class LCheckSmi: public LTemplateInstruction<0, 1, 0> {
|
| public:
|
| LCheckSmi(LOperand* value, Condition condition)
|
| : condition_(condition) {
|
| @@ -1687,7 +1722,7 @@
|
| };
|
|
|
|
|
| -class LTypeof: public LTemplateInstruction<1, 1> {
|
| +class LTypeof: public LTemplateInstruction<1, 1, 0> {
|
| public:
|
| explicit LTypeof(LOperand* value) {
|
| inputs_[0] = value;
|
| @@ -1697,7 +1732,7 @@
|
| };
|
|
|
|
|
| -class LTypeofIs: public LTemplateInstruction<1, 1> {
|
| +class LTypeofIs: public LTemplateInstruction<1, 1, 0> {
|
| public:
|
| explicit LTypeofIs(LOperand* value) {
|
| inputs_[0] = value;
|
| @@ -1712,7 +1747,7 @@
|
| };
|
|
|
|
|
| -class LTypeofIsAndBranch: public LControlInstruction<1> {
|
| +class LTypeofIsAndBranch: public LControlInstruction<1, 0> {
|
| public:
|
| explicit LTypeofIsAndBranch(LOperand* value) {
|
| inputs_[0] = value;
|
| @@ -1727,7 +1762,7 @@
|
| };
|
|
|
|
|
| -class LDeleteProperty: public LTemplateInstruction<1, 2> {
|
| +class LDeleteProperty: public LTemplateInstruction<1, 2, 0> {
|
| public:
|
| LDeleteProperty(LOperand* obj, LOperand* key) {
|
| inputs_[0] = obj;
|
|
|