| OLD | NEW |
| (Empty) |
| 1 // Copyright 2016 the V8 project authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #ifndef V8_INTERPRETER_BYTECODE_OPERANDS_H_ | |
| 6 #define V8_INTERPRETER_BYTECODE_OPERANDS_H_ | |
| 7 | |
| 8 #include "src/globals.h" | |
| 9 | |
| 10 namespace v8 { | |
| 11 namespace internal { | |
| 12 namespace interpreter { | |
| 13 | |
| 14 #define INVALID_OPERAND_TYPE_LIST(V) V(None, OperandTypeInfo::kNone) | |
| 15 | |
| 16 #define REGISTER_INPUT_OPERAND_TYPE_LIST(V) \ | |
| 17 V(MaybeReg, OperandTypeInfo::kScalableSignedByte) \ | |
| 18 V(Reg, OperandTypeInfo::kScalableSignedByte) \ | |
| 19 V(RegPair, OperandTypeInfo::kScalableSignedByte) | |
| 20 | |
| 21 #define REGISTER_OUTPUT_OPERAND_TYPE_LIST(V) \ | |
| 22 V(RegOut, OperandTypeInfo::kScalableSignedByte) \ | |
| 23 V(RegOutPair, OperandTypeInfo::kScalableSignedByte) \ | |
| 24 V(RegOutTriple, OperandTypeInfo::kScalableSignedByte) | |
| 25 | |
| 26 #define SCALAR_OPERAND_TYPE_LIST(V) \ | |
| 27 V(Flag8, OperandTypeInfo::kFixedUnsignedByte) \ | |
| 28 V(IntrinsicId, OperandTypeInfo::kFixedUnsignedByte) \ | |
| 29 V(Idx, OperandTypeInfo::kScalableUnsignedByte) \ | |
| 30 V(UImm, OperandTypeInfo::kScalableUnsignedByte) \ | |
| 31 V(Imm, OperandTypeInfo::kScalableSignedByte) \ | |
| 32 V(RegCount, OperandTypeInfo::kScalableUnsignedByte) \ | |
| 33 V(RuntimeId, OperandTypeInfo::kFixedUnsignedShort) | |
| 34 | |
| 35 #define REGISTER_OPERAND_TYPE_LIST(V) \ | |
| 36 REGISTER_INPUT_OPERAND_TYPE_LIST(V) \ | |
| 37 REGISTER_OUTPUT_OPERAND_TYPE_LIST(V) | |
| 38 | |
| 39 #define NON_REGISTER_OPERAND_TYPE_LIST(V) \ | |
| 40 INVALID_OPERAND_TYPE_LIST(V) \ | |
| 41 SCALAR_OPERAND_TYPE_LIST(V) | |
| 42 | |
| 43 // The list of operand types used by bytecodes. | |
| 44 #define OPERAND_TYPE_LIST(V) \ | |
| 45 NON_REGISTER_OPERAND_TYPE_LIST(V) \ | |
| 46 REGISTER_OPERAND_TYPE_LIST(V) | |
| 47 | |
| 48 // Enumeration of scaling factors applicable to scalable operands. Code | |
| 49 // relies on being able to cast values to integer scaling values. | |
| 50 #define OPERAND_SCALE_LIST(V) \ | |
| 51 V(Single, 1) \ | |
| 52 V(Double, 2) \ | |
| 53 V(Quadruple, 4) | |
| 54 | |
| 55 enum class OperandScale : uint8_t { | |
| 56 #define DECLARE_OPERAND_SCALE(Name, Scale) k##Name = Scale, | |
| 57 OPERAND_SCALE_LIST(DECLARE_OPERAND_SCALE) | |
| 58 #undef DECLARE_OPERAND_SCALE | |
| 59 kLast = kQuadruple | |
| 60 }; | |
| 61 | |
| 62 // Enumeration of the size classes of operand types used by | |
| 63 // bytecodes. Code relies on being able to cast values to integer | |
| 64 // types to get the size in bytes. | |
| 65 enum class OperandSize : uint8_t { | |
| 66 kNone = 0, | |
| 67 kByte = 1, | |
| 68 kShort = 2, | |
| 69 kQuad = 4, | |
| 70 kLast = kQuad | |
| 71 }; | |
| 72 | |
| 73 // Primitive operand info used that summarize properties of operands. | |
| 74 // Columns are Name, IsScalable, IsUnsigned, UnscaledSize. | |
| 75 #define OPERAND_TYPE_INFO_LIST(V) \ | |
| 76 V(None, false, false, OperandSize::kNone) \ | |
| 77 V(ScalableSignedByte, true, false, OperandSize::kByte) \ | |
| 78 V(ScalableUnsignedByte, true, true, OperandSize::kByte) \ | |
| 79 V(FixedUnsignedByte, false, true, OperandSize::kByte) \ | |
| 80 V(FixedUnsignedShort, false, true, OperandSize::kShort) | |
| 81 | |
| 82 enum class OperandTypeInfo : uint8_t { | |
| 83 #define DECLARE_OPERAND_TYPE_INFO(Name, ...) k##Name, | |
| 84 OPERAND_TYPE_INFO_LIST(DECLARE_OPERAND_TYPE_INFO) | |
| 85 #undef DECLARE_OPERAND_TYPE_INFO | |
| 86 }; | |
| 87 | |
| 88 // Enumeration of operand types used by bytecodes. | |
| 89 enum class OperandType : uint8_t { | |
| 90 #define DECLARE_OPERAND_TYPE(Name, _) k##Name, | |
| 91 OPERAND_TYPE_LIST(DECLARE_OPERAND_TYPE) | |
| 92 #undef DECLARE_OPERAND_TYPE | |
| 93 #define COUNT_OPERAND_TYPES(x, _) +1 | |
| 94 // The COUNT_OPERAND macro will turn this into kLast = -1 +1 +1... which will | |
| 95 // evaluate to the same value as the last operand. | |
| 96 kLast = -1 OPERAND_TYPE_LIST(COUNT_OPERAND_TYPES) | |
| 97 #undef COUNT_OPERAND_TYPES | |
| 98 }; | |
| 99 | |
| 100 enum class AccumulatorUse : uint8_t { | |
| 101 kNone = 0, | |
| 102 kRead = 1 << 0, | |
| 103 kWrite = 1 << 1, | |
| 104 kReadWrite = kRead | kWrite | |
| 105 }; | |
| 106 | |
| 107 inline AccumulatorUse operator&(AccumulatorUse lhs, AccumulatorUse rhs) { | |
| 108 int result = static_cast<int>(lhs) & static_cast<int>(rhs); | |
| 109 return static_cast<AccumulatorUse>(result); | |
| 110 } | |
| 111 | |
| 112 inline AccumulatorUse operator|(AccumulatorUse lhs, AccumulatorUse rhs) { | |
| 113 int result = static_cast<int>(lhs) | static_cast<int>(rhs); | |
| 114 return static_cast<AccumulatorUse>(result); | |
| 115 } | |
| 116 | |
| 117 std::ostream& operator<<(std::ostream& os, const AccumulatorUse& use); | |
| 118 std::ostream& operator<<(std::ostream& os, const OperandScale& operand_scale); | |
| 119 std::ostream& operator<<(std::ostream& os, const OperandSize& operand_size); | |
| 120 std::ostream& operator<<(std::ostream& os, const OperandType& operand_type); | |
| 121 | |
| 122 } // namespace interpreter | |
| 123 } // namespace internal | |
| 124 } // namespace v8 | |
| 125 | |
| 126 #endif // V8_INTERPRETER_BYTECODE_OPERANDS_H_ | |
| OLD | NEW |