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
169109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// static
170109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochbool Bytecodes::IsRegisterInputOperandType(OperandType operand_type) {
171109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  switch (operand_type) {
172109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#define CASE(Name, _)        \
173109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  case OperandType::k##Name: \
174109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    return true;
175109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    REGISTER_INPUT_OPERAND_TYPE_LIST(CASE)
176109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#undef CASE
177109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#define CASE(Name, _)        \
178109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  case OperandType::k##Name: \
179109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    break;
180109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    NON_REGISTER_OPERAND_TYPE_LIST(CASE)
181109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    REGISTER_OUTPUT_OPERAND_TYPE_LIST(CASE)
182109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#undef CASE
183109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  }
184109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  return false;
185109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}
186109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
187109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// static
188109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochbool Bytecodes::IsRegisterOutputOperandType(OperandType operand_type) {
189109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  switch (operand_type) {
190109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#define CASE(Name, _)        \
191109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  case OperandType::k##Name: \
192109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    return true;
193109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    REGISTER_OUTPUT_OPERAND_TYPE_LIST(CASE)
194109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#undef CASE
195109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#define CASE(Name, _)        \
196109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  case OperandType::k##Name: \
197109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    break;
198109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    NON_REGISTER_OPERAND_TYPE_LIST(CASE)
199109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    REGISTER_INPUT_OPERAND_TYPE_LIST(CASE)
200109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#undef CASE
201109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  }
202109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  return false;
203109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}
204109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
2053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// static
206f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochbool Bytecodes::IsStarLookahead(Bytecode bytecode, OperandScale operand_scale) {
207f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  if (operand_scale == OperandScale::kSingle) {
208f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    switch (bytecode) {
209f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      case Bytecode::kLdaZero:
210f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      case Bytecode::kLdaSmi:
211f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      case Bytecode::kLdaNull:
212f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      case Bytecode::kLdaTheHole:
213f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      case Bytecode::kLdaConstant:
214c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      case Bytecode::kLdaUndefined:
215c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      case Bytecode::kLdaGlobal:
216c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      case Bytecode::kLdaNamedProperty:
217c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      case Bytecode::kLdaKeyedProperty:
218c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      case Bytecode::kLdaContextSlot:
219c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      case Bytecode::kLdaCurrentContextSlot:
220f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      case Bytecode::kAdd:
221f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      case Bytecode::kSub:
222f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      case Bytecode::kMul:
223f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      case Bytecode::kAddSmi:
224f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      case Bytecode::kSubSmi:
225f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      case Bytecode::kInc:
226f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      case Bytecode::kDec:
227f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      case Bytecode::kTypeOf:
228f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      case Bytecode::kCall:
229c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      case Bytecode::kCallProperty:
230f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      case Bytecode::kNew:
231f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        return true;
232f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      default:
233f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        return false;
234f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    }
235f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
236f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return false;
237f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
238f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
239f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// static
240f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochbool Bytecodes::IsBytecodeWithScalableOperands(Bytecode bytecode) {
241f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  for (int i = 0; i < NumberOfOperands(bytecode); i++) {
242f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    if (OperandIsScalable(bytecode, i)) return true;
243bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  }
244f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  return false;
245bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
246bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
247bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch// static
2483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochbool Bytecodes::IsUnsignedOperandType(OperandType operand_type) {
2493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  switch (operand_type) {
2503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#define CASE(Name, _)        \
2513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  case OperandType::k##Name: \
25213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    return OperandTraits<OperandType::k##Name>::TypeInfoTraits::kIsUnsigned;
2533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    OPERAND_TYPE_LIST(CASE)
2543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#undef CASE
2553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
2563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  UNREACHABLE();
2573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return false;
2583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
2593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
2603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// static
261f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochOperandSize Bytecodes::SizeOfOperand(OperandType operand_type,
262f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                                     OperandScale operand_scale) {
263f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  DCHECK_LE(operand_type, OperandType::kLast);
264f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  DCHECK_GE(operand_scale, OperandScale::kSingle);
265f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  DCHECK_LE(operand_scale, OperandScale::kLast);
266f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  STATIC_ASSERT(static_cast<int>(OperandScale::kQuadruple) == 4 &&
267f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                OperandScale::kLast == OperandScale::kQuadruple);
268f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  int scale_index = static_cast<int>(operand_scale) >> 1;
269f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  // clang-format off
270f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  static const OperandSize kOperandSizes[][3] = {
271f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#define ENTRY(Name, ...)                                \
272f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  { OperandScaler<OperandType::k##Name,                 \
273f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                 OperandScale::kSingle>::kOperandSize,  \
274f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    OperandScaler<OperandType::k##Name,                 \
275f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                 OperandScale::kDouble>::kOperandSize,  \
276f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    OperandScaler<OperandType::k##Name,                 \
277f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                 OperandScale::kQuadruple>::kOperandSize },
278f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    OPERAND_TYPE_LIST(ENTRY)
279f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#undef ENTRY
280f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  };
281f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  // clang-format on
282f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  return kOperandSizes[static_cast<size_t>(operand_type)][scale_index];
283bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
284bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
2853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// static
2863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochbool Bytecodes::BytecodeHasHandler(Bytecode bytecode,
2873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                                   OperandScale operand_scale) {
2883b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return operand_scale == OperandScale::kSingle ||
2893b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch         Bytecodes::IsBytecodeWithScalableOperands(bytecode);
2903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
2913b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstd::ostream& operator<<(std::ostream& os, const Bytecode& bytecode) {
293014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return os << Bytecodes::ToString(bytecode);
294014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
295014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
296014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace interpreter
297014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
298014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
299