Chromium Code Reviews| Index: src/ia32/lithium-codegen-ia32.cc |
| diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc |
| index f92ab17499022b92bceb1f51e5760c32a5bfad08..f6e6ad0b8c111f8bd1b57f109217f38111a7194b 100644 |
| --- a/src/ia32/lithium-codegen-ia32.cc |
| +++ b/src/ia32/lithium-codegen-ia32.cc |
| @@ -656,9 +656,18 @@ XMMRegister LCodeGen::ToDoubleRegister(LOperand* op) const { |
| } |
| -int LCodeGen::ToInteger32(LConstantOperand* op) const { |
| +int32_t LCodeGen::ToInteger32(LConstantOperand* op) const { |
| + return ToRepresentation(op, Representation::Integer32()); |
| +} |
| + |
| + |
| +int32_t LCodeGen::ToRepresentation(LConstantOperand* op, |
| + const Representation& r) const { |
| HConstant* constant = chunk_->LookupConstant(op); |
| - return constant->Integer32Value(); |
| + int32_t value = constant->Integer32Value(); |
| + if (r.IsInteger32()) return value; |
| + ASSERT(r.IsSmiOrTagged()); |
| + return reinterpret_cast<int32_t>(Smi::FromInt(value)); |
|
Sven Panne
2013/07/24 11:38:36
Evil! ;-)
Toon Verwaest
2013/07/24 13:24:01
I'll see what happens to this after I port it to x
|
| } |
| @@ -1619,6 +1628,9 @@ void LCodeGen::DoMulI(LMulI* instr) { |
| __ imul(left, left, constant); |
| } |
| } else { |
| + if (instr->hydrogen()->representation().IsSmi()) { |
| + __ SmiUntag(left); |
| + } |
| __ imul(left, ToOperand(right)); |
| } |
| @@ -1655,7 +1667,8 @@ void LCodeGen::DoBitI(LBitI* instr) { |
| ASSERT(left->IsRegister()); |
| if (right->IsConstantOperand()) { |
| - int right_operand = ToInteger32(LConstantOperand::cast(right)); |
| + int right_operand = ToRepresentation(LConstantOperand::cast(right), |
| + instr->hydrogen()->representation()); |
| switch (instr->op()) { |
| case Token::BIT_AND: |
| __ and_(ToRegister(left), right_operand); |
| @@ -1766,7 +1779,8 @@ void LCodeGen::DoSubI(LSubI* instr) { |
| ASSERT(left->Equals(instr->result())); |
| if (right->IsConstantOperand()) { |
| - __ sub(ToOperand(left), ToInteger32Immediate(right)); |
| + __ sub(ToOperand(left), |
| + ToImmediate(right, instr->hydrogen()->representation())); |
| } else { |
| __ sub(ToRegister(left), ToOperand(right)); |
| } |
| @@ -1979,7 +1993,8 @@ void LCodeGen::DoAddI(LAddI* instr) { |
| if (LAddI::UseLea(instr->hydrogen()) && !left->Equals(instr->result())) { |
| if (right->IsConstantOperand()) { |
| - int32_t offset = ToInteger32(LConstantOperand::cast(right)); |
| + int32_t offset = ToRepresentation(LConstantOperand::cast(right), |
| + instr->hydrogen()->representation()); |
| __ lea(ToRegister(instr->result()), MemOperand(ToRegister(left), offset)); |
| } else { |
| Operand address(ToRegister(left), ToRegister(right), times_1, 0); |
| @@ -1987,7 +2002,8 @@ void LCodeGen::DoAddI(LAddI* instr) { |
| } |
| } else { |
| if (right->IsConstantOperand()) { |
| - __ add(ToOperand(left), ToInteger32Immediate(right)); |
| + __ add(ToOperand(left), |
| + ToImmediate(right, instr->hydrogen()->representation())); |
| } else { |
| __ add(ToRegister(left), ToOperand(right)); |
| } |
| @@ -2004,17 +2020,18 @@ void LCodeGen::DoMathMinMax(LMathMinMax* instr) { |
| LOperand* right = instr->right(); |
| ASSERT(left->Equals(instr->result())); |
| HMathMinMax::Operation operation = instr->hydrogen()->operation(); |
| - if (instr->hydrogen()->representation().IsInteger32()) { |
| + if (instr->hydrogen()->representation().IsSmiOrInteger32()) { |
| Label return_left; |
| Condition condition = (operation == HMathMinMax::kMathMin) |
| ? less_equal |
| : greater_equal; |
| if (right->IsConstantOperand()) { |
| Operand left_op = ToOperand(left); |
| - Immediate right_imm = ToInteger32Immediate(right); |
| - __ cmp(left_op, right_imm); |
| + Immediate immediate = ToImmediate(LConstantOperand::cast(instr->right()), |
| + instr->hydrogen()->representation()); |
| + __ cmp(left_op, immediate); |
| __ j(condition, &return_left, Label::kNear); |
| - __ mov(left_op, right_imm); |
| + __ mov(left_op, immediate); |
| } else { |
| Register left_reg = ToRegister(left); |
| Operand right_op = ToOperand(right); |
| @@ -2382,19 +2399,11 @@ void LCodeGen::DoCompareNumericAndBranch(LCompareNumericAndBranch* instr) { |
| __ j(parity_even, instr->FalseLabel(chunk_)); |
| } else { |
| if (right->IsConstantOperand()) { |
| - int32_t const_value = ToInteger32(LConstantOperand::cast(right)); |
| - if (instr->hydrogen_value()->representation().IsSmi()) { |
| - __ cmp(ToOperand(left), Immediate(Smi::FromInt(const_value))); |
| - } else { |
| - __ cmp(ToOperand(left), Immediate(const_value)); |
| - } |
| + __ cmp(ToOperand(left), |
| + ToImmediate(right, instr->hydrogen()->representation())); |
| } else if (left->IsConstantOperand()) { |
| - int32_t const_value = ToInteger32(LConstantOperand::cast(left)); |
| - if (instr->hydrogen_value()->representation().IsSmi()) { |
| - __ cmp(ToOperand(right), Immediate(Smi::FromInt(const_value))); |
| - } else { |
| - __ cmp(ToOperand(right), Immediate(const_value)); |
| - } |
| + __ cmp(ToOperand(right), |
| + ToImmediate(left, instr->hydrogen()->representation())); |
| // We transposed the operands. Reverse the condition. |
| cc = ReverseCondition(cc); |
| } else { |
| @@ -4451,14 +4460,10 @@ void LCodeGen::DoBoundsCheck(LBoundsCheck* instr) { |
| if (instr->hydrogen()->skip_check()) return; |
| if (instr->index()->IsConstantOperand()) { |
| - int constant_index = |
| - ToInteger32(LConstantOperand::cast(instr->index())); |
| - if (instr->hydrogen()->length()->representation().IsSmi()) { |
| - __ cmp(ToOperand(instr->length()), |
| - Immediate(Smi::FromInt(constant_index))); |
| - } else { |
| - __ cmp(ToOperand(instr->length()), Immediate(constant_index)); |
| - } |
| + Immediate immediate = |
| + ToImmediate(LConstantOperand::cast(instr->index()), |
| + instr->hydrogen()->length()->representation()); |
| + __ cmp(ToOperand(instr->length()), immediate); |
| DeoptimizeIf(below_equal, instr->environment()); |
| } else { |
| __ cmp(ToRegister(instr->index()), ToOperand(instr->length())); |
| @@ -4622,10 +4627,11 @@ void LCodeGen::DoStoreKeyedFixedArray(LStoreKeyed* instr) { |
| __ mov(operand, ToRegister(instr->value())); |
| } else { |
| LConstantOperand* operand_value = LConstantOperand::cast(instr->value()); |
| - if (IsInteger32(operand_value)) { |
| - Smi* smi_value = Smi::FromInt(ToInteger32(operand_value)); |
| - __ mov(operand, Immediate(smi_value)); |
| + if (IsSmi(operand_value)) { |
| + Immediate immediate = ToImmediate(operand_value, Representation::Smi()); |
| + __ mov(operand, immediate); |
| } else { |
| + ASSERT(!IsInteger32(operand_value)); |
| Handle<Object> handle_value = ToHandle(operand_value); |
| __ mov(operand, handle_value); |
| } |
| @@ -4788,8 +4794,9 @@ void LCodeGen::DoDeferredStringCharCodeAt(LStringCharCodeAt* instr) { |
| // DoStringCharCodeAt above. |
| STATIC_ASSERT(String::kMaxLength <= Smi::kMaxValue); |
| if (instr->index()->IsConstantOperand()) { |
| - int const_index = ToInteger32(LConstantOperand::cast(instr->index())); |
| - __ push(Immediate(Smi::FromInt(const_index))); |
| + Immediate immediate = ToImmediate(LConstantOperand::cast(instr->index()), |
| + Representation::Smi()); |
| + __ push(immediate); |
| } else { |
| Register index = ToRegister(instr->index()); |
| __ SmiTag(index); |