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
22namespace 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
594class BytecodeStubCSigns {
595public:
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
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
673private:
674    static CallSignature callSigns_[NUM_OF_VALID_STUBS];
675    static CallSignature bcHandlerCSign_;
676    static CallSignature bcDebuggerHandlerCSign_;
677};
678
679enum 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
690enum 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