Commit 480729ff authored by verwaest@chromium.org's avatar verwaest@chromium.org

Smi-support for HSar.

BUG=
R=mvstanton@chromium.org

Review URL: https://chromiumcodereview.appspot.com/21049003

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@15938 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent d0e0ff01
...@@ -733,7 +733,9 @@ LInstruction* LChunkBuilder::DoShift(Token::Value op, ...@@ -733,7 +733,9 @@ LInstruction* LChunkBuilder::DoShift(Token::Value op,
constant_value = constant->Integer32Value() & 0x1f; constant_value = constant->Integer32Value() & 0x1f;
// Left shifts can deoptimize if we shift by > 0 and the result cannot be // Left shifts can deoptimize if we shift by > 0 and the result cannot be
// truncated to smi. // truncated to smi.
if (instr->representation().IsSmi() && constant_value > 0) { if (instr->representation().IsSmi() &&
op == Token::SHL &&
constant_value > 0) {
for (HUseIterator it(instr->uses()); !it.Done(); it.Advance()) { for (HUseIterator it(instr->uses()); !it.Done(); it.Advance()) {
if (!it.value()->CheckFlag(HValue::kTruncatingToSmi)) { if (!it.value()->CheckFlag(HValue::kTruncatingToSmi)) {
does_deopt = true; does_deopt = true;
...@@ -752,7 +754,8 @@ LInstruction* LChunkBuilder::DoShift(Token::Value op, ...@@ -752,7 +754,8 @@ LInstruction* LChunkBuilder::DoShift(Token::Value op,
does_deopt = !instr->CheckFlag(HInstruction::kUint32); does_deopt = !instr->CheckFlag(HInstruction::kUint32);
} else { } else {
for (HUseIterator it(instr->uses()); !it.Done(); it.Advance()) { for (HUseIterator it(instr->uses()); !it.Done(); it.Advance()) {
if (!it.value()->CheckFlag(HValue::kTruncatingToInt32)) { if (!it.value()->CheckFlag(HValue::kTruncatingToInt32) &&
!it.value()->CheckFlag(HValue::kTruncatingToSmi)) {
does_deopt = true; does_deopt = true;
break; break;
} }
......
...@@ -1725,6 +1725,9 @@ void LCodeGen::DoShiftI(LShiftI* instr) { ...@@ -1725,6 +1725,9 @@ void LCodeGen::DoShiftI(LShiftI* instr) {
case Token::SAR: case Token::SAR:
if (shift_count != 0) { if (shift_count != 0) {
__ mov(result, Operand(left, ASR, shift_count)); __ mov(result, Operand(left, ASR, shift_count));
if (instr->hydrogen_value()->representation().IsSmi()) {
__ and_(result, result, Operand(~kSmiTagMask));
}
} else { } else {
__ Move(result, left); __ Move(result, left);
} }
......
...@@ -4964,7 +4964,9 @@ class HShr: public HBitwiseBinaryOperation { ...@@ -4964,7 +4964,9 @@ class HShr: public HBitwiseBinaryOperation {
virtual void UpdateRepresentation(Representation new_rep, virtual void UpdateRepresentation(Representation new_rep,
HInferRepresentationPhase* h_infer, HInferRepresentationPhase* h_infer,
const char* reason) { const char* reason) {
if (new_rep.IsSmi()) new_rep = Representation::Integer32(); if (new_rep.IsSmi() && !right()->IsConstant()) {
new_rep = Representation::Integer32();
}
HBitwiseBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason); HBitwiseBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason);
} }
......
...@@ -1757,6 +1757,9 @@ void LCodeGen::DoShiftI(LShiftI* instr) { ...@@ -1757,6 +1757,9 @@ void LCodeGen::DoShiftI(LShiftI* instr) {
case Token::SAR: case Token::SAR:
if (shift_count != 0) { if (shift_count != 0) {
__ sar(ToRegister(left), shift_count); __ sar(ToRegister(left), shift_count);
if (instr->hydrogen_value()->representation().IsSmi()) {
__ and_(ToRegister(left), ~kSmiTagMask);
}
} }
break; break;
case Token::SHR: case Token::SHR:
......
...@@ -787,7 +787,9 @@ LInstruction* LChunkBuilder::DoShift(Token::Value op, ...@@ -787,7 +787,9 @@ LInstruction* LChunkBuilder::DoShift(Token::Value op,
constant_value = constant->Integer32Value() & 0x1f; constant_value = constant->Integer32Value() & 0x1f;
// Left shifts can deoptimize if we shift by > 0 and the result cannot be // Left shifts can deoptimize if we shift by > 0 and the result cannot be
// truncated to smi. // truncated to smi.
if (instr->representation().IsSmi() && constant_value > 0) { if (instr->representation().IsSmi() &&
op == Token::SHL &&
constant_value > 0) {
for (HUseIterator it(instr->uses()); !it.Done(); it.Advance()) { for (HUseIterator it(instr->uses()); !it.Done(); it.Advance()) {
if (!it.value()->CheckFlag(HValue::kTruncatingToSmi)) { if (!it.value()->CheckFlag(HValue::kTruncatingToSmi)) {
does_deopt = true; does_deopt = true;
...@@ -806,7 +808,8 @@ LInstruction* LChunkBuilder::DoShift(Token::Value op, ...@@ -806,7 +808,8 @@ LInstruction* LChunkBuilder::DoShift(Token::Value op,
does_deopt = !instr->CheckFlag(HInstruction::kUint32); does_deopt = !instr->CheckFlag(HInstruction::kUint32);
} else { } else {
for (HUseIterator it(instr->uses()); !it.Done(); it.Advance()) { for (HUseIterator it(instr->uses()); !it.Done(); it.Advance()) {
if (!it.value()->CheckFlag(HValue::kTruncatingToInt32)) { if (!it.value()->CheckFlag(HValue::kTruncatingToInt32) &&
!it.value()->CheckFlag(HValue::kTruncatingToSmi)) {
does_deopt = true; does_deopt = true;
break; break;
} }
......
...@@ -751,7 +751,8 @@ LInstruction* LChunkBuilder::DoShift(Token::Value op, ...@@ -751,7 +751,8 @@ LInstruction* LChunkBuilder::DoShift(Token::Value op,
does_deopt = !instr->CheckFlag(HInstruction::kUint32); does_deopt = !instr->CheckFlag(HInstruction::kUint32);
} else { } else {
for (HUseIterator it(instr->uses()); !it.Done(); it.Advance()) { for (HUseIterator it(instr->uses()); !it.Done(); it.Advance()) {
if (!it.value()->CheckFlag(HValue::kTruncatingToInt32)) { if (!it.value()->CheckFlag(HValue::kTruncatingToInt32) &&
!it.value()->CheckFlag(HValue::kTruncatingToSmi)) {
does_deopt = true; does_deopt = true;
break; break;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment