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