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_OPCODE_H 17 #define ECMASCRIPT_COMPILER_OPCODE_H 18 19 #include <string> 20 21 #include "ecmascript/compiler/bytecodes.h" 22 23 #include "ecmascript/compiler/lcr_opcodes.h" 24 #include "ecmascript/compiler/mcr_opcodes.h" 25 #include "ecmascript/compiler/hcr_opcodes.h" 26 27 namespace panda::ecmascript::kungfu { 28 29 #define SHARE_IMMUTABLE_META_DATA_CACHE_LIST(V) \ 30 V(CircuitRoot, CIRCUIT_ROOT, GateFlags::NONE_FLAG, 0, 0, 0) \ 31 V(StateEntry, STATE_ENTRY, GateFlags::ROOT, 0, 0, 0) \ 32 V(DependEntry, DEPEND_ENTRY, GateFlags::ROOT, 0, 0, 0) \ 33 V(OrdinaryBlock, ORDINARY_BLOCK, GateFlags::CONTROL, 1, 0, 0) \ 34 V(DefaultCase, DEFAULT_CASE, GateFlags::CONTROL, 1, 0, 0) \ 35 V(ReturnList, RETURN_LIST, GateFlags::ROOT, 0, 0, 0) \ 36 V(ArgList, ARG_LIST, GateFlags::ROOT, 0, 0, 0) \ 37 V(Dead, DEAD, GateFlags::NONE_FLAG, 0, 0, 0) \ 38 V(Throw, THROW, GateFlags::CONTROL, 1, 1, 1) \ 39 V(LoopExit, LOOP_EXIT, GateFlags::CONTROL, 1, 0, 0) \ 40 V(LoopExitDepend, LOOP_EXIT_DEPEND, GateFlags::FIXED, 1, 1, 0) \ 41 V(LoopExitValue, LOOP_EXIT_VALUE, GateFlags::FIXED, 1, 0, 1) \ 42 V(DependRelay, DEPEND_RELAY, GateFlags::FIXED, 1, 1, 0) \ 43 V(IfTrue, IF_TRUE, GateFlags::CONTROL, 1, 0, 0) \ 44 V(IfFalse, IF_FALSE, GateFlags::CONTROL, 1, 0, 0) \ 45 V(IfSuccess, IF_SUCCESS, GateFlags::CONTROL, 1, 0, 0) \ 46 V(IfException, IF_EXCEPTION, GateFlags::CONTROL, 1, 1, 0) \ 47 V(GetException, GET_EXCEPTION, GateFlags::NONE_FLAG, 1, 1, 0) \ 48 V(GetUnsharedConstPool, GET_UNSHARED_CONSTPOOL, GateFlags::NO_WRITE, 0, 0, 1) \ 49 V(GetGlobalEnv, GET_GLOBAL_ENV, GateFlags::NO_WRITE, 0, 1, 0) \ 50 V(GetSuperConstructor, GET_SUPER_CONSTRUCTOR, GateFlags::NO_WRITE, 1, 1, 1) \ 51 V(CheckSafePointAndStackOver, CHECK_SAFEPOINT_AND_STACKOVER, GateFlags::NO_WRITE, 1, 1, 0) \ 52 V(DeoptCheck, DEOPT_CHECK, GateFlags::NO_WRITE, 1, 1, 3) \ 53 V(LoopBack, LOOP_BACK, GateFlags::CONTROL, 1, 0, 0) \ 54 V(Return, RETURN, GateFlags::HAS_ROOT, 1, 1, 1) \ 55 V(ReturnVoid, RETURN_VOID, GateFlags::HAS_ROOT, 1, 1, 0) \ 56 V(StateSplit, STATE_SPLIT, GateFlags::CHECKABLE, 1, 1, 0) \ 57 V(GetEnv, GET_ENV, GateFlags::NO_WRITE, 0, 1, 1) \ 58 V(GetGlobalEnvByFunc, GET_GLOBAL_ENV_BY_FUNC, GateFlags::NO_WRITE, 0, 1, 1) \ 59 V(GetGlobalEnvByLexicalEnv, GET_GLOBAL_ENV_BY_LEXICAL_ENV, GateFlags::NO_WRITE, 0, 1, 1) 60 61 #define SHARE_INTRINSIC_IMMUTABLE_META_DATA_CACHE_LIST(V) \ 62 V(TaggedIsHeapObjectIntrinsic, TAGGED_IS_HEAPOBJECT_INTRINSIC, GateFlags::NONE_FLAG, 0, 0, 2) \ 63 V(IsStableElementsIntrinsic, IS_STABLE_ELEMENTS_INTRINSIC, GateFlags::NONE_FLAG, 0, 1, 3) \ 64 V(HasPendingExceptionIntrinsic, HAS_PENDING_EXCEPTION_INTRINSIC, GateFlags::NONE_FLAG, 0, 1, 3) \ 65 V(CheckTaggedObjectIsString, CHECK_OBJECT_IS_STRING, GateFlags::NONE_FLAG, 0, 1, 5) \ 66 V(IsJsCOWArrayIntrinsic, IS_JS_COW_ARRAY_INTRINSIC, GateFlags::NONE_FLAG, 0, 1, 6) \ 67 68 #define SHARE_GATE_META_DATA_LIST_WITH_VALUE_IN(V) \ 69 V(FrameValues, FRAME_VALUES, GateFlags::NONE_FLAG, 0, 0, value) \ 70 V(ValueSelector, VALUE_SELECTOR, GateFlags::FIXED, 1, 0, value) 71 72 #define SHARE_GATE_META_DATA_LIST_WITH_SIZE(V) \ 73 V(LoopBegin, LOOP_BEGIN, GateFlags::CONTROL, value, 0, 0) \ 74 V(Merge, MERGE, GateFlags::CONTROL, value, 0, 0) \ 75 V(DependSelector, DEPEND_SELECTOR, GateFlags::FIXED, 1, value, 0) \ 76 SHARE_GATE_META_DATA_LIST_WITH_VALUE_IN(V) 77 78 #define SHARE_GATE_META_DATA_LIST_WITH_VALUE(V) \ 79 V(Constant, CONSTANT, GateFlags::NONE_FLAG, 0, 0, 0) \ 80 V(HeapConstant, HEAP_CONSTANT, GateFlags::NONE_FLAG, 0, 0, 0) \ 81 V(FrameArgs, FRAME_ARGS, GateFlags::HAS_FRAME_STATE, 0, 0, 7) \ 82 V(FrameState, FRAME_STATE, GateFlags::HAS_FRAME_STATE, 0, 0, 2) \ 83 V(IfBranch, IF_BRANCH, GateFlags::CONTROL, 1, 0, 1) \ 84 V(RelocatableData, RELOCATABLE_DATA, GateFlags::NONE_FLAG, 0, 0, 0) \ 85 V(SwitchBranch, SWITCH_BRANCH, GateFlags::CONTROL, 1, 0, 1) \ 86 V(SwitchCase, SWITCH_CASE, GateFlags::CONTROL, 1, 0, 0) \ 87 V(GetSharedConstPool, GET_SHARED_CONSTPOOL, GateFlags::NO_WRITE, 0, 0, 1) 88 89 #define SHARE_GATE_OPCODE_LIST(V) \ 90 V(CONSTSTRING) 91 92 #define SHARE_GATE_META_DATA_LIST_WITH_ONE_PARAMETER(V) \ 93 V(Arg, ARG, GateFlags::HAS_ROOT, 0, 0, 0) \ 94 V(InitVreg, INITVREG, GateFlags::HAS_ROOT, 0, 0, 0) \ 95 SHARE_GATE_META_DATA_LIST_WITH_VALUE(V) 96 97 #define IMMUTABLE_META_DATA_CACHE_LIST(V) \ 98 SHARE_IMMUTABLE_META_DATA_CACHE_LIST(V) \ 99 LCR_IMMUTABLE_META_DATA_CACHE_LIST(V) \ 100 MCR_IMMUTABLE_META_DATA_CACHE_LIST(V) \ 101 HCR_IMMUTABLE_META_DATA_CACHE_LIST(V) \ 102 SHARE_INTRINSIC_IMMUTABLE_META_DATA_CACHE_LIST(V) 103 104 #define GATE_META_DATA_LIST_WITH_VALUE_IN(V) \ 105 SHARE_GATE_META_DATA_LIST_WITH_VALUE_IN(V) \ 106 HCR_GATE_META_DATA_LIST_WITH_VALUE_IN(V) \ 107 MCR_GATE_META_DATA_LIST_WITH_VALUE_IN(V) 108 109 #define GATE_META_DATA_LIST_WITH_PC_OFFSET(V) \ 110 MCR_GATE_META_DATA_LIST_WITH_PC_OFFSET(V) \ 111 HCR_GATE_META_DATA_LIST_WITH_PC_OFFSET(V) 112 113 #define GATE_META_DATA_LIST_FOR_CALL(V) \ 114 MCR_GATE_META_DATA_LIST_FOR_CALL(V) 115 116 #define GATE_META_DATA_LIST_FOR_NEW(V) \ 117 HCR_GATE_META_DATA_LIST_FOR_NEW(V) 118 119 #define GATE_META_DATA_LIST_WITH_PC_OFFSET_FIXED_VALUE(V) \ 120 HCR_GATE_META_DATA_LIST_WITH_PC_OFFSET_FIXED_VALUE(V) 121 122 #define GATE_META_DATA_LIST_WITH_SIZE(V) \ 123 SHARE_GATE_META_DATA_LIST_WITH_SIZE(V) \ 124 HCR_GATE_META_DATA_LIST_WITH_SIZE(V) \ 125 MCR_GATE_META_DATA_LIST_WITH_SIZE(V) 126 127 #define GATE_META_DATA_LIST_WITH_GATE_TYPE(V) \ 128 MCR_GATE_META_DATA_LIST_WITH_GATE_TYPE(V) 129 130 #define GATE_META_DATA_LIST_WITH_VALUE(V) \ 131 SHARE_GATE_META_DATA_LIST_WITH_VALUE(V) \ 132 LCR_GATE_META_DATA_LIST_WITH_VALUE(V) \ 133 MCR_GATE_META_DATA_LIST_WITH_VALUE(V) \ 134 HCR_GATE_META_DATA_LIST_WITH_VALUE(V) 135 136 #define GATE_META_DATA_LIST_WITH_ONE_PARAMETER(V) \ 137 SHARE_GATE_META_DATA_LIST_WITH_ONE_PARAMETER(V) \ 138 LCR_GATE_META_DATA_LIST_WITH_ONE_PARAMETER(V) \ 139 MCR_GATE_META_DATA_LIST_WITH_ONE_PARAMETER(V) \ 140 HCR_GATE_META_DATA_LIST_WITH_ONE_PARAMETER(V) 141 142 #define GATE_META_DATA_LIST_WITH_BOOL(V) \ 143 MCR_GATE_META_DATA_LIST_WITH_BOOL(V) 144 145 #define GATE_META_DATA_LIST_WITH_BOOL_VALUE_IN(V) \ 146 HCR_GATE_META_DATA_LIST_WITH_BOOL_VALUE_IN(V) 147 148 #define GATE_OPCODE_LIST(V) \ 149 SHARE_GATE_OPCODE_LIST(V) \ 150 HCR_GATE_OPCODE_LIST(V) 151 152 enum class OpCode : uint16_t { 153 NOP = 0, 154 #define DECLARE_GATE_OPCODE(NAME, OP, R, S, D, V) OP, 155 IMMUTABLE_META_DATA_CACHE_LIST(DECLARE_GATE_OPCODE) 156 GATE_META_DATA_LIST_WITH_SIZE(DECLARE_GATE_OPCODE) 157 GATE_META_DATA_LIST_WITH_ONE_PARAMETER(DECLARE_GATE_OPCODE) 158 GATE_META_DATA_LIST_WITH_PC_OFFSET(DECLARE_GATE_OPCODE) 159 GATE_META_DATA_LIST_FOR_CALL(DECLARE_GATE_OPCODE) 160 GATE_META_DATA_LIST_FOR_NEW(DECLARE_GATE_OPCODE) 161 GATE_META_DATA_LIST_WITH_PC_OFFSET_FIXED_VALUE(DECLARE_GATE_OPCODE) 162 GATE_META_DATA_LIST_WITH_BOOL(DECLARE_GATE_OPCODE) 163 GATE_META_DATA_LIST_WITH_BOOL_VALUE_IN(DECLARE_GATE_OPCODE) 164 #undef DECLARE_GATE_OPCODE 165 #define DECLARE_GATE_OPCODE(NAME) NAME, 166 GATE_OPCODE_LIST(DECLARE_GATE_OPCODE) 167 #undef DECLARE_GATE_OPCODE 168 }; 169 170 // Special virtual register in the OSR. 171 static constexpr size_t INIT_VRGE_GLUE = -1; 172 static constexpr size_t INIT_VRGE_ARGS = -2; 173 static constexpr size_t INIT_VRGE_ARGV = -3; 174 static constexpr size_t INIT_VRGE_FUNCTION = -4; 175 static constexpr size_t INIT_VRGE_NEW_TARGET = -5; 176 static constexpr size_t INIT_VRGE_THIS_OBJECT = -6; 177 static constexpr size_t INIT_VRGE_NUM_ARGS = -7; 178 static constexpr size_t INIT_VRGE_ENV = -8; 179 180 } 181 182 #endif // ECMASCRIPT_COMPILER_SHARE_GATE_META_DATA_H 183