Index: src/x64/lithium-x64.cc |
diff --git a/src/x64/lithium-x64.cc b/src/x64/lithium-x64.cc |
index db98f238912ebf072790556b80b02f84334fc9ac..cd567fbdf14d87ec3196c86a5c04e148b184bdc4 100644 |
--- a/src/x64/lithium-x64.cc |
+++ b/src/x64/lithium-x64.cc |
@@ -718,9 +718,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* left = UseFixed(instr->left(), rdx); |
LOperand* right = UseFixed(instr->right(), rax); |
@@ -788,8 +788,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* left_operand = UseFixed(left, rdx); |
LOperand* right_operand = UseFixed(right, rax); |
LArithmeticT* result = |
@@ -1308,9 +1308,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* left = UseFixed(instr->left(), rdx); |
LOperand* right = UseFixed(instr->right(), rax); |
@@ -1349,7 +1349,7 @@ LInstruction* LChunkBuilder::DoDiv(HDiv* instr) { |
LDivI* result = new(zone()) LDivI(dividend, divisor, temp); |
return AssignEnvironment(DefineFixed(result, rax)); |
} else { |
- ASSERT(instr->representation().IsTagged()); |
+ ASSERT(instr->representation().IsSmiOrTagged()); |
return DoArithmeticT(Token::DIV, instr); |
} |
} |
@@ -1450,7 +1450,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()); |
@@ -1480,7 +1480,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); |
} |
} |
@@ -1501,7 +1501,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); |
} |
} |
@@ -1533,7 +1533,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); |
} |
return NULL; |
@@ -1814,12 +1814,6 @@ 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))); |
- } |
return DefineSameAsFirst(new(zone()) LDummyUse(value)); |
} |
from = Representation::Tagged(); |
@@ -1845,16 +1839,7 @@ LInstruction* LChunkBuilder::DoChange(HChange* instr) { |
ASSERT(to.IsInteger32()); |
LOperand* value = UseRegister(instr->value()); |
if (instr->value()->type().IsSmi()) { |
- 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(); |
LOperand* xmm_temp = truncating ? NULL : FixedTemp(xmm1); |
@@ -1971,7 +1956,7 @@ LInstruction* LChunkBuilder::DoClampToUint8(HClampToUint8* instr) { |
} else if (input_rep.IsInteger32()) { |
return DefineSameAsFirst(new(zone()) LClampIToUint8(reg)); |
} else { |
- ASSERT(input_rep.IsTagged()); |
+ ASSERT(input_rep.IsSmiOrTagged()); |
// Register allocator doesn't (yet) support allocation of double |
// temps. Reserve xmm1 explicitly. |
LClampTToUint8* result = new(zone()) LClampTToUint8(reg, |