| Index: test/cctest/compiler/test-instruction-selector-arm.cc
|
| diff --git a/test/cctest/compiler/test-instruction-selector-arm.cc b/test/cctest/compiler/test-instruction-selector-arm.cc
|
| index f2d8524778cd9b36aec15be338a52add8a842338..706442dbdcffdbb9969e629940e89f0e084c90f9 100644
|
| --- a/test/cctest/compiler/test-instruction-selector-arm.cc
|
| +++ b/test/cctest/compiler/test-instruction-selector-arm.cc
|
| @@ -225,6 +225,139 @@ TEST(InstructionSelectorDPIAndShiftImm) {
|
| }
|
|
|
|
|
| +TEST(InstructionSelectorInt32AddWithOverflowP) {
|
| + {
|
| + InstructionSelectorTester m;
|
| + m.Return(m.Projection(
|
| + 1, m.Int32AddWithOverflow(m.Parameter(0), m.Parameter(1))));
|
| + m.SelectInstructions();
|
| + CHECK_EQ(1, m.code.size());
|
| + CHECK_EQ(kArmAdd, m.code[0]->arch_opcode());
|
| + CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode());
|
| + CHECK_EQ(kFlags_set, m.code[0]->flags_mode());
|
| + CHECK_EQ(kOverflow, m.code[0]->flags_condition());
|
| + CHECK_EQ(2, m.code[0]->InputCount());
|
| + CHECK_EQ(1, m.code[0]->OutputCount());
|
| + }
|
| + {
|
| + InstructionSelectorTester m;
|
| + m.Return(m.Projection(
|
| + 0, m.Int32AddWithOverflow(m.Parameter(0), m.Parameter(1))));
|
| + m.SelectInstructions();
|
| + CHECK_EQ(1, m.code.size());
|
| + CHECK_EQ(kArmAdd, m.code[0]->arch_opcode());
|
| + CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode());
|
| + CHECK_EQ(kFlags_none, m.code[0]->flags_mode());
|
| + CHECK_EQ(2, m.code[0]->InputCount());
|
| + CHECK_EQ(1, m.code[0]->OutputCount());
|
| + }
|
| + {
|
| + InstructionSelectorTester m;
|
| + Node* add = m.Int32AddWithOverflow(m.Parameter(0), m.Parameter(1));
|
| + m.Return(m.Word32Equal(m.Projection(0, add), m.Projection(1, add)));
|
| + m.SelectInstructions();
|
| + CHECK_LE(1, m.code.size());
|
| + CHECK_EQ(kArmAdd, m.code[0]->arch_opcode());
|
| + CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode());
|
| + CHECK_EQ(kFlags_set, m.code[0]->flags_mode());
|
| + CHECK_EQ(kOverflow, m.code[0]->flags_condition());
|
| + CHECK_EQ(2, m.code[0]->InputCount());
|
| + CHECK_EQ(2, m.code[0]->OutputCount());
|
| + }
|
| +}
|
| +
|
| +
|
| +TEST(InstructionSelectorInt32AddWithOverflowImm) {
|
| + Immediates immediates;
|
| + for (Immediates::const_iterator i = immediates.begin(); i != immediates.end();
|
| + ++i) {
|
| + int32_t imm = *i;
|
| + {
|
| + InstructionSelectorTester m;
|
| + m.Return(m.Projection(
|
| + 1, m.Int32AddWithOverflow(m.Parameter(0), m.Int32Constant(imm))));
|
| + m.SelectInstructions();
|
| + CHECK_EQ(1, m.code.size());
|
| + CHECK_EQ(kArmAdd, m.code[0]->arch_opcode());
|
| + CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode());
|
| + CHECK_EQ(kFlags_set, m.code[0]->flags_mode());
|
| + CHECK_EQ(kOverflow, m.code[0]->flags_condition());
|
| + CHECK_EQ(2, m.code[0]->InputCount());
|
| + CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1)));
|
| + CHECK_EQ(1, m.code[0]->OutputCount());
|
| + }
|
| + {
|
| + InstructionSelectorTester m;
|
| + m.Return(m.Projection(
|
| + 1, m.Int32AddWithOverflow(m.Int32Constant(imm), m.Parameter(0))));
|
| + m.SelectInstructions();
|
| + CHECK_EQ(1, m.code.size());
|
| + CHECK_EQ(kArmAdd, m.code[0]->arch_opcode());
|
| + CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode());
|
| + CHECK_EQ(kFlags_set, m.code[0]->flags_mode());
|
| + CHECK_EQ(kOverflow, m.code[0]->flags_condition());
|
| + CHECK_EQ(2, m.code[0]->InputCount());
|
| + CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1)));
|
| + CHECK_EQ(1, m.code[0]->OutputCount());
|
| + }
|
| + {
|
| + InstructionSelectorTester m;
|
| + m.Return(m.Projection(
|
| + 0, m.Int32AddWithOverflow(m.Parameter(0), m.Int32Constant(imm))));
|
| + m.SelectInstructions();
|
| + CHECK_EQ(1, m.code.size());
|
| + CHECK_EQ(kArmAdd, m.code[0]->arch_opcode());
|
| + CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode());
|
| + CHECK_EQ(kFlags_none, m.code[0]->flags_mode());
|
| + CHECK_EQ(2, m.code[0]->InputCount());
|
| + CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1)));
|
| + CHECK_EQ(1, m.code[0]->OutputCount());
|
| + }
|
| + {
|
| + InstructionSelectorTester m;
|
| + m.Return(m.Projection(
|
| + 0, m.Int32AddWithOverflow(m.Int32Constant(imm), m.Parameter(0))));
|
| + m.SelectInstructions();
|
| + CHECK_EQ(1, m.code.size());
|
| + CHECK_EQ(kArmAdd, m.code[0]->arch_opcode());
|
| + CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode());
|
| + CHECK_EQ(kFlags_none, m.code[0]->flags_mode());
|
| + CHECK_EQ(2, m.code[0]->InputCount());
|
| + CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1)));
|
| + CHECK_EQ(1, m.code[0]->OutputCount());
|
| + }
|
| + {
|
| + InstructionSelectorTester m;
|
| + Node* add = m.Int32AddWithOverflow(m.Parameter(0), m.Int32Constant(imm));
|
| + m.Return(m.Word32Equal(m.Projection(0, add), m.Projection(1, add)));
|
| + m.SelectInstructions();
|
| + CHECK_LE(1, m.code.size());
|
| + CHECK_EQ(kArmAdd, m.code[0]->arch_opcode());
|
| + CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode());
|
| + CHECK_EQ(kFlags_set, m.code[0]->flags_mode());
|
| + CHECK_EQ(kOverflow, m.code[0]->flags_condition());
|
| + CHECK_EQ(2, m.code[0]->InputCount());
|
| + CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1)));
|
| + CHECK_EQ(2, m.code[0]->OutputCount());
|
| + }
|
| + {
|
| + InstructionSelectorTester m;
|
| + Node* add = m.Int32AddWithOverflow(m.Int32Constant(imm), m.Parameter(0));
|
| + m.Return(m.Word32Equal(m.Projection(0, add), m.Projection(1, add)));
|
| + m.SelectInstructions();
|
| + CHECK_LE(1, m.code.size());
|
| + CHECK_EQ(kArmAdd, m.code[0]->arch_opcode());
|
| + CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode());
|
| + CHECK_EQ(kFlags_set, m.code[0]->flags_mode());
|
| + CHECK_EQ(kOverflow, m.code[0]->flags_condition());
|
| + CHECK_EQ(2, m.code[0]->InputCount());
|
| + CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1)));
|
| + CHECK_EQ(2, m.code[0]->OutputCount());
|
| + }
|
| + }
|
| +}
|
| +
|
| +
|
| TEST(InstructionSelectorWord32AndAndWord32XorWithMinus1P) {
|
| {
|
| InstructionSelectorTester m;
|
|
|