From 041257e549965637fbe5a4c290cb31dcc9bae987 Mon Sep 17 00:00:00 2001 From: "palfia@homejinni.com" Date: Tue, 28 May 2013 21:36:03 +0000 Subject: [PATCH] MIPS: Support Smi in CompareIDAndBranch Port r14842 (1c8d7430) BUG= Review URL: https://codereview.chromium.org/15917012 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@14863 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/mips/lithium-codegen-mips.cc | 20 ++++++++++++++++---- src/mips/lithium-mips.cc | 7 ++++--- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/mips/lithium-codegen-mips.cc b/src/mips/lithium-codegen-mips.cc index 05fa792..114eef7 100644 --- a/src/mips/lithium-codegen-mips.cc +++ b/src/mips/lithium-codegen-mips.cc @@ -2047,11 +2047,23 @@ void LCodeGen::DoCmpIDAndBranch(LCmpIDAndBranch* instr) { Operand cmp_right = Operand(0); if (right->IsConstantOperand()) { - cmp_left = ToRegister(left); - cmp_right = Operand(ToInteger32(LConstantOperand::cast(right))); + int32_t value = ToInteger32(LConstantOperand::cast(right)); + if (instr->hydrogen_value()->representation().IsSmi()) { + cmp_left = ToRegister(left); + cmp_right = Operand(Smi::FromInt(value)); + } else { + cmp_left = ToRegister(left); + cmp_right = Operand(value); + } } else if (left->IsConstantOperand()) { - cmp_left = ToRegister(right); - cmp_right = Operand(ToInteger32(LConstantOperand::cast(left))); + int32_t value = ToInteger32(LConstantOperand::cast(left)); + if (instr->hydrogen_value()->representation().IsSmi()) { + cmp_left = ToRegister(right); + cmp_right = Operand(Smi::FromInt(value)); + } else { + cmp_left = ToRegister(right); + cmp_right = Operand(value); + } // We transposed the operands. Reverse the condition. cond = ReverseCondition(cond); } else { diff --git a/src/mips/lithium-mips.cc b/src/mips/lithium-mips.cc index 22adc2a..9a99d24 100644 --- a/src/mips/lithium-mips.cc +++ b/src/mips/lithium-mips.cc @@ -1554,9 +1554,10 @@ LInstruction* LChunkBuilder::DoCompareGeneric(HCompareGeneric* instr) { LInstruction* LChunkBuilder::DoCompareIDAndBranch( HCompareIDAndBranch* instr) { Representation r = instr->representation(); - if (r.IsInteger32()) { - ASSERT(instr->left()->representation().IsInteger32()); - ASSERT(instr->right()->representation().IsInteger32()); + if (r.IsSmiOrInteger32()) { + ASSERT(instr->left()->representation().IsSmiOrInteger32()); + ASSERT(instr->left()->representation().Equals( + instr->right()->representation())); LOperand* left = UseRegisterOrConstantAtStart(instr->left()); LOperand* right = UseRegisterOrConstantAtStart(instr->right()); return new(zone()) LCmpIDAndBranch(left, right); -- 2.7.4