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/x64/common_call.h" 17 18namespace panda::ecmascript::x64 { 19#define __ assembler-> 20 21/* other->baseline */ 22void BaselineCall::CallArg0AndCheckToBaseline(ExtendedAssembler *assembler) 23{ 24 __ BindAssemblerStub(RTSTUB_ID(CallArg0AndCheckToBaseline)); 25 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_ARG0, 26 FrameTransitionType::OTHER_TO_BASELINE_CHECK); 27} 28 29void BaselineCall::CallArg1AndCheckToBaseline(ExtendedAssembler *assembler) 30{ 31 __ BindAssemblerStub(RTSTUB_ID(CallArg1AndCheckToBaseline)); 32 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_ARG1, 33 FrameTransitionType::OTHER_TO_BASELINE_CHECK); 34} 35 36void BaselineCall::CallArgs2AndCheckToBaseline(ExtendedAssembler *assembler) 37{ 38 __ BindAssemblerStub(RTSTUB_ID(CallArgs2AndCheckToBaseline)); 39 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_ARG2, 40 FrameTransitionType::OTHER_TO_BASELINE_CHECK); 41} 42 43void BaselineCall::CallArgs3AndCheckToBaseline(ExtendedAssembler *assembler) 44{ 45 __ BindAssemblerStub(RTSTUB_ID(CallArgs3AndCheckToBaseline)); 46 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_ARG3, 47 FrameTransitionType::OTHER_TO_BASELINE_CHECK); 48} 49 50void BaselineCall::CallThisArg0AndCheckToBaseline(ExtendedAssembler *assembler) 51{ 52 __ BindAssemblerStub(RTSTUB_ID(CallThisArg0AndCheckToBaseline)); 53 AsmInterpreterCall::JSCallCommonEntry( 54 assembler, JSCallMode::CALL_THIS_ARG0, FrameTransitionType::OTHER_TO_BASELINE_CHECK); 55} 56 57void BaselineCall::CallThisArg1AndCheckToBaseline(ExtendedAssembler *assembler) 58{ 59 __ BindAssemblerStub(RTSTUB_ID(CallThisArg1AndCheckToBaseline)); 60 AsmInterpreterCall::JSCallCommonEntry( 61 assembler, JSCallMode::CALL_THIS_ARG1, FrameTransitionType::OTHER_TO_BASELINE_CHECK); 62} 63 64void BaselineCall::CallThisArgs2AndCheckToBaseline(ExtendedAssembler *assembler) 65{ 66 __ BindAssemblerStub(RTSTUB_ID(CallThisArgs2AndCheckToBaseline)); 67 AsmInterpreterCall::JSCallCommonEntry( 68 assembler, JSCallMode::CALL_THIS_ARG2, FrameTransitionType::OTHER_TO_BASELINE_CHECK); 69} 70 71void BaselineCall::CallThisArgs3AndCheckToBaseline(ExtendedAssembler *assembler) 72{ 73 __ BindAssemblerStub(RTSTUB_ID(CallThisArgs3AndCheckToBaseline)); 74 AsmInterpreterCall::JSCallCommonEntry( 75 assembler, JSCallMode::CALL_THIS_ARG3, FrameTransitionType::OTHER_TO_BASELINE_CHECK); 76} 77 78void BaselineCall::CallRangeAndCheckToBaseline(ExtendedAssembler *assembler) 79{ 80 __ BindAssemblerStub(RTSTUB_ID(CallRangeAndCheckToBaseline)); 81 AsmInterpreterCall::JSCallCommonEntry( 82 assembler, JSCallMode::CALL_WITH_ARGV, FrameTransitionType::OTHER_TO_BASELINE_CHECK); 83} 84 85void BaselineCall::CallNewAndCheckToBaseline(ExtendedAssembler *assembler) 86{ 87 __ BindAssemblerStub(RTSTUB_ID(CallNewAndCheckToBaseline)); 88 AsmInterpreterCall::JSCallCommonEntry( 89 assembler, JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV, FrameTransitionType::OTHER_TO_BASELINE_CHECK); 90} 91 92void BaselineCall::SuperCallAndCheckToBaseline(ExtendedAssembler *assembler) 93{ 94 __ BindAssemblerStub(RTSTUB_ID(SuperCallAndCheckToBaseline)); 95 AsmInterpreterCall::JSCallCommonEntry( 96 assembler, JSCallMode::SUPER_CALL_WITH_ARGV, FrameTransitionType::OTHER_TO_BASELINE_CHECK); 97} 98 99void BaselineCall::CallThisRangeAndCheckToBaseline(ExtendedAssembler *assembler) 100{ 101 __ BindAssemblerStub(RTSTUB_ID(CallThisRangeAndCheckToBaseline)); 102 AsmInterpreterCall::JSCallCommonEntry( 103 assembler, JSCallMode::CALL_THIS_WITH_ARGV, FrameTransitionType::OTHER_TO_BASELINE_CHECK); 104} 105 106/* baseline->other */ 107void BaselineCall::CallArg0AndDispatchFromBaseline(ExtendedAssembler *assembler) 108{ 109 __ BindAssemblerStub(RTSTUB_ID(CallArg0AndDispatchFromBaseline)); 110 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_ARG0, FrameTransitionType::BASELINE_TO_OTHER); 111} 112 113void BaselineCall::CallArg1AndDispatchFromBaseline(ExtendedAssembler *assembler) 114{ 115 __ BindAssemblerStub(RTSTUB_ID(CallArg1AndDispatchFromBaseline)); 116 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_ARG1, FrameTransitionType::BASELINE_TO_OTHER); 117} 118 119void BaselineCall::CallArgs2AndDispatchFromBaseline(ExtendedAssembler *assembler) 120{ 121 __ BindAssemblerStub(RTSTUB_ID(CallArgs2AndDispatchFromBaseline)); 122 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_ARG2, FrameTransitionType::BASELINE_TO_OTHER); 123} 124 125void BaselineCall::CallArgs3AndDispatchFromBaseline(ExtendedAssembler *assembler) 126{ 127 __ BindAssemblerStub(RTSTUB_ID(CallArgs3AndDispatchFromBaseline)); 128 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_ARG3, FrameTransitionType::BASELINE_TO_OTHER); 129} 130 131void BaselineCall::CallThisArg0AndDispatchFromBaseline(ExtendedAssembler *assembler) 132{ 133 __ BindAssemblerStub(RTSTUB_ID(CallThisArg0AndDispatchFromBaseline)); 134 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_THIS_ARG0, 135 FrameTransitionType::BASELINE_TO_OTHER); 136} 137 138void BaselineCall::CallThisArg1AndDispatchFromBaseline(ExtendedAssembler *assembler) 139{ 140 __ BindAssemblerStub(RTSTUB_ID(CallThisArg1AndDispatchFromBaseline)); 141 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_THIS_ARG1, 142 FrameTransitionType::BASELINE_TO_OTHER); 143} 144 145void BaselineCall::CallThisArgs2AndDispatchFromBaseline(ExtendedAssembler *assembler) 146{ 147 __ BindAssemblerStub(RTSTUB_ID(CallThisArgs2AndDispatchFromBaseline)); 148 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_THIS_ARG2, 149 FrameTransitionType::BASELINE_TO_OTHER); 150} 151 152void BaselineCall::CallThisArgs3AndDispatchFromBaseline(ExtendedAssembler *assembler) 153{ 154 __ BindAssemblerStub(RTSTUB_ID(CallThisArgs3AndDispatchFromBaseline)); 155 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_THIS_ARG3, 156 FrameTransitionType::BASELINE_TO_OTHER); 157} 158 159void BaselineCall::CallRangeAndDispatchFromBaseline(ExtendedAssembler *assembler) 160{ 161 __ BindAssemblerStub(RTSTUB_ID(CallRangeAndDispatchFromBaseline)); 162 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_WITH_ARGV, 163 FrameTransitionType::BASELINE_TO_OTHER); 164} 165 166void BaselineCall::CallNewAndDispatchFromBaseline(ExtendedAssembler *assembler) 167{ 168 __ BindAssemblerStub(RTSTUB_ID(CallNewAndDispatchFromBaseline)); 169 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV, 170 FrameTransitionType::BASELINE_TO_OTHER); 171} 172 173void BaselineCall::SuperCallAndDispatchFromBaseline(ExtendedAssembler *assembler) 174{ 175 __ BindAssemblerStub(RTSTUB_ID(SuperCallAndDispatchFromBaseline)); 176 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::SUPER_CALL_WITH_ARGV, 177 FrameTransitionType::BASELINE_TO_OTHER); 178} 179 180void BaselineCall::CallThisRangeAndDispatchFromBaseline(ExtendedAssembler *assembler) 181{ 182 __ BindAssemblerStub(RTSTUB_ID(CallThisRangeAndDispatchFromBaseline)); 183 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_THIS_WITH_ARGV, 184 FrameTransitionType::BASELINE_TO_OTHER); 185} 186 187/* baseline->baseline */ 188void BaselineCall::CallArg0AndCheckToBaselineFromBaseline(ExtendedAssembler *assembler) 189{ 190 __ BindAssemblerStub(RTSTUB_ID(CallArg0AndCheckToBaselineFromBaseline)); 191 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_ARG0, 192 FrameTransitionType::BASELINE_TO_BASELINE_CHECK); 193} 194 195void BaselineCall::CallArg1AndCheckToBaselineFromBaseline(ExtendedAssembler *assembler) 196{ 197 __ BindAssemblerStub(RTSTUB_ID(CallArg1AndCheckToBaselineFromBaseline)); 198 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_ARG1, 199 FrameTransitionType::BASELINE_TO_BASELINE_CHECK); 200} 201 202void BaselineCall::CallArgs2AndCheckToBaselineFromBaseline(ExtendedAssembler *assembler) 203{ 204 __ BindAssemblerStub(RTSTUB_ID(CallArgs2AndCheckToBaselineFromBaseline)); 205 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_ARG2, 206 FrameTransitionType::BASELINE_TO_BASELINE_CHECK); 207} 208 209void BaselineCall::CallArgs3AndCheckToBaselineFromBaseline(ExtendedAssembler *assembler) 210{ 211 __ BindAssemblerStub(RTSTUB_ID(CallArgs3AndCheckToBaselineFromBaseline)); 212 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_ARG3, 213 FrameTransitionType::BASELINE_TO_BASELINE_CHECK); 214} 215 216void BaselineCall::CallRangeAndCheckToBaselineFromBaseline(ExtendedAssembler *assembler) 217{ 218 __ BindAssemblerStub(RTSTUB_ID(CallRangeAndCheckToBaselineFromBaseline)); 219 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_WITH_ARGV, 220 FrameTransitionType::BASELINE_TO_BASELINE_CHECK); 221} 222 223void BaselineCall::CallThisRangeAndCheckToBaselineFromBaseline(ExtendedAssembler *assembler) 224{ 225 __ BindAssemblerStub(RTSTUB_ID(CallThisRangeAndCheckToBaselineFromBaseline)); 226 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_THIS_WITH_ARGV, 227 FrameTransitionType::BASELINE_TO_BASELINE_CHECK); 228} 229 230void BaselineCall::CallThisArg0AndCheckToBaselineFromBaseline(ExtendedAssembler *assembler) 231{ 232 __ BindAssemblerStub(RTSTUB_ID(CallThisArg0AndCheckToBaselineFromBaseline)); 233 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_THIS_ARG0, 234 FrameTransitionType::BASELINE_TO_BASELINE_CHECK); 235} 236 237void BaselineCall::CallThisArg1AndCheckToBaselineFromBaseline(ExtendedAssembler *assembler) 238{ 239 __ BindAssemblerStub(RTSTUB_ID(CallThisArg1AndCheckToBaselineFromBaseline)); 240 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_THIS_ARG1, 241 FrameTransitionType::BASELINE_TO_BASELINE_CHECK); 242} 243 244void BaselineCall::CallThisArgs2AndCheckToBaselineFromBaseline(ExtendedAssembler *assembler) 245{ 246 __ BindAssemblerStub(RTSTUB_ID(CallThisArgs2AndCheckToBaselineFromBaseline)); 247 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_THIS_ARG2, 248 FrameTransitionType::BASELINE_TO_BASELINE_CHECK); 249} 250 251void BaselineCall::CallThisArgs3AndCheckToBaselineFromBaseline(ExtendedAssembler *assembler) 252{ 253 __ BindAssemblerStub(RTSTUB_ID(CallThisArgs3AndCheckToBaselineFromBaseline)); 254 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_THIS_ARG3, 255 FrameTransitionType::BASELINE_TO_BASELINE_CHECK); 256} 257 258void BaselineCall::CallNewAndCheckToBaselineFromBaseline(ExtendedAssembler *assembler) 259{ 260 __ BindAssemblerStub(RTSTUB_ID(CallNewAndCheckToBaselineFromBaseline)); 261 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV, 262 FrameTransitionType::BASELINE_TO_BASELINE_CHECK); 263} 264 265void BaselineCall::SuperCallAndCheckToBaselineFromBaseline(ExtendedAssembler *assembler) 266{ 267 __ BindAssemblerStub(RTSTUB_ID(SuperCallAndCheckToBaselineFromBaseline)); 268 AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::SUPER_CALL_WITH_ARGV, 269 FrameTransitionType::BASELINE_TO_BASELINE_CHECK); 270} 271 272void BaselineCall::GetBaselineBuiltinFp(ExtendedAssembler *assembler) 273{ 274 __ BindAssemblerStub(RTSTUB_ID(GetBaselineBuiltinFp)); 275 __ Movq(rbp, rax); 276 __ Ret(); 277} 278#undef __ 279} // namespace panda::ecmascript::x64