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

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: Incorporate review comments. 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
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 frame_register_count_(0),
18 source_position_table_builder_(source_position_table_builder) {
19 bytecodes_.reserve(256);
20 }
21
22 // override
23 BytecodeArrayWriter::~BytecodeArrayWriter() {}
24
25 // override
26 size_t BytecodeArrayWriter::FlushForOffset() { return bytecodes()->size(); }
27
28 // override
29 void BytecodeArrayWriter::Write(BytecodeNode* node) {
30 UpdateSourcePositionTable(node);
31 EmitBytecode(node);
32 node->Release();
33 }
34
35 void BytecodeArrayWriter::UpdateSourcePositionTable(
36 const BytecodeNode* const node) {
37 int bytecode_offset = static_cast<int>(bytecodes()->size());
38 const BytecodeSourceInfo& source_info = node->source_info();
39 if (source_info.is_valid()) {
40 if (source_info.is_statement()) {
41 source_position_table_builder_->AddStatementPosition(
rmcilroy 2016/05/10 11:14:09 nit - maybe just update SourcePositionTableBuilder
oth 2016/05/11 13:17:30 Done.
42 bytecode_offset, source_info.source_position());
43 } else {
44 source_position_table_builder_->AddExpressionPosition(
45 bytecode_offset, source_info.source_position());
46 }
47 }
48 }
49
50 void BytecodeArrayWriter::EmitBytecode(const BytecodeNode* const node) {
51 OperandScale operand_scale = node->operand_scale();
52 if (operand_scale != OperandScale::kSingle) {
53 Bytecode prefix = Bytecodes::OperandScaleToPrefixBytecode(operand_scale);
54 bytecodes()->push_back(Bytecodes::ToByte(prefix));
55 }
56
57 Bytecode bytecode = node->bytecode();
58 bytecodes()->push_back(Bytecodes::ToByte(bytecode));
59
60 int register_operand_bitmap = Bytecodes::GetRegisterOperandBitmap(bytecode);
61 const uint32_t* const operands = node->operands();
62 const OperandType* operand_types = Bytecodes::GetOperandTypes(bytecode);
63 for (int i = 0; operand_types[i] != OperandType::kNone; ++i) {
64 OperandType operand_type = operand_types[i];
65 switch (Bytecodes::SizeOfOperand(operand_type, operand_scale)) {
66 case OperandSize::kNone:
67 UNREACHABLE();
68 break;
69 case OperandSize::kByte:
70 bytecodes()->push_back(static_cast<uint8_t>(operands[i]));
71 break;
72 case OperandSize::kShort: {
73 uint8_t operand_bytes[2];
74 WriteUnalignedUInt16(operand_bytes, operands[i]);
75 bytecodes()->insert(bytecodes()->end(), operand_bytes,
76 operand_bytes + 2);
77 break;
78 }
79 case OperandSize::kQuad: {
80 uint8_t operand_bytes[4];
81 WriteUnalignedUInt32(operand_bytes, operands[i]);
82 bytecodes()->insert(bytecodes()->end(), operand_bytes,
83 operand_bytes + 4);
84 break;
85 }
86 }
87
88 if ((register_operand_bitmap >> i) & 1) {
89 int count;
90 if (operand_types[i + 1] == OperandType::kRegCount) {
91 count = static_cast<int>(operands[i + 1]);
92 } else {
93 count = Bytecodes::GetNumberOfRegistersRepresentedBy(operand_type);
94 }
95 Register reg = Register::FromOperand(static_cast<int32_t>(operands[i]));
96 frame_register_count_ =
rmcilroy 2016/05/10 11:14:09 Nit - max_register_count_ ?
oth 2016/05/11 13:17:30 Done.
97 std::max(frame_register_count_, reg.index() + count);
98 }
99 }
100 }
101
102 // override
103 void BytecodeArrayWriter::LeaveBasicBlock() {}
104
105 int BytecodeArrayWriter::GetMeasuredFrameSize() {
rmcilroy 2016/05/10 11:14:09 nit - GetMaxRegisterCount() ?
oth 2016/05/11 13:17:30 The emphasis is on measured. Returning the size ra
rmcilroy 2016/05/12 12:15:13 How about GetMaximumFrameSizeUsed()?
rmcilroy 2016/05/12 15:19:47 Did you miss this comment, or prefer GetMeasuredFr
oth 2016/05/12 15:44:31 Done.
106 return frame_register_count_ * kPointerSize;
107 }
108
109 } // namespace interpreter
110 } // namespace internal
111 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698