| Index: src/x64/codegen-x64.cc
|
| ===================================================================
|
| --- src/x64/codegen-x64.cc (revision 5015)
|
| +++ src/x64/codegen-x64.cc (working copy)
|
| @@ -3373,9 +3373,12 @@
|
| }
|
|
|
| } else {
|
| - bool overwrite =
|
| + bool can_overwrite =
|
| (node->expression()->AsBinaryOperation() != NULL &&
|
| node->expression()->AsBinaryOperation()->ResultOverwriteAllowed());
|
| + UnaryOverwriteMode overwrite =
|
| + can_overwrite ? UNARY_OVERWRITE : UNARY_NO_OVERWRITE;
|
| + bool no_negative_zero = node->expression()->no_negative_zero();
|
| Load(node->expression());
|
| switch (op) {
|
| case Token::NOT:
|
| @@ -3385,7 +3388,10 @@
|
| break;
|
|
|
| case Token::SUB: {
|
| - GenericUnaryOpStub stub(Token::SUB, overwrite);
|
| + GenericUnaryOpStub stub(
|
| + Token::SUB,
|
| + overwrite,
|
| + no_negative_zero ? kIgnoreNegativeZero : kStrictNegativeZero);
|
| Result operand = frame_->Pop();
|
| Result answer = frame_->CallStub(&stub, &operand);
|
| answer.set_type_info(TypeInfo::Number());
|
| @@ -8506,6 +8512,11 @@
|
| Label try_float;
|
| __ JumpIfNotSmi(rax, &try_float);
|
|
|
| + if (negative_zero_ == kIgnoreNegativeZero) {
|
| + __ SmiCompare(rax, Smi::FromInt(0));
|
| + __ j(equal, &done);
|
| + }
|
| +
|
| // Enter runtime system if the value of the smi is zero
|
| // to make sure that we switch between 0 and -0.
|
| // Also enter it if the value of the smi is Smi::kMinValue.
|
| @@ -8513,10 +8524,14 @@
|
|
|
| // Either zero or Smi::kMinValue, neither of which become a smi when
|
| // negated.
|
| - __ SmiCompare(rax, Smi::FromInt(0));
|
| - __ j(not_equal, &slow);
|
| - __ Move(rax, Factory::minus_zero_value());
|
| - __ jmp(&done);
|
| + if (negative_zero_ == kStrictNegativeZero) {
|
| + __ SmiCompare(rax, Smi::FromInt(0));
|
| + __ j(not_equal, &slow);
|
| + __ Move(rax, Factory::minus_zero_value());
|
| + __ jmp(&done);
|
| + } else {
|
| + __ jmp(&slow);
|
| + }
|
|
|
| // Try floating point case.
|
| __ bind(&try_float);
|
| @@ -8529,7 +8544,7 @@
|
| __ shl(kScratchRegister, Immediate(63));
|
| __ xor_(rdx, kScratchRegister); // Flip sign.
|
| // rdx is value to store.
|
| - if (overwrite_) {
|
| + if (overwrite_ == UNARY_OVERWRITE) {
|
| __ movq(FieldOperand(rax, HeapNumber::kValueOffset), rdx);
|
| } else {
|
| __ AllocateHeapNumber(rcx, rbx, &slow);
|
|
|