Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: src/interpreter/bytecode-array-writer.cc

Issue 1947403002: [interpreter] Introduce bytecode generation pipeline. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Rebase Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/interpreter/bytecode-array-writer.h ('k') | src/interpreter/bytecode-generator.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(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::GetMaximumFrameSizeUsed() {
98 return max_register_count_ * kPointerSize;
99 }
100
101 } // namespace interpreter
102 } // namespace internal
103 } // namespace v8
OLDNEW
« no previous file with comments | « src/interpreter/bytecode-array-writer.h ('k') | src/interpreter/bytecode-generator.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698