| Index: src/x64/lithium-x64.cc
|
| diff --git a/src/x64/lithium-x64.cc b/src/x64/lithium-x64.cc
|
| index c567b73d1c78cdf029b6d847afe28a2dc3806976..db22185ed334e1941e0d488a964b0ccf3e874321 100644
|
| --- a/src/x64/lithium-x64.cc
|
| +++ b/src/x64/lithium-x64.cc
|
| @@ -1826,13 +1826,13 @@ LInstruction* LChunkBuilder::DoChange(HChange* instr) {
|
| if (to.IsTagged()) {
|
| HValue* val = instr->value();
|
| LOperand* value = UseRegister(val);
|
| - if (val->CheckFlag(HInstruction::kUint32)) {
|
| + if (!instr->CheckFlag(HValue::kCanOverflow)) {
|
| + return DefineAsRegister(new(zone()) LSmiTag(value));
|
| + } else if (val->CheckFlag(HInstruction::kUint32)) {
|
| LOperand* temp1 = TempRegister();
|
| LOperand* temp2 = FixedTemp(xmm1);
|
| LNumberTagU* result = new(zone()) LNumberTagU(value, temp1, temp2);
|
| return AssignEnvironment(AssignPointerMap(DefineSameAsFirst(result)));
|
| - } else if (val->HasRange() && val->range()->IsInSmiRange()) {
|
| - return DefineSameAsFirst(new(zone()) LSmiTag(value));
|
| } else {
|
| LNumberTagI* result = new(zone()) LNumberTagI(value);
|
| return AssignEnvironment(AssignPointerMap(DefineSameAsFirst(result)));
|
| @@ -1840,20 +1840,12 @@ LInstruction* LChunkBuilder::DoChange(HChange* instr) {
|
| } else if (to.IsSmi()) {
|
| HValue* val = instr->value();
|
| LOperand* value = UseRegister(val);
|
| - LInstruction* result = NULL;
|
| - if (val->CheckFlag(HInstruction::kUint32)) {
|
| - result = DefineAsRegister(new(zone()) LUint32ToSmi(value));
|
| - if (val->HasRange() && val->range()->IsInSmiRange() &&
|
| - val->range()->upper() != kMaxInt) {
|
| - return result;
|
| - }
|
| - } else {
|
| - result = DefineAsRegister(new(zone()) LInteger32ToSmi(value));
|
| - if (val->HasRange() && val->range()->IsInSmiRange()) {
|
| - return result;
|
| - }
|
| + LInstruction* result = DefineAsRegister(new(zone()) LSmiTag(value));
|
| + if (instr->CheckFlag(HValue::kCanOverflow)) {
|
| + ASSERT(val->CheckFlag(HValue::kUint32));
|
| + result = AssignEnvironment(result);
|
| }
|
| - return AssignEnvironment(result);
|
| + return result;
|
| } else {
|
| if (instr->value()->CheckFlag(HInstruction::kUint32)) {
|
| LOperand* temp = FixedTemp(xmm1);
|
|
|