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