Index: src/ia32/lithium-ia32.cc |
diff --git a/src/ia32/lithium-ia32.cc b/src/ia32/lithium-ia32.cc |
index e5b1474b68295ee34f0b4d4ba0d0213ed371bb15..c5cd5b484c6f63e71dd51ec5009e9e51939c8b67 100644 |
--- a/src/ia32/lithium-ia32.cc |
+++ b/src/ia32/lithium-ia32.cc |
@@ -769,9 +769,9 @@ LInstruction* LChunkBuilder::DoDeoptimize(HDeoptimize* instr) { |
LInstruction* LChunkBuilder::DoShift(Token::Value op, |
HBitwiseBinaryOperation* instr) { |
- if (instr->representation().IsTagged()) { |
- ASSERT(instr->left()->representation().IsTagged()); |
- ASSERT(instr->right()->representation().IsTagged()); |
+ if (instr->representation().IsSmiOrTagged()) { |
+ ASSERT(instr->left()->representation().IsSmiOrTagged()); |
+ ASSERT(instr->right()->representation().IsSmiOrTagged()); |
LOperand* context = UseFixed(instr->context(), esi); |
LOperand* left = UseFixed(instr->left(), edx); |
@@ -840,8 +840,8 @@ LInstruction* LChunkBuilder::DoArithmeticT(Token::Value op, |
op == Token::SUB); |
HValue* left = instr->left(); |
HValue* right = instr->right(); |
- ASSERT(left->representation().IsTagged()); |
- ASSERT(right->representation().IsTagged()); |
+ ASSERT(left->representation().IsSmiOrTagged()); |
+ ASSERT(right->representation().IsSmiOrTagged()); |
LOperand* context = UseFixed(instr->context(), esi); |
LOperand* left_operand = UseFixed(left, edx); |
LOperand* right_operand = UseFixed(right, eax); |
@@ -1391,9 +1391,9 @@ LInstruction* LChunkBuilder::DoBitwise(HBitwise* instr) { |
LOperand* right = UseOrConstantAtStart(instr->BetterRightOperand()); |
return DefineSameAsFirst(new(zone()) LBitI(left, right)); |
} else { |
- ASSERT(instr->representation().IsTagged()); |
- ASSERT(instr->left()->representation().IsTagged()); |
- ASSERT(instr->right()->representation().IsTagged()); |
+ ASSERT(instr->representation().IsSmiOrTagged()); |
+ ASSERT(instr->left()->representation().IsSmiOrTagged()); |
+ ASSERT(instr->right()->representation().IsSmiOrTagged()); |
LOperand* context = UseFixed(instr->context(), esi); |
LOperand* left = UseFixed(instr->left(), edx); |
@@ -1434,7 +1434,7 @@ LInstruction* LChunkBuilder::DoDiv(HDiv* instr) { |
LDivI* result = new(zone()) LDivI(dividend, divisor, temp); |
return AssignEnvironment(DefineFixed(result, eax)); |
} else { |
- ASSERT(instr->representation().IsTagged()); |
+ ASSERT(instr->representation().IsSmiOrTagged()); |
return DoArithmeticT(Token::DIV, instr); |
} |
} |
@@ -1537,7 +1537,7 @@ LInstruction* LChunkBuilder::DoMod(HMod* instr) { |
instr->CheckFlag(HValue::kCanOverflow)) |
? AssignEnvironment(result) |
: result; |
- } else if (instr->representation().IsTagged()) { |
+ } else if (instr->representation().IsSmiOrTagged()) { |
return DoArithmeticT(Token::MOD, instr); |
} else { |
ASSERT(instr->representation().IsDouble()); |
@@ -1571,7 +1571,7 @@ LInstruction* LChunkBuilder::DoMul(HMul* instr) { |
} else if (instr->representation().IsDouble()) { |
return DoArithmeticD(Token::MUL, instr); |
} else { |
- ASSERT(instr->representation().IsTagged()); |
+ ASSERT(instr->representation().IsSmiOrTagged()); |
return DoArithmeticT(Token::MUL, instr); |
} |
} |
@@ -1592,7 +1592,7 @@ LInstruction* LChunkBuilder::DoSub(HSub* instr) { |
} else if (instr->representation().IsDouble()) { |
return DoArithmeticD(Token::SUB, instr); |
} else { |
- ASSERT(instr->representation().IsTagged()); |
+ ASSERT(instr->representation().IsSmiOrTagged()); |
return DoArithmeticT(Token::SUB, instr); |
} |
} |
@@ -1624,7 +1624,7 @@ LInstruction* LChunkBuilder::DoAdd(HAdd* instr) { |
} else if (instr->representation().IsDouble()) { |
return DoArithmeticD(Token::ADD, instr); |
} else { |
- ASSERT(instr->representation().IsTagged()); |
+ ASSERT(instr->representation().IsSmiOrTagged()); |
return DoArithmeticT(Token::ADD, instr); |
} |
} |
@@ -1668,7 +1668,7 @@ LInstruction* LChunkBuilder::DoPower(HPower* instr) { |
LInstruction* LChunkBuilder::DoRandom(HRandom* instr) { |
ASSERT(instr->representation().IsDouble()); |
- ASSERT(instr->global_object()->representation().IsTagged()); |
+ ASSERT(instr->global_object()->representation().IsSmiOrTagged()); |
LOperand* global_object = UseFixed(instr->global_object(), eax); |
LRandom* result = new(zone()) LRandom(global_object); |
return MarkAsCall(DefineFixedDouble(result, xmm1), instr); |
@@ -1676,8 +1676,8 @@ LInstruction* LChunkBuilder::DoRandom(HRandom* instr) { |
LInstruction* LChunkBuilder::DoCompareGeneric(HCompareGeneric* instr) { |
- ASSERT(instr->left()->representation().IsTagged()); |
- ASSERT(instr->right()->representation().IsTagged()); |
+ ASSERT(instr->left()->representation().IsSmiOrTagged()); |
+ ASSERT(instr->right()->representation().IsSmiOrTagged()); |
LOperand* context = UseFixed(instr->context(), esi); |
LOperand* left = UseFixed(instr->left(), edx); |
LOperand* right = UseFixed(instr->right(), eax); |
@@ -1729,7 +1729,7 @@ LInstruction* LChunkBuilder::DoCompareConstantEqAndBranch( |
LInstruction* LChunkBuilder::DoIsObjectAndBranch(HIsObjectAndBranch* instr) { |
- ASSERT(instr->value()->representation().IsTagged()); |
+ ASSERT(instr->value()->representation().IsSmiOrTagged()); |
LOperand* temp = TempRegister(); |
return new(zone()) LIsObjectAndBranch(UseRegister(instr->value()), temp); |
} |
@@ -1750,7 +1750,7 @@ LInstruction* LChunkBuilder::DoIsSmiAndBranch(HIsSmiAndBranch* instr) { |
LInstruction* LChunkBuilder::DoIsUndetectableAndBranch( |
HIsUndetectableAndBranch* instr) { |
- ASSERT(instr ->value()->representation().IsTagged()); |
+ ASSERT(instr->value()->representation().IsTagged()); |
return new(zone()) LIsUndetectableAndBranch( |
UseRegisterAtStart(instr->value()), TempRegister()); |
} |
@@ -1909,14 +1909,7 @@ LInstruction* LChunkBuilder::DoChange(HChange* instr) { |
if (from.IsSmi()) { |
if (to.IsTagged()) { |
LOperand* value = UseRegister(instr->value()); |
- // For now, always deopt on hole. |
- if (instr->value()->IsLoadKeyed() && |
- HLoadKeyed::cast(instr->value())->UsesMustHandleHole()) { |
- return AssignEnvironment( |
- DefineSameAsFirst(new(zone()) LCheckSmiAndReturn(value))); |
- } else { |
- return DefineSameAsFirst(new(zone()) LDummyUse(value)); |
- } |
+ return DefineSameAsFirst(new(zone()) LDummyUse(value)); |
} |
from = Representation::Tagged(); |
} |
@@ -1949,16 +1942,7 @@ LInstruction* LChunkBuilder::DoChange(HChange* instr) { |
ASSERT(to.IsInteger32()); |
if (instr->value()->type().IsSmi()) { |
LOperand* value = UseRegister(instr->value()); |
- LInstruction* result = |
- DefineSameAsFirst(new(zone()) LSmiUntag(value, false)); |
- if (instr->value()->IsLoadKeyed()) { |
- HLoadKeyed* load_keyed = HLoadKeyed::cast(instr->value()); |
- if (load_keyed->UsesMustHandleHole() && |
- load_keyed->hole_mode() == NEVER_RETURN_HOLE) { |
- return AssignEnvironment(result); |
- } |
- } |
- return result; |
+ return DefineSameAsFirst(new(zone()) LSmiUntag(value, false)); |
} else { |
bool truncating = instr->CanTruncateToInt32(); |
if (CpuFeatures::IsSafeForSnapshot(SSE2)) { |
@@ -2099,7 +2083,7 @@ LInstruction* LChunkBuilder::DoClampToUint8(HClampToUint8* instr) { |
LOperand* reg = UseFixed(value, eax); |
return DefineFixed(new(zone()) LClampIToUint8(reg), eax); |
} else { |
- ASSERT(input_rep.IsTagged()); |
+ ASSERT(input_rep.IsSmiOrTagged()); |
if (CpuFeatures::IsSupported(SSE2)) { |
LOperand* reg = UseFixed(value, eax); |
// Register allocator doesn't (yet) support allocation of double |