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