bytecode-traits.h revision bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8
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#ifndef V8_INTERPRETER_BYTECODE_TRAITS_H_
6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define V8_INTERPRETER_BYTECODE_TRAITS_H_
7014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/interpreter/bytecodes.h"
9014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace v8 {
11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace internal {
12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace interpreter {
13014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochtemplate <OperandTypeInfo>
153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochstruct OperandTypeInfoTraits {
163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  static const bool kIsScalable = false;
173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  static const bool kIsUnsigned = false;
183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  static const OperandSize kUnscaledSize = OperandSize::kNone;
193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch};
20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#define DECLARE_OPERAND_TYPE_INFO(Name, Scalable, Unsigned, BaseSize) \
223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  template <>                                                         \
233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  struct OperandTypeInfoTraits<OperandTypeInfo::k##Name> {            \
243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    static const bool kIsScalable = Scalable;                         \
253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    static const bool kIsUnsigned = Unsigned;                         \
263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    static const OperandSize kUnscaledSize = BaseSize;                \
273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  };
283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochOPERAND_TYPE_INFO_LIST(DECLARE_OPERAND_TYPE_INFO)
293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#undef DECLARE_OPERAND_TYPE_INFO
30014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
31014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <OperandType>
323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochstruct OperandTraits {
333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  typedef OperandTypeInfoTraits<OperandTypeInfo::kNone> TypeInfo;
343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch};
35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#define DECLARE_OPERAND_TYPE_TRAITS(Name, InfoType)   \
373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  template <>                                         \
383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  struct OperandTraits<OperandType::k##Name> {        \
393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    typedef OperandTypeInfoTraits<InfoType> TypeInfo; \
40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  };
413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochOPERAND_TYPE_LIST(DECLARE_OPERAND_TYPE_TRAITS)
423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#undef DECLARE_OPERAND_TYPE_TRAITS
43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
44bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochtemplate <OperandType operand_type, OperandScale operand_scale>
45bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochstruct OperandScaler {
46bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  template <bool, OperandSize, OperandScale>
47bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  struct Helper {
48bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    static const int kSize = 0;
49bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  };
50bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  template <OperandSize size, OperandScale scale>
51bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  struct Helper<false, size, scale> {
52bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    static const int kSize = static_cast<int>(size);
53bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  };
54bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  template <OperandSize size, OperandScale scale>
55bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  struct Helper<true, size, scale> {
56bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    static const int kSize = static_cast<int>(size) * static_cast<int>(scale);
57bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  };
58bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
59bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  static const int kSize =
60bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      Helper<OperandTraits<operand_type>::TypeInfo::kIsScalable,
61bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch             OperandTraits<operand_type>::TypeInfo::kUnscaledSize,
62bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch             operand_scale>::kSize;
63bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  static const OperandSize kOperandSize = static_cast<OperandSize>(kSize);
64bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch};
65bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
66109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochtemplate <OperandType>
67109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochstruct RegisterOperandTraits {
68109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  static const int kIsRegisterOperand = 0;
69109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch};
70109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
71109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#define DECLARE_REGISTER_OPERAND(Name, _)              \
72109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  template <>                                          \
73109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  struct RegisterOperandTraits<OperandType::k##Name> { \
74109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    static const int kIsRegisterOperand = 1;           \
75109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  };
76109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochREGISTER_OPERAND_TYPE_LIST(DECLARE_REGISTER_OPERAND)
77109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#undef DECLARE_REGISTER_OPERAND
78014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
793b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochtemplate <AccumulatorUse, OperandType...>
80014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstruct BytecodeTraits {};
81014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochtemplate <AccumulatorUse accumulator_use, OperandType operand_0,
833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch          OperandType operand_1, OperandType operand_2, OperandType operand_3>
843b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochstruct BytecodeTraits<accumulator_use, operand_0, operand_1, operand_2,
853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                      operand_3> {
86bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  static const OperandType* GetOperandTypes() {
87bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    static const OperandType operand_types[] = {operand_0, operand_1, operand_2,
88bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                                                operand_3, OperandType::kNone};
89bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    return operand_types;
90bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  }
91bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
92bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  static OperandSize GetOperandSize(int i, OperandScale operand_scale) {
93bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    switch (operand_scale) {
94bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#define CASE(Name, _)                                                  \
95bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  case OperandScale::k##Name: {                                        \
96bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    static const OperandSize kOperandSizes[] = {                       \
97bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        OperandScaler<operand_0, OperandScale::k##Name>::kOperandSize, \
98bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        OperandScaler<operand_1, OperandScale::k##Name>::kOperandSize, \
99bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        OperandScaler<operand_2, OperandScale::k##Name>::kOperandSize, \
100bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        OperandScaler<operand_3, OperandScale::k##Name>::kOperandSize, \
101bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    };                                                                 \
102bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    DCHECK_LT(static_cast<size_t>(i), arraysize(kOperandSizes));       \
103bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    return kOperandSizes[i];                                           \
104bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  }
105bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      OPERAND_SCALE_LIST(CASE)
106bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#undef CASE
107bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    }
108bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    UNREACHABLE();
109bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    return OperandSize::kNone;
110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
112109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  template <OperandType ot>
113109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  static inline bool HasAnyOperandsOfType() {
114109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    return operand_0 == ot || operand_1 == ot || operand_2 == ot ||
115109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch           operand_3 == ot;
116109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  }
117109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
1183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  static inline bool IsScalable() {
1193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return (OperandTraits<operand_0>::TypeInfo::kIsScalable |
1203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch            OperandTraits<operand_1>::TypeInfo::kIsScalable |
1213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch            OperandTraits<operand_2>::TypeInfo::kIsScalable |
1223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch            OperandTraits<operand_3>::TypeInfo::kIsScalable);
1233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
1243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
1253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  static const AccumulatorUse kAccumulatorUse = accumulator_use;
126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const int kOperandCount = 4;
127109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  static const int kRegisterOperandCount =
128109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      RegisterOperandTraits<operand_0>::kIsRegisterOperand +
129109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      RegisterOperandTraits<operand_1>::kIsRegisterOperand +
130109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      RegisterOperandTraits<operand_2>::kIsRegisterOperand +
131109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      RegisterOperandTraits<operand_3>::kIsRegisterOperand;
132109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  static const int kRegisterOperandBitmap =
133109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      RegisterOperandTraits<operand_0>::kIsRegisterOperand +
134109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      (RegisterOperandTraits<operand_1>::kIsRegisterOperand << 1) +
135109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      (RegisterOperandTraits<operand_2>::kIsRegisterOperand << 2) +
136109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      (RegisterOperandTraits<operand_3>::kIsRegisterOperand << 3);
137014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
138014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochtemplate <AccumulatorUse accumulator_use, OperandType operand_0,
1403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch          OperandType operand_1, OperandType operand_2>
1413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochstruct BytecodeTraits<accumulator_use, operand_0, operand_1, operand_2> {
142bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  static const OperandType* GetOperandTypes() {
143bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    static const OperandType operand_types[] = {operand_0, operand_1, operand_2,
144bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                                                OperandType::kNone};
145bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    return operand_types;
146bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  }
147bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
148bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  static OperandSize GetOperandSize(int i, OperandScale operand_scale) {
149bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    switch (operand_scale) {
150bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#define CASE(Name, _)                                                  \
151bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  case OperandScale::k##Name: {                                        \
152bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    static const OperandSize kOperandSizes[] = {                       \
153bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        OperandScaler<operand_0, OperandScale::k##Name>::kOperandSize, \
154bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        OperandScaler<operand_1, OperandScale::k##Name>::kOperandSize, \
155bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        OperandScaler<operand_2, OperandScale::k##Name>::kOperandSize, \
156bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    };                                                                 \
157bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    DCHECK_LT(static_cast<size_t>(i), arraysize(kOperandSizes));       \
158bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    return kOperandSizes[i];                                           \
159bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  }
160bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      OPERAND_SCALE_LIST(CASE)
161bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#undef CASE
162bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    }
163bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    UNREACHABLE();
164bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    return OperandSize::kNone;
165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
166014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
167109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  template <OperandType ot>
168109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  static inline bool HasAnyOperandsOfType() {
169109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    return operand_0 == ot || operand_1 == ot || operand_2 == ot;
170109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  }
171109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
1723b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  static inline bool IsScalable() {
1733b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return (OperandTraits<operand_0>::TypeInfo::kIsScalable |
1743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch            OperandTraits<operand_1>::TypeInfo::kIsScalable |
1753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch            OperandTraits<operand_2>::TypeInfo::kIsScalable);
1763b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
1773b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
1783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  static const AccumulatorUse kAccumulatorUse = accumulator_use;
179014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const int kOperandCount = 3;
180109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  static const int kRegisterOperandCount =
181109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      RegisterOperandTraits<operand_0>::kIsRegisterOperand +
182109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      RegisterOperandTraits<operand_1>::kIsRegisterOperand +
183109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      RegisterOperandTraits<operand_2>::kIsRegisterOperand;
184109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  static const int kRegisterOperandBitmap =
185109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      RegisterOperandTraits<operand_0>::kIsRegisterOperand +
186109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      (RegisterOperandTraits<operand_1>::kIsRegisterOperand << 1) +
187109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      (RegisterOperandTraits<operand_2>::kIsRegisterOperand << 2);
188014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochtemplate <AccumulatorUse accumulator_use, OperandType operand_0,
1913b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch          OperandType operand_1>
1923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochstruct BytecodeTraits<accumulator_use, operand_0, operand_1> {
193bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  static const OperandType* GetOperandTypes() {
194bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    static const OperandType operand_types[] = {operand_0, operand_1,
195bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                                                OperandType::kNone};
196bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    return operand_types;
197bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  }
198bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
199bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  static OperandSize GetOperandSize(int i, OperandScale operand_scale) {
200bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    switch (operand_scale) {
201bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#define CASE(Name, _)                                                  \
202bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  case OperandScale::k##Name: {                                        \
203bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    static const OperandSize kOperandSizes[] = {                       \
204bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        OperandScaler<operand_0, OperandScale::k##Name>::kOperandSize, \
205bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        OperandScaler<operand_1, OperandScale::k##Name>::kOperandSize, \
206bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    };                                                                 \
207bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    DCHECK_LT(static_cast<size_t>(i), arraysize(kOperandSizes));       \
208bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    return kOperandSizes[i];                                           \
209bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  }
210bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      OPERAND_SCALE_LIST(CASE)
211bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#undef CASE
212bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    }
213bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    UNREACHABLE();
214bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    return OperandSize::kNone;
215014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
216014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
217109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  template <OperandType ot>
218109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  static inline bool HasAnyOperandsOfType() {
219109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    return operand_0 == ot || operand_1 == ot;
220109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  }
221109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
2223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  static inline bool IsScalable() {
2233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return (OperandTraits<operand_0>::TypeInfo::kIsScalable |
2243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch            OperandTraits<operand_1>::TypeInfo::kIsScalable);
2253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
2263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
2273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  static const AccumulatorUse kAccumulatorUse = accumulator_use;
228014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const int kOperandCount = 2;
229109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  static const int kRegisterOperandCount =
230109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      RegisterOperandTraits<operand_0>::kIsRegisterOperand +
231109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      RegisterOperandTraits<operand_1>::kIsRegisterOperand;
232109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  static const int kRegisterOperandBitmap =
233109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      RegisterOperandTraits<operand_0>::kIsRegisterOperand +
234109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      (RegisterOperandTraits<operand_1>::kIsRegisterOperand << 1);
235014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
236014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochtemplate <AccumulatorUse accumulator_use, OperandType operand_0>
2383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochstruct BytecodeTraits<accumulator_use, operand_0> {
239bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  static const OperandType* GetOperandTypes() {
240bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    static const OperandType operand_types[] = {operand_0, OperandType::kNone};
241bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    return operand_types;
242bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  }
243bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
244bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  static OperandSize GetOperandSize(int i, OperandScale operand_scale) {
245bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    switch (operand_scale) {
246bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#define CASE(Name, _)                                                  \
247bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  case OperandScale::k##Name: {                                        \
248bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    static const OperandSize kOperandSizes[] = {                       \
249bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        OperandScaler<operand_0, OperandScale::k##Name>::kOperandSize, \
250bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    };                                                                 \
251bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    DCHECK_LT(static_cast<size_t>(i), arraysize(kOperandSizes));       \
252bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    return kOperandSizes[i];                                           \
253bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  }
254bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      OPERAND_SCALE_LIST(CASE)
255bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#undef CASE
256bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    }
257bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    UNREACHABLE();
258bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    return OperandSize::kNone;
259014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
260014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
261109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  template <OperandType ot>
262109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  static inline bool HasAnyOperandsOfType() {
263109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    return operand_0 == ot;
264109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  }
265109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
2663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  static inline bool IsScalable() {
2673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return OperandTraits<operand_0>::TypeInfo::kIsScalable;
2683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
2693b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
2703b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  static const AccumulatorUse kAccumulatorUse = accumulator_use;
271014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const int kOperandCount = 1;
272109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  static const int kRegisterOperandCount =
273109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      RegisterOperandTraits<operand_0>::kIsRegisterOperand;
274109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  static const int kRegisterOperandBitmap =
275109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      RegisterOperandTraits<operand_0>::kIsRegisterOperand;
276014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
277014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochtemplate <AccumulatorUse accumulator_use>
2793b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochstruct BytecodeTraits<accumulator_use> {
280bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  static const OperandType* GetOperandTypes() {
281bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    static const OperandType operand_types[] = {OperandType::kNone};
282bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    return operand_types;
283bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  }
284bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
285bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  static OperandSize GetOperandSize(int i, OperandScale operand_scale) {
286014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    UNREACHABLE();
287bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    return OperandSize::kNone;
288014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
289014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
290109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  template <OperandType ot>
291109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  static inline bool HasAnyOperandsOfType() {
292109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    return false;
293109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  }
294109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
2953b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  static inline bool IsScalable() { return false; }
2963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
2973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  static const AccumulatorUse kAccumulatorUse = accumulator_use;
298014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const int kOperandCount = 0;
299109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  static const int kRegisterOperandCount = 0;
300109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  static const int kRegisterOperandBitmap = 0;
301014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
302014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochstatic OperandSize ScaledOperandSize(OperandType operand_type,
3043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                                     OperandScale operand_scale) {
305bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  STATIC_ASSERT(static_cast<int>(OperandScale::kQuadruple) == 4 &&
306bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                OperandScale::kLast == OperandScale::kQuadruple);
307bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  int index = static_cast<int>(operand_scale) >> 1;
3083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  switch (operand_type) {
309bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#define CASE(Name, TypeInfo)                                    \
310bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  case OperandType::k##Name: {                                  \
311bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    static const OperandSize kOperandSizes[] = {                \
312bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        OperandScaler<OperandType::k##Name,                     \
313bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                      OperandScale::kSingle>::kOperandSize,     \
314bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        OperandScaler<OperandType::k##Name,                     \
315bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                      OperandScale::kDouble>::kOperandSize,     \
316bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        OperandScaler<OperandType::k##Name,                     \
317bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                      OperandScale::kQuadruple>::kOperandSize}; \
318bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    return kOperandSizes[index];                                \
3193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
3203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    OPERAND_TYPE_LIST(CASE)
3213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#undef CASE
3223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
3233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  UNREACHABLE();
3243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return OperandSize::kNone;
3253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
3263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
327014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace interpreter
328014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
329014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
330014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
331014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif  // V8_INTERPRETER_BYTECODE_TRAITS_H_
332