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 
20 namespace panda::ecmascript::aarch64 {
21 using Label = panda::ecmascript::Label;
22 #define __ assembler->
23 
24 /* other->baseline */
CallArg0AndCheckToBaseline(ExtendedAssembler *assembler)25 void 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 
CallArg1AndCheckToBaseline(ExtendedAssembler *assembler)32 void 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 
CallArgs2AndCheckToBaseline(ExtendedAssembler *assembler)39 void 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 
CallArgs3AndCheckToBaseline(ExtendedAssembler *assembler)46 void 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 
CallThisArg0AndCheckToBaseline(ExtendedAssembler *assembler)53 void 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 
CallThisArg1AndCheckToBaseline(ExtendedAssembler *assembler)60 void 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 
CallThisArgs2AndCheckToBaseline(ExtendedAssembler *assembler)67 void 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 
CallThisArgs3AndCheckToBaseline(ExtendedAssembler *assembler)74 void 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 
CallRangeAndCheckToBaseline(ExtendedAssembler *assembler)81 void 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 
CallNewAndCheckToBaseline(ExtendedAssembler *assembler)88 void 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 
SuperCallAndCheckToBaseline(ExtendedAssembler *assembler)95 void 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 
CallThisRangeAndCheckToBaseline(ExtendedAssembler *assembler)102 void 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 */
CallArg0AndDispatchFromBaseline(ExtendedAssembler *assembler)110 void BaselineCall::CallArg0AndDispatchFromBaseline(ExtendedAssembler *assembler)
111 {
112     __ BindAssemblerStub(RTSTUB_ID(CallArg0AndDispatchFromBaseline));
113     AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_ARG0, FrameTransitionType::BASELINE_TO_OTHER);
114 }
115 
CallArg1AndDispatchFromBaseline(ExtendedAssembler *assembler)116 void BaselineCall::CallArg1AndDispatchFromBaseline(ExtendedAssembler *assembler)
117 {
118     __ BindAssemblerStub(RTSTUB_ID(CallArg1AndDispatchFromBaseline));
119     AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_ARG1, FrameTransitionType::BASELINE_TO_OTHER);
120 }
121 
CallArgs2AndDispatchFromBaseline(ExtendedAssembler *assembler)122 void BaselineCall::CallArgs2AndDispatchFromBaseline(ExtendedAssembler *assembler)
123 {
124     __ BindAssemblerStub(RTSTUB_ID(CallArgs2AndDispatchFromBaseline));
125     AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_ARG2, FrameTransitionType::BASELINE_TO_OTHER);
126 }
127 
CallArgs3AndDispatchFromBaseline(ExtendedAssembler *assembler)128 void BaselineCall::CallArgs3AndDispatchFromBaseline(ExtendedAssembler *assembler)
129 {
130     __ BindAssemblerStub(RTSTUB_ID(CallArgs3AndDispatchFromBaseline));
131     AsmInterpreterCall::JSCallCommonEntry(assembler, JSCallMode::CALL_ARG3, FrameTransitionType::BASELINE_TO_OTHER);
132 }
133 
CallThisArg0AndDispatchFromBaseline(ExtendedAssembler *assembler)134 void 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 
CallThisArg1AndDispatchFromBaseline(ExtendedAssembler *assembler)141 void 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 
CallThisArgs2AndDispatchFromBaseline(ExtendedAssembler *assembler)148 void 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 
CallThisArgs3AndDispatchFromBaseline(ExtendedAssembler *assembler)155 void 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 
CallRangeAndDispatchFromBaseline(ExtendedAssembler *assembler)162 void 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 
CallNewAndDispatchFromBaseline(ExtendedAssembler *assembler)169 void 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 
SuperCallAndDispatchFromBaseline(ExtendedAssembler *assembler)176 void 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 
CallThisRangeAndDispatchFromBaseline(ExtendedAssembler *assembler)183 void 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 */
CallArg0AndCheckToBaselineFromBaseline(ExtendedAssembler *assembler)191 void 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 
CallArg1AndCheckToBaselineFromBaseline(ExtendedAssembler *assembler)198 void 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 
CallArgs2AndCheckToBaselineFromBaseline(ExtendedAssembler *assembler)205 void 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 
CallArgs3AndCheckToBaselineFromBaseline(ExtendedAssembler *assembler)212 void 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 
CallRangeAndCheckToBaselineFromBaseline(ExtendedAssembler *assembler)219 void 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 
CallThisRangeAndCheckToBaselineFromBaseline(ExtendedAssembler *assembler)226 void 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 
CallThisArg0AndCheckToBaselineFromBaseline(ExtendedAssembler *assembler)233 void 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 
CallThisArg1AndCheckToBaselineFromBaseline(ExtendedAssembler *assembler)240 void 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 
CallThisArgs2AndCheckToBaselineFromBaseline(ExtendedAssembler *assembler)247 void 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 
CallThisArgs3AndCheckToBaselineFromBaseline(ExtendedAssembler *assembler)254 void 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 
CallNewAndCheckToBaselineFromBaseline(ExtendedAssembler *assembler)261 void 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 
SuperCallAndCheckToBaselineFromBaseline(ExtendedAssembler *assembler)268 void 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 
GetBaselineBuiltinFp(ExtendedAssembler *assembler)275 void 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