| 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/bytecodes.h" | 5 #include "src/interpreter/bytecodes.h" |
| 6 | 6 |
| 7 #include <iomanip> | 7 #include <iomanip> |
| 8 | 8 |
| 9 #include "src/base/bits.h" | 9 #include "src/base/bits.h" |
| 10 #include "src/frames.h" | 10 #include "src/frames.h" |
| 11 #include "src/interpreter/bytecode-traits.h" | 11 #include "src/interpreter/bytecode-traits.h" |
| 12 #include "src/interpreter/interpreter.h" | 12 #include "src/interpreter/interpreter.h" |
| 13 | 13 |
| 14 namespace v8 { | 14 namespace v8 { |
| 15 namespace internal { | 15 namespace internal { |
| 16 namespace interpreter { | 16 namespace interpreter { |
| 17 | 17 |
| 18 STATIC_CONST_MEMBER_DEFINITION const int Bytecodes::kMaxOperands; |
| 18 | 19 |
| 19 // static | 20 // static |
| 20 const char* Bytecodes::ToString(Bytecode bytecode) { | 21 const char* Bytecodes::ToString(Bytecode bytecode) { |
| 21 switch (bytecode) { | 22 switch (bytecode) { |
| 22 #define CASE(Name, ...) \ | 23 #define CASE(Name, ...) \ |
| 23 case Bytecode::k##Name: \ | 24 case Bytecode::k##Name: \ |
| 24 return #Name; | 25 return #Name; |
| 25 BYTECODE_LIST(CASE) | 26 BYTECODE_LIST(CASE) |
| 26 #undef CASE | 27 #undef CASE |
| 27 } | 28 } |
| (...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 335 #undef CASE | 336 #undef CASE |
| 336 } | 337 } |
| 337 UNREACHABLE(); | 338 UNREACHABLE(); |
| 338 return nullptr; | 339 return nullptr; |
| 339 } | 340 } |
| 340 | 341 |
| 341 // static | 342 // static |
| 342 OperandSize Bytecodes::GetOperandSize(Bytecode bytecode, int i, | 343 OperandSize Bytecodes::GetOperandSize(Bytecode bytecode, int i, |
| 343 OperandScale operand_scale) { | 344 OperandScale operand_scale) { |
| 344 DCHECK_LT(i, NumberOfOperands(bytecode)); | 345 DCHECK_LT(i, NumberOfOperands(bytecode)); |
| 345 return GetOperandSizes(bytecode, operand_scale)[i]; | 346 OperandType operand_type = GetOperandType(bytecode, i); |
| 347 return SizeOfOperand(operand_type, operand_scale); |
| 346 } | 348 } |
| 347 | 349 |
| 348 // static | 350 // static |
| 349 const OperandSize* Bytecodes::GetOperandSizes(Bytecode bytecode, | |
| 350 OperandScale operand_scale) { | |
| 351 DCHECK(bytecode <= Bytecode::kLast); | |
| 352 switch (bytecode) { | |
| 353 #define CASE(Name, ...) \ | |
| 354 case Bytecode::k##Name: \ | |
| 355 return BytecodeTraits<__VA_ARGS__>::GetOperandSizes(operand_scale); | |
| 356 BYTECODE_LIST(CASE) | |
| 357 #undef CASE | |
| 358 } | |
| 359 UNREACHABLE(); | |
| 360 return nullptr; | |
| 361 } | |
| 362 | |
| 363 // static | |
| 364 int Bytecodes::GetRegisterOperandBitmap(Bytecode bytecode) { | |
| 365 DCHECK(bytecode <= Bytecode::kLast); | |
| 366 switch (bytecode) { | |
| 367 #define CASE(Name, ...) \ | |
| 368 case Bytecode::k##Name: \ | |
| 369 typedef BytecodeTraits<__VA_ARGS__> Name##Trait; \ | |
| 370 return Name##Trait::kRegisterOperandBitmap; | |
| 371 BYTECODE_LIST(CASE) | |
| 372 #undef CASE | |
| 373 } | |
| 374 UNREACHABLE(); | |
| 375 return false; | |
| 376 } | |
| 377 | |
| 378 // static | |
| 379 int Bytecodes::GetOperandOffset(Bytecode bytecode, int i, | 351 int Bytecodes::GetOperandOffset(Bytecode bytecode, int i, |
| 380 OperandScale operand_scale) { | 352 OperandScale operand_scale) { |
| 381 DCHECK_LT(i, Bytecodes::NumberOfOperands(bytecode)); | 353 DCHECK_LT(i, Bytecodes::NumberOfOperands(bytecode)); |
| 382 // TODO(oth): restore this to a statically determined constant. | 354 // TODO(oth): restore this to a statically determined constant. |
| 383 int offset = 1; | 355 int offset = 1; |
| 384 for (int operand_index = 0; operand_index < i; ++operand_index) { | 356 for (int operand_index = 0; operand_index < i; ++operand_index) { |
| 385 OperandSize operand_size = | 357 OperandSize operand_size = |
| 386 GetOperandSize(bytecode, operand_index, operand_scale); | 358 GetOperandSize(bytecode, operand_index, operand_scale); |
| 387 offset += static_cast<int>(operand_size); | 359 offset += static_cast<int>(operand_size); |
| 388 } | 360 } |
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 596 case OperandType::kMaybeReg: | 568 case OperandType::kMaybeReg: |
| 597 case OperandType::kReg: | 569 case OperandType::kReg: |
| 598 case OperandType::kRegOut: | 570 case OperandType::kRegOut: |
| 599 return 1; | 571 return 1; |
| 600 case OperandType::kRegPair: | 572 case OperandType::kRegPair: |
| 601 case OperandType::kRegOutPair: | 573 case OperandType::kRegOutPair: |
| 602 return 2; | 574 return 2; |
| 603 case OperandType::kRegOutTriple: | 575 case OperandType::kRegOutTriple: |
| 604 return 3; | 576 return 3; |
| 605 default: | 577 default: |
| 606 UNREACHABLE(); | 578 return 0; |
| 607 } | 579 } |
| 608 return 0; | 580 return 0; |
| 609 } | 581 } |
| 610 | 582 |
| 611 // static | 583 // static |
| 612 bool Bytecodes::IsUnsignedOperandType(OperandType operand_type) { | 584 bool Bytecodes::IsUnsignedOperandType(OperandType operand_type) { |
| 613 switch (operand_type) { | 585 switch (operand_type) { |
| 614 #define CASE(Name, _) \ | 586 #define CASE(Name, _) \ |
| 615 case OperandType::k##Name: \ | 587 case OperandType::k##Name: \ |
| 616 return OperandTraits<OperandType::k##Name>::TypeInfoTraits::kIsUnsigned; | 588 return OperandTraits<OperandType::k##Name>::TypeInfoTraits::kIsUnsigned; |
| (...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 940 } else { | 912 } else { |
| 941 std::ostringstream s; | 913 std::ostringstream s; |
| 942 s << "r" << index(); | 914 s << "r" << index(); |
| 943 return s.str(); | 915 return s.str(); |
| 944 } | 916 } |
| 945 } | 917 } |
| 946 | 918 |
| 947 } // namespace interpreter | 919 } // namespace interpreter |
| 948 } // namespace internal | 920 } // namespace internal |
| 949 } // namespace v8 | 921 } // namespace v8 |
| OLD | NEW |