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