• 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_MCR_OPCODE_H
17 #define ECMASCRIPT_COMPILER_MCR_OPCODE_H
18 
19 namespace panda::ecmascript::kungfu {
20 
21 #define MCR_BINARY_GATE_META_DATA_CACHE_LIST(V)                                                             \
22     V(ProductIsNegativeZero, PRODUCT_IS_NEGATIVE_ZERO, GateFlags::CHECKABLE, 1, 1, 3)                       \
23     V(Int32CheckRightIsZero, INT32_CHECK_RIGHT_IS_ZERO, GateFlags::CHECKABLE, 1, 1, 1)                      \
24     V(RemainderIsNegativeZero, REMAINDER_IS_NEGATIVE_ZERO, GateFlags::CHECKABLE, 1, 1, 2)                   \
25     V(Float64CheckRightIsZero, FLOAT64_CHECK_RIGHT_IS_ZERO, GateFlags::CHECKABLE, 1, 1, 1)                  \
26     V(ValueCheckNegOverflow, VALUE_CHECK_NEG_OVERFLOW, GateFlags::CHECKABLE, 1, 1, 1)                       \
27     V(OverflowCheck, OVERFLOW_CHECK, GateFlags::CHECKABLE, 1, 1, 1)                                         \
28     V(Int32UnsignedUpperBoundCheck, INT32_UNSIGNED_UPPER_BOUND_CHECK, GateFlags::CHECKABLE, 1, 1, 2)        \
29     V(Int32DivWithCheck, INT32_DIV_WITH_CHECK, GateFlags::CHECKABLE, 1, 1, 2)                               \
30     V(LexVarIsHoleCheck, LEX_VAR_IS_HOLE_CHECK, GateFlags::CHECKABLE, 1, 1, 1)                              \
31     V(IsUndefinedOrHoleCheck, IS_UNDEFINED_OR_HOLE_CHECK, GateFlags::CHECKABLE, 1, 1, 1)                    \
32     V(IsNotUndefinedOrHoleCheck, IS_NOT_UNDEFINED_OR_HOLE_CHECK, GateFlags::CHECKABLE, 1, 1, 1)             \
33     V(IsDataViewCheck, IS_DATA_VIEW_CHECK, GateFlags::CHECKABLE, 1, 1, 1)                                   \
34     V(TaggedIsHeapObject, TAGGED_IS_HEAP_OBJECT, GateFlags::NO_WRITE, 1, 1, 1)                              \
35     V(IsMarkerCellValid, IS_MARKER_CELL_VALID, GateFlags::NO_WRITE, 1, 1, 1)                                \
36     V(StringEqual, STRING_EQUAL, GateFlags::NO_WRITE, 1, 1, 2)                                              \
37     V(IsCallableCheck, IS_CALLABLE_CHECK, GateFlags::CHECKABLE, 1, 1, 1)
38 
39 #define MCR_IMMUTABLE_META_DATA_CACHE_LIST(V)                                                                \
40     V(ArrayGuardianCheck, ARRAY_GUARDIAN_CHECK, GateFlags::CHECKABLE, 1, 1, 0)                               \
41     V(COWArrayCheck, COW_ARRAY_CHECK, GateFlags::CHECKABLE, 1, 1, 1)                                         \
42     V(ConvertHoleAsUndefined, CONVERT_HOLE_AS_UNDEFINED, GateFlags::NO_WRITE, 1, 1, 1)                       \
43     V(EcmaStringCheck, ECMA_STRING_CHECK, GateFlags::CHECKABLE, 1, 1, 1)                                     \
44     V(InternStringCheck, INTERN_STRING_CHECK, GateFlags::CHECKABLE, 1, 1, 1)                                 \
45     V(StringKeyCheck, STRING_KEY_CHECK, GateFlags::CHECKABLE, 1, 1, 2)                                       \
46     V(InternStringKeyCheck, INTERN_STRING_KEY_CHECK, GateFlags::CHECKABLE, 1, 1, 2)                          \
47     V(EcmaMapCheck, ECMA_MAP_CHECK, GateFlags::CHECKABLE, 1, 1, 1)                                           \
48     V(FinishAllocate, FINISH_ALLOCATE, GateFlags::NONE_FLAG, 0, 1, 1)                                        \
49     V(FlattenTreeStringCheck, FLATTEN_TREE_STRING_CHECK, GateFlags::CHECKABLE, 1, 1, 1)                      \
50     V(HeapObjectCheck, HEAP_OBJECT_CHECK, GateFlags::CHECKABLE, 1, 1, 1)                                     \
51     V(EcmaObjectCheck, ECMA_OBJECT_CHECK, GateFlags::CHECKABLE, 1, 1, 1)                                     \
52     V(MathHClassConsistencyCheck, MATH_HCLASS_CONSISTENCY_CHECK, GateFlags::CHECKABLE, 1, 1, 1)              \
53     V(ProtoChangeMarkerCheck, PROTO_CHANGE_MARKER_CHECK, GateFlags::CHECKABLE, 1, 1, 1)                      \
54     V(PrimTypeProtoChangeMarkerCheck, PRIMTYPE_PROTO_CHANGE_MARKER_CHECK, GateFlags::CHECKABLE, 1, 1, 1)     \
55     V(LookUpHolder, LOOK_UP_HOLDER, GateFlags::CHECKABLE, 1, 1, 3)                                           \
56     V(LoadGetter, LOAD_GETTER, GateFlags::NO_WRITE, 0, 1, 2)                                                 \
57     V(LoadSetter, LOAD_SETTER, GateFlags::NO_WRITE, 0, 1, 2)                                                 \
58     V(LoadStringLength, LOAD_STRING_LENGTH, GateFlags::NO_WRITE, 1, 1, 1)                                    \
59     V(LoadMapSize, LOAD_MAP_SIZE, GateFlags::NO_WRITE, 1, 1, 1)                                              \
60     V(StartAllocate, START_ALLOCATE, GateFlags::NONE_FLAG, 0, 1, 0)                                          \
61     V(StorePropertyNoBarrier, STORE_PROPERTY_NO_BARRIER, GateFlags::NONE_FLAG, 1, 1, 3)                      \
62     V(TypedNewAllocateThis, TYPED_NEW_ALLOCATE_THIS, GateFlags::CHECKABLE, 1, 1, 3)                          \
63     V(TypedSuperAllocateThis, TYPED_SUPER_ALLOCATE_THIS, GateFlags::NO_WRITE, 1, 1, 2)                       \
64     V(ArrayConstructorCheck, ARRAY_CONSTRUCTOR_CHECK, GateFlags::CHECKABLE, 1, 1, 1)                         \
65     V(ObjectConstructorCheck, OBJECT_CONSTRUCTOR_CHECK, GateFlags::CHECKABLE, 1, 1, 1)                       \
66     V(BooleanConstructorCheck, BOOLEAN_CONSTRUCTOR_CHECK, GateFlags::CHECKABLE, 1, 1, 1)                     \
67     V(IndexCheck, INDEX_CHECK, GateFlags::CHECKABLE, 1, 1, 2)                                                \
68     V(MonoLoadPropertyOnProto, MONO_LOAD_PROPERTY_ON_PROTO, GateFlags::CHECKABLE, 1, 1, 4)                   \
69     V(StringFromSingleCharCode, STRING_FROM_SINGLE_CHAR_CODE, GateFlags::NO_WRITE, 1, 1, 1)                  \
70     V(StringCharCodeAt, STRING_CHAR_CODE_AT, GateFlags::NO_WRITE, 1, 1, 2)                                   \
71     V(StringSubstring, STRING_SUB_STRING, GateFlags::NO_WRITE, 1, 1, 3)                                      \
72     V(StringSubStr, STRING_SUB_STR, GateFlags::NO_WRITE, 1, 1, 3)                                            \
73     V(StringSlice, STRING_SLICE, GateFlags::NO_WRITE, 1, 1, 3)                                               \
74     V(TypedArrayEntries, TYPED_ARRAY_ENTRIES, GateFlags::NO_WRITE, 1, 1, 1)                                  \
75     V(TypedArrayKeys, TYPED_ARRAY_KEYS, GateFlags::NO_WRITE, 1, 1, 1)                                        \
76     V(TypedArrayValues, TYPED_ARRAY_VALUES, GateFlags::NO_WRITE, 1, 1, 1)                                    \
77     V(Float32ArrayConstructorCheck, FLOAT32_ARRAY_CONSTRUCTOR_CHECK, GateFlags::CHECKABLE, 1, 1, 1)          \
78     V(MigrateFromRawValueToHeapValues, MIGRATE_FROM_RAWVALUE_TO_HEAPVALUES, GateFlags::NONE_FLAG, 1, 1, 3)   \
79     V(MigrateFromHeapValueToRawValue, MIGRATE_FROM_HEAPVALUE_TO_RAWVALUE, GateFlags::NONE_FLAG, 1, 1, 3)     \
80     V(MigrateFromHoleIntToHoleNumber, MIGRATE_FROM_HOLEINT_TO_HOLENUMBER, GateFlags::NONE_FLAG, 1, 1, 1)     \
81     V(MigrateFromHoleNumberToHoleInt, MIGRATE_FROM_HOLENUMBER_TO_HOLEINT, GateFlags::NONE_FLAG, 1, 1, 1)     \
82     V(NumberIsFinite, NUMBER_IS_FINITE, GateFlags::NO_WRITE, 1, 1, 1)                                        \
83     V(NumberIsInteger, NUMBER_IS_INTEGER, GateFlags::NO_WRITE, 1, 1, 1)                                      \
84     V(NumberIsNaN, NUMBER_IS_NAN, GateFlags::NO_WRITE, 1, 1, 1)                                              \
85     V(NumberIsSafeInteger, NUMBER_IS_SAFEINTEGER, GateFlags::NO_WRITE, 1, 1, 1)                              \
86     V(NumberParseFloat, NUMBER_PARSE_FLOAT, GateFlags::CHECKABLE, 1, 1, 1)                                   \
87     V(NumberParseInt, NUMBER_PARSE_INT, GateFlags::NO_WRITE, 1, 1, 2)                                        \
88     V(MathAcos, MATH_ACOS, GateFlags::NO_WRITE, 1, 1, 1)                                                     \
89     V(MathAcosh, MATH_ACOSH, GateFlags::NO_WRITE, 1, 1, 1)                                                   \
90     V(MathAsin, MATH_ASIN, GateFlags::NO_WRITE, 1, 1, 1)                                                     \
91     V(MathAsinh, MATH_ASINH, GateFlags::NO_WRITE, 1, 1, 1)                                                   \
92     V(MathAtan, MATH_ATAN, GateFlags::NO_WRITE, 1, 1, 1)                                                     \
93     V(MathAtan2, MATH_ATAN2, GateFlags::NO_WRITE, 1, 1, 2)                                                   \
94     V(MathAtanh, MATH_ATANH, GateFlags::NO_WRITE, 1, 1, 1)                                                   \
95     V(MathCos, MATH_COS, GateFlags::NO_WRITE, 1, 1, 1)                                                       \
96     V(MathCosh, MATH_COSH, GateFlags::NO_WRITE, 1, 1, 1)                                                     \
97     V(MathSign, MATH_SIGN, GateFlags::NO_WRITE, 1, 1, 1)                                                     \
98     V(MathSignTagged, MATH_SIGN_TAGGED, GateFlags::NO_WRITE, 1, 1, 1)                                        \
99     V(MathSin, MATH_SIN, GateFlags::NO_WRITE, 1, 1, 1)                                                       \
100     V(MathSinh, MATH_SINH, GateFlags::NO_WRITE, 1, 1, 1)                                                     \
101     V(MathSqrt, MATH_SQRT, GateFlags::NO_WRITE, 1, 1, 1)                                                     \
102     V(MathTan, MATH_TAN, GateFlags::NO_WRITE, 1, 1, 1)                                                       \
103     V(MathTanh, MATH_TANH, GateFlags::NO_WRITE, 1, 1, 1)                                                     \
104     V(MathTrunc, MATH_TRUNC, GateFlags::NO_WRITE, 1, 1, 1)                                                   \
105     V(MathLog, MATH_LOG, GateFlags::NO_WRITE, 1, 1, 1)                                                       \
106     V(MathLog2, MATH_LOG2, GateFlags::NO_WRITE, 1, 1, 1)                                                     \
107     V(MathLog10, MATH_LOG10, GateFlags::NO_WRITE, 1, 1, 1)                                                   \
108     V(MathLog1p, MATH_LOG1P, GateFlags::NO_WRITE, 1, 1, 1)                                                   \
109     V(MathExp, MATH_EXP, GateFlags::NO_WRITE, 1, 1, 1)                                                       \
110     V(MathExpm1, MATH_EXPM1, GateFlags::NO_WRITE, 1, 1, 1)                                                   \
111     V(MathClz32, MATH_CLZ32, GateFlags::NO_WRITE, 1, 1, 1)                                                   \
112     V(MathClz32Double, MATH_CLZ32_DOUBLE, GateFlags::NO_WRITE, 1, 1, 1)                                      \
113     V(MathClz32Int32, MATH_CLZ32_INT32, GateFlags::NO_WRITE, 1, 1, 1)                                        \
114     V(MathAbs, MATH_ABS, GateFlags::CHECKABLE, 1, 1, 1)                                                      \
115     V(MathAbsInt32, MATH_ABS_INT32, GateFlags::CHECKABLE, 1, 1, 1)                                           \
116     V(MathAbsDouble, MATH_ABS_DOUBLE, GateFlags::CHECKABLE, 1, 1, 1)                                         \
117     V(MathPow, MATH_POW, GateFlags::NO_WRITE, 1, 1, 2)                                                       \
118     V(MathCbrt, MATH_CBRT, GateFlags::NO_WRITE, 1, 1, 1)                                                     \
119     V(MathMin, MATH_MIN, GateFlags::NO_WRITE, 1, 1, 2)                                                       \
120     V(MathMinInt32, MATH_MIN_INT32, GateFlags::NO_WRITE, 1, 1, 2)                                            \
121     V(MathMinDouble, MATH_MIN_DOUBLE, GateFlags::NO_WRITE, 1, 1, 2)                                          \
122     V(MathMax, MATH_MAX, GateFlags::NO_WRITE, 1, 1, 2)                                                       \
123     V(MathMaxInt32, MATH_MAX_INT32, GateFlags::NO_WRITE, 1, 1, 2)                                            \
124     V(MathMaxDouble, MATH_MAX_DOUBLE, GateFlags::NO_WRITE, 1, 1, 2)                                          \
125     V(MathRound, MATH_ROUND, GateFlags::NO_WRITE, 1, 1, 1)                                                   \
126     V(MathRoundDouble, MATH_ROUND_DOUBLE, GateFlags::NO_WRITE, 1, 1, 1)                                      \
127     V(MathFRound, MATH_FROUND, GateFlags::NO_WRITE, 1, 1, 1)                                                 \
128     V(MathCeil, MATH_CEIL, GateFlags::NO_WRITE, 1, 1, 1)                                                     \
129     V(MathFloor, MATH_FLOOR, GateFlags::NO_WRITE, 1, 1, 1)                                                   \
130     V(MathImul, MATH_IMUL, GateFlags::NO_WRITE, 1, 1, 2)                                                     \
131     V(NewNumber, NEW_NUMBER, GateFlags::CHECKABLE, 1, 1, 2)                                                  \
132     V(GlobalIsFinite, GLOBAL_IS_FINITE, GateFlags::NO_WRITE, 1, 1, 1)                                        \
133     V(GlobalIsNan, GLOBAL_IS_NAN, GateFlags::NO_WRITE, 1, 1, 1)                                              \
134     V(BigIntConstructor, BIGINT_CONSTRUCTOR, GateFlags::NO_WRITE, 1, 1, 1)                                   \
135     V(BigIntConstructorInt32, BIGINT_CONSTRUCTOR_INT32, GateFlags::NO_WRITE, 1, 1, 1)                        \
136     V(BigIntConstructorUint32, BIGINT_CONSTRUCTOR_UINT32, GateFlags::NO_WRITE, 1, 1, 1)                      \
137     V(ArrayBufferIsView, ARRAY_BUFFER_IS_VIEW, GateFlags::NO_WRITE, 1, 1, 1)                                 \
138     V(DataViewGet, DATA_VIEW_GET, GateFlags::NO_WRITE, 1, 1, 5)                                              \
139     V(DataViewSet, DATA_VIEW_SET, GateFlags::NONE_FLAG, 1, 1, 6)                                             \
140     V(BigIntAsIntN, BIGINT_ASINTN, GateFlags::NO_WRITE, 1, 1, 3)                                             \
141     V(BigIntAsUintN, BIGINT_ASUINTN, GateFlags::NO_WRITE, 1, 1, 3)                                           \
142     V(MapGet, MAP_GET, GateFlags::NO_WRITE, 1, 1, 2)                                                         \
143     V(DateGetTime, DATE_GET_TIME, GateFlags::NO_WRITE, 1, 1, 1)                                              \
144     V(MapHas, MAP_HAS, GateFlags::NO_WRITE, 1, 1, 2)                                                         \
145     V(MapKeys, MAP_KEYS, GateFlags::NO_WRITE, 1, 1, 1)                                                       \
146     V(MapValues, MAP_VALUES, GateFlags::NO_WRITE, 1, 1, 1)                                                   \
147     V(MapEntries, MAP_ENTRIES, GateFlags::NO_WRITE, 1, 1, 1)                                                 \
148     V(SetHas, SET_HAS, GateFlags::NO_WRITE, 1, 1, 2)                                                         \
149     V(SetAdd, SET_ADD, GateFlags::NONE_FLAG, 1, 1, 2)                                                        \
150     V(MapDelete, MAP_DELETE, GateFlags::NONE_FLAG, 1, 1, 2)                                                  \
151     V(SetDelete, SET_DELETE, GateFlags::NONE_FLAG, 1, 1, 2)                                                  \
152     V(DateNow, DATE_NOW, GateFlags::NONE_FLAG, 1, 1, 0)                                                      \
153     V(SetValues, SET_VALUES, GateFlags::NO_WRITE, 1, 1, 1)                                                   \
154     V(SetEntries, SET_ENTRIES, GateFlags::NO_WRITE, 1, 1, 1)                                                 \
155     V(ObjectIs, OBJECT_IS, GateFlags::NO_WRITE, 1, 1, 2)                                                     \
156     V(ObjectGetPrototypeOf, OBJECT_GET_PROTOTYPE_OF, GateFlags::NO_WRITE, 1, 1, 1)                           \
157     V(ObjectCreate, OBJECT_CREATE, GateFlags::NONE_FLAG, 1, 1, 1)                                            \
158     V(ObjectIsPrototypeOf, OBJECT_IS_PROTOTYPE_OF, GateFlags::NO_WRITE, 1, 1, 2)                             \
159     V(ObjectHasOwnProperty, OBJECT_HAS_OWN_PROPERTY, GateFlags::NO_WRITE, 1, 1, 2)                           \
160     V(ReflectGetPrototypeOf, REFLECT_GET_PROTOTYPE_OF, GateFlags::NO_WRITE, 1, 1, 1)                         \
161     V(ReflectGet, REFLECT_GET, GateFlags::HAS_FRAME_STATE, 1, 1, 2)                                          \
162     V(ReflectHas, REFLECT_HAS, GateFlags::NO_WRITE, 1, 1, 2)                                                 \
163     V(ReflectConstruct, REFLECT_CONSTRUCT, GateFlags::HAS_FRAME_STATE, 1, 1, 1)                              \
164     V(ReflectApply, REFLECT_APPLY, GateFlags::HAS_FRAME_STATE, 1, 1, 3)                                      \
165     V(FunctionPrototypeApply, FUNCTION_PROTOTYPE_APPLY, GateFlags::NONE_FLAG, 1, 1, 3)                       \
166     V(FunctionPrototypeBind, FUNCTION_PROTOTYPE_BIND, GateFlags::NONE_FLAG, 1, 1, 2)                         \
167     V(HeapObjectIsEcmaObjectCheck, HEAP_OBJECT_IS_ECMA_OBJECT, GateFlags::CHECKABLE, 1, 1, 1)                \
168     V(CallTargetIsCompiledCheck, CALL_TARGET_IS_COMPILED_CHECK, GateFlags::CHECKABLE, 1, 1, 1)               \
169     V(ArrayIncludesIndexOf, ARRAY_INCLUDES_INDEXOF, GateFlags::NO_WRITE, 1, 1, 6)                            \
170     V(ArrayIteratorBuiltin, ARRAY_ITERATOR_BUILTIN, GateFlags::NONE_FLAG, 1, 1, 2)                           \
171     V(ArrayPop, ARRAY_POP, GateFlags::NONE_FLAG, 1, 1, 2)                                                    \
172     V(ArrayPush, ARRAY_PUSH, GateFlags::NONE_FLAG, 1, 1, 2)                                                  \
173     V(ArraySlice, ARRAY_SLICE, GateFlags::NONE_FLAG, 1, 1, 4)                                                \
174     V(ArraySort, ARRAY_SORT, GateFlags::NONE_FLAG, 1, 1, 2)                                                  \
175     V(InlineSuperCtorCheck, INLINE_SUPER_CTOR_CHECK, GateFlags::CHECKABLE, 1, 1, 3)                          \
176     V(CheckConstructor, CHECK_CONSTRUCTOR, GateFlags::NO_WRITE, 1, 1, 3)                                     \
177     MCR_BINARY_GATE_META_DATA_CACHE_LIST(V)
178 
179 #define MCR_GATE_META_DATA_LIST_WITH_PC_OFFSET(V)                                                            \
180     V(TypedCallBuiltin, TYPED_CALL_BUILTIN, GateFlags::CHECKABLE, 1, 1, value)                               \
181     V(TypedCallBuiltinSideEffect, TYPED_CALL_BUILTIN_SIDE_EFFECT, GateFlags::HAS_FRAME_STATE, 1, 1, value)   \
182     V(CallNewBuiltin, CALL_NEW_BUILTIN, GateFlags::CHECKABLE, 1, 1, value)                                   \
183     V(ObjectTypeCheck, OBJECT_TYPE_CHECK, GateFlags::CHECKABLE, 1, 1, value)
184 
185 #define MCR_GATE_META_DATA_LIST_FOR_CALL(V)                                    \
186     V(TypedCall, TYPEDCALL, GateFlags::HAS_FRAME_STATE, 1, 1, value)           \
187     V(TypedFastCall, TYPEDFASTCALL, GateFlags::HAS_FRAME_STATE, 1, 1, value)
188 
189 #define MCR_GATE_META_DATA_LIST_WITH_VALUE(V)                                                           \
190     V(LoadConstOffset,             LOAD_CONST_OFFSET,              GateFlags::NO_WRITE,  0, 1, 1)       \
191     V(LoadHClassConstOffset,       LOAD_HCLASS_CONST_OFFSET,       GateFlags::NO_WRITE,  0, 1, 1)       \
192     V(LoadHClassFromConstpool,     LOAD_HCLASS_FROM_CONSTPOOL,     GateFlags::NO_WRITE,  0, 1, 1)       \
193     V(StoreConstOffset,            STORE_CONST_OFFSET,             GateFlags::NONE_FLAG, 0, 1, 2)       \
194     V(StoreHClassConstOffset,      STORE_HCLASS_CONST_OFFSET,      GateFlags::NONE_FLAG, 0, 1, 3)       \
195     V(LoadElement,                 LOAD_ELEMENT,                   GateFlags::NO_WRITE,  1, 1, 2)       \
196     V(StoreElement,                STORE_ELEMENT,                  GateFlags::NONE_FLAG, 1, 1, 3)       \
197     V(StoreMemory,                 STORE_MEMORY,                   GateFlags::NONE_FLAG, 1, 1, 3)       \
198     V(StableArrayCheck,            STABLE_ARRAY_CHECK,             GateFlags::CHECKABLE, 1, 1, 1)       \
199     V(LoadArrayLength,             LOAD_ARRAY_LENGTH,              GateFlags::NO_WRITE,  1, 1, 1)       \
200     V(ElementsKindCheck,           ELEMENTSKIND_CHECK,             GateFlags::CHECKABLE, 1, 1, 1)       \
201     V(StoreProperty,               STORE_PROPERTY,                 GateFlags::NONE_FLAG, 1, 1, 3)       \
202     V(PrototypeCheck,              PROTOTYPE_CHECK,                GateFlags::CHECKABLE, 1, 1, 1)       \
203     V(RangeGuard,                  RANGE_GUARD,                    GateFlags::NO_WRITE,  1, 1, 1)       \
204     V(GetGlobalEnvObj,             GET_GLOBAL_ENV_OBJ,             GateFlags::NO_WRITE,  0, 1, 1)       \
205     V(GetGlobalEnvObjHClass,       GET_GLOBAL_ENV_OBJ_HCLASS,      GateFlags::NO_WRITE,  0, 1, 1)       \
206     V(GetGlobalConstantValue,      GET_GLOBAL_CONSTANT_VALUE,      GateFlags::NO_WRITE,  0, 1, 0)       \
207     V(HClassStableArrayCheck,      HCLASS_STABLE_ARRAY_CHECK,      GateFlags::CHECKABLE, 1, 1, 1)       \
208     V(HeapAlloc,                   HEAP_ALLOC,                     GateFlags::NONE_FLAG, 0, 1, 2)       \
209     V(RangeCheckPredicate,         RANGE_CHECK_PREDICATE,          GateFlags::CHECKABLE, 1, 1, 2)       \
210     V(BuiltinInstanceHClassCheck,  BUILTIN_INSTANCE_HCLASS_CHECK,  GateFlags::CHECKABLE, 1, 1, 1)       \
211     V(BuiltinPrototypeHClassCheck, BUILTIN_PROTOTYPE_HCLASS_CHECK, GateFlags::CHECKABLE, 1, 1, 1)       \
212     V(IsSpecificObjectType,        IS_SPECIFIC_OBJECT_TYPE,        GateFlags::NO_WRITE,  1, 1, 1)       \
213     V(LoadBuiltinObject,           LOAD_BUILTIN_OBJECT,            GateFlags::CHECKABLE, 1, 1, 0)       \
214     V(StringAdd,                   STRING_ADD,                     GateFlags::NO_WRITE,  1, 1, 2)       \
215     V(ArrayForEach,                ARRAY_FOR_EACH,                 GateFlags::HAS_FRAME_STATE, 1, 1, 3) \
216     V(ArrayFilter,                 ARRAY_FILTER,                   GateFlags::NONE_FLAG, 1, 1, 4)       \
217     V(ArrayFindOrFindIndex,        ARRAY_FIND_OR_FINDINDEX,        GateFlags::HAS_FRAME_STATE, 1, 1, 4) \
218     V(ArrayMap,                    ARRAY_MAP,                      GateFlags::NONE_FLAG, 1, 1, 4)       \
219     V(ArraySome,                   ARRAY_SOME,                     GateFlags::HAS_FRAME_STATE, 1, 1, 3) \
220     V(ArrayEvery,                  ARRAY_EVERY,                    GateFlags::HAS_FRAME_STATE, 1, 1, 3)
221 
222 #define MCR_GATE_META_DATA_LIST_WITH_BOOL(V)                                                                 \
223     V(LoadProperty, LOAD_PROPERTY, GateFlags::NO_WRITE, 1, 1, 2)                                             \
224     V(MonoStorePropertyLookUpProto, MONO_STORE_PROPERTY_LOOK_UP_PROTO, GateFlags::HAS_FRAME_STATE, 1, 1, 5)  \
225     V(MonoStoreProperty, MONO_STORE_PROPERTY, GateFlags::HAS_FRAME_STATE, 1, 1, 7)
226 
227 #define MCR_GATE_META_DATA_LIST_WITH_GATE_TYPE(V)                                                           \
228     V(PrimitiveTypeCheck, PRIMITIVE_TYPE_CHECK, GateFlags::CHECKABLE, 1, 1, 1)                              \
229     V(TypedArrayCheck, TYPED_ARRAY_CHECK, GateFlags::CHECKABLE, 1, 1, 1)                                    \
230     V(TypedConstructorCheck, TYPED_CONSTRUCTOR_CHECK, GateFlags::CHECKABLE, 1, 1, 1)                        \
231     V(LoadTypedArrayLength, LOAD_TYPED_ARRAY_LENGTH, GateFlags::NO_WRITE, 1, 1, 1)                          \
232     V(TypedBinaryOp, TYPED_BINARY_OP, GateFlags::NO_WRITE, 1, 1, 2)                                         \
233     V(TypedUnaryOp, TYPED_UNARY_OP, GateFlags::NO_WRITE, 1, 1, 1)                                           \
234     V(TypedConditionJump, TYPED_CONDITION_JUMP, GateFlags::NO_WRITE, 1, 1, 1)                               \
235     V(TypedConvert, TYPE_CONVERT, GateFlags::NO_WRITE, 1, 1, 1)                                             \
236     V(CheckAndConvert, CHECK_AND_CONVERT, GateFlags::CHECKABLE, 1, 1, 1)                                    \
237     V(Convert, CONVERT, GateFlags::NONE_FLAG, 0, 0, 1)                                                      \
238     V(JSInlineTargetTypeCheck, JSINLINETARGET_TYPE_CHECK, GateFlags::CHECKABLE, 1, 1, 2)                    \
239     V(JSInlineTargetHeapConstantCheck, JSINLINETARGET_HEAPCONSTANT_CHECK, GateFlags::CHECKABLE, 1, 1, 2)    \
240     V(TypeOfCheck, TYPE_OF_CHECK, GateFlags::CHECKABLE, 1, 1, 1)                                            \
241     V(TypeOf, TYPE_OF, GateFlags::NO_WRITE, 1, 1, 0)                                                        \
242     V(TypedCallTargetCheckOp, TYPED_CALLTARGETCHECK_OP, GateFlags::CHECKABLE, 1, 1, 2)
243 
244 // NOTICE-PGO: wx typedcalltargetcheckop can adopt different number of valueIn
245 
246 #define MCR_GATE_META_DATA_LIST_WITH_ONE_PARAMETER(V)         \
247     MCR_GATE_META_DATA_LIST_WITH_VALUE(V)                     \
248     MCR_GATE_META_DATA_LIST_WITH_GATE_TYPE(V)
249 
250 #define MCR_GATE_META_DATA_LIST_WITH_VALUE_IN(V)                                                 \
251     V(TypedCreateObjWithBuffer, TYPED_CREATE_OBJ_WITH_BUFFER, GateFlags::CHECKABLE, 1, 1, value) \
252     V(TypedCallCheck, TYPED_CALL_CHECK, GateFlags::CHECKABLE, 1, 1, value)                       \
253     V(FunctionPrototypeCall, FUNCTION_PROTOTYPE_CALL, GateFlags::NONE_FLAG, 1, 1, value)
254 
255 #define MCR_GATE_META_DATA_LIST_WITH_SIZE(V)                                       \
256     MCR_GATE_META_DATA_LIST_WITH_VALUE_IN(V)
257 }
258 
259 #endif  // ECMASCRIPT_COMPILER_MCR_OPCODE_H
260