OLD | NEW |
---|---|
1 // Copyright 2015 the V8 project authors. All rights reserved. | 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 | 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 "src/interpreter/bytecode-decoder.h" | 5 #include "src/interpreter/bytecode-decoder.h" |
6 | 6 |
7 #include <iomanip> | 7 #include <iomanip> |
8 | 8 |
9 #include "src/utils.h" | 9 #include "src/interpreter/interpreter-intrinsics.h" |
10 | 10 |
11 namespace v8 { | 11 namespace v8 { |
12 namespace internal { | 12 namespace internal { |
13 namespace interpreter { | 13 namespace interpreter { |
14 | 14 |
15 // static | 15 // static |
16 Register BytecodeDecoder::DecodeRegisterOperand(const uint8_t* operand_start, | 16 Register BytecodeDecoder::DecodeRegisterOperand(const uint8_t* operand_start, |
17 OperandType operand_type, | 17 OperandType operand_type, |
18 OperandScale operand_scale) { | 18 OperandScale operand_scale) { |
19 DCHECK(Bytecodes::IsRegisterOperandType(operand_type)); | 19 DCHECK(Bytecodes::IsRegisterOperandType(operand_type)); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
60 case OperandSize::kShort: | 60 case OperandSize::kShort: |
61 return ReadUnalignedUInt16(operand_start); | 61 return ReadUnalignedUInt16(operand_start); |
62 case OperandSize::kQuad: | 62 case OperandSize::kQuad: |
63 return ReadUnalignedUInt32(operand_start); | 63 return ReadUnalignedUInt32(operand_start); |
64 case OperandSize::kNone: | 64 case OperandSize::kNone: |
65 UNREACHABLE(); | 65 UNREACHABLE(); |
66 } | 66 } |
67 return 0; | 67 return 0; |
68 } | 68 } |
69 | 69 |
70 namespace { | |
71 const char* NameForIntrinsicId(uint32_t idx) { | |
72 switch (static_cast<IntrinsicsHelper::IntrinsicId>(idx)) { | |
73 #define CASE(name, nargs, ressize) \ | |
74 case IntrinsicsHelper::IntrinsicId::k##name: \ | |
75 return #name; | |
76 INTRINSICS_LIST(CASE) | |
77 #undef CASE | |
78 default: | |
79 UNREACHABLE(); | |
80 return nullptr; | |
81 } | |
82 } | |
83 | |
84 const char* NameForRuntimeId(uint32_t idx) { | |
85 switch (idx) { | |
86 #define CASE(name, nargs, ressize) \ | |
87 case Runtime::k##name: \ | |
88 return #name; \ | |
89 case Runtime::kInline##name: \ | |
90 return #name; | |
91 FOR_EACH_INTRINSIC(CASE) | |
92 #undef CASE | |
93 default: | |
94 UNREACHABLE(); | |
95 return nullptr; | |
96 } | |
97 } | |
98 } // anonymous namespace | |
99 | |
70 // static | 100 // static |
71 std::ostream& BytecodeDecoder::Decode(std::ostream& os, | 101 std::ostream& BytecodeDecoder::Decode(std::ostream& os, |
72 const uint8_t* bytecode_start, | 102 const uint8_t* bytecode_start, |
73 int parameter_count) { | 103 int parameter_count) { |
74 Bytecode bytecode = Bytecodes::FromByte(bytecode_start[0]); | 104 Bytecode bytecode = Bytecodes::FromByte(bytecode_start[0]); |
75 int prefix_offset = 0; | 105 int prefix_offset = 0; |
76 OperandScale operand_scale = OperandScale::kSingle; | 106 OperandScale operand_scale = OperandScale::kSingle; |
77 if (Bytecodes::IsPrefixScalingBytecode(bytecode)) { | 107 if (Bytecodes::IsPrefixScalingBytecode(bytecode)) { |
78 prefix_offset = 1; | 108 prefix_offset = 1; |
79 operand_scale = Bytecodes::PrefixBytecodeToOperandScale(bytecode); | 109 operand_scale = Bytecodes::PrefixBytecodeToOperandScale(bytecode); |
(...skipping 25 matching lines...) Expand all Loading... | |
105 int number_of_operands = Bytecodes::NumberOfOperands(bytecode); | 135 int number_of_operands = Bytecodes::NumberOfOperands(bytecode); |
106 for (int i = 0; i < number_of_operands; i++) { | 136 for (int i = 0; i < number_of_operands; i++) { |
107 OperandType op_type = Bytecodes::GetOperandType(bytecode, i); | 137 OperandType op_type = Bytecodes::GetOperandType(bytecode, i); |
108 int operand_offset = | 138 int operand_offset = |
109 Bytecodes::GetOperandOffset(bytecode, i, operand_scale); | 139 Bytecodes::GetOperandOffset(bytecode, i, operand_scale); |
110 const uint8_t* operand_start = | 140 const uint8_t* operand_start = |
111 &bytecode_start[prefix_offset + operand_offset]; | 141 &bytecode_start[prefix_offset + operand_offset]; |
112 switch (op_type) { | 142 switch (op_type) { |
113 case interpreter::OperandType::kIdx: | 143 case interpreter::OperandType::kIdx: |
114 case interpreter::OperandType::kUImm: | 144 case interpreter::OperandType::kUImm: |
115 case interpreter::OperandType::kRuntimeId: | |
116 case interpreter::OperandType::kIntrinsicId: | |
117 os << "[" | 145 os << "[" |
118 << DecodeUnsignedOperand(operand_start, op_type, operand_scale) | 146 << DecodeUnsignedOperand(operand_start, op_type, operand_scale) |
119 << "]"; | 147 << "]"; |
120 break; | 148 break; |
149 case interpreter::OperandType::kIntrinsicId: | |
150 os << "[" << NameForIntrinsicId(DecodeUnsignedOperand( | |
rmcilroy
2017/02/23 13:47:13
nit - could you just do NameForRuntimeId(Intrinsic
neis
2017/02/23 14:02:55
Done.
| |
151 operand_start, op_type, operand_scale)) | |
152 << "]"; | |
153 break; | |
154 case interpreter::OperandType::kRuntimeId: | |
155 os << "[" << NameForRuntimeId(DecodeUnsignedOperand( | |
156 operand_start, op_type, operand_scale)) | |
157 << "]"; | |
158 break; | |
121 case interpreter::OperandType::kImm: | 159 case interpreter::OperandType::kImm: |
122 os << "[" << DecodeSignedOperand(operand_start, op_type, operand_scale) | 160 os << "[" << DecodeSignedOperand(operand_start, op_type, operand_scale) |
123 << "]"; | 161 << "]"; |
124 break; | 162 break; |
125 case interpreter::OperandType::kFlag8: | 163 case interpreter::OperandType::kFlag8: |
126 os << "#" | 164 os << "#" |
127 << DecodeUnsignedOperand(operand_start, op_type, operand_scale); | 165 << DecodeUnsignedOperand(operand_start, op_type, operand_scale); |
128 break; | 166 break; |
129 case interpreter::OperandType::kReg: | 167 case interpreter::OperandType::kReg: |
130 case interpreter::OperandType::kRegOut: { | 168 case interpreter::OperandType::kRegOut: { |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
173 if (i != number_of_operands - 1) { | 211 if (i != number_of_operands - 1) { |
174 os << ", "; | 212 os << ", "; |
175 } | 213 } |
176 } | 214 } |
177 return os; | 215 return os; |
178 } | 216 } |
179 | 217 |
180 } // namespace interpreter | 218 } // namespace interpreter |
181 } // namespace internal | 219 } // namespace internal |
182 } // namespace v8 | 220 } // namespace v8 |
OLD | NEW |