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