1 /*
2  * Copyright (c) 2022-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 #ifndef ECMASCRIPT_COMPILER_BC_CALL_SIGNATURE_H
17 #define ECMASCRIPT_COMPILER_BC_CALL_SIGNATURE_H
18 
19 #include "ecmascript/base/config.h"
20 #include "ecmascript/compiler/call_signature.h"
21 
22 namespace panda::ecmascript::kungfu {
23 #define IGNORE_BC_STUB(...)
24 #define ASM_UNUSED_BC_STUB_LIST(T)                      \
25     T(HandleOverflowDD)                                 \
26     T(HandleOverflowDE)                                 \
27     T(HandleOverflowDF)                                 \
28     T(HandleOverflowE0)                                 \
29     T(HandleOverflowE1)                                 \
30     T(HandleOverflowE2)                                 \
31     T(HandleOverflowE3)                                 \
32     T(HandleOverflowE4)                                 \
33     T(HandleOverflowE5)                                 \
34     T(HandleOverflowE6)                                 \
35     T(HandleOverflowE7)                                 \
36     T(HandleOverflowE8)                                 \
37     T(HandleOverflowE9)                                 \
38     T(HandleOverflowEA)                                 \
39     T(HandleOverflowEB)                                 \
40     T(HandleOverflowEC)                                 \
41     T(HandleOverflowED)                                 \
42     T(HandleOverflowEE)                                 \
43     T(HandleOverflowEF)                                 \
44     T(HandleOverflowF0)                                 \
45     T(HandleOverflowF1)                                 \
46     T(HandleOverflowF2)                                 \
47     T(HandleOverflowF3)                                 \
48     T(HandleOverflowF4)                                 \
49     T(HandleOverflowF5)                                 \
50     T(HandleOverflowF6)                                 \
51     T(HandleOverflowF7)                                 \
52     T(HandleOverflowF8)                                 \
53     T(HandleOverflowF9)                                 \
54     T(HandleOverflowFA)                                 \
55 
56 
57 // V: Not Enabled, T: Enabled, D: Always Disable SingleStepDebugging
58 #define ASM_INTERPRETER_BC_STUB_LIST(V, T, D)                             \
59     T(HandleLdundefined)                                                  \
60     T(HandleLdnull)                                                       \
61     T(HandleLdtrue)                                                       \
62     T(HandleLdfalse)                                                      \
63     T(HandleCreateemptyobject)                                            \
64     T(HandleCreateemptyarrayImm8)                                         \
65     T(HandleCreatearraywithbufferImm8Id16)                                \
66     T(HandleCreateobjectwithbufferImm8Id16)                               \
67     T(HandleNewobjrangeImm8Imm8V8)                                        \
68     T(HandleNewlexenvImm8)                                                \
69     T(HandleAdd2Imm8V8)                                                   \
70     T(HandleSub2Imm8V8)                                                   \
71     T(HandleMul2Imm8V8)                                                   \
72     T(HandleDiv2Imm8V8)                                                   \
73     T(HandleMod2Imm8V8)                                                   \
74     T(HandleEqImm8V8)                                                     \
75     T(HandleNoteqImm8V8)                                                  \
76     T(HandleLessImm8V8)                                                   \
77     T(HandleLesseqImm8V8)                                                 \
78     T(HandleGreaterImm8V8)                                                \
79     T(HandleGreatereqImm8V8)                                              \
80     T(HandleShl2Imm8V8)                                                   \
81     T(HandleShr2Imm8V8)                                                   \
82     T(HandleAshr2Imm8V8)                                                  \
83     T(HandleAnd2Imm8V8)                                                   \
84     T(HandleOr2Imm8V8)                                                    \
85     T(HandleXor2Imm8V8)                                                   \
86     T(HandleExpImm8V8)                                                    \
87     T(HandleTypeofImm8)                                                   \
88     T(HandleTonumberImm8)                                                 \
89     T(HandleTonumericImm8)                                                \
90     T(HandleNegImm8)                                                      \
91     T(HandleNotImm8)                                                      \
92     T(HandleIncImm8)                                                      \
93     T(HandleDecImm8)                                                      \
94     T(HandleIstrue)                                                       \
95     T(HandleIsfalse)                                                      \
96     T(HandleIsinImm8V8)                                                   \
97     T(HandleInstanceofImm8V8)                                             \
98     T(HandleStrictnoteqImm8V8)                                            \
99     T(HandleStricteqImm8V8)                                               \
100     D(HandleCallarg0Imm8)                                                 \
101     D(HandleCallarg1Imm8V8)                                               \
102     D(HandleCallargs2Imm8V8V8)                                            \
103     D(HandleCallargs3Imm8V8V8V8)                                          \
104     D(HandleCallthis0Imm8V8)                                              \
105     D(HandleCallthis1Imm8V8V8)                                            \
106     D(HandleCallthis2Imm8V8V8V8)                                          \
107     D(HandleCallthis3Imm8V8V8V8V8)                                        \
108     D(HandleCallthisrangeImm8Imm8V8)                                      \
109     T(HandleSupercallthisrangeImm8Imm8V8)                                 \
110     T(HandleDefinefuncImm8Id16Imm8)                                       \
111     T(HandleDefinemethodImm8Id16Imm8)                                     \
112     T(HandleDefineclasswithbufferImm8Id16Id16Imm16V8)                     \
113     T(HandleGetnextpropnameV8)                                            \
114     T(HandleLdobjbyvalueImm8V8)                                           \
115     T(HandleStobjbyvalueImm8V8V8)                                         \
116     T(HandleLdsuperbyvalueImm8V8)                                         \
117     T(HandleLdobjbyindexImm8Imm16)                                        \
118     T(HandleStobjbyindexImm8V8Imm16)                                      \
119     T(HandleLdlexvarImm4Imm4)                                             \
120     T(HandleStlexvarImm4Imm4)                                             \
121     T(HandleLdaStrId16)                                                   \
122     T(HandleTryldglobalbynameImm8Id16)                                    \
123     T(HandleTrystglobalbynameImm8Id16)                                    \
124     T(HandleLdglobalvarImm16Id16)                                         \
125     T(HandleLdobjbynameImm8Id16)                                          \
126     T(HandleStobjbynameImm8Id16V8)                                        \
127     T(HandleMovV4V4)                                                      \
128     T(HandleMovV8V8)                                                      \
129     T(HandleLdsuperbynameImm8Id16)                                        \
130     T(HandleStconsttoglobalrecordImm16Id16)                               \
131     T(HandleSttoglobalrecordImm16Id16)                                    \
132     T(HandleLdthisbynameImm8Id16)                                         \
133     T(HandleStthisbynameImm8Id16)                                         \
134     T(HandleLdthisbyvalueImm8)                                            \
135     T(HandleStthisbyvalueImm8V8)                                          \
136     T(HandleJmpImm8)                                                      \
137     T(HandleJmpImm16)                                                     \
138     T(HandleJeqzImm8)                                                     \
139     T(HandleJeqzImm16)                                                    \
140     T(HandleJnezImm8)                                                     \
141     T(HandleJstricteqzImm8)                                               \
142     T(HandleJnstricteqzImm8)                                              \
143     T(HandleJeqnullImm8)                                                  \
144     T(HandleJnenullImm8)                                                  \
145     T(HandleJstricteqnullImm8)                                            \
146     T(HandleJnstricteqnullImm8)                                           \
147     T(HandleJequndefinedImm8)                                             \
148     T(HandleJneundefinedImm8)                                             \
149     T(HandleJstrictequndefinedImm8)                                       \
150     T(HandleJnstrictequndefinedImm8)                                      \
151     T(HandleJeqV8Imm8)                                                    \
152     T(HandleJneV8Imm8)                                                    \
153     T(HandleJstricteqV8Imm8)                                              \
154     T(HandleJnstricteqV8Imm8)                                             \
155     T(HandleLdaV8)                                                        \
156     T(HandleStaV8)                                                        \
157     T(HandleLdaiImm32)                                                    \
158     T(HandleFldaiImm64)                                                   \
159     T(HandleReturn)                                                       \
160     T(HandleReturnundefined)                                              \
161     T(HandleGetpropiterator)                                              \
162     T(HandleGetiteratorImm8)                                              \
163     T(HandleCloseiteratorImm8V8)                                          \
164     T(HandlePoplexenv)                                                    \
165     T(HandleLdnan)                                                        \
166     T(HandleLdinfinity)                                                   \
167     T(HandleGetunmappedargs)                                              \
168     T(HandleLdglobal)                                                     \
169     T(HandleLdnewtarget)                                                  \
170     T(HandleLdthis)                                                       \
171     T(HandleLdhole)                                                       \
172     T(HandleCreateregexpwithliteralImm8Id16Imm8)                          \
173     T(HandleCreateregexpwithliteralImm16Id16Imm8)                         \
174     D(HandleCallrangeImm8Imm8V8)                                          \
175     T(HandleDefinefuncImm16Id16Imm8)                                      \
176     T(HandleDefineclasswithbufferImm16Id16Id16Imm16V8)                    \
177     T(HandleGettemplateobjectImm8)                                        \
178     T(HandleSetobjectwithprotoImm8V8)                                     \
179     T(HandleStownbyvalueImm8V8V8)                                         \
180     T(HandleStownbyindexImm8V8Imm16)                                      \
181     T(HandleStownbynameImm8Id16V8)                                        \
182     T(HandleGetmodulenamespaceImm8)                                       \
183     T(HandleStmodulevarImm8)                                              \
184     T(HandleLdlocalmodulevarImm8)                                         \
185     T(HandleLdexternalmodulevarImm8)                                      \
186     T(HandleStglobalvarImm16Id16)                                         \
187     T(HandleCreateemptyarrayImm16)                                        \
188     T(HandleCreatearraywithbufferImm16Id16)                               \
189     T(HandleCreateobjectwithbufferImm16Id16)                              \
190     T(HandleNewobjrangeImm16Imm8V8)                                       \
191     T(HandleTypeofImm16)                                                  \
192     T(HandleLdobjbyvalueImm16V8)                                          \
193     T(HandleStobjbyvalueImm16V8V8)                                        \
194     T(HandleLdsuperbyvalueImm16V8)                                        \
195     T(HandleLdobjbyindexImm16Imm16)                                       \
196     T(HandleStobjbyindexImm16V8Imm16)                                     \
197     T(HandleLdlexvarImm8Imm8)                                             \
198     T(HandleStlexvarImm8Imm8)                                             \
199     T(HandleTryldglobalbynameImm16Id16)                                   \
200     T(HandleTrystglobalbynameImm16Id16)                                   \
201     T(HandleStownbynamewithnamesetImm8Id16V8)                             \
202     T(HandleMovV16V16)                                                    \
203     T(HandleLdobjbynameImm16Id16)                                         \
204     T(HandleStobjbynameImm16Id16V8)                                       \
205     T(HandleLdsuperbynameImm16Id16)                                       \
206     T(HandleLdthisbynameImm16Id16)                                        \
207     T(HandleStthisbynameImm16Id16)                                        \
208     T(HandleLdthisbyvalueImm16)                                           \
209     T(HandleStthisbyvalueImm16V8)                                         \
210     T(HandleAsyncgeneratorrejectV8)                                       \
211     T(HandleJmpImm32)                                                     \
212     T(HandleStownbyvaluewithnamesetImm8V8V8)                              \
213     T(HandleJeqzImm32)                                                    \
214     T(HandleJnezImm16)                                                    \
215     T(HandleJnezImm32)                                                    \
216     T(HandleJstricteqzImm16)                                              \
217     T(HandleJnstricteqzImm16)                                             \
218     T(HandleJeqnullImm16)                                                 \
219     T(HandleJnenullImm16)                                                 \
220     T(HandleJstricteqnullImm16)                                           \
221     T(HandleJnstricteqnullImm16)                                          \
222     T(HandleJequndefinedImm16)                                            \
223     T(HandleJneundefinedImm16)                                            \
224     T(HandleJstrictequndefinedImm16)                                      \
225     T(HandleJnstrictequndefinedImm16)                                     \
226     T(HandleJeqV8Imm16)                                                   \
227     T(HandleJneV8Imm16)                                                   \
228     T(HandleJstricteqV8Imm16)                                             \
229     T(HandleJnstricteqV8Imm16)                                            \
230     T(HandleGetiteratorImm16)                                             \
231     T(HandleCloseiteratorImm16V8)                                         \
232     T(HandleLdsymbol)                                                     \
233     T(HandleAsyncfunctionenter)                                           \
234     T(HandleLdfunction)                                                   \
235     T(HandleDebugger)                                                     \
236     T(HandleCreategeneratorobjV8)                                         \
237     T(HandleCreateiterresultobjV8V8)                                      \
238     T(HandleCreateobjectwithexcludedkeysImm8V8V8)                         \
239     T(HandleNewobjapplyImm8V8)                                            \
240     T(HandleNewobjapplyImm16V8)                                           \
241     T(HandleNewlexenvwithnameImm8Id16)                                    \
242     T(HandleCreateasyncgeneratorobjV8)                                    \
243     T(HandleAsyncgeneratorresolveV8V8V8)                                  \
244     T(HandleSupercallspreadImm8V8)                                        \
245     T(HandleApplyImm8V8V8)                                                \
246     T(HandleSupercallarrowrangeImm8Imm8V8)                                \
247     T(HandleDefinegettersetterbyvalueV8V8V8V8)                            \
248     T(HandleDynamicimport)                                                \
249     T(HandleDefinemethodImm16Id16Imm8)                                    \
250     T(HandleResumegenerator)                                              \
251     T(HandleGetresumemode)                                                \
252     T(HandleGettemplateobjectImm16)                                       \
253     T(HandleDelobjpropV8)                                                 \
254     T(HandleSuspendgeneratorV8)                                           \
255     T(HandleAsyncfunctionawaituncaughtV8)                                 \
256     T(HandleCopydatapropertiesV8)                                         \
257     T(HandleStarrayspreadV8V8)                                            \
258     T(HandleSetobjectwithprotoImm16V8)                                    \
259     T(HandleStownbyvalueImm16V8V8)                                        \
260     T(HandleStsuperbyvalueImm8V8V8)                                       \
261     T(HandleStsuperbyvalueImm16V8V8)                                      \
262     T(HandleStownbyindexImm16V8Imm16)                                     \
263     T(HandleStownbynameImm16Id16V8)                                       \
264     T(HandleAsyncfunctionresolveV8)                                       \
265     T(HandleAsyncfunctionrejectV8)                                        \
266     T(HandleCopyrestargsImm8)                                             \
267     T(HandleStsuperbynameImm8Id16V8)                                      \
268     T(HandleStsuperbynameImm16Id16V8)                                     \
269     T(HandleStownbyvaluewithnamesetImm16V8V8)                             \
270     T(HandleLdbigintId16)                                                 \
271     T(HandleStownbynamewithnamesetImm16Id16V8)                            \
272     T(HandleNop)                                                          \
273     T(HandleSetgeneratorstateImm8)                                        \
274     T(HandleGetasynciteratorImm8)                                         \
275     T(HandleLdPrivatePropertyImm8Imm16Imm16)                              \
276     T(HandleStPrivatePropertyImm8Imm16Imm16V8)                            \
277     T(HandleTestInImm8Imm16Imm16)                                         \
278     T(HandleDefineFieldByNameImm8Id16V8)                                  \
279     T(HandleDefinePropertyByNameImm8Id16V8)                               \
280     ASM_UNUSED_BC_STUB_LIST(T)                                            \
281     T(HandleCallRuntime)                                                  \
282     T(HandleDeprecated)                                                   \
283     T(HandleWide)                                                         \
284     T(HandleThrow)                                                        \
285     D(ExceptionHandler)
286 
287 // V: Not Enabled, T: Enabled, D: Always Disable SingleStepDebugging
288 #define ASM_INTERPRETER_DEPRECATED_STUB_LIST(V, T, D)                     \
289     T(HandleDeprecatedLdlexenvPrefNone)                                   \
290     T(HandleDeprecatedPoplexenvPrefNone)                                  \
291     T(HandleDeprecatedGetiteratornextPrefV8V8)                            \
292     T(HandleDeprecatedCreatearraywithbufferPrefImm16)                     \
293     T(HandleDeprecatedCreateobjectwithbufferPrefImm16)                    \
294     T(HandleDeprecatedTonumberPrefV8)                                     \
295     T(HandleDeprecatedTonumericPrefV8)                                    \
296     T(HandleDeprecatedNegPrefV8)                                          \
297     T(HandleDeprecatedNotPrefV8)                                          \
298     T(HandleDeprecatedIncPrefV8)                                          \
299     T(HandleDeprecatedDecPrefV8)                                          \
300     D(HandleDeprecatedCallarg0PrefV8)                                     \
301     D(HandleDeprecatedCallarg1PrefV8V8)                                   \
302     D(HandleDeprecatedCallargs2PrefV8V8V8)                                \
303     D(HandleDeprecatedCallargs3PrefV8V8V8V8)                              \
304     D(HandleDeprecatedCallrangePrefImm16V8)                               \
305     D(HandleDeprecatedCallspreadPrefV8V8V8)                               \
306     D(HandleDeprecatedCallthisrangePrefImm16V8)                           \
307     T(HandleDeprecatedDefineclasswithbufferPrefId16Imm16Imm16V8V8)        \
308     T(HandleDeprecatedResumegeneratorPrefV8)                              \
309     T(HandleDeprecatedGetresumemodePrefV8)                                \
310     T(HandleDeprecatedGettemplateobjectPrefV8)                            \
311     T(HandleDeprecatedDelobjpropPrefV8V8)                                 \
312     T(HandleDeprecatedSuspendgeneratorPrefV8V8)                           \
313     T(HandleDeprecatedAsyncfunctionawaituncaughtPrefV8V8)                 \
314     T(HandleDeprecatedCopydatapropertiesPrefV8V8)                         \
315     T(HandleDeprecatedSetobjectwithprotoPrefV8V8)                         \
316     T(HandleDeprecatedLdobjbyvaluePrefV8V8)                               \
317     T(HandleDeprecatedLdsuperbyvaluePrefV8V8)                             \
318     T(HandleDeprecatedLdobjbyindexPrefV8Imm32)                            \
319     T(HandleDeprecatedAsyncfunctionresolvePrefV8V8V8)                     \
320     T(HandleDeprecatedAsyncfunctionrejectPrefV8V8V8)                      \
321     T(HandleDeprecatedStlexvarPrefImm4Imm4V8)                             \
322     T(HandleDeprecatedStlexvarPrefImm8Imm8V8)                             \
323     T(HandleDeprecatedStlexvarPrefImm16Imm16V8)                           \
324     T(HandleDeprecatedGetmodulenamespacePrefId32)                         \
325     T(HandleDeprecatedStmodulevarPrefId32)                                \
326     T(HandleDeprecatedLdobjbynamePrefId32V8)                              \
327     T(HandleDeprecatedLdsuperbynamePrefId32V8)                            \
328     T(HandleDeprecatedLdmodulevarPrefId32Imm8)                            \
329     T(HandleDeprecatedStconsttoglobalrecordPrefId32)                      \
330     T(HandleDeprecatedStlettoglobalrecordPrefId32)                        \
331     T(HandleDeprecatedStclasstoglobalrecordPrefId32)                      \
332     T(HandleDeprecatedLdhomeobjectPrefNone)                               \
333     T(HandleDeprecatedCreateobjecthavingmethodPrefImm16)                  \
334     T(HandleDeprecatedDynamicimportPrefV8)                                \
335     T(HandleDeprecatedAsyncgeneratorrejectPrefV8V8)
336 
337 // V: Not Enabled, T: Enabled, D: Always Disable SingleStepDebugging
338 #define ASM_INTERPRETER_WIDE_STUB_LIST(V, T, D)                           \
339     T(HandleWideCreateobjectwithexcludedkeysPrefImm16V8V8)                \
340     T(HandleWideNewobjrangePrefImm16V8)                                   \
341     T(HandleWideNewlexenvPrefImm16)                                       \
342     T(HandleWideNewlexenvwithnamePrefImm16Id16)                           \
343     D(HandleWideCallrangePrefImm16V8)                                     \
344     D(HandleWideCallthisrangePrefImm16V8)                                 \
345     T(HandleWideSupercallthisrangePrefImm16V8)                            \
346     T(HandleWideSupercallarrowrangePrefImm16V8)                           \
347     T(HandleWideLdobjbyindexPrefImm32)                                    \
348     T(HandleWideStobjbyindexPrefV8Imm32)                                  \
349     T(HandleWideStownbyindexPrefV8Imm32)                                  \
350     T(HandleWideCopyrestargsPrefImm16)                                    \
351     T(HandleWideLdlexvarPrefImm16Imm16)                                   \
352     T(HandleWideStlexvarPrefImm16Imm16)                                   \
353     T(HandleWideGetmodulenamespacePrefImm16)                              \
354     T(HandleWideStmodulevarPrefImm16)                                     \
355     T(HandleWideLdlocalmodulevarPrefImm16)                                \
356     T(HandleWideLdexternalmodulevarPrefImm16)                             \
357     T(HandleWideLdpatchvarPrefImm16)                                      \
358     T(HandleWideStpatchvarPrefImm16)
359 
360 // V: Not Enabled, T: Enabled, D: Always Disable SingleStepDebugging
361 #define ASM_INTERPRETER_THROW_STUB_LIST(V, T, D)                          \
362     T(HandleThrowPrefNone)                                                \
363     T(HandleThrowNotexistsPrefNone)                                       \
364     T(HandleThrowPatternnoncoerciblePrefNone)                             \
365     T(HandleThrowDeletesuperpropertyPrefNone)                             \
366     T(HandleThrowConstassignmentPrefV8)                                   \
367     T(HandleThrowIfnotobjectPrefV8)                                       \
368     T(HandleThrowUndefinedifholePrefV8V8)                                 \
369     T(HandleThrowIfsupernotcorrectcallPrefImm8)                           \
370     T(HandleThrowIfsupernotcorrectcallPrefImm16)                          \
371     T(HandleThrowUndefinedifholewithnamePrefId16)
372 
373 // V: Not Enabled, T: Enabled, D: Always Disable SingleStepDebugging
374 #define ASM_INTERPRETER_CALLRUNTIME_STUB_LIST(V, T, D)                    \
375     T(HandleCallRuntimeNotifyConcurrentResultPrefNone)                    \
376     T(HandleCallRuntimeDefineFieldByValuePrefImm8V8V8)                    \
377     T(HandleCallRuntimeDefineFieldByIndexPrefImm8Imm32V8)                 \
378     T(HandleCallRuntimeToPropertyKeyPrefNone)                             \
379     T(HandleCallRuntimeCreatePrivatePropertyPrefImm16Id16)                \
380     T(HandleCallRuntimeDefinePrivatePropertyPrefImm8Imm16Imm16V8)         \
381     T(HandleCallRuntimeCallInitPrefImm8V8)                                \
382     T(HandleCallRuntimeDefineSendableClassPrefImm16Id16Id16Imm16V8)       \
383     T(HandleCallRuntimeLdSendableClassPrefImm16)                          \
384     T(HandleCallRuntimeLdsendableexternalmodulevarImm8)                   \
385     T(HandleCallRuntimeWideLdsendableexternalmodulevarPrefImm16)          \
386     T(HandleCallRuntimeNewSendableEnvImm8)                                \
387     T(HandleCallRuntimeNewSendableEnvImm16)                               \
388     T(HandleCallRuntimeStSendableVarImm4Imm4)                             \
389     T(HandleCallRuntimeStSendableVarImm8Imm8)                             \
390     T(HandleCallRuntimeStSendableVarImm16Imm16)                           \
391     T(HandleCallRuntimeLdSendableVarImm4Imm4)                             \
392     T(HandleCallRuntimeLdSendableVarImm8Imm8)                             \
393     T(HandleCallRuntimeLdSendableVarImm16Imm16)                           \
394     T(HandleCallRuntimeIstruePrefImm8)                                    \
395     T(HandleCallRuntimeIsfalsePrefImm8)                                   \
396     T(HandleCallRuntimeLdLazyModuleVarPrefImm8)                           \
397     T(HandleCallRuntimeWideLdLazyModuleVarPrefImm16)                      \
398     T(HandleCallRuntimeLdLazySendableModuleVarPrefImm8)                   \
399     T(HandleCallRuntimeWideLdLazySendableModuleVarPrefImm16)              \
400     T(HandleCallRuntimeSuperCallForwardAllArgsV8)
401 
402 #define ASM_INTERPRETER_BC_HELPER_STUB_LIST(V)          \
403     V(SingleStepDebugging)                              \
404     V(BCDebuggerEntry)                                  \
405     V(BCDebuggerExceptionEntry)                         \
406     V(NewObjectRangeThrowException)                     \
407     V(ThrowStackOverflowException)                      \
408     V(HandleDefinefuncImm8Id16Imm8ColdReload)           \
409     V(HandleDefinefuncImm16Id16Imm8ColdReload)
410 
411 #define APPEND_JIT_SUFFIX(name, V) \
412     V(name##WithJitProf, name, SlotIDFormat::IMM8)
413 
414 #define APPEND_JIT_SUFFIX_IMM16(name, V) \
415     V(name##WithJitProf, name, SlotIDFormat::IMM16)
416 
417 #define ASM_INTERPRETER_BC_JIT_PROFILER_STUB_LIST(V)          \
418     ASM_INTERPRETER_BC_FUNC_HOT_JIT_PROFILER_STUB_LIST(V)     \
419 
420 #define ASM_INTERPRETER_BC_FUNC_HOT_JIT_PROFILER_STUB_LIST(V) \
421     APPEND_JIT_SUFFIX(HandleJmpImm8, V)                       \
422     APPEND_JIT_SUFFIX_IMM16(HandleJmpImm16, V)                \
423     APPEND_JIT_SUFFIX(HandleJmpImm32, V)                      \
424     APPEND_JIT_SUFFIX(HandleJeqzImm8, V)                      \
425     APPEND_JIT_SUFFIX_IMM16(HandleJeqzImm16, V)               \
426     APPEND_JIT_SUFFIX(HandleJeqzImm32, V)                     \
427     APPEND_JIT_SUFFIX(HandleJnezImm8, V)                      \
428     APPEND_JIT_SUFFIX_IMM16(HandleJnezImm16, V)               \
429     APPEND_JIT_SUFFIX(HandleJnezImm32, V)                     \
430     APPEND_JIT_SUFFIX(HandleReturn, V)                        \
431     APPEND_JIT_SUFFIX(HandleReturnundefined, V)               \
432     APPEND_JIT_SUFFIX(HandleSuspendgeneratorV8, V)            \
433     APPEND_JIT_SUFFIX(HandleAsyncgeneratorresolveV8V8V8, V)
434 
435 #define APPEND_SUFFIX(name, V) \
436     V(name##WithProf, name, SlotIDFormat::IMM8)
437 
438 #define APPEND_SUFFIX_IMM8_SECONDBC(name, V) \
439     V(name##WithProf, name, SlotIDFormat::PREF_IMM8)
440 
441 #define APPEND_SUFFIX_IMM16(name, V) \
442     V(name##WithProf, name, SlotIDFormat::IMM16)
443 
444 #define ASM_INTERPRETER_BC_PROFILER_STUB_LIST(V)          \
445     ASM_INTERPRETER_BC_TYPE_PROFILER_STUB_LIST(V)         \
446     ASM_INTERPRETER_BC_LAYOUT_PROFILER_STUB_LIST(V)       \
447     ASM_INTERPRETER_BC_FUNC_HOT_PROFILER_STUB_LIST(V)     \
448     ASM_INTERPRETER_BC_FUNC_COUNT_PROFILER_STUB_LIST(V)   \
449 
450 #define ASM_INTERPRETER_BC_TYPE_PROFILER_STUB_LIST(V) \
451     APPEND_SUFFIX(HandleAdd2Imm8V8, V)                \
452     APPEND_SUFFIX(HandleSub2Imm8V8, V)                \
453     APPEND_SUFFIX(HandleMul2Imm8V8, V)                \
454     APPEND_SUFFIX(HandleDiv2Imm8V8, V)                \
455     APPEND_SUFFIX(HandleMod2Imm8V8, V)                \
456     APPEND_SUFFIX(HandleShl2Imm8V8, V)                \
457     APPEND_SUFFIX(HandleShr2Imm8V8, V)                \
458     APPEND_SUFFIX(HandleAnd2Imm8V8, V)                \
459     APPEND_SUFFIX(HandleOr2Imm8V8, V)                 \
460     APPEND_SUFFIX(HandleXor2Imm8V8, V)                \
461     APPEND_SUFFIX(HandleAshr2Imm8V8, V)               \
462     APPEND_SUFFIX(HandleExpImm8V8, V)                 \
463     APPEND_SUFFIX(HandleNegImm8, V)                   \
464     APPEND_SUFFIX(HandleNotImm8, V)                   \
465     APPEND_SUFFIX(HandleEqImm8V8, V)                  \
466     APPEND_SUFFIX(HandleIncImm8, V)                   \
467     APPEND_SUFFIX(HandleDecImm8, V)                   \
468     APPEND_SUFFIX(HandleNoteqImm8V8, V)               \
469     APPEND_SUFFIX(HandleLessImm8V8, V)                \
470     APPEND_SUFFIX(HandleLesseqImm8V8, V)              \
471     APPEND_SUFFIX(HandleGreaterImm8V8, V)             \
472     APPEND_SUFFIX(HandleGreatereqImm8V8, V)           \
473     APPEND_SUFFIX(HandleStrictnoteqImm8V8, V)         \
474     APPEND_SUFFIX(HandleStricteqImm8V8, V)            \
475     APPEND_SUFFIX(HandleTonumericImm8, V)             \
476     APPEND_SUFFIX_IMM8_SECONDBC(HandleCallRuntimeIstruePrefImm8, V)       \
477     APPEND_SUFFIX_IMM8_SECONDBC(HandleCallRuntimeIsfalsePrefImm8, V)      \
478 
479 #define ASM_INTERPRETER_BC_FUNC_HOT_PROFILER_STUB_LIST(V) \
480     APPEND_SUFFIX(HandleJmpImm8, V)                       \
481     APPEND_SUFFIX_IMM16(HandleJmpImm16, V)                \
482     APPEND_SUFFIX(HandleJmpImm32, V)                      \
483     APPEND_SUFFIX(HandleJeqzImm8, V)                      \
484     APPEND_SUFFIX_IMM16(HandleJeqzImm16, V)               \
485     APPEND_SUFFIX(HandleJeqzImm32, V)                     \
486     APPEND_SUFFIX(HandleJnezImm8, V)                      \
487     APPEND_SUFFIX_IMM16(HandleJnezImm16, V)               \
488     APPEND_SUFFIX(HandleJnezImm32, V)                     \
489     APPEND_SUFFIX(HandleReturn, V)                        \
490     APPEND_SUFFIX(HandleReturnundefined, V)               \
491     APPEND_SUFFIX(HandleSuspendgeneratorV8, V)            \
492     APPEND_SUFFIX(HandleAsyncgeneratorresolveV8V8V8, V)
493 
494 #define ASM_INTERPRETER_BC_FUNC_COUNT_PROFILER_STUB_LIST(V)    \
495     APPEND_SUFFIX(HandleCallarg0Imm8, V)                       \
496     APPEND_SUFFIX(HandleCallarg1Imm8V8, V)                     \
497     APPEND_SUFFIX(HandleCallargs2Imm8V8V8, V)                  \
498     APPEND_SUFFIX(HandleCallargs3Imm8V8V8V8, V)                \
499     APPEND_SUFFIX(HandleCallrangeImm8Imm8V8, V)                \
500     APPEND_SUFFIX_IMM16(HandleWideCallrangePrefImm16V8, V)     \
501     APPEND_SUFFIX(HandleCallthisrangeImm8Imm8V8, V)            \
502     APPEND_SUFFIX_IMM16(HandleWideCallthisrangePrefImm16V8, V) \
503     APPEND_SUFFIX(HandleCallthis0Imm8V8, V)                    \
504     APPEND_SUFFIX(HandleCallthis1Imm8V8V8, V)                  \
505     APPEND_SUFFIX(HandleCallthis2Imm8V8V8V8, V)                \
506     APPEND_SUFFIX(HandleCallthis3Imm8V8V8V8V8, V)              \
507     APPEND_SUFFIX_IMM8_SECONDBC(HandleCallRuntimeCallInitPrefImm8V8, V)  \
508     APPEND_SUFFIX(HandleNewobjrangeImm8Imm8V8, V)              \
509     APPEND_SUFFIX_IMM16(HandleNewobjrangeImm16Imm8V8, V)       \
510     APPEND_SUFFIX_IMM16(HandleWideNewobjrangePrefImm16V8, V)   \
511     APPEND_SUFFIX(HandleInstanceofImm8V8, V)                   \
512     APPEND_SUFFIX(HandleGetiteratorImm8, V)                    \
513     APPEND_SUFFIX_IMM16(HandleGetiteratorImm16, V)             \
514     APPEND_SUFFIX(HandleTryldglobalbynameImm8Id16, V)          \
515     APPEND_SUFFIX_IMM16(HandleTryldglobalbynameImm16Id16, V)   \
516     APPEND_SUFFIX(HandleTrystglobalbynameImm8Id16, V)          \
517     APPEND_SUFFIX_IMM16(HandleTrystglobalbynameImm16Id16, V)   \
518     APPEND_SUFFIX_IMM16(HandleLdglobalvarImm16Id16, V)
519 
520 #define ASM_INTERPRETER_BC_LAYOUT_PROFILER_STUB_LIST(V)                     \
521     APPEND_SUFFIX(HandleDefineclasswithbufferImm8Id16Id16Imm16V8, V)        \
522     APPEND_SUFFIX_IMM16(HandleDefineclasswithbufferImm16Id16Id16Imm16V8, V) \
523     APPEND_SUFFIX(HandleDefinefuncImm8Id16Imm8, V)                          \
524     APPEND_SUFFIX_IMM16(HandleDefinefuncImm16Id16Imm8, V)                   \
525     APPEND_SUFFIX(HandleDefinegettersetterbyvalueV8V8V8V8, V)               \
526     APPEND_SUFFIX(HandleCreateobjectwithbufferImm8Id16, V)                  \
527     APPEND_SUFFIX_IMM16(HandleCreateobjectwithbufferImm16Id16, V)           \
528     APPEND_SUFFIX(HandleCreatearraywithbufferImm8Id16, V)                   \
529     APPEND_SUFFIX_IMM16(HandleCreatearraywithbufferImm16Id16, V)            \
530     APPEND_SUFFIX(HandleCreateemptyobject, V)                               \
531     APPEND_SUFFIX(HandleCreateemptyarrayImm8, V)                            \
532     APPEND_SUFFIX_IMM16(HandleCreateemptyarrayImm16, V)                     \
533     APPEND_SUFFIX(HandleLdobjbynameImm8Id16, V)                             \
534     APPEND_SUFFIX_IMM16(HandleLdobjbynameImm16Id16, V)                      \
535     APPEND_SUFFIX_IMM16(HandleLdthisbynameImm16Id16, V)                     \
536     APPEND_SUFFIX(HandleLdthisbynameImm8Id16, V)                            \
537     APPEND_SUFFIX(HandleStthisbynameImm8Id16, V)                            \
538     APPEND_SUFFIX_IMM16(HandleStthisbynameImm16Id16, V)                     \
539     APPEND_SUFFIX(HandleStthisbyvalueImm8V8, V)                             \
540     APPEND_SUFFIX_IMM16(HandleStthisbyvalueImm16V8, V)                      \
541     APPEND_SUFFIX_IMM16(HandleStobjbyvalueImm16V8V8, V)                     \
542     APPEND_SUFFIX(HandleStobjbynameImm8Id16V8, V)                           \
543     APPEND_SUFFIX_IMM16(HandleStobjbynameImm16Id16V8, V)                    \
544     APPEND_SUFFIX(HandleDefineFieldByNameImm8Id16V8, V)                     \
545     APPEND_SUFFIX(HandleDefinePropertyByNameImm8Id16V8, V)                  \
546     APPEND_SUFFIX(HandleLdPrivatePropertyImm8Imm16Imm16, V)                 \
547     APPEND_SUFFIX(HandleStPrivatePropertyImm8Imm16Imm16V8, V)               \
548     APPEND_SUFFIX(HandleStobjbyvalueImm8V8V8, V)                            \
549     APPEND_SUFFIX(HandleStobjbyindexImm8V8Imm16, V)                         \
550     APPEND_SUFFIX_IMM16(HandleStobjbyindexImm16V8Imm16, V)                  \
551     APPEND_SUFFIX(HandleLdobjbyvalueImm8V8, V)                              \
552     APPEND_SUFFIX_IMM16(HandleLdobjbyvalueImm16V8, V)                       \
553     APPEND_SUFFIX_IMM16(HandleLdthisbyvalueImm16, V)                        \
554     APPEND_SUFFIX(HandleLdthisbyvalueImm8, V)                               \
555     APPEND_SUFFIX(HandleLdobjbyindexImm8Imm16, V)                           \
556     APPEND_SUFFIX_IMM16(HandleLdobjbyindexImm16Imm16, V)                    \
557     APPEND_SUFFIX(HandleWideLdobjbyindexPrefImm32, V)                       \
558     APPEND_SUFFIX(HandleWideStobjbyindexPrefV8Imm32, V)                     \
559     APPEND_SUFFIX_IMM16(HandleStownbyindexImm16V8Imm16, V)                  \
560     APPEND_SUFFIX(HandleStownbyindexImm8V8Imm16, V)                         \
561     APPEND_SUFFIX(HandleWideStownbyindexPrefV8Imm32, V)                     \
562     APPEND_SUFFIX_IMM16(HandleStownbyvaluewithnamesetImm16V8V8, V)          \
563     APPEND_SUFFIX(HandleStownbyvaluewithnamesetImm8V8V8, V)                 \
564     APPEND_SUFFIX(HandleStownbyvalueImm8V8V8, V)                            \
565     APPEND_SUFFIX_IMM16(HandleStownbyvalueImm16V8V8, V)                     \
566     APPEND_SUFFIX_IMM16(HandleStownbynamewithnamesetImm16Id16V8, V)         \
567     APPEND_SUFFIX(HandleStownbynamewithnamesetImm8Id16V8, V)                \
568     APPEND_SUFFIX_IMM16(HandleStownbynameImm16Id16V8, V)                    \
569     APPEND_SUFFIX(HandleStownbynameImm8Id16V8, V)
570 
571 #define INTERPRETER_DISABLE_SINGLE_STEP_DEBUGGING_BC_STUB_LIST(V)             \
572     ASM_INTERPRETER_BC_STUB_LIST(IGNORE_BC_STUB, IGNORE_BC_STUB, V)           \
573     ASM_INTERPRETER_DEPRECATED_STUB_LIST(IGNORE_BC_STUB, IGNORE_BC_STUB, V)   \
574     ASM_INTERPRETER_WIDE_STUB_LIST(IGNORE_BC_STUB, IGNORE_BC_STUB, V)         \
575     ASM_INTERPRETER_THROW_STUB_LIST(IGNORE_BC_STUB, IGNORE_BC_STUB, V)        \
576     ASM_INTERPRETER_CALLRUNTIME_STUB_LIST(IGNORE_BC_STUB, IGNORE_BC_STUB, V)
577 
578 #define INTERPRETER_BC_STUB_LIST(V)                              \
579     ASM_INTERPRETER_BC_STUB_LIST(IGNORE_BC_STUB, V, V)           \
580     ASM_INTERPRETER_DEPRECATED_STUB_LIST(IGNORE_BC_STUB, V, V)   \
581     ASM_INTERPRETER_WIDE_STUB_LIST(IGNORE_BC_STUB, V, V)         \
582     ASM_INTERPRETER_THROW_STUB_LIST(IGNORE_BC_STUB, V, V)        \
583     ASM_INTERPRETER_CALLRUNTIME_STUB_LIST(IGNORE_BC_STUB, V, V)
584 
585 #define ASM_INTERPRETER_BC_STUB_ID_LIST(V) \
586     ASM_INTERPRETER_BC_STUB_LIST(V, V, V)
587 
588 #define ASM_INTERPRETER_SECOND_BC_STUB_ID_LIST(V)   \
589     ASM_INTERPRETER_WIDE_STUB_LIST(V, V, V)         \
590     ASM_INTERPRETER_THROW_STUB_LIST(V, V, V)        \
591     ASM_INTERPRETER_DEPRECATED_STUB_LIST(V, V, V)   \
592     ASM_INTERPRETER_CALLRUNTIME_STUB_LIST(V, V, V)
593 
594 class BytecodeStubCSigns {
595 public:
596     // is uint8 max
597     static constexpr size_t LAST_VALID_OPCODE = 0xFF;
598     // all valid stub, include normal and helper stub
599     enum ValidID {
600 #define DEF_VALID_BC_STUB_ID(name) name,
601         INTERPRETER_BC_STUB_LIST(DEF_VALID_BC_STUB_ID)
602         ASM_INTERPRETER_BC_HELPER_STUB_LIST(DEF_VALID_BC_STUB_ID)
603 #undef DEF_VALID_BC_STUB_ID
604 #define DEF_VALID_BC_STUB_ID(name, ...) name,
605         ASM_INTERPRETER_BC_PROFILER_STUB_LIST(DEF_VALID_BC_STUB_ID)
606 #undef DEF_VALID_BC_STUB_ID
607 #define DEF_VALID_BC_STUB_ID(name, ...) name,
608         ASM_INTERPRETER_BC_JIT_PROFILER_STUB_LIST(DEF_VALID_BC_STUB_ID)
609 #undef DEF_VALID_BC_STUB_ID
610         NUM_OF_VALID_STUBS
611     };
612 
613 #define DEF_BC_STUB_ID(name) PREF_ID_##name,
614     enum WideID {
615         ASM_INTERPRETER_WIDE_STUB_LIST(DEF_BC_STUB_ID, DEF_BC_STUB_ID, DEF_BC_STUB_ID)
616         NUM_OF_WIDE_STUBS
617     };
618     enum ThrowID {
619         ASM_INTERPRETER_THROW_STUB_LIST(DEF_BC_STUB_ID, DEF_BC_STUB_ID, DEF_BC_STUB_ID)
620         NUM_OF_THROW_STUBS
621     };
622     enum DeprecatedID {
623         ASM_INTERPRETER_DEPRECATED_STUB_LIST(DEF_BC_STUB_ID, DEF_BC_STUB_ID, DEF_BC_STUB_ID)
624         NUM_OF_DEPRECATED_STUBS
625     };
626     enum CallRuntimeID {
627         ASM_INTERPRETER_CALLRUNTIME_STUB_LIST(DEF_BC_STUB_ID, DEF_BC_STUB_ID, DEF_BC_STUB_ID)
628         NUM_OF_CALLRUNTIME_STUBS
629     };
630 #undef DEF_BC_STUB_ID
631 
632 #define DEF_BC_STUB_ID(name) ID_##name,
633     enum ID {
634         ASM_INTERPRETER_BC_STUB_ID_LIST(DEF_BC_STUB_ID)
635         NUM_OF_ALL_NORMAL_STUBS,
636         lastOpcode = LAST_VALID_OPCODE, // last Opcode is max opcode size
637         ASM_INTERPRETER_SECOND_BC_STUB_ID_LIST(DEF_BC_STUB_ID)
638         ASM_INTERPRETER_BC_HELPER_STUB_LIST(DEF_BC_STUB_ID)
639 #undef DEF_BC_STUB_ID
640 #define DEF_BC_STUB_ID(name, ...) ID_##name,
641         ASM_INTERPRETER_BC_PROFILER_STUB_LIST(DEF_BC_STUB_ID)
642 #undef DEF_BC_STUB_ID
643 #define DEF_BC_STUB_ID(name, ...) ID_##name,
644         ASM_INTERPRETER_BC_JIT_PROFILER_STUB_LIST(DEF_BC_STUB_ID)
645         NUM_OF_STUBS,
646         ID_Wide_Start = lastOpcode + 1,
647         ID_Throw_Start = ID_Wide_Start + NUM_OF_WIDE_STUBS,
648         ID_Deprecated_Start = ID_Throw_Start + NUM_OF_THROW_STUBS,
649         ID_CallRuntime_Start = ID_Deprecated_Start + NUM_OF_DEPRECATED_STUBS
650     };
651 #undef DEF_BC_STUB_ID
652 
653     static void Initialize();
654 
655     static void GetCSigns(std::vector<const CallSignature*>& outCSigns);
656 
Get(size_t index)657     static const CallSignature* Get(size_t index)
658     {
659         ASSERT(index < NUM_OF_VALID_STUBS);
660         return &callSigns_[index];
661     }
662 
663     static const CallSignature* BCDebuggerHandler()
664     {
665         return &bcDebuggerHandlerCSign_;
666     }
667 
668     static const CallSignature* BCHandler()
669     {
670         return &bcHandlerCSign_;
671     }
672 
673 private:
674     static CallSignature callSigns_[NUM_OF_VALID_STUBS];
675     static CallSignature bcHandlerCSign_;
676     static CallSignature bcDebuggerHandlerCSign_;
677 };
678 
679 enum class InterpreterHandlerInputs : size_t {
680     GLUE = 0,
681     SP,
682     PC,
683     CONSTPOOL,
684     PROFILE_TYPE_INFO,
685     ACC,
686     HOTNESS_COUNTER,
687     NUM_OF_INPUTS
688 };
689 
690 enum class CallDispatchInputs : size_t {
691     GLUE = 0,
692     SP,
693     CALL_TARGET,
694     METHOD,
695     CALL_FIELD,
696     ARG0,
697     ARG1,
698     ARG2,
699     ARG3,
700     NUM_OF_INPUTS,
701 
702     ARGC = ARG0,
703     ARGV = ARG1,
704 };
705 
706 #define BYTECODE_STUB_END_ID BytecodeStubCSigns::ID_ExceptionHandler
707 #define BCSTUB_ID(name) kungfu::BytecodeStubCSigns::ID_##name
708 }  // namespace panda::ecmascript::kungfu
709 #endif  // ECMASCRIPT_COMPILER_BC_CALL_SIGNATURE_H
710