Index: src/x64/codegen-x64.cc |
=================================================================== |
--- src/x64/codegen-x64.cc (revision 5449) |
+++ src/x64/codegen-x64.cc (working copy) |
@@ -1940,6 +1940,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, |
@@ -2070,7 +2083,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_CODE_IN_STUB); |
+ CompareStub stub(cc, strict, flags); |
Result result = frame_->CallStub(&stub, &left_side, &right_side); |
result.ToRegister(); |
__ testq(result.reg(), result.reg()); |
@@ -2174,7 +2189,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); |
__ testq(answer.reg(), answer.reg()); // Sets both zero and sign flag. |
answer.Unuse(); |
@@ -2207,7 +2223,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); |
__ testq(answer.reg(), answer.reg()); // Sets both zero and sign flags. |
answer.Unuse(); |
@@ -2332,7 +2350,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(); |
__ testq(result.reg(), result.reg()); |
@@ -7395,6 +7415,7 @@ |
GenericUnaryOpStub stub( |
Token::SUB, |
overwrite, |
+ NO_UNARY_FLAGS, |
no_negative_zero ? kIgnoreNegativeZero : kStrictNegativeZero); |
Result operand = frame_->Pop(); |
Result answer = frame_->CallStub(&stub, &operand); |
@@ -7413,7 +7434,9 @@ |
Condition is_smi = masm_->CheckSmi(operand.reg()); |
smi_label.Branch(is_smi, &operand); |
- 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); |