| OLD | NEW | 
|     1 // Copyright 2014 the V8 project authors. All rights reserved. |     1 // Copyright 2014 the V8 project authors. All rights reserved. | 
|     2 // Use of this source code is governed by a BSD-style license that can be |     2 // Use of this source code is governed by a BSD-style license that can be | 
|     3 // found in the LICENSE file. |     3 // found in the LICENSE file. | 
|     4  |     4  | 
|     5 #include <list> |     5 #include <list> | 
|     6  |     6  | 
|     7 #include "test/cctest/compiler/instruction-selector-tester.h" |     7 #include "test/cctest/compiler/instruction-selector-tester.h" | 
|     8 #include "test/cctest/compiler/value-helper.h" |     8 #include "test/cctest/compiler/value-helper.h" | 
|     9  |     9  | 
|    10 using namespace v8::internal; |    10 using namespace v8::internal; | 
| (...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   253       InstructionSelectorTester m; |   253       InstructionSelectorTester m; | 
|   254       m.Return( |   254       m.Return( | 
|   255           m.Projection(1, m.NewNode(odpi.op, m.Parameter(0), m.Parameter(1)))); |   255           m.Projection(1, m.NewNode(odpi.op, m.Parameter(0), m.Parameter(1)))); | 
|   256       m.SelectInstructions(); |   256       m.SelectInstructions(); | 
|   257       CHECK_EQ(1, m.code.size()); |   257       CHECK_EQ(1, m.code.size()); | 
|   258       CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); |   258       CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); | 
|   259       CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode()); |   259       CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode()); | 
|   260       CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); |   260       CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); | 
|   261       CHECK_EQ(kOverflow, m.code[0]->flags_condition()); |   261       CHECK_EQ(kOverflow, m.code[0]->flags_condition()); | 
|   262       CHECK_EQ(2, m.code[0]->InputCount()); |   262       CHECK_EQ(2, m.code[0]->InputCount()); | 
|   263       CHECK_EQ(1, m.code[0]->OutputCount()); |   263       CHECK_LE(1, m.code[0]->OutputCount()); | 
|   264     } |   264     } | 
|   265     { |   265     { | 
|   266       InstructionSelectorTester m; |   266       InstructionSelectorTester m; | 
|   267       m.Return( |   267       m.Return( | 
|   268           m.Projection(0, m.NewNode(odpi.op, m.Parameter(0), m.Parameter(1)))); |   268           m.Projection(0, m.NewNode(odpi.op, m.Parameter(0), m.Parameter(1)))); | 
|   269       m.SelectInstructions(); |   269       m.SelectInstructions(); | 
|   270       CHECK_EQ(1, m.code.size()); |   270       CHECK_EQ(1, m.code.size()); | 
|   271       CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); |   271       CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); | 
|   272       CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode()); |   272       CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode()); | 
|   273       CHECK_EQ(kFlags_none, m.code[0]->flags_mode()); |   273       CHECK_EQ(kFlags_none, m.code[0]->flags_mode()); | 
|   274       CHECK_EQ(2, m.code[0]->InputCount()); |   274       CHECK_EQ(2, m.code[0]->InputCount()); | 
|   275       CHECK_EQ(1, m.code[0]->OutputCount()); |   275       CHECK_LE(1, m.code[0]->OutputCount()); | 
|   276     } |   276     } | 
|   277     { |   277     { | 
|   278       InstructionSelectorTester m; |   278       InstructionSelectorTester m; | 
|   279       Node* node = m.NewNode(odpi.op, m.Parameter(0), m.Parameter(1)); |   279       Node* node = m.NewNode(odpi.op, m.Parameter(0), m.Parameter(1)); | 
|   280       m.Return(m.Word32Equal(m.Projection(0, node), m.Projection(1, node))); |   280       m.Return(m.Word32Equal(m.Projection(0, node), m.Projection(1, node))); | 
|   281       m.SelectInstructions(); |   281       m.SelectInstructions(); | 
|   282       CHECK_LE(1, m.code.size()); |   282       CHECK_LE(1, m.code.size()); | 
|   283       CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); |   283       CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); | 
|   284       CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode()); |   284       CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode()); | 
|   285       CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); |   285       CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); | 
| (...skipping 18 matching lines...) Expand all  Loading... | 
|   304         m.Return(m.Projection( |   304         m.Return(m.Projection( | 
|   305             1, m.NewNode(odpi.op, m.Parameter(0), m.Int32Constant(imm)))); |   305             1, m.NewNode(odpi.op, m.Parameter(0), m.Int32Constant(imm)))); | 
|   306         m.SelectInstructions(); |   306         m.SelectInstructions(); | 
|   307         CHECK_EQ(1, m.code.size()); |   307         CHECK_EQ(1, m.code.size()); | 
|   308         CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); |   308         CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); | 
|   309         CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); |   309         CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); | 
|   310         CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); |   310         CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); | 
|   311         CHECK_EQ(kOverflow, m.code[0]->flags_condition()); |   311         CHECK_EQ(kOverflow, m.code[0]->flags_condition()); | 
|   312         CHECK_EQ(2, m.code[0]->InputCount()); |   312         CHECK_EQ(2, m.code[0]->InputCount()); | 
|   313         CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); |   313         CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); | 
|   314         CHECK_EQ(1, m.code[0]->OutputCount()); |   314         CHECK_LE(1, m.code[0]->OutputCount()); | 
|   315       } |   315       } | 
|   316       { |   316       { | 
|   317         InstructionSelectorTester m; |   317         InstructionSelectorTester m; | 
|   318         m.Return(m.Projection( |   318         m.Return(m.Projection( | 
|   319             1, m.NewNode(odpi.op, m.Int32Constant(imm), m.Parameter(0)))); |   319             1, m.NewNode(odpi.op, m.Int32Constant(imm), m.Parameter(0)))); | 
|   320         m.SelectInstructions(); |   320         m.SelectInstructions(); | 
|   321         CHECK_EQ(1, m.code.size()); |   321         CHECK_EQ(1, m.code.size()); | 
|   322         CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); |   322         CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); | 
|   323         CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); |   323         CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); | 
|   324         CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); |   324         CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); | 
|   325         CHECK_EQ(kOverflow, m.code[0]->flags_condition()); |   325         CHECK_EQ(kOverflow, m.code[0]->flags_condition()); | 
|   326         CHECK_EQ(2, m.code[0]->InputCount()); |   326         CHECK_EQ(2, m.code[0]->InputCount()); | 
|   327         CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); |   327         CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); | 
|   328         CHECK_EQ(1, m.code[0]->OutputCount()); |   328         CHECK_LE(1, m.code[0]->OutputCount()); | 
|   329       } |   329       } | 
|   330       { |   330       { | 
|   331         InstructionSelectorTester m; |   331         InstructionSelectorTester m; | 
|   332         m.Return(m.Projection( |   332         m.Return(m.Projection( | 
|   333             0, m.NewNode(odpi.op, m.Parameter(0), m.Int32Constant(imm)))); |   333             0, m.NewNode(odpi.op, m.Parameter(0), m.Int32Constant(imm)))); | 
|   334         m.SelectInstructions(); |   334         m.SelectInstructions(); | 
|   335         CHECK_EQ(1, m.code.size()); |   335         CHECK_EQ(1, m.code.size()); | 
|   336         CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); |   336         CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); | 
|   337         CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); |   337         CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); | 
|   338         CHECK_EQ(kFlags_none, m.code[0]->flags_mode()); |   338         CHECK_EQ(kFlags_none, m.code[0]->flags_mode()); | 
|   339         CHECK_EQ(2, m.code[0]->InputCount()); |   339         CHECK_EQ(2, m.code[0]->InputCount()); | 
|   340         CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); |   340         CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); | 
|   341         CHECK_EQ(1, m.code[0]->OutputCount()); |   341         CHECK_LE(1, m.code[0]->OutputCount()); | 
|   342       } |   342       } | 
|   343       { |   343       { | 
|   344         InstructionSelectorTester m; |   344         InstructionSelectorTester m; | 
|   345         m.Return(m.Projection( |   345         m.Return(m.Projection( | 
|   346             0, m.NewNode(odpi.op, m.Int32Constant(imm), m.Parameter(0)))); |   346             0, m.NewNode(odpi.op, m.Int32Constant(imm), m.Parameter(0)))); | 
|   347         m.SelectInstructions(); |   347         m.SelectInstructions(); | 
|   348         CHECK_EQ(1, m.code.size()); |   348         CHECK_EQ(1, m.code.size()); | 
|   349         CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); |   349         CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); | 
|   350         CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); |   350         CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); | 
|   351         CHECK_EQ(kFlags_none, m.code[0]->flags_mode()); |   351         CHECK_EQ(kFlags_none, m.code[0]->flags_mode()); | 
|   352         CHECK_EQ(2, m.code[0]->InputCount()); |   352         CHECK_EQ(2, m.code[0]->InputCount()); | 
|   353         CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); |   353         CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); | 
|   354         CHECK_EQ(1, m.code[0]->OutputCount()); |   354         CHECK_LE(1, m.code[0]->OutputCount()); | 
|   355       } |   355       } | 
|   356       { |   356       { | 
|   357         InstructionSelectorTester m; |   357         InstructionSelectorTester m; | 
|   358         Node* node = m.NewNode(odpi.op, m.Parameter(0), m.Int32Constant(imm)); |   358         Node* node = m.NewNode(odpi.op, m.Parameter(0), m.Int32Constant(imm)); | 
|   359         m.Return(m.Word32Equal(m.Projection(0, node), m.Projection(1, node))); |   359         m.Return(m.Word32Equal(m.Projection(0, node), m.Projection(1, node))); | 
|   360         m.SelectInstructions(); |   360         m.SelectInstructions(); | 
|   361         CHECK_LE(1, m.code.size()); |   361         CHECK_LE(1, m.code.size()); | 
|   362         CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); |   362         CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); | 
|   363         CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); |   363         CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); | 
|   364         CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); |   364         CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); | 
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   398         m.Return(m.Projection( |   398         m.Return(m.Projection( | 
|   399             1, m.NewNode(odpi.op, m.Parameter(0), |   399             1, m.NewNode(odpi.op, m.Parameter(0), | 
|   400                          m.NewNode(shift.op, m.Parameter(1), m.Parameter(2))))); |   400                          m.NewNode(shift.op, m.Parameter(1), m.Parameter(2))))); | 
|   401         m.SelectInstructions(); |   401         m.SelectInstructions(); | 
|   402         CHECK_EQ(1, m.code.size()); |   402         CHECK_EQ(1, m.code.size()); | 
|   403         CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); |   403         CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); | 
|   404         CHECK_EQ(shift.r_mode, m.code[0]->addressing_mode()); |   404         CHECK_EQ(shift.r_mode, m.code[0]->addressing_mode()); | 
|   405         CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); |   405         CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); | 
|   406         CHECK_EQ(kOverflow, m.code[0]->flags_condition()); |   406         CHECK_EQ(kOverflow, m.code[0]->flags_condition()); | 
|   407         CHECK_EQ(3, m.code[0]->InputCount()); |   407         CHECK_EQ(3, m.code[0]->InputCount()); | 
|   408         CHECK_EQ(1, m.code[0]->OutputCount()); |   408         CHECK_LE(1, m.code[0]->OutputCount()); | 
|   409       } |   409       } | 
|   410       { |   410       { | 
|   411         InstructionSelectorTester m; |   411         InstructionSelectorTester m; | 
|   412         m.Return(m.Projection( |   412         m.Return(m.Projection( | 
|   413             1, m.NewNode(odpi.op, |   413             1, m.NewNode(odpi.op, | 
|   414                          m.NewNode(shift.op, m.Parameter(0), m.Parameter(1)), |   414                          m.NewNode(shift.op, m.Parameter(0), m.Parameter(1)), | 
|   415                          m.Parameter(2)))); |   415                          m.Parameter(2)))); | 
|   416         m.SelectInstructions(); |   416         m.SelectInstructions(); | 
|   417         CHECK_EQ(1, m.code.size()); |   417         CHECK_EQ(1, m.code.size()); | 
|   418         CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); |   418         CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); | 
|   419         CHECK_EQ(shift.r_mode, m.code[0]->addressing_mode()); |   419         CHECK_EQ(shift.r_mode, m.code[0]->addressing_mode()); | 
|   420         CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); |   420         CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); | 
|   421         CHECK_EQ(kOverflow, m.code[0]->flags_condition()); |   421         CHECK_EQ(kOverflow, m.code[0]->flags_condition()); | 
|   422         CHECK_EQ(3, m.code[0]->InputCount()); |   422         CHECK_EQ(3, m.code[0]->InputCount()); | 
|   423         CHECK_EQ(1, m.code[0]->OutputCount()); |   423         CHECK_LE(1, m.code[0]->OutputCount()); | 
|   424       } |   424       } | 
|   425       { |   425       { | 
|   426         InstructionSelectorTester m; |   426         InstructionSelectorTester m; | 
|   427         m.Return(m.Projection( |   427         m.Return(m.Projection( | 
|   428             0, m.NewNode(odpi.op, m.Parameter(0), |   428             0, m.NewNode(odpi.op, m.Parameter(0), | 
|   429                          m.NewNode(shift.op, m.Parameter(1), m.Parameter(2))))); |   429                          m.NewNode(shift.op, m.Parameter(1), m.Parameter(2))))); | 
|   430         m.SelectInstructions(); |   430         m.SelectInstructions(); | 
|   431         CHECK_EQ(1, m.code.size()); |   431         CHECK_EQ(1, m.code.size()); | 
|   432         CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); |   432         CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); | 
|   433         CHECK_EQ(shift.r_mode, m.code[0]->addressing_mode()); |   433         CHECK_EQ(shift.r_mode, m.code[0]->addressing_mode()); | 
|   434         CHECK_EQ(kFlags_none, m.code[0]->flags_mode()); |   434         CHECK_EQ(kFlags_none, m.code[0]->flags_mode()); | 
|   435         CHECK_EQ(3, m.code[0]->InputCount()); |   435         CHECK_EQ(3, m.code[0]->InputCount()); | 
|   436         CHECK_EQ(1, m.code[0]->OutputCount()); |   436         CHECK_LE(1, m.code[0]->OutputCount()); | 
|   437       } |   437       } | 
|   438       { |   438       { | 
|   439         InstructionSelectorTester m; |   439         InstructionSelectorTester m; | 
|   440         m.Return(m.Projection( |   440         m.Return(m.Projection( | 
|   441             0, m.NewNode(odpi.op, |   441             0, m.NewNode(odpi.op, | 
|   442                          m.NewNode(shift.op, m.Parameter(0), m.Parameter(1)), |   442                          m.NewNode(shift.op, m.Parameter(0), m.Parameter(1)), | 
|   443                          m.Parameter(2)))); |   443                          m.Parameter(2)))); | 
|   444         m.SelectInstructions(); |   444         m.SelectInstructions(); | 
|   445         CHECK_EQ(1, m.code.size()); |   445         CHECK_EQ(1, m.code.size()); | 
|   446         CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); |   446         CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); | 
|   447         CHECK_EQ(shift.r_mode, m.code[0]->addressing_mode()); |   447         CHECK_EQ(shift.r_mode, m.code[0]->addressing_mode()); | 
|   448         CHECK_EQ(kFlags_none, m.code[0]->flags_mode()); |   448         CHECK_EQ(kFlags_none, m.code[0]->flags_mode()); | 
|   449         CHECK_EQ(3, m.code[0]->InputCount()); |   449         CHECK_EQ(3, m.code[0]->InputCount()); | 
|   450         CHECK_EQ(1, m.code[0]->OutputCount()); |   450         CHECK_LE(1, m.code[0]->OutputCount()); | 
|   451       } |   451       } | 
|   452       { |   452       { | 
|   453         InstructionSelectorTester m; |   453         InstructionSelectorTester m; | 
|   454         Node* node = |   454         Node* node = | 
|   455             m.NewNode(odpi.op, m.Parameter(0), |   455             m.NewNode(odpi.op, m.Parameter(0), | 
|   456                       m.NewNode(shift.op, m.Parameter(1), m.Parameter(2))); |   456                       m.NewNode(shift.op, m.Parameter(1), m.Parameter(2))); | 
|   457         m.Return(m.Word32Equal(m.Projection(0, node), m.Projection(1, node))); |   457         m.Return(m.Word32Equal(m.Projection(0, node), m.Projection(1, node))); | 
|   458         m.SelectInstructions(); |   458         m.SelectInstructions(); | 
|   459         CHECK_LE(1, m.code.size()); |   459         CHECK_LE(1, m.code.size()); | 
|   460         CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); |   460         CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); | 
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   498                                              m.NewNode(shift.op, m.Parameter(1), |   498                                              m.NewNode(shift.op, m.Parameter(1), | 
|   499                                                        m.Int32Constant(imm))))); |   499                                                        m.Int32Constant(imm))))); | 
|   500           m.SelectInstructions(); |   500           m.SelectInstructions(); | 
|   501           CHECK_EQ(1, m.code.size()); |   501           CHECK_EQ(1, m.code.size()); | 
|   502           CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); |   502           CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); | 
|   503           CHECK_EQ(shift.i_mode, m.code[0]->addressing_mode()); |   503           CHECK_EQ(shift.i_mode, m.code[0]->addressing_mode()); | 
|   504           CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); |   504           CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); | 
|   505           CHECK_EQ(kOverflow, m.code[0]->flags_condition()); |   505           CHECK_EQ(kOverflow, m.code[0]->flags_condition()); | 
|   506           CHECK_EQ(3, m.code[0]->InputCount()); |   506           CHECK_EQ(3, m.code[0]->InputCount()); | 
|   507           CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(2))); |   507           CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(2))); | 
|   508           CHECK_EQ(1, m.code[0]->OutputCount()); |   508           CHECK_LE(1, m.code[0]->OutputCount()); | 
|   509         } |   509         } | 
|   510         { |   510         { | 
|   511           InstructionSelectorTester m; |   511           InstructionSelectorTester m; | 
|   512           m.Return(m.Projection( |   512           m.Return(m.Projection( | 
|   513               1, m.NewNode(odpi.op, m.NewNode(shift.op, m.Parameter(0), |   513               1, m.NewNode(odpi.op, m.NewNode(shift.op, m.Parameter(0), | 
|   514                                               m.Int32Constant(imm)), |   514                                               m.Int32Constant(imm)), | 
|   515                            m.Parameter(1)))); |   515                            m.Parameter(1)))); | 
|   516           m.SelectInstructions(); |   516           m.SelectInstructions(); | 
|   517           CHECK_EQ(1, m.code.size()); |   517           CHECK_EQ(1, m.code.size()); | 
|   518           CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); |   518           CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); | 
|   519           CHECK_EQ(shift.i_mode, m.code[0]->addressing_mode()); |   519           CHECK_EQ(shift.i_mode, m.code[0]->addressing_mode()); | 
|   520           CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); |   520           CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); | 
|   521           CHECK_EQ(kOverflow, m.code[0]->flags_condition()); |   521           CHECK_EQ(kOverflow, m.code[0]->flags_condition()); | 
|   522           CHECK_EQ(3, m.code[0]->InputCount()); |   522           CHECK_EQ(3, m.code[0]->InputCount()); | 
|   523           CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(2))); |   523           CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(2))); | 
|   524           CHECK_EQ(1, m.code[0]->OutputCount()); |   524           CHECK_LE(1, m.code[0]->OutputCount()); | 
|   525         } |   525         } | 
|   526         { |   526         { | 
|   527           InstructionSelectorTester m; |   527           InstructionSelectorTester m; | 
|   528           m.Return(m.Projection(0, m.NewNode(odpi.op, m.Parameter(0), |   528           m.Return(m.Projection(0, m.NewNode(odpi.op, m.Parameter(0), | 
|   529                                              m.NewNode(shift.op, m.Parameter(1), |   529                                              m.NewNode(shift.op, m.Parameter(1), | 
|   530                                                        m.Int32Constant(imm))))); |   530                                                        m.Int32Constant(imm))))); | 
|   531           m.SelectInstructions(); |   531           m.SelectInstructions(); | 
|   532           CHECK_EQ(1, m.code.size()); |   532           CHECK_EQ(1, m.code.size()); | 
|   533           CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); |   533           CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); | 
|   534           CHECK_EQ(shift.i_mode, m.code[0]->addressing_mode()); |   534           CHECK_EQ(shift.i_mode, m.code[0]->addressing_mode()); | 
|   535           CHECK_EQ(kFlags_none, m.code[0]->flags_mode()); |   535           CHECK_EQ(kFlags_none, m.code[0]->flags_mode()); | 
|   536           CHECK_EQ(3, m.code[0]->InputCount()); |   536           CHECK_EQ(3, m.code[0]->InputCount()); | 
|   537           CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(2))); |   537           CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(2))); | 
|   538           CHECK_EQ(1, m.code[0]->OutputCount()); |   538           CHECK_LE(1, m.code[0]->OutputCount()); | 
|   539         } |   539         } | 
|   540         { |   540         { | 
|   541           InstructionSelectorTester m; |   541           InstructionSelectorTester m; | 
|   542           m.Return(m.Projection( |   542           m.Return(m.Projection( | 
|   543               0, m.NewNode(odpi.op, m.NewNode(shift.op, m.Parameter(0), |   543               0, m.NewNode(odpi.op, m.NewNode(shift.op, m.Parameter(0), | 
|   544                                               m.Int32Constant(imm)), |   544                                               m.Int32Constant(imm)), | 
|   545                            m.Parameter(1)))); |   545                            m.Parameter(1)))); | 
|   546           m.SelectInstructions(); |   546           m.SelectInstructions(); | 
|   547           CHECK_EQ(1, m.code.size()); |   547           CHECK_EQ(1, m.code.size()); | 
|   548           CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); |   548           CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); | 
|   549           CHECK_EQ(shift.i_mode, m.code[0]->addressing_mode()); |   549           CHECK_EQ(shift.i_mode, m.code[0]->addressing_mode()); | 
|   550           CHECK_EQ(kFlags_none, m.code[0]->flags_mode()); |   550           CHECK_EQ(kFlags_none, m.code[0]->flags_mode()); | 
|   551           CHECK_EQ(3, m.code[0]->InputCount()); |   551           CHECK_EQ(3, m.code[0]->InputCount()); | 
|   552           CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(2))); |   552           CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(2))); | 
|   553           CHECK_EQ(1, m.code[0]->OutputCount()); |   553           CHECK_LE(1, m.code[0]->OutputCount()); | 
|   554         } |   554         } | 
|   555         { |   555         { | 
|   556           InstructionSelectorTester m; |   556           InstructionSelectorTester m; | 
|   557           Node* node = m.NewNode( |   557           Node* node = m.NewNode( | 
|   558               odpi.op, m.Parameter(0), |   558               odpi.op, m.Parameter(0), | 
|   559               m.NewNode(shift.op, m.Parameter(1), m.Int32Constant(imm))); |   559               m.NewNode(shift.op, m.Parameter(1), m.Int32Constant(imm))); | 
|   560           m.Return(m.Word32Equal(m.Projection(0, node), m.Projection(1, node))); |   560           m.Return(m.Word32Equal(m.Projection(0, node), m.Projection(1, node))); | 
|   561           m.SelectInstructions(); |   561           m.SelectInstructions(); | 
|   562           CHECK_LE(1, m.code.size()); |   562           CHECK_LE(1, m.code.size()); | 
|   563           CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); |   563           CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); | 
| (...skipping 1182 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1746       m.Return(m.Int32Constant(0)); |  1746       m.Return(m.Int32Constant(0)); | 
|  1747       m.SelectInstructions(); |  1747       m.SelectInstructions(); | 
|  1748       CHECK_EQ(1, m.code.size()); |  1748       CHECK_EQ(1, m.code.size()); | 
|  1749       CHECK_EQ(dpi.test_arch_opcode, m.code[0]->arch_opcode()); |  1749       CHECK_EQ(dpi.test_arch_opcode, m.code[0]->arch_opcode()); | 
|  1750       CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode()); |  1750       CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode()); | 
|  1751       CHECK_EQ(kFlags_branch, m.code[0]->flags_mode()); |  1751       CHECK_EQ(kFlags_branch, m.code[0]->flags_mode()); | 
|  1752       CHECK_EQ(kEqual, m.code[0]->flags_condition()); |  1752       CHECK_EQ(kEqual, m.code[0]->flags_condition()); | 
|  1753     } |  1753     } | 
|  1754   } |  1754   } | 
|  1755 } |  1755 } | 
 |  1756  | 
 |  1757  | 
 |  1758 TEST(InstructionSelectorBranchWithODPIP) { | 
 |  1759   ODPIs odpis; | 
 |  1760   for (ODPIs::const_iterator i = odpis.begin(); i != odpis.end(); ++i) { | 
 |  1761     ODPI odpi = *i; | 
 |  1762     { | 
 |  1763       InstructionSelectorTester m; | 
 |  1764       MLabel blocka, blockb; | 
 |  1765       Node* node = m.NewNode(odpi.op, m.Parameter(0), m.Parameter(1)); | 
 |  1766       m.Branch(m.Projection(1, node), &blocka, &blockb); | 
 |  1767       m.Bind(&blocka); | 
 |  1768       m.Return(m.Int32Constant(0)); | 
 |  1769       m.Bind(&blockb); | 
 |  1770       m.Return(m.Projection(0, node)); | 
 |  1771       m.SelectInstructions(); | 
 |  1772       CHECK_EQ(1, m.code.size()); | 
 |  1773       CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); | 
 |  1774       CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode()); | 
 |  1775       CHECK_EQ(kFlags_branch, m.code[0]->flags_mode()); | 
 |  1776       CHECK_EQ(kOverflow, m.code[0]->flags_condition()); | 
 |  1777     } | 
 |  1778     { | 
 |  1779       InstructionSelectorTester m; | 
 |  1780       MLabel blocka, blockb; | 
 |  1781       Node* node = m.NewNode(odpi.op, m.Parameter(0), m.Parameter(1)); | 
 |  1782       m.Branch(m.Word32Equal(m.Projection(1, node), m.Int32Constant(0)), | 
 |  1783                &blocka, &blockb); | 
 |  1784       m.Bind(&blocka); | 
 |  1785       m.Return(m.Int32Constant(0)); | 
 |  1786       m.Bind(&blockb); | 
 |  1787       m.Return(m.Projection(0, node)); | 
 |  1788       m.SelectInstructions(); | 
 |  1789       CHECK_EQ(1, m.code.size()); | 
 |  1790       CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); | 
 |  1791       CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode()); | 
 |  1792       CHECK_EQ(kFlags_branch, m.code[0]->flags_mode()); | 
 |  1793       CHECK_EQ(kNotOverflow, m.code[0]->flags_condition()); | 
 |  1794     } | 
 |  1795     { | 
 |  1796       InstructionSelectorTester m; | 
 |  1797       MLabel blocka, blockb; | 
 |  1798       Node* node = m.NewNode(odpi.op, m.Parameter(0), m.Parameter(1)); | 
 |  1799       m.Branch(m.Word32Equal(m.Int32Constant(0), m.Projection(1, node)), | 
 |  1800                &blocka, &blockb); | 
 |  1801       m.Bind(&blocka); | 
 |  1802       m.Return(m.Int32Constant(0)); | 
 |  1803       m.Bind(&blockb); | 
 |  1804       m.Return(m.Projection(0, node)); | 
 |  1805       m.SelectInstructions(); | 
 |  1806       CHECK_EQ(1, m.code.size()); | 
 |  1807       CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); | 
 |  1808       CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode()); | 
 |  1809       CHECK_EQ(kFlags_branch, m.code[0]->flags_mode()); | 
 |  1810       CHECK_EQ(kNotOverflow, m.code[0]->flags_condition()); | 
 |  1811     } | 
 |  1812   } | 
 |  1813 } | 
 |  1814  | 
 |  1815  | 
 |  1816 TEST(InstructionSelectorBranchWithODPIImm) { | 
 |  1817   ODPIs odpis; | 
 |  1818   Immediates immediates; | 
 |  1819   for (ODPIs::const_iterator i = odpis.begin(); i != odpis.end(); ++i) { | 
 |  1820     ODPI odpi = *i; | 
 |  1821     for (Immediates::const_iterator j = immediates.begin(); | 
 |  1822          j != immediates.end(); ++j) { | 
 |  1823       int32_t imm = *j; | 
 |  1824       { | 
 |  1825         InstructionSelectorTester m; | 
 |  1826         MLabel blocka, blockb; | 
 |  1827         Node* node = m.NewNode(odpi.op, m.Parameter(0), m.Int32Constant(imm)); | 
 |  1828         m.Branch(m.Projection(1, node), &blocka, &blockb); | 
 |  1829         m.Bind(&blocka); | 
 |  1830         m.Return(m.Int32Constant(0)); | 
 |  1831         m.Bind(&blockb); | 
 |  1832         m.Return(m.Projection(0, node)); | 
 |  1833         m.SelectInstructions(); | 
 |  1834         CHECK_EQ(1, m.code.size()); | 
 |  1835         CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); | 
 |  1836         CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); | 
 |  1837         CHECK_EQ(kFlags_branch, m.code[0]->flags_mode()); | 
 |  1838         CHECK_EQ(kOverflow, m.code[0]->flags_condition()); | 
 |  1839         CHECK_LE(2, m.code[0]->InputCount()); | 
 |  1840         CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); | 
 |  1841       } | 
 |  1842       { | 
 |  1843         InstructionSelectorTester m; | 
 |  1844         MLabel blocka, blockb; | 
 |  1845         Node* node = m.NewNode(odpi.op, m.Int32Constant(imm), m.Parameter(0)); | 
 |  1846         m.Branch(m.Projection(1, node), &blocka, &blockb); | 
 |  1847         m.Bind(&blocka); | 
 |  1848         m.Return(m.Int32Constant(0)); | 
 |  1849         m.Bind(&blockb); | 
 |  1850         m.Return(m.Projection(0, node)); | 
 |  1851         m.SelectInstructions(); | 
 |  1852         CHECK_EQ(1, m.code.size()); | 
 |  1853         CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); | 
 |  1854         CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); | 
 |  1855         CHECK_EQ(kFlags_branch, m.code[0]->flags_mode()); | 
 |  1856         CHECK_EQ(kOverflow, m.code[0]->flags_condition()); | 
 |  1857         CHECK_LE(2, m.code[0]->InputCount()); | 
 |  1858         CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); | 
 |  1859       } | 
 |  1860       { | 
 |  1861         InstructionSelectorTester m; | 
 |  1862         MLabel blocka, blockb; | 
 |  1863         Node* node = m.NewNode(odpi.op, m.Parameter(0), m.Int32Constant(imm)); | 
 |  1864         m.Branch(m.Word32Equal(m.Projection(1, node), m.Int32Constant(0)), | 
 |  1865                  &blocka, &blockb); | 
 |  1866         m.Bind(&blocka); | 
 |  1867         m.Return(m.Int32Constant(0)); | 
 |  1868         m.Bind(&blockb); | 
 |  1869         m.Return(m.Projection(0, node)); | 
 |  1870         m.SelectInstructions(); | 
 |  1871         CHECK_EQ(1, m.code.size()); | 
 |  1872         CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); | 
 |  1873         CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); | 
 |  1874         CHECK_EQ(kFlags_branch, m.code[0]->flags_mode()); | 
 |  1875         CHECK_EQ(kNotOverflow, m.code[0]->flags_condition()); | 
 |  1876         CHECK_LE(2, m.code[0]->InputCount()); | 
 |  1877         CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); | 
 |  1878       } | 
 |  1879       { | 
 |  1880         InstructionSelectorTester m; | 
 |  1881         MLabel blocka, blockb; | 
 |  1882         Node* node = m.NewNode(odpi.op, m.Int32Constant(imm), m.Parameter(0)); | 
 |  1883         m.Branch(m.Word32Equal(m.Projection(1, node), m.Int32Constant(0)), | 
 |  1884                  &blocka, &blockb); | 
 |  1885         m.Bind(&blocka); | 
 |  1886         m.Return(m.Int32Constant(0)); | 
 |  1887         m.Bind(&blockb); | 
 |  1888         m.Return(m.Projection(0, node)); | 
 |  1889         m.SelectInstructions(); | 
 |  1890         CHECK_EQ(1, m.code.size()); | 
 |  1891         CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); | 
 |  1892         CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); | 
 |  1893         CHECK_EQ(kFlags_branch, m.code[0]->flags_mode()); | 
 |  1894         CHECK_EQ(kNotOverflow, m.code[0]->flags_condition()); | 
 |  1895         CHECK_LE(2, m.code[0]->InputCount()); | 
 |  1896         CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); | 
 |  1897       } | 
 |  1898     } | 
 |  1899   } | 
 |  1900 } | 
| OLD | NEW |