| Index: src/ia32/lithium-ia32.h
|
| ===================================================================
|
| --- src/ia32/lithium-ia32.h (revision 8618)
|
| +++ src/ia32/lithium-ia32.h (working copy)
|
| @@ -32,6 +32,7 @@
|
| #include "lithium-allocator.h"
|
| #include "lithium.h"
|
| #include "safepoint-table.h"
|
| +#include "utils.h"
|
|
|
| namespace v8 {
|
| namespace internal {
|
| @@ -70,17 +71,12 @@
|
| V(ClampDToUint8) \
|
| V(ClampIToUint8) \
|
| V(ClampTToUint8) \
|
| - V(ClassOfTest) \
|
| V(ClassOfTestAndBranch) \
|
| - V(CmpID) \
|
| V(CmpIDAndBranch) \
|
| - V(CmpJSObjectEq) \
|
| - V(CmpJSObjectEqAndBranch) \
|
| - V(CmpSymbolEq) \
|
| - V(CmpSymbolEqAndBranch) \
|
| + V(CmpObjectEqAndBranch) \
|
| V(CmpMapAndBranch) \
|
| V(CmpT) \
|
| - V(CmpTAndBranch) \
|
| + V(CmpConstantEqAndBranch) \
|
| V(ConstantD) \
|
| V(ConstantI) \
|
| V(ConstantT) \
|
| @@ -89,6 +85,7 @@
|
| V(Deoptimize) \
|
| V(DivI) \
|
| V(DoubleToI) \
|
| + V(ElementsKind) \
|
| V(ExternalArrayLength) \
|
| V(FixedArrayLength) \
|
| V(FunctionLiteral) \
|
| @@ -96,26 +93,18 @@
|
| V(GlobalObject) \
|
| V(GlobalReceiver) \
|
| V(Goto) \
|
| - V(HasCachedArrayIndex) \
|
| V(HasCachedArrayIndexAndBranch) \
|
| - V(HasInstanceType) \
|
| V(HasInstanceTypeAndBranch) \
|
| V(In) \
|
| V(InstanceOf) \
|
| - V(InstanceOfAndBranch) \
|
| V(InstanceOfKnownGlobal) \
|
| V(InstructionGap) \
|
| V(Integer32ToDouble) \
|
| V(InvokeFunction) \
|
| - V(IsConstructCall) \
|
| V(IsConstructCallAndBranch) \
|
| - V(IsNull) \
|
| V(IsNullAndBranch) \
|
| - V(IsObject) \
|
| V(IsObjectAndBranch) \
|
| - V(IsSmi) \
|
| V(IsSmiAndBranch) \
|
| - V(IsUndetectable) \
|
| V(IsUndetectableAndBranch) \
|
| V(JSArrayLength) \
|
| V(Label) \
|
| @@ -163,10 +152,10 @@
|
| V(StringLength) \
|
| V(SubI) \
|
| V(TaggedToI) \
|
| + V(ThisFunction) \
|
| V(Throw) \
|
| V(ToFastProperties) \
|
| V(Typeof) \
|
| - V(TypeofIs) \
|
| V(TypeofIsAndBranch) \
|
| V(UnaryMathOperation) \
|
| V(UnknownOSRValue) \
|
| @@ -225,7 +214,6 @@
|
| virtual bool IsGap() const { return false; }
|
|
|
| virtual bool IsControl() const { return false; }
|
| - virtual void SetBranchTargets(int true_block_id, int false_block_id) { }
|
|
|
| void set_environment(LEnvironment* env) { environment_ = env; }
|
| LEnvironment* environment() const { return environment_; }
|
| @@ -281,37 +269,6 @@
|
| };
|
|
|
|
|
| -template<typename ElementType, int NumElements>
|
| -class OperandContainer {
|
| - public:
|
| - OperandContainer() {
|
| - for (int i = 0; i < NumElements; i++) elems_[i] = NULL;
|
| - }
|
| - int length() { return NumElements; }
|
| - ElementType& operator[](int i) {
|
| - ASSERT(i < length());
|
| - return elems_[i];
|
| - }
|
| - void PrintOperandsTo(StringStream* stream);
|
| -
|
| - private:
|
| - ElementType elems_[NumElements];
|
| -};
|
| -
|
| -
|
| -template<typename ElementType>
|
| -class OperandContainer<ElementType, 0> {
|
| - public:
|
| - int length() { return 0; }
|
| - void PrintOperandsTo(StringStream* stream) { }
|
| - ElementType& operator[](int i) {
|
| - UNREACHABLE();
|
| - static ElementType t = 0;
|
| - return t;
|
| - }
|
| -};
|
| -
|
| -
|
| // R = number of result operands (0 or 1).
|
| // I = number of input operands.
|
| // T = number of temporary operands.
|
| @@ -334,9 +291,9 @@
|
| virtual void PrintOutputOperandTo(StringStream* stream);
|
|
|
| protected:
|
| - OperandContainer<LOperand*, R> results_;
|
| - OperandContainer<LOperand*, I> inputs_;
|
| - OperandContainer<LOperand*, T> temps_;
|
| + EmbeddedContainer<LOperand*, R> results_;
|
| + EmbeddedContainer<LOperand*, I> inputs_;
|
| + EmbeddedContainer<LOperand*, T> temps_;
|
| };
|
|
|
|
|
| @@ -395,19 +352,16 @@
|
|
|
| class LGoto: public LTemplateInstruction<0, 0, 0> {
|
| public:
|
| - LGoto(int block_id, bool include_stack_check = false)
|
| - : block_id_(block_id), include_stack_check_(include_stack_check) { }
|
| + explicit LGoto(int block_id) : block_id_(block_id) { }
|
|
|
| DECLARE_CONCRETE_INSTRUCTION(Goto, "goto")
|
| virtual void PrintDataTo(StringStream* stream);
|
| virtual bool IsControl() const { return true; }
|
|
|
| int block_id() const { return block_id_; }
|
| - bool include_stack_check() const { return include_stack_check_; }
|
|
|
| private:
|
| int block_id_;
|
| - bool include_stack_check_;
|
| };
|
|
|
|
|
| @@ -489,16 +443,15 @@
|
| public:
|
| virtual bool IsControl() const { return true; }
|
|
|
| - int true_block_id() const { return true_block_id_; }
|
| - int false_block_id() const { return false_block_id_; }
|
| - void SetBranchTargets(int true_block_id, int false_block_id) {
|
| - true_block_id_ = true_block_id;
|
| - false_block_id_ = false_block_id;
|
| - }
|
| + int SuccessorCount() { return hydrogen()->SuccessorCount(); }
|
| + HBasicBlock* SuccessorAt(int i) { return hydrogen()->SuccessorAt(i); }
|
| + int true_block_id() { return hydrogen()->SuccessorAt(0)->block_id(); }
|
| + int false_block_id() { return hydrogen()->SuccessorAt(1)->block_id(); }
|
|
|
| private:
|
| - int true_block_id_;
|
| - int false_block_id_;
|
| + HControlInstruction* hydrogen() {
|
| + return HControlInstruction::cast(this->hydrogen_value());
|
| + }
|
| };
|
|
|
|
|
| @@ -600,23 +553,6 @@
|
| };
|
|
|
|
|
| -class LCmpID: public LTemplateInstruction<1, 2, 0> {
|
| - public:
|
| - LCmpID(LOperand* left, LOperand* right) {
|
| - inputs_[0] = left;
|
| - inputs_[1] = right;
|
| - }
|
| -
|
| - DECLARE_CONCRETE_INSTRUCTION(CmpID, "cmp-id")
|
| - DECLARE_HYDROGEN_ACCESSOR(Compare)
|
| -
|
| - Token::Value op() const { return hydrogen()->token(); }
|
| - bool is_double() const {
|
| - return hydrogen()->GetInputRepresentation().IsDouble();
|
| - }
|
| -};
|
| -
|
| -
|
| class LCmpIDAndBranch: public LControlInstruction<2, 0> {
|
| public:
|
| LCmpIDAndBranch(LOperand* left, LOperand* right) {
|
| @@ -625,7 +561,7 @@
|
| }
|
|
|
| DECLARE_CONCRETE_INSTRUCTION(CmpIDAndBranch, "cmp-id-and-branch")
|
| - DECLARE_HYDROGEN_ACCESSOR(Compare)
|
| + DECLARE_HYDROGEN_ACCESSOR(CompareIDAndBranch)
|
|
|
| Token::Value op() const { return hydrogen()->token(); }
|
| bool is_double() const {
|
| @@ -636,12 +572,16 @@
|
| };
|
|
|
|
|
| -class LUnaryMathOperation: public LTemplateInstruction<1, 1, 0> {
|
| +class LUnaryMathOperation: public LTemplateInstruction<1, 2, 0> {
|
| public:
|
| - explicit LUnaryMathOperation(LOperand* value) {
|
| + LUnaryMathOperation(LOperand* context, LOperand* value) {
|
| + inputs_[1] = context;
|
| inputs_[0] = value;
|
| }
|
|
|
| + LOperand* context() { return inputs_[1]; }
|
| + LOperand* value() { return inputs_[0]; }
|
| +
|
| DECLARE_CONCRETE_INSTRUCTION(UnaryMathOperation, "unary-math-operation")
|
| DECLARE_HYDROGEN_ACCESSOR(UnaryMathOperation)
|
|
|
| @@ -650,64 +590,30 @@
|
| };
|
|
|
|
|
| -class LCmpJSObjectEq: public LTemplateInstruction<1, 2, 0> {
|
| +class LCmpObjectEqAndBranch: public LControlInstruction<2, 0> {
|
| public:
|
| - LCmpJSObjectEq(LOperand* left, LOperand* right) {
|
| + LCmpObjectEqAndBranch(LOperand* left, LOperand* right) {
|
| inputs_[0] = left;
|
| inputs_[1] = right;
|
| }
|
|
|
| - DECLARE_CONCRETE_INSTRUCTION(CmpJSObjectEq, "cmp-jsobject-eq")
|
| + DECLARE_CONCRETE_INSTRUCTION(CmpObjectEqAndBranch,
|
| + "cmp-object-eq-and-branch")
|
| };
|
|
|
|
|
| -class LCmpJSObjectEqAndBranch: public LControlInstruction<2, 0> {
|
| +class LCmpConstantEqAndBranch: public LControlInstruction<1, 0> {
|
| public:
|
| - LCmpJSObjectEqAndBranch(LOperand* left, LOperand* right) {
|
| + explicit LCmpConstantEqAndBranch(LOperand* left) {
|
| inputs_[0] = left;
|
| - inputs_[1] = right;
|
| }
|
|
|
| - DECLARE_CONCRETE_INSTRUCTION(CmpJSObjectEqAndBranch,
|
| - "cmp-jsobject-eq-and-branch")
|
| + DECLARE_CONCRETE_INSTRUCTION(CmpConstantEqAndBranch,
|
| + "cmp-constant-eq-and-branch")
|
| + DECLARE_HYDROGEN_ACCESSOR(CompareConstantEqAndBranch)
|
| };
|
|
|
|
|
| -class LCmpSymbolEq: public LTemplateInstruction<1, 2, 0> {
|
| - public:
|
| - LCmpSymbolEq(LOperand* left, LOperand* right) {
|
| - inputs_[0] = left;
|
| - inputs_[1] = right;
|
| - }
|
| -
|
| - DECLARE_CONCRETE_INSTRUCTION(CmpSymbolEq, "cmp-symbol-eq")
|
| -};
|
| -
|
| -
|
| -class LCmpSymbolEqAndBranch: public LControlInstruction<2, 0> {
|
| - public:
|
| - LCmpSymbolEqAndBranch(LOperand* left, LOperand* right) {
|
| - inputs_[0] = left;
|
| - inputs_[1] = right;
|
| - }
|
| -
|
| - DECLARE_CONCRETE_INSTRUCTION(CmpSymbolEqAndBranch, "cmp-symbol-eq-and-branch")
|
| -};
|
| -
|
| -
|
| -class LIsNull: public LTemplateInstruction<1, 1, 0> {
|
| - public:
|
| - explicit LIsNull(LOperand* value) {
|
| - inputs_[0] = value;
|
| - }
|
| -
|
| - DECLARE_CONCRETE_INSTRUCTION(IsNull, "is-null")
|
| - DECLARE_HYDROGEN_ACCESSOR(IsNull)
|
| -
|
| - bool is_strict() const { return hydrogen()->is_strict(); }
|
| -};
|
| -
|
| -
|
| class LIsNullAndBranch: public LControlInstruction<1, 1> {
|
| public:
|
| LIsNullAndBranch(LOperand* value, LOperand* temp) {
|
| @@ -716,7 +622,7 @@
|
| }
|
|
|
| DECLARE_CONCRETE_INSTRUCTION(IsNullAndBranch, "is-null-and-branch")
|
| - DECLARE_HYDROGEN_ACCESSOR(IsNull)
|
| + DECLARE_HYDROGEN_ACCESSOR(IsNullAndBranch)
|
|
|
| bool is_strict() const { return hydrogen()->is_strict(); }
|
|
|
| @@ -724,42 +630,19 @@
|
| };
|
|
|
|
|
| -class LIsObject: public LTemplateInstruction<1, 1, 1> {
|
| +class LIsObjectAndBranch: public LControlInstruction<1, 1> {
|
| public:
|
| - LIsObject(LOperand* value, LOperand* temp) {
|
| + LIsObjectAndBranch(LOperand* value, LOperand* temp) {
|
| inputs_[0] = value;
|
| temps_[0] = temp;
|
| }
|
|
|
| - DECLARE_CONCRETE_INSTRUCTION(IsObject, "is-object")
|
| -};
|
| -
|
| -
|
| -class LIsObjectAndBranch: public LControlInstruction<1, 2> {
|
| - public:
|
| - LIsObjectAndBranch(LOperand* value, LOperand* temp, LOperand* temp2) {
|
| - inputs_[0] = value;
|
| - temps_[0] = temp;
|
| - temps_[1] = temp2;
|
| - }
|
| -
|
| DECLARE_CONCRETE_INSTRUCTION(IsObjectAndBranch, "is-object-and-branch")
|
|
|
| virtual void PrintDataTo(StringStream* stream);
|
| };
|
|
|
|
|
| -class LIsSmi: public LTemplateInstruction<1, 1, 0> {
|
| - public:
|
| - explicit LIsSmi(LOperand* value) {
|
| - inputs_[0] = value;
|
| - }
|
| -
|
| - DECLARE_CONCRETE_INSTRUCTION(IsSmi, "is-smi")
|
| - DECLARE_HYDROGEN_ACCESSOR(IsSmi)
|
| -};
|
| -
|
| -
|
| class LIsSmiAndBranch: public LControlInstruction<1, 0> {
|
| public:
|
| explicit LIsSmiAndBranch(LOperand* value) {
|
| @@ -767,25 +650,15 @@
|
| }
|
|
|
| DECLARE_CONCRETE_INSTRUCTION(IsSmiAndBranch, "is-smi-and-branch")
|
| + DECLARE_HYDROGEN_ACCESSOR(IsSmiAndBranch)
|
|
|
| virtual void PrintDataTo(StringStream* stream);
|
| };
|
|
|
|
|
| -class LIsUndetectable: public LTemplateInstruction<1, 1, 0> {
|
| - public:
|
| - explicit LIsUndetectable(LOperand* value) {
|
| - inputs_[0] = value;
|
| - }
|
| -
|
| - DECLARE_CONCRETE_INSTRUCTION(IsUndetectable, "is-undetectable")
|
| - DECLARE_HYDROGEN_ACCESSOR(IsUndetectable)
|
| -};
|
| -
|
| -
|
| class LIsUndetectableAndBranch: public LControlInstruction<1, 1> {
|
| public:
|
| - explicit LIsUndetectableAndBranch(LOperand* value, LOperand* temp) {
|
| + LIsUndetectableAndBranch(LOperand* value, LOperand* temp) {
|
| inputs_[0] = value;
|
| temps_[0] = temp;
|
| }
|
| @@ -797,17 +670,6 @@
|
| };
|
|
|
|
|
| -class LHasInstanceType: public LTemplateInstruction<1, 1, 0> {
|
| - public:
|
| - explicit LHasInstanceType(LOperand* value) {
|
| - inputs_[0] = value;
|
| - }
|
| -
|
| - DECLARE_CONCRETE_INSTRUCTION(HasInstanceType, "has-instance-type")
|
| - DECLARE_HYDROGEN_ACCESSOR(HasInstanceType)
|
| -};
|
| -
|
| -
|
| class LHasInstanceTypeAndBranch: public LControlInstruction<1, 1> {
|
| public:
|
| LHasInstanceTypeAndBranch(LOperand* value, LOperand* temp) {
|
| @@ -817,7 +679,7 @@
|
|
|
| DECLARE_CONCRETE_INSTRUCTION(HasInstanceTypeAndBranch,
|
| "has-instance-type-and-branch")
|
| - DECLARE_HYDROGEN_ACCESSOR(HasInstanceType)
|
| + DECLARE_HYDROGEN_ACCESSOR(HasInstanceTypeAndBranch)
|
|
|
| virtual void PrintDataTo(StringStream* stream);
|
| };
|
| @@ -834,17 +696,6 @@
|
| };
|
|
|
|
|
| -class LHasCachedArrayIndex: public LTemplateInstruction<1, 1, 0> {
|
| - public:
|
| - explicit LHasCachedArrayIndex(LOperand* value) {
|
| - inputs_[0] = value;
|
| - }
|
| -
|
| - DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndex, "has-cached-array-index")
|
| - DECLARE_HYDROGEN_ACCESSOR(HasCachedArrayIndex)
|
| -};
|
| -
|
| -
|
| class LHasCachedArrayIndexAndBranch: public LControlInstruction<1, 0> {
|
| public:
|
| explicit LHasCachedArrayIndexAndBranch(LOperand* value) {
|
| @@ -857,13 +708,6 @@
|
| };
|
|
|
|
|
| -class LIsConstructCall: public LTemplateInstruction<1, 0, 0> {
|
| - public:
|
| - DECLARE_CONCRETE_INSTRUCTION(IsConstructCall, "is-construct-call")
|
| - DECLARE_HYDROGEN_ACCESSOR(IsConstructCall)
|
| -};
|
| -
|
| -
|
| class LIsConstructCallAndBranch: public LControlInstruction<0, 1> {
|
| public:
|
| explicit LIsConstructCallAndBranch(LOperand* temp) {
|
| @@ -875,20 +719,6 @@
|
| };
|
|
|
|
|
| -class LClassOfTest: public LTemplateInstruction<1, 1, 1> {
|
| - public:
|
| - LClassOfTest(LOperand* value, LOperand* temp) {
|
| - inputs_[0] = value;
|
| - temps_[0] = temp;
|
| - }
|
| -
|
| - DECLARE_CONCRETE_INSTRUCTION(ClassOfTest, "class-of-test")
|
| - DECLARE_HYDROGEN_ACCESSOR(ClassOfTest)
|
| -
|
| - virtual void PrintDataTo(StringStream* stream);
|
| -};
|
| -
|
| -
|
| class LClassOfTestAndBranch: public LControlInstruction<1, 2> {
|
| public:
|
| LClassOfTestAndBranch(LOperand* value, LOperand* temp, LOperand* temp2) {
|
| @@ -899,40 +729,27 @@
|
|
|
| DECLARE_CONCRETE_INSTRUCTION(ClassOfTestAndBranch,
|
| "class-of-test-and-branch")
|
| - DECLARE_HYDROGEN_ACCESSOR(ClassOfTest)
|
| + DECLARE_HYDROGEN_ACCESSOR(ClassOfTestAndBranch)
|
|
|
| virtual void PrintDataTo(StringStream* stream);
|
| };
|
|
|
|
|
| -class LCmpT: public LTemplateInstruction<1, 2, 0> {
|
| +class LCmpT: public LTemplateInstruction<1, 3, 0> {
|
| public:
|
| - LCmpT(LOperand* left, LOperand* right) {
|
| - inputs_[0] = left;
|
| - inputs_[1] = right;
|
| + LCmpT(LOperand* context, LOperand* left, LOperand* right) {
|
| + inputs_[0] = context;
|
| + inputs_[1] = left;
|
| + inputs_[2] = right;
|
| }
|
|
|
| DECLARE_CONCRETE_INSTRUCTION(CmpT, "cmp-t")
|
| - DECLARE_HYDROGEN_ACCESSOR(Compare)
|
| + DECLARE_HYDROGEN_ACCESSOR(CompareGeneric)
|
|
|
| Token::Value op() const { return hydrogen()->token(); }
|
| };
|
|
|
|
|
| -class LCmpTAndBranch: public LControlInstruction<2, 0> {
|
| - public:
|
| - LCmpTAndBranch(LOperand* left, LOperand* right) {
|
| - inputs_[0] = left;
|
| - inputs_[1] = right;
|
| - }
|
| -
|
| - DECLARE_CONCRETE_INSTRUCTION(CmpTAndBranch, "cmp-t-and-branch")
|
| - DECLARE_HYDROGEN_ACCESSOR(Compare)
|
| -
|
| - Token::Value op() const { return hydrogen()->token(); }
|
| -};
|
| -
|
| -
|
| class LInstanceOf: public LTemplateInstruction<1, 3, 0> {
|
| public:
|
| LInstanceOf(LOperand* context, LOperand* left, LOperand* right) {
|
| @@ -947,24 +764,11 @@
|
| };
|
|
|
|
|
| -class LInstanceOfAndBranch: public LControlInstruction<3, 0> {
|
| +class LInstanceOfKnownGlobal: public LTemplateInstruction<1, 2, 1> {
|
| public:
|
| - LInstanceOfAndBranch(LOperand* context, LOperand* left, LOperand* right) {
|
| + LInstanceOfKnownGlobal(LOperand* context, LOperand* value, LOperand* temp) {
|
| inputs_[0] = context;
|
| - inputs_[1] = left;
|
| - inputs_[2] = right;
|
| - }
|
| -
|
| - DECLARE_CONCRETE_INSTRUCTION(InstanceOfAndBranch, "instance-of-and-branch")
|
| -
|
| - LOperand* context() { return inputs_[0]; }
|
| -};
|
| -
|
| -
|
| -class LInstanceOfKnownGlobal: public LTemplateInstruction<1, 1, 1> {
|
| - public:
|
| - LInstanceOfKnownGlobal(LOperand* value, LOperand* temp) {
|
| - inputs_[0] = value;
|
| + inputs_[1] = value;
|
| temps_[0] = temp;
|
| }
|
|
|
| @@ -1077,7 +881,7 @@
|
| }
|
|
|
| DECLARE_CONCRETE_INSTRUCTION(Branch, "branch")
|
| - DECLARE_HYDROGEN_ACCESSOR(Value)
|
| + DECLARE_HYDROGEN_ACCESSOR(Branch)
|
|
|
| virtual void PrintDataTo(StringStream* stream);
|
| };
|
| @@ -1137,6 +941,17 @@
|
| };
|
|
|
|
|
| +class LElementsKind: public LTemplateInstruction<1, 1, 0> {
|
| + public:
|
| + explicit LElementsKind(LOperand* value) {
|
| + inputs_[0] = value;
|
| + }
|
| +
|
| + DECLARE_CONCRETE_INSTRUCTION(ElementsKind, "elements-kind")
|
| + DECLARE_HYDROGEN_ACCESSOR(ElementsKind)
|
| +};
|
| +
|
| +
|
| class LValueOf: public LTemplateInstruction<1, 1, 1> {
|
| public:
|
| LValueOf(LOperand* value, LOperand* temp) {
|
| @@ -1149,12 +964,16 @@
|
| };
|
|
|
|
|
| -class LThrow: public LTemplateInstruction<0, 1, 0> {
|
| +class LThrow: public LTemplateInstruction<0, 2, 0> {
|
| public:
|
| - explicit LThrow(LOperand* value) {
|
| - inputs_[0] = value;
|
| + LThrow(LOperand* context, LOperand* value) {
|
| + inputs_[0] = context;
|
| + inputs_[1] = value;
|
| }
|
|
|
| + LOperand* context() { return inputs_[0]; }
|
| + LOperand* value() { return inputs_[1]; }
|
| +
|
| DECLARE_CONCRETE_INSTRUCTION(Throw, "throw")
|
| };
|
|
|
| @@ -1212,12 +1031,16 @@
|
| };
|
|
|
|
|
| -class LArithmeticT: public LTemplateInstruction<1, 2, 0> {
|
| +class LArithmeticT: public LTemplateInstruction<1, 3, 0> {
|
| public:
|
| - LArithmeticT(Token::Value op, LOperand* left, LOperand* right)
|
| + LArithmeticT(Token::Value op,
|
| + LOperand* context,
|
| + LOperand* left,
|
| + LOperand* right)
|
| : op_(op) {
|
| - inputs_[0] = left;
|
| - inputs_[1] = right;
|
| + inputs_[0] = context;
|
| + inputs_[1] = left;
|
| + inputs_[2] = right;
|
| }
|
|
|
| virtual Opcode opcode() const { return LInstruction::kArithmeticT; }
|
| @@ -1225,6 +1048,9 @@
|
| virtual const char* Mnemonic() const;
|
|
|
| Token::Value op() const { return op_; }
|
| + LOperand* context() { return inputs_[0]; }
|
| + LOperand* left() { return inputs_[1]; }
|
| + LOperand* right() { return inputs_[2]; }
|
|
|
| private:
|
| Token::Value op_;
|
| @@ -1254,16 +1080,18 @@
|
| };
|
|
|
|
|
| -class LLoadNamedFieldPolymorphic: public LTemplateInstruction<1, 1, 0> {
|
| +class LLoadNamedFieldPolymorphic: public LTemplateInstruction<1, 2, 0> {
|
| public:
|
| - explicit LLoadNamedFieldPolymorphic(LOperand* object) {
|
| - inputs_[0] = object;
|
| + LLoadNamedFieldPolymorphic(LOperand* context, LOperand* object) {
|
| + inputs_[0] = context;
|
| + inputs_[1] = object;
|
| }
|
|
|
| DECLARE_CONCRETE_INSTRUCTION(LoadNamedField, "load-named-field-polymorphic")
|
| DECLARE_HYDROGEN_ACCESSOR(LoadNamedFieldPolymorphic)
|
|
|
| - LOperand* object() { return inputs_[0]; }
|
| + LOperand* context() { return inputs_[0]; }
|
| + LOperand* object() { return inputs_[1]; }
|
| };
|
|
|
|
|
| @@ -1347,8 +1175,8 @@
|
|
|
| LOperand* external_pointer() { return inputs_[0]; }
|
| LOperand* key() { return inputs_[1]; }
|
| - ExternalArrayType array_type() const {
|
| - return hydrogen()->array_type();
|
| + JSObject::ElementsKind elements_kind() const {
|
| + return hydrogen()->elements_kind();
|
| }
|
| };
|
|
|
| @@ -1408,9 +1236,9 @@
|
|
|
| class LStoreGlobalGeneric: public LTemplateInstruction<0, 3, 0> {
|
| public:
|
| - explicit LStoreGlobalGeneric(LOperand* context,
|
| - LOperand* global_object,
|
| - LOperand* value) {
|
| + LStoreGlobalGeneric(LOperand* context,
|
| + LOperand* global_object,
|
| + LOperand* value) {
|
| inputs_[0] = context;
|
| inputs_[1] = global_object;
|
| inputs_[2] = value;
|
| @@ -1473,6 +1301,11 @@
|
| };
|
|
|
|
|
| +class LThisFunction: public LTemplateInstruction<1, 0, 0> {
|
| + DECLARE_CONCRETE_INSTRUCTION(ThisFunction, "this-function")
|
| +};
|
| +
|
| +
|
| class LContext: public LTemplateInstruction<1, 0, 0> {
|
| public:
|
| DECLARE_CONCRETE_INSTRUCTION(Context, "context")
|
| @@ -1643,11 +1476,15 @@
|
| };
|
|
|
|
|
| -class LCallRuntime: public LTemplateInstruction<1, 0, 0> {
|
| +class LCallRuntime: public LTemplateInstruction<1, 1, 0> {
|
| public:
|
| + explicit LCallRuntime(LOperand* context) {
|
| + inputs_[0] = context;
|
| + }
|
| DECLARE_CONCRETE_INSTRUCTION(CallRuntime, "call-runtime")
|
| DECLARE_HYDROGEN_ACCESSOR(CallRuntime)
|
|
|
| + LOperand* context() { return inputs_[0]; }
|
| const Runtime::Function* function() const { return hydrogen()->function(); }
|
| int arity() const { return hydrogen()->argument_count(); }
|
| };
|
| @@ -1693,7 +1530,7 @@
|
| }
|
|
|
| DECLARE_CONCRETE_INSTRUCTION(DoubleToI, "double-to-i")
|
| - DECLARE_HYDROGEN_ACCESSOR(Change)
|
| + DECLARE_HYDROGEN_ACCESSOR(UnaryOperation)
|
|
|
| bool truncating() { return hydrogen()->CanTruncateToInt32(); }
|
| };
|
| @@ -1708,7 +1545,7 @@
|
| }
|
|
|
| DECLARE_CONCRETE_INSTRUCTION(TaggedToI, "tagged-to-i")
|
| - DECLARE_HYDROGEN_ACCESSOR(Change)
|
| + DECLARE_HYDROGEN_ACCESSOR(UnaryOperation)
|
|
|
| bool truncating() { return hydrogen()->CanTruncateToInt32(); }
|
| };
|
| @@ -1731,6 +1568,7 @@
|
| }
|
|
|
| DECLARE_CONCRETE_INSTRUCTION(NumberUntagD, "double-untag")
|
| + DECLARE_HYDROGEN_ACCESSOR(Change);
|
| };
|
|
|
|
|
| @@ -1832,8 +1670,8 @@
|
| LOperand* external_pointer() { return inputs_[0]; }
|
| LOperand* key() { return inputs_[1]; }
|
| LOperand* value() { return inputs_[2]; }
|
| - ExternalArrayType array_type() const {
|
| - return hydrogen()->array_type();
|
| + JSObject::ElementsKind elements_kind() const {
|
| + return hydrogen()->elements_kind();
|
| }
|
| };
|
|
|
| @@ -1863,46 +1701,52 @@
|
| };
|
|
|
|
|
| -class LStringAdd: public LTemplateInstruction<1, 2, 0> {
|
| +class LStringAdd: public LTemplateInstruction<1, 3, 0> {
|
| public:
|
| - LStringAdd(LOperand* left, LOperand* right) {
|
| - inputs_[0] = left;
|
| - inputs_[1] = right;
|
| + LStringAdd(LOperand* context, LOperand* left, LOperand* right) {
|
| + inputs_[0] = context;
|
| + inputs_[1] = left;
|
| + inputs_[2] = right;
|
| }
|
|
|
| DECLARE_CONCRETE_INSTRUCTION(StringAdd, "string-add")
|
| DECLARE_HYDROGEN_ACCESSOR(StringAdd)
|
|
|
| - LOperand* left() { return inputs_[0]; }
|
| - LOperand* right() { return inputs_[1]; }
|
| + LOperand* context() { return inputs_[0]; }
|
| + LOperand* left() { return inputs_[1]; }
|
| + LOperand* right() { return inputs_[2]; }
|
| };
|
|
|
|
|
| -class LStringCharCodeAt: public LTemplateInstruction<1, 2, 0> {
|
| +class LStringCharCodeAt: public LTemplateInstruction<1, 3, 0> {
|
| public:
|
| - LStringCharCodeAt(LOperand* string, LOperand* index) {
|
| - inputs_[0] = string;
|
| - inputs_[1] = index;
|
| + LStringCharCodeAt(LOperand* context, LOperand* string, LOperand* index) {
|
| + inputs_[0] = context;
|
| + inputs_[1] = string;
|
| + inputs_[2] = index;
|
| }
|
|
|
| DECLARE_CONCRETE_INSTRUCTION(StringCharCodeAt, "string-char-code-at")
|
| DECLARE_HYDROGEN_ACCESSOR(StringCharCodeAt)
|
|
|
| - LOperand* string() { return inputs_[0]; }
|
| - LOperand* index() { return inputs_[1]; }
|
| + LOperand* context() { return inputs_[0]; }
|
| + LOperand* string() { return inputs_[1]; }
|
| + LOperand* index() { return inputs_[2]; }
|
| };
|
|
|
|
|
| -class LStringCharFromCode: public LTemplateInstruction<1, 1, 0> {
|
| +class LStringCharFromCode: public LTemplateInstruction<1, 2, 0> {
|
| public:
|
| - explicit LStringCharFromCode(LOperand* char_code) {
|
| - inputs_[0] = char_code;
|
| + LStringCharFromCode(LOperand* context, LOperand* char_code) {
|
| + inputs_[0] = context;
|
| + inputs_[1] = char_code;
|
| }
|
|
|
| DECLARE_CONCRETE_INSTRUCTION(StringCharFromCode, "string-char-from-code")
|
| DECLARE_HYDROGEN_ACCESSOR(StringCharFromCode)
|
|
|
| - LOperand* char_code() { return inputs_[0]; }
|
| + LOperand* context() { return inputs_[0]; }
|
| + LOperand* char_code() { return inputs_[1]; }
|
| };
|
|
|
|
|
| @@ -2024,8 +1868,14 @@
|
| };
|
|
|
|
|
| -class LArrayLiteral: public LTemplateInstruction<1, 0, 0> {
|
| +class LArrayLiteral: public LTemplateInstruction<1, 1, 0> {
|
| public:
|
| + explicit LArrayLiteral(LOperand* context) {
|
| + inputs_[0] = context;
|
| + }
|
| +
|
| + LOperand* context() { return inputs_[0]; }
|
| +
|
| DECLARE_CONCRETE_INSTRUCTION(ArrayLiteral, "array-literal")
|
| DECLARE_HYDROGEN_ACCESSOR(ArrayLiteral)
|
| };
|
| @@ -2037,22 +1887,34 @@
|
| inputs_[0] = context;
|
| }
|
|
|
| + LOperand* context() { return inputs_[0]; }
|
| +
|
| DECLARE_CONCRETE_INSTRUCTION(ObjectLiteral, "object-literal")
|
| DECLARE_HYDROGEN_ACCESSOR(ObjectLiteral)
|
| -
|
| - LOperand* context() { return inputs_[0]; }
|
| };
|
|
|
|
|
| -class LRegExpLiteral: public LTemplateInstruction<1, 0, 0> {
|
| +class LRegExpLiteral: public LTemplateInstruction<1, 1, 0> {
|
| public:
|
| + explicit LRegExpLiteral(LOperand* context) {
|
| + inputs_[0] = context;
|
| + }
|
| +
|
| + LOperand* context() { return inputs_[0]; }
|
| +
|
| DECLARE_CONCRETE_INSTRUCTION(RegExpLiteral, "regexp-literal")
|
| DECLARE_HYDROGEN_ACCESSOR(RegExpLiteral)
|
| };
|
|
|
|
|
| -class LFunctionLiteral: public LTemplateInstruction<1, 0, 0> {
|
| +class LFunctionLiteral: public LTemplateInstruction<1, 1, 0> {
|
| public:
|
| + explicit LFunctionLiteral(LOperand* context) {
|
| + inputs_[0] = context;
|
| + }
|
| +
|
| + LOperand* context() { return inputs_[0]; }
|
| +
|
| DECLARE_CONCRETE_INSTRUCTION(FunctionLiteral, "function-literal")
|
| DECLARE_HYDROGEN_ACCESSOR(FunctionLiteral)
|
|
|
| @@ -2071,31 +1933,17 @@
|
| };
|
|
|
|
|
| -class LTypeof: public LTemplateInstruction<1, 1, 0> {
|
| +class LTypeof: public LTemplateInstruction<1, 2, 0> {
|
| public:
|
| - explicit LTypeof(LOperand* value) {
|
| - inputs_[0] = value;
|
| + LTypeof(LOperand* context, LOperand* value) {
|
| + inputs_[0] = context;
|
| + inputs_[1] = value;
|
| }
|
|
|
| DECLARE_CONCRETE_INSTRUCTION(Typeof, "typeof")
|
| };
|
|
|
|
|
| -class LTypeofIs: public LTemplateInstruction<1, 1, 0> {
|
| - public:
|
| - explicit LTypeofIs(LOperand* value) {
|
| - inputs_[0] = value;
|
| - }
|
| -
|
| - DECLARE_CONCRETE_INSTRUCTION(TypeofIs, "typeof-is")
|
| - DECLARE_HYDROGEN_ACCESSOR(TypeofIs)
|
| -
|
| - Handle<String> type_literal() { return hydrogen()->type_literal(); }
|
| -
|
| - virtual void PrintDataTo(StringStream* stream);
|
| -};
|
| -
|
| -
|
| class LTypeofIsAndBranch: public LControlInstruction<1, 0> {
|
| public:
|
| explicit LTypeofIsAndBranch(LOperand* value) {
|
| @@ -2103,7 +1951,7 @@
|
| }
|
|
|
| DECLARE_CONCRETE_INSTRUCTION(TypeofIsAndBranch, "typeof-is-and-branch")
|
| - DECLARE_HYDROGEN_ACCESSOR(TypeofIs)
|
| + DECLARE_HYDROGEN_ACCESSOR(TypeofIsAndBranch)
|
|
|
| Handle<String> type_literal() { return hydrogen()->type_literal(); }
|
|
|
| @@ -2111,17 +1959,19 @@
|
| };
|
|
|
|
|
| -class LDeleteProperty: public LTemplateInstruction<1, 2, 0> {
|
| +class LDeleteProperty: public LTemplateInstruction<1, 3, 0> {
|
| public:
|
| - LDeleteProperty(LOperand* obj, LOperand* key) {
|
| - inputs_[0] = obj;
|
| - inputs_[1] = key;
|
| + LDeleteProperty(LOperand* context, LOperand* obj, LOperand* key) {
|
| + inputs_[0] = context;
|
| + inputs_[1] = obj;
|
| + inputs_[2] = key;
|
| }
|
|
|
| DECLARE_CONCRETE_INSTRUCTION(DeleteProperty, "delete-property")
|
|
|
| - LOperand* object() { return inputs_[0]; }
|
| - LOperand* key() { return inputs_[1]; }
|
| + LOperand* context() { return inputs_[0]; }
|
| + LOperand* object() { return inputs_[1]; }
|
| + LOperand* key() { return inputs_[2]; }
|
| };
|
|
|
|
|
| @@ -2148,21 +1998,35 @@
|
| };
|
|
|
|
|
| -class LStackCheck: public LTemplateInstruction<0, 0, 0> {
|
| +class LStackCheck: public LTemplateInstruction<0, 1, 0> {
|
| public:
|
| + explicit LStackCheck(LOperand* context) {
|
| + inputs_[0] = context;
|
| + }
|
| +
|
| + LOperand* context() { return inputs_[0]; }
|
| +
|
| DECLARE_CONCRETE_INSTRUCTION(StackCheck, "stack-check")
|
| + DECLARE_HYDROGEN_ACCESSOR(StackCheck)
|
| +
|
| + Label* done_label() { return &done_label_; }
|
| +
|
| + private:
|
| + Label done_label_;
|
| };
|
|
|
|
|
| -class LIn: public LTemplateInstruction<1, 2, 0> {
|
| +class LIn: public LTemplateInstruction<1, 3, 0> {
|
| public:
|
| - LIn(LOperand* key, LOperand* object) {
|
| - inputs_[0] = key;
|
| - inputs_[1] = object;
|
| + LIn(LOperand* context, LOperand* key, LOperand* object) {
|
| + inputs_[0] = context;
|
| + inputs_[1] = key;
|
| + inputs_[2] = object;
|
| }
|
|
|
| - LOperand* key() { return inputs_[0]; }
|
| - LOperand* object() { return inputs_[1]; }
|
| + LOperand* context() { return inputs_[0]; }
|
| + LOperand* key() { return inputs_[1]; }
|
| + LOperand* object() { return inputs_[2]; }
|
|
|
| DECLARE_CONCRETE_INSTRUCTION(In, "in")
|
| };
|
| @@ -2171,7 +2035,7 @@
|
| class LChunkBuilder;
|
| class LChunk: public ZoneObject {
|
| public:
|
| - explicit LChunk(CompilationInfo* info, HGraph* graph)
|
| + LChunk(CompilationInfo* info, HGraph* graph)
|
| : spill_slot_count_(0),
|
| info_(info),
|
| graph_(graph),
|
|
|