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