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 &currentSlotRegister, 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