| Index: src/x64/lithium-codegen-x64.cc
|
| diff --git a/src/x64/lithium-codegen-x64.cc b/src/x64/lithium-codegen-x64.cc
|
| index 0da9337db6f16b0c6a6f8a1e9c8cce3d3235c94f..87c9d9048f1297fb56cfb827f58f0cb0c0215c89 100644
|
| --- a/src/x64/lithium-codegen-x64.cc
|
| +++ b/src/x64/lithium-codegen-x64.cc
|
| @@ -410,7 +410,7 @@ bool LCodeGen::IsTaggedConstant(LConstantOperand* op) const {
|
| }
|
|
|
|
|
| -int LCodeGen::ToInteger32(LConstantOperand* op) const {
|
| +int32_t LCodeGen::ToInteger32(LConstantOperand* op) const {
|
| HConstant* constant = chunk_->LookupConstant(op);
|
| return constant->Integer32Value();
|
| }
|
| @@ -1299,9 +1299,19 @@ void LCodeGen::DoMulI(LMulI* instr) {
|
| __ imull(left, left, Immediate(right_value));
|
| }
|
| } else if (right->IsStackSlot()) {
|
| - __ imull(left, ToOperand(right));
|
| + if (instr->hydrogen_value()->representation().IsSmi()) {
|
| + __ SmiToInteger32(left, left);
|
| + __ imul(left, ToOperand(right));
|
| + } else {
|
| + __ imull(left, ToOperand(right));
|
| + }
|
| } else {
|
| - __ imull(left, ToRegister(right));
|
| + if (instr->hydrogen_value()->representation().IsSmi()) {
|
| + __ SmiToInteger32(left, left);
|
| + __ imul(left, ToRegister(right));
|
| + } else {
|
| + __ imull(left, ToRegister(right));
|
| + }
|
| }
|
|
|
| if (can_overflow) {
|
| @@ -1358,13 +1368,13 @@ void LCodeGen::DoBitI(LBitI* instr) {
|
| } else if (right->IsStackSlot()) {
|
| switch (instr->op()) {
|
| case Token::BIT_AND:
|
| - __ andl(ToRegister(left), ToOperand(right));
|
| + __ and_(ToRegister(left), ToOperand(right));
|
| break;
|
| case Token::BIT_OR:
|
| - __ orl(ToRegister(left), ToOperand(right));
|
| + __ or_(ToRegister(left), ToOperand(right));
|
| break;
|
| case Token::BIT_XOR:
|
| - __ xorl(ToRegister(left), ToOperand(right));
|
| + __ xor_(ToRegister(left), ToOperand(right));
|
| break;
|
| default:
|
| UNREACHABLE();
|
| @@ -1374,13 +1384,13 @@ void LCodeGen::DoBitI(LBitI* instr) {
|
| ASSERT(right->IsRegister());
|
| switch (instr->op()) {
|
| case Token::BIT_AND:
|
| - __ andl(ToRegister(left), ToRegister(right));
|
| + __ and_(ToRegister(left), ToRegister(right));
|
| break;
|
| case Token::BIT_OR:
|
| - __ orl(ToRegister(left), ToRegister(right));
|
| + __ or_(ToRegister(left), ToRegister(right));
|
| break;
|
| case Token::BIT_XOR:
|
| - __ xorl(ToRegister(left), ToRegister(right));
|
| + __ xor_(ToRegister(left), ToRegister(right));
|
| break;
|
| default:
|
| UNREACHABLE();
|
| @@ -1463,9 +1473,17 @@ void LCodeGen::DoSubI(LSubI* instr) {
|
| __ subl(ToRegister(left),
|
| Immediate(ToInteger32(LConstantOperand::cast(right))));
|
| } else if (right->IsRegister()) {
|
| - __ subl(ToRegister(left), ToRegister(right));
|
| + if (instr->hydrogen_value()->representation().IsSmi()) {
|
| + __ subq(ToRegister(left), ToRegister(right));
|
| + } else {
|
| + __ subl(ToRegister(left), ToRegister(right));
|
| + }
|
| } else {
|
| - __ subl(ToRegister(left), ToOperand(right));
|
| + if (instr->hydrogen_value()->representation().IsSmi()) {
|
| + __ subq(ToRegister(left), ToOperand(right));
|
| + } else {
|
| + __ subl(ToRegister(left), ToOperand(right));
|
| + }
|
| }
|
|
|
| if (instr->hydrogen()->CheckFlag(HValue::kCanOverflow)) {
|
| @@ -1651,16 +1669,28 @@ void LCodeGen::DoAddI(LAddI* instr) {
|
| MemOperand(ToRegister(left), offset));
|
| } else {
|
| Operand address(ToRegister(left), ToRegister(right), times_1, 0);
|
| - __ leal(ToRegister(instr->result()), address);
|
| + if (instr->hydrogen()->representation().IsSmi()) {
|
| + __ lea(ToRegister(instr->result()), address);
|
| + } else {
|
| + __ leal(ToRegister(instr->result()), address);
|
| + }
|
| }
|
| } else {
|
| if (right->IsConstantOperand()) {
|
| __ addl(ToRegister(left),
|
| Immediate(ToInteger32(LConstantOperand::cast(right))));
|
| } else if (right->IsRegister()) {
|
| - __ addl(ToRegister(left), ToRegister(right));
|
| + if (instr->hydrogen_value()->representation().IsSmi()) {
|
| + __ addq(ToRegister(left), ToRegister(right));
|
| + } else {
|
| + __ addl(ToRegister(left), ToRegister(right));
|
| + }
|
| } else {
|
| - __ addl(ToRegister(left), ToOperand(right));
|
| + if (instr->hydrogen_value()->representation().IsSmi()) {
|
| + __ addq(ToRegister(left), ToOperand(right));
|
| + } else {
|
| + __ addl(ToRegister(left), ToOperand(right));
|
| + }
|
| }
|
| if (instr->hydrogen()->CheckFlag(HValue::kCanOverflow)) {
|
| DeoptimizeIf(overflow, instr->environment());
|
|
|