| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef V8_INTERPRETER_BYTECODE_TRAITS_H_ | 5 #ifndef V8_INTERPRETER_BYTECODE_TRAITS_H_ |
| 6 #define V8_INTERPRETER_BYTECODE_TRAITS_H_ | 6 #define V8_INTERPRETER_BYTECODE_TRAITS_H_ |
| 7 | 7 |
| 8 #include "src/interpreter/bytecodes.h" | 8 #include "src/interpreter/bytecodes.h" |
| 9 | 9 |
| 10 namespace v8 { | 10 namespace v8 { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 struct OperandTypeInfoTraits<OperandTypeInfo::k##Name> { \ | 23 struct OperandTypeInfoTraits<OperandTypeInfo::k##Name> { \ |
| 24 static const bool kIsScalable = Scalable; \ | 24 static const bool kIsScalable = Scalable; \ |
| 25 static const bool kIsUnsigned = Unsigned; \ | 25 static const bool kIsUnsigned = Unsigned; \ |
| 26 static const OperandSize kUnscaledSize = BaseSize; \ | 26 static const OperandSize kUnscaledSize = BaseSize; \ |
| 27 }; | 27 }; |
| 28 OPERAND_TYPE_INFO_LIST(DECLARE_OPERAND_TYPE_INFO) | 28 OPERAND_TYPE_INFO_LIST(DECLARE_OPERAND_TYPE_INFO) |
| 29 #undef DECLARE_OPERAND_TYPE_INFO | 29 #undef DECLARE_OPERAND_TYPE_INFO |
| 30 | 30 |
| 31 template <OperandType> | 31 template <OperandType> |
| 32 struct OperandTraits { | 32 struct OperandTraits { |
| 33 typedef OperandTypeInfoTraits<OperandTypeInfo::kNone> TypeInfo; | 33 typedef OperandTypeInfoTraits<OperandTypeInfo::kNone> TypeInfoTraits; |
| 34 static const OperandTypeInfo kOperandTypeInfo = OperandTypeInfo::kNone; |
| 34 }; | 35 }; |
| 35 | 36 |
| 36 #define DECLARE_OPERAND_TYPE_TRAITS(Name, InfoType) \ | 37 #define DECLARE_OPERAND_TYPE_TRAITS(Name, InfoType) \ |
| 37 template <> \ | 38 template <> \ |
| 38 struct OperandTraits<OperandType::k##Name> { \ | 39 struct OperandTraits<OperandType::k##Name> { \ |
| 39 typedef OperandTypeInfoTraits<InfoType> TypeInfo; \ | 40 typedef OperandTypeInfoTraits<InfoType> TypeInfoTraits; \ |
| 41 static const OperandTypeInfo kOperandTypeInfo = InfoType; \ |
| 40 }; | 42 }; |
| 41 OPERAND_TYPE_LIST(DECLARE_OPERAND_TYPE_TRAITS) | 43 OPERAND_TYPE_LIST(DECLARE_OPERAND_TYPE_TRAITS) |
| 42 #undef DECLARE_OPERAND_TYPE_TRAITS | 44 #undef DECLARE_OPERAND_TYPE_TRAITS |
| 43 | 45 |
| 44 template <OperandType operand_type, OperandScale operand_scale> | 46 template <OperandType operand_type, OperandScale operand_scale> |
| 45 struct OperandScaler { | 47 struct OperandScaler { |
| 46 template <bool, OperandSize, OperandScale> | 48 template <bool, OperandSize, OperandScale> |
| 47 struct Helper { | 49 struct Helper { |
| 48 static const int kSize = 0; | 50 static const int kSize = 0; |
| 49 }; | 51 }; |
| 50 template <OperandSize size, OperandScale scale> | 52 template <OperandSize size, OperandScale scale> |
| 51 struct Helper<false, size, scale> { | 53 struct Helper<false, size, scale> { |
| 52 static const int kSize = static_cast<int>(size); | 54 static const int kSize = static_cast<int>(size); |
| 53 }; | 55 }; |
| 54 template <OperandSize size, OperandScale scale> | 56 template <OperandSize size, OperandScale scale> |
| 55 struct Helper<true, size, scale> { | 57 struct Helper<true, size, scale> { |
| 56 static const int kSize = static_cast<int>(size) * static_cast<int>(scale); | 58 static const int kSize = static_cast<int>(size) * static_cast<int>(scale); |
| 57 }; | 59 }; |
| 58 | 60 |
| 59 static const int kSize = | 61 static const int kSize = |
| 60 Helper<OperandTraits<operand_type>::TypeInfo::kIsScalable, | 62 Helper<OperandTraits<operand_type>::TypeInfoTraits::kIsScalable, |
| 61 OperandTraits<operand_type>::TypeInfo::kUnscaledSize, | 63 OperandTraits<operand_type>::TypeInfoTraits::kUnscaledSize, |
| 62 operand_scale>::kSize; | 64 operand_scale>::kSize; |
| 63 static const OperandSize kOperandSize = static_cast<OperandSize>(kSize); | 65 static const OperandSize kOperandSize = static_cast<OperandSize>(kSize); |
| 64 }; | 66 }; |
| 65 | 67 |
| 66 template <OperandType> | 68 template <OperandType> |
| 67 struct RegisterOperandTraits { | 69 struct RegisterOperandTraits { |
| 68 static const int kIsRegisterOperand = 0; | 70 static const int kIsRegisterOperand = 0; |
| 69 }; | 71 }; |
| 70 | 72 |
| 71 #define DECLARE_REGISTER_OPERAND(Name, _) \ | 73 #define DECLARE_REGISTER_OPERAND(Name, _) \ |
| (...skipping 10 matching lines...) Expand all Loading... |
| 82 template <AccumulatorUse accumulator_use, OperandType operand_0, | 84 template <AccumulatorUse accumulator_use, OperandType operand_0, |
| 83 OperandType operand_1, OperandType operand_2, OperandType operand_3> | 85 OperandType operand_1, OperandType operand_2, OperandType operand_3> |
| 84 struct BytecodeTraits<accumulator_use, operand_0, operand_1, operand_2, | 86 struct BytecodeTraits<accumulator_use, operand_0, operand_1, operand_2, |
| 85 operand_3> { | 87 operand_3> { |
| 86 static const OperandType* GetOperandTypes() { | 88 static const OperandType* GetOperandTypes() { |
| 87 static const OperandType operand_types[] = {operand_0, operand_1, operand_2, | 89 static const OperandType operand_types[] = {operand_0, operand_1, operand_2, |
| 88 operand_3, OperandType::kNone}; | 90 operand_3, OperandType::kNone}; |
| 89 return operand_types; | 91 return operand_types; |
| 90 } | 92 } |
| 91 | 93 |
| 94 static const OperandTypeInfo* GetOperandTypeInfos() { |
| 95 static const OperandTypeInfo operand_type_infos[] = { |
| 96 OperandTraits<operand_0>::kOperandTypeInfo, |
| 97 OperandTraits<operand_1>::kOperandTypeInfo, |
| 98 OperandTraits<operand_2>::kOperandTypeInfo, |
| 99 OperandTraits<operand_3>::kOperandTypeInfo, OperandTypeInfo::kNone}; |
| 100 return operand_type_infos; |
| 101 } |
| 102 |
| 92 static const OperandSize* GetOperandSizes(OperandScale operand_scale) { | 103 static const OperandSize* GetOperandSizes(OperandScale operand_scale) { |
| 93 switch (operand_scale) { | 104 switch (operand_scale) { |
| 94 #define CASE(Name, _) \ | 105 #define CASE(Name, _) \ |
| 95 case OperandScale::k##Name: { \ | 106 case OperandScale::k##Name: { \ |
| 96 static const OperandSize kOperandSizes[] = { \ | 107 static const OperandSize kOperandSizes[] = { \ |
| 97 OperandScaler<operand_0, OperandScale::k##Name>::kOperandSize, \ | 108 OperandScaler<operand_0, OperandScale::k##Name>::kOperandSize, \ |
| 98 OperandScaler<operand_1, OperandScale::k##Name>::kOperandSize, \ | 109 OperandScaler<operand_1, OperandScale::k##Name>::kOperandSize, \ |
| 99 OperandScaler<operand_2, OperandScale::k##Name>::kOperandSize, \ | 110 OperandScaler<operand_2, OperandScale::k##Name>::kOperandSize, \ |
| 100 OperandScaler<operand_3, OperandScale::k##Name>::kOperandSize, \ | 111 OperandScaler<operand_3, OperandScale::k##Name>::kOperandSize, \ |
| 101 }; \ | 112 }; \ |
| 102 return kOperandSizes; \ | 113 return kOperandSizes; \ |
| 103 } | 114 } |
| 104 OPERAND_SCALE_LIST(CASE) | 115 OPERAND_SCALE_LIST(CASE) |
| 105 #undef CASE | 116 #undef CASE |
| 106 } | 117 } |
| 107 UNREACHABLE(); | 118 UNREACHABLE(); |
| 108 return nullptr; | 119 return nullptr; |
| 109 } | 120 } |
| 110 | 121 |
| 111 template <OperandType ot> | 122 template <OperandType ot> |
| 112 static inline bool HasAnyOperandsOfType() { | 123 static inline bool HasAnyOperandsOfType() { |
| 113 return operand_0 == ot || operand_1 == ot || operand_2 == ot || | 124 return operand_0 == ot || operand_1 == ot || operand_2 == ot || |
| 114 operand_3 == ot; | 125 operand_3 == ot; |
| 115 } | 126 } |
| 116 | 127 |
| 117 static inline bool IsScalable() { | 128 static inline bool IsScalable() { |
| 118 return (OperandTraits<operand_0>::TypeInfo::kIsScalable | | 129 return (OperandTraits<operand_0>::TypeInfoTraits::kIsScalable | |
| 119 OperandTraits<operand_1>::TypeInfo::kIsScalable | | 130 OperandTraits<operand_1>::TypeInfoTraits::kIsScalable | |
| 120 OperandTraits<operand_2>::TypeInfo::kIsScalable | | 131 OperandTraits<operand_2>::TypeInfoTraits::kIsScalable | |
| 121 OperandTraits<operand_3>::TypeInfo::kIsScalable); | 132 OperandTraits<operand_3>::TypeInfoTraits::kIsScalable); |
| 122 } | 133 } |
| 123 | 134 |
| 124 static const AccumulatorUse kAccumulatorUse = accumulator_use; | 135 static const AccumulatorUse kAccumulatorUse = accumulator_use; |
| 125 static const int kOperandCount = 4; | 136 static const int kOperandCount = 4; |
| 126 static const int kRegisterOperandCount = | 137 static const int kRegisterOperandCount = |
| 127 RegisterOperandTraits<operand_0>::kIsRegisterOperand + | 138 RegisterOperandTraits<operand_0>::kIsRegisterOperand + |
| 128 RegisterOperandTraits<operand_1>::kIsRegisterOperand + | 139 RegisterOperandTraits<operand_1>::kIsRegisterOperand + |
| 129 RegisterOperandTraits<operand_2>::kIsRegisterOperand + | 140 RegisterOperandTraits<operand_2>::kIsRegisterOperand + |
| 130 RegisterOperandTraits<operand_3>::kIsRegisterOperand; | 141 RegisterOperandTraits<operand_3>::kIsRegisterOperand; |
| 131 static const int kRegisterOperandBitmap = | 142 static const int kRegisterOperandBitmap = |
| 132 RegisterOperandTraits<operand_0>::kIsRegisterOperand + | 143 RegisterOperandTraits<operand_0>::kIsRegisterOperand + |
| 133 (RegisterOperandTraits<operand_1>::kIsRegisterOperand << 1) + | 144 (RegisterOperandTraits<operand_1>::kIsRegisterOperand << 1) + |
| 134 (RegisterOperandTraits<operand_2>::kIsRegisterOperand << 2) + | 145 (RegisterOperandTraits<operand_2>::kIsRegisterOperand << 2) + |
| 135 (RegisterOperandTraits<operand_3>::kIsRegisterOperand << 3); | 146 (RegisterOperandTraits<operand_3>::kIsRegisterOperand << 3); |
| 136 }; | 147 }; |
| 137 | 148 |
| 138 template <AccumulatorUse accumulator_use, OperandType operand_0, | 149 template <AccumulatorUse accumulator_use, OperandType operand_0, |
| 139 OperandType operand_1, OperandType operand_2> | 150 OperandType operand_1, OperandType operand_2> |
| 140 struct BytecodeTraits<accumulator_use, operand_0, operand_1, operand_2> { | 151 struct BytecodeTraits<accumulator_use, operand_0, operand_1, operand_2> { |
| 141 static const OperandType* GetOperandTypes() { | 152 static const OperandType* GetOperandTypes() { |
| 142 static const OperandType operand_types[] = {operand_0, operand_1, operand_2, | 153 static const OperandType operand_types[] = {operand_0, operand_1, operand_2, |
| 143 OperandType::kNone}; | 154 OperandType::kNone}; |
| 144 return operand_types; | 155 return operand_types; |
| 145 } | 156 } |
| 146 | 157 |
| 158 static const OperandTypeInfo* GetOperandTypeInfos() { |
| 159 static const OperandTypeInfo operand_type_infos[] = { |
| 160 OperandTraits<operand_0>::kOperandTypeInfo, |
| 161 OperandTraits<operand_1>::kOperandTypeInfo, |
| 162 OperandTraits<operand_2>::kOperandTypeInfo, OperandTypeInfo::kNone}; |
| 163 return operand_type_infos; |
| 164 } |
| 165 |
| 147 static const OperandSize* GetOperandSizes(OperandScale operand_scale) { | 166 static const OperandSize* GetOperandSizes(OperandScale operand_scale) { |
| 148 switch (operand_scale) { | 167 switch (operand_scale) { |
| 149 #define CASE(Name, _) \ | 168 #define CASE(Name, _) \ |
| 150 case OperandScale::k##Name: { \ | 169 case OperandScale::k##Name: { \ |
| 151 static const OperandSize kOperandSizes[] = { \ | 170 static const OperandSize kOperandSizes[] = { \ |
| 152 OperandScaler<operand_0, OperandScale::k##Name>::kOperandSize, \ | 171 OperandScaler<operand_0, OperandScale::k##Name>::kOperandSize, \ |
| 153 OperandScaler<operand_1, OperandScale::k##Name>::kOperandSize, \ | 172 OperandScaler<operand_1, OperandScale::k##Name>::kOperandSize, \ |
| 154 OperandScaler<operand_2, OperandScale::k##Name>::kOperandSize, \ | 173 OperandScaler<operand_2, OperandScale::k##Name>::kOperandSize, \ |
| 155 }; \ | 174 }; \ |
| 156 return kOperandSizes; \ | 175 return kOperandSizes; \ |
| 157 } | 176 } |
| 158 OPERAND_SCALE_LIST(CASE) | 177 OPERAND_SCALE_LIST(CASE) |
| 159 #undef CASE | 178 #undef CASE |
| 160 } | 179 } |
| 161 UNREACHABLE(); | 180 UNREACHABLE(); |
| 162 return nullptr; | 181 return nullptr; |
| 163 } | 182 } |
| 164 | 183 |
| 165 template <OperandType ot> | 184 template <OperandType ot> |
| 166 static inline bool HasAnyOperandsOfType() { | 185 static inline bool HasAnyOperandsOfType() { |
| 167 return operand_0 == ot || operand_1 == ot || operand_2 == ot; | 186 return operand_0 == ot || operand_1 == ot || operand_2 == ot; |
| 168 } | 187 } |
| 169 | 188 |
| 170 static inline bool IsScalable() { | 189 static inline bool IsScalable() { |
| 171 return (OperandTraits<operand_0>::TypeInfo::kIsScalable | | 190 return (OperandTraits<operand_0>::TypeInfoTraits::kIsScalable | |
| 172 OperandTraits<operand_1>::TypeInfo::kIsScalable | | 191 OperandTraits<operand_1>::TypeInfoTraits::kIsScalable | |
| 173 OperandTraits<operand_2>::TypeInfo::kIsScalable); | 192 OperandTraits<operand_2>::TypeInfoTraits::kIsScalable); |
| 174 } | 193 } |
| 175 | 194 |
| 176 static const AccumulatorUse kAccumulatorUse = accumulator_use; | 195 static const AccumulatorUse kAccumulatorUse = accumulator_use; |
| 177 static const int kOperandCount = 3; | 196 static const int kOperandCount = 3; |
| 178 static const int kRegisterOperandCount = | 197 static const int kRegisterOperandCount = |
| 179 RegisterOperandTraits<operand_0>::kIsRegisterOperand + | 198 RegisterOperandTraits<operand_0>::kIsRegisterOperand + |
| 180 RegisterOperandTraits<operand_1>::kIsRegisterOperand + | 199 RegisterOperandTraits<operand_1>::kIsRegisterOperand + |
| 181 RegisterOperandTraits<operand_2>::kIsRegisterOperand; | 200 RegisterOperandTraits<operand_2>::kIsRegisterOperand; |
| 182 static const int kRegisterOperandBitmap = | 201 static const int kRegisterOperandBitmap = |
| 183 RegisterOperandTraits<operand_0>::kIsRegisterOperand + | 202 RegisterOperandTraits<operand_0>::kIsRegisterOperand + |
| 184 (RegisterOperandTraits<operand_1>::kIsRegisterOperand << 1) + | 203 (RegisterOperandTraits<operand_1>::kIsRegisterOperand << 1) + |
| 185 (RegisterOperandTraits<operand_2>::kIsRegisterOperand << 2); | 204 (RegisterOperandTraits<operand_2>::kIsRegisterOperand << 2); |
| 186 }; | 205 }; |
| 187 | 206 |
| 188 template <AccumulatorUse accumulator_use, OperandType operand_0, | 207 template <AccumulatorUse accumulator_use, OperandType operand_0, |
| 189 OperandType operand_1> | 208 OperandType operand_1> |
| 190 struct BytecodeTraits<accumulator_use, operand_0, operand_1> { | 209 struct BytecodeTraits<accumulator_use, operand_0, operand_1> { |
| 191 static const OperandType* GetOperandTypes() { | 210 static const OperandType* GetOperandTypes() { |
| 192 static const OperandType operand_types[] = {operand_0, operand_1, | 211 static const OperandType operand_types[] = {operand_0, operand_1, |
| 193 OperandType::kNone}; | 212 OperandType::kNone}; |
| 194 return operand_types; | 213 return operand_types; |
| 195 } | 214 } |
| 196 | 215 |
| 216 static const OperandTypeInfo* GetOperandTypeInfos() { |
| 217 static const OperandTypeInfo operand_type_infos[] = { |
| 218 OperandTraits<operand_0>::kOperandTypeInfo, |
| 219 OperandTraits<operand_1>::kOperandTypeInfo, OperandTypeInfo::kNone}; |
| 220 return operand_type_infos; |
| 221 } |
| 222 |
| 197 static const OperandSize* GetOperandSizes(OperandScale operand_scale) { | 223 static const OperandSize* GetOperandSizes(OperandScale operand_scale) { |
| 198 switch (operand_scale) { | 224 switch (operand_scale) { |
| 199 #define CASE(Name, _) \ | 225 #define CASE(Name, _) \ |
| 200 case OperandScale::k##Name: { \ | 226 case OperandScale::k##Name: { \ |
| 201 static const OperandSize kOperandSizes[] = { \ | 227 static const OperandSize kOperandSizes[] = { \ |
| 202 OperandScaler<operand_0, OperandScale::k##Name>::kOperandSize, \ | 228 OperandScaler<operand_0, OperandScale::k##Name>::kOperandSize, \ |
| 203 OperandScaler<operand_1, OperandScale::k##Name>::kOperandSize, \ | 229 OperandScaler<operand_1, OperandScale::k##Name>::kOperandSize, \ |
| 204 }; \ | 230 }; \ |
| 205 return kOperandSizes; \ | 231 return kOperandSizes; \ |
| 206 } | 232 } |
| 207 OPERAND_SCALE_LIST(CASE) | 233 OPERAND_SCALE_LIST(CASE) |
| 208 #undef CASE | 234 #undef CASE |
| 209 } | 235 } |
| 210 UNREACHABLE(); | 236 UNREACHABLE(); |
| 211 return nullptr; | 237 return nullptr; |
| 212 } | 238 } |
| 213 | 239 |
| 214 template <OperandType ot> | 240 template <OperandType ot> |
| 215 static inline bool HasAnyOperandsOfType() { | 241 static inline bool HasAnyOperandsOfType() { |
| 216 return operand_0 == ot || operand_1 == ot; | 242 return operand_0 == ot || operand_1 == ot; |
| 217 } | 243 } |
| 218 | 244 |
| 219 static inline bool IsScalable() { | 245 static inline bool IsScalable() { |
| 220 return (OperandTraits<operand_0>::TypeInfo::kIsScalable | | 246 return (OperandTraits<operand_0>::TypeInfoTraits::kIsScalable | |
| 221 OperandTraits<operand_1>::TypeInfo::kIsScalable); | 247 OperandTraits<operand_1>::TypeInfoTraits::kIsScalable); |
| 222 } | 248 } |
| 223 | 249 |
| 224 static const AccumulatorUse kAccumulatorUse = accumulator_use; | 250 static const AccumulatorUse kAccumulatorUse = accumulator_use; |
| 225 static const int kOperandCount = 2; | 251 static const int kOperandCount = 2; |
| 226 static const int kRegisterOperandCount = | 252 static const int kRegisterOperandCount = |
| 227 RegisterOperandTraits<operand_0>::kIsRegisterOperand + | 253 RegisterOperandTraits<operand_0>::kIsRegisterOperand + |
| 228 RegisterOperandTraits<operand_1>::kIsRegisterOperand; | 254 RegisterOperandTraits<operand_1>::kIsRegisterOperand; |
| 229 static const int kRegisterOperandBitmap = | 255 static const int kRegisterOperandBitmap = |
| 230 RegisterOperandTraits<operand_0>::kIsRegisterOperand + | 256 RegisterOperandTraits<operand_0>::kIsRegisterOperand + |
| 231 (RegisterOperandTraits<operand_1>::kIsRegisterOperand << 1); | 257 (RegisterOperandTraits<operand_1>::kIsRegisterOperand << 1); |
| 232 }; | 258 }; |
| 233 | 259 |
| 234 template <AccumulatorUse accumulator_use, OperandType operand_0> | 260 template <AccumulatorUse accumulator_use, OperandType operand_0> |
| 235 struct BytecodeTraits<accumulator_use, operand_0> { | 261 struct BytecodeTraits<accumulator_use, operand_0> { |
| 236 static const OperandType* GetOperandTypes() { | 262 static const OperandType* GetOperandTypes() { |
| 237 static const OperandType operand_types[] = {operand_0, OperandType::kNone}; | 263 static const OperandType operand_types[] = {operand_0, OperandType::kNone}; |
| 238 return operand_types; | 264 return operand_types; |
| 239 } | 265 } |
| 240 | 266 |
| 267 static const OperandTypeInfo* GetOperandTypeInfos() { |
| 268 static const OperandTypeInfo operand_type_infos[] = { |
| 269 OperandTraits<operand_0>::kOperandTypeInfo, OperandTypeInfo::kNone}; |
| 270 return operand_type_infos; |
| 271 } |
| 272 |
| 241 static const OperandSize* GetOperandSizes(OperandScale operand_scale) { | 273 static const OperandSize* GetOperandSizes(OperandScale operand_scale) { |
| 242 switch (operand_scale) { | 274 switch (operand_scale) { |
| 243 #define CASE(Name, _) \ | 275 #define CASE(Name, _) \ |
| 244 case OperandScale::k##Name: { \ | 276 case OperandScale::k##Name: { \ |
| 245 static const OperandSize kOperandSizes[] = { \ | 277 static const OperandSize kOperandSizes[] = { \ |
| 246 OperandScaler<operand_0, OperandScale::k##Name>::kOperandSize, \ | 278 OperandScaler<operand_0, OperandScale::k##Name>::kOperandSize, \ |
| 247 }; \ | 279 }; \ |
| 248 return kOperandSizes; \ | 280 return kOperandSizes; \ |
| 249 } | 281 } |
| 250 OPERAND_SCALE_LIST(CASE) | 282 OPERAND_SCALE_LIST(CASE) |
| 251 #undef CASE | 283 #undef CASE |
| 252 } | 284 } |
| 253 UNREACHABLE(); | 285 UNREACHABLE(); |
| 254 return nullptr; | 286 return nullptr; |
| 255 } | 287 } |
| 256 | 288 |
| 257 template <OperandType ot> | 289 template <OperandType ot> |
| 258 static inline bool HasAnyOperandsOfType() { | 290 static inline bool HasAnyOperandsOfType() { |
| 259 return operand_0 == ot; | 291 return operand_0 == ot; |
| 260 } | 292 } |
| 261 | 293 |
| 262 static inline bool IsScalable() { | 294 static inline bool IsScalable() { |
| 263 return OperandTraits<operand_0>::TypeInfo::kIsScalable; | 295 return OperandTraits<operand_0>::TypeInfoTraits::kIsScalable; |
| 264 } | 296 } |
| 265 | 297 |
| 266 static const AccumulatorUse kAccumulatorUse = accumulator_use; | 298 static const AccumulatorUse kAccumulatorUse = accumulator_use; |
| 267 static const int kOperandCount = 1; | 299 static const int kOperandCount = 1; |
| 268 static const int kRegisterOperandCount = | 300 static const int kRegisterOperandCount = |
| 269 RegisterOperandTraits<operand_0>::kIsRegisterOperand; | 301 RegisterOperandTraits<operand_0>::kIsRegisterOperand; |
| 270 static const int kRegisterOperandBitmap = | 302 static const int kRegisterOperandBitmap = |
| 271 RegisterOperandTraits<operand_0>::kIsRegisterOperand; | 303 RegisterOperandTraits<operand_0>::kIsRegisterOperand; |
| 272 }; | 304 }; |
| 273 | 305 |
| 274 template <AccumulatorUse accumulator_use> | 306 template <AccumulatorUse accumulator_use> |
| 275 struct BytecodeTraits<accumulator_use> { | 307 struct BytecodeTraits<accumulator_use> { |
| 276 static const OperandType* GetOperandTypes() { | 308 static const OperandType* GetOperandTypes() { |
| 277 static const OperandType operand_types[] = {OperandType::kNone}; | 309 static const OperandType operand_types[] = {OperandType::kNone}; |
| 278 return operand_types; | 310 return operand_types; |
| 279 } | 311 } |
| 280 | 312 |
| 313 static const OperandTypeInfo* GetOperandTypeInfos() { |
| 314 static const OperandTypeInfo operand_type_infos[] = { |
| 315 OperandTypeInfo::kNone}; |
| 316 return operand_type_infos; |
| 317 } |
| 318 |
| 281 static const OperandSize* GetOperandSizes(OperandScale operand_scale) { | 319 static const OperandSize* GetOperandSizes(OperandScale operand_scale) { |
| 282 return nullptr; | 320 return nullptr; |
| 283 } | 321 } |
| 284 | 322 |
| 285 template <OperandType ot> | 323 template <OperandType ot> |
| 286 static inline bool HasAnyOperandsOfType() { | 324 static inline bool HasAnyOperandsOfType() { |
| 287 return false; | 325 return false; |
| 288 } | 326 } |
| 289 | 327 |
| 290 static inline bool IsScalable() { return false; } | 328 static inline bool IsScalable() { return false; } |
| (...skipping 26 matching lines...) Expand all Loading... |
| 317 } | 355 } |
| 318 UNREACHABLE(); | 356 UNREACHABLE(); |
| 319 return OperandSize::kNone; | 357 return OperandSize::kNone; |
| 320 } | 358 } |
| 321 | 359 |
| 322 } // namespace interpreter | 360 } // namespace interpreter |
| 323 } // namespace internal | 361 } // namespace internal |
| 324 } // namespace v8 | 362 } // namespace v8 |
| 325 | 363 |
| 326 #endif // V8_INTERPRETER_BYTECODE_TRAITS_H_ | 364 #endif // V8_INTERPRETER_BYTECODE_TRAITS_H_ |
| OLD | NEW |