14514f5e3Sopenharmony_ci/* 24514f5e3Sopenharmony_ci * Copyright (c) 2022 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#ifndef ECMASCRIPT_COMPILER_GATE_META_DATA_CACHE_H 174514f5e3Sopenharmony_ci#define ECMASCRIPT_COMPILER_GATE_META_DATA_CACHE_H 184514f5e3Sopenharmony_ci 194514f5e3Sopenharmony_ci#include <string> 204514f5e3Sopenharmony_ci 214514f5e3Sopenharmony_ci#include "ecmascript/compiler/bytecodes.h" 224514f5e3Sopenharmony_ci#include "ecmascript/compiler/share_opcodes.h" 234514f5e3Sopenharmony_ci#include "ecmascript/compiler/share_gate_meta_data.h" 244514f5e3Sopenharmony_ci#include "ecmascript/compiler/lcr_gate_meta_data.h" 254514f5e3Sopenharmony_ci#include "ecmascript/compiler/mcr_gate_meta_data.h" 264514f5e3Sopenharmony_ci#include "ecmascript/compiler/hcr_gate_meta_data.h" 274514f5e3Sopenharmony_ci#include "ecmascript/compiler/type.h" 284514f5e3Sopenharmony_ci#include "ecmascript/mem/chunk.h" 294514f5e3Sopenharmony_ci#include "ecmascript/mem/chunk_containers.h" 304514f5e3Sopenharmony_ci 314514f5e3Sopenharmony_ci#include "libpandabase/macros.h" 324514f5e3Sopenharmony_ci 334514f5e3Sopenharmony_cinamespace panda::ecmascript::kungfu { 344514f5e3Sopenharmony_ci 354514f5e3Sopenharmony_ci#define CACHED_VALUE_LIST(V) \ 364514f5e3Sopenharmony_ci V(1) \ 374514f5e3Sopenharmony_ci V(2) \ 384514f5e3Sopenharmony_ci V(3) \ 394514f5e3Sopenharmony_ci V(4) \ 404514f5e3Sopenharmony_ci V(5) \ 414514f5e3Sopenharmony_ci 424514f5e3Sopenharmony_ci// cached ARG list 434514f5e3Sopenharmony_ci#define CACHED_ARG_LIST(V) \ 444514f5e3Sopenharmony_ci V(0) \ 454514f5e3Sopenharmony_ci V(1) \ 464514f5e3Sopenharmony_ci V(2) \ 474514f5e3Sopenharmony_ci V(3) \ 484514f5e3Sopenharmony_ci V(4) \ 494514f5e3Sopenharmony_ci V(5) \ 504514f5e3Sopenharmony_ci V(6) \ 514514f5e3Sopenharmony_ci V(7) \ 524514f5e3Sopenharmony_ci V(8) \ 534514f5e3Sopenharmony_ci V(9) \ 544514f5e3Sopenharmony_ci V(10) \ 554514f5e3Sopenharmony_ci 564514f5e3Sopenharmony_cistruct GateMetaDataChache { 574514f5e3Sopenharmony_cistatic constexpr size_t ONE_VALUE = 1; 584514f5e3Sopenharmony_cistatic constexpr size_t TWO_VALUE = 2; 594514f5e3Sopenharmony_cistatic constexpr size_t THREE_VALUE = 3; 604514f5e3Sopenharmony_cistatic constexpr size_t FOUR_VALUE = 4; 614514f5e3Sopenharmony_cistatic constexpr size_t FIVE_VALUE = 5; 624514f5e3Sopenharmony_ci 634514f5e3Sopenharmony_ci#define DECLARE_CACHED_GATE_META(NAME, OP, R, S, D, V) \ 644514f5e3Sopenharmony_ci GateMetaData cached##NAME##_ { OpCode::OP, R, S, D, V }; 654514f5e3Sopenharmony_ci IMMUTABLE_META_DATA_CACHE_LIST(DECLARE_CACHED_GATE_META) 664514f5e3Sopenharmony_ci#undef DECLARE_CACHED_GATE_META 674514f5e3Sopenharmony_ci 684514f5e3Sopenharmony_ci#define DECLARE_CACHED_VALUE_META(VALUE) \ 694514f5e3Sopenharmony_ciGateMetaData cachedMerge##VALUE##_ { OpCode::MERGE, GateFlags::CONTROL, VALUE, 0, 0 }; \ 704514f5e3Sopenharmony_ciGateMetaData cachedLoopBegin##VALUE##_ { OpCode::LOOP_BEGIN, GateFlags::CONTROL, VALUE, 0, 0 }; \ 714514f5e3Sopenharmony_ciGateMetaData cachedDependSelector##VALUE##_ { OpCode::DEPEND_SELECTOR, GateFlags::FIXED, 1, VALUE, 0 }; 724514f5e3Sopenharmony_ciCACHED_VALUE_LIST(DECLARE_CACHED_VALUE_META) 734514f5e3Sopenharmony_ci#undef DECLARE_CACHED_VALUE_META 744514f5e3Sopenharmony_ci 754514f5e3Sopenharmony_ci#define DECLARE_CACHED_VALUE_META(VALUE) \ 764514f5e3Sopenharmony_ciOneParameterMetaData cachedArg##VALUE##_ { OpCode::ARG, GateFlags::HAS_ROOT, 0, 0, 0, VALUE }; 774514f5e3Sopenharmony_ciCACHED_ARG_LIST(DECLARE_CACHED_VALUE_META) 784514f5e3Sopenharmony_ci#undef DECLARE_CACHED_VALUE_META 794514f5e3Sopenharmony_ci 804514f5e3Sopenharmony_ci#define DECLARE_CACHED_GATE_META(NAME, OP, R, S, D, V) \ 814514f5e3Sopenharmony_ci GateMetaData cached##NAME##1_{ OpCode::OP, R, S, D, ONE_VALUE }; \ 824514f5e3Sopenharmony_ci GateMetaData cached##NAME##2_{ OpCode::OP, R, S, D, TWO_VALUE }; \ 834514f5e3Sopenharmony_ci GateMetaData cached##NAME##3_{ OpCode::OP, R, S, D, THREE_VALUE }; \ 844514f5e3Sopenharmony_ci GateMetaData cached##NAME##4_{ OpCode::OP, R, S, D, FOUR_VALUE }; \ 854514f5e3Sopenharmony_ci GateMetaData cached##NAME##5_{ OpCode::OP, R, S, D, FIVE_VALUE }; 864514f5e3Sopenharmony_ciGATE_META_DATA_LIST_WITH_VALUE_IN(DECLARE_CACHED_GATE_META) 874514f5e3Sopenharmony_ci#undef DECLARE_CACHED_GATE_META 884514f5e3Sopenharmony_ci 894514f5e3Sopenharmony_ci#define DECLARE_CACHED_GATE_META(NAME, OP, R, S, D, V) \ 904514f5e3Sopenharmony_ci OneParameterMetaData cached##NAME##1_{ OpCode::OP, R, S, D, V, ONE_VALUE }; \ 914514f5e3Sopenharmony_ci OneParameterMetaData cached##NAME##2_{ OpCode::OP, R, S, D, V, TWO_VALUE }; \ 924514f5e3Sopenharmony_ci OneParameterMetaData cached##NAME##3_{ OpCode::OP, R, S, D, V, THREE_VALUE }; \ 934514f5e3Sopenharmony_ci OneParameterMetaData cached##NAME##4_{ OpCode::OP, R, S, D, V, FOUR_VALUE }; \ 944514f5e3Sopenharmony_ci OneParameterMetaData cached##NAME##5_{ OpCode::OP, R, S, D, V, FIVE_VALUE }; 954514f5e3Sopenharmony_ciGATE_META_DATA_LIST_WITH_VALUE(DECLARE_CACHED_GATE_META) 964514f5e3Sopenharmony_ci#undef DECLARE_CACHED_GATE_META 974514f5e3Sopenharmony_ci}; 984514f5e3Sopenharmony_ci 994514f5e3Sopenharmony_ciclass GateMetaBuilder { 1004514f5e3Sopenharmony_cipublic: 1014514f5e3Sopenharmony_ci#define DECLARE_GATE_META(NAME, OP, R, S, D, V) \ 1024514f5e3Sopenharmony_ci const GateMetaData* NAME(); 1034514f5e3Sopenharmony_ci IMMUTABLE_META_DATA_CACHE_LIST(DECLARE_GATE_META) 1044514f5e3Sopenharmony_ci#undef DECLARE_GATE_META 1054514f5e3Sopenharmony_ci 1064514f5e3Sopenharmony_ci#define DECLARE_GATE_META(NAME, OP, R, S, D, V) \ 1074514f5e3Sopenharmony_ci const GateMetaData* NAME(size_t value); 1084514f5e3Sopenharmony_ci GATE_META_DATA_LIST_WITH_SIZE(DECLARE_GATE_META) 1094514f5e3Sopenharmony_ci#undef DECLARE_GATE_META 1104514f5e3Sopenharmony_ci 1114514f5e3Sopenharmony_ci#define DECLARE_GATE_META(NAME, OP, R, S, D, V) \ 1124514f5e3Sopenharmony_ci const GateMetaData* NAME(uint64_t value); 1134514f5e3Sopenharmony_ci GATE_META_DATA_LIST_WITH_ONE_PARAMETER(DECLARE_GATE_META) 1144514f5e3Sopenharmony_ci#undef DECLARE_GATE_META 1154514f5e3Sopenharmony_ci 1164514f5e3Sopenharmony_ci#define DECLARE_GATE_META(NAME, OP, R, S, D, V) \ 1174514f5e3Sopenharmony_ci const GateMetaData* NAME(uint64_t value, uint64_t pcOffset); 1184514f5e3Sopenharmony_ci GATE_META_DATA_LIST_WITH_PC_OFFSET(DECLARE_GATE_META) 1194514f5e3Sopenharmony_ci#undef DECLARE_GATE_META 1204514f5e3Sopenharmony_ci 1214514f5e3Sopenharmony_ci#define DECLARE_GATE_META_FOR_CALL(NAME, OP, R, S, D, V) \ 1224514f5e3Sopenharmony_ci const GateMetaData* NAME(uint64_t value, uint64_t pcOffset, bool noGC); 1234514f5e3Sopenharmony_ci GATE_META_DATA_LIST_FOR_CALL(DECLARE_GATE_META_FOR_CALL) 1244514f5e3Sopenharmony_ci#undef DECLARE_GATE_META_FOR_CALL 1254514f5e3Sopenharmony_ci 1264514f5e3Sopenharmony_ci#define DECLARE_GATE_META_FOR_NEW(NAME, OP, R, S, D, V) \ 1274514f5e3Sopenharmony_ci const GateMetaData* NAME(uint64_t value, uint64_t pcOffset, \ 1284514f5e3Sopenharmony_ci bool isFastCall); 1294514f5e3Sopenharmony_ci GATE_META_DATA_LIST_FOR_NEW(DECLARE_GATE_META_FOR_NEW) 1304514f5e3Sopenharmony_ci#undef DECLARE_GATE_META_FOR_NEW 1314514f5e3Sopenharmony_ci 1324514f5e3Sopenharmony_ci#define DECLARE_GATE_META(NAME, OP, R, S, D, V) \ 1334514f5e3Sopenharmony_ci const GateMetaData* NAME(uint64_t pcOffset) const; 1344514f5e3Sopenharmony_ci GATE_META_DATA_LIST_WITH_PC_OFFSET_FIXED_VALUE(DECLARE_GATE_META) 1354514f5e3Sopenharmony_ci#undef DECLARE_GATE_META 1364514f5e3Sopenharmony_ci 1374514f5e3Sopenharmony_ci#define DECLARE_GATE_META(NAME, OP, R, S, D, V) \ 1384514f5e3Sopenharmony_ci const GateMetaData* NAME(bool value); 1394514f5e3Sopenharmony_ci GATE_META_DATA_LIST_WITH_BOOL(DECLARE_GATE_META) 1404514f5e3Sopenharmony_ci#undef DECLARE_GATE_META 1414514f5e3Sopenharmony_ci 1424514f5e3Sopenharmony_ci#define DECLARE_GATE_META_WITH_BOOL_VALUE_IN(NAME, OP, R, S, D, V) \ 1434514f5e3Sopenharmony_ci const GateMetaData* NAME(size_t value, bool flag); 1444514f5e3Sopenharmony_ci GATE_META_DATA_LIST_WITH_BOOL_VALUE_IN(DECLARE_GATE_META_WITH_BOOL_VALUE_IN) 1454514f5e3Sopenharmony_ci#undef DECLARE_GATE_META_WITH_BOOL_VALUE_IN 1464514f5e3Sopenharmony_ci 1474514f5e3Sopenharmony_ci explicit GateMetaBuilder(Chunk* chunk); 1484514f5e3Sopenharmony_ci 1494514f5e3Sopenharmony_ci const GateMetaData *JSBytecode( 1504514f5e3Sopenharmony_ci size_t valuesIn, uint32_t methodId, EcmaOpcode opcode, uint32_t pcOffset, uint32_t bcIndex, GateFlags flags) 1514514f5e3Sopenharmony_ci { 1524514f5e3Sopenharmony_ci return new (chunk_) JSBytecodeMetaData(valuesIn, methodId, opcode, pcOffset, bcIndex, flags); 1534514f5e3Sopenharmony_ci } 1544514f5e3Sopenharmony_ci 1554514f5e3Sopenharmony_ci const GateMetaData* Nop() 1564514f5e3Sopenharmony_ci { 1574514f5e3Sopenharmony_ci return &cachedNop_; 1584514f5e3Sopenharmony_ci } 1594514f5e3Sopenharmony_ci 1604514f5e3Sopenharmony_ci GateMetaData* NewGateMetaData(const GateMetaData* other) 1614514f5e3Sopenharmony_ci { 1624514f5e3Sopenharmony_ci auto meta = new (chunk_) GateMetaData(other->opcode_, other->GetFlags(), 1634514f5e3Sopenharmony_ci other->statesIn_, other->dependsIn_, other->valuesIn_); 1644514f5e3Sopenharmony_ci meta->SetKind(GateMetaData::Kind::MUTABLE_WITH_SIZE); 1654514f5e3Sopenharmony_ci return meta; 1664514f5e3Sopenharmony_ci } 1674514f5e3Sopenharmony_ci 1684514f5e3Sopenharmony_ci const GateMetaData* ConstString(std::string_view str) 1694514f5e3Sopenharmony_ci { 1704514f5e3Sopenharmony_ci return new (chunk_) StringMetaData(chunk_, str); 1714514f5e3Sopenharmony_ci } 1724514f5e3Sopenharmony_ci 1734514f5e3Sopenharmony_ciprivate: 1744514f5e3Sopenharmony_ci const GateMetaDataChache cache_; 1754514f5e3Sopenharmony_ci const GateMetaData cachedNop_ { OpCode::NOP, GateFlags::NONE_FLAG, 0, 0, 0 }; 1764514f5e3Sopenharmony_ci Chunk* chunk_; 1774514f5e3Sopenharmony_ci}; 1784514f5e3Sopenharmony_ci} // namespace panda::ecmascript::kungfu 1794514f5e3Sopenharmony_ci#endif // ECMASCRIPT_COMPILER_GATE_META_DATA_CACHE_H 180