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/ast.h" | |
6 #include "src/interpreter/bytecode-array-builder.h" | |
rmcilroy
2015/07/30 10:12:25
always have header on it's own line first (which m
oth
2015/07/30 15:38:42
Done.
| |
7 | |
8 namespace v8 { | |
9 namespace internal { | |
10 namespace interpreter { | |
11 | |
12 BytecodeArrayBuilder::BytecodeArrayBuilder(Isolate* isolate) | |
13 : isolate_(isolate), max_registers_(-1), scratch_register_(-1) {} | |
14 | |
15 | |
16 void BytecodeArrayBuilder::set_stack_slots(int slots) { | |
rmcilroy
2015/07/30 10:12:24
nit - this would be clearer to me as this be set_
oth
2015/07/30 15:38:42
Done.
| |
17 scratch_register_ = slots; | |
rmcilroy
2015/07/30 10:12:24
local_register_count_
oth
2015/07/30 15:38:42
Done.
| |
18 max_registers_ = slots; | |
rmcilroy
2015/07/30 10:12:24
max_temporary_register_count_
oth
2015/07/30 15:38:42
Done.
| |
19 } | |
20 | |
21 | |
22 Handle<BytecodeArray> BytecodeArrayBuilder::ToBytecodeArray() const { | |
rmcilroy
2015/07/30 10:12:24
add a "bytecodes_generated_" bool and DCHECK here
oth
2015/07/30 15:38:42
Done.
| |
23 int bytecode_size = static_cast<int>(bytecodes_.size()); | |
24 int frame_size = max_registers_ * sizeof(intptr_t); | |
25 return isolate_->factory()->NewBytecodeArray(bytecode_size, | |
26 &bytecodes_.front(), frame_size); | |
27 } | |
28 | |
29 | |
30 void BytecodeArrayBuilder::BinaryOperation(Token::Value binop, int reg) { | |
31 Output(BytecodeFor(binop), reg); | |
32 } | |
33 | |
34 | |
35 void BytecodeArrayBuilder::LoadLiteral(v8::internal::Smi* smi) { | |
36 int32_t raw_smi = smi->value(); | |
37 if (raw_smi == 0) { | |
38 Output(Bytecode::kLoadLiteral0); | |
39 } else if (raw_smi > -128 && raw_smi <= 128) { | |
40 Output(Bytecode::kLoadSmi8, static_cast<uint8_t>(raw_smi)); | |
41 } else { | |
42 // TODO(oth): Put Smi in constant pool. | |
43 UNIMPLEMENTED(); | |
44 } | |
45 } | |
46 | |
47 | |
48 void BytecodeArrayBuilder::LoadUndefined() { Output(Bytecode::kLdaUndefined); } | |
49 | |
50 | |
51 void BytecodeArrayBuilder::LoadNull() { Output(Bytecode::kLdaNull); } | |
52 | |
53 | |
54 void BytecodeArrayBuilder::LoadTheHole() { Output(Bytecode::kLdaTheHole); } | |
55 | |
56 | |
57 void BytecodeArrayBuilder::LoadTrue() { Output(Bytecode::kLdaTrue); } | |
58 | |
59 | |
60 void BytecodeArrayBuilder::LoadFalse() { Output(Bytecode::kLdaFalse); } | |
61 | |
62 | |
63 void BytecodeArrayBuilder::LoadAccumulatorWithRegister(int reg) { | |
64 Output(Bytecode::kLdar, reg); | |
65 } | |
66 | |
67 | |
68 void BytecodeArrayBuilder::StoreAccumulatorInRegister(int reg) { | |
69 Output(Bytecode::kStra, reg); | |
70 } | |
71 | |
72 | |
73 void BytecodeArrayBuilder::Return() { Output(Bytecode::kReturn); } | |
74 | |
75 | |
76 int BytecodeArrayBuilder::AllocateScratchRegister() { | |
rmcilroy
2015/07/30 10:12:24
These should be Pop/PushScratchRegister if they re
oth
2015/07/30 15:38:42
Done.
rmcilroy
2015/07/31 09:56:19
Missed rename to Push/Pop?
| |
77 int reg = scratch_register_++; | |
rmcilroy
2015/07/30 10:12:24
nit - add CHECK(locals_register_count_ >= 0)
oth
2015/07/30 15:38:42
Done.
| |
78 if (scratch_register_ > max_registers_) { | |
79 max_registers_ = scratch_register_; | |
80 } | |
81 return reg; | |
82 } | |
83 | |
84 | |
85 void BytecodeArrayBuilder::FreeScratchRegister(int reg) { | |
86 DCHECK(reg == scratch_register_ - 1); | |
87 scratch_register_ = reg; | |
88 } | |
89 | |
90 | |
91 void BytecodeArrayBuilder::Output(Bytecode bytecode, uint8_t r0, uint8_t r1, | |
rmcilroy
2015/07/30 10:12:24
nit - operand0, operand1, etc. (instead of r0, r1.
oth
2015/07/30 15:38:42
Done.
| |
92 uint8_t r2) { | |
93 CHECK(Bytecodes::NumberOfOperands(bytecode) == 3); | |
94 bytecodes_.push_back(Bytecodes::ToByte(bytecode)); | |
95 bytecodes_.push_back(r0); | |
96 bytecodes_.push_back(r1); | |
97 bytecodes_.push_back(r2); | |
98 } | |
99 | |
100 | |
101 void BytecodeArrayBuilder::Output(Bytecode bytecode, uint8_t r0, uint8_t r1) { | |
102 CHECK(Bytecodes::NumberOfOperands(bytecode) == 2); | |
103 bytecodes_.push_back(Bytecodes::ToByte(bytecode)); | |
104 bytecodes_.push_back(r0); | |
105 bytecodes_.push_back(r1); | |
106 } | |
107 | |
108 | |
109 void BytecodeArrayBuilder::Output(Bytecode bytecode, uint8_t r0) { | |
110 CHECK(Bytecodes::NumberOfOperands(bytecode) == 1); | |
111 bytecodes_.push_back(Bytecodes::ToByte(bytecode)); | |
112 bytecodes_.push_back(r0); | |
113 } | |
114 | |
115 | |
116 void BytecodeArrayBuilder::Output(Bytecode bytecode) { | |
117 CHECK(Bytecodes::NumberOfOperands(bytecode) == 0); | |
118 bytecodes_.push_back(Bytecodes::ToByte(bytecode)); | |
119 } | |
120 | |
121 | |
122 // static | |
123 Bytecode BytecodeArrayBuilder::BytecodeFor(Token::Value op) { | |
rmcilroy
2015/07/30 10:12:24
Let's make this BytecodeForBinaryOp and remove the
oth
2015/07/30 15:38:42
Done.
| |
124 switch (op) { | |
125 case Token::Value::ASSIGN: | |
126 return Bytecode::kStra; | |
127 case Token::Value::ADD: | |
128 return Bytecode::kAdd; | |
129 case Token::Value::SUB: | |
130 return Bytecode::kSub; | |
131 case Token::Value::MUL: | |
132 return Bytecode::kMul; | |
133 case Token::Value::DIV: | |
134 return Bytecode::kDiv; | |
135 default: | |
136 UNIMPLEMENTED(); | |
137 return static_cast<Bytecode>(-1); | |
138 } | |
139 } | |
140 | |
141 } // namespace interpreter | |
142 } // namespace internal | |
143 } // namespace v8 | |
OLD | NEW |