1014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Copyright 2015 the V8 project authors. All rights reserved. 2014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// found in the LICENSE file. 4014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/interpreter/bytecodes.h" 6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 73b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include <iomanip> 83b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#include "src/base/bits.h" 10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/interpreter/bytecode-traits.h" 11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace v8 { 13014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace internal { 14014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace interpreter { 15014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 16f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// clang-format off 17f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochconst OperandType* const Bytecodes::kOperandTypes[] = { 18f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#define ENTRY(Name, ...) BytecodeTraits<__VA_ARGS__>::kOperandTypes, 19f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch BYTECODE_LIST(ENTRY) 20f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#undef ENTRY 21f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}; 22f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 23f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochconst OperandTypeInfo* const Bytecodes::kOperandTypeInfos[] = { 24f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#define ENTRY(Name, ...) BytecodeTraits<__VA_ARGS__>::kOperandTypeInfos, 25f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch BYTECODE_LIST(ENTRY) 26f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#undef ENTRY 27f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}; 28f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 29f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochconst int Bytecodes::kOperandCount[] = { 30f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#define ENTRY(Name, ...) BytecodeTraits<__VA_ARGS__>::kOperandCount, 31f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch BYTECODE_LIST(ENTRY) 32f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#undef ENTRY 33f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}; 34f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 35f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochconst AccumulatorUse Bytecodes::kAccumulatorUse[] = { 36f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#define ENTRY(Name, ...) BytecodeTraits<__VA_ARGS__>::kAccumulatorUse, 37f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch BYTECODE_LIST(ENTRY) 38f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#undef ENTRY 39f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}; 40f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 41f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochconst int Bytecodes::kBytecodeSizes[][3] = { 42f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#define ENTRY(Name, ...) \ 43f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch { BytecodeTraits<__VA_ARGS__>::kSingleScaleSize, \ 44f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch BytecodeTraits<__VA_ARGS__>::kDoubleScaleSize, \ 45f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch BytecodeTraits<__VA_ARGS__>::kQuadrupleScaleSize }, 46f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch BYTECODE_LIST(ENTRY) 47f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#undef ENTRY 48f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}; 49f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 50f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochconst OperandSize* const Bytecodes::kOperandSizes[][3] = { 51f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#define ENTRY(Name, ...) \ 52f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch { BytecodeTraits<__VA_ARGS__>::kSingleScaleOperandSizes, \ 53f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch BytecodeTraits<__VA_ARGS__>::kDoubleScaleOperandSizes, \ 54f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch BytecodeTraits<__VA_ARGS__>::kQuadrupleScaleOperandSizes }, 55f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch BYTECODE_LIST(ENTRY) 56f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#undef ENTRY 57f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}; 58f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// clang-format on 59014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 60014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// static 61014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst char* Bytecodes::ToString(Bytecode bytecode) { 62014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch switch (bytecode) { 63014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define CASE(Name, ...) \ 64014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case Bytecode::k##Name: \ 65014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return #Name; 66014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BYTECODE_LIST(CASE) 67014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef CASE 68014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 69014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UNREACHABLE(); 70014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return ""; 71014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 72014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 733b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// static 743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochstd::string Bytecodes::ToString(Bytecode bytecode, OperandScale operand_scale) { 753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static const char kSeparator = '.'; 763b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 773b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch std::string value(ToString(bytecode)); 783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (operand_scale > OperandScale::kSingle) { 793b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Bytecode prefix_bytecode = OperandScaleToPrefixBytecode(operand_scale); 803b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch std::string suffix = ToString(prefix_bytecode); 813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return value.append(1, kSeparator).append(suffix); 823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } else { 833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return value; 843b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// static 88109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochBytecode Bytecodes::GetDebugBreak(Bytecode bytecode) { 893b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK(!IsDebugBreak(bytecode)); 903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (bytecode == Bytecode::kWide) { 913b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return Bytecode::kDebugBreakWide; 923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 933b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (bytecode == Bytecode::kExtraWide) { 943b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return Bytecode::kDebugBreakExtraWide; 953b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch int bytecode_size = Size(bytecode, OperandScale::kSingle); 97f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#define RETURN_IF_DEBUG_BREAK_SIZE_MATCHES(Name) \ 983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (bytecode_size == Size(Bytecode::k##Name, OperandScale::kSingle)) { \ 993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return Bytecode::k##Name; \ 100109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch } 1013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DEBUG_BREAK_PLAIN_BYTECODE_LIST(RETURN_IF_DEBUG_BREAK_SIZE_MATCHES) 1023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#undef RETURN_IF_DEBUG_BREAK_SIZE_MATCHES 103109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch UNREACHABLE(); 1043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return Bytecode::kIllegal; 105109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch} 106109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 107109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// static 1083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochint Bytecodes::GetOperandOffset(Bytecode bytecode, int i, 1093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch OperandScale operand_scale) { 110bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch DCHECK_LT(i, Bytecodes::NumberOfOperands(bytecode)); 1113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // TODO(oth): restore this to a statically determined constant. 1123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch int offset = 1; 1133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch for (int operand_index = 0; operand_index < i; ++operand_index) { 1143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch OperandSize operand_size = 1153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch GetOperandSize(bytecode, operand_index, operand_scale); 1163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch offset += static_cast<int>(operand_size); 117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return offset; 119014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// static 122bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochBytecode Bytecodes::GetJumpWithoutToBoolean(Bytecode bytecode) { 123bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch switch (bytecode) { 124bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch case Bytecode::kJumpIfToBooleanTrue: 125bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch return Bytecode::kJumpIfTrue; 126bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch case Bytecode::kJumpIfToBooleanFalse: 127bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch return Bytecode::kJumpIfFalse; 128bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch case Bytecode::kJumpIfToBooleanTrueConstant: 129bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch return Bytecode::kJumpIfTrueConstant; 130bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch case Bytecode::kJumpIfToBooleanFalseConstant: 131bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch return Bytecode::kJumpIfFalseConstant; 132bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch default: 133bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch break; 134bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch } 135bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch UNREACHABLE(); 136bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch return Bytecode::kIllegal; 137bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch} 138014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 139014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// static 140109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochbool Bytecodes::IsDebugBreak(Bytecode bytecode) { 141109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch switch (bytecode) { 142109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#define CASE(Name, ...) case Bytecode::k##Name: 143109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch DEBUG_BREAK_BYTECODE_LIST(CASE); 144109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#undef CASE 145109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return true; 146109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch default: 147109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch break; 148109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch } 149109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return false; 150109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch} 151109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 152109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// static 153109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochbool Bytecodes::IsRegisterOperandType(OperandType operand_type) { 154109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch switch (operand_type) { 155109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#define CASE(Name, _) \ 156109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch case OperandType::k##Name: \ 157109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return true; 158109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch REGISTER_OPERAND_TYPE_LIST(CASE) 159109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#undef CASE 160109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#define CASE(Name, _) \ 161109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch case OperandType::k##Name: \ 162109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch break; 163109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch NON_REGISTER_OPERAND_TYPE_LIST(CASE) 164109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#undef CASE 165109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch } 166109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return false; 167109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch} 168109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 16962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool Bytecodes::MakesCallAlongCriticalPath(Bytecode bytecode) { 17062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (IsCallOrConstruct(bytecode) || IsCallRuntime(bytecode)) return true; 17162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch switch (bytecode) { 17262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch case Bytecode::kCreateWithContext: 17362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch case Bytecode::kCreateBlockContext: 17462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch case Bytecode::kCreateCatchContext: 17562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch case Bytecode::kCreateRegExpLiteral: 17662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return true; 17762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch default: 17862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return false; 17962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 18062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 18162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 182109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// static 183109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochbool Bytecodes::IsRegisterInputOperandType(OperandType operand_type) { 184109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch switch (operand_type) { 185109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#define CASE(Name, _) \ 186109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch case OperandType::k##Name: \ 187109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return true; 188109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch REGISTER_INPUT_OPERAND_TYPE_LIST(CASE) 189109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#undef CASE 190109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#define CASE(Name, _) \ 191109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch case OperandType::k##Name: \ 192109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch break; 193109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch NON_REGISTER_OPERAND_TYPE_LIST(CASE) 194109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch REGISTER_OUTPUT_OPERAND_TYPE_LIST(CASE) 195109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#undef CASE 196109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch } 197109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return false; 198109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch} 199109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 200109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// static 201109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochbool Bytecodes::IsRegisterOutputOperandType(OperandType operand_type) { 202109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch switch (operand_type) { 203109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#define CASE(Name, _) \ 204109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch case OperandType::k##Name: \ 205109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return true; 206109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch REGISTER_OUTPUT_OPERAND_TYPE_LIST(CASE) 207109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#undef CASE 208109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#define CASE(Name, _) \ 209109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch case OperandType::k##Name: \ 210109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch break; 211109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch NON_REGISTER_OPERAND_TYPE_LIST(CASE) 212109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch REGISTER_INPUT_OPERAND_TYPE_LIST(CASE) 213109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#undef CASE 214109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch } 215109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return false; 216109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch} 217109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 2183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// static 219f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochbool Bytecodes::IsStarLookahead(Bytecode bytecode, OperandScale operand_scale) { 220f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch if (operand_scale == OperandScale::kSingle) { 221f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch switch (bytecode) { 222f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case Bytecode::kLdaZero: 223f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case Bytecode::kLdaSmi: 224f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case Bytecode::kLdaNull: 225f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case Bytecode::kLdaTheHole: 226f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case Bytecode::kLdaConstant: 227c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case Bytecode::kLdaUndefined: 228c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case Bytecode::kLdaGlobal: 229c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case Bytecode::kLdaNamedProperty: 230c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case Bytecode::kLdaKeyedProperty: 231c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case Bytecode::kLdaContextSlot: 232c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case Bytecode::kLdaCurrentContextSlot: 233f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case Bytecode::kAdd: 234f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case Bytecode::kSub: 235f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case Bytecode::kMul: 236f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case Bytecode::kAddSmi: 237f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case Bytecode::kSubSmi: 238f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case Bytecode::kInc: 239f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case Bytecode::kDec: 240f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case Bytecode::kTypeOf: 241f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case Bytecode::kCall: 242c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case Bytecode::kCallProperty: 24362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch case Bytecode::kConstruct: 24462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch case Bytecode::kConstructWithSpread: 245f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return true; 246f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch default: 247f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return false; 248f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 249f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 250f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return false; 251f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 252f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 253f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// static 254f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochbool Bytecodes::IsBytecodeWithScalableOperands(Bytecode bytecode) { 255f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch for (int i = 0; i < NumberOfOperands(bytecode); i++) { 256f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch if (OperandIsScalable(bytecode, i)) return true; 257bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch } 258f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return false; 259bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch} 260bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 261bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch// static 2623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochbool Bytecodes::IsUnsignedOperandType(OperandType operand_type) { 2633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch switch (operand_type) { 2643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#define CASE(Name, _) \ 2653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch case OperandType::k##Name: \ 26613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return OperandTraits<OperandType::k##Name>::TypeInfoTraits::kIsUnsigned; 2673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch OPERAND_TYPE_LIST(CASE) 2683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#undef CASE 2693b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 2703b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch UNREACHABLE(); 2713b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return false; 2723b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 2733b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 2743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// static 275f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochOperandSize Bytecodes::SizeOfOperand(OperandType operand_type, 276f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch OperandScale operand_scale) { 277f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DCHECK_LE(operand_type, OperandType::kLast); 278f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DCHECK_GE(operand_scale, OperandScale::kSingle); 279f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DCHECK_LE(operand_scale, OperandScale::kLast); 280f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch STATIC_ASSERT(static_cast<int>(OperandScale::kQuadruple) == 4 && 281f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch OperandScale::kLast == OperandScale::kQuadruple); 282f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch int scale_index = static_cast<int>(operand_scale) >> 1; 283f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // clang-format off 284f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const OperandSize kOperandSizes[][3] = { 285f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#define ENTRY(Name, ...) \ 286f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch { OperandScaler<OperandType::k##Name, \ 287f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch OperandScale::kSingle>::kOperandSize, \ 288f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch OperandScaler<OperandType::k##Name, \ 289f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch OperandScale::kDouble>::kOperandSize, \ 290f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch OperandScaler<OperandType::k##Name, \ 291f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch OperandScale::kQuadruple>::kOperandSize }, 292f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch OPERAND_TYPE_LIST(ENTRY) 293f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#undef ENTRY 294f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch }; 295f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // clang-format on 296f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return kOperandSizes[static_cast<size_t>(operand_type)][scale_index]; 297bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch} 298bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 2993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// static 3003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochbool Bytecodes::BytecodeHasHandler(Bytecode bytecode, 3013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch OperandScale operand_scale) { 3023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return operand_scale == OperandScale::kSingle || 3033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Bytecodes::IsBytecodeWithScalableOperands(bytecode); 3043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 3053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 306014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstd::ostream& operator<<(std::ostream& os, const Bytecode& bytecode) { 307014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return os << Bytecodes::ToString(bytecode); 308014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 309014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 310014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace interpreter 311014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace internal 312014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace v8 313