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