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
8f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/interpreter/bytecode-operands.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 {
3313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  typedef OperandTypeInfoTraits<OperandTypeInfo::kNone> TypeInfoTraits;
3413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  static const OperandTypeInfo kOperandTypeInfo = OperandTypeInfo::kNone;
353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch};
36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#define DECLARE_OPERAND_TYPE_TRAITS(Name, InfoType)           \
3813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  template <>                                                 \
3913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  struct OperandTraits<OperandType::k##Name> {                \
4013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    typedef OperandTypeInfoTraits<InfoType> TypeInfoTraits;   \
4113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    static const OperandTypeInfo kOperandTypeInfo = InfoType; \
42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  };
433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochOPERAND_TYPE_LIST(DECLARE_OPERAND_TYPE_TRAITS)
443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#undef DECLARE_OPERAND_TYPE_TRAITS
45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
46bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochtemplate <OperandType operand_type, OperandScale operand_scale>
47bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochstruct OperandScaler {
48bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  template <bool, OperandSize, OperandScale>
49bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  struct Helper {
50bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    static const int kSize = 0;
51bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  };
52bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  template <OperandSize size, OperandScale scale>
53bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  struct Helper<false, size, scale> {
54bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    static const int kSize = static_cast<int>(size);
55bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  };
56bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  template <OperandSize size, OperandScale scale>
57bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  struct Helper<true, size, scale> {
58bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    static const int kSize = static_cast<int>(size) * static_cast<int>(scale);
59bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  };
60bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
61bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  static const int kSize =
6213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      Helper<OperandTraits<operand_type>::TypeInfoTraits::kIsScalable,
6313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch             OperandTraits<operand_type>::TypeInfoTraits::kUnscaledSize,
64bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch             operand_scale>::kSize;
65bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  static const OperandSize kOperandSize = static_cast<OperandSize>(kSize);
66bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch};
67bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
68f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochtemplate <int... values>
69f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochstruct SumHelper;
70f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochtemplate <int value>
71f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochstruct SumHelper<value> {
72f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  static const int kValue = value;
73109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch};
74f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochtemplate <int value, int... values>
75f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochstruct SumHelper<value, values...> {
76f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  static const int kValue = value + SumHelper<values...>::kValue;
77014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
78014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
79f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochtemplate <AccumulatorUse accumulator_use, OperandType... operands>
80f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochstruct BytecodeTraits {
81f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  static const OperandType kOperandTypes[];
82f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  static const OperandTypeInfo kOperandTypeInfos[];
83f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  static const OperandSize kSingleScaleOperandSizes[];
84f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  static const OperandSize kDoubleScaleOperandSizes[];
85f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  static const OperandSize kQuadrupleScaleOperandSizes[];
86f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  static const int kSingleScaleSize = SumHelper<
87f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      1, OperandScaler<operands, OperandScale::kSingle>::kSize...>::kValue;
88f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  static const int kDoubleScaleSize = SumHelper<
89f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      1, OperandScaler<operands, OperandScale::kDouble>::kSize...>::kValue;
90f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  static const int kQuadrupleScaleSize = SumHelper<
91f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      1, OperandScaler<operands, OperandScale::kQuadruple>::kSize...>::kValue;
923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  static const AccumulatorUse kAccumulatorUse = accumulator_use;
93f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  static const int kOperandCount = sizeof...(operands);
94014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
95014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
96f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochtemplate <AccumulatorUse accumulator_use, OperandType... operands>
97f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochSTATIC_CONST_MEMBER_DEFINITION const OperandType
98f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    BytecodeTraits<accumulator_use, operands...>::kOperandTypes[] = {
99f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        operands...};
100f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochtemplate <AccumulatorUse accumulator_use, OperandType... operands>
101f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochSTATIC_CONST_MEMBER_DEFINITION const OperandTypeInfo
102f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    BytecodeTraits<accumulator_use, operands...>::kOperandTypeInfos[] = {
103f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        OperandTraits<operands>::kOperandTypeInfo...};
104f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochtemplate <AccumulatorUse accumulator_use, OperandType... operands>
105f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochSTATIC_CONST_MEMBER_DEFINITION const OperandSize
106f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    BytecodeTraits<accumulator_use, operands...>::kSingleScaleOperandSizes[] = {
107f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        OperandScaler<operands, OperandScale::kSingle>::kOperandSize...};
108f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochtemplate <AccumulatorUse accumulator_use, OperandType... operands>
109f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochSTATIC_CONST_MEMBER_DEFINITION const OperandSize
110f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    BytecodeTraits<accumulator_use, operands...>::kDoubleScaleOperandSizes[] = {
111f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        OperandScaler<operands, OperandScale::kDouble>::kOperandSize...};
112f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochtemplate <AccumulatorUse accumulator_use, OperandType... operands>
113f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochSTATIC_CONST_MEMBER_DEFINITION const OperandSize BytecodeTraits<
114f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    accumulator_use, operands...>::kQuadrupleScaleOperandSizes[] = {
115f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    OperandScaler<operands, OperandScale::kQuadruple>::kOperandSize...};
116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochtemplate <AccumulatorUse accumulator_use>
1183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochstruct BytecodeTraits<accumulator_use> {
119f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  static const OperandType kOperandTypes[];
120f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  static const OperandTypeInfo kOperandTypeInfos[];
121f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  static const OperandSize kSingleScaleOperandSizes[];
122f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  static const OperandSize kDoubleScaleOperandSizes[];
123f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  static const OperandSize kQuadrupleScaleOperandSizes[];
124f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  static const int kSingleScaleSize = 1;
125f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  static const int kDoubleScaleSize = 1;
126f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  static const int kQuadrupleScaleSize = 1;
1273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  static const AccumulatorUse kAccumulatorUse = accumulator_use;
128014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const int kOperandCount = 0;
129014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
131f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochtemplate <AccumulatorUse accumulator_use>
132f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochSTATIC_CONST_MEMBER_DEFINITION const OperandType
133f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    BytecodeTraits<accumulator_use>::kOperandTypes[] = {OperandType::kNone};
134f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochtemplate <AccumulatorUse accumulator_use>
135f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochSTATIC_CONST_MEMBER_DEFINITION const OperandTypeInfo
136f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    BytecodeTraits<accumulator_use>::kOperandTypeInfos[] = {
137f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        OperandTypeInfo::kNone};
138f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochtemplate <AccumulatorUse accumulator_use>
139f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochSTATIC_CONST_MEMBER_DEFINITION const OperandSize
140f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    BytecodeTraits<accumulator_use>::kSingleScaleOperandSizes[] = {
141f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        OperandSize::kNone};
142f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochtemplate <AccumulatorUse accumulator_use>
143f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochSTATIC_CONST_MEMBER_DEFINITION const OperandSize
144f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    BytecodeTraits<accumulator_use>::kDoubleScaleOperandSizes[] = {
145f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        OperandSize::kNone};
146f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochtemplate <AccumulatorUse accumulator_use>
147f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochSTATIC_CONST_MEMBER_DEFINITION const OperandSize
148f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    BytecodeTraits<accumulator_use>::kQuadrupleScaleOperandSizes[] = {
149f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        OperandSize::kNone};
1503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
151014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace interpreter
152014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
153014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
154014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
155014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif  // V8_INTERPRETER_BYTECODE_TRAITS_H_
156