1/*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#ifndef ECMASCRIPT_COMPILER_OPCODE_H
17#define ECMASCRIPT_COMPILER_OPCODE_H
18
19#include <string>
20
21#include "ecmascript/compiler/bytecodes.h"
22
23#include "ecmascript/compiler/lcr_opcodes.h"
24#include "ecmascript/compiler/mcr_opcodes.h"
25#include "ecmascript/compiler/hcr_opcodes.h"
26
27namespace panda::ecmascript::kungfu {
28
29#define SHARE_IMMUTABLE_META_DATA_CACHE_LIST(V)                                                 \
30    V(CircuitRoot, CIRCUIT_ROOT, GateFlags::NONE_FLAG, 0, 0, 0)                                 \
31    V(StateEntry, STATE_ENTRY, GateFlags::ROOT, 0, 0, 0)                                        \
32    V(DependEntry, DEPEND_ENTRY, GateFlags::ROOT, 0, 0, 0)                                      \
33    V(OrdinaryBlock, ORDINARY_BLOCK, GateFlags::CONTROL, 1, 0, 0)                               \
34    V(DefaultCase, DEFAULT_CASE, GateFlags::CONTROL, 1, 0, 0)                                   \
35    V(ReturnList, RETURN_LIST, GateFlags::ROOT, 0, 0, 0)                                        \
36    V(ArgList, ARG_LIST, GateFlags::ROOT, 0, 0, 0)                                              \
37    V(Dead, DEAD, GateFlags::NONE_FLAG, 0, 0, 0)                                                \
38    V(Throw, THROW, GateFlags::CONTROL, 1, 1, 1)                                                \
39    V(LoopExit, LOOP_EXIT, GateFlags::CONTROL, 1, 0, 0)                                         \
40    V(LoopExitDepend, LOOP_EXIT_DEPEND, GateFlags::FIXED, 1, 1, 0)                              \
41    V(LoopExitValue, LOOP_EXIT_VALUE, GateFlags::FIXED, 1, 0, 1)                                \
42    V(DependRelay, DEPEND_RELAY, GateFlags::FIXED, 1, 1, 0)                                     \
43    V(IfTrue, IF_TRUE, GateFlags::CONTROL, 1, 0, 0)                                             \
44    V(IfFalse, IF_FALSE, GateFlags::CONTROL, 1, 0, 0)                                           \
45    V(IfSuccess, IF_SUCCESS, GateFlags::CONTROL, 1, 0, 0)                                       \
46    V(IfException, IF_EXCEPTION, GateFlags::CONTROL, 1, 1, 0)                                   \
47    V(GetException, GET_EXCEPTION, GateFlags::NONE_FLAG, 1, 1, 0)                               \
48    V(GetUnsharedConstPool, GET_UNSHARED_CONSTPOOL, GateFlags::NO_WRITE, 0, 0, 1)               \
49    V(GetGlobalEnv, GET_GLOBAL_ENV, GateFlags::NO_WRITE, 0, 1, 0)                               \
50    V(GetSuperConstructor, GET_SUPER_CONSTRUCTOR, GateFlags::NO_WRITE, 1, 1, 1)                 \
51    V(CheckSafePointAndStackOver, CHECK_SAFEPOINT_AND_STACKOVER, GateFlags::NO_WRITE, 1, 1, 0)  \
52    V(DeoptCheck, DEOPT_CHECK, GateFlags::NO_WRITE, 1, 1, 3)                                    \
53    V(LoopBack, LOOP_BACK, GateFlags::CONTROL, 1, 0, 0)                                         \
54    V(Return, RETURN, GateFlags::HAS_ROOT, 1, 1, 1)                                             \
55    V(ReturnVoid, RETURN_VOID, GateFlags::HAS_ROOT, 1, 1, 0)                                    \
56    V(StateSplit, STATE_SPLIT, GateFlags::CHECKABLE, 1, 1, 0)                                   \
57    V(GetEnv, GET_ENV, GateFlags::NO_WRITE, 0, 1, 1)
58
59#define SHARE_GATE_META_DATA_LIST_WITH_VALUE_IN(V)                                       \
60    V(FrameValues, FRAME_VALUES, GateFlags::NONE_FLAG, 0, 0, value)                      \
61    V(ValueSelector, VALUE_SELECTOR, GateFlags::FIXED, 1, 0, value)
62
63#define SHARE_GATE_META_DATA_LIST_WITH_SIZE(V)                                 \
64    V(LoopBegin, LOOP_BEGIN, GateFlags::CONTROL, value, 0, 0)                  \
65    V(Merge, MERGE, GateFlags::CONTROL, value, 0, 0)                           \
66    V(DependSelector, DEPEND_SELECTOR, GateFlags::FIXED, 1, value, 0)          \
67    SHARE_GATE_META_DATA_LIST_WITH_VALUE_IN(V)
68
69#define SHARE_GATE_META_DATA_LIST_WITH_VALUE(V)                                         \
70    V(Constant, CONSTANT, GateFlags::NONE_FLAG, 0, 0, 0)                                \
71    V(FrameArgs, FRAME_ARGS, GateFlags::HAS_FRAME_STATE, 0, 0, 7)                       \
72    V(FrameState, FRAME_STATE, GateFlags::HAS_FRAME_STATE, 0, 0, 2)                     \
73    V(IfBranch, IF_BRANCH, GateFlags::CONTROL, 1, 0, 1)                                 \
74    V(RelocatableData, RELOCATABLE_DATA, GateFlags::NONE_FLAG, 0, 0, 0)                 \
75    V(SwitchBranch, SWITCH_BRANCH, GateFlags::CONTROL, 1, 0, 1)                         \
76    V(SwitchCase, SWITCH_CASE, GateFlags::CONTROL, 1, 0, 0)                             \
77    V(GetSharedConstPool, GET_SHARED_CONSTPOOL, GateFlags::NO_WRITE, 0, 0, 1)
78
79#define SHARE_GATE_OPCODE_LIST(V)     \
80    V(CONSTSTRING)
81
82#define SHARE_GATE_META_DATA_LIST_WITH_ONE_PARAMETER(V)   \
83    V(Arg, ARG, GateFlags::HAS_ROOT, 0, 0, 0)             \
84    V(InitVreg, INITVREG, GateFlags::HAS_ROOT, 0, 0, 0)  \
85    SHARE_GATE_META_DATA_LIST_WITH_VALUE(V)
86
87#define IMMUTABLE_META_DATA_CACHE_LIST(V)                                                       \
88    SHARE_IMMUTABLE_META_DATA_CACHE_LIST(V)                                                     \
89    LCR_IMMUTABLE_META_DATA_CACHE_LIST(V)                                                       \
90    MCR_IMMUTABLE_META_DATA_CACHE_LIST(V)                                                       \
91    HCR_IMMUTABLE_META_DATA_CACHE_LIST(V)
92
93#define GATE_META_DATA_LIST_WITH_VALUE_IN(V)                                             \
94    SHARE_GATE_META_DATA_LIST_WITH_VALUE_IN(V)                                           \
95    HCR_GATE_META_DATA_LIST_WITH_VALUE_IN(V)                                             \
96    MCR_GATE_META_DATA_LIST_WITH_VALUE_IN(V)
97
98#define GATE_META_DATA_LIST_WITH_PC_OFFSET(V)                                  \
99    MCR_GATE_META_DATA_LIST_WITH_PC_OFFSET(V)                                  \
100    HCR_GATE_META_DATA_LIST_WITH_PC_OFFSET(V)
101
102#define GATE_META_DATA_LIST_FOR_CALL(V)                                        \
103    MCR_GATE_META_DATA_LIST_FOR_CALL(V)
104
105#define GATE_META_DATA_LIST_FOR_NEW(V)                                         \
106    HCR_GATE_META_DATA_LIST_FOR_NEW(V)
107
108#define GATE_META_DATA_LIST_WITH_PC_OFFSET_FIXED_VALUE(V)                      \
109    HCR_GATE_META_DATA_LIST_WITH_PC_OFFSET_FIXED_VALUE(V)
110
111#define GATE_META_DATA_LIST_WITH_SIZE(V)                                       \
112    SHARE_GATE_META_DATA_LIST_WITH_SIZE(V)                                     \
113    HCR_GATE_META_DATA_LIST_WITH_SIZE(V)                                       \
114    MCR_GATE_META_DATA_LIST_WITH_SIZE(V)
115
116#define GATE_META_DATA_LIST_WITH_GATE_TYPE(V)                                  \
117    MCR_GATE_META_DATA_LIST_WITH_GATE_TYPE(V)
118
119#define GATE_META_DATA_LIST_WITH_VALUE(V)                                               \
120    SHARE_GATE_META_DATA_LIST_WITH_VALUE(V)                                             \
121    LCR_GATE_META_DATA_LIST_WITH_VALUE(V)                                             \
122    MCR_GATE_META_DATA_LIST_WITH_VALUE(V)                                             \
123    HCR_GATE_META_DATA_LIST_WITH_VALUE(V)
124
125#define GATE_META_DATA_LIST_WITH_ONE_PARAMETER(V)         \
126    SHARE_GATE_META_DATA_LIST_WITH_ONE_PARAMETER(V)       \
127    LCR_GATE_META_DATA_LIST_WITH_ONE_PARAMETER(V)       \
128    MCR_GATE_META_DATA_LIST_WITH_ONE_PARAMETER(V)       \
129    HCR_GATE_META_DATA_LIST_WITH_ONE_PARAMETER(V)
130
131#define GATE_META_DATA_LIST_WITH_BOOL(V)                                           \
132    MCR_GATE_META_DATA_LIST_WITH_BOOL(V)
133
134#define GATE_META_DATA_LIST_WITH_BOOL_VALUE_IN(V)                                  \
135    HCR_GATE_META_DATA_LIST_WITH_BOOL_VALUE_IN(V)
136
137#define GATE_OPCODE_LIST(V)     \
138    SHARE_GATE_OPCODE_LIST(V)   \
139    HCR_GATE_OPCODE_LIST(V)
140
141enum class OpCode : uint16_t {
142    NOP = 0,
143#define DECLARE_GATE_OPCODE(NAME, OP, R, S, D, V) OP,
144    IMMUTABLE_META_DATA_CACHE_LIST(DECLARE_GATE_OPCODE)
145    GATE_META_DATA_LIST_WITH_SIZE(DECLARE_GATE_OPCODE)
146    GATE_META_DATA_LIST_WITH_ONE_PARAMETER(DECLARE_GATE_OPCODE)
147    GATE_META_DATA_LIST_WITH_PC_OFFSET(DECLARE_GATE_OPCODE)
148    GATE_META_DATA_LIST_FOR_CALL(DECLARE_GATE_OPCODE)
149    GATE_META_DATA_LIST_FOR_NEW(DECLARE_GATE_OPCODE)
150    GATE_META_DATA_LIST_WITH_PC_OFFSET_FIXED_VALUE(DECLARE_GATE_OPCODE)
151    GATE_META_DATA_LIST_WITH_BOOL(DECLARE_GATE_OPCODE)
152    GATE_META_DATA_LIST_WITH_BOOL_VALUE_IN(DECLARE_GATE_OPCODE)
153#undef DECLARE_GATE_OPCODE
154#define DECLARE_GATE_OPCODE(NAME) NAME,
155    GATE_OPCODE_LIST(DECLARE_GATE_OPCODE)
156#undef DECLARE_GATE_OPCODE
157};
158
159// Special virtual register in the OSR.
160static constexpr size_t INIT_VRGE_GLUE = -1;
161static constexpr size_t INIT_VRGE_ARGS = -2;
162static constexpr size_t INIT_VRGE_ARGV = -3;
163static constexpr size_t INIT_VRGE_FUNCTION = -4;
164static constexpr size_t INIT_VRGE_NEW_TARGET = -5;
165static constexpr size_t INIT_VRGE_THIS_OBJECT = -6;
166static constexpr size_t INIT_VRGE_NUM_ARGS = -7;
167static constexpr size_t INIT_VRGE_ENV = -8;
168
169}
170
171#endif  // ECMASCRIPT_COMPILER_SHARE_GATE_META_DATA_H
172