| Index: src/code-stubs-hydrogen.cc
|
| diff --git a/src/code-stubs-hydrogen.cc b/src/code-stubs-hydrogen.cc
|
| index 03b8c18fbdae004a0c550fe0c515aa979569c397..56c2b84d9e5e273032c30705c2465e541c4996c0 100644
|
| --- a/src/code-stubs-hydrogen.cc
|
| +++ b/src/code-stubs-hydrogen.cc
|
| @@ -894,20 +894,21 @@ Handle<Code> CompareNilICStub::GenerateCode(Isolate* isolate) {
|
|
|
|
|
| template <>
|
| -HValue* CodeStubGraphBuilder<BinaryOpStub>::BuildCodeInitializedStub() {
|
| - BinaryOpStub* stub = casted_stub();
|
| - HValue* left = GetParameter(0);
|
| - HValue* right = GetParameter(1);
|
| +HValue* CodeStubGraphBuilder<BinaryOpICStub>::BuildCodeInitializedStub() {
|
| + BinaryOpIC::State state = casted_stub()->state();
|
|
|
| - Handle<Type> left_type = stub->GetLeftType(isolate());
|
| - Handle<Type> right_type = stub->GetRightType(isolate());
|
| - Handle<Type> result_type = stub->GetResultType(isolate());
|
| + HValue* left = GetParameter(BinaryOpICStub::kLeft);
|
| + HValue* right = GetParameter(BinaryOpICStub::kRight);
|
| +
|
| + Handle<Type> left_type = state.GetLeftType(isolate());
|
| + Handle<Type> right_type = state.GetRightType(isolate());
|
| + Handle<Type> result_type = state.GetResultType(isolate());
|
|
|
| ASSERT(!left_type->Is(Type::None()) && !right_type->Is(Type::None()) &&
|
| - (stub->HasSideEffects(isolate()) || !result_type->Is(Type::None())));
|
| + (state.HasSideEffects() || !result_type->Is(Type::None())));
|
|
|
| HValue* result = NULL;
|
| - if (stub->operation() == Token::ADD &&
|
| + if (state.op() == Token::ADD &&
|
| (left_type->Maybe(Type::String()) || right_type->Maybe(Type::String())) &&
|
| !left_type->Is(Type::String()) && !right_type->Is(Type::String())) {
|
| // For the generic add stub a fast case for string addition is performance
|
| @@ -918,16 +919,16 @@ HValue* CodeStubGraphBuilder<BinaryOpStub>::BuildCodeInitializedStub() {
|
| if_leftisstring.Then();
|
| {
|
| Push(BuildBinaryOperation(
|
| - stub->operation(), left, right,
|
| + state.op(), left, right,
|
| handle(Type::String(), isolate()), right_type,
|
| - result_type, stub->fixed_right_arg()));
|
| + result_type, state.fixed_right_arg()));
|
| }
|
| if_leftisstring.Else();
|
| {
|
| Push(BuildBinaryOperation(
|
| - stub->operation(), left, right,
|
| + state.op(), left, right,
|
| left_type, right_type, result_type,
|
| - stub->fixed_right_arg()));
|
| + state.fixed_right_arg()));
|
| }
|
| if_leftisstring.End();
|
| result = Pop();
|
| @@ -937,32 +938,32 @@ HValue* CodeStubGraphBuilder<BinaryOpStub>::BuildCodeInitializedStub() {
|
| if_rightisstring.Then();
|
| {
|
| Push(BuildBinaryOperation(
|
| - stub->operation(), left, right,
|
| + state.op(), left, right,
|
| left_type, handle(Type::String(), isolate()),
|
| - result_type, stub->fixed_right_arg()));
|
| + result_type, state.fixed_right_arg()));
|
| }
|
| if_rightisstring.Else();
|
| {
|
| Push(BuildBinaryOperation(
|
| - stub->operation(), left, right,
|
| + state.op(), left, right,
|
| left_type, right_type, result_type,
|
| - stub->fixed_right_arg()));
|
| + state.fixed_right_arg()));
|
| }
|
| if_rightisstring.End();
|
| result = Pop();
|
| }
|
| } else {
|
| result = BuildBinaryOperation(
|
| - stub->operation(), left, right,
|
| + state.op(), left, right,
|
| left_type, right_type, result_type,
|
| - stub->fixed_right_arg());
|
| + state.fixed_right_arg());
|
| }
|
|
|
| // If we encounter a generic argument, the number conversion is
|
| // observable, thus we cannot afford to bail out after the fact.
|
| - if (!stub->HasSideEffects(isolate())) {
|
| + if (!state.HasSideEffects()) {
|
| if (result_type->Is(Type::Smi())) {
|
| - if (stub->operation() == Token::SHR) {
|
| + if (state.op() == Token::SHR) {
|
| // TODO(olivf) Replace this by a SmiTagU Instruction.
|
| // 0x40000000: this number would convert to negative when interpreting
|
| // the register as signed value;
|
| @@ -980,8 +981,8 @@ HValue* CodeStubGraphBuilder<BinaryOpStub>::BuildCodeInitializedStub() {
|
|
|
| // Reuse the double box of one of the operands if we are allowed to (i.e.
|
| // chained binops).
|
| - if (stub->CanReuseDoubleBox()) {
|
| - HValue* operand = (stub->mode() == OVERWRITE_LEFT) ? left : right;
|
| + if (state.CanReuseDoubleBox()) {
|
| + HValue* operand = (state.mode() == OVERWRITE_LEFT) ? left : right;
|
| IfBuilder if_heap_number(this);
|
| if_heap_number.IfNot<HIsSmiAndBranch>(operand);
|
| if_heap_number.Then();
|
| @@ -997,7 +998,7 @@ HValue* CodeStubGraphBuilder<BinaryOpStub>::BuildCodeInitializedStub() {
|
| }
|
|
|
|
|
| -Handle<Code> BinaryOpStub::GenerateCode(Isolate* isolate) {
|
| +Handle<Code> BinaryOpICStub::GenerateCode(Isolate* isolate) {
|
| return DoGenerateCode(isolate, this);
|
| }
|
|
|
|
|