| Index: src/ia32/codegen-ia32.cc
|
| ===================================================================
|
| --- src/ia32/codegen-ia32.cc (revision 5449)
|
| +++ src/ia32/codegen-ia32.cc (working copy)
|
| @@ -2646,6 +2646,19 @@
|
| }
|
|
|
|
|
| +static CompareFlags ComputeCompareFlags(NaNInformation nan_info,
|
| + bool inline_number_compare) {
|
| + CompareFlags flags = NO_SMI_COMPARE_IN_STUB;
|
| + if (nan_info == kCantBothBeNaN) {
|
| + flags = static_cast<CompareFlags>(flags | CANT_BOTH_BE_NAN);
|
| + }
|
| + if (inline_number_compare) {
|
| + flags = static_cast<CompareFlags>(flags | NO_NUMBER_COMPARE_IN_STUB);
|
| + }
|
| + return flags;
|
| +}
|
| +
|
| +
|
| void CodeGenerator::Comparison(AstNode* node,
|
| Condition cc,
|
| bool strict,
|
| @@ -2773,7 +2786,9 @@
|
|
|
| // Setup and call the compare stub.
|
| is_not_string.Bind(&left_side);
|
| - CompareStub stub(cc, strict, kCantBothBeNaN);
|
| + CompareFlags flags =
|
| + static_cast<CompareFlags>(CANT_BOTH_BE_NAN | NO_SMI_COMPARE_IN_STUB);
|
| + CompareStub stub(cc, strict, flags);
|
| Result result = frame_->CallStub(&stub, &left_side, &right_side);
|
| result.ToRegister();
|
| __ cmp(result.reg(), 0);
|
| @@ -2867,7 +2882,8 @@
|
|
|
| // End of in-line compare, call out to the compare stub. Don't include
|
| // number comparison in the stub if it was inlined.
|
| - CompareStub stub(cc, strict, nan_info, !inline_number_compare);
|
| + CompareFlags flags = ComputeCompareFlags(nan_info, inline_number_compare);
|
| + CompareStub stub(cc, strict, flags);
|
| Result answer = frame_->CallStub(&stub, &left_side, &right_side);
|
| __ test(answer.reg(), Operand(answer.reg()));
|
| answer.Unuse();
|
| @@ -2900,7 +2916,9 @@
|
|
|
| // End of in-line compare, call out to the compare stub. Don't include
|
| // number comparison in the stub if it was inlined.
|
| - CompareStub stub(cc, strict, nan_info, !inline_number_compare);
|
| + CompareFlags flags =
|
| + ComputeCompareFlags(nan_info, inline_number_compare);
|
| + CompareStub stub(cc, strict, flags);
|
| Result answer = frame_->CallStub(&stub, &left_side, &right_side);
|
| __ test(answer.reg(), Operand(answer.reg()));
|
| answer.Unuse();
|
| @@ -2994,7 +3012,6 @@
|
| dest->false_target()->Branch(zero);
|
| } else {
|
| // Do the smi check, then the comparison.
|
| - JumpTarget is_not_smi;
|
| __ test(left_reg, Immediate(kSmiTagMask));
|
| is_smi.Branch(zero, left_side, right_side);
|
| }
|
| @@ -3031,7 +3048,9 @@
|
| }
|
|
|
| // Setup and call the compare stub.
|
| - CompareStub stub(cc, strict, kCantBothBeNaN);
|
| + CompareFlags flags =
|
| + static_cast<CompareFlags>(CANT_BOTH_BE_NAN | NO_SMI_CODE_IN_STUB);
|
| + CompareStub stub(cc, strict, flags);
|
| Result result = frame_->CallStub(&stub, left_side, right_side);
|
| result.ToRegister();
|
| __ test(result.reg(), Operand(result.reg()));
|
| @@ -8146,6 +8165,7 @@
|
| GenericUnaryOpStub stub(
|
| Token::SUB,
|
| overwrite,
|
| + NO_UNARY_FLAGS,
|
| no_negative_zero ? kIgnoreNegativeZero : kStrictNegativeZero);
|
| Result operand = frame_->Pop();
|
| Result answer = frame_->CallStub(&stub, &operand);
|
| @@ -8173,7 +8193,9 @@
|
| __ test(operand.reg(), Immediate(kSmiTagMask));
|
| smi_label.Branch(zero, &operand, taken);
|
|
|
| - GenericUnaryOpStub stub(Token::BIT_NOT, overwrite);
|
| + GenericUnaryOpStub stub(Token::BIT_NOT,
|
| + overwrite,
|
| + NO_UNARY_SMI_CODE_IN_STUB);
|
| Result answer = frame_->CallStub(&stub, &operand);
|
| continue_label.Jump(&answer);
|
|
|
|
|