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