1/* 2 * Copyright (c) 2024 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16#include "ecmascript/compiler/trampoline/aarch64/common_call.h" 17#include "ecmascript/js_thread.h" 18#include "ecmascript/compiler/assembler/aarch64/extend_assembler.h" 19 20namespace panda::ecmascript::aarch64 { 21using Label = panda::ecmascript::Label; 22#define __ assembler-> 23 24/* other->baseline */ 25void BaselineCall::CallArg0AndCheckToBaseline(ExtendedAssembler *assembler) 26{ 27 __ BindAssemblerStub(RTSTUB_ID(CallArg0AndCheckToBaseline)); 28 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_ARG0, 29 FrameTransitionType::OTHER_TO_BASELINE_CHECK); 30} 31 32void BaselineCall::CallArg1AndCheckToBaseline(ExtendedAssembler *assembler) 33{ 34 __ BindAssemblerStub(RTSTUB_ID(CallArg1AndCheckToBaseline)); 35 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_ARG1, 36 FrameTransitionType::OTHER_TO_BASELINE_CHECK); 37} 38 39void BaselineCall::CallArgs2AndCheckToBaseline(ExtendedAssembler *assembler) 40{ 41 __ BindAssemblerStub(RTSTUB_ID(CallArgs2AndCheckToBaseline)); 42 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_ARG2, 43 FrameTransitionType::OTHER_TO_BASELINE_CHECK); 44} 45 46void BaselineCall::CallArgs3AndCheckToBaseline(ExtendedAssembler *assembler) 47{ 48 __ BindAssemblerStub(RTSTUB_ID(CallArgs3AndCheckToBaseline)); 49 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_ARG3, 50 FrameTransitionType::OTHER_TO_BASELINE_CHECK); 51} 52 53void BaselineCall::CallThisArg0AndCheckToBaseline(ExtendedAssembler *assembler) 54{ 55 __ BindAssemblerStub(RTSTUB_ID(CallThisArg0AndCheckToBaseline)); 56 AsmInterpreterCall::JSCallCommonEntry( 57 assembler, JSCallMode::CALL_THIS_ARG0, FrameTransitionType::OTHER_TO_BASELINE_CHECK); 58} 59 60void BaselineCall::CallThisArg1AndCheckToBaseline(ExtendedAssembler *assembler) 61{ 62 __ BindAssemblerStub(RTSTUB_ID(CallThisArg1AndCheckToBaseline)); 63 AsmInterpreterCall::JSCallCommonEntry( 64 assembler, JSCallMode::CALL_THIS_ARG1, FrameTransitionType::OTHER_TO_BASELINE_CHECK); 65} 66 67void BaselineCall::CallThisArgs2AndCheckToBaseline(ExtendedAssembler *assembler) 68{ 69 __ BindAssemblerStub(RTSTUB_ID(CallThisArgs2AndCheckToBaseline)); 70 AsmInterpreterCall::JSCallCommonEntry( 71 assembler, JSCallMode::CALL_THIS_ARG2, FrameTransitionType::OTHER_TO_BASELINE_CHECK); 72} 73 74void BaselineCall::CallThisArgs3AndCheckToBaseline(ExtendedAssembler *assembler) 75{ 76 __ BindAssemblerStub(RTSTUB_ID(CallThisArgs3AndCheckToBaseline)); 77 AsmInterpreterCall::JSCallCommonEntry( 78 assembler, JSCallMode::CALL_THIS_ARG3, FrameTransitionType::OTHER_TO_BASELINE_CHECK); 79} 80 81void BaselineCall::CallRangeAndCheckToBaseline(ExtendedAssembler *assembler) 82{ 83 __ BindAssemblerStub(RTSTUB_ID(CallRangeAndCheckToBaseline)); 84 AsmInterpreterCall::JSCallCommonEntry( 85 assembler, JSCallMode::CALL_WITH_ARGV, FrameTransitionType::OTHER_TO_BASELINE_CHECK); 86} 87 88void BaselineCall::CallNewAndCheckToBaseline(ExtendedAssembler *assembler) 89{ 90 __ BindAssemblerStub(RTSTUB_ID(CallNewAndCheckToBaseline)); 91 AsmInterpreterCall::JSCallCommonEntry( 92 assembler, JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV, FrameTransitionType::OTHER_TO_BASELINE_CHECK); 93} 94 95void BaselineCall::SuperCallAndCheckToBaseline(ExtendedAssembler *assembler) 96{ 97 __ BindAssemblerStub(RTSTUB_ID(SuperCallAndCheckToBaseline)); 98 AsmInterpreterCall::JSCallCommonEntry( 99 assembler, JSCallMode::SUPER_CALL_WITH_ARGV, FrameTransitionType::OTHER_TO_BASELINE_CHECK); 100} 101 102void BaselineCall::CallThisRangeAndCheckToBaseline(ExtendedAssembler *assembler) 103{ 104 __ BindAssemblerStub(RTSTUB_ID(CallThisRangeAndCheckToBaseline)); 105 AsmInterpreterCall::JSCallCommonEntry( 106 assembler, JSCallMode::CALL_THIS_WITH_ARGV, FrameTransitionType::OTHER_TO_BASELINE_CHECK); 107} 108 109/* baseline->other */ 110void BaselineCall::CallArg0AndDispatchFromBaseline(ExtendedAssembler *assembler) 111{ 112 __ BindAssemblerStub(RTSTUB_ID(CallArg0AndDispatchFromBaseline)); 113 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_ARG0, FrameTransitionType::BASELINE_TO_OTHER); 114} 115 116void BaselineCall::CallArg1AndDispatchFromBaseline(ExtendedAssembler *assembler) 117{ 118 __ BindAssemblerStub(RTSTUB_ID(CallArg1AndDispatchFromBaseline)); 119 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_ARG1, FrameTransitionType::BASELINE_TO_OTHER); 120} 121 122void BaselineCall::CallArgs2AndDispatchFromBaseline(ExtendedAssembler *assembler) 123{ 124 __ BindAssemblerStub(RTSTUB_ID(CallArgs2AndDispatchFromBaseline)); 125 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_ARG2, FrameTransitionType::BASELINE_TO_OTHER); 126} 127 128void BaselineCall::CallArgs3AndDispatchFromBaseline(ExtendedAssembler *assembler) 129{ 130 __ BindAssemblerStub(RTSTUB_ID(CallArgs3AndDispatchFromBaseline)); 131 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_ARG3, FrameTransitionType::BASELINE_TO_OTHER); 132} 133 134void BaselineCall::CallThisArg0AndDispatchFromBaseline(ExtendedAssembler *assembler) 135{ 136 __ BindAssemblerStub(RTSTUB_ID(CallThisArg0AndDispatchFromBaseline)); 137 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_THIS_ARG0, 138 FrameTransitionType::BASELINE_TO_OTHER); 139} 140 141void BaselineCall::CallThisArg1AndDispatchFromBaseline(ExtendedAssembler *assembler) 142{ 143 __ BindAssemblerStub(RTSTUB_ID(CallThisArg1AndDispatchFromBaseline)); 144 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_THIS_ARG1, 145 FrameTransitionType::BASELINE_TO_OTHER); 146} 147 148void BaselineCall::CallThisArgs2AndDispatchFromBaseline(ExtendedAssembler *assembler) 149{ 150 __ BindAssemblerStub(RTSTUB_ID(CallThisArgs2AndDispatchFromBaseline)); 151 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_THIS_ARG2, 152 FrameTransitionType::BASELINE_TO_OTHER); 153} 154 155void BaselineCall::CallThisArgs3AndDispatchFromBaseline(ExtendedAssembler *assembler) 156{ 157 __ BindAssemblerStub(RTSTUB_ID(CallThisArgs3AndDispatchFromBaseline)); 158 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_THIS_ARG3, 159 FrameTransitionType::BASELINE_TO_OTHER); 160} 161 162void BaselineCall::CallRangeAndDispatchFromBaseline(ExtendedAssembler *assembler) 163{ 164 __ BindAssemblerStub(RTSTUB_ID(CallRangeAndDispatchFromBaseline)); 165 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_WITH_ARGV, 166 FrameTransitionType::BASELINE_TO_OTHER); 167} 168 169void BaselineCall::CallNewAndDispatchFromBaseline(ExtendedAssembler *assembler) 170{ 171 __ BindAssemblerStub(RTSTUB_ID(CallNewAndDispatchFromBaseline)); 172 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV, 173 FrameTransitionType::BASELINE_TO_OTHER); 174} 175 176void BaselineCall::SuperCallAndDispatchFromBaseline(ExtendedAssembler *assembler) 177{ 178 __ BindAssemblerStub(RTSTUB_ID(SuperCallAndDispatchFromBaseline)); 179 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::SUPER_CALL_WITH_ARGV, 180 FrameTransitionType::BASELINE_TO_OTHER); 181} 182 183void BaselineCall::CallThisRangeAndDispatchFromBaseline(ExtendedAssembler *assembler) 184{ 185 __ BindAssemblerStub(RTSTUB_ID(CallThisRangeAndDispatchFromBaseline)); 186 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_THIS_WITH_ARGV, 187 FrameTransitionType::BASELINE_TO_OTHER); 188} 189 190/* baseline->baseline */ 191void BaselineCall::CallArg0AndCheckToBaselineFromBaseline(ExtendedAssembler *assembler) 192{ 193 __ BindAssemblerStub(RTSTUB_ID(CallArg0AndCheckToBaselineFromBaseline)); 194 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_ARG0, 195 FrameTransitionType::BASELINE_TO_BASELINE_CHECK); 196} 197 198void BaselineCall::CallArg1AndCheckToBaselineFromBaseline(ExtendedAssembler *assembler) 199{ 200 __ BindAssemblerStub(RTSTUB_ID(CallArg1AndCheckToBaselineFromBaseline)); 201 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_ARG1, 202 FrameTransitionType::BASELINE_TO_BASELINE_CHECK); 203} 204 205void BaselineCall::CallArgs2AndCheckToBaselineFromBaseline(ExtendedAssembler *assembler) 206{ 207 __ BindAssemblerStub(RTSTUB_ID(CallArgs2AndCheckToBaselineFromBaseline)); 208 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_ARG2, 209 FrameTransitionType::BASELINE_TO_BASELINE_CHECK); 210} 211 212void BaselineCall::CallArgs3AndCheckToBaselineFromBaseline(ExtendedAssembler *assembler) 213{ 214 __ BindAssemblerStub(RTSTUB_ID(CallArgs3AndCheckToBaselineFromBaseline)); 215 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_ARG3, 216 FrameTransitionType::BASELINE_TO_BASELINE_CHECK); 217} 218 219void BaselineCall::CallRangeAndCheckToBaselineFromBaseline(ExtendedAssembler *assembler) 220{ 221 __ BindAssemblerStub(RTSTUB_ID(CallRangeAndCheckToBaselineFromBaseline)); 222 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_WITH_ARGV, 223 FrameTransitionType::BASELINE_TO_BASELINE_CHECK); 224} 225 226void BaselineCall::CallThisRangeAndCheckToBaselineFromBaseline(ExtendedAssembler *assembler) 227{ 228 __ BindAssemblerStub(RTSTUB_ID(CallThisRangeAndCheckToBaselineFromBaseline)); 229 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_THIS_WITH_ARGV, 230 FrameTransitionType::BASELINE_TO_BASELINE_CHECK); 231} 232 233void BaselineCall::CallThisArg0AndCheckToBaselineFromBaseline(ExtendedAssembler *assembler) 234{ 235 __ BindAssemblerStub(RTSTUB_ID(CallThisArg0AndCheckToBaselineFromBaseline)); 236 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_THIS_ARG0, 237 FrameTransitionType::BASELINE_TO_BASELINE_CHECK); 238} 239 240void BaselineCall::CallThisArg1AndCheckToBaselineFromBaseline(ExtendedAssembler *assembler) 241{ 242 __ BindAssemblerStub(RTSTUB_ID(CallThisArg1AndCheckToBaselineFromBaseline)); 243 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_THIS_ARG1, 244 FrameTransitionType::BASELINE_TO_BASELINE_CHECK); 245} 246 247void BaselineCall::CallThisArgs2AndCheckToBaselineFromBaseline(ExtendedAssembler *assembler) 248{ 249 __ BindAssemblerStub(RTSTUB_ID(CallThisArgs2AndCheckToBaselineFromBaseline)); 250 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_THIS_ARG2, 251 FrameTransitionType::BASELINE_TO_BASELINE_CHECK); 252} 253 254void BaselineCall::CallThisArgs3AndCheckToBaselineFromBaseline(ExtendedAssembler *assembler) 255{ 256 __ BindAssemblerStub(RTSTUB_ID(CallThisArgs3AndCheckToBaselineFromBaseline)); 257 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_THIS_ARG3, 258 FrameTransitionType::BASELINE_TO_BASELINE_CHECK); 259} 260 261void BaselineCall::CallNewAndCheckToBaselineFromBaseline(ExtendedAssembler *assembler) 262{ 263 __ BindAssemblerStub(RTSTUB_ID(CallNewAndCheckToBaselineFromBaseline)); 264 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV, 265 FrameTransitionType::BASELINE_TO_BASELINE_CHECK); 266} 267 268void BaselineCall::SuperCallAndCheckToBaselineFromBaseline(ExtendedAssembler *assembler) 269{ 270 __ BindAssemblerStub(RTSTUB_ID(SuperCallAndCheckToBaselineFromBaseline)); 271 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::SUPER_CALL_WITH_ARGV, 272 FrameTransitionType::BASELINE_TO_BASELINE_CHECK); 273} 274 275void BaselineCall::GetBaselineBuiltinFp(ExtendedAssembler *assembler) 276{ 277 __ BindAssemblerStub(RTSTUB_ID(GetBaselineBuiltinFp)); 278 Register ret = X0; 279 Register fp = X29; 280 __ Mov(ret, fp); 281 __ Ret(); 282} 283#undef __ 284} // namespace panda::ecmascript::aarch64