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