| 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));
|
| }
|
|
|
|
|
| @@ -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);
|
|
|