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 "src/interpreter/bytecode-array-writer.h" |
| 6 |
| 7 #include <iomanip> |
| 8 #include "src/interpreter/source-position-table.h" |
| 9 |
| 10 namespace v8 { |
| 11 namespace internal { |
| 12 namespace interpreter { |
| 13 |
| 14 BytecodeArrayWriter::BytecodeArrayWriter( |
| 15 Zone* zone, SourcePositionTableBuilder* source_position_table_builder) |
| 16 : bytecodes_(zone), |
| 17 max_register_count_(0), |
| 18 source_position_table_builder_(source_position_table_builder) {} |
| 19 |
| 20 // override |
| 21 BytecodeArrayWriter::~BytecodeArrayWriter() {} |
| 22 |
| 23 // override |
| 24 size_t BytecodeArrayWriter::FlushForOffset() { return bytecodes()->size(); } |
| 25 |
| 26 // override |
| 27 void BytecodeArrayWriter::Write(BytecodeNode* node) { |
| 28 UpdateSourcePositionTable(node); |
| 29 EmitBytecode(node); |
| 30 } |
| 31 |
| 32 void BytecodeArrayWriter::UpdateSourcePositionTable( |
| 33 const BytecodeNode* const node) { |
| 34 int bytecode_offset = static_cast<int>(bytecodes()->size()); |
| 35 const BytecodeSourceInfo& source_info = node->source_info(); |
| 36 if (source_info.is_valid()) { |
| 37 source_position_table_builder_->AddPosition(bytecode_offset, |
| 38 source_info.source_position(), |
| 39 source_info.is_statement()); |
| 40 } |
| 41 } |
| 42 |
| 43 void BytecodeArrayWriter::EmitBytecode(const BytecodeNode* const node) { |
| 44 OperandScale operand_scale = node->operand_scale(); |
| 45 if (operand_scale != OperandScale::kSingle) { |
| 46 Bytecode prefix = Bytecodes::OperandScaleToPrefixBytecode(operand_scale); |
| 47 bytecodes()->push_back(Bytecodes::ToByte(prefix)); |
| 48 } |
| 49 |
| 50 Bytecode bytecode = node->bytecode(); |
| 51 bytecodes()->push_back(Bytecodes::ToByte(bytecode)); |
| 52 |
| 53 int register_operand_bitmap = Bytecodes::GetRegisterOperandBitmap(bytecode); |
| 54 const uint32_t* const operands = node->operands(); |
| 55 const OperandType* operand_types = Bytecodes::GetOperandTypes(bytecode); |
| 56 for (int i = 0; operand_types[i] != OperandType::kNone; ++i) { |
| 57 OperandType operand_type = operand_types[i]; |
| 58 switch (Bytecodes::SizeOfOperand(operand_type, operand_scale)) { |
| 59 case OperandSize::kNone: |
| 60 UNREACHABLE(); |
| 61 break; |
| 62 case OperandSize::kByte: |
| 63 bytecodes()->push_back(static_cast<uint8_t>(operands[i])); |
| 64 break; |
| 65 case OperandSize::kShort: { |
| 66 uint8_t operand_bytes[2]; |
| 67 WriteUnalignedUInt16(operand_bytes, operands[i]); |
| 68 bytecodes()->insert(bytecodes()->end(), operand_bytes, |
| 69 operand_bytes + 2); |
| 70 break; |
| 71 } |
| 72 case OperandSize::kQuad: { |
| 73 uint8_t operand_bytes[4]; |
| 74 WriteUnalignedUInt32(operand_bytes, operands[i]); |
| 75 bytecodes()->insert(bytecodes()->end(), operand_bytes, |
| 76 operand_bytes + 4); |
| 77 break; |
| 78 } |
| 79 } |
| 80 |
| 81 if ((register_operand_bitmap >> i) & 1) { |
| 82 int count; |
| 83 if (operand_types[i + 1] == OperandType::kRegCount) { |
| 84 count = static_cast<int>(operands[i + 1]); |
| 85 } else { |
| 86 count = Bytecodes::GetNumberOfRegistersRepresentedBy(operand_type); |
| 87 } |
| 88 Register reg = Register::FromOperand(static_cast<int32_t>(operands[i])); |
| 89 max_register_count_ = std::max(max_register_count_, reg.index() + count); |
| 90 } |
| 91 } |
| 92 } |
| 93 |
| 94 // override |
| 95 void BytecodeArrayWriter::FlushBasicBlock() {} |
| 96 |
| 97 int BytecodeArrayWriter::GetMeasuredFrameSize() { |
| 98 return max_register_count_ * kPointerSize; |
| 99 } |
| 100 |
| 101 } // namespace interpreter |
| 102 } // namespace internal |
| 103 } // namespace v8 |
OLD | NEW |