| 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 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 165 Strength strength) { | 165 Strength strength) { |
| 166 if (is_strong(strength)) { | 166 if (is_strong(strength)) { |
| 167 UNIMPLEMENTED(); | 167 UNIMPLEMENTED(); |
| 168 } | 168 } |
| 169 | 169 |
| 170 Output(BytecodeForBinaryOperation(op), reg.ToOperand()); | 170 Output(BytecodeForBinaryOperation(op), reg.ToOperand()); |
| 171 return *this; | 171 return *this; |
| 172 } | 172 } |
| 173 | 173 |
| 174 | 174 |
| 175 BytecodeArrayBuilder& BytecodeArrayBuilder::CountOperation(Token::Value op, |
| 176 Strength strength) { |
| 177 if (is_strong(strength)) { |
| 178 UNIMPLEMENTED(); |
| 179 } |
| 180 |
| 181 Output(BytecodeForCountOperation(op)); |
| 182 return *this; |
| 183 } |
| 184 |
| 185 |
| 175 BytecodeArrayBuilder& BytecodeArrayBuilder::LogicalNot() { | 186 BytecodeArrayBuilder& BytecodeArrayBuilder::LogicalNot() { |
| 176 Output(Bytecode::kLogicalNot); | 187 Output(Bytecode::kLogicalNot); |
| 177 return *this; | 188 return *this; |
| 178 } | 189 } |
| 179 | 190 |
| 180 | 191 |
| 181 BytecodeArrayBuilder& BytecodeArrayBuilder::TypeOf() { | 192 BytecodeArrayBuilder& BytecodeArrayBuilder::TypeOf() { |
| 182 Output(Bytecode::kTypeOf); | 193 Output(Bytecode::kTypeOf); |
| 183 return *this; | 194 return *this; |
| 184 } | 195 } |
| (...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 458 return *this; | 469 return *this; |
| 459 } | 470 } |
| 460 | 471 |
| 461 | 472 |
| 462 BytecodeArrayBuilder& BytecodeArrayBuilder::CastAccumulatorToName() { | 473 BytecodeArrayBuilder& BytecodeArrayBuilder::CastAccumulatorToName() { |
| 463 Output(Bytecode::kToName); | 474 Output(Bytecode::kToName); |
| 464 return *this; | 475 return *this; |
| 465 } | 476 } |
| 466 | 477 |
| 467 | 478 |
| 479 BytecodeArrayBuilder& BytecodeArrayBuilder::CastAccumulatorToNumber() { |
| 480 // TODO(rmcilroy): consider omitting if the preceeding bytecode always returns |
| 481 // a number. |
| 482 Output(Bytecode::kToNumber); |
| 483 return *this; |
| 484 } |
| 485 |
| 486 |
| 468 BytecodeArrayBuilder& BytecodeArrayBuilder::Bind(BytecodeLabel* label) { | 487 BytecodeArrayBuilder& BytecodeArrayBuilder::Bind(BytecodeLabel* label) { |
| 469 if (label->is_forward_target()) { | 488 if (label->is_forward_target()) { |
| 470 // An earlier jump instruction refers to this label. Update it's location. | 489 // An earlier jump instruction refers to this label. Update it's location. |
| 471 PatchJump(bytecodes()->end(), bytecodes()->begin() + label->offset()); | 490 PatchJump(bytecodes()->end(), bytecodes()->begin() + label->offset()); |
| 472 // Now treat as if the label will only be back referred to. | 491 // Now treat as if the label will only be back referred to. |
| 473 } | 492 } |
| 474 label->bind_to(bytecodes()->size()); | 493 label->bind_to(bytecodes()->size()); |
| 475 return *this; | 494 return *this; |
| 476 } | 495 } |
| 477 | 496 |
| (...skipping 342 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 820 case Token::Value::SHR: | 839 case Token::Value::SHR: |
| 821 return Bytecode::kShiftRightLogical; | 840 return Bytecode::kShiftRightLogical; |
| 822 default: | 841 default: |
| 823 UNREACHABLE(); | 842 UNREACHABLE(); |
| 824 return static_cast<Bytecode>(-1); | 843 return static_cast<Bytecode>(-1); |
| 825 } | 844 } |
| 826 } | 845 } |
| 827 | 846 |
| 828 | 847 |
| 829 // static | 848 // static |
| 849 Bytecode BytecodeArrayBuilder::BytecodeForCountOperation(Token::Value op) { |
| 850 switch (op) { |
| 851 case Token::Value::ADD: |
| 852 return Bytecode::kInc; |
| 853 case Token::Value::SUB: |
| 854 return Bytecode::kDec; |
| 855 default: |
| 856 UNREACHABLE(); |
| 857 return static_cast<Bytecode>(-1); |
| 858 } |
| 859 } |
| 860 |
| 861 |
| 862 // static |
| 830 Bytecode BytecodeArrayBuilder::BytecodeForCompareOperation(Token::Value op) { | 863 Bytecode BytecodeArrayBuilder::BytecodeForCompareOperation(Token::Value op) { |
| 831 switch (op) { | 864 switch (op) { |
| 832 case Token::Value::EQ: | 865 case Token::Value::EQ: |
| 833 return Bytecode::kTestEqual; | 866 return Bytecode::kTestEqual; |
| 834 case Token::Value::NE: | 867 case Token::Value::NE: |
| 835 return Bytecode::kTestNotEqual; | 868 return Bytecode::kTestNotEqual; |
| 836 case Token::Value::EQ_STRICT: | 869 case Token::Value::EQ_STRICT: |
| 837 return Bytecode::kTestEqualStrict; | 870 return Bytecode::kTestEqualStrict; |
| 838 case Token::Value::NE_STRICT: | 871 case Token::Value::NE_STRICT: |
| 839 return Bytecode::kTestNotEqualStrict; | 872 return Bytecode::kTestNotEqualStrict; |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1016 DCHECK_GT(next_consecutive_count_, 0); | 1049 DCHECK_GT(next_consecutive_count_, 0); |
| 1017 builder_->BorrowConsecutiveTemporaryRegister(next_consecutive_register_); | 1050 builder_->BorrowConsecutiveTemporaryRegister(next_consecutive_register_); |
| 1018 allocated_.push_back(next_consecutive_register_); | 1051 allocated_.push_back(next_consecutive_register_); |
| 1019 next_consecutive_count_--; | 1052 next_consecutive_count_--; |
| 1020 return Register(next_consecutive_register_++); | 1053 return Register(next_consecutive_register_++); |
| 1021 } | 1054 } |
| 1022 | 1055 |
| 1023 } // namespace interpreter | 1056 } // namespace interpreter |
| 1024 } // namespace internal | 1057 } // namespace internal |
| 1025 } // namespace v8 | 1058 } // namespace v8 |
| OLD | NEW |