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_AARCH64_EXTENDED_ASSEMBLER_H 174514f5e3Sopenharmony_ci#define ECMASCRIPT_COMPILER_AARCH64_EXTENDED_ASSEMBLER_H 184514f5e3Sopenharmony_ci 194514f5e3Sopenharmony_ci#include "ecmascript/compiler/assembler/aarch64/assembler_aarch64.h" 204514f5e3Sopenharmony_ci#include "ecmascript/compiler/assembler/aarch64/extend_assembler.h" 214514f5e3Sopenharmony_ci#include "ecmascript/frames.h" 224514f5e3Sopenharmony_ci 234514f5e3Sopenharmony_cinamespace panda::ecmascript::aarch64 { 244514f5e3Sopenharmony_ci 254514f5e3Sopenharmony_cienum class FrameTransitionType : uint8_t { 264514f5e3Sopenharmony_ci BASELINE_TO_OTHER, 274514f5e3Sopenharmony_ci BASELINE_TO_BASELINE_CHECK, 284514f5e3Sopenharmony_ci OTHER_TO_BASELINE_CHECK, 294514f5e3Sopenharmony_ci OTHER_TO_OTHER 304514f5e3Sopenharmony_ci}; 314514f5e3Sopenharmony_ci 324514f5e3Sopenharmony_ciusing Label = panda::ecmascript::Label; 334514f5e3Sopenharmony_ciclass CommonCall { 344514f5e3Sopenharmony_cipublic: 354514f5e3Sopenharmony_ci static constexpr int FRAME_SLOT_SIZE = 8; 364514f5e3Sopenharmony_ci static constexpr int DOUBLE_SLOT_SIZE = 16; 374514f5e3Sopenharmony_ci static constexpr int TRIPLE_SLOT_SIZE = 24; 384514f5e3Sopenharmony_ci static constexpr int QUADRUPLE_SLOT_SIZE = 32; 394514f5e3Sopenharmony_ci static constexpr int QUINTUPLE_SLOT_SIZE = 40; 404514f5e3Sopenharmony_ci static constexpr int OCTUPLE_SLOT_SIZE = 64; 414514f5e3Sopenharmony_ci static constexpr int NONUPLE_SLOT_SIZE = 72; 424514f5e3Sopenharmony_ci static constexpr int FRAME_SLOT_SIZE_LOG2 = 3; 434514f5e3Sopenharmony_ci enum BuiltinsLeaveFrameArgId : unsigned {CODE_ADDRESS = 0, ENV, ARGC, ARGV}; 444514f5e3Sopenharmony_ci static inline int64_t GetStackArgOffSetToFp(unsigned argId) 454514f5e3Sopenharmony_ci { 464514f5e3Sopenharmony_ci // +--------------------------+ 474514f5e3Sopenharmony_ci // | argv0 | calltarget , newtARGET, this, .... 484514f5e3Sopenharmony_ci // +--------------------------+ --- 494514f5e3Sopenharmony_ci // | argc | ^ 504514f5e3Sopenharmony_ci // |--------------------------| arguments 514514f5e3Sopenharmony_ci // | env | | 524514f5e3Sopenharmony_ci // |--------------------------| | 534514f5e3Sopenharmony_ci // | codeAddress | | 544514f5e3Sopenharmony_ci // |--------------------------| | 554514f5e3Sopenharmony_ci // | returnAddr | | 564514f5e3Sopenharmony_ci // |--------------------------| Fixed OptimizedBuiltinLeaveFrame 574514f5e3Sopenharmony_ci // | callsiteFp | | 584514f5e3Sopenharmony_ci // |--------------------------| | 594514f5e3Sopenharmony_ci // | frameType | v 604514f5e3Sopenharmony_ci // +--------------------------+ --- 614514f5e3Sopenharmony_ci // 16 : 16 means arguments offset to fp 624514f5e3Sopenharmony_ci return 16 + static_cast<int64_t>(argId) * static_cast<int64_t>(FRAME_SLOT_SIZE); 634514f5e3Sopenharmony_ci } 644514f5e3Sopenharmony_ci static void PushUndefinedWithArgc(ExtendedAssembler *assembler, Register glue, Register argc, Register temp, 654514f5e3Sopenharmony_ci Register fp, Label *next, Label *stackOverflow); 664514f5e3Sopenharmony_ci static void PushArgsWithArgv(ExtendedAssembler *assembler, Register glue, Register argc, Register argv, 674514f5e3Sopenharmony_ci Register op, Register fp, Label *next, Label *stackOverflow); 684514f5e3Sopenharmony_ci static void PushArgsWithArgvInPair(ExtendedAssembler *assembler, Register argc, Register argv, Register padding, 694514f5e3Sopenharmony_ci Register op1, Register op2, Label *next); 704514f5e3Sopenharmony_ci static void PushAsmInterpBridgeFrame(ExtendedAssembler *assembler); 714514f5e3Sopenharmony_ci static void PopAsmInterpBridgeFrame(ExtendedAssembler *assembler); 724514f5e3Sopenharmony_ci static void StackOverflowCheck(ExtendedAssembler *assembler, Register glue, Register currentSlot, Register numArgs, 734514f5e3Sopenharmony_ci Register op, Label *stackOverflow); 744514f5e3Sopenharmony_ci static void PushLeaveFrame(ExtendedAssembler *assembler, Register glue); 754514f5e3Sopenharmony_ci static void PopLeaveFrame(ExtendedAssembler *assembler); 764514f5e3Sopenharmony_ci static void PushAsmBridgeFrame(ExtendedAssembler *assembler); 774514f5e3Sopenharmony_ci static void PopAsmBridgeFrame(ExtendedAssembler *assembler); 784514f5e3Sopenharmony_ci}; 794514f5e3Sopenharmony_ci 804514f5e3Sopenharmony_ciclass OptimizedCall : public CommonCall { 814514f5e3Sopenharmony_cipublic: 824514f5e3Sopenharmony_ci static void CallRuntime(ExtendedAssembler *assembler); 834514f5e3Sopenharmony_ci 844514f5e3Sopenharmony_ci static void JSFunctionEntry(ExtendedAssembler *assembler); 854514f5e3Sopenharmony_ci 864514f5e3Sopenharmony_ci static void OptimizedCallAndPushArgv(ExtendedAssembler *assembler); 874514f5e3Sopenharmony_ci 884514f5e3Sopenharmony_ci static void JSProxyCallInternalWithArgV(ExtendedAssembler *assembler); 894514f5e3Sopenharmony_ci 904514f5e3Sopenharmony_ci static void JSCall(ExtendedAssembler *assembler); 914514f5e3Sopenharmony_ci 924514f5e3Sopenharmony_ci static void CallOptimized(ExtendedAssembler *assembler); 934514f5e3Sopenharmony_ci 944514f5e3Sopenharmony_ci static void CallRuntimeWithArgv(ExtendedAssembler *assembler); 954514f5e3Sopenharmony_ci 964514f5e3Sopenharmony_ci static void JSCallWithArgV(ExtendedAssembler *assembler); 974514f5e3Sopenharmony_ci 984514f5e3Sopenharmony_ci static void JSCallWithArgVAndPushArgv(ExtendedAssembler *assembler); 994514f5e3Sopenharmony_ci 1004514f5e3Sopenharmony_ci static void SuperCallWithArgV(ExtendedAssembler *assembler); 1014514f5e3Sopenharmony_ci 1024514f5e3Sopenharmony_ci static void AOTCallToAsmInterBridge(ExtendedAssembler *assembler); 1034514f5e3Sopenharmony_ci 1044514f5e3Sopenharmony_ci static void FastCallToAsmInterBridge(ExtendedAssembler *assembler); 1054514f5e3Sopenharmony_ci 1064514f5e3Sopenharmony_ci static void DeoptHandlerAsm(ExtendedAssembler *assembler); 1074514f5e3Sopenharmony_ci 1084514f5e3Sopenharmony_ci static void JSCallNew(ExtendedAssembler *assembler); 1094514f5e3Sopenharmony_ci 1104514f5e3Sopenharmony_ci static void GenJSCall(ExtendedAssembler *assembler, bool isNew); 1114514f5e3Sopenharmony_ci 1124514f5e3Sopenharmony_ci static void GenJSCallWithArgV(ExtendedAssembler *assembler, int id); 1134514f5e3Sopenharmony_ciprivate: 1144514f5e3Sopenharmony_ci static void DeoptEnterAsmInterp(ExtendedAssembler *assembler); 1154514f5e3Sopenharmony_ci static void JSCallCheck(ExtendedAssembler *assembler, Register jsfunc, Register taggedValue, 1164514f5e3Sopenharmony_ci Label *nonCallable, Label *notJSFunction); 1174514f5e3Sopenharmony_ci static void ThrowNonCallableInternal(ExtendedAssembler *assembler, Register sp); 1184514f5e3Sopenharmony_ci static void JSBoundFunctionCallInternal(ExtendedAssembler *assembler, Register glue, 1194514f5e3Sopenharmony_ci Register actualArgC, Register jsfunc, int stubId); 1204514f5e3Sopenharmony_ci static void OptimizedCallAsmInterpreter(ExtendedAssembler *assembler); 1214514f5e3Sopenharmony_ci static void PushMandatoryJSArgs(ExtendedAssembler *assembler, Register jsfunc, 1224514f5e3Sopenharmony_ci Register thisObj, Register newTarget, Register currentSp); 1234514f5e3Sopenharmony_ci static void PopJSFunctionArgs(ExtendedAssembler *assembler, Register expectedNumArgs, Register actualNumArgs); 1244514f5e3Sopenharmony_ci static void PushJSFunctionEntryFrame(ExtendedAssembler *assembler, Register prevFp); 1254514f5e3Sopenharmony_ci static void PopJSFunctionEntryFrame(ExtendedAssembler *assembler, Register glue); 1264514f5e3Sopenharmony_ci static void PushOptimizedUnfoldArgVFrame(ExtendedAssembler *assembler, Register callSiteSp); 1274514f5e3Sopenharmony_ci static void PopOptimizedUnfoldArgVFrame(ExtendedAssembler *assembler); 1284514f5e3Sopenharmony_ci static void IncreaseStackForArguments(ExtendedAssembler *assembler, Register argC, Register fp, 1294514f5e3Sopenharmony_ci int64_t numExtraArgs = 0); 1304514f5e3Sopenharmony_ci static void PushOptimizedArgsConfigFrame(ExtendedAssembler *assembler); 1314514f5e3Sopenharmony_ci static void PopOptimizedArgsConfigFrame(ExtendedAssembler *assembler); 1324514f5e3Sopenharmony_ci static void JSCallInternal(ExtendedAssembler *assembler, Register jsfunc, bool isNew = false); 1334514f5e3Sopenharmony_ci static void CallBuiltinTrampoline(ExtendedAssembler *assembler); 1344514f5e3Sopenharmony_ci static void CallBuiltinConstructorStub(ExtendedAssembler *assembler, Register builtinStub, Register argv, 1354514f5e3Sopenharmony_ci Register glue, Register temp); 1364514f5e3Sopenharmony_ci friend class OptimizedFastCall; 1374514f5e3Sopenharmony_ci}; 1384514f5e3Sopenharmony_ci 1394514f5e3Sopenharmony_ciclass OptimizedFastCall : public CommonCall { 1404514f5e3Sopenharmony_cipublic: 1414514f5e3Sopenharmony_ci static void OptimizedFastCallEntry(ExtendedAssembler *assembler); 1424514f5e3Sopenharmony_ci 1434514f5e3Sopenharmony_ci static void OptimizedFastCallAndPushArgv(ExtendedAssembler *assembler); 1444514f5e3Sopenharmony_ci 1454514f5e3Sopenharmony_ci static void JSFastCallWithArgV(ExtendedAssembler *assembler); 1464514f5e3Sopenharmony_ci 1474514f5e3Sopenharmony_ci static void JSFastCallWithArgVAndPushArgv(ExtendedAssembler *assembler); 1484514f5e3Sopenharmony_ci}; 1494514f5e3Sopenharmony_ci 1504514f5e3Sopenharmony_ciclass AsmInterpreterCall : public CommonCall { 1514514f5e3Sopenharmony_cipublic: 1524514f5e3Sopenharmony_ci static void AsmInterpreterEntry(ExtendedAssembler *assembler); 1534514f5e3Sopenharmony_ci 1544514f5e3Sopenharmony_ci static void AsmInterpEntryDispatch(ExtendedAssembler *assembler); 1554514f5e3Sopenharmony_ci 1564514f5e3Sopenharmony_ci static void GeneratorReEnterAsmInterp(ExtendedAssembler *assembler); 1574514f5e3Sopenharmony_ci 1584514f5e3Sopenharmony_ci static void GeneratorReEnterAsmInterpDispatch(ExtendedAssembler *assembler); 1594514f5e3Sopenharmony_ci 1604514f5e3Sopenharmony_ci static void PushCallThisRangeAndDispatch(ExtendedAssembler *assembler); 1614514f5e3Sopenharmony_ci 1624514f5e3Sopenharmony_ci static void PushCallRangeAndDispatch(ExtendedAssembler *assembler); 1634514f5e3Sopenharmony_ci 1644514f5e3Sopenharmony_ci static void PushCallArgs3AndDispatch(ExtendedAssembler *assembler); 1654514f5e3Sopenharmony_ci 1664514f5e3Sopenharmony_ci static void PushCallArgs2AndDispatch(ExtendedAssembler *assembler); 1674514f5e3Sopenharmony_ci 1684514f5e3Sopenharmony_ci static void PushCallArg1AndDispatch(ExtendedAssembler *assembler); 1694514f5e3Sopenharmony_ci 1704514f5e3Sopenharmony_ci static void PushCallArg0AndDispatch(ExtendedAssembler *assembler); 1714514f5e3Sopenharmony_ci 1724514f5e3Sopenharmony_ci static void PushCallThisArg0AndDispatch(ExtendedAssembler *assembler); 1734514f5e3Sopenharmony_ci 1744514f5e3Sopenharmony_ci static void PushCallThisArg1AndDispatch(ExtendedAssembler *assembler); 1754514f5e3Sopenharmony_ci 1764514f5e3Sopenharmony_ci static void PushCallThisArgs2AndDispatch(ExtendedAssembler *assembler); 1774514f5e3Sopenharmony_ci 1784514f5e3Sopenharmony_ci static void PushCallThisArgs3AndDispatch(ExtendedAssembler *assembler); 1794514f5e3Sopenharmony_ci 1804514f5e3Sopenharmony_ci static void PushCallThisRangeAndDispatchNative(ExtendedAssembler *assembler); 1814514f5e3Sopenharmony_ci 1824514f5e3Sopenharmony_ci static void PushCallRangeAndDispatchNative(ExtendedAssembler *assembler); 1834514f5e3Sopenharmony_ci 1844514f5e3Sopenharmony_ci static void PushCallNewAndDispatchNative(ExtendedAssembler *assembler); 1854514f5e3Sopenharmony_ci 1864514f5e3Sopenharmony_ci static void PushNewTargetAndDispatchNative(ExtendedAssembler *assembler); 1874514f5e3Sopenharmony_ci 1884514f5e3Sopenharmony_ci static void PushCallNewAndDispatch(ExtendedAssembler *assembler); 1894514f5e3Sopenharmony_ci 1904514f5e3Sopenharmony_ci static void PushSuperCallAndDispatch(ExtendedAssembler *assembler); 1914514f5e3Sopenharmony_ci 1924514f5e3Sopenharmony_ci static void PushCallArgsAndDispatchNative(ExtendedAssembler *assembler); 1934514f5e3Sopenharmony_ci 1944514f5e3Sopenharmony_ci static void ResumeRspAndDispatch(ExtendedAssembler *assembler); 1954514f5e3Sopenharmony_ci 1964514f5e3Sopenharmony_ci static void ResumeRspAndReturn([[maybe_unused]] ExtendedAssembler *assembler); 1974514f5e3Sopenharmony_ci 1984514f5e3Sopenharmony_ci static void ResumeRspAndReturnBaseline([[maybe_unused]] ExtendedAssembler *assembler); 1994514f5e3Sopenharmony_ci 2004514f5e3Sopenharmony_ci static void ResumeCaughtFrameAndDispatch(ExtendedAssembler *assembler); 2014514f5e3Sopenharmony_ci 2024514f5e3Sopenharmony_ci static void ResumeUncaughtFrameAndReturn(ExtendedAssembler *assembler); 2034514f5e3Sopenharmony_ci 2044514f5e3Sopenharmony_ci static void ResumeRspAndRollback(ExtendedAssembler *assembler); 2054514f5e3Sopenharmony_ci 2064514f5e3Sopenharmony_ci static void CallGetter(ExtendedAssembler *assembler); 2074514f5e3Sopenharmony_ci 2084514f5e3Sopenharmony_ci static void CallSetter(ExtendedAssembler *assembler); 2094514f5e3Sopenharmony_ci 2104514f5e3Sopenharmony_ci static void CallContainersArgs2(ExtendedAssembler *assembler); 2114514f5e3Sopenharmony_ci 2124514f5e3Sopenharmony_ci static void CallContainersArgs3(ExtendedAssembler *assembler); 2134514f5e3Sopenharmony_ci 2144514f5e3Sopenharmony_ci static void CallReturnWithArgv([[maybe_unused]]ExtendedAssembler *assembler); 2154514f5e3Sopenharmony_ci 2164514f5e3Sopenharmony_ci static void ASMFastWriteBarrier(ExtendedAssembler *assembler); 2174514f5e3Sopenharmony_ci 2184514f5e3Sopenharmony_ci static void ASMWriteBarrierWithEden(ExtendedAssembler *assembler); 2194514f5e3Sopenharmony_ci 2204514f5e3Sopenharmony_ci static void ASMFastSharedWriteBarrier(ExtendedAssembler *assembler, Label& needCall); 2214514f5e3Sopenharmony_ciprivate: 2224514f5e3Sopenharmony_ci static void PushCallThis(ExtendedAssembler *assembler, JSCallMode mode, 2234514f5e3Sopenharmony_ci Label *stackOverflow, FrameTransitionType type); 2244514f5e3Sopenharmony_ci 2254514f5e3Sopenharmony_ci static Register GetThisRegsiter(ExtendedAssembler *assembler, JSCallMode mode, Register defaultRegister); 2264514f5e3Sopenharmony_ci static Register GetNewTargetRegsiter(ExtendedAssembler *assembler, JSCallMode mode, Register defaultRegister); 2274514f5e3Sopenharmony_ci 2284514f5e3Sopenharmony_ci static void PushVregs(ExtendedAssembler *assembler, Label *stackOverflow, FrameTransitionType type); 2294514f5e3Sopenharmony_ci 2304514f5e3Sopenharmony_ci static void DispatchCall(ExtendedAssembler *assembler, Register pc, Register newSp, 2314514f5e3Sopenharmony_ci Register acc = INVALID_REG); 2324514f5e3Sopenharmony_ci 2334514f5e3Sopenharmony_ci static void CallNativeInternal(ExtendedAssembler *assembler, Register nativeCode); 2344514f5e3Sopenharmony_ci 2354514f5e3Sopenharmony_ci static bool PushBuiltinFrame(ExtendedAssembler *assembler, Register glue, 2364514f5e3Sopenharmony_ci FrameType type, Register op, Register next); 2374514f5e3Sopenharmony_ci 2384514f5e3Sopenharmony_ci static void ThrowStackOverflowExceptionAndReturn(ExtendedAssembler *assembler, Register glue, Register fp, 2394514f5e3Sopenharmony_ci Register op); 2404514f5e3Sopenharmony_ci 2414514f5e3Sopenharmony_ci static void PushFrameState(ExtendedAssembler *assembler, Register prevSp, Register fp, Register currentSlot, 2424514f5e3Sopenharmony_ci Register callTarget, Register thisObj, Register method, Register pc, Register op); 2434514f5e3Sopenharmony_ci 2444514f5e3Sopenharmony_ci static void JSCallCommonEntry(ExtendedAssembler *assembler, JSCallMode mode, FrameTransitionType type); 2454514f5e3Sopenharmony_ci 2464514f5e3Sopenharmony_ci static void JSCallCommonFastPath(ExtendedAssembler *assembler, JSCallMode mode, Label *pushCallThis, 2474514f5e3Sopenharmony_ci Label *stackOverflow); 2484514f5e3Sopenharmony_ci static void JSCallCommonSlowPath(ExtendedAssembler *assembler, JSCallMode mode, 2494514f5e3Sopenharmony_ci Label *fastPathEntry, Label *pushCallThis, Label *stackOverflow); 2504514f5e3Sopenharmony_ci 2514514f5e3Sopenharmony_ci static void GetNumVregsFromCallField(ExtendedAssembler *assembler, Register callField, Register numVregs); 2524514f5e3Sopenharmony_ci 2534514f5e3Sopenharmony_ci static void GetDeclaredNumArgsFromCallField(ExtendedAssembler *assembler, Register callField, 2544514f5e3Sopenharmony_ci Register declaredNumArgs); 2554514f5e3Sopenharmony_ci 2564514f5e3Sopenharmony_ci static void SaveFpAndJumpSize(ExtendedAssembler *assembler, Immediate jumpSize); 2574514f5e3Sopenharmony_ci 2584514f5e3Sopenharmony_ci static void PushAsmInterpEntryFrame(ExtendedAssembler *assembler); 2594514f5e3Sopenharmony_ci 2604514f5e3Sopenharmony_ci static void PopAsmInterpEntryFrame(ExtendedAssembler *assembler); 2614514f5e3Sopenharmony_ci 2624514f5e3Sopenharmony_ci static void PushGeneratorFrameState(ExtendedAssembler *assembler, Register &prevSpRegister, Register &fpRegister, 2634514f5e3Sopenharmony_ci Register ¤tSlotRegister, Register &callTargetRegister, Register &thisRegister, Register &methodRegister, 2644514f5e3Sopenharmony_ci Register &contextRegister, Register &pcRegister, Register &operatorRegister); 2654514f5e3Sopenharmony_ci 2664514f5e3Sopenharmony_ci static void CallBCStub(ExtendedAssembler *assembler, Register &newSp, Register &glue, 2674514f5e3Sopenharmony_ci Register &callTarget, Register &method, Register &pc, Register &temp); 2684514f5e3Sopenharmony_ci 2694514f5e3Sopenharmony_ci static void CallNativeEntry(ExtendedAssembler *assembler); 2704514f5e3Sopenharmony_ci 2714514f5e3Sopenharmony_ci static void CallFastBuiltin(ExtendedAssembler *assembler, Label *callNativeBuiltin); 2724514f5e3Sopenharmony_ci 2734514f5e3Sopenharmony_ci static void CallNativeWithArgv(ExtendedAssembler *assembler, bool callNew, bool hasNewTarget = false); 2744514f5e3Sopenharmony_ci static void PreserveMostCall(ExtendedAssembler* assembler); 2754514f5e3Sopenharmony_ci friend class OptimizedCall; 2764514f5e3Sopenharmony_ci friend class BaselineCall; 2774514f5e3Sopenharmony_ci}; 2784514f5e3Sopenharmony_ci 2794514f5e3Sopenharmony_ciclass BaselineCall : public CommonCall { 2804514f5e3Sopenharmony_cipublic: 2814514f5e3Sopenharmony_ci /* other call baseline: need to check whether baseline code exists */ 2824514f5e3Sopenharmony_ci static void CallArg0AndCheckToBaseline(ExtendedAssembler *assembler); 2834514f5e3Sopenharmony_ci static void CallArg1AndCheckToBaseline(ExtendedAssembler *assembler); 2844514f5e3Sopenharmony_ci static void CallArgs2AndCheckToBaseline(ExtendedAssembler *assembler); 2854514f5e3Sopenharmony_ci static void CallArgs3AndCheckToBaseline(ExtendedAssembler *assembler); 2864514f5e3Sopenharmony_ci static void CallThisArg0AndCheckToBaseline(ExtendedAssembler *assembler); 2874514f5e3Sopenharmony_ci static void CallThisArg1AndCheckToBaseline(ExtendedAssembler *assembler); 2884514f5e3Sopenharmony_ci static void CallThisArgs2AndCheckToBaseline(ExtendedAssembler *assembler); 2894514f5e3Sopenharmony_ci static void CallThisArgs3AndCheckToBaseline(ExtendedAssembler *assembler); 2904514f5e3Sopenharmony_ci static void CallRangeAndCheckToBaseline(ExtendedAssembler *assembler); 2914514f5e3Sopenharmony_ci static void CallNewAndCheckToBaseline(ExtendedAssembler *assembler); 2924514f5e3Sopenharmony_ci static void SuperCallAndCheckToBaseline(ExtendedAssembler *assembler); 2934514f5e3Sopenharmony_ci static void CallThisRangeAndCheckToBaseline(ExtendedAssembler *assembler); 2944514f5e3Sopenharmony_ci /* baseline call other: need to save fp and lr */ 2954514f5e3Sopenharmony_ci static void CallArg0AndDispatchFromBaseline(ExtendedAssembler *assembler); 2964514f5e3Sopenharmony_ci static void CallArg1AndDispatchFromBaseline(ExtendedAssembler *assembler); 2974514f5e3Sopenharmony_ci static void CallArgs2AndDispatchFromBaseline(ExtendedAssembler *assembler); 2984514f5e3Sopenharmony_ci static void CallArgs3AndDispatchFromBaseline(ExtendedAssembler *assembler); 2994514f5e3Sopenharmony_ci static void CallThisArg0AndDispatchFromBaseline(ExtendedAssembler *assembler); 3004514f5e3Sopenharmony_ci static void CallThisArg1AndDispatchFromBaseline(ExtendedAssembler *assembler); 3014514f5e3Sopenharmony_ci static void CallThisArgs2AndDispatchFromBaseline(ExtendedAssembler *assembler); 3024514f5e3Sopenharmony_ci static void CallThisArgs3AndDispatchFromBaseline(ExtendedAssembler *assembler); 3034514f5e3Sopenharmony_ci static void CallRangeAndDispatchFromBaseline(ExtendedAssembler *assembler); 3044514f5e3Sopenharmony_ci static void CallNewAndDispatchFromBaseline(ExtendedAssembler *assembler); 3054514f5e3Sopenharmony_ci static void SuperCallAndDispatchFromBaseline(ExtendedAssembler *assembler); 3064514f5e3Sopenharmony_ci static void CallThisRangeAndDispatchFromBaseline(ExtendedAssembler *assembler); 3074514f5e3Sopenharmony_ci /* baseline call baseline: need to check whether baseline code exists and save fp and lr */ 3084514f5e3Sopenharmony_ci static void CallArg0AndCheckToBaselineFromBaseline(ExtendedAssembler *assembler); 3094514f5e3Sopenharmony_ci static void CallArg1AndCheckToBaselineFromBaseline(ExtendedAssembler *assembler); 3104514f5e3Sopenharmony_ci static void CallArgs2AndCheckToBaselineFromBaseline(ExtendedAssembler *assembler); 3114514f5e3Sopenharmony_ci static void CallArgs3AndCheckToBaselineFromBaseline(ExtendedAssembler *assembler); 3124514f5e3Sopenharmony_ci static void CallThisArg0AndCheckToBaselineFromBaseline(ExtendedAssembler *assembler); 3134514f5e3Sopenharmony_ci static void CallThisArg1AndCheckToBaselineFromBaseline(ExtendedAssembler *assembler); 3144514f5e3Sopenharmony_ci static void CallThisArgs2AndCheckToBaselineFromBaseline(ExtendedAssembler *assembler); 3154514f5e3Sopenharmony_ci static void CallThisArgs3AndCheckToBaselineFromBaseline(ExtendedAssembler *assembler); 3164514f5e3Sopenharmony_ci static void CallRangeAndCheckToBaselineFromBaseline(ExtendedAssembler *assembler); 3174514f5e3Sopenharmony_ci static void CallNewAndCheckToBaselineFromBaseline(ExtendedAssembler *assembler); 3184514f5e3Sopenharmony_ci static void SuperCallAndCheckToBaselineFromBaseline(ExtendedAssembler *assembler); 3194514f5e3Sopenharmony_ci static void CallThisRangeAndCheckToBaselineFromBaseline(ExtendedAssembler *assembler); 3204514f5e3Sopenharmony_ci /* get baselineBuiltinFp when baselineBuiltin call the others */ 3214514f5e3Sopenharmony_ci static void GetBaselineBuiltinFp(ExtendedAssembler *assembler); 3224514f5e3Sopenharmony_ci}; 3234514f5e3Sopenharmony_ci 3244514f5e3Sopenharmony_ci} // namespace panda::ecmascript::x64 3254514f5e3Sopenharmony_ci#endif // ECMASCRIPT_COMPILER_ASSEMBLER_MODULE_X64_H 326