| 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/globals.h" | 10 #include "src/globals.h" |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 146 return size; | 146 return size; |
| 147 } | 147 } |
| 148 | 148 |
| 149 // static | 149 // static |
| 150 size_t Bytecodes::ReturnCount(Bytecode bytecode) { | 150 size_t Bytecodes::ReturnCount(Bytecode bytecode) { |
| 151 return bytecode == Bytecode::kReturn ? 1 : 0; | 151 return bytecode == Bytecode::kReturn ? 1 : 0; |
| 152 } | 152 } |
| 153 | 153 |
| 154 // static | 154 // static |
| 155 int Bytecodes::NumberOfOperands(Bytecode bytecode) { | 155 int Bytecodes::NumberOfOperands(Bytecode bytecode) { |
| 156 DCHECK(bytecode <= Bytecode::kLast); | 156 CHECK(bytecode <= Bytecode::kLast); |
| 157 switch (bytecode) { | 157 switch (bytecode) { |
| 158 #define CASE(Name, ...) \ | 158 #define CASE(Name, ...) \ |
| 159 case Bytecode::k##Name: \ | 159 case Bytecode::k##Name: \ |
| 160 return BytecodeTraits<__VA_ARGS__>::kOperandCount; | 160 return BytecodeTraits<__VA_ARGS__>::kOperandCount; |
| 161 BYTECODE_LIST(CASE) | 161 BYTECODE_LIST(CASE) |
| 162 #undef CASE | 162 #undef CASE |
| 163 } | 163 } |
| 164 UNREACHABLE(); | 164 UNREACHABLE(); |
| 165 return 0; | 165 return 0; |
| 166 } | 166 } |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 303 bool Bytecodes::IsWithoutExternalSideEffects(Bytecode bytecode) { | 303 bool Bytecodes::IsWithoutExternalSideEffects(Bytecode bytecode) { |
| 304 // These bytecodes only manipulate interpreter frame state and will | 304 // These bytecodes only manipulate interpreter frame state and will |
| 305 // never throw. | 305 // never throw. |
| 306 return (IsAccumulatorLoadWithoutEffects(bytecode) || | 306 return (IsAccumulatorLoadWithoutEffects(bytecode) || |
| 307 IsRegisterLoadWithoutEffects(bytecode) || | 307 IsRegisterLoadWithoutEffects(bytecode) || |
| 308 bytecode == Bytecode::kNop || IsJumpWithoutEffects(bytecode)); | 308 bytecode == Bytecode::kNop || IsJumpWithoutEffects(bytecode)); |
| 309 } | 309 } |
| 310 | 310 |
| 311 // static | 311 // static |
| 312 OperandType Bytecodes::GetOperandType(Bytecode bytecode, int i) { | 312 OperandType Bytecodes::GetOperandType(Bytecode bytecode, int i) { |
| 313 DCHECK_LE(bytecode, Bytecode::kLast); | 313 CHECK_LE(bytecode, Bytecode::kLast); |
| 314 DCHECK_LT(i, NumberOfOperands(bytecode)); | 314 CHECK_LT(i, NumberOfOperands(bytecode)); |
| 315 DCHECK_GE(i, 0); | 315 CHECK_GE(i, 0); |
| 316 return GetOperandTypes(bytecode)[i]; | 316 return GetOperandTypes(bytecode)[i]; |
| 317 } | 317 } |
| 318 | 318 |
| 319 // static | 319 // static |
| 320 const OperandType* Bytecodes::GetOperandTypes(Bytecode bytecode) { | 320 const OperandType* Bytecodes::GetOperandTypes(Bytecode bytecode) { |
| 321 DCHECK(bytecode <= Bytecode::kLast); | 321 CHECK_LE(bytecode, Bytecode::kLast); |
| 322 switch (bytecode) { | 322 switch (bytecode) { |
| 323 #define CASE(Name, ...) \ | 323 #define CASE(Name, ...) \ |
| 324 case Bytecode::k##Name: \ | 324 case Bytecode::k##Name: \ |
| 325 return BytecodeTraits<__VA_ARGS__>::GetOperandTypes(); | 325 return BytecodeTraits<__VA_ARGS__>::GetOperandTypes(); |
| 326 BYTECODE_LIST(CASE) | 326 BYTECODE_LIST(CASE) |
| 327 #undef CASE | 327 #undef CASE |
| 328 } | 328 } |
| 329 UNREACHABLE(); | 329 UNREACHABLE(); |
| 330 return nullptr; | 330 return nullptr; |
| 331 } | 331 } |
| 332 | 332 |
| 333 // static | 333 // static |
| 334 const OperandTypeInfo* Bytecodes::GetOperandTypeInfos(Bytecode bytecode) { | 334 const OperandTypeInfo* Bytecodes::GetOperandTypeInfos(Bytecode bytecode) { |
| 335 DCHECK(bytecode <= Bytecode::kLast); | 335 DCHECK(bytecode <= Bytecode::kLast); |
| 336 switch (bytecode) { | 336 switch (bytecode) { |
| 337 #define CASE(Name, ...) \ | 337 #define CASE(Name, ...) \ |
| 338 case Bytecode::k##Name: \ | 338 case Bytecode::k##Name: \ |
| 339 return BytecodeTraits<__VA_ARGS__>::GetOperandTypeInfos(); | 339 return BytecodeTraits<__VA_ARGS__>::GetOperandTypeInfos(); |
| 340 BYTECODE_LIST(CASE) | 340 BYTECODE_LIST(CASE) |
| 341 #undef CASE | 341 #undef CASE |
| 342 } | 342 } |
| 343 UNREACHABLE(); | 343 UNREACHABLE(); |
| 344 return nullptr; | 344 return nullptr; |
| 345 } | 345 } |
| 346 | 346 |
| 347 // static | 347 // static |
| 348 OperandSize Bytecodes::GetOperandSize(Bytecode bytecode, int i, | 348 OperandSize Bytecodes::GetOperandSize(Bytecode bytecode, int i, |
| 349 OperandScale operand_scale) { | 349 OperandScale operand_scale) { |
| 350 DCHECK_LT(i, NumberOfOperands(bytecode)); | 350 CHECK_LT(i, NumberOfOperands(bytecode)); |
| 351 OperandType operand_type = GetOperandType(bytecode, i); | 351 OperandType operand_type = GetOperandType(bytecode, i); |
| 352 return SizeOfOperand(operand_type, operand_scale); | 352 return SizeOfOperand(operand_type, operand_scale); |
| 353 } | 353 } |
| 354 | 354 |
| 355 // static | 355 // static |
| 356 int Bytecodes::GetOperandOffset(Bytecode bytecode, int i, | 356 int Bytecodes::GetOperandOffset(Bytecode bytecode, int i, |
| 357 OperandScale operand_scale) { | 357 OperandScale operand_scale) { |
| 358 DCHECK_LT(i, Bytecodes::NumberOfOperands(bytecode)); | 358 DCHECK_LT(i, Bytecodes::NumberOfOperands(bytecode)); |
| 359 // TODO(oth): restore this to a statically determined constant. | 359 // TODO(oth): restore this to a statically determined constant. |
| 360 int offset = 1; | 360 int offset = 1; |
| 361 for (int operand_index = 0; operand_index < i; ++operand_index) { | 361 for (int operand_index = 0; operand_index < i; ++operand_index) { |
| 362 OperandSize operand_size = | 362 OperandSize operand_size = |
| 363 GetOperandSize(bytecode, operand_index, operand_scale); | 363 GetOperandSize(bytecode, operand_index, operand_scale); |
| 364 offset += static_cast<int>(operand_size); | 364 offset += static_cast<int>(operand_size); |
| 365 } | 365 } |
| 366 return offset; | 366 return offset; |
| 367 } | 367 } |
| 368 | 368 |
| 369 // static | 369 // static |
| 370 OperandSize Bytecodes::SizeOfOperand(OperandType operand_type, | 370 OperandSize Bytecodes::SizeOfOperand(OperandType operand_type, |
| 371 OperandScale operand_scale) { | 371 OperandScale operand_scale) { |
| 372 CHECK_LE(operand_type, OperandType::kLast); |
| 373 CHECK_GE(operand_scale, OperandScale::kSingle); |
| 374 CHECK_LE(operand_scale, OperandScale::kLast); |
| 372 return static_cast<OperandSize>( | 375 return static_cast<OperandSize>( |
| 373 ScaledOperandSize(operand_type, operand_scale)); | 376 ScaledOperandSize(operand_type, operand_scale)); |
| 374 } | 377 } |
| 375 | 378 |
| 376 // static | 379 // static |
| 377 bool Bytecodes::IsConditionalJumpImmediate(Bytecode bytecode) { | 380 bool Bytecodes::IsConditionalJumpImmediate(Bytecode bytecode) { |
| 378 return bytecode == Bytecode::kJumpIfTrue || | 381 return bytecode == Bytecode::kJumpIfTrue || |
| 379 bytecode == Bytecode::kJumpIfFalse || | 382 bytecode == Bytecode::kJumpIfFalse || |
| 380 bytecode == Bytecode::kJumpIfToBooleanTrue || | 383 bytecode == Bytecode::kJumpIfToBooleanTrue || |
| 381 bytecode == Bytecode::kJumpIfToBooleanFalse || | 384 bytecode == Bytecode::kJumpIfToBooleanFalse || |
| (...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 674 return os << Bytecodes::OperandScaleToString(operand_scale); | 677 return os << Bytecodes::OperandScaleToString(operand_scale); |
| 675 } | 678 } |
| 676 | 679 |
| 677 std::ostream& operator<<(std::ostream& os, const OperandType& operand_type) { | 680 std::ostream& operator<<(std::ostream& os, const OperandType& operand_type) { |
| 678 return os << Bytecodes::OperandTypeToString(operand_type); | 681 return os << Bytecodes::OperandTypeToString(operand_type); |
| 679 } | 682 } |
| 680 | 683 |
| 681 } // namespace interpreter | 684 } // namespace interpreter |
| 682 } // namespace internal | 685 } // namespace internal |
| 683 } // namespace v8 | 686 } // namespace v8 |
| OLD | NEW |