| OLD | NEW | 
|---|
| (Empty) |  | 
|  | 1 // Copyright 2015 the V8 project authors. All rights reserved. | 
|  | 2 // Use of this source code is governed by a BSD-style license that can be | 
|  | 3 // found in the LICENSE file. | 
|  | 4 | 
|  | 5 #include "test/unittests/compiler/interpreter-assembler-unittest.h" | 
|  | 6 | 
|  | 7 #include "src/compiler/graph.h" | 
|  | 8 #include "src/compiler/node.h" | 
|  | 9 #include "test/unittests/compiler/compiler-test-utils.h" | 
|  | 10 #include "test/unittests/compiler/node-test-utils.h" | 
|  | 11 | 
|  | 12 namespace v8 { | 
|  | 13 namespace internal { | 
|  | 14 namespace compiler { | 
|  | 15 | 
|  | 16 const interpreter::Bytecode kBytecodes[] = { | 
|  | 17 #define DEFINE_BYTECODE(Name, _) interpreter::Bytecode::k##Name, | 
|  | 18     BYTECODE_LIST(DEFINE_BYTECODE) | 
|  | 19 #undef DEFINE_BYTECODE | 
|  | 20 }; | 
|  | 21 | 
|  | 22 | 
|  | 23 Graph* | 
|  | 24 InterpreterAssemblerTest::InterpreterAssemblerForTest::GetCompletedGraph() { | 
|  | 25   End(); | 
|  | 26   return graph(); | 
|  | 27 } | 
|  | 28 | 
|  | 29 | 
|  | 30 Matcher<Node*> InterpreterAssemblerTest::InterpreterAssemblerForTest::IsLoad( | 
|  | 31     const Matcher<LoadRepresentation>& rep_matcher, | 
|  | 32     const Matcher<Node*>& base_matcher, const Matcher<Node*>& index_matcher) { | 
|  | 33   return ::i::compiler::IsLoad(rep_matcher, base_matcher, index_matcher, | 
|  | 34                                graph()->start(), graph()->start()); | 
|  | 35 } | 
|  | 36 | 
|  | 37 | 
|  | 38 Matcher<Node*> InterpreterAssemblerTest::InterpreterAssemblerForTest::IsStore( | 
|  | 39     const Matcher<StoreRepresentation>& rep_matcher, | 
|  | 40     const Matcher<Node*>& base_matcher, const Matcher<Node*>& index_matcher, | 
|  | 41     const Matcher<Node*>& value_matcher) { | 
|  | 42   return ::i::compiler::IsStore(rep_matcher, base_matcher, index_matcher, | 
|  | 43                                 value_matcher, graph()->start(), | 
|  | 44                                 graph()->start()); | 
|  | 45 } | 
|  | 46 | 
|  | 47 | 
|  | 48 TARGET_TEST_F(InterpreterAssemblerTest, Dispatch) { | 
|  | 49   TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) { | 
|  | 50     InterpreterAssemblerForTest m(this, bytecode); | 
|  | 51     m.Dispatch(); | 
|  | 52     Graph* graph = m.GetCompletedGraph(); | 
|  | 53 | 
|  | 54     Node* end = graph->end(); | 
|  | 55     EXPECT_EQ(1, end->InputCount()); | 
|  | 56     Node* tail_call_node = end->InputAt(0); | 
|  | 57 | 
|  | 58     Matcher<Node*> next_bytecode_matcher = | 
|  | 59         IsIntPtrAdd(IsParameter(Linkage::kInterpreterBytecodeParameter), | 
|  | 60                     IsInt32Constant(interpreter::Bytecodes::Size(bytecode))); | 
|  | 61     Matcher<Node*> target_bytecode_matcher = | 
|  | 62         m.IsLoad(kMachUint8, next_bytecode_matcher, IsInt32Constant(0)); | 
|  | 63     Matcher<Node*> code_target_matcher = m.IsLoad( | 
|  | 64         kMachPtr, IsParameter(Linkage::kInterpreterDispatchTableParameter), | 
|  | 65         IsWord32Shl(target_bytecode_matcher, | 
|  | 66                     IsInt32Constant(kPointerSizeLog2))); | 
|  | 67 | 
|  | 68     EXPECT_EQ(CallDescriptor::kInterpreterDispatch, | 
|  | 69               m.call_descriptor()->kind()); | 
|  | 70     EXPECT_THAT( | 
|  | 71         tail_call_node, | 
|  | 72         IsTailCall(m.call_descriptor(), code_target_matcher, | 
|  | 73                    next_bytecode_matcher, | 
|  | 74                    IsParameter(Linkage::kInterpreterDispatchTableParameter), | 
|  | 75                    graph->start(), graph->start())); | 
|  | 76   } | 
|  | 77 } | 
|  | 78 | 
|  | 79 | 
|  | 80 TARGET_TEST_F(InterpreterAssemblerTest, BytecodeArg) { | 
|  | 81   TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) { | 
|  | 82     InterpreterAssemblerForTest m(this, bytecode); | 
|  | 83     int number_of_args = interpreter::Bytecodes::NumberOfArguments(bytecode); | 
|  | 84     for (int i = 0; i < number_of_args; i++) { | 
|  | 85       Node* load_arg_node = m.BytecodeArg(i); | 
|  | 86       EXPECT_THAT(load_arg_node, | 
|  | 87                   m.IsLoad(kMachUint8, | 
|  | 88                            IsParameter(Linkage::kInterpreterBytecodeParameter), | 
|  | 89                            IsInt32Constant(1 + i))); | 
|  | 90     } | 
|  | 91   } | 
|  | 92 } | 
|  | 93 | 
|  | 94 | 
|  | 95 TARGET_TEST_F(InterpreterAssemblerTest, LoadRegisterFixed) { | 
|  | 96   TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) { | 
|  | 97     InterpreterAssemblerForTest m(this, bytecode); | 
|  | 98     for (int i = 0; i < m.max_register_index(); i++) { | 
|  | 99       Node* load_reg_node = m.LoadRegister(i); | 
|  | 100       EXPECT_THAT(load_reg_node, | 
|  | 101                   m.IsLoad(kMachPtr, IsLoadFramePointer(), | 
|  | 102                            IsInt32Constant(m.first_regster_offset_from_fp() - | 
|  | 103                                            (i << kPointerSizeLog2)))); | 
|  | 104     } | 
|  | 105   } | 
|  | 106 } | 
|  | 107 | 
|  | 108 | 
|  | 109 TARGET_TEST_F(InterpreterAssemblerTest, LoadRegister) { | 
|  | 110   TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) { | 
|  | 111     InterpreterAssemblerForTest m(this, bytecode); | 
|  | 112     Node* reg_index_node = m.Int32Constant(44); | 
|  | 113     Node* load_reg_node = m.LoadRegister(reg_index_node); | 
|  | 114     EXPECT_THAT( | 
|  | 115         load_reg_node, | 
|  | 116         m.IsLoad(kMachPtr, IsLoadFramePointer(), | 
|  | 117                  IsInt32Sub(IsInt32Constant(m.first_regster_offset_from_fp()), | 
|  | 118                             IsWord32Shl(reg_index_node, | 
|  | 119                                         IsInt32Constant(kPointerSizeLog2))))); | 
|  | 120   } | 
|  | 121 } | 
|  | 122 | 
|  | 123 | 
|  | 124 TARGET_TEST_F(InterpreterAssemblerTest, StoreRegisterFixed) { | 
|  | 125   TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) { | 
|  | 126     InterpreterAssemblerForTest m(this, bytecode); | 
|  | 127     Node* store_value = m.Int32Constant(0xdeadbeef); | 
|  | 128     for (int i = 0; i < m.max_register_index(); i++) { | 
|  | 129       Node* store_reg_node = m.StoreRegister(store_value, i); | 
|  | 130       EXPECT_THAT(store_reg_node, | 
|  | 131                   m.IsStore(StoreRepresentation(kMachPtr, kNoWriteBarrier), | 
|  | 132                             IsLoadFramePointer(), | 
|  | 133                             IsInt32Constant(m.first_regster_offset_from_fp() - | 
|  | 134                                             (i << kPointerSizeLog2)), | 
|  | 135                             store_value)); | 
|  | 136     } | 
|  | 137   } | 
|  | 138 } | 
|  | 139 | 
|  | 140 | 
|  | 141 TARGET_TEST_F(InterpreterAssemblerTest, StoreRegister) { | 
|  | 142   TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) { | 
|  | 143     InterpreterAssemblerForTest m(this, bytecode); | 
|  | 144     Node* store_value = m.Int32Constant(0xdeadbeef); | 
|  | 145     Node* reg_index_node = m.Int32Constant(44); | 
|  | 146     Node* store_reg_node = m.StoreRegister(store_value, reg_index_node); | 
|  | 147     EXPECT_THAT( | 
|  | 148         store_reg_node, | 
|  | 149         m.IsStore(StoreRepresentation(kMachPtr, kNoWriteBarrier), | 
|  | 150                   IsLoadFramePointer(), | 
|  | 151                   IsInt32Sub(IsInt32Constant(m.first_regster_offset_from_fp()), | 
|  | 152                              IsWord32Shl(reg_index_node, | 
|  | 153                                          IsInt32Constant(kPointerSizeLog2))), | 
|  | 154                   store_value)); | 
|  | 155   } | 
|  | 156 } | 
|  | 157 | 
|  | 158 }  // namespace compiler | 
|  | 159 }  // namespace internal | 
|  | 160 }  // namespace v8 | 
| OLD | NEW | 
|---|