• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
27 namespace 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     V(GetGlobalEnvByFunc, GET_GLOBAL_ENV_BY_FUNC, GateFlags::NO_WRITE, 0, 1, 1)                 \
59     V(GetGlobalEnvByLexicalEnv, GET_GLOBAL_ENV_BY_LEXICAL_ENV, GateFlags::NO_WRITE, 0, 1, 1)
60 
61 #define SHARE_INTRINSIC_IMMUTABLE_META_DATA_CACHE_LIST(V)                                                       \
62     V(TaggedIsHeapObjectIntrinsic, TAGGED_IS_HEAPOBJECT_INTRINSIC, GateFlags::NONE_FLAG, 0, 0, 2)               \
63     V(IsStableElementsIntrinsic, IS_STABLE_ELEMENTS_INTRINSIC, GateFlags::NONE_FLAG, 0, 1, 3)                   \
64     V(HasPendingExceptionIntrinsic, HAS_PENDING_EXCEPTION_INTRINSIC, GateFlags::NONE_FLAG, 0, 1, 3)             \
65     V(CheckTaggedObjectIsString, CHECK_OBJECT_IS_STRING, GateFlags::NONE_FLAG, 0, 1, 5)                         \
66     V(IsJsCOWArrayIntrinsic, IS_JS_COW_ARRAY_INTRINSIC, GateFlags::NONE_FLAG, 0, 1, 6)                          \
67 
68 #define SHARE_GATE_META_DATA_LIST_WITH_VALUE_IN(V)                                       \
69     V(FrameValues, FRAME_VALUES, GateFlags::NONE_FLAG, 0, 0, value)                      \
70     V(ValueSelector, VALUE_SELECTOR, GateFlags::FIXED, 1, 0, value)
71 
72 #define SHARE_GATE_META_DATA_LIST_WITH_SIZE(V)                                 \
73     V(LoopBegin, LOOP_BEGIN, GateFlags::CONTROL, value, 0, 0)                  \
74     V(Merge, MERGE, GateFlags::CONTROL, value, 0, 0)                           \
75     V(DependSelector, DEPEND_SELECTOR, GateFlags::FIXED, 1, value, 0)          \
76     SHARE_GATE_META_DATA_LIST_WITH_VALUE_IN(V)
77 
78 #define SHARE_GATE_META_DATA_LIST_WITH_VALUE(V)                                         \
79     V(Constant, CONSTANT, GateFlags::NONE_FLAG, 0, 0, 0)                                \
80     V(HeapConstant, HEAP_CONSTANT, GateFlags::NONE_FLAG, 0, 0, 0)                       \
81     V(FrameArgs, FRAME_ARGS, GateFlags::HAS_FRAME_STATE, 0, 0, 7)                       \
82     V(FrameState, FRAME_STATE, GateFlags::HAS_FRAME_STATE, 0, 0, 2)                     \
83     V(IfBranch, IF_BRANCH, GateFlags::CONTROL, 1, 0, 1)                                 \
84     V(RelocatableData, RELOCATABLE_DATA, GateFlags::NONE_FLAG, 0, 0, 0)                 \
85     V(SwitchBranch, SWITCH_BRANCH, GateFlags::CONTROL, 1, 0, 1)                         \
86     V(SwitchCase, SWITCH_CASE, GateFlags::CONTROL, 1, 0, 0)                             \
87     V(GetSharedConstPool, GET_SHARED_CONSTPOOL, GateFlags::NO_WRITE, 0, 0, 1)
88 
89 #define SHARE_GATE_OPCODE_LIST(V)     \
90     V(CONSTSTRING)
91 
92 #define SHARE_GATE_META_DATA_LIST_WITH_ONE_PARAMETER(V)   \
93     V(Arg, ARG, GateFlags::HAS_ROOT, 0, 0, 0)             \
94     V(InitVreg, INITVREG, GateFlags::HAS_ROOT, 0, 0, 0)  \
95     SHARE_GATE_META_DATA_LIST_WITH_VALUE(V)
96 
97 #define IMMUTABLE_META_DATA_CACHE_LIST(V)                                                       \
98     SHARE_IMMUTABLE_META_DATA_CACHE_LIST(V)                                                     \
99     LCR_IMMUTABLE_META_DATA_CACHE_LIST(V)                                                       \
100     MCR_IMMUTABLE_META_DATA_CACHE_LIST(V)                                                       \
101     HCR_IMMUTABLE_META_DATA_CACHE_LIST(V)                                                       \
102     SHARE_INTRINSIC_IMMUTABLE_META_DATA_CACHE_LIST(V)
103 
104 #define GATE_META_DATA_LIST_WITH_VALUE_IN(V)                                             \
105     SHARE_GATE_META_DATA_LIST_WITH_VALUE_IN(V)                                           \
106     HCR_GATE_META_DATA_LIST_WITH_VALUE_IN(V)                                             \
107     MCR_GATE_META_DATA_LIST_WITH_VALUE_IN(V)
108 
109 #define GATE_META_DATA_LIST_WITH_PC_OFFSET(V)                                  \
110     MCR_GATE_META_DATA_LIST_WITH_PC_OFFSET(V)                                  \
111     HCR_GATE_META_DATA_LIST_WITH_PC_OFFSET(V)
112 
113 #define GATE_META_DATA_LIST_FOR_CALL(V)                                        \
114     MCR_GATE_META_DATA_LIST_FOR_CALL(V)
115 
116 #define GATE_META_DATA_LIST_FOR_NEW(V)                                         \
117     HCR_GATE_META_DATA_LIST_FOR_NEW(V)
118 
119 #define GATE_META_DATA_LIST_WITH_PC_OFFSET_FIXED_VALUE(V)                      \
120     HCR_GATE_META_DATA_LIST_WITH_PC_OFFSET_FIXED_VALUE(V)
121 
122 #define GATE_META_DATA_LIST_WITH_SIZE(V)                                       \
123     SHARE_GATE_META_DATA_LIST_WITH_SIZE(V)                                     \
124     HCR_GATE_META_DATA_LIST_WITH_SIZE(V)                                       \
125     MCR_GATE_META_DATA_LIST_WITH_SIZE(V)
126 
127 #define GATE_META_DATA_LIST_WITH_GATE_TYPE(V)                                  \
128     MCR_GATE_META_DATA_LIST_WITH_GATE_TYPE(V)
129 
130 #define GATE_META_DATA_LIST_WITH_VALUE(V)                                               \
131     SHARE_GATE_META_DATA_LIST_WITH_VALUE(V)                                             \
132     LCR_GATE_META_DATA_LIST_WITH_VALUE(V)                                             \
133     MCR_GATE_META_DATA_LIST_WITH_VALUE(V)                                             \
134     HCR_GATE_META_DATA_LIST_WITH_VALUE(V)
135 
136 #define GATE_META_DATA_LIST_WITH_ONE_PARAMETER(V)         \
137     SHARE_GATE_META_DATA_LIST_WITH_ONE_PARAMETER(V)       \
138     LCR_GATE_META_DATA_LIST_WITH_ONE_PARAMETER(V)       \
139     MCR_GATE_META_DATA_LIST_WITH_ONE_PARAMETER(V)       \
140     HCR_GATE_META_DATA_LIST_WITH_ONE_PARAMETER(V)
141 
142 #define GATE_META_DATA_LIST_WITH_BOOL(V)                                           \
143     MCR_GATE_META_DATA_LIST_WITH_BOOL(V)
144 
145 #define GATE_META_DATA_LIST_WITH_BOOL_VALUE_IN(V)                                  \
146     HCR_GATE_META_DATA_LIST_WITH_BOOL_VALUE_IN(V)
147 
148 #define GATE_OPCODE_LIST(V)     \
149     SHARE_GATE_OPCODE_LIST(V)   \
150     HCR_GATE_OPCODE_LIST(V)
151 
152 enum class OpCode : uint16_t {
153     NOP = 0,
154 #define DECLARE_GATE_OPCODE(NAME, OP, R, S, D, V) OP,
155     IMMUTABLE_META_DATA_CACHE_LIST(DECLARE_GATE_OPCODE)
156     GATE_META_DATA_LIST_WITH_SIZE(DECLARE_GATE_OPCODE)
157     GATE_META_DATA_LIST_WITH_ONE_PARAMETER(DECLARE_GATE_OPCODE)
158     GATE_META_DATA_LIST_WITH_PC_OFFSET(DECLARE_GATE_OPCODE)
159     GATE_META_DATA_LIST_FOR_CALL(DECLARE_GATE_OPCODE)
160     GATE_META_DATA_LIST_FOR_NEW(DECLARE_GATE_OPCODE)
161     GATE_META_DATA_LIST_WITH_PC_OFFSET_FIXED_VALUE(DECLARE_GATE_OPCODE)
162     GATE_META_DATA_LIST_WITH_BOOL(DECLARE_GATE_OPCODE)
163     GATE_META_DATA_LIST_WITH_BOOL_VALUE_IN(DECLARE_GATE_OPCODE)
164 #undef DECLARE_GATE_OPCODE
165 #define DECLARE_GATE_OPCODE(NAME) NAME,
166     GATE_OPCODE_LIST(DECLARE_GATE_OPCODE)
167 #undef DECLARE_GATE_OPCODE
168 };
169 
170 // Special virtual register in the OSR.
171 static constexpr size_t INIT_VRGE_GLUE = -1;
172 static constexpr size_t INIT_VRGE_ARGS = -2;
173 static constexpr size_t INIT_VRGE_ARGV = -3;
174 static constexpr size_t INIT_VRGE_FUNCTION = -4;
175 static constexpr size_t INIT_VRGE_NEW_TARGET = -5;
176 static constexpr size_t INIT_VRGE_THIS_OBJECT = -6;
177 static constexpr size_t INIT_VRGE_NUM_ARGS = -7;
178 static constexpr size_t INIT_VRGE_ENV = -8;
179 
180 }
181 
182 #endif  // ECMASCRIPT_COMPILER_SHARE_GATE_META_DATA_H
183