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; |