14514f5e3Sopenharmony_ci/*
24514f5e3Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
34514f5e3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
44514f5e3Sopenharmony_ci * you may not use this file except in compliance with the License.
54514f5e3Sopenharmony_ci * You may obtain a copy of the License at
64514f5e3Sopenharmony_ci *
74514f5e3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
84514f5e3Sopenharmony_ci *
94514f5e3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
104514f5e3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
114514f5e3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
124514f5e3Sopenharmony_ci * See the License for the specific language governing permissions and
134514f5e3Sopenharmony_ci * limitations under the License.
144514f5e3Sopenharmony_ci */
154514f5e3Sopenharmony_ci
164514f5e3Sopenharmony_ci#include "ecmascript/compiler/gate.h"
174514f5e3Sopenharmony_ci#include "ecmascript/compiler/share_gate_meta_data.h"
184514f5e3Sopenharmony_ci#include "ecmascript/compiler/gate_meta_data_builder.h"
194514f5e3Sopenharmony_ci
204514f5e3Sopenharmony_cinamespace panda::ecmascript::kungfu {
214514f5e3Sopenharmony_ci
224514f5e3Sopenharmony_cistd::string GateMetaData::Str(OpCode opcode)
234514f5e3Sopenharmony_ci{
244514f5e3Sopenharmony_ci    const std::map<OpCode, const char *> strMap = {
254514f5e3Sopenharmony_ci#define GATE_NAME_MAP(NAME, OP, R, S, D, V) { OpCode::OP, #OP },
264514f5e3Sopenharmony_ci    IMMUTABLE_META_DATA_CACHE_LIST(GATE_NAME_MAP)
274514f5e3Sopenharmony_ci    GATE_META_DATA_LIST_WITH_BOOL(GATE_NAME_MAP)
284514f5e3Sopenharmony_ci    GATE_META_DATA_LIST_WITH_BOOL_VALUE_IN(GATE_NAME_MAP)
294514f5e3Sopenharmony_ci    GATE_META_DATA_LIST_WITH_SIZE(GATE_NAME_MAP)
304514f5e3Sopenharmony_ci    GATE_META_DATA_LIST_WITH_ONE_PARAMETER(GATE_NAME_MAP)
314514f5e3Sopenharmony_ci    GATE_META_DATA_LIST_WITH_PC_OFFSET(GATE_NAME_MAP)
324514f5e3Sopenharmony_ci    GATE_META_DATA_LIST_FOR_CALL(GATE_NAME_MAP)
334514f5e3Sopenharmony_ci    GATE_META_DATA_LIST_FOR_NEW(GATE_NAME_MAP)
344514f5e3Sopenharmony_ci    GATE_META_DATA_LIST_WITH_PC_OFFSET_FIXED_VALUE(GATE_NAME_MAP)
354514f5e3Sopenharmony_ci#undef GATE_NAME_MAP
364514f5e3Sopenharmony_ci#define GATE_NAME_MAP(OP) { OpCode::OP, #OP },
374514f5e3Sopenharmony_ci        GATE_OPCODE_LIST(GATE_NAME_MAP)
384514f5e3Sopenharmony_ci#undef GATE_NAME_MAP
394514f5e3Sopenharmony_ci    };
404514f5e3Sopenharmony_ci    if (strMap.count(opcode) > 0) {
414514f5e3Sopenharmony_ci        return strMap.at(opcode);
424514f5e3Sopenharmony_ci    }
434514f5e3Sopenharmony_ci    return "OP-" + std::to_string(static_cast<uint8_t>(opcode));
444514f5e3Sopenharmony_ci}
454514f5e3Sopenharmony_ci
464514f5e3Sopenharmony_cibool GateMetaData::IsRoot() const
474514f5e3Sopenharmony_ci{
484514f5e3Sopenharmony_ci    switch (opcode_) {
494514f5e3Sopenharmony_ci        case OpCode::CIRCUIT_ROOT:
504514f5e3Sopenharmony_ci        case OpCode::DEPEND_ENTRY:
514514f5e3Sopenharmony_ci        case OpCode::ARG_LIST:
524514f5e3Sopenharmony_ci        case OpCode::STATE_ENTRY:
534514f5e3Sopenharmony_ci        case OpCode::RETURN_LIST:
544514f5e3Sopenharmony_ci            return true;
554514f5e3Sopenharmony_ci        default:
564514f5e3Sopenharmony_ci            return false;
574514f5e3Sopenharmony_ci    }
584514f5e3Sopenharmony_ci}
594514f5e3Sopenharmony_ci
604514f5e3Sopenharmony_cibool GateMetaData::IsProlog() const
614514f5e3Sopenharmony_ci{
624514f5e3Sopenharmony_ci    return (opcode_ == OpCode::ARG || opcode_ == OpCode::INITVREG);
634514f5e3Sopenharmony_ci}
644514f5e3Sopenharmony_ci
654514f5e3Sopenharmony_cibool GateMetaData::IsFixed() const
664514f5e3Sopenharmony_ci{
674514f5e3Sopenharmony_ci    switch (opcode_) {
684514f5e3Sopenharmony_ci        case OpCode::VALUE_SELECTOR:
694514f5e3Sopenharmony_ci        case OpCode::DEPEND_SELECTOR:
704514f5e3Sopenharmony_ci        case OpCode::DEPEND_RELAY:
714514f5e3Sopenharmony_ci        case OpCode::LOOP_EXIT_DEPEND:
724514f5e3Sopenharmony_ci        case OpCode::LOOP_EXIT_VALUE:
734514f5e3Sopenharmony_ci            return true;
744514f5e3Sopenharmony_ci        default:
754514f5e3Sopenharmony_ci            return false;
764514f5e3Sopenharmony_ci    }
774514f5e3Sopenharmony_ci}
784514f5e3Sopenharmony_ci
794514f5e3Sopenharmony_cibool GateMetaData::IsSchedulable() const
804514f5e3Sopenharmony_ci{
814514f5e3Sopenharmony_ci    ASSERT(!IsNop());
824514f5e3Sopenharmony_ci#ifndef NDEBUG
834514f5e3Sopenharmony_ci    if (GetStateCount() == 0) {
844514f5e3Sopenharmony_ci        ASSERT(!IsFixed());
854514f5e3Sopenharmony_ci    }
864514f5e3Sopenharmony_ci#endif
874514f5e3Sopenharmony_ci    return (!IsProlog()) && (!IsRoot()) && (GetStateCount() == 0);
884514f5e3Sopenharmony_ci}
894514f5e3Sopenharmony_ci
904514f5e3Sopenharmony_cibool GateMetaData::IsState() const
914514f5e3Sopenharmony_ci{
924514f5e3Sopenharmony_ci    ASSERT(!IsNop());
934514f5e3Sopenharmony_ci#ifndef NDEBUG
944514f5e3Sopenharmony_ci    if (GetStateCount() > 0) {
954514f5e3Sopenharmony_ci        ASSERT(!IsProlog());
964514f5e3Sopenharmony_ci        ASSERT(!IsRoot());
974514f5e3Sopenharmony_ci    }
984514f5e3Sopenharmony_ci#endif
994514f5e3Sopenharmony_ci    return (!IsVirtualState()) && (!IsFixed()) && (GetStateCount() > 0);
1004514f5e3Sopenharmony_ci}
1014514f5e3Sopenharmony_ci
1024514f5e3Sopenharmony_cibool GateMetaData::IsGeneralState() const
1034514f5e3Sopenharmony_ci{
1044514f5e3Sopenharmony_ci    switch (opcode_) {
1054514f5e3Sopenharmony_ci        case OpCode::IF_BRANCH:
1064514f5e3Sopenharmony_ci        case OpCode::SWITCH_BRANCH:
1074514f5e3Sopenharmony_ci        case OpCode::IF_TRUE:
1084514f5e3Sopenharmony_ci        case OpCode::IF_FALSE:
1094514f5e3Sopenharmony_ci        case OpCode::IF_SUCCESS:
1104514f5e3Sopenharmony_ci        case OpCode::IF_EXCEPTION:
1114514f5e3Sopenharmony_ci        case OpCode::SWITCH_CASE:
1124514f5e3Sopenharmony_ci        case OpCode::DEFAULT_CASE:
1134514f5e3Sopenharmony_ci        case OpCode::MERGE:
1144514f5e3Sopenharmony_ci        case OpCode::LOOP_BEGIN:
1154514f5e3Sopenharmony_ci        case OpCode::LOOP_BACK:
1164514f5e3Sopenharmony_ci        case OpCode::LOOP_EXIT:
1174514f5e3Sopenharmony_ci        case OpCode::ORDINARY_BLOCK:
1184514f5e3Sopenharmony_ci        case OpCode::STATE_ENTRY:
1194514f5e3Sopenharmony_ci        case OpCode::DEOPT_CHECK:
1204514f5e3Sopenharmony_ci        case OpCode::RETURN:
1214514f5e3Sopenharmony_ci        case OpCode::RETURN_VOID:
1224514f5e3Sopenharmony_ci            return true;
1234514f5e3Sopenharmony_ci        default:
1244514f5e3Sopenharmony_ci            return false;
1254514f5e3Sopenharmony_ci    }
1264514f5e3Sopenharmony_ci}
1274514f5e3Sopenharmony_ci
1284514f5e3Sopenharmony_cibool GateMetaData::IsTerminalState() const
1294514f5e3Sopenharmony_ci{
1304514f5e3Sopenharmony_ci    switch (opcode_) {
1314514f5e3Sopenharmony_ci        case OpCode::RETURN:
1324514f5e3Sopenharmony_ci        case OpCode::THROW:
1334514f5e3Sopenharmony_ci        case OpCode::RETURN_VOID:
1344514f5e3Sopenharmony_ci        case OpCode::GET_EXCEPTION:
1354514f5e3Sopenharmony_ci        case OpCode::STATE_SPLIT:
1364514f5e3Sopenharmony_ci            return true;
1374514f5e3Sopenharmony_ci        default:
1384514f5e3Sopenharmony_ci            return false;
1394514f5e3Sopenharmony_ci    }
1404514f5e3Sopenharmony_ci}
1414514f5e3Sopenharmony_ci
1424514f5e3Sopenharmony_cibool GateMetaData::IsVirtualState() const
1434514f5e3Sopenharmony_ci{
1444514f5e3Sopenharmony_ci    switch (opcode_) {
1454514f5e3Sopenharmony_ci        case OpCode::GET_EXCEPTION:
1464514f5e3Sopenharmony_ci        case OpCode::STATE_SPLIT:
1474514f5e3Sopenharmony_ci            return true;
1484514f5e3Sopenharmony_ci        default:
1494514f5e3Sopenharmony_ci            return false;
1504514f5e3Sopenharmony_ci    }
1514514f5e3Sopenharmony_ci}
1524514f5e3Sopenharmony_ci
1534514f5e3Sopenharmony_cibool GateMetaData::IsCFGMerge() const
1544514f5e3Sopenharmony_ci{
1554514f5e3Sopenharmony_ci    return (opcode_ == OpCode::MERGE) || (opcode_ == OpCode::LOOP_BEGIN);
1564514f5e3Sopenharmony_ci}
1574514f5e3Sopenharmony_ci
1584514f5e3Sopenharmony_cibool GateMetaData::IsControlCase() const
1594514f5e3Sopenharmony_ci{
1604514f5e3Sopenharmony_ci    ASSERT(HasFlag(GateFlags::CONTROL));
1614514f5e3Sopenharmony_ci    // should add relay
1624514f5e3Sopenharmony_ci    switch (opcode_) {
1634514f5e3Sopenharmony_ci        case OpCode::IF_BRANCH:
1644514f5e3Sopenharmony_ci        case OpCode::SWITCH_BRANCH:
1654514f5e3Sopenharmony_ci        case OpCode::IF_TRUE:
1664514f5e3Sopenharmony_ci        case OpCode::IF_FALSE:
1674514f5e3Sopenharmony_ci        case OpCode::SWITCH_CASE:
1684514f5e3Sopenharmony_ci        case OpCode::DEFAULT_CASE:
1694514f5e3Sopenharmony_ci            return true;
1704514f5e3Sopenharmony_ci        default:
1714514f5e3Sopenharmony_ci            return false;
1724514f5e3Sopenharmony_ci    }
1734514f5e3Sopenharmony_ci}
1744514f5e3Sopenharmony_ci
1754514f5e3Sopenharmony_cibool GateMetaData::IsIfOrSwitchRelated() const
1764514f5e3Sopenharmony_ci{
1774514f5e3Sopenharmony_ci    switch (opcode_) {
1784514f5e3Sopenharmony_ci        case OpCode::IF_TRUE:
1794514f5e3Sopenharmony_ci        case OpCode::IF_FALSE:
1804514f5e3Sopenharmony_ci        case OpCode::SWITCH_CASE:
1814514f5e3Sopenharmony_ci        case OpCode::DEFAULT_CASE:
1824514f5e3Sopenharmony_ci        case OpCode::IF_SUCCESS:
1834514f5e3Sopenharmony_ci        case OpCode::IF_EXCEPTION:
1844514f5e3Sopenharmony_ci            return true;
1854514f5e3Sopenharmony_ci        default:
1864514f5e3Sopenharmony_ci            return false;
1874514f5e3Sopenharmony_ci    }
1884514f5e3Sopenharmony_ci}
1894514f5e3Sopenharmony_ci
1904514f5e3Sopenharmony_cibool GateMetaData::IsLoopHead() const
1914514f5e3Sopenharmony_ci{
1924514f5e3Sopenharmony_ci    return (opcode_ == OpCode::LOOP_BEGIN);
1934514f5e3Sopenharmony_ci}
1944514f5e3Sopenharmony_ci
1954514f5e3Sopenharmony_cibool GateMetaData::IsNop() const
1964514f5e3Sopenharmony_ci{
1974514f5e3Sopenharmony_ci    return (opcode_ == OpCode::NOP || opcode_ == OpCode::DEAD);
1984514f5e3Sopenharmony_ci}
1994514f5e3Sopenharmony_ci
2004514f5e3Sopenharmony_cibool GateMetaData::IsDead() const
2014514f5e3Sopenharmony_ci{
2024514f5e3Sopenharmony_ci    return opcode_ == OpCode::DEAD;
2034514f5e3Sopenharmony_ci}
2044514f5e3Sopenharmony_ci
2054514f5e3Sopenharmony_cibool GateMetaData::IsConstant() const
2064514f5e3Sopenharmony_ci{
2074514f5e3Sopenharmony_ci    return (opcode_ == OpCode::CONSTANT);
2084514f5e3Sopenharmony_ci}
2094514f5e3Sopenharmony_ci
2104514f5e3Sopenharmony_cibool GateMetaData::IsDependSelector() const
2114514f5e3Sopenharmony_ci{
2124514f5e3Sopenharmony_ci    return (opcode_ == OpCode::DEPEND_SELECTOR);
2134514f5e3Sopenharmony_ci}
2144514f5e3Sopenharmony_ci
2154514f5e3Sopenharmony_ciGateMetaBuilder::GateMetaBuilder(Chunk* chunk)
2164514f5e3Sopenharmony_ci    : cache_(), chunk_(chunk) {}
2174514f5e3Sopenharmony_ci
2184514f5e3Sopenharmony_ci#define DECLARE_GATE_META(NAME, OP, R, S, D, V) \
2194514f5e3Sopenharmony_ciconst GateMetaData* GateMetaBuilder::NAME()     \
2204514f5e3Sopenharmony_ci{                                               \
2214514f5e3Sopenharmony_ci    return &cache_.cached##NAME##_;             \
2224514f5e3Sopenharmony_ci}
2234514f5e3Sopenharmony_ciIMMUTABLE_META_DATA_CACHE_LIST(DECLARE_GATE_META)
2244514f5e3Sopenharmony_ci#undef DECLARE_GATE_META
2254514f5e3Sopenharmony_ci
2264514f5e3Sopenharmony_ci#define DECLARE_GATE_META(NAME, OP, R, S, D, V)                           \
2274514f5e3Sopenharmony_ciconst GateMetaData* GateMetaBuilder::NAME(bool value)                     \
2284514f5e3Sopenharmony_ci{                                                                         \
2294514f5e3Sopenharmony_ci    auto meta = new (chunk_) BoolMetaData(OpCode::OP, R, S, D, V, value); \
2304514f5e3Sopenharmony_ci    return meta;                                                          \
2314514f5e3Sopenharmony_ci}
2324514f5e3Sopenharmony_ciGATE_META_DATA_LIST_WITH_BOOL(DECLARE_GATE_META)
2334514f5e3Sopenharmony_ci#undef DECLARE_GATE_META
2344514f5e3Sopenharmony_ci
2354514f5e3Sopenharmony_ci#define DECLARE_GATE_META_WITH_BOOL_VALUE_IN(NAME, OP, R, S, D, V)        \
2364514f5e3Sopenharmony_ciconst GateMetaData* GateMetaBuilder::NAME(size_t value, bool flag)        \
2374514f5e3Sopenharmony_ci{                                                                         \
2384514f5e3Sopenharmony_ci    auto meta = new (chunk_) BoolMetaData(OpCode::OP, R, S, D, V, flag);  \
2394514f5e3Sopenharmony_ci    return meta;                                                          \
2404514f5e3Sopenharmony_ci}
2414514f5e3Sopenharmony_ciGATE_META_DATA_LIST_WITH_BOOL_VALUE_IN(DECLARE_GATE_META_WITH_BOOL_VALUE_IN)
2424514f5e3Sopenharmony_ci#undef DECLARE_GATE_META_WITH_BOOL_VALUE_IN
2434514f5e3Sopenharmony_ci
2444514f5e3Sopenharmony_ci#define DECLARE_GATE_META(NAME, OP, R, S, D, V)                    \
2454514f5e3Sopenharmony_ciconst GateMetaData* GateMetaBuilder::NAME(size_t value)            \
2464514f5e3Sopenharmony_ci{                                                                  \
2474514f5e3Sopenharmony_ci    switch (value) {                                               \
2484514f5e3Sopenharmony_ci        case GateMetaDataChache::ONE_VALUE:                        \
2494514f5e3Sopenharmony_ci            return &cache_.cached##NAME##1_;                       \
2504514f5e3Sopenharmony_ci        case GateMetaDataChache::TWO_VALUE:                        \
2514514f5e3Sopenharmony_ci            return &cache_.cached##NAME##2_;                       \
2524514f5e3Sopenharmony_ci        case GateMetaDataChache::THREE_VALUE:                      \
2534514f5e3Sopenharmony_ci            return &cache_.cached##NAME##3_;                       \
2544514f5e3Sopenharmony_ci        case GateMetaDataChache::FOUR_VALUE:                       \
2554514f5e3Sopenharmony_ci            return &cache_.cached##NAME##4_;                       \
2564514f5e3Sopenharmony_ci        case GateMetaDataChache::FIVE_VALUE:                       \
2574514f5e3Sopenharmony_ci            return &cache_.cached##NAME##5_;                       \
2584514f5e3Sopenharmony_ci        default:                                                   \
2594514f5e3Sopenharmony_ci            break;                                                 \
2604514f5e3Sopenharmony_ci    }                                                              \
2614514f5e3Sopenharmony_ci    auto meta = new (chunk_) GateMetaData(OpCode::OP, R, S, D, V); \
2624514f5e3Sopenharmony_ci    meta->SetKind(GateMetaData::Kind::MUTABLE_WITH_SIZE);          \
2634514f5e3Sopenharmony_ci    return meta;                                                   \
2644514f5e3Sopenharmony_ci}
2654514f5e3Sopenharmony_ciGATE_META_DATA_LIST_WITH_SIZE(DECLARE_GATE_META)
2664514f5e3Sopenharmony_ci#undef DECLARE_GATE_META
2674514f5e3Sopenharmony_ci
2684514f5e3Sopenharmony_ci#define DECLARE_GATE_META(NAME, OP, R, S, D, V)                                   \
2694514f5e3Sopenharmony_ciconst GateMetaData* GateMetaBuilder::NAME(uint64_t value)                         \
2704514f5e3Sopenharmony_ci{                                                                                 \
2714514f5e3Sopenharmony_ci    switch (value) {                                                              \
2724514f5e3Sopenharmony_ci        case GateMetaDataChache::ONE_VALUE:                                       \
2734514f5e3Sopenharmony_ci            return &cache_.cached##NAME##1_;                                      \
2744514f5e3Sopenharmony_ci        case GateMetaDataChache::TWO_VALUE:                                       \
2754514f5e3Sopenharmony_ci            return &cache_.cached##NAME##2_;                                      \
2764514f5e3Sopenharmony_ci        case GateMetaDataChache::THREE_VALUE:                                     \
2774514f5e3Sopenharmony_ci            return &cache_.cached##NAME##3_;                                      \
2784514f5e3Sopenharmony_ci        case GateMetaDataChache::FOUR_VALUE:                                      \
2794514f5e3Sopenharmony_ci            return &cache_.cached##NAME##4_;                                      \
2804514f5e3Sopenharmony_ci        case GateMetaDataChache::FIVE_VALUE:                                      \
2814514f5e3Sopenharmony_ci            return &cache_.cached##NAME##5_;                                      \
2824514f5e3Sopenharmony_ci        default:                                                                  \
2834514f5e3Sopenharmony_ci            break;                                                                \
2844514f5e3Sopenharmony_ci    }                                                                             \
2854514f5e3Sopenharmony_ci    auto meta = new (chunk_) OneParameterMetaData(OpCode::OP, R, S, D, V, value); \
2864514f5e3Sopenharmony_ci    meta->SetKind(GateMetaData::Kind::MUTABLE_ONE_PARAMETER);                     \
2874514f5e3Sopenharmony_ci    return meta;                                                                  \
2884514f5e3Sopenharmony_ci}
2894514f5e3Sopenharmony_ciGATE_META_DATA_LIST_WITH_VALUE(DECLARE_GATE_META)
2904514f5e3Sopenharmony_ci#undef DECLARE_GATE_META
2914514f5e3Sopenharmony_ci
2924514f5e3Sopenharmony_ci#define DECLARE_GATE_META(NAME, OP, R, S, D, V)                                   \
2934514f5e3Sopenharmony_ciconst GateMetaData* GateMetaBuilder::NAME(uint64_t value)                         \
2944514f5e3Sopenharmony_ci{                                                                                 \
2954514f5e3Sopenharmony_ci    auto meta = new (chunk_) OneParameterMetaData(OpCode::OP, R, S, D, V, value); \
2964514f5e3Sopenharmony_ci    meta->SetKind(GateMetaData::Kind::MUTABLE_ONE_PARAMETER);                     \
2974514f5e3Sopenharmony_ci    return meta;                                                                  \
2984514f5e3Sopenharmony_ci}
2994514f5e3Sopenharmony_ciGATE_META_DATA_LIST_WITH_GATE_TYPE(DECLARE_GATE_META)
3004514f5e3Sopenharmony_ci#undef DECLARE_GATE_META
3014514f5e3Sopenharmony_ci
3024514f5e3Sopenharmony_ci#define DECLARE_GATE_META(NAME, OP, R, S, D, V)                                          \
3034514f5e3Sopenharmony_ciconst GateMetaData* GateMetaBuilder::NAME(uint64_t value, uint64_t pcOffset)             \
3044514f5e3Sopenharmony_ci{                                                                                        \
3054514f5e3Sopenharmony_ci    auto meta = new (chunk_) OneParameterMetaData(OpCode::OP, R, S, D, value, pcOffset); \
3064514f5e3Sopenharmony_ci    meta->SetKind(GateMetaData::Kind::MUTABLE_ONE_PARAMETER);                            \
3074514f5e3Sopenharmony_ci    return meta;                                                                         \
3084514f5e3Sopenharmony_ci}
3094514f5e3Sopenharmony_ciGATE_META_DATA_LIST_WITH_PC_OFFSET(DECLARE_GATE_META)
3104514f5e3Sopenharmony_ci#undef DECLARE_GATE_META
3114514f5e3Sopenharmony_ci
3124514f5e3Sopenharmony_ci#define DECLARE_GATE_META_FOR_CALL(NAME, OP, R, S, D, V)                                        \
3134514f5e3Sopenharmony_ciconst GateMetaData* GateMetaBuilder::NAME(uint64_t value, uint64_t pcOffset, bool noGC)         \
3144514f5e3Sopenharmony_ci{                                                                                               \
3154514f5e3Sopenharmony_ci    auto meta = new (chunk_) TypedCallMetaData(OpCode::OP, R, S, D, value, pcOffset, noGC);     \
3164514f5e3Sopenharmony_ci    meta->SetKind(GateMetaData::Kind::TYPED_CALL);                                              \
3174514f5e3Sopenharmony_ci    return meta;                                                                                \
3184514f5e3Sopenharmony_ci}
3194514f5e3Sopenharmony_ciGATE_META_DATA_LIST_FOR_CALL(DECLARE_GATE_META_FOR_CALL)
3204514f5e3Sopenharmony_ci#undef DECLARE_GATE_META_FOR_CALL
3214514f5e3Sopenharmony_ci
3224514f5e3Sopenharmony_ci#define DECLARE_GATE_META_FOR_NEW(NAME, OP, R, S, D, V)                                         \
3234514f5e3Sopenharmony_ciconst GateMetaData* GateMetaBuilder::NAME(uint64_t value, uint64_t pcOffset,                    \
3244514f5e3Sopenharmony_ci                                          bool isFastCall)                                      \
3254514f5e3Sopenharmony_ci{                                                                                               \
3264514f5e3Sopenharmony_ci    auto meta = new (chunk_) NewConstructMetaData(OpCode::OP, R, S, D, value,                   \
3274514f5e3Sopenharmony_ci                                                  pcOffset, isFastCall);                        \
3284514f5e3Sopenharmony_ci    meta->SetKind(GateMetaData::Kind::CALL_NEW);                                                \
3294514f5e3Sopenharmony_ci    return meta;                                                                                \
3304514f5e3Sopenharmony_ci}
3314514f5e3Sopenharmony_ciGATE_META_DATA_LIST_FOR_NEW(DECLARE_GATE_META_FOR_NEW)
3324514f5e3Sopenharmony_ci#undef DECLARE_GATE_META_FOR_NEW
3334514f5e3Sopenharmony_ci
3344514f5e3Sopenharmony_ci#define DECLARE_GATE_META(NAME, OP, R, S, D, V)                                          \
3354514f5e3Sopenharmony_ciconst GateMetaData* GateMetaBuilder::NAME(uint64_t pcOffset) const                       \
3364514f5e3Sopenharmony_ci{                                                                                        \
3374514f5e3Sopenharmony_ci    auto meta = new (chunk_) OneParameterMetaData(OpCode::OP, R, S, D, V, pcOffset);     \
3384514f5e3Sopenharmony_ci    meta->SetKind(GateMetaData::Kind::MUTABLE_ONE_PARAMETER);                            \
3394514f5e3Sopenharmony_ci    return meta;                                                                         \
3404514f5e3Sopenharmony_ci}
3414514f5e3Sopenharmony_ciGATE_META_DATA_LIST_WITH_PC_OFFSET_FIXED_VALUE(DECLARE_GATE_META)
3424514f5e3Sopenharmony_ci#undef DECLARE_GATE_META
3434514f5e3Sopenharmony_ci
3444514f5e3Sopenharmony_ciconst GateMetaData* GateMetaBuilder::Arg(uint64_t value)
3454514f5e3Sopenharmony_ci{
3464514f5e3Sopenharmony_ci    switch (value) {
3474514f5e3Sopenharmony_ci#define DECLARE_CACHED_VALUE_CASE(VALUE)                 \
3484514f5e3Sopenharmony_ci        case VALUE: {                                    \
3494514f5e3Sopenharmony_ci            return &cache_.cachedArg##VALUE##_;          \
3504514f5e3Sopenharmony_ci        }
3514514f5e3Sopenharmony_ciCACHED_ARG_LIST(DECLARE_CACHED_VALUE_CASE)
3524514f5e3Sopenharmony_ci#undef DECLARE_CACHED_VALUE_CASE
3534514f5e3Sopenharmony_ci        default:
3544514f5e3Sopenharmony_ci            break;
3554514f5e3Sopenharmony_ci    }
3564514f5e3Sopenharmony_ci
3574514f5e3Sopenharmony_ci    auto meta = new (chunk_) OneParameterMetaData(OpCode::ARG, GateFlags::HAS_ROOT, 0, 0, 0, value);
3584514f5e3Sopenharmony_ci    meta->SetKind(GateMetaData::Kind::MUTABLE_ONE_PARAMETER);
3594514f5e3Sopenharmony_ci    return meta;
3604514f5e3Sopenharmony_ci}
3614514f5e3Sopenharmony_ci
3624514f5e3Sopenharmony_ciconst GateMetaData* GateMetaBuilder::InitVreg(uint64_t value)
3634514f5e3Sopenharmony_ci{
3644514f5e3Sopenharmony_ci    auto meta = new (chunk_) OneParameterMetaData(OpCode::INITVREG, GateFlags::HAS_ROOT, 0, 0, 0, value);
3654514f5e3Sopenharmony_ci    meta->SetKind(GateMetaData::Kind::MUTABLE_ONE_PARAMETER);
3664514f5e3Sopenharmony_ci    return meta;
3674514f5e3Sopenharmony_ci}
3684514f5e3Sopenharmony_ci}  // namespace panda::ecmascript::kungfu
369