Chromium Code Reviews| 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 |