14514f5e3Sopenharmony_ci/*
24514f5e3Sopenharmony_ci * Copyright (c) 2024 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#include "ecmascript/compiler/call_stub_builder.h"
174514f5e3Sopenharmony_ci
184514f5e3Sopenharmony_ci#include "ecmascript/compiler/assembler_module.h"
194514f5e3Sopenharmony_ci#include "ecmascript/compiler/stub_builder-inl.h"
204514f5e3Sopenharmony_ci
214514f5e3Sopenharmony_cinamespace panda::ecmascript::kungfu {
224514f5e3Sopenharmony_ci
234514f5e3Sopenharmony_civoid CallStubBuilder::JSCallDispatchForBaseline(Label *exit, Label *noNeedCheckException)
244514f5e3Sopenharmony_ci{
254514f5e3Sopenharmony_ci    this->isForBaseline_ = true;
264514f5e3Sopenharmony_ci    auto env = GetEnvironment();
274514f5e3Sopenharmony_ci    baselineBuiltinFp_ = CallNGCRuntime(glue_, RTSTUB_ID(GetBaselineBuiltinFp), {glue_});
284514f5e3Sopenharmony_ci
294514f5e3Sopenharmony_ci    // 1. call initialize
304514f5e3Sopenharmony_ci    Label funcIsHeapObject(env);
314514f5e3Sopenharmony_ci    Label funcIsCallable(env);
324514f5e3Sopenharmony_ci    Label funcNotCallable(env);
334514f5e3Sopenharmony_ci    JSCallInit(exit, &funcIsHeapObject, &funcIsCallable, &funcNotCallable);
344514f5e3Sopenharmony_ci
354514f5e3Sopenharmony_ci    // 2. dispatch
364514f5e3Sopenharmony_ci    Label methodIsNative(env);
374514f5e3Sopenharmony_ci    Label methodNotNative(env);
384514f5e3Sopenharmony_ci    BRANCH(Int64NotEqual(Int64And(callField_, isNativeMask_), Int64(0)), &methodIsNative, &methodNotNative);
394514f5e3Sopenharmony_ci
404514f5e3Sopenharmony_ci    // 3. call native
414514f5e3Sopenharmony_ci    Bind(&methodIsNative);
424514f5e3Sopenharmony_ci    {
434514f5e3Sopenharmony_ci        JSCallNative(exit);
444514f5e3Sopenharmony_ci    }
454514f5e3Sopenharmony_ci
464514f5e3Sopenharmony_ci    // 4. call nonNative
474514f5e3Sopenharmony_ci    Bind(&methodNotNative);
484514f5e3Sopenharmony_ci    {
494514f5e3Sopenharmony_ci        JSCallJSFunction(exit, noNeedCheckException);
504514f5e3Sopenharmony_ci    }
514514f5e3Sopenharmony_ci}
524514f5e3Sopenharmony_ci
534514f5e3Sopenharmony_ciGateRef CallStubBuilder::JSCallDispatch()
544514f5e3Sopenharmony_ci{
554514f5e3Sopenharmony_ci    this->isForBaseline_ = false;
564514f5e3Sopenharmony_ci    auto env = GetEnvironment();
574514f5e3Sopenharmony_ci    Label entryPass(env);
584514f5e3Sopenharmony_ci    Label exit(env);
594514f5e3Sopenharmony_ci    env->SubCfgEntry(&entryPass);
604514f5e3Sopenharmony_ci    DEFVARIABLE(result, VariableType::JS_ANY(), Exception());
614514f5e3Sopenharmony_ci
624514f5e3Sopenharmony_ci    this->result_ = &result;
634514f5e3Sopenharmony_ci
644514f5e3Sopenharmony_ci    // 1. call initialize
654514f5e3Sopenharmony_ci    Label funcIsHeapObject(env);
664514f5e3Sopenharmony_ci    Label funcIsCallable(env);
674514f5e3Sopenharmony_ci    Label funcNotCallable(env);
684514f5e3Sopenharmony_ci    JSCallInit(&exit, &funcIsHeapObject, &funcIsCallable, &funcNotCallable);
694514f5e3Sopenharmony_ci
704514f5e3Sopenharmony_ci    // 2. dispatch
714514f5e3Sopenharmony_ci    Label methodIsNative(env);
724514f5e3Sopenharmony_ci    Label methodNotNative(env);
734514f5e3Sopenharmony_ci    BRANCH(Int64NotEqual(Int64And(callField_, isNativeMask_), Int64(0)), &methodIsNative, &methodNotNative);
744514f5e3Sopenharmony_ci
754514f5e3Sopenharmony_ci    // 3. call native
764514f5e3Sopenharmony_ci    Bind(&methodIsNative);
774514f5e3Sopenharmony_ci    {
784514f5e3Sopenharmony_ci        JSCallNative(&exit);
794514f5e3Sopenharmony_ci    }
804514f5e3Sopenharmony_ci    // 4. call nonNative
814514f5e3Sopenharmony_ci    Bind(&methodNotNative);
824514f5e3Sopenharmony_ci    {
834514f5e3Sopenharmony_ci        JSCallJSFunction(&exit);
844514f5e3Sopenharmony_ci    }
854514f5e3Sopenharmony_ci
864514f5e3Sopenharmony_ci    Bind(&exit);
874514f5e3Sopenharmony_ci    auto ret = *result;
884514f5e3Sopenharmony_ci    env->SubCfgExit();
894514f5e3Sopenharmony_ci    return ret;
904514f5e3Sopenharmony_ci}
914514f5e3Sopenharmony_ci
924514f5e3Sopenharmony_civoid CallStubBuilder::JSCallInit(Label *exit, Label *funcIsHeapObject, Label *funcIsCallable, Label *funcNotCallable)
934514f5e3Sopenharmony_ci{
944514f5e3Sopenharmony_ci    if (!isForBaseline_) {
954514f5e3Sopenharmony_ci        // save pc
964514f5e3Sopenharmony_ci        SavePcIfNeeded(glue_);
974514f5e3Sopenharmony_ci    }
984514f5e3Sopenharmony_ci#if ECMASCRIPT_ENABLE_FUNCTION_CALL_TIMER
994514f5e3Sopenharmony_ci    CallNGCRuntime(glue_, RTSTUB_ID(StartCallTimer, { glue_, func_, False()}));
1004514f5e3Sopenharmony_ci#endif
1014514f5e3Sopenharmony_ci    if (checkIsCallable_) {
1024514f5e3Sopenharmony_ci        BRANCH(TaggedIsHeapObject(func_), funcIsHeapObject, funcNotCallable);
1034514f5e3Sopenharmony_ci        Bind(funcIsHeapObject);
1044514f5e3Sopenharmony_ci        GateRef hclass = LoadHClass(func_);
1054514f5e3Sopenharmony_ci        bitfield_ = Load(VariableType::INT32(), hclass, IntPtr(JSHClass::BIT_FIELD_OFFSET));
1064514f5e3Sopenharmony_ci        BRANCH(IsCallableFromBitField(bitfield_), funcIsCallable, funcNotCallable);
1074514f5e3Sopenharmony_ci        Bind(funcNotCallable);
1084514f5e3Sopenharmony_ci        {
1094514f5e3Sopenharmony_ci            CallRuntime(glue_, RTSTUB_ID(ThrowNotCallableException), {});
1104514f5e3Sopenharmony_ci            Jump(exit);
1114514f5e3Sopenharmony_ci        }
1124514f5e3Sopenharmony_ci        Bind(funcIsCallable);
1134514f5e3Sopenharmony_ci    } else {
1144514f5e3Sopenharmony_ci        GateRef hclass = LoadHClass(func_);
1154514f5e3Sopenharmony_ci        bitfield_ = Load(VariableType::INT32(), hclass, IntPtr(JSHClass::BIT_FIELD_OFFSET));
1164514f5e3Sopenharmony_ci    }
1174514f5e3Sopenharmony_ci    method_ = GetMethodFromJSFunctionOrProxy(func_);
1184514f5e3Sopenharmony_ci    callField_ = GetCallFieldFromMethod(method_);
1194514f5e3Sopenharmony_ci    isNativeMask_ = Int64(static_cast<uint64_t>(1) << MethodLiteral::IsNativeBit::START_BIT);
1204514f5e3Sopenharmony_ci}
1214514f5e3Sopenharmony_ci
1224514f5e3Sopenharmony_civoid CallStubBuilder::JSCallNative(Label *exit)
1234514f5e3Sopenharmony_ci{
1244514f5e3Sopenharmony_ci    HandleProfileNativeCall();
1254514f5e3Sopenharmony_ci    GateRef ret;
1264514f5e3Sopenharmony_ci    nativeCode_ = Load(VariableType::NATIVE_POINTER(), method_,
1274514f5e3Sopenharmony_ci        IntPtr(Method::NATIVE_POINTER_OR_BYTECODE_ARRAY_OFFSET));
1284514f5e3Sopenharmony_ci    newTarget_ = Undefined();
1294514f5e3Sopenharmony_ci    thisValue_ = Undefined();
1304514f5e3Sopenharmony_ci    numArgs_ = Int32Add(actualNumArgs_, Int32(NUM_MANDATORY_JSFUNC_ARGS));
1314514f5e3Sopenharmony_ci    GateRef numArgsKeeper;
1324514f5e3Sopenharmony_ci
1334514f5e3Sopenharmony_ci    int idxForNative = PrepareIdxForNative();
1344514f5e3Sopenharmony_ci    std::vector<GateRef> argsForNative = PrepareArgsForNative();
1354514f5e3Sopenharmony_ci    auto env = GetEnvironment();
1364514f5e3Sopenharmony_ci    Label notFastBuiltins(env);
1374514f5e3Sopenharmony_ci    switch (callArgs_.mode) {
1384514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG0:
1394514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG1:
1404514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG2:
1414514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG3:
1424514f5e3Sopenharmony_ci        case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV:
1434514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_CONSTRUCTOR_WITH_ARGV:
1444514f5e3Sopenharmony_ci            numArgsKeeper = numArgs_;
1454514f5e3Sopenharmony_ci            CallFastBuiltin(&notFastBuiltins, exit);
1464514f5e3Sopenharmony_ci            Bind(&notFastBuiltins);
1474514f5e3Sopenharmony_ci            numArgs_ = numArgsKeeper;
1484514f5e3Sopenharmony_ci            [[fallthrough]];
1494514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG0:
1504514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG1:
1514514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG2:
1524514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG3:
1534514f5e3Sopenharmony_ci        case JSCallMode::CALL_WITH_ARGV:
1544514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_WITH_ARGV:
1554514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG0:
1564514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG1:
1574514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG2:
1584514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG3:
1594514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_WITH_ARGV:
1604514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_THIS_WITH_ARGV:
1614514f5e3Sopenharmony_ci        case JSCallMode::CALL_GETTER:
1624514f5e3Sopenharmony_ci        case JSCallMode::CALL_SETTER:
1634514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG2_WITH_RETURN:
1644514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG3_WITH_RETURN:
1654514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARGV_WITH_RETURN:
1664514f5e3Sopenharmony_ci            ret = CallNGCRuntime(glue_, idxForNative, argsForNative, hir_);
1674514f5e3Sopenharmony_ci            break;
1684514f5e3Sopenharmony_ci        case JSCallMode::SUPER_CALL_WITH_ARGV:
1694514f5e3Sopenharmony_ci        case JSCallMode::SUPER_CALL_SPREAD_WITH_ARGV:
1704514f5e3Sopenharmony_ci            ret = CallRuntime(glue_, idxForNative, argsForNative);
1714514f5e3Sopenharmony_ci            break;
1724514f5e3Sopenharmony_ci        default:
1734514f5e3Sopenharmony_ci            LOG_ECMA(FATAL) << "this branch is unreachable";
1744514f5e3Sopenharmony_ci            UNREACHABLE();
1754514f5e3Sopenharmony_ci    }
1764514f5e3Sopenharmony_ci    result_->WriteVariable(ret);
1774514f5e3Sopenharmony_ci    Jump(exit);
1784514f5e3Sopenharmony_ci}
1794514f5e3Sopenharmony_ci
1804514f5e3Sopenharmony_civoid CallStubBuilder::JSCallJSFunction(Label *exit, Label *noNeedCheckException)
1814514f5e3Sopenharmony_ci{
1824514f5e3Sopenharmony_ci    auto env = GetEnvironment();
1834514f5e3Sopenharmony_ci
1844514f5e3Sopenharmony_ci    Label funcIsClassConstructor(env);
1854514f5e3Sopenharmony_ci    Label funcNotClassConstructor(env);
1864514f5e3Sopenharmony_ci    Label methodNotAot(env);
1874514f5e3Sopenharmony_ci
1884514f5e3Sopenharmony_ci    if (!AssemblerModule::IsCallNew(callArgs_.mode)) {
1894514f5e3Sopenharmony_ci        BRANCH(IsClassConstructorFromBitField(bitfield_), &funcIsClassConstructor, &funcNotClassConstructor);
1904514f5e3Sopenharmony_ci        Bind(&funcIsClassConstructor);
1914514f5e3Sopenharmony_ci        {
1924514f5e3Sopenharmony_ci            CallRuntime(glue_, RTSTUB_ID(ThrowCallConstructorException), {});
1934514f5e3Sopenharmony_ci            Jump(exit);
1944514f5e3Sopenharmony_ci        }
1954514f5e3Sopenharmony_ci        Bind(&funcNotClassConstructor);
1964514f5e3Sopenharmony_ci    }
1974514f5e3Sopenharmony_ci    HandleProfileCall();
1984514f5e3Sopenharmony_ci    if (isForBaseline_ && env->IsBaselineBuiltin()) {
1994514f5e3Sopenharmony_ci        sp_ = Argument(static_cast<size_t>(BaselineCallInputs::SP));
2004514f5e3Sopenharmony_ci    }
2014514f5e3Sopenharmony_ci    if (!isForBaseline_ && env->IsAsmInterp()) {
2024514f5e3Sopenharmony_ci        sp_ = Argument(static_cast<size_t>(InterpreterHandlerInputs::SP));
2034514f5e3Sopenharmony_ci    }
2044514f5e3Sopenharmony_ci    Label methodisAot(env);
2054514f5e3Sopenharmony_ci    Label funcHasBaselineCode(env);
2064514f5e3Sopenharmony_ci    Label funcCheckBaselineCode(env);
2074514f5e3Sopenharmony_ci    Label checkIsBaselineCompiling(env);
2084514f5e3Sopenharmony_ci    Label methodIsFastCall(env);
2094514f5e3Sopenharmony_ci    Label methodNotFastCall(env);
2104514f5e3Sopenharmony_ci    Label checkAot(env);
2114514f5e3Sopenharmony_ci    {
2124514f5e3Sopenharmony_ci        newTarget_ = Undefined();
2134514f5e3Sopenharmony_ci        thisValue_ = Undefined();
2144514f5e3Sopenharmony_ci        realNumArgs_ = Int64Add(ZExtInt32ToInt64(actualNumArgs_), Int64(NUM_MANDATORY_JSFUNC_ARGS));
2154514f5e3Sopenharmony_ci        BRANCH(IsJsProxy(func_), &methodNotAot, &checkAot);
2164514f5e3Sopenharmony_ci        Bind(&checkAot);
2174514f5e3Sopenharmony_ci        BRANCH(JudgeAotAndFastCall(func_, CircuitBuilder::JudgeMethodType::HAS_AOT_FASTCALL), &methodIsFastCall,
2184514f5e3Sopenharmony_ci            &methodNotFastCall);
2194514f5e3Sopenharmony_ci        Bind(&methodIsFastCall);
2204514f5e3Sopenharmony_ci        {
2214514f5e3Sopenharmony_ci            JSFastAotCall(exit);
2224514f5e3Sopenharmony_ci        }
2234514f5e3Sopenharmony_ci
2244514f5e3Sopenharmony_ci        Bind(&methodNotFastCall);
2254514f5e3Sopenharmony_ci        BRANCH(JudgeAotAndFastCall(func_, CircuitBuilder::JudgeMethodType::HAS_AOT), &methodisAot,
2264514f5e3Sopenharmony_ci            &funcCheckBaselineCode);
2274514f5e3Sopenharmony_ci        Bind(&methodisAot);
2284514f5e3Sopenharmony_ci        {
2294514f5e3Sopenharmony_ci            JSSlowAotCall(exit);
2304514f5e3Sopenharmony_ci        }
2314514f5e3Sopenharmony_ci
2324514f5e3Sopenharmony_ci        Bind(&funcCheckBaselineCode);
2334514f5e3Sopenharmony_ci        GateRef baselineCodeOffset = IntPtr(JSFunction::BASELINECODE_OFFSET);
2344514f5e3Sopenharmony_ci        GateRef baselineCode = Load(VariableType::JS_POINTER(), func_, baselineCodeOffset);
2354514f5e3Sopenharmony_ci
2364514f5e3Sopenharmony_ci        Branch(NotEqual(baselineCode, Undefined()), &checkIsBaselineCompiling, &methodNotAot);
2374514f5e3Sopenharmony_ci        Bind(&checkIsBaselineCompiling);
2384514f5e3Sopenharmony_ci        Branch(NotEqual(baselineCode, Hole()), &funcHasBaselineCode, &methodNotAot);
2394514f5e3Sopenharmony_ci
2404514f5e3Sopenharmony_ci        Bind(&funcHasBaselineCode);
2414514f5e3Sopenharmony_ci        {
2424514f5e3Sopenharmony_ci            GateRef res = result_->Value();
2434514f5e3Sopenharmony_ci            JSCallAsmInterpreter(true, &methodNotAot, exit, noNeedCheckException);
2444514f5e3Sopenharmony_ci            if (!isForBaseline_) {
2454514f5e3Sopenharmony_ci                ASSERT(CheckResultValueChangedWithReturn(res));
2464514f5e3Sopenharmony_ci            }
2474514f5e3Sopenharmony_ci            (void) res;
2484514f5e3Sopenharmony_ci        }
2494514f5e3Sopenharmony_ci
2504514f5e3Sopenharmony_ci        Bind(&methodNotAot);
2514514f5e3Sopenharmony_ci        {
2524514f5e3Sopenharmony_ci            JSCallAsmInterpreter(false, &methodNotAot, exit, noNeedCheckException);
2534514f5e3Sopenharmony_ci        }
2544514f5e3Sopenharmony_ci    }
2554514f5e3Sopenharmony_ci}
2564514f5e3Sopenharmony_ci
2574514f5e3Sopenharmony_civoid CallStubBuilder::JSFastAotCall(Label *exit)
2584514f5e3Sopenharmony_ci{
2594514f5e3Sopenharmony_ci    auto env = GetEnvironment();
2604514f5e3Sopenharmony_ci    Label fastCall(env);
2614514f5e3Sopenharmony_ci    Label fastCallBridge(env);
2624514f5e3Sopenharmony_ci    isFast_ = true;
2634514f5e3Sopenharmony_ci
2644514f5e3Sopenharmony_ci    GateRef expectedNum = Int64And(Int64LSR(callField_, Int64(MethodLiteral::NumArgsBits::START_BIT)),
2654514f5e3Sopenharmony_ci        Int64((1LU << MethodLiteral::NumArgsBits::SIZE) - 1));
2664514f5e3Sopenharmony_ci    GateRef expectedArgc = Int64Add(expectedNum, Int64(NUM_MANDATORY_JSFUNC_ARGS));
2674514f5e3Sopenharmony_ci    BRANCH(Int64Equal(expectedArgc, realNumArgs_), &fastCall, &fastCallBridge);
2684514f5e3Sopenharmony_ci    GateRef code;
2694514f5e3Sopenharmony_ci    Bind(&fastCall);
2704514f5e3Sopenharmony_ci    {
2714514f5e3Sopenharmony_ci        isBridge_ = false;
2724514f5e3Sopenharmony_ci        code = GetAotCodeAddr(func_);
2734514f5e3Sopenharmony_ci        CallBridge(code, expectedNum, exit);
2744514f5e3Sopenharmony_ci    }
2754514f5e3Sopenharmony_ci    Bind(&fastCallBridge);
2764514f5e3Sopenharmony_ci    {
2774514f5e3Sopenharmony_ci        isBridge_ = true;
2784514f5e3Sopenharmony_ci        CallBridge(code, expectedNum, exit);
2794514f5e3Sopenharmony_ci    }
2804514f5e3Sopenharmony_ci}
2814514f5e3Sopenharmony_ci
2824514f5e3Sopenharmony_civoid CallStubBuilder::JSSlowAotCall(Label *exit)
2834514f5e3Sopenharmony_ci{
2844514f5e3Sopenharmony_ci    auto env = GetEnvironment();
2854514f5e3Sopenharmony_ci    Label slowCall(env);
2864514f5e3Sopenharmony_ci    Label slowCallBridge(env);
2874514f5e3Sopenharmony_ci    isFast_ = false;
2884514f5e3Sopenharmony_ci
2894514f5e3Sopenharmony_ci    GateRef expectedNum = Int64And(Int64LSR(callField_, Int64(MethodLiteral::NumArgsBits::START_BIT)),
2904514f5e3Sopenharmony_ci        Int64((1LU << MethodLiteral::NumArgsBits::SIZE) - 1));
2914514f5e3Sopenharmony_ci    GateRef expectedArgc = Int64Add(expectedNum, Int64(NUM_MANDATORY_JSFUNC_ARGS));
2924514f5e3Sopenharmony_ci    BRANCH(Int64Equal(expectedArgc, realNumArgs_), &slowCall, &slowCallBridge);
2934514f5e3Sopenharmony_ci    GateRef code;
2944514f5e3Sopenharmony_ci    Bind(&slowCall);
2954514f5e3Sopenharmony_ci    {
2964514f5e3Sopenharmony_ci        isBridge_ = false;
2974514f5e3Sopenharmony_ci        code = GetAotCodeAddr(func_);
2984514f5e3Sopenharmony_ci        CallBridge(code, expectedNum, exit);
2994514f5e3Sopenharmony_ci    }
3004514f5e3Sopenharmony_ci    Bind(&slowCallBridge);
3014514f5e3Sopenharmony_ci    {
3024514f5e3Sopenharmony_ci        isBridge_ = true;
3034514f5e3Sopenharmony_ci        CallBridge(code, expectedNum, exit);
3044514f5e3Sopenharmony_ci    }
3054514f5e3Sopenharmony_ci}
3064514f5e3Sopenharmony_ci
3074514f5e3Sopenharmony_ciGateRef CallStubBuilder::CallConstructorBridge(const int idxForAot, const std::vector<GateRef> &argsForAot)
3084514f5e3Sopenharmony_ci{
3094514f5e3Sopenharmony_ci    GateRef ret;
3104514f5e3Sopenharmony_ci    switch (callArgs_.mode) {
3114514f5e3Sopenharmony_ci        case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV:
3124514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_CONSTRUCTOR_WITH_ARGV:
3134514f5e3Sopenharmony_ci            ret = CallNGCRuntime(glue_, idxForAot, argsForAot);
3144514f5e3Sopenharmony_ci            ret = ConstructorCheck(glue_, func_, ret, callArgs_.callConstructorArgs.thisObj);
3154514f5e3Sopenharmony_ci            break;
3164514f5e3Sopenharmony_ci        case JSCallMode::SUPER_CALL_WITH_ARGV:
3174514f5e3Sopenharmony_ci        case JSCallMode::SUPER_CALL_SPREAD_WITH_ARGV:
3184514f5e3Sopenharmony_ci            ret = CallNGCRuntime(glue_, idxForAot, argsForAot, hir_);
3194514f5e3Sopenharmony_ci            ret = ConstructorCheck(glue_, func_, ret, callArgs_.superCallArgs.thisObj);
3204514f5e3Sopenharmony_ci            break;
3214514f5e3Sopenharmony_ci        default:
3224514f5e3Sopenharmony_ci            LOG_ECMA(FATAL) << "this branch is unreachable";
3234514f5e3Sopenharmony_ci            UNREACHABLE();
3244514f5e3Sopenharmony_ci    }
3254514f5e3Sopenharmony_ci    return ret;
3264514f5e3Sopenharmony_ci}
3274514f5e3Sopenharmony_ci
3284514f5e3Sopenharmony_civoid CallStubBuilder::CallBridge(GateRef code, GateRef expectedNum, Label *exit)
3294514f5e3Sopenharmony_ci{
3304514f5e3Sopenharmony_ci    int idxForAot = PrepareIdxForAot();
3314514f5e3Sopenharmony_ci    std::vector<GateRef> argsForAot = PrepareArgsForAot(expectedNum);
3324514f5e3Sopenharmony_ci    GateRef ret;
3334514f5e3Sopenharmony_ci    switch (callArgs_.mode) {
3344514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG0:
3354514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG1:
3364514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG2:
3374514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG3:
3384514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG0:
3394514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG1:
3404514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG2:
3414514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG3:
3424514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG0:
3434514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG1:
3444514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG2:
3454514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG3:
3464514f5e3Sopenharmony_ci        case JSCallMode::CALL_GETTER:
3474514f5e3Sopenharmony_ci        case JSCallMode::CALL_SETTER:
3484514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG2_WITH_RETURN:
3494514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG3_WITH_RETURN:
3504514f5e3Sopenharmony_ci            if (IsFastAotCall()) {
3514514f5e3Sopenharmony_ci                ret = FastCallOptimized(glue_, code, argsForAot, hir_);
3524514f5e3Sopenharmony_ci            } else if (IsSlowAotCall()) {
3534514f5e3Sopenharmony_ci                ret = CallOptimized(glue_, code, argsForAot, hir_);
3544514f5e3Sopenharmony_ci            } else {
3554514f5e3Sopenharmony_ci                ret = CallNGCRuntime(glue_, idxForAot, argsForAot, hir_);
3564514f5e3Sopenharmony_ci            }
3574514f5e3Sopenharmony_ci            break;
3584514f5e3Sopenharmony_ci        case JSCallMode::CALL_WITH_ARGV:
3594514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_WITH_ARGV:
3604514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_WITH_ARGV:
3614514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_THIS_WITH_ARGV:
3624514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARGV_WITH_RETURN:
3634514f5e3Sopenharmony_ci            ret = CallNGCRuntime(glue_, idxForAot, argsForAot);
3644514f5e3Sopenharmony_ci            break;
3654514f5e3Sopenharmony_ci        case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV:
3664514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_CONSTRUCTOR_WITH_ARGV:
3674514f5e3Sopenharmony_ci        case JSCallMode::SUPER_CALL_WITH_ARGV:
3684514f5e3Sopenharmony_ci        case JSCallMode::SUPER_CALL_SPREAD_WITH_ARGV:
3694514f5e3Sopenharmony_ci            ret = CallConstructorBridge(idxForAot, argsForAot);
3704514f5e3Sopenharmony_ci            break;
3714514f5e3Sopenharmony_ci        default:
3724514f5e3Sopenharmony_ci            LOG_ECMA(FATAL) << "this branch is unreachable";
3734514f5e3Sopenharmony_ci            UNREACHABLE();
3744514f5e3Sopenharmony_ci    }
3754514f5e3Sopenharmony_ci    result_->WriteVariable(ret);
3764514f5e3Sopenharmony_ci    Jump(exit);
3774514f5e3Sopenharmony_ci}
3784514f5e3Sopenharmony_ci
3794514f5e3Sopenharmony_civoid CallStubBuilder::JSCallAsmInterpreter(bool hasBaselineCode, Label *methodNotAot, Label *exit,
3804514f5e3Sopenharmony_ci    Label *noNeedCheckException)
3814514f5e3Sopenharmony_ci{
3824514f5e3Sopenharmony_ci    if (jumpSize_ != 0) {
3834514f5e3Sopenharmony_ci        SaveJumpSizeIfNeeded(glue_, jumpSize_);
3844514f5e3Sopenharmony_ci    }
3854514f5e3Sopenharmony_ci    SaveHotnessCounterIfNeeded(glue_, sp_, hotnessCounter_, callArgs_.mode);
3864514f5e3Sopenharmony_ci
3874514f5e3Sopenharmony_ci    int idxForAsmInterpreter = isForBaseline_ ?
3884514f5e3Sopenharmony_ci        (hasBaselineCode ?
3894514f5e3Sopenharmony_ci            PrepareIdxForAsmInterpreterForBaselineWithBaselineCode() :
3904514f5e3Sopenharmony_ci            PrepareIdxForAsmInterpreterForBaselineWithoutBaselineCode()) :
3914514f5e3Sopenharmony_ci        (hasBaselineCode ?
3924514f5e3Sopenharmony_ci            PrepareIdxForAsmInterpreterWithBaselineCode() :
3934514f5e3Sopenharmony_ci            PrepareIdxForAsmInterpreterWithoutBaselineCode());
3944514f5e3Sopenharmony_ci    std::vector<GateRef> argsForAsmInterpreter = PrepareArgsForAsmInterpreter();
3954514f5e3Sopenharmony_ci
3964514f5e3Sopenharmony_ci    switch (callArgs_.mode) {
3974514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG0:
3984514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG1:
3994514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG2:
4004514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG3:
4014514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG0:
4024514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG1:
4034514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG2:
4044514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG3:
4054514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG0:
4064514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG1:
4074514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG2:
4084514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG3:
4094514f5e3Sopenharmony_ci        case JSCallMode::CALL_WITH_ARGV:
4104514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_WITH_ARGV:
4114514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_WITH_ARGV:
4124514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_THIS_WITH_ARGV:
4134514f5e3Sopenharmony_ci        case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV:
4144514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_CONSTRUCTOR_WITH_ARGV:
4154514f5e3Sopenharmony_ci        case JSCallMode::SUPER_CALL_WITH_ARGV:
4164514f5e3Sopenharmony_ci        case JSCallMode::SUPER_CALL_SPREAD_WITH_ARGV:
4174514f5e3Sopenharmony_ci            *result_ = CallNGCRuntime(glue_, idxForAsmInterpreter, argsForAsmInterpreter);
4184514f5e3Sopenharmony_ci            if (!isForBaseline_) {
4194514f5e3Sopenharmony_ci                Return();
4204514f5e3Sopenharmony_ci            }
4214514f5e3Sopenharmony_ci            break;
4224514f5e3Sopenharmony_ci        case JSCallMode::CALL_GETTER:
4234514f5e3Sopenharmony_ci        case JSCallMode::CALL_SETTER:
4244514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG2_WITH_RETURN:
4254514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG3_WITH_RETURN:
4264514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARGV_WITH_RETURN:
4274514f5e3Sopenharmony_ci            if (isForBaseline_) {
4284514f5e3Sopenharmony_ci                *result_ = CallNGCRuntime(glue_, idxForAsmInterpreter, argsForAsmInterpreter);
4294514f5e3Sopenharmony_ci            } else if (hasBaselineCode) {
4304514f5e3Sopenharmony_ci                Jump(methodNotAot);
4314514f5e3Sopenharmony_ci            } else {
4324514f5e3Sopenharmony_ci                *result_ = CallNGCRuntime(glue_, idxForAsmInterpreter, argsForAsmInterpreter, hir_);
4334514f5e3Sopenharmony_ci                Jump(exit);
4344514f5e3Sopenharmony_ci            }
4354514f5e3Sopenharmony_ci            break;
4364514f5e3Sopenharmony_ci        default:
4374514f5e3Sopenharmony_ci            LOG_ECMA(FATAL) << "this branch is unreachable";
4384514f5e3Sopenharmony_ci            UNREACHABLE();
4394514f5e3Sopenharmony_ci    }
4404514f5e3Sopenharmony_ci
4414514f5e3Sopenharmony_ci    if (isForBaseline_) {
4424514f5e3Sopenharmony_ci        if (noNeedCheckException != nullptr) {
4434514f5e3Sopenharmony_ci            Jump(noNeedCheckException);
4444514f5e3Sopenharmony_ci        } else {
4454514f5e3Sopenharmony_ci            Jump(exit);
4464514f5e3Sopenharmony_ci        }
4474514f5e3Sopenharmony_ci    }
4484514f5e3Sopenharmony_ci}
4494514f5e3Sopenharmony_ci
4504514f5e3Sopenharmony_ciint CallStubBuilder::PrepareIdxForNative()
4514514f5e3Sopenharmony_ci{
4524514f5e3Sopenharmony_ci    switch (callArgs_.mode) {
4534514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG0:
4544514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG1:
4554514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG2:
4564514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG3:
4574514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG0:
4584514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG1:
4594514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG2:
4604514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG3:
4614514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG0:
4624514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG1:
4634514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG2:
4644514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG3:
4654514f5e3Sopenharmony_ci        case JSCallMode::CALL_GETTER:
4664514f5e3Sopenharmony_ci        case JSCallMode::CALL_SETTER:
4674514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG2_WITH_RETURN:
4684514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG3_WITH_RETURN:
4694514f5e3Sopenharmony_ci            return RTSTUB_ID(PushCallArgsAndDispatchNative);
4704514f5e3Sopenharmony_ci        case JSCallMode::CALL_WITH_ARGV:
4714514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_WITH_ARGV:
4724514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_WITH_ARGV:
4734514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_THIS_WITH_ARGV:
4744514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARGV_WITH_RETURN:
4754514f5e3Sopenharmony_ci            return RTSTUB_ID(PushCallRangeAndDispatchNative);
4764514f5e3Sopenharmony_ci        case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV:
4774514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_CONSTRUCTOR_WITH_ARGV:
4784514f5e3Sopenharmony_ci            return RTSTUB_ID(PushCallNewAndDispatchNative);
4794514f5e3Sopenharmony_ci        case JSCallMode::SUPER_CALL_WITH_ARGV:
4804514f5e3Sopenharmony_ci            return RTSTUB_ID(SuperCall);
4814514f5e3Sopenharmony_ci        case JSCallMode::SUPER_CALL_SPREAD_WITH_ARGV:
4824514f5e3Sopenharmony_ci            return RTSTUB_ID(SuperCallSpread);
4834514f5e3Sopenharmony_ci        default:
4844514f5e3Sopenharmony_ci            LOG_ECMA(FATAL) << "this branch is unreachable";
4854514f5e3Sopenharmony_ci            UNREACHABLE();
4864514f5e3Sopenharmony_ci    }
4874514f5e3Sopenharmony_ci}
4884514f5e3Sopenharmony_ci
4894514f5e3Sopenharmony_cistd::vector<GateRef> CallStubBuilder::PrepareArgsForNative()
4904514f5e3Sopenharmony_ci{
4914514f5e3Sopenharmony_ci    std::vector<GateRef> basicArgs = PrepareBasicArgsForNative();
4924514f5e3Sopenharmony_ci    std::vector<GateRef> appendArgs = PrepareAppendArgsForNative();
4934514f5e3Sopenharmony_ci
4944514f5e3Sopenharmony_ci    basicArgs.insert(basicArgs.end(), appendArgs.begin(), appendArgs.end());
4954514f5e3Sopenharmony_ci    return basicArgs;
4964514f5e3Sopenharmony_ci}
4974514f5e3Sopenharmony_ci
4984514f5e3Sopenharmony_cistd::vector<GateRef> CallStubBuilder::PrepareBasicArgsForNative()
4994514f5e3Sopenharmony_ci{
5004514f5e3Sopenharmony_ci    switch (callArgs_.mode) {
5014514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG0:
5024514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG1:
5034514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG2:
5044514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG3:
5054514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG0:
5064514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG1:
5074514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG2:
5084514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG3:
5094514f5e3Sopenharmony_ci            return { nativeCode_, glue_, numArgs_, func_, newTarget_, thisValue_ };
5104514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG0:
5114514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG1:
5124514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG2:
5134514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG3:
5144514f5e3Sopenharmony_ci        case JSCallMode::CALL_GETTER:
5154514f5e3Sopenharmony_ci        case JSCallMode::CALL_SETTER:
5164514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG2_WITH_RETURN:
5174514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG3_WITH_RETURN:
5184514f5e3Sopenharmony_ci            return { nativeCode_, glue_, numArgs_, func_, newTarget_ };
5194514f5e3Sopenharmony_ci        case JSCallMode::CALL_WITH_ARGV:
5204514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_WITH_ARGV:
5214514f5e3Sopenharmony_ci            return { glue_, nativeCode_, func_, thisValue_ };
5224514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_WITH_ARGV:
5234514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARGV_WITH_RETURN:
5244514f5e3Sopenharmony_ci        case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV:
5254514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_THIS_WITH_ARGV:
5264514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_CONSTRUCTOR_WITH_ARGV:
5274514f5e3Sopenharmony_ci            return { glue_, nativeCode_, func_ };
5284514f5e3Sopenharmony_ci        case JSCallMode::SUPER_CALL_WITH_ARGV:
5294514f5e3Sopenharmony_ci        case JSCallMode::SUPER_CALL_SPREAD_WITH_ARGV:
5304514f5e3Sopenharmony_ci            return {};
5314514f5e3Sopenharmony_ci        default:
5324514f5e3Sopenharmony_ci            LOG_ECMA(FATAL) << "this branch is unreachable";
5334514f5e3Sopenharmony_ci            UNREACHABLE();
5344514f5e3Sopenharmony_ci    }
5354514f5e3Sopenharmony_ci}
5364514f5e3Sopenharmony_ci
5374514f5e3Sopenharmony_cistd::vector<GateRef> CallStubBuilder::PrepareAppendArgsForNative()
5384514f5e3Sopenharmony_ci{
5394514f5e3Sopenharmony_ci    switch (callArgs_.mode) {
5404514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG0:
5414514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG0:
5424514f5e3Sopenharmony_ci            return {};
5434514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG1:
5444514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG1:
5454514f5e3Sopenharmony_ci            return {
5464514f5e3Sopenharmony_ci                callArgs_.callArgs.arg0
5474514f5e3Sopenharmony_ci            };
5484514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG2:
5494514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG2:
5504514f5e3Sopenharmony_ci            return {
5514514f5e3Sopenharmony_ci                callArgs_.callArgs.arg0,
5524514f5e3Sopenharmony_ci                callArgs_.callArgs.arg1
5534514f5e3Sopenharmony_ci            };
5544514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG3:
5554514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG3:
5564514f5e3Sopenharmony_ci            return {
5574514f5e3Sopenharmony_ci                callArgs_.callArgs.arg0,
5584514f5e3Sopenharmony_ci                callArgs_.callArgs.arg1,
5594514f5e3Sopenharmony_ci                callArgs_.callArgs.arg2
5604514f5e3Sopenharmony_ci            };
5614514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG0:
5624514f5e3Sopenharmony_ci            return {
5634514f5e3Sopenharmony_ci                callArgs_.callArgsWithThis.thisValue
5644514f5e3Sopenharmony_ci            };
5654514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG1:
5664514f5e3Sopenharmony_ci            return {
5674514f5e3Sopenharmony_ci                callArgs_.callArgsWithThis.thisValue,
5684514f5e3Sopenharmony_ci                callArgs_.callArgsWithThis.arg0
5694514f5e3Sopenharmony_ci            };
5704514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG2:
5714514f5e3Sopenharmony_ci            return {
5724514f5e3Sopenharmony_ci                callArgs_.callArgsWithThis.thisValue,
5734514f5e3Sopenharmony_ci                callArgs_.callArgsWithThis.arg0,
5744514f5e3Sopenharmony_ci                callArgs_.callArgsWithThis.arg1
5754514f5e3Sopenharmony_ci            };
5764514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG3:
5774514f5e3Sopenharmony_ci            return {
5784514f5e3Sopenharmony_ci                callArgs_.callArgsWithThis.thisValue,
5794514f5e3Sopenharmony_ci                callArgs_.callArgsWithThis.arg0,
5804514f5e3Sopenharmony_ci                callArgs_.callArgsWithThis.arg1,
5814514f5e3Sopenharmony_ci                callArgs_.callArgsWithThis.arg2
5824514f5e3Sopenharmony_ci            };
5834514f5e3Sopenharmony_ci        case JSCallMode::CALL_GETTER:
5844514f5e3Sopenharmony_ci            return {
5854514f5e3Sopenharmony_ci                callArgs_.callGetterArgs.receiver
5864514f5e3Sopenharmony_ci            };
5874514f5e3Sopenharmony_ci        case JSCallMode::CALL_SETTER:
5884514f5e3Sopenharmony_ci            return {
5894514f5e3Sopenharmony_ci                callArgs_.callSetterArgs.receiver,
5904514f5e3Sopenharmony_ci                callArgs_.callSetterArgs.value
5914514f5e3Sopenharmony_ci            };
5924514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG2_WITH_RETURN:
5934514f5e3Sopenharmony_ci            return {
5944514f5e3Sopenharmony_ci                callArgs_.callThisArg2WithReturnArgs.thisValue,
5954514f5e3Sopenharmony_ci                callArgs_.callThisArg2WithReturnArgs.arg0,
5964514f5e3Sopenharmony_ci                callArgs_.callThisArg2WithReturnArgs.arg1
5974514f5e3Sopenharmony_ci            };
5984514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG3_WITH_RETURN:
5994514f5e3Sopenharmony_ci            return {
6004514f5e3Sopenharmony_ci                callArgs_.callThisArg3WithReturnArgs.argHandle,
6014514f5e3Sopenharmony_ci                callArgs_.callThisArg3WithReturnArgs.value,
6024514f5e3Sopenharmony_ci                callArgs_.callThisArg3WithReturnArgs.key,
6034514f5e3Sopenharmony_ci                callArgs_.callThisArg3WithReturnArgs.thisValue
6044514f5e3Sopenharmony_ci            };
6054514f5e3Sopenharmony_ci        case JSCallMode::CALL_WITH_ARGV:
6064514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_WITH_ARGV:
6074514f5e3Sopenharmony_ci            return {
6084514f5e3Sopenharmony_ci                callArgs_.callArgv.argc,
6094514f5e3Sopenharmony_ci                callArgs_.callArgv.argv
6104514f5e3Sopenharmony_ci            };
6114514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_WITH_ARGV:
6124514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_THIS_WITH_ARGV:
6134514f5e3Sopenharmony_ci            return {
6144514f5e3Sopenharmony_ci                callArgs_.callArgvWithThis.thisValue,
6154514f5e3Sopenharmony_ci                callArgs_.callArgvWithThis.argc,
6164514f5e3Sopenharmony_ci                callArgs_.callArgvWithThis.argv
6174514f5e3Sopenharmony_ci            };
6184514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARGV_WITH_RETURN:
6194514f5e3Sopenharmony_ci            return {
6204514f5e3Sopenharmony_ci                callArgs_.callThisArgvWithReturnArgs.thisValue,
6214514f5e3Sopenharmony_ci                callArgs_.callThisArgvWithReturnArgs.argc,
6224514f5e3Sopenharmony_ci                callArgs_.callThisArgvWithReturnArgs.argv
6234514f5e3Sopenharmony_ci            };
6244514f5e3Sopenharmony_ci        case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV:
6254514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_CONSTRUCTOR_WITH_ARGV:
6264514f5e3Sopenharmony_ci            return {
6274514f5e3Sopenharmony_ci                callArgs_.callConstructorArgs.thisObj,
6284514f5e3Sopenharmony_ci                callArgs_.callConstructorArgs.argc,
6294514f5e3Sopenharmony_ci                callArgs_.callConstructorArgs.argv
6304514f5e3Sopenharmony_ci            };
6314514f5e3Sopenharmony_ci        case JSCallMode::SUPER_CALL_WITH_ARGV:
6324514f5e3Sopenharmony_ci            return {
6334514f5e3Sopenharmony_ci                callArgs_.superCallArgs.thisFunc,
6344514f5e3Sopenharmony_ci                callArgs_.superCallArgs.array,
6354514f5e3Sopenharmony_ci                IntToTaggedInt(callArgs_.superCallArgs.argc)
6364514f5e3Sopenharmony_ci            };
6374514f5e3Sopenharmony_ci        case JSCallMode::SUPER_CALL_SPREAD_WITH_ARGV:
6384514f5e3Sopenharmony_ci            return {
6394514f5e3Sopenharmony_ci                callArgs_.superCallArgs.thisFunc,
6404514f5e3Sopenharmony_ci                callArgs_.superCallArgs.array
6414514f5e3Sopenharmony_ci            };
6424514f5e3Sopenharmony_ci        default:
6434514f5e3Sopenharmony_ci            LOG_ECMA(FATAL) << "this branch is unreachable";
6444514f5e3Sopenharmony_ci            UNREACHABLE();
6454514f5e3Sopenharmony_ci    }
6464514f5e3Sopenharmony_ci}
6474514f5e3Sopenharmony_ci
6484514f5e3Sopenharmony_ciint CallStubBuilder::PrepareIdxForAot()
6494514f5e3Sopenharmony_ci{
6504514f5e3Sopenharmony_ci    switch (callArgs_.mode) {
6514514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG0:
6524514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG1:
6534514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG2:
6544514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG3:
6554514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG0:
6564514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG1:
6574514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG2:
6584514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG3:
6594514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG0:
6604514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG1:
6614514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG2:
6624514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG3:
6634514f5e3Sopenharmony_ci        case JSCallMode::CALL_GETTER:
6644514f5e3Sopenharmony_ci        case JSCallMode::CALL_SETTER:
6654514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG2_WITH_RETURN:
6664514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG3_WITH_RETURN:
6674514f5e3Sopenharmony_ci            if (isFast_) {
6684514f5e3Sopenharmony_ci                return RTSTUB_ID(OptimizedFastCallAndPushArgv);
6694514f5e3Sopenharmony_ci            } else {
6704514f5e3Sopenharmony_ci                return RTSTUB_ID(OptimizedCallAndPushArgv);
6714514f5e3Sopenharmony_ci            }
6724514f5e3Sopenharmony_ci        case JSCallMode::CALL_WITH_ARGV:
6734514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_WITH_ARGV:
6744514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_WITH_ARGV:
6754514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_THIS_WITH_ARGV:
6764514f5e3Sopenharmony_ci        case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV:
6774514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_CONSTRUCTOR_WITH_ARGV:
6784514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARGV_WITH_RETURN:
6794514f5e3Sopenharmony_ci        case JSCallMode::SUPER_CALL_WITH_ARGV:
6804514f5e3Sopenharmony_ci        case JSCallMode::SUPER_CALL_SPREAD_WITH_ARGV:
6814514f5e3Sopenharmony_ci            if (IsFastAotCall()) {
6824514f5e3Sopenharmony_ci                return RTSTUB_ID(JSFastCallWithArgV);
6834514f5e3Sopenharmony_ci            } else if (IsFastAotCallWithBridge()) {
6844514f5e3Sopenharmony_ci                return RTSTUB_ID(JSFastCallWithArgVAndPushArgv);
6854514f5e3Sopenharmony_ci            } else if (IsSlowAotCall()) {
6864514f5e3Sopenharmony_ci                return RTSTUB_ID(JSCallWithArgV);
6874514f5e3Sopenharmony_ci            } else {
6884514f5e3Sopenharmony_ci                return RTSTUB_ID(JSCallWithArgVAndPushArgv);
6894514f5e3Sopenharmony_ci            }
6904514f5e3Sopenharmony_ci        default:
6914514f5e3Sopenharmony_ci            LOG_ECMA(FATAL) << "this branch is unreachable";
6924514f5e3Sopenharmony_ci            UNREACHABLE();
6934514f5e3Sopenharmony_ci    }
6944514f5e3Sopenharmony_ci}
6954514f5e3Sopenharmony_ci
6964514f5e3Sopenharmony_cistd::vector<GateRef> CallStubBuilder::PrepareArgsForAot(GateRef expectedNum)
6974514f5e3Sopenharmony_ci{
6984514f5e3Sopenharmony_ci    std::vector<GateRef> basicArgs = PrepareBasicArgsForAot();
6994514f5e3Sopenharmony_ci
7004514f5e3Sopenharmony_ci    std::vector<GateRef> appendArgs = PrepareAppendArgsForAotStep1();
7014514f5e3Sopenharmony_ci    basicArgs.insert(basicArgs.end(), appendArgs.begin(), appendArgs.end());
7024514f5e3Sopenharmony_ci
7034514f5e3Sopenharmony_ci    appendArgs = PrepareAppendArgsForAotStep2();
7044514f5e3Sopenharmony_ci    basicArgs.insert(basicArgs.end(), appendArgs.begin(), appendArgs.end());
7054514f5e3Sopenharmony_ci
7064514f5e3Sopenharmony_ci    appendArgs = PrepareAppendArgsForAotStep3(expectedNum);
7074514f5e3Sopenharmony_ci    basicArgs.insert(basicArgs.end(), appendArgs.begin(), appendArgs.end());
7084514f5e3Sopenharmony_ci
7094514f5e3Sopenharmony_ci    return basicArgs;
7104514f5e3Sopenharmony_ci}
7114514f5e3Sopenharmony_ci
7124514f5e3Sopenharmony_cistd::vector<GateRef> CallStubBuilder::PrepareBasicArgsForAot()
7134514f5e3Sopenharmony_ci{
7144514f5e3Sopenharmony_ci    switch (callArgs_.mode) {
7154514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG0:
7164514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG1:
7174514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG2:
7184514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG3:
7194514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG0:
7204514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG1:
7214514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG2:
7224514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG3:
7234514f5e3Sopenharmony_ci            if (IsFastAotCall()) {
7244514f5e3Sopenharmony_ci                return { glue_, func_, thisValue_ };
7254514f5e3Sopenharmony_ci            } else {
7264514f5e3Sopenharmony_ci                return { glue_, realNumArgs_, IntPtr(0), func_, newTarget_, thisValue_ };
7274514f5e3Sopenharmony_ci            }
7284514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG0:
7294514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG1:
7304514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG2:
7314514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG3:
7324514f5e3Sopenharmony_ci        case JSCallMode::CALL_GETTER:
7334514f5e3Sopenharmony_ci        case JSCallMode::CALL_SETTER:
7344514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG2_WITH_RETURN:
7354514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG3_WITH_RETURN:
7364514f5e3Sopenharmony_ci            if (IsFastAotCall()) {
7374514f5e3Sopenharmony_ci                return { glue_, func_ };
7384514f5e3Sopenharmony_ci            } else {
7394514f5e3Sopenharmony_ci                return { glue_, realNumArgs_, IntPtr(0), func_, newTarget_ };
7404514f5e3Sopenharmony_ci            }
7414514f5e3Sopenharmony_ci        case JSCallMode::CALL_WITH_ARGV:
7424514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_WITH_ARGV:
7434514f5e3Sopenharmony_ci            if (isFast_) {
7444514f5e3Sopenharmony_ci                return { glue_, func_, thisValue_, ZExtInt32ToInt64(actualNumArgs_) };
7454514f5e3Sopenharmony_ci            } else {
7464514f5e3Sopenharmony_ci                return { glue_, ZExtInt32ToInt64(actualNumArgs_), func_, newTarget_, thisValue_ };
7474514f5e3Sopenharmony_ci            }
7484514f5e3Sopenharmony_ci        case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV:
7494514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_CONSTRUCTOR_WITH_ARGV:
7504514f5e3Sopenharmony_ci            if (!isFast_) {
7514514f5e3Sopenharmony_ci                return { glue_, ZExtInt32ToInt64(actualNumArgs_), func_, func_ };
7524514f5e3Sopenharmony_ci            }
7534514f5e3Sopenharmony_ci            [[fallthrough]];
7544514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_WITH_ARGV:
7554514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_THIS_WITH_ARGV:
7564514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARGV_WITH_RETURN:
7574514f5e3Sopenharmony_ci            if (isFast_) {
7584514f5e3Sopenharmony_ci                return { glue_, func_ };
7594514f5e3Sopenharmony_ci            } else {
7604514f5e3Sopenharmony_ci                return { glue_, ZExtInt32ToInt64(actualNumArgs_), func_, newTarget_ };
7614514f5e3Sopenharmony_ci            }
7624514f5e3Sopenharmony_ci        case JSCallMode::SUPER_CALL_WITH_ARGV:
7634514f5e3Sopenharmony_ci        case JSCallMode::SUPER_CALL_SPREAD_WITH_ARGV:
7644514f5e3Sopenharmony_ci            if (isFast_) {
7654514f5e3Sopenharmony_ci                return { glue_, func_ };
7664514f5e3Sopenharmony_ci            } else {
7674514f5e3Sopenharmony_ci                return { glue_, ZExtInt32ToInt64(actualNumArgs_), func_};
7684514f5e3Sopenharmony_ci            }
7694514f5e3Sopenharmony_ci        default:
7704514f5e3Sopenharmony_ci            LOG_ECMA(FATAL) << "this branch is unreachable";
7714514f5e3Sopenharmony_ci            UNREACHABLE();
7724514f5e3Sopenharmony_ci    }
7734514f5e3Sopenharmony_ci}
7744514f5e3Sopenharmony_ci
7754514f5e3Sopenharmony_cistd::vector<GateRef> CallStubBuilder::PrepareAppendArgsForAotStep1()
7764514f5e3Sopenharmony_ci{
7774514f5e3Sopenharmony_ci    switch (callArgs_.mode) {
7784514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG0:
7794514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG0:
7804514f5e3Sopenharmony_ci            return {};
7814514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG1:
7824514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG1:
7834514f5e3Sopenharmony_ci            return { callArgs_.callArgs.arg0 };
7844514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG2:
7854514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG2:
7864514f5e3Sopenharmony_ci            return {
7874514f5e3Sopenharmony_ci                callArgs_.callArgs.arg0,
7884514f5e3Sopenharmony_ci                callArgs_.callArgs.arg1
7894514f5e3Sopenharmony_ci            };
7904514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG3:
7914514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG3:
7924514f5e3Sopenharmony_ci            return {
7934514f5e3Sopenharmony_ci                callArgs_.callArgs.arg0,
7944514f5e3Sopenharmony_ci                callArgs_.callArgs.arg1,
7954514f5e3Sopenharmony_ci                callArgs_.callArgs.arg2
7964514f5e3Sopenharmony_ci            };
7974514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG0:
7984514f5e3Sopenharmony_ci            return { callArgs_.callArgsWithThis.thisValue };
7994514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG1:
8004514f5e3Sopenharmony_ci            return {
8014514f5e3Sopenharmony_ci                callArgs_.callArgsWithThis.thisValue,
8024514f5e3Sopenharmony_ci                callArgs_.callArgsWithThis.arg0
8034514f5e3Sopenharmony_ci            };
8044514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG2:
8054514f5e3Sopenharmony_ci            return {
8064514f5e3Sopenharmony_ci                callArgs_.callArgsWithThis.thisValue,
8074514f5e3Sopenharmony_ci                callArgs_.callArgsWithThis.arg0,
8084514f5e3Sopenharmony_ci                callArgs_.callArgsWithThis.arg1
8094514f5e3Sopenharmony_ci            };
8104514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG3:
8114514f5e3Sopenharmony_ci            return {
8124514f5e3Sopenharmony_ci                callArgs_.callArgsWithThis.thisValue,
8134514f5e3Sopenharmony_ci                callArgs_.callArgsWithThis.arg0,
8144514f5e3Sopenharmony_ci                callArgs_.callArgsWithThis.arg1,
8154514f5e3Sopenharmony_ci                callArgs_.callArgsWithThis.arg2
8164514f5e3Sopenharmony_ci            };
8174514f5e3Sopenharmony_ci        case JSCallMode::CALL_GETTER:
8184514f5e3Sopenharmony_ci            return { callArgs_.callGetterArgs.receiver };
8194514f5e3Sopenharmony_ci        case JSCallMode::CALL_SETTER:
8204514f5e3Sopenharmony_ci            return {
8214514f5e3Sopenharmony_ci                callArgs_.callSetterArgs.receiver,
8224514f5e3Sopenharmony_ci                callArgs_.callSetterArgs.value
8234514f5e3Sopenharmony_ci            };
8244514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG2_WITH_RETURN:
8254514f5e3Sopenharmony_ci            return {
8264514f5e3Sopenharmony_ci                callArgs_.callThisArg2WithReturnArgs.thisValue,
8274514f5e3Sopenharmony_ci                callArgs_.callThisArg2WithReturnArgs.arg0,
8284514f5e3Sopenharmony_ci                callArgs_.callThisArg2WithReturnArgs.arg1
8294514f5e3Sopenharmony_ci            };
8304514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG3_WITH_RETURN:
8314514f5e3Sopenharmony_ci            return {
8324514f5e3Sopenharmony_ci                callArgs_.callThisArg3WithReturnArgs.argHandle,
8334514f5e3Sopenharmony_ci                callArgs_.callThisArg3WithReturnArgs.value,
8344514f5e3Sopenharmony_ci                callArgs_.callThisArg3WithReturnArgs.key,
8354514f5e3Sopenharmony_ci                callArgs_.callThisArg3WithReturnArgs.thisValue
8364514f5e3Sopenharmony_ci            };
8374514f5e3Sopenharmony_ci        case JSCallMode::CALL_WITH_ARGV:
8384514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_WITH_ARGV:
8394514f5e3Sopenharmony_ci            return { callArgs_.callArgv.argv };
8404514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_WITH_ARGV:
8414514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_THIS_WITH_ARGV:
8424514f5e3Sopenharmony_ci            return { callArgs_.callArgvWithThis.thisValue };
8434514f5e3Sopenharmony_ci        case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV:
8444514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_CONSTRUCTOR_WITH_ARGV:
8454514f5e3Sopenharmony_ci            return { callArgs_.callConstructorArgs.thisObj };
8464514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARGV_WITH_RETURN:
8474514f5e3Sopenharmony_ci            return { callArgs_.callThisArgvWithReturnArgs.thisValue };
8484514f5e3Sopenharmony_ci        case JSCallMode::SUPER_CALL_WITH_ARGV:
8494514f5e3Sopenharmony_ci        case JSCallMode::SUPER_CALL_SPREAD_WITH_ARGV:
8504514f5e3Sopenharmony_ci            return {};
8514514f5e3Sopenharmony_ci        default:
8524514f5e3Sopenharmony_ci            LOG_ECMA(FATAL) << "this branch is unreachable";
8534514f5e3Sopenharmony_ci            UNREACHABLE();
8544514f5e3Sopenharmony_ci    }
8554514f5e3Sopenharmony_ci}
8564514f5e3Sopenharmony_ci
8574514f5e3Sopenharmony_cistd::vector<GateRef> CallStubBuilder::PrepareAppendArgsForAotStep2()
8584514f5e3Sopenharmony_ci{
8594514f5e3Sopenharmony_ci    switch (callArgs_.mode) {
8604514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_WITH_ARGV:
8614514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_THIS_WITH_ARGV:
8624514f5e3Sopenharmony_ci        case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV:
8634514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_CONSTRUCTOR_WITH_ARGV:
8644514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARGV_WITH_RETURN:
8654514f5e3Sopenharmony_ci            if (isFast_) {
8664514f5e3Sopenharmony_ci                return { ZExtInt32ToInt64(actualNumArgs_) };
8674514f5e3Sopenharmony_ci            }
8684514f5e3Sopenharmony_ci            [[fallthrough]];
8694514f5e3Sopenharmony_ci        case JSCallMode::CALL_WITH_ARGV:
8704514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_WITH_ARGV:
8714514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG0:
8724514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG1:
8734514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG2:
8744514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG3:
8754514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG0:
8764514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG1:
8774514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG2:
8784514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG3:
8794514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG0:
8804514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG1:
8814514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG2:
8824514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG3:
8834514f5e3Sopenharmony_ci        case JSCallMode::CALL_GETTER:
8844514f5e3Sopenharmony_ci        case JSCallMode::CALL_SETTER:
8854514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG2_WITH_RETURN:
8864514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG3_WITH_RETURN:
8874514f5e3Sopenharmony_ci            return {};
8884514f5e3Sopenharmony_ci        case JSCallMode::SUPER_CALL_WITH_ARGV:
8894514f5e3Sopenharmony_ci        case JSCallMode::SUPER_CALL_SPREAD_WITH_ARGV:
8904514f5e3Sopenharmony_ci            if (isFast_) {
8914514f5e3Sopenharmony_ci                return {
8924514f5e3Sopenharmony_ci                    callArgs_.superCallArgs.thisObj,
8934514f5e3Sopenharmony_ci                    callArgs_.superCallArgs.argc,
8944514f5e3Sopenharmony_ci                    callArgs_.superCallArgs.argv
8954514f5e3Sopenharmony_ci                };
8964514f5e3Sopenharmony_ci            } else {
8974514f5e3Sopenharmony_ci                return {
8984514f5e3Sopenharmony_ci                    callArgs_.superCallArgs.newTarget,
8994514f5e3Sopenharmony_ci                    callArgs_.superCallArgs.thisObj,
9004514f5e3Sopenharmony_ci                    callArgs_.superCallArgs.argv
9014514f5e3Sopenharmony_ci                };
9024514f5e3Sopenharmony_ci            }
9034514f5e3Sopenharmony_ci        default:
9044514f5e3Sopenharmony_ci            LOG_ECMA(FATAL) << "this branch is unreachable";
9054514f5e3Sopenharmony_ci            UNREACHABLE();
9064514f5e3Sopenharmony_ci    }
9074514f5e3Sopenharmony_ci}
9084514f5e3Sopenharmony_ci
9094514f5e3Sopenharmony_cistd::vector<GateRef> CallStubBuilder::PrepareAppendArgsForAotStep3(GateRef expectedNum)
9104514f5e3Sopenharmony_ci{
9114514f5e3Sopenharmony_ci    std::vector<GateRef> retArgs {};
9124514f5e3Sopenharmony_ci    switch (callArgs_.mode) {
9134514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG0:
9144514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG1:
9154514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG2:
9164514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG3:
9174514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG0:
9184514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG1:
9194514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG2:
9204514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG3:
9214514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG0:
9224514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG1:
9234514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG2:
9244514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG3:
9254514f5e3Sopenharmony_ci        case JSCallMode::CALL_GETTER:
9264514f5e3Sopenharmony_ci        case JSCallMode::CALL_SETTER:
9274514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG2_WITH_RETURN:
9284514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG3_WITH_RETURN:
9294514f5e3Sopenharmony_ci            return {};
9304514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_WITH_ARGV:
9314514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_THIS_WITH_ARGV:
9324514f5e3Sopenharmony_ci            retArgs.push_back(callArgs_.callArgvWithThis.argv);
9334514f5e3Sopenharmony_ci            break;
9344514f5e3Sopenharmony_ci        case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV:
9354514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_CONSTRUCTOR_WITH_ARGV:
9364514f5e3Sopenharmony_ci            retArgs.push_back(callArgs_.callConstructorArgs.argv);
9374514f5e3Sopenharmony_ci            break;
9384514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARGV_WITH_RETURN:
9394514f5e3Sopenharmony_ci            retArgs.push_back(callArgs_.callThisArgvWithReturnArgs.argv);
9404514f5e3Sopenharmony_ci            break;
9414514f5e3Sopenharmony_ci        case JSCallMode::CALL_WITH_ARGV:
9424514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_WITH_ARGV:
9434514f5e3Sopenharmony_ci        case JSCallMode::SUPER_CALL_WITH_ARGV:
9444514f5e3Sopenharmony_ci        case JSCallMode::SUPER_CALL_SPREAD_WITH_ARGV:
9454514f5e3Sopenharmony_ci            break;
9464514f5e3Sopenharmony_ci        default:
9474514f5e3Sopenharmony_ci            LOG_ECMA(FATAL) << "this branch is unreachable";
9484514f5e3Sopenharmony_ci            UNREACHABLE();
9494514f5e3Sopenharmony_ci    }
9504514f5e3Sopenharmony_ci
9514514f5e3Sopenharmony_ci    if (IsFastAotCallWithBridge()) {
9524514f5e3Sopenharmony_ci        retArgs.push_back(expectedNum);
9534514f5e3Sopenharmony_ci    }
9544514f5e3Sopenharmony_ci    return retArgs;
9554514f5e3Sopenharmony_ci}
9564514f5e3Sopenharmony_ci
9574514f5e3Sopenharmony_ciint CallStubBuilder::PrepareIdxForAsmInterpreterForBaselineWithBaselineCode()
9584514f5e3Sopenharmony_ci{
9594514f5e3Sopenharmony_ci    switch (callArgs_.mode) {
9604514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG0:
9614514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG0:
9624514f5e3Sopenharmony_ci            return RTSTUB_ID(CallArg0AndCheckToBaselineFromBaseline);
9634514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG1:
9644514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG1:
9654514f5e3Sopenharmony_ci            return RTSTUB_ID(CallArg1AndCheckToBaselineFromBaseline);
9664514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG2:
9674514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG2:
9684514f5e3Sopenharmony_ci            return RTSTUB_ID(CallArgs2AndCheckToBaselineFromBaseline);
9694514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG3:
9704514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG3:
9714514f5e3Sopenharmony_ci            return RTSTUB_ID(CallArgs3AndCheckToBaselineFromBaseline);
9724514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG0:
9734514f5e3Sopenharmony_ci            return RTSTUB_ID(CallThisArg0AndCheckToBaselineFromBaseline);
9744514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG1:
9754514f5e3Sopenharmony_ci            return RTSTUB_ID(CallThisArg1AndCheckToBaselineFromBaseline);
9764514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG2:
9774514f5e3Sopenharmony_ci            return RTSTUB_ID(CallThisArgs2AndCheckToBaselineFromBaseline);
9784514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG3:
9794514f5e3Sopenharmony_ci            return RTSTUB_ID(CallThisArgs3AndCheckToBaselineFromBaseline);
9804514f5e3Sopenharmony_ci        case JSCallMode::CALL_WITH_ARGV:
9814514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_WITH_ARGV:
9824514f5e3Sopenharmony_ci            return RTSTUB_ID(CallRangeAndCheckToBaselineFromBaseline);
9834514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_WITH_ARGV:
9844514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_THIS_WITH_ARGV:
9854514f5e3Sopenharmony_ci            return RTSTUB_ID(CallThisRangeAndCheckToBaselineFromBaseline);
9864514f5e3Sopenharmony_ci        case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV:
9874514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_CONSTRUCTOR_WITH_ARGV:
9884514f5e3Sopenharmony_ci            return RTSTUB_ID(CallNewAndCheckToBaselineFromBaseline);
9894514f5e3Sopenharmony_ci        case JSCallMode::SUPER_CALL_WITH_ARGV:
9904514f5e3Sopenharmony_ci        case JSCallMode::SUPER_CALL_SPREAD_WITH_ARGV:
9914514f5e3Sopenharmony_ci            return RTSTUB_ID(SuperCallAndCheckToBaselineFromBaseline);
9924514f5e3Sopenharmony_ci        case JSCallMode::CALL_GETTER:
9934514f5e3Sopenharmony_ci            return RTSTUB_ID(CallGetter);
9944514f5e3Sopenharmony_ci        case JSCallMode::CALL_SETTER:
9954514f5e3Sopenharmony_ci            return RTSTUB_ID(CallSetter);
9964514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG2_WITH_RETURN:
9974514f5e3Sopenharmony_ci            return RTSTUB_ID(CallContainersArgs2);
9984514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG3_WITH_RETURN:
9994514f5e3Sopenharmony_ci            return RTSTUB_ID(CallContainersArgs3);
10004514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARGV_WITH_RETURN:
10014514f5e3Sopenharmony_ci            return RTSTUB_ID(CallReturnWithArgv);
10024514f5e3Sopenharmony_ci        default:
10034514f5e3Sopenharmony_ci            LOG_ECMA(FATAL) << "this branch is unreachable";
10044514f5e3Sopenharmony_ci            UNREACHABLE();
10054514f5e3Sopenharmony_ci    }
10064514f5e3Sopenharmony_ci}
10074514f5e3Sopenharmony_ci
10084514f5e3Sopenharmony_ciint CallStubBuilder::PrepareIdxForAsmInterpreterForBaselineWithoutBaselineCode()
10094514f5e3Sopenharmony_ci{
10104514f5e3Sopenharmony_ci    switch (callArgs_.mode) {
10114514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG0:
10124514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG0:
10134514f5e3Sopenharmony_ci            return RTSTUB_ID(CallArg0AndDispatchFromBaseline);
10144514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG1:
10154514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG1:
10164514f5e3Sopenharmony_ci            return RTSTUB_ID(CallArg1AndDispatchFromBaseline);
10174514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG2:
10184514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG2:
10194514f5e3Sopenharmony_ci            return RTSTUB_ID(CallArgs2AndDispatchFromBaseline);
10204514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG3:
10214514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG3:
10224514f5e3Sopenharmony_ci            return RTSTUB_ID(CallArgs3AndDispatchFromBaseline);
10234514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG0:
10244514f5e3Sopenharmony_ci            return RTSTUB_ID(CallThisArg0AndDispatchFromBaseline);
10254514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG1:
10264514f5e3Sopenharmony_ci            return RTSTUB_ID(CallThisArg1AndDispatchFromBaseline);
10274514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG2:
10284514f5e3Sopenharmony_ci            return RTSTUB_ID(CallThisArgs2AndDispatchFromBaseline);
10294514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG3:
10304514f5e3Sopenharmony_ci            return RTSTUB_ID(CallThisArgs3AndDispatchFromBaseline);
10314514f5e3Sopenharmony_ci        case JSCallMode::CALL_WITH_ARGV:
10324514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_WITH_ARGV:
10334514f5e3Sopenharmony_ci            return RTSTUB_ID(CallRangeAndDispatchFromBaseline);
10344514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_WITH_ARGV:
10354514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_THIS_WITH_ARGV:
10364514f5e3Sopenharmony_ci            return RTSTUB_ID(CallThisRangeAndDispatchFromBaseline);
10374514f5e3Sopenharmony_ci        case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV:
10384514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_CONSTRUCTOR_WITH_ARGV:
10394514f5e3Sopenharmony_ci            return RTSTUB_ID(CallNewAndDispatchFromBaseline);
10404514f5e3Sopenharmony_ci        case JSCallMode::SUPER_CALL_WITH_ARGV:
10414514f5e3Sopenharmony_ci        case JSCallMode::SUPER_CALL_SPREAD_WITH_ARGV:
10424514f5e3Sopenharmony_ci            return RTSTUB_ID(SuperCallAndDispatchFromBaseline);
10434514f5e3Sopenharmony_ci        case JSCallMode::CALL_GETTER:
10444514f5e3Sopenharmony_ci            return RTSTUB_ID(CallGetter);
10454514f5e3Sopenharmony_ci        case JSCallMode::CALL_SETTER:
10464514f5e3Sopenharmony_ci            return RTSTUB_ID(CallSetter);
10474514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG2_WITH_RETURN:
10484514f5e3Sopenharmony_ci            return RTSTUB_ID(CallContainersArgs2);
10494514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG3_WITH_RETURN:
10504514f5e3Sopenharmony_ci            return RTSTUB_ID(CallContainersArgs3);
10514514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARGV_WITH_RETURN:
10524514f5e3Sopenharmony_ci            return RTSTUB_ID(CallReturnWithArgv);
10534514f5e3Sopenharmony_ci        default:
10544514f5e3Sopenharmony_ci            LOG_ECMA(FATAL) << "this branch is unreachable";
10554514f5e3Sopenharmony_ci            UNREACHABLE();
10564514f5e3Sopenharmony_ci    }
10574514f5e3Sopenharmony_ci}
10584514f5e3Sopenharmony_ci
10594514f5e3Sopenharmony_ciint CallStubBuilder::PrepareIdxForAsmInterpreterWithBaselineCode()
10604514f5e3Sopenharmony_ci{
10614514f5e3Sopenharmony_ci    switch (callArgs_.mode) {
10624514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG0:
10634514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG0:
10644514f5e3Sopenharmony_ci            return RTSTUB_ID(CallArg0AndCheckToBaseline);
10654514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG1:
10664514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG1:
10674514f5e3Sopenharmony_ci            return RTSTUB_ID(CallArg1AndCheckToBaseline);
10684514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG2:
10694514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG2:
10704514f5e3Sopenharmony_ci            return RTSTUB_ID(CallArgs2AndCheckToBaseline);
10714514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG3:
10724514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG3:
10734514f5e3Sopenharmony_ci            return RTSTUB_ID(CallArgs3AndCheckToBaseline);
10744514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG0:
10754514f5e3Sopenharmony_ci            return RTSTUB_ID(CallThisArg0AndCheckToBaseline);
10764514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG1:
10774514f5e3Sopenharmony_ci            return RTSTUB_ID(CallThisArg1AndCheckToBaseline);
10784514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG2:
10794514f5e3Sopenharmony_ci            return RTSTUB_ID(CallThisArgs2AndCheckToBaseline);
10804514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG3:
10814514f5e3Sopenharmony_ci            return RTSTUB_ID(CallThisArgs3AndCheckToBaseline);
10824514f5e3Sopenharmony_ci        case JSCallMode::CALL_WITH_ARGV:
10834514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_WITH_ARGV:
10844514f5e3Sopenharmony_ci            return RTSTUB_ID(CallRangeAndCheckToBaseline);
10854514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_WITH_ARGV:
10864514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_THIS_WITH_ARGV:
10874514f5e3Sopenharmony_ci            return RTSTUB_ID(CallThisRangeAndCheckToBaseline);
10884514f5e3Sopenharmony_ci        case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV:
10894514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_CONSTRUCTOR_WITH_ARGV:
10904514f5e3Sopenharmony_ci            return RTSTUB_ID(CallNewAndCheckToBaseline);
10914514f5e3Sopenharmony_ci        case JSCallMode::SUPER_CALL_WITH_ARGV:
10924514f5e3Sopenharmony_ci        case JSCallMode::SUPER_CALL_SPREAD_WITH_ARGV:
10934514f5e3Sopenharmony_ci            return RTSTUB_ID(SuperCallAndCheckToBaseline);
10944514f5e3Sopenharmony_ci        case JSCallMode::CALL_GETTER:
10954514f5e3Sopenharmony_ci            return RTSTUB_ID(CallGetter);
10964514f5e3Sopenharmony_ci        case JSCallMode::CALL_SETTER:
10974514f5e3Sopenharmony_ci            return RTSTUB_ID(CallSetter);
10984514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG2_WITH_RETURN:
10994514f5e3Sopenharmony_ci            return RTSTUB_ID(CallContainersArgs2);
11004514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG3_WITH_RETURN:
11014514f5e3Sopenharmony_ci            return RTSTUB_ID(CallContainersArgs3);
11024514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARGV_WITH_RETURN:
11034514f5e3Sopenharmony_ci            return RTSTUB_ID(CallReturnWithArgv);
11044514f5e3Sopenharmony_ci        default:
11054514f5e3Sopenharmony_ci            LOG_ECMA(FATAL) << "this branch is unreachable";
11064514f5e3Sopenharmony_ci            UNREACHABLE();
11074514f5e3Sopenharmony_ci    }
11084514f5e3Sopenharmony_ci}
11094514f5e3Sopenharmony_ci
11104514f5e3Sopenharmony_ciint CallStubBuilder::PrepareIdxForAsmInterpreterWithoutBaselineCode()
11114514f5e3Sopenharmony_ci{
11124514f5e3Sopenharmony_ci    switch (callArgs_.mode) {
11134514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG0:
11144514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG0:
11154514f5e3Sopenharmony_ci            return RTSTUB_ID(PushCallArg0AndDispatch);
11164514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG1:
11174514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG1:
11184514f5e3Sopenharmony_ci            return RTSTUB_ID(PushCallArg1AndDispatch);
11194514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG2:
11204514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG2:
11214514f5e3Sopenharmony_ci            return RTSTUB_ID(PushCallArgs2AndDispatch);
11224514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG3:
11234514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG3:
11244514f5e3Sopenharmony_ci            return RTSTUB_ID(PushCallArgs3AndDispatch);
11254514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG0:
11264514f5e3Sopenharmony_ci            return RTSTUB_ID(PushCallThisArg0AndDispatch);
11274514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG1:
11284514f5e3Sopenharmony_ci            return RTSTUB_ID(PushCallThisArg1AndDispatch);
11294514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG2:
11304514f5e3Sopenharmony_ci            return RTSTUB_ID(PushCallThisArgs2AndDispatch);
11314514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG3:
11324514f5e3Sopenharmony_ci            return RTSTUB_ID(PushCallThisArgs3AndDispatch);
11334514f5e3Sopenharmony_ci        case JSCallMode::CALL_WITH_ARGV:
11344514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_WITH_ARGV:
11354514f5e3Sopenharmony_ci            return RTSTUB_ID(PushCallRangeAndDispatch);
11364514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_WITH_ARGV:
11374514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_THIS_WITH_ARGV:
11384514f5e3Sopenharmony_ci            return RTSTUB_ID(PushCallThisRangeAndDispatch);
11394514f5e3Sopenharmony_ci        case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV:
11404514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_CONSTRUCTOR_WITH_ARGV:
11414514f5e3Sopenharmony_ci            return RTSTUB_ID(PushCallNewAndDispatch);
11424514f5e3Sopenharmony_ci        case JSCallMode::SUPER_CALL_WITH_ARGV:
11434514f5e3Sopenharmony_ci        case JSCallMode::SUPER_CALL_SPREAD_WITH_ARGV:
11444514f5e3Sopenharmony_ci            return RTSTUB_ID(PushSuperCallAndDispatch);
11454514f5e3Sopenharmony_ci        case JSCallMode::CALL_GETTER:
11464514f5e3Sopenharmony_ci            return RTSTUB_ID(CallGetter);
11474514f5e3Sopenharmony_ci        case JSCallMode::CALL_SETTER:
11484514f5e3Sopenharmony_ci            return RTSTUB_ID(CallSetter);
11494514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG2_WITH_RETURN:
11504514f5e3Sopenharmony_ci            return RTSTUB_ID(CallContainersArgs2);
11514514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG3_WITH_RETURN:
11524514f5e3Sopenharmony_ci            return RTSTUB_ID(CallContainersArgs3);
11534514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARGV_WITH_RETURN:
11544514f5e3Sopenharmony_ci            return RTSTUB_ID(CallReturnWithArgv);
11554514f5e3Sopenharmony_ci        default:
11564514f5e3Sopenharmony_ci            LOG_ECMA(FATAL) << "this branch is unreachable";
11574514f5e3Sopenharmony_ci            UNREACHABLE();
11584514f5e3Sopenharmony_ci    }
11594514f5e3Sopenharmony_ci}
11604514f5e3Sopenharmony_ci
11614514f5e3Sopenharmony_cistd::vector<GateRef> CallStubBuilder::PrepareArgsForAsmInterpreter()
11624514f5e3Sopenharmony_ci{
11634514f5e3Sopenharmony_ci    std::vector<GateRef> basicArgs = PrepareBasicArgsForAsmInterpreter();
11644514f5e3Sopenharmony_ci    std::vector<GateRef> appendArgs = PrepareAppendArgsForAsmInterpreter();
11654514f5e3Sopenharmony_ci
11664514f5e3Sopenharmony_ci    basicArgs.insert(basicArgs.end(), appendArgs.begin(), appendArgs.end());
11674514f5e3Sopenharmony_ci    return basicArgs;
11684514f5e3Sopenharmony_ci}
11694514f5e3Sopenharmony_ci
11704514f5e3Sopenharmony_cistd::vector<GateRef> CallStubBuilder::PrepareBasicArgsForAsmInterpreter()
11714514f5e3Sopenharmony_ci{
11724514f5e3Sopenharmony_ci    switch (callArgs_.mode) {
11734514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG0:
11744514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG1:
11754514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG2:
11764514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG3:
11774514f5e3Sopenharmony_ci        case JSCallMode::CALL_WITH_ARGV:
11784514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG0:
11794514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG1:
11804514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG2:
11814514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG3:
11824514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_WITH_ARGV:
11834514f5e3Sopenharmony_ci        case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV:
11844514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG0:
11854514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG1:
11864514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG2:
11874514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG3:
11884514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_WITH_ARGV:
11894514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_THIS_WITH_ARGV:
11904514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_CONSTRUCTOR_WITH_ARGV:
11914514f5e3Sopenharmony_ci        case JSCallMode::SUPER_CALL_WITH_ARGV:
11924514f5e3Sopenharmony_ci        case JSCallMode::SUPER_CALL_SPREAD_WITH_ARGV:
11934514f5e3Sopenharmony_ci            if (isForBaseline_) {
11944514f5e3Sopenharmony_ci                return { glue_, baselineBuiltinFp_, func_, method_, callField_ };
11954514f5e3Sopenharmony_ci            } else {
11964514f5e3Sopenharmony_ci                return { glue_, sp_, func_, method_, callField_ };
11974514f5e3Sopenharmony_ci            }
11984514f5e3Sopenharmony_ci        case JSCallMode::CALL_GETTER:
11994514f5e3Sopenharmony_ci        case JSCallMode::CALL_SETTER:
12004514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG2_WITH_RETURN:
12014514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG3_WITH_RETURN:
12024514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARGV_WITH_RETURN:
12034514f5e3Sopenharmony_ci            return { glue_, func_, method_, callField_ };
12044514f5e3Sopenharmony_ci        default:
12054514f5e3Sopenharmony_ci            LOG_ECMA(FATAL) << "this branch is unreachable";
12064514f5e3Sopenharmony_ci            UNREACHABLE();
12074514f5e3Sopenharmony_ci    }
12084514f5e3Sopenharmony_ci}
12094514f5e3Sopenharmony_ci
12104514f5e3Sopenharmony_cistd::vector<GateRef> CallStubBuilder::PrepareAppendArgsForAsmInterpreter()
12114514f5e3Sopenharmony_ci{
12124514f5e3Sopenharmony_ci    switch (callArgs_.mode) {
12134514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG0:
12144514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG0:
12154514f5e3Sopenharmony_ci            return {};
12164514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG1:
12174514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG1:
12184514f5e3Sopenharmony_ci            return { callArgs_.callArgs.arg0 };
12194514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG2:
12204514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG2:
12214514f5e3Sopenharmony_ci            return {
12224514f5e3Sopenharmony_ci                callArgs_.callArgs.arg0,
12234514f5e3Sopenharmony_ci                callArgs_.callArgs.arg1
12244514f5e3Sopenharmony_ci            };
12254514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG3:
12264514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG3:
12274514f5e3Sopenharmony_ci            return {
12284514f5e3Sopenharmony_ci                callArgs_.callArgs.arg0,
12294514f5e3Sopenharmony_ci                callArgs_.callArgs.arg1,
12304514f5e3Sopenharmony_ci                callArgs_.callArgs.arg2
12314514f5e3Sopenharmony_ci            };
12324514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG0:
12334514f5e3Sopenharmony_ci            return { callArgs_.callArgsWithThis.thisValue };
12344514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG1:
12354514f5e3Sopenharmony_ci            return {
12364514f5e3Sopenharmony_ci                callArgs_.callArgsWithThis.arg0,
12374514f5e3Sopenharmony_ci                callArgs_.callArgsWithThis.thisValue
12384514f5e3Sopenharmony_ci            };
12394514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG2:
12404514f5e3Sopenharmony_ci            return {
12414514f5e3Sopenharmony_ci                callArgs_.callArgsWithThis.arg0,
12424514f5e3Sopenharmony_ci                callArgs_.callArgsWithThis.arg1,
12434514f5e3Sopenharmony_ci                callArgs_.callArgsWithThis.thisValue
12444514f5e3Sopenharmony_ci            };
12454514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG3:
12464514f5e3Sopenharmony_ci            return {
12474514f5e3Sopenharmony_ci                callArgs_.callArgsWithThis.arg0,
12484514f5e3Sopenharmony_ci                callArgs_.callArgsWithThis.arg1,
12494514f5e3Sopenharmony_ci                callArgs_.callArgsWithThis.arg2,
12504514f5e3Sopenharmony_ci                callArgs_.callArgsWithThis.thisValue
12514514f5e3Sopenharmony_ci            };
12524514f5e3Sopenharmony_ci        case JSCallMode::CALL_WITH_ARGV:
12534514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_WITH_ARGV:
12544514f5e3Sopenharmony_ci            return {
12554514f5e3Sopenharmony_ci                callArgs_.callArgv.argc,
12564514f5e3Sopenharmony_ci                callArgs_.callArgv.argv
12574514f5e3Sopenharmony_ci            };
12584514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_WITH_ARGV:
12594514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_THIS_WITH_ARGV:
12604514f5e3Sopenharmony_ci            return {
12614514f5e3Sopenharmony_ci                callArgs_.callArgvWithThis.argc,
12624514f5e3Sopenharmony_ci                callArgs_.callArgvWithThis.argv,
12634514f5e3Sopenharmony_ci                callArgs_.callArgvWithThis.thisValue
12644514f5e3Sopenharmony_ci            };
12654514f5e3Sopenharmony_ci        case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV:
12664514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_CONSTRUCTOR_WITH_ARGV:
12674514f5e3Sopenharmony_ci            return {
12684514f5e3Sopenharmony_ci                callArgs_.callConstructorArgs.argc,
12694514f5e3Sopenharmony_ci                callArgs_.callConstructorArgs.argv,
12704514f5e3Sopenharmony_ci                callArgs_.callConstructorArgs.thisObj
12714514f5e3Sopenharmony_ci            };
12724514f5e3Sopenharmony_ci        case JSCallMode::CALL_GETTER:
12734514f5e3Sopenharmony_ci            return { callArgs_.callGetterArgs.receiver };
12744514f5e3Sopenharmony_ci        case JSCallMode::CALL_SETTER:
12754514f5e3Sopenharmony_ci            return {
12764514f5e3Sopenharmony_ci                callArgs_.callSetterArgs.value,
12774514f5e3Sopenharmony_ci                callArgs_.callSetterArgs.receiver
12784514f5e3Sopenharmony_ci            };
12794514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG2_WITH_RETURN:
12804514f5e3Sopenharmony_ci            return {
12814514f5e3Sopenharmony_ci                callArgs_.callThisArg2WithReturnArgs.arg0,
12824514f5e3Sopenharmony_ci                callArgs_.callThisArg2WithReturnArgs.arg1,
12834514f5e3Sopenharmony_ci                callArgs_.callThisArg2WithReturnArgs.thisValue
12844514f5e3Sopenharmony_ci            };
12854514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG3_WITH_RETURN:
12864514f5e3Sopenharmony_ci            return {
12874514f5e3Sopenharmony_ci                callArgs_.callThisArg3WithReturnArgs.value,
12884514f5e3Sopenharmony_ci                callArgs_.callThisArg3WithReturnArgs.key,
12894514f5e3Sopenharmony_ci                callArgs_.callThisArg3WithReturnArgs.thisValue,
12904514f5e3Sopenharmony_ci                callArgs_.callThisArg3WithReturnArgs.argHandle
12914514f5e3Sopenharmony_ci            };
12924514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARGV_WITH_RETURN:
12934514f5e3Sopenharmony_ci            return {
12944514f5e3Sopenharmony_ci                callArgs_.callThisArgvWithReturnArgs.argc,
12954514f5e3Sopenharmony_ci                callArgs_.callThisArgvWithReturnArgs.argv,
12964514f5e3Sopenharmony_ci                callArgs_.callThisArgvWithReturnArgs.thisValue
12974514f5e3Sopenharmony_ci            };
12984514f5e3Sopenharmony_ci        case JSCallMode::SUPER_CALL_WITH_ARGV:
12994514f5e3Sopenharmony_ci        case JSCallMode::SUPER_CALL_SPREAD_WITH_ARGV:
13004514f5e3Sopenharmony_ci            return {
13014514f5e3Sopenharmony_ci                callArgs_.superCallArgs.argc,
13024514f5e3Sopenharmony_ci                callArgs_.superCallArgs.argv,
13034514f5e3Sopenharmony_ci                callArgs_.superCallArgs.thisObj,
13044514f5e3Sopenharmony_ci                callArgs_.superCallArgs.newTarget
13054514f5e3Sopenharmony_ci            };
13064514f5e3Sopenharmony_ci        default:
13074514f5e3Sopenharmony_ci            LOG_ECMA(FATAL) << "this branch is unreachable";
13084514f5e3Sopenharmony_ci            UNREACHABLE();
13094514f5e3Sopenharmony_ci    }
13104514f5e3Sopenharmony_ci}
13114514f5e3Sopenharmony_ci
13124514f5e3Sopenharmony_civoid CallStubBuilder::CallFastBuiltin(Label* notFastBuiltins, Label *exit)
13134514f5e3Sopenharmony_ci{
13144514f5e3Sopenharmony_ci    auto env = GetEnvironment();
13154514f5e3Sopenharmony_ci    Label isFastBuiltins(env);
13164514f5e3Sopenharmony_ci    Label supportCall(env);
13174514f5e3Sopenharmony_ci    numArgs_ = ZExtInt32ToPtr(actualNumArgs_);
13184514f5e3Sopenharmony_ci    GateRef isFastBuiltinsMask = Int64(static_cast<uint64_t>(1) << MethodLiteral::IsFastBuiltinBit::START_BIT);
13194514f5e3Sopenharmony_ci    BRANCH(Int64NotEqual(Int64And(callField_, isFastBuiltinsMask), Int64(0)), &isFastBuiltins, notFastBuiltins);
13204514f5e3Sopenharmony_ci    Bind(&isFastBuiltins);
13214514f5e3Sopenharmony_ci    GateRef builtinId = GetBuiltinId(method_);
13224514f5e3Sopenharmony_ci    if (IsCallModeSupportCallBuiltin()) {
13234514f5e3Sopenharmony_ci        BRANCH(Int32GreaterThanOrEqual(builtinId, Int32(kungfu::BuiltinsStubCSigns::BUILTINS_CONSTRUCTOR_STUB_FIRST)),
13244514f5e3Sopenharmony_ci            notFastBuiltins, &supportCall);
13254514f5e3Sopenharmony_ci        Bind(&supportCall);
13264514f5e3Sopenharmony_ci    }
13274514f5e3Sopenharmony_ci    {
13284514f5e3Sopenharmony_ci        GateRef ret;
13294514f5e3Sopenharmony_ci        switch (callArgs_.mode) {
13304514f5e3Sopenharmony_ci            case JSCallMode::CALL_THIS_ARG0:
13314514f5e3Sopenharmony_ci            case JSCallMode::CALL_THIS_ARG1:
13324514f5e3Sopenharmony_ci            case JSCallMode::CALL_THIS_ARG2:
13334514f5e3Sopenharmony_ci            case JSCallMode::CALL_THIS_ARG3:
13344514f5e3Sopenharmony_ci                ret = DispatchBuiltins(glue_, builtinId, PrepareArgsForFastBuiltin());
13354514f5e3Sopenharmony_ci                break;
13364514f5e3Sopenharmony_ci            case JSCallMode::DEPRECATED_CALL_CONSTRUCTOR_WITH_ARGV:
13374514f5e3Sopenharmony_ci            case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV:
13384514f5e3Sopenharmony_ci                ret = DispatchBuiltinsWithArgv(glue_, builtinId, PrepareArgsForFastBuiltin());
13394514f5e3Sopenharmony_ci                break;
13404514f5e3Sopenharmony_ci            default:
13414514f5e3Sopenharmony_ci                LOG_ECMA(FATAL) << "this branch is unreachable";
13424514f5e3Sopenharmony_ci                UNREACHABLE();
13434514f5e3Sopenharmony_ci        }
13444514f5e3Sopenharmony_ci        result_->WriteVariable(ret);
13454514f5e3Sopenharmony_ci        Jump(exit);
13464514f5e3Sopenharmony_ci    }
13474514f5e3Sopenharmony_ci}
13484514f5e3Sopenharmony_ci
13494514f5e3Sopenharmony_cistd::vector<GateRef> CallStubBuilder::PrepareBasicArgsForFastBuiltin()
13504514f5e3Sopenharmony_ci{
13514514f5e3Sopenharmony_ci    return { glue_, nativeCode_, func_ };
13524514f5e3Sopenharmony_ci}
13534514f5e3Sopenharmony_ci
13544514f5e3Sopenharmony_cistd::vector<GateRef> CallStubBuilder::PrepareAppendArgsForFastBuiltin()
13554514f5e3Sopenharmony_ci{
13564514f5e3Sopenharmony_ci    switch (callArgs_.mode) {
13574514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG0:
13584514f5e3Sopenharmony_ci            return { Undefined(),
13594514f5e3Sopenharmony_ci                callArgs_.callArgsWithThis.thisValue, numArgs_, Undefined(), Undefined(), Undefined()
13604514f5e3Sopenharmony_ci            };
13614514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG1:
13624514f5e3Sopenharmony_ci            return { Undefined(),
13634514f5e3Sopenharmony_ci                callArgs_.callArgsWithThis.thisValue, numArgs_,
13644514f5e3Sopenharmony_ci                callArgs_.callArgsWithThis.arg0, Undefined(), Undefined()
13654514f5e3Sopenharmony_ci            };
13664514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG2:
13674514f5e3Sopenharmony_ci            return { Undefined(),
13684514f5e3Sopenharmony_ci                callArgs_.callArgsWithThis.thisValue, numArgs_,
13694514f5e3Sopenharmony_ci                callArgs_.callArgsWithThis.arg0,
13704514f5e3Sopenharmony_ci                callArgs_.callArgsWithThis.arg1, Undefined()
13714514f5e3Sopenharmony_ci            };
13724514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG3:
13734514f5e3Sopenharmony_ci            return { Undefined(),
13744514f5e3Sopenharmony_ci                callArgs_.callArgsWithThis.thisValue, numArgs_,
13754514f5e3Sopenharmony_ci                callArgs_.callArgsWithThis.arg0,
13764514f5e3Sopenharmony_ci                callArgs_.callArgsWithThis.arg1,
13774514f5e3Sopenharmony_ci                callArgs_.callArgsWithThis.arg2
13784514f5e3Sopenharmony_ci            };
13794514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_CONSTRUCTOR_WITH_ARGV:
13804514f5e3Sopenharmony_ci        case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV:
13814514f5e3Sopenharmony_ci            return { func_, thisValue_, numArgs_,
13824514f5e3Sopenharmony_ci                callArgs_.callConstructorArgs.argv
13834514f5e3Sopenharmony_ci            };
13844514f5e3Sopenharmony_ci        default:
13854514f5e3Sopenharmony_ci            LOG_ECMA(FATAL) << "this branch is unreachable";
13864514f5e3Sopenharmony_ci            UNREACHABLE();
13874514f5e3Sopenharmony_ci    }
13884514f5e3Sopenharmony_ci}
13894514f5e3Sopenharmony_ci
13904514f5e3Sopenharmony_cistd::vector<GateRef> CallStubBuilder::PrepareArgsForFastBuiltin()
13914514f5e3Sopenharmony_ci{
13924514f5e3Sopenharmony_ci    std::vector<GateRef> basicArgs = PrepareBasicArgsForFastBuiltin();
13934514f5e3Sopenharmony_ci    std::vector<GateRef> appendArgs = PrepareAppendArgsForFastBuiltin();
13944514f5e3Sopenharmony_ci
13954514f5e3Sopenharmony_ci    basicArgs.insert(basicArgs.end(), appendArgs.begin(), appendArgs.end());
13964514f5e3Sopenharmony_ci    return basicArgs;
13974514f5e3Sopenharmony_ci}
13984514f5e3Sopenharmony_ci
13994514f5e3Sopenharmony_cibool CallStubBuilder::IsCallModeSupportPGO() const
14004514f5e3Sopenharmony_ci{
14014514f5e3Sopenharmony_ci    switch (callArgs_.mode) {
14024514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG0:
14034514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG1:
14044514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG2:
14054514f5e3Sopenharmony_ci        case JSCallMode::CALL_ARG3:
14064514f5e3Sopenharmony_ci        case JSCallMode::CALL_WITH_ARGV:
14074514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG0:
14084514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG1:
14094514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG2:
14104514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG3:
14114514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_WITH_ARGV:
14124514f5e3Sopenharmony_ci        case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV:
14134514f5e3Sopenharmony_ci        case JSCallMode::SUPER_CALL_WITH_ARGV:
14144514f5e3Sopenharmony_ci        case JSCallMode::SUPER_CALL_SPREAD_WITH_ARGV:
14154514f5e3Sopenharmony_ci        case JSCallMode::CALL_GETTER:
14164514f5e3Sopenharmony_ci        case JSCallMode::CALL_SETTER:
14174514f5e3Sopenharmony_ci            return true;
14184514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG0:
14194514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG1:
14204514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG2:
14214514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_ARG3:
14224514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_WITH_ARGV:
14234514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_THIS_WITH_ARGV:
14244514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_CONSTRUCTOR_WITH_ARGV:
14254514f5e3Sopenharmony_ci        case JSCallMode::CALL_ENTRY:
14264514f5e3Sopenharmony_ci        case JSCallMode::CALL_FROM_AOT:
14274514f5e3Sopenharmony_ci        case JSCallMode::CALL_GENERATOR:
14284514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG2_WITH_RETURN:
14294514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG3_WITH_RETURN:
14304514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARGV_WITH_RETURN:
14314514f5e3Sopenharmony_ci            return false;
14324514f5e3Sopenharmony_ci        default:
14334514f5e3Sopenharmony_ci            LOG_ECMA(FATAL) << "this branch is unreachable";
14344514f5e3Sopenharmony_ci            UNREACHABLE();
14354514f5e3Sopenharmony_ci    }
14364514f5e3Sopenharmony_ci}
14374514f5e3Sopenharmony_ci
14384514f5e3Sopenharmony_cibool CallStubBuilder::IsCallModeSupportCallBuiltin() const
14394514f5e3Sopenharmony_ci{
14404514f5e3Sopenharmony_ci    switch (callArgs_.mode) {
14414514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG0:
14424514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG1:
14434514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG2:
14444514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG3:
14454514f5e3Sopenharmony_ci            return true;
14464514f5e3Sopenharmony_ci        case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV:
14474514f5e3Sopenharmony_ci        case JSCallMode::DEPRECATED_CALL_CONSTRUCTOR_WITH_ARGV:
14484514f5e3Sopenharmony_ci            return false;
14494514f5e3Sopenharmony_ci        default:
14504514f5e3Sopenharmony_ci            LOG_ECMA(FATAL) << "this branch is unreachable";
14514514f5e3Sopenharmony_ci            UNREACHABLE();
14524514f5e3Sopenharmony_ci    }
14534514f5e3Sopenharmony_ci}
14544514f5e3Sopenharmony_ci
14554514f5e3Sopenharmony_cibool CallStubBuilder::CheckResultValueChangedWithReturn(GateRef prevResRef) const
14564514f5e3Sopenharmony_ci{
14574514f5e3Sopenharmony_ci    switch (callArgs_.mode) {
14584514f5e3Sopenharmony_ci        case JSCallMode::CALL_GETTER:
14594514f5e3Sopenharmony_ci        case JSCallMode::CALL_SETTER:
14604514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG2_WITH_RETURN:
14614514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARG3_WITH_RETURN:
14624514f5e3Sopenharmony_ci        case JSCallMode::CALL_THIS_ARGV_WITH_RETURN:
14634514f5e3Sopenharmony_ci            return result_->Value() == prevResRef;
14644514f5e3Sopenharmony_ci        default:
14654514f5e3Sopenharmony_ci            return result_->Value() != prevResRef;
14664514f5e3Sopenharmony_ci    }
14674514f5e3Sopenharmony_ci}
14684514f5e3Sopenharmony_ci
14694514f5e3Sopenharmony_cibool CallStubBuilder::IsSlowAotCall() const
14704514f5e3Sopenharmony_ci{ return !isFast_ && !isBridge_; }
14714514f5e3Sopenharmony_ci
14724514f5e3Sopenharmony_cibool CallStubBuilder::IsFastAotCall() const
14734514f5e3Sopenharmony_ci{ return isFast_ && !isBridge_; }
14744514f5e3Sopenharmony_ci
14754514f5e3Sopenharmony_cibool CallStubBuilder::IsSlowAotCallWithBridge() const
14764514f5e3Sopenharmony_ci{ return !isFast_ && isBridge_; }
14774514f5e3Sopenharmony_ci
14784514f5e3Sopenharmony_cibool CallStubBuilder::IsFastAotCallWithBridge() const
14794514f5e3Sopenharmony_ci{ return isFast_ && isBridge_; }
14804514f5e3Sopenharmony_ci
14814514f5e3Sopenharmony_civoid CallStubBuilder::HandleProfileCall()
14824514f5e3Sopenharmony_ci{
14834514f5e3Sopenharmony_ci    if (!callback_.IsEmpty()) {
14844514f5e3Sopenharmony_ci        if (!IsCallModeSupportPGO()) {
14854514f5e3Sopenharmony_ci            return;
14864514f5e3Sopenharmony_ci        }
14874514f5e3Sopenharmony_ci        if (IsCallModeGetterSetter()) {
14884514f5e3Sopenharmony_ci            callback_.ProfileGetterSetterCall(func_);
14894514f5e3Sopenharmony_ci            return;
14904514f5e3Sopenharmony_ci        }
14914514f5e3Sopenharmony_ci        callback_.ProfileCall(func_);
14924514f5e3Sopenharmony_ci    }
14934514f5e3Sopenharmony_ci}
14944514f5e3Sopenharmony_ci
14954514f5e3Sopenharmony_civoid CallStubBuilder::HandleProfileNativeCall()
14964514f5e3Sopenharmony_ci{
14974514f5e3Sopenharmony_ci    if (!callback_.IsEmpty()) {
14984514f5e3Sopenharmony_ci        if (!IsCallModeSupportPGO()) {
14994514f5e3Sopenharmony_ci            return;
15004514f5e3Sopenharmony_ci        }
15014514f5e3Sopenharmony_ci        if (!IsCallModeGetterSetter()) {
15024514f5e3Sopenharmony_ci            callback_.ProfileNativeCall(func_);
15034514f5e3Sopenharmony_ci        }
15044514f5e3Sopenharmony_ci    }
15054514f5e3Sopenharmony_ci}
15064514f5e3Sopenharmony_ci
15074514f5e3Sopenharmony_cibool CallStubBuilder::IsCallModeGetterSetter()
15084514f5e3Sopenharmony_ci{
15094514f5e3Sopenharmony_ci    switch (callArgs_.mode) {
15104514f5e3Sopenharmony_ci        case JSCallMode::CALL_GETTER:
15114514f5e3Sopenharmony_ci        case JSCallMode::CALL_SETTER:
15124514f5e3Sopenharmony_ci            return true;
15134514f5e3Sopenharmony_ci        default:
15144514f5e3Sopenharmony_ci            return false;
15154514f5e3Sopenharmony_ci    }
15164514f5e3Sopenharmony_ci}
15174514f5e3Sopenharmony_ci
15184514f5e3Sopenharmony_ci} // panda::ecmascript::kungfu
1519