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