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-array-builder.h" | 5 #include "src/interpreter/bytecode-array-builder.h" |
6 | 6 |
7 namespace v8 { | 7 namespace v8 { |
8 namespace internal { | 8 namespace internal { |
9 namespace interpreter { | 9 namespace interpreter { |
10 | 10 |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
121 | 121 |
122 | 122 |
123 void BytecodeArrayBuilder::Output(Bytecode bytecode) { | 123 void BytecodeArrayBuilder::Output(Bytecode bytecode) { |
124 DCHECK_EQ(Bytecodes::NumberOfOperands(bytecode), 0); | 124 DCHECK_EQ(Bytecodes::NumberOfOperands(bytecode), 0); |
125 last_bytecode_start_ = bytecodes()->size(); | 125 last_bytecode_start_ = bytecodes()->size(); |
126 bytecodes()->push_back(Bytecodes::ToByte(bytecode)); | 126 bytecodes()->push_back(Bytecodes::ToByte(bytecode)); |
127 } | 127 } |
128 | 128 |
129 | 129 |
130 BytecodeArrayBuilder& BytecodeArrayBuilder::BinaryOperation(Token::Value op, | 130 BytecodeArrayBuilder& BytecodeArrayBuilder::BinaryOperation(Token::Value op, |
131 Register reg) { | 131 Register reg, |
| 132 Strength strength) { |
| 133 if (is_strong(strength)) { |
| 134 UNIMPLEMENTED(); |
| 135 } |
| 136 |
132 Output(BytecodeForBinaryOperation(op), reg.ToOperand()); | 137 Output(BytecodeForBinaryOperation(op), reg.ToOperand()); |
133 return *this; | 138 return *this; |
134 } | 139 } |
135 | 140 |
136 | 141 |
137 BytecodeArrayBuilder& BytecodeArrayBuilder::LogicalNot() { | 142 BytecodeArrayBuilder& BytecodeArrayBuilder::LogicalNot() { |
138 Output(Bytecode::kLogicalNot); | 143 Output(Bytecode::kLogicalNot); |
139 return *this; | 144 return *this; |
140 } | 145 } |
141 | 146 |
142 | 147 |
143 BytecodeArrayBuilder& BytecodeArrayBuilder::TypeOf() { | 148 BytecodeArrayBuilder& BytecodeArrayBuilder::TypeOf() { |
144 Output(Bytecode::kTypeOf); | 149 Output(Bytecode::kTypeOf); |
145 return *this; | 150 return *this; |
146 } | 151 } |
147 | 152 |
148 | 153 |
149 BytecodeArrayBuilder& BytecodeArrayBuilder::CompareOperation( | 154 BytecodeArrayBuilder& BytecodeArrayBuilder::CompareOperation( |
150 Token::Value op, Register reg, LanguageMode language_mode) { | 155 Token::Value op, Register reg, Strength strength) { |
151 if (!is_sloppy(language_mode)) { | 156 if (is_strong(strength)) { |
152 UNIMPLEMENTED(); | 157 UNIMPLEMENTED(); |
153 } | 158 } |
154 | 159 |
155 Output(BytecodeForCompareOperation(op), reg.ToOperand()); | 160 Output(BytecodeForCompareOperation(op), reg.ToOperand()); |
156 return *this; | 161 return *this; |
157 } | 162 } |
158 | 163 |
159 | 164 |
160 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadLiteral( | 165 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadLiteral( |
161 v8::internal::Smi* smi) { | 166 v8::internal::Smi* smi) { |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
231 if (FitsInIdx8Operand(slot_index)) { | 236 if (FitsInIdx8Operand(slot_index)) { |
232 Output(Bytecode::kLdaGlobal, static_cast<uint8_t>(slot_index)); | 237 Output(Bytecode::kLdaGlobal, static_cast<uint8_t>(slot_index)); |
233 } else { | 238 } else { |
234 UNIMPLEMENTED(); | 239 UNIMPLEMENTED(); |
235 } | 240 } |
236 return *this; | 241 return *this; |
237 } | 242 } |
238 | 243 |
239 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadNamedProperty( | 244 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadNamedProperty( |
240 Register object, int feedback_slot, LanguageMode language_mode) { | 245 Register object, int feedback_slot, LanguageMode language_mode) { |
241 if (!is_sloppy(language_mode)) { | 246 Bytecode bytecode = BytecodeForLoadIC(language_mode); |
242 UNIMPLEMENTED(); | |
243 } | |
244 | |
245 if (FitsInIdx8Operand(feedback_slot)) { | 247 if (FitsInIdx8Operand(feedback_slot)) { |
246 Output(Bytecode::kLoadIC, object.ToOperand(), | 248 Output(bytecode, object.ToOperand(), static_cast<uint8_t>(feedback_slot)); |
247 static_cast<uint8_t>(feedback_slot)); | |
248 } else { | 249 } else { |
249 UNIMPLEMENTED(); | 250 UNIMPLEMENTED(); |
250 } | 251 } |
251 return *this; | 252 return *this; |
252 } | 253 } |
253 | 254 |
254 | 255 |
255 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadKeyedProperty( | 256 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadKeyedProperty( |
256 Register object, int feedback_slot, LanguageMode language_mode) { | 257 Register object, int feedback_slot, LanguageMode language_mode) { |
257 if (!is_sloppy(language_mode)) { | 258 Bytecode bytecode = BytecodeForKeyedLoadIC(language_mode); |
258 UNIMPLEMENTED(); | |
259 } | |
260 | |
261 if (FitsInIdx8Operand(feedback_slot)) { | 259 if (FitsInIdx8Operand(feedback_slot)) { |
262 Output(Bytecode::kKeyedLoadIC, object.ToOperand(), | 260 Output(bytecode, object.ToOperand(), static_cast<uint8_t>(feedback_slot)); |
263 static_cast<uint8_t>(feedback_slot)); | |
264 } else { | 261 } else { |
265 UNIMPLEMENTED(); | 262 UNIMPLEMENTED(); |
266 } | 263 } |
267 return *this; | 264 return *this; |
268 } | 265 } |
269 | 266 |
270 | 267 |
271 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreNamedProperty( | 268 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreNamedProperty( |
272 Register object, Register name, int feedback_slot, | 269 Register object, Register name, int feedback_slot, |
273 LanguageMode language_mode) { | 270 LanguageMode language_mode) { |
274 if (!is_sloppy(language_mode)) { | 271 Bytecode bytecode = BytecodeForStoreIC(language_mode); |
275 UNIMPLEMENTED(); | |
276 } | |
277 | |
278 if (FitsInIdx8Operand(feedback_slot)) { | 272 if (FitsInIdx8Operand(feedback_slot)) { |
279 Output(Bytecode::kStoreIC, object.ToOperand(), name.ToOperand(), | 273 Output(bytecode, object.ToOperand(), name.ToOperand(), |
280 static_cast<uint8_t>(feedback_slot)); | 274 static_cast<uint8_t>(feedback_slot)); |
281 } else { | 275 } else { |
282 UNIMPLEMENTED(); | 276 UNIMPLEMENTED(); |
283 } | 277 } |
284 return *this; | 278 return *this; |
285 } | 279 } |
286 | 280 |
287 | 281 |
288 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreKeyedProperty( | 282 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreKeyedProperty( |
289 Register object, Register key, int feedback_slot, | 283 Register object, Register key, int feedback_slot, |
290 LanguageMode language_mode) { | 284 LanguageMode language_mode) { |
291 if (!is_sloppy(language_mode)) { | 285 Bytecode bytecode = BytecodeForKeyedStoreIC(language_mode); |
292 UNIMPLEMENTED(); | |
293 } | |
294 | |
295 if (FitsInIdx8Operand(feedback_slot)) { | 286 if (FitsInIdx8Operand(feedback_slot)) { |
296 Output(Bytecode::kKeyedStoreIC, object.ToOperand(), key.ToOperand(), | 287 Output(bytecode, object.ToOperand(), key.ToOperand(), |
297 static_cast<uint8_t>(feedback_slot)); | 288 static_cast<uint8_t>(feedback_slot)); |
298 } else { | 289 } else { |
299 UNIMPLEMENTED(); | 290 UNIMPLEMENTED(); |
300 } | 291 } |
301 return *this; | 292 return *this; |
302 } | 293 } |
303 | 294 |
304 | 295 |
305 BytecodeArrayBuilder& BytecodeArrayBuilder::CastAccumulatorToBoolean() { | 296 BytecodeArrayBuilder& BytecodeArrayBuilder::CastAccumulatorToBoolean() { |
306 if (LastBytecodeInSameBlock()) { | 297 if (LastBytecodeInSameBlock()) { |
(...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
613 case Token::Value::IN: | 604 case Token::Value::IN: |
614 return Bytecode::kTestIn; | 605 return Bytecode::kTestIn; |
615 default: | 606 default: |
616 UNREACHABLE(); | 607 UNREACHABLE(); |
617 return static_cast<Bytecode>(-1); | 608 return static_cast<Bytecode>(-1); |
618 } | 609 } |
619 } | 610 } |
620 | 611 |
621 | 612 |
622 // static | 613 // static |
| 614 Bytecode BytecodeArrayBuilder::BytecodeForLoadIC(LanguageMode language_mode) { |
| 615 switch (language_mode) { |
| 616 case SLOPPY: |
| 617 return Bytecode::kLoadICSloppy; |
| 618 case STRICT: |
| 619 return Bytecode::kLoadICStrict; |
| 620 case STRONG: |
| 621 UNIMPLEMENTED(); |
| 622 default: |
| 623 UNREACHABLE(); |
| 624 } |
| 625 return static_cast<Bytecode>(-1); |
| 626 } |
| 627 |
| 628 |
| 629 // static |
| 630 Bytecode BytecodeArrayBuilder::BytecodeForKeyedLoadIC( |
| 631 LanguageMode language_mode) { |
| 632 switch (language_mode) { |
| 633 case SLOPPY: |
| 634 return Bytecode::kKeyedLoadICSloppy; |
| 635 case STRICT: |
| 636 return Bytecode::kKeyedLoadICStrict; |
| 637 case STRONG: |
| 638 UNIMPLEMENTED(); |
| 639 default: |
| 640 UNREACHABLE(); |
| 641 } |
| 642 return static_cast<Bytecode>(-1); |
| 643 } |
| 644 |
| 645 |
| 646 // static |
| 647 Bytecode BytecodeArrayBuilder::BytecodeForStoreIC(LanguageMode language_mode) { |
| 648 switch (language_mode) { |
| 649 case SLOPPY: |
| 650 return Bytecode::kStoreICSloppy; |
| 651 case STRICT: |
| 652 return Bytecode::kStoreICStrict; |
| 653 case STRONG: |
| 654 UNIMPLEMENTED(); |
| 655 default: |
| 656 UNREACHABLE(); |
| 657 } |
| 658 return static_cast<Bytecode>(-1); |
| 659 } |
| 660 |
| 661 |
| 662 // static |
| 663 Bytecode BytecodeArrayBuilder::BytecodeForKeyedStoreIC( |
| 664 LanguageMode language_mode) { |
| 665 switch (language_mode) { |
| 666 case SLOPPY: |
| 667 return Bytecode::kKeyedStoreICSloppy; |
| 668 case STRICT: |
| 669 return Bytecode::kKeyedStoreICStrict; |
| 670 case STRONG: |
| 671 UNIMPLEMENTED(); |
| 672 default: |
| 673 UNREACHABLE(); |
| 674 } |
| 675 return static_cast<Bytecode>(-1); |
| 676 } |
| 677 |
| 678 |
| 679 // static |
623 bool BytecodeArrayBuilder::FitsInIdx8Operand(int value) { | 680 bool BytecodeArrayBuilder::FitsInIdx8Operand(int value) { |
624 return kMinUInt8 <= value && value <= kMaxUInt8; | 681 return kMinUInt8 <= value && value <= kMaxUInt8; |
625 } | 682 } |
626 | 683 |
627 | 684 |
628 // static | 685 // static |
629 bool BytecodeArrayBuilder::FitsInIdx8Operand(size_t value) { | 686 bool BytecodeArrayBuilder::FitsInIdx8Operand(size_t value) { |
630 return value <= static_cast<size_t>(kMaxUInt8); | 687 return value <= static_cast<size_t>(kMaxUInt8); |
631 } | 688 } |
632 | 689 |
(...skipping 23 matching lines...) Expand all Loading... |
656 | 713 |
657 Register TemporaryRegisterScope::NewRegister() { | 714 Register TemporaryRegisterScope::NewRegister() { |
658 count_++; | 715 count_++; |
659 last_register_index_ = builder_->BorrowTemporaryRegister(); | 716 last_register_index_ = builder_->BorrowTemporaryRegister(); |
660 return Register(last_register_index_); | 717 return Register(last_register_index_); |
661 } | 718 } |
662 | 719 |
663 } // namespace interpreter | 720 } // namespace interpreter |
664 } // namespace internal | 721 } // namespace internal |
665 } // namespace v8 | 722 } // namespace v8 |
OLD | NEW |