| Index: src/ia32/lithium-ia32.cc
|
| diff --git a/src/ia32/lithium-ia32.cc b/src/ia32/lithium-ia32.cc
|
| index dec5697f8769b861b8d72e2b44ec9647695e8cc5..90939695b78fec2268761f313916703430eb84c8 100644
|
| --- a/src/ia32/lithium-ia32.cc
|
| +++ b/src/ia32/lithium-ia32.cc
|
| @@ -1908,6 +1908,13 @@ LInstruction* LChunkBuilder::DoForceRepresentation(HForceRepresentation* bad) {
|
| LInstruction* LChunkBuilder::DoChange(HChange* instr) {
|
| Representation from = instr->from();
|
| Representation to = instr->to();
|
| + if (from.IsSmi()) {
|
| + if (to.IsTagged()) {
|
| + LOperand* value = UseRegister(instr->value());
|
| + return DefineSameAsFirst(new(zone()) LDummyUse(value));
|
| + }
|
| + from = Representation::Tagged();
|
| + }
|
| // Only mark conversions that might need to allocate as calling rather than
|
| // all changes. This makes simple, non-allocating conversion not have to force
|
| // building a stack frame.
|
| @@ -1925,6 +1932,11 @@ LInstruction* LChunkBuilder::DoChange(HChange* instr) {
|
| } else {
|
| return AssignEnvironment(DefineX87TOS(res));
|
| }
|
| + } else if (to.IsSmi()) {
|
| + HValue* val = instr->value();
|
| + LOperand* value = UseRegisterAtStart(val);
|
| + return AssignEnvironment(
|
| + DefineSameAsFirst(new(zone()) LCheckSmi(value)));
|
| } else {
|
| ASSERT(to.IsInteger32());
|
| if (instr->value()->type().IsSmi()) {
|
| @@ -1961,6 +1973,10 @@ LInstruction* LChunkBuilder::DoChange(HChange* instr) {
|
| LUnallocated* result_temp = TempRegister();
|
| LNumberTagD* result = new(zone()) LNumberTagD(value, temp);
|
| return AssignPointerMap(Define(result, result_temp));
|
| + } else if (to.IsSmi()) {
|
| + LOperand* value = UseRegister(instr->value());
|
| + return AssignEnvironment(
|
| + DefineAsRegister(new(zone()) LDoubleToSmi(value)));
|
| } else {
|
| ASSERT(to.IsInteger32());
|
| bool truncating = instr->CanTruncateToInt32();
|
| @@ -1985,6 +2001,15 @@ LInstruction* LChunkBuilder::DoChange(HChange* instr) {
|
| LNumberTagI* result = new(zone()) LNumberTagI(value);
|
| return AssignEnvironment(AssignPointerMap(DefineSameAsFirst(result)));
|
| }
|
| + } else if (to.IsSmi()) {
|
| + HValue* val = instr->value();
|
| + LOperand* value = UseRegister(val);
|
| + LInstruction* result =
|
| + DefineSameAsFirst(new(zone()) LInteger32ToSmi(value));
|
| + if (val->HasRange() && val->range()->IsInSmiRange()) {
|
| + return result;
|
| + }
|
| + return AssignEnvironment(result);
|
| } else {
|
| ASSERT(to.IsDouble());
|
| if (instr->value()->CheckFlag(HInstruction::kUint32)) {
|
| @@ -2025,13 +2050,13 @@ LInstruction* LChunkBuilder::DoCheckPrototypeMaps(HCheckPrototypeMaps* instr) {
|
|
|
| LInstruction* LChunkBuilder::DoCheckSmi(HCheckSmi* instr) {
|
| LOperand* value = UseAtStart(instr->value());
|
| - return AssignEnvironment(new(zone()) LCheckSmi(value));
|
| + return AssignEnvironment(DefineSameAsFirst(new(zone()) LCheckSmi(value)));
|
| }
|
|
|
|
|
| LInstruction* LChunkBuilder::DoCheckSmiOrInt32(HCheckSmiOrInt32* instr) {
|
| LOperand* value = UseAtStart(instr->value());
|
| - return AssignEnvironment(new(zone()) LCheckSmi(value));
|
| + return AssignEnvironment(DefineSameAsFirst(new(zone()) LCheckSmi(value)));
|
| }
|
|
|
|
|
|
|