| Index: src/ia32/full-codegen-ia32.cc
|
| ===================================================================
|
| --- src/ia32/full-codegen-ia32.cc (revision 5457)
|
| +++ src/ia32/full-codegen-ia32.cc (working copy)
|
| @@ -684,7 +684,8 @@
|
|
|
| // Perform the comparison as if via '==='.
|
| __ mov(edx, Operand(esp, 0)); // Switch value.
|
| - if (ShouldInlineSmiCase(Token::EQ_STRICT)) {
|
| + bool inline_smi_code = ShouldInlineSmiCase(Token::EQ_STRICT);
|
| + if (inline_smi_code) {
|
| Label slow_case;
|
| __ mov(ecx, edx);
|
| __ or_(ecx, Operand(eax));
|
| @@ -697,7 +698,10 @@
|
| __ bind(&slow_case);
|
| }
|
|
|
| - CompareStub stub(equal, true);
|
| + CompareFlags flags = inline_smi_code
|
| + ? NO_SMI_COMPARE_IN_STUB
|
| + : NO_COMPARE_FLAGS;
|
| + CompareStub stub(equal, true, flags);
|
| __ CallStub(&stub);
|
| __ test(eax, Operand(eax));
|
| __ j(not_equal, &next_test);
|
| @@ -988,6 +992,7 @@
|
| ? RelocInfo::CODE_TARGET
|
| : RelocInfo::CODE_TARGET_CONTEXT;
|
| __ call(ic, mode);
|
| + __ nop(); // Signal no inlined code.
|
| }
|
|
|
|
|
| @@ -3138,7 +3143,7 @@
|
| InLoopFlag in_loop = (loop_depth() > 0) ? IN_LOOP : NOT_IN_LOOP;
|
| Handle<Code> ic = CodeGenerator::ComputeCallInitialize(arg_count, in_loop);
|
| __ call(ic, RelocInfo::CODE_TARGET);
|
| - // Restore context register.
|
| + // Restore context register.
|
| __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset));
|
| } else {
|
| // Call the C runtime function.
|
| @@ -3257,7 +3262,7 @@
|
| bool can_overwrite = expr->expression()->ResultOverwriteAllowed();
|
| UnaryOverwriteMode overwrite =
|
| can_overwrite ? UNARY_OVERWRITE : UNARY_NO_OVERWRITE;
|
| - GenericUnaryOpStub stub(Token::SUB, overwrite);
|
| + GenericUnaryOpStub stub(Token::SUB, overwrite, NO_UNARY_FLAGS);
|
| // GenericUnaryOpStub expects the argument to be in the
|
| // accumulator register eax.
|
| VisitForValue(expr->expression(), kAccumulator);
|
| @@ -3272,7 +3277,8 @@
|
| // in the accumulator register eax.
|
| VisitForValue(expr->expression(), kAccumulator);
|
| Label done;
|
| - if (ShouldInlineSmiCase(expr->op())) {
|
| + bool inline_smi_case = ShouldInlineSmiCase(expr->op());
|
| + if (inline_smi_case) {
|
| Label call_stub;
|
| __ test(eax, Immediate(kSmiTagMask));
|
| __ j(not_zero, &call_stub);
|
| @@ -3284,7 +3290,10 @@
|
| bool overwrite = expr->expression()->ResultOverwriteAllowed();
|
| UnaryOverwriteMode mode =
|
| overwrite ? UNARY_OVERWRITE : UNARY_NO_OVERWRITE;
|
| - GenericUnaryOpStub stub(Token::BIT_NOT, mode);
|
| + UnaryOpFlags flags = inline_smi_case
|
| + ? NO_UNARY_SMI_CODE_IN_STUB
|
| + : NO_UNARY_FLAGS;
|
| + GenericUnaryOpStub stub(Token::BIT_NOT, mode, flags);
|
| __ CallStub(&stub);
|
| __ bind(&done);
|
| Apply(context_, eax);
|
| @@ -3483,6 +3492,7 @@
|
| // Use a regular load, not a contextual load, to avoid a reference
|
| // error.
|
| __ call(ic, RelocInfo::CODE_TARGET);
|
| + __ nop(); // Signal no inlined code.
|
| if (where == kStack) __ push(eax);
|
| } else if (proxy != NULL &&
|
| proxy->var()->slot() != NULL &&
|
| @@ -3672,7 +3682,8 @@
|
| UNREACHABLE();
|
| }
|
|
|
| - if (ShouldInlineSmiCase(op)) {
|
| + bool inline_smi_code = ShouldInlineSmiCase(op);
|
| + if (inline_smi_code) {
|
| Label slow_case;
|
| __ mov(ecx, Operand(edx));
|
| __ or_(ecx, Operand(eax));
|
| @@ -3683,7 +3694,10 @@
|
| __ bind(&slow_case);
|
| }
|
|
|
| - CompareStub stub(cc, strict);
|
| + CompareFlags flags = inline_smi_code
|
| + ? NO_SMI_COMPARE_IN_STUB
|
| + : NO_COMPARE_FLAGS;
|
| + CompareStub stub(cc, strict, flags);
|
| __ CallStub(&stub);
|
| __ test(eax, Operand(eax));
|
| Split(cc, if_true, if_false, fall_through);
|
|
|