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