2023-09-12 13:21:38 +00:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2023 Huawei Device Co., Ltd.
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef ECMASCRIPT_COMPILER_OPCODE_H
|
|
|
|
#define ECMASCRIPT_COMPILER_OPCODE_H
|
|
|
|
|
|
|
|
#include <string>
|
|
|
|
|
|
|
|
#include "ecmascript/compiler/bytecodes.h"
|
|
|
|
|
|
|
|
#include "ecmascript/compiler/lcr_opcodes.h"
|
|
|
|
#include "ecmascript/compiler/mcr_opcodes.h"
|
|
|
|
#include "ecmascript/compiler/hcr_opcodes.h"
|
|
|
|
|
|
|
|
namespace panda::ecmascript::kungfu {
|
|
|
|
|
|
|
|
#define SHARE_IMMUTABLE_META_DATA_CACHE_LIST(V) \
|
|
|
|
V(CircuitRoot, CIRCUIT_ROOT, GateFlags::NONE_FLAG, 0, 0, 0) \
|
|
|
|
V(StateEntry, STATE_ENTRY, GateFlags::ROOT, 0, 0, 0) \
|
|
|
|
V(DependEntry, DEPEND_ENTRY, GateFlags::ROOT, 0, 0, 0) \
|
|
|
|
V(OrdinaryBlock, ORDINARY_BLOCK, GateFlags::CONTROL, 1, 0, 0) \
|
|
|
|
V(DefaultCase, DEFAULT_CASE, GateFlags::CONTROL, 1, 0, 0) \
|
|
|
|
V(ReturnList, RETURN_LIST, GateFlags::ROOT, 0, 0, 0) \
|
|
|
|
V(ArgList, ARG_LIST, GateFlags::ROOT, 0, 0, 0) \
|
|
|
|
V(Dead, DEAD, GateFlags::NONE_FLAG, 0, 0, 0) \
|
|
|
|
V(Throw, THROW, GateFlags::CONTROL, 1, 1, 1) \
|
|
|
|
V(LoopExit, LOOP_EXIT, GateFlags::CONTROL, 1, 0, 0) \
|
|
|
|
V(LoopExitDepend, LOOP_EXIT_DEPEND, GateFlags::FIXED, 1, 1, 0) \
|
|
|
|
V(LoopExitValue, LOOP_EXIT_VALUE, GateFlags::FIXED, 1, 0, 1) \
|
|
|
|
V(DependRelay, DEPEND_RELAY, GateFlags::FIXED, 1, 1, 0) \
|
|
|
|
V(IfTrue, IF_TRUE, GateFlags::CONTROL, 1, 0, 0) \
|
|
|
|
V(IfFalse, IF_FALSE, GateFlags::CONTROL, 1, 0, 0) \
|
|
|
|
V(IfSuccess, IF_SUCCESS, GateFlags::CONTROL, 1, 0, 0) \
|
|
|
|
V(IfException, IF_EXCEPTION, GateFlags::CONTROL, 1, 1, 0) \
|
|
|
|
V(GetException, GET_EXCEPTION, GateFlags::NONE_FLAG, 1, 1, 0) \
|
2024-05-29 07:18:46 +00:00
|
|
|
V(GetUnsharedConstPool, GET_UNSHARED_CONSTPOOL, GateFlags::NO_WRITE, 0, 0, 1) \
|
2023-09-12 13:21:38 +00:00
|
|
|
V(GetGlobalEnv, GET_GLOBAL_ENV, GateFlags::NO_WRITE, 0, 1, 0) \
|
|
|
|
V(GetSuperConstructor, GET_SUPER_CONSTRUCTOR, GateFlags::NO_WRITE, 1, 1, 1) \
|
|
|
|
V(CheckSafePointAndStackOver, CHECK_SAFEPOINT_AND_STACKOVER, GateFlags::NO_WRITE, 1, 1, 0) \
|
2024-03-11 12:35:19 +00:00
|
|
|
V(DeoptCheck, DEOPT_CHECK, GateFlags::NO_WRITE, 1, 1, 3) \
|
2023-09-12 13:21:38 +00:00
|
|
|
V(LoopBack, LOOP_BACK, GateFlags::CONTROL, 1, 0, 0) \
|
|
|
|
V(Return, RETURN, GateFlags::HAS_ROOT, 1, 1, 1) \
|
|
|
|
V(ReturnVoid, RETURN_VOID, GateFlags::HAS_ROOT, 1, 1, 0) \
|
|
|
|
V(StateSplit, STATE_SPLIT, GateFlags::CHECKABLE, 1, 1, 0) \
|
2024-06-26 08:17:50 +00:00
|
|
|
V(GetEnv, GET_ENV, GateFlags::NO_WRITE, 0, 1, 1)
|
2023-09-12 13:21:38 +00:00
|
|
|
|
|
|
|
#define SHARE_GATE_META_DATA_LIST_WITH_VALUE_IN(V) \
|
|
|
|
V(FrameValues, FRAME_VALUES, GateFlags::NONE_FLAG, 0, 0, value) \
|
|
|
|
V(ValueSelector, VALUE_SELECTOR, GateFlags::FIXED, 1, 0, value)
|
|
|
|
|
|
|
|
#define SHARE_GATE_META_DATA_LIST_WITH_SIZE(V) \
|
2023-11-06 01:19:36 +00:00
|
|
|
V(LoopBegin, LOOP_BEGIN, GateFlags::CONTROL, value, 0, 0) \
|
2023-09-12 13:21:38 +00:00
|
|
|
V(Merge, MERGE, GateFlags::CONTROL, value, 0, 0) \
|
|
|
|
V(DependSelector, DEPEND_SELECTOR, GateFlags::FIXED, 1, value, 0) \
|
|
|
|
SHARE_GATE_META_DATA_LIST_WITH_VALUE_IN(V)
|
|
|
|
|
|
|
|
#define SHARE_GATE_META_DATA_LIST_WITH_VALUE(V) \
|
|
|
|
V(Constant, CONSTANT, GateFlags::NONE_FLAG, 0, 0, 0) \
|
2024-05-29 07:18:46 +00:00
|
|
|
V(FrameArgs, FRAME_ARGS, GateFlags::HAS_FRAME_STATE, 0, 0, 7) \
|
2023-09-12 13:21:38 +00:00
|
|
|
V(FrameState, FRAME_STATE, GateFlags::HAS_FRAME_STATE, 0, 0, 2) \
|
|
|
|
V(IfBranch, IF_BRANCH, GateFlags::CONTROL, 1, 0, 1) \
|
|
|
|
V(RelocatableData, RELOCATABLE_DATA, GateFlags::NONE_FLAG, 0, 0, 0) \
|
|
|
|
V(SwitchBranch, SWITCH_BRANCH, GateFlags::CONTROL, 1, 0, 1) \
|
2024-03-05 02:49:40 +00:00
|
|
|
V(SwitchCase, SWITCH_CASE, GateFlags::CONTROL, 1, 0, 0) \
|
2024-05-29 07:18:46 +00:00
|
|
|
V(GetSharedConstPool, GET_SHARED_CONSTPOOL, GateFlags::NO_WRITE, 0, 0, 1)
|
2023-09-12 13:21:38 +00:00
|
|
|
|
|
|
|
#define SHARE_GATE_OPCODE_LIST(V) \
|
|
|
|
V(CONSTSTRING)
|
|
|
|
|
|
|
|
#define SHARE_GATE_META_DATA_LIST_WITH_ONE_PARAMETER(V) \
|
|
|
|
V(Arg, ARG, GateFlags::HAS_ROOT, 0, 0, 0) \
|
2024-03-19 06:57:29 +00:00
|
|
|
V(InitVreg, INITVREG, GateFlags::HAS_ROOT, 0, 0, 0) \
|
2023-09-12 13:21:38 +00:00
|
|
|
SHARE_GATE_META_DATA_LIST_WITH_VALUE(V)
|
|
|
|
|
|
|
|
#define IMMUTABLE_META_DATA_CACHE_LIST(V) \
|
|
|
|
SHARE_IMMUTABLE_META_DATA_CACHE_LIST(V) \
|
|
|
|
LCR_IMMUTABLE_META_DATA_CACHE_LIST(V) \
|
|
|
|
MCR_IMMUTABLE_META_DATA_CACHE_LIST(V) \
|
|
|
|
HCR_IMMUTABLE_META_DATA_CACHE_LIST(V)
|
|
|
|
|
|
|
|
#define GATE_META_DATA_LIST_WITH_VALUE_IN(V) \
|
|
|
|
SHARE_GATE_META_DATA_LIST_WITH_VALUE_IN(V) \
|
2023-12-28 07:54:38 +00:00
|
|
|
HCR_GATE_META_DATA_LIST_WITH_VALUE_IN(V) \
|
|
|
|
MCR_GATE_META_DATA_LIST_WITH_VALUE_IN(V)
|
2023-09-12 13:21:38 +00:00
|
|
|
|
|
|
|
#define GATE_META_DATA_LIST_WITH_PC_OFFSET(V) \
|
|
|
|
MCR_GATE_META_DATA_LIST_WITH_PC_OFFSET(V) \
|
|
|
|
HCR_GATE_META_DATA_LIST_WITH_PC_OFFSET(V)
|
|
|
|
|
|
|
|
#define GATE_META_DATA_LIST_FOR_CALL(V) \
|
|
|
|
MCR_GATE_META_DATA_LIST_FOR_CALL(V)
|
|
|
|
|
2024-04-15 12:52:48 +00:00
|
|
|
#define GATE_META_DATA_LIST_FOR_NEW(V) \
|
|
|
|
HCR_GATE_META_DATA_LIST_FOR_NEW(V)
|
|
|
|
|
2023-09-12 13:21:38 +00:00
|
|
|
#define GATE_META_DATA_LIST_WITH_PC_OFFSET_FIXED_VALUE(V) \
|
|
|
|
HCR_GATE_META_DATA_LIST_WITH_PC_OFFSET_FIXED_VALUE(V)
|
|
|
|
|
|
|
|
#define GATE_META_DATA_LIST_WITH_SIZE(V) \
|
|
|
|
SHARE_GATE_META_DATA_LIST_WITH_SIZE(V) \
|
2023-12-28 07:54:38 +00:00
|
|
|
HCR_GATE_META_DATA_LIST_WITH_SIZE(V) \
|
|
|
|
MCR_GATE_META_DATA_LIST_WITH_SIZE(V)
|
2023-09-12 13:21:38 +00:00
|
|
|
|
|
|
|
#define GATE_META_DATA_LIST_WITH_GATE_TYPE(V) \
|
|
|
|
MCR_GATE_META_DATA_LIST_WITH_GATE_TYPE(V)
|
|
|
|
|
|
|
|
#define GATE_META_DATA_LIST_WITH_VALUE(V) \
|
|
|
|
SHARE_GATE_META_DATA_LIST_WITH_VALUE(V) \
|
|
|
|
LCR_GATE_META_DATA_LIST_WITH_VALUE(V) \
|
|
|
|
MCR_GATE_META_DATA_LIST_WITH_VALUE(V) \
|
|
|
|
HCR_GATE_META_DATA_LIST_WITH_VALUE(V)
|
|
|
|
|
|
|
|
#define GATE_META_DATA_LIST_WITH_ONE_PARAMETER(V) \
|
|
|
|
SHARE_GATE_META_DATA_LIST_WITH_ONE_PARAMETER(V) \
|
|
|
|
LCR_GATE_META_DATA_LIST_WITH_ONE_PARAMETER(V) \
|
|
|
|
MCR_GATE_META_DATA_LIST_WITH_ONE_PARAMETER(V) \
|
|
|
|
HCR_GATE_META_DATA_LIST_WITH_ONE_PARAMETER(V)
|
|
|
|
|
|
|
|
#define GATE_META_DATA_LIST_WITH_BOOL(V) \
|
|
|
|
MCR_GATE_META_DATA_LIST_WITH_BOOL(V)
|
|
|
|
|
|
|
|
#define GATE_META_DATA_LIST_WITH_BOOL_VALUE_IN(V) \
|
2023-09-16 01:30:27 +00:00
|
|
|
HCR_GATE_META_DATA_LIST_WITH_BOOL_VALUE_IN(V)
|
2023-09-12 13:21:38 +00:00
|
|
|
|
|
|
|
#define GATE_OPCODE_LIST(V) \
|
|
|
|
SHARE_GATE_OPCODE_LIST(V) \
|
|
|
|
HCR_GATE_OPCODE_LIST(V)
|
|
|
|
|
2024-04-02 03:39:00 +00:00
|
|
|
enum class OpCode : uint16_t {
|
2023-09-12 13:21:38 +00:00
|
|
|
NOP = 0,
|
|
|
|
#define DECLARE_GATE_OPCODE(NAME, OP, R, S, D, V) OP,
|
|
|
|
IMMUTABLE_META_DATA_CACHE_LIST(DECLARE_GATE_OPCODE)
|
|
|
|
GATE_META_DATA_LIST_WITH_SIZE(DECLARE_GATE_OPCODE)
|
|
|
|
GATE_META_DATA_LIST_WITH_ONE_PARAMETER(DECLARE_GATE_OPCODE)
|
|
|
|
GATE_META_DATA_LIST_WITH_PC_OFFSET(DECLARE_GATE_OPCODE)
|
|
|
|
GATE_META_DATA_LIST_FOR_CALL(DECLARE_GATE_OPCODE)
|
2024-04-15 12:52:48 +00:00
|
|
|
GATE_META_DATA_LIST_FOR_NEW(DECLARE_GATE_OPCODE)
|
2023-09-12 13:21:38 +00:00
|
|
|
GATE_META_DATA_LIST_WITH_PC_OFFSET_FIXED_VALUE(DECLARE_GATE_OPCODE)
|
|
|
|
GATE_META_DATA_LIST_WITH_BOOL(DECLARE_GATE_OPCODE)
|
|
|
|
GATE_META_DATA_LIST_WITH_BOOL_VALUE_IN(DECLARE_GATE_OPCODE)
|
|
|
|
#undef DECLARE_GATE_OPCODE
|
|
|
|
#define DECLARE_GATE_OPCODE(NAME) NAME,
|
|
|
|
GATE_OPCODE_LIST(DECLARE_GATE_OPCODE)
|
|
|
|
#undef DECLARE_GATE_OPCODE
|
|
|
|
};
|
|
|
|
|
2024-03-19 06:57:29 +00:00
|
|
|
// Special virtual register in the OSR.
|
|
|
|
static constexpr size_t INIT_VRGE_GLUE = -1;
|
|
|
|
static constexpr size_t INIT_VRGE_ARGS = -2;
|
2024-03-29 09:05:46 +00:00
|
|
|
static constexpr size_t INIT_VRGE_ARGV = -3;
|
|
|
|
static constexpr size_t INIT_VRGE_FUNCTION = -4;
|
|
|
|
static constexpr size_t INIT_VRGE_NEW_TARGET = -5;
|
|
|
|
static constexpr size_t INIT_VRGE_THIS_OBJECT = -6;
|
|
|
|
static constexpr size_t INIT_VRGE_NUM_ARGS = -7;
|
|
|
|
static constexpr size_t INIT_VRGE_ENV = -8;
|
2024-03-19 06:57:29 +00:00
|
|
|
|
2023-09-12 13:21:38 +00:00
|
|
|
}
|
|
|
|
|
2023-11-17 09:52:49 +00:00
|
|
|
#endif // ECMASCRIPT_COMPILER_SHARE_GATE_META_DATA_H
|