• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 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/rt_call_signature.h"
21 
22 namespace panda::ecmascript::kungfu {
23 #define IGNORE_BC_STUB(...)
24 #define ASM_UNUSED_BC_STUB_LIST(T)                      \
25     T(HandleOverflowDC)                                 \
26     T(HandleOverflowDD)                                 \
27     T(HandleOverflowDE)                                 \
28     T(HandleOverflowDF)                                 \
29     T(HandleOverflowE0)                                 \
30     T(HandleOverflowE1)                                 \
31     T(HandleOverflowE2)                                 \
32     T(HandleOverflowE3)                                 \
33     T(HandleOverflowE4)                                 \
34     T(HandleOverflowE5)                                 \
35     T(HandleOverflowE6)                                 \
36     T(HandleOverflowE7)                                 \
37     T(HandleOverflowE8)                                 \
38     T(HandleOverflowE9)                                 \
39     T(HandleOverflowEA)                                 \
40     T(HandleOverflowEB)                                 \
41     T(HandleOverflowEC)                                 \
42     T(HandleOverflowED)                                 \
43     T(HandleOverflowEE)                                 \
44     T(HandleOverflowEF)                                 \
45     T(HandleOverflowF0)                                 \
46     T(HandleOverflowF1)                                 \
47     T(HandleOverflowF2)                                 \
48     T(HandleOverflowF3)                                 \
49     T(HandleOverflowF4)                                 \
50     T(HandleOverflowF5)                                 \
51     T(HandleOverflowF6)                                 \
52     T(HandleOverflowF7)                                 \
53     T(HandleOverflowF8)                                 \
54     T(HandleOverflowF9)                                 \
55     T(HandleOverflowFA)                                 \
56 
57 
58 // V: Not Enabled, T: Enabled, D: Always Disable SingleStepDebugging
59 #define ASM_INTERPRETER_BC_STUB_LIST(V, T, D)                             \
60     T(HandleLdundefined)                                                  \
61     T(HandleLdnull)                                                       \
62     T(HandleLdtrue)                                                       \
63     T(HandleLdfalse)                                                      \
64     T(HandleCreateemptyobject)                                            \
65     T(HandleCreateemptyarrayImm8)                                         \
66     T(HandleCreatearraywithbufferImm8Id16)                                \
67     T(HandleCreateobjectwithbufferImm8Id16)                               \
68     T(HandleNewobjrangeImm8Imm8V8)                                        \
69     T(HandleNewlexenvImm8)                                                \
70     T(HandleAdd2Imm8V8)                                                   \
71     T(HandleSub2Imm8V8)                                                   \
72     T(HandleMul2Imm8V8)                                                   \
73     T(HandleDiv2Imm8V8)                                                   \
74     T(HandleMod2Imm8V8)                                                   \
75     T(HandleEqImm8V8)                                                     \
76     T(HandleNoteqImm8V8)                                                  \
77     T(HandleLessImm8V8)                                                   \
78     T(HandleLesseqImm8V8)                                                 \
79     T(HandleGreaterImm8V8)                                                \
80     T(HandleGreatereqImm8V8)                                              \
81     T(HandleShl2Imm8V8)                                                   \
82     T(HandleShr2Imm8V8)                                                   \
83     T(HandleAshr2Imm8V8)                                                  \
84     T(HandleAnd2Imm8V8)                                                   \
85     T(HandleOr2Imm8V8)                                                    \
86     T(HandleXor2Imm8V8)                                                   \
87     T(HandleExpImm8V8)                                                    \
88     T(HandleTypeofImm8)                                                   \
89     T(HandleTonumberImm8)                                                 \
90     T(HandleTonumericImm8)                                                \
91     T(HandleNegImm8)                                                      \
92     T(HandleNotImm8)                                                      \
93     T(HandleIncImm8)                                                      \
94     T(HandleDecImm8)                                                      \
95     T(HandleIstrue)                                                       \
96     T(HandleIsfalse)                                                      \
97     T(HandleIsinImm8V8)                                                   \
98     T(HandleInstanceofImm8V8)                                             \
99     T(HandleStrictnoteqImm8V8)                                            \
100     T(HandleStricteqImm8V8)                                               \
101     D(HandleCallarg0Imm8)                                                 \
102     D(HandleCallarg1Imm8V8)                                               \
103     D(HandleCallargs2Imm8V8V8)                                            \
104     D(HandleCallargs3Imm8V8V8V8)                                          \
105     D(HandleCallthis0Imm8V8)                                              \
106     D(HandleCallthis1Imm8V8V8)                                            \
107     D(HandleCallthis2Imm8V8V8V8)                                          \
108     D(HandleCallthis3Imm8V8V8V8V8)                                        \
109     D(HandleCallthisrangeImm8Imm8V8)                                      \
110     T(HandleSupercallthisrangeImm8Imm8V8)                                 \
111     T(HandleDefinefuncImm8Id16Imm8)                                       \
112     T(HandleDefinemethodImm8Id16Imm8)                                     \
113     T(HandleDefineclasswithbufferImm8Id16Id16Imm16V8)                     \
114     T(HandleGetnextpropnameV8)                                            \
115     T(HandleLdobjbyvalueImm8V8)                                           \
116     T(HandleStobjbyvalueImm8V8V8)                                         \
117     T(HandleLdsuperbyvalueImm8V8)                                         \
118     T(HandleLdobjbyindexImm8Imm16)                                        \
119     T(HandleStobjbyindexImm8V8Imm16)                                      \
120     T(HandleLdlexvarImm4Imm4)                                             \
121     T(HandleStlexvarImm4Imm4)                                             \
122     T(HandleLdaStrId16)                                                   \
123     T(HandleTryldglobalbynameImm8Id16)                                    \
124     T(HandleTrystglobalbynameImm8Id16)                                    \
125     T(HandleLdglobalvarImm16Id16)                                         \
126     T(HandleLdobjbynameImm8Id16)                                          \
127     T(HandleStobjbynameImm8Id16V8)                                        \
128     T(HandleMovV4V4)                                                      \
129     T(HandleMovV8V8)                                                      \
130     T(HandleLdsuperbynameImm8Id16)                                        \
131     T(HandleStconsttoglobalrecordImm16Id16)                               \
132     T(HandleSttoglobalrecordImm16Id16)                                    \
133     T(HandleLdthisbynameImm8Id16)                                         \
134     T(HandleStthisbynameImm8Id16)                                         \
135     T(HandleLdthisbyvalueImm8)                                            \
136     T(HandleStthisbyvalueImm8V8)                                          \
137     T(HandleJmpImm8)                                                      \
138     T(HandleJmpImm16)                                                     \
139     T(HandleJeqzImm8)                                                     \
140     T(HandleJeqzImm16)                                                    \
141     T(HandleJnezImm8)                                                     \
142     T(HandleJstricteqzImm8)                                               \
143     T(HandleJnstricteqzImm8)                                              \
144     T(HandleJeqnullImm8)                                                  \
145     T(HandleJnenullImm8)                                                  \
146     T(HandleJstricteqnullImm8)                                            \
147     T(HandleJnstricteqnullImm8)                                           \
148     T(HandleJequndefinedImm8)                                             \
149     T(HandleJneundefinedImm8)                                             \
150     T(HandleJstrictequndefinedImm8)                                       \
151     T(HandleJnstrictequndefinedImm8)                                      \
152     T(HandleJeqV8Imm8)                                                    \
153     T(HandleJneV8Imm8)                                                    \
154     T(HandleJstricteqV8Imm8)                                              \
155     T(HandleJnstricteqV8Imm8)                                             \
156     T(HandleLdaV8)                                                        \
157     T(HandleStaV8)                                                        \
158     T(HandleLdaiImm32)                                                    \
159     T(HandleFldaiImm64)                                                   \
160     T(HandleReturn)                                                       \
161     T(HandleReturnundefined)                                              \
162     T(HandleGetpropiterator)                                              \
163     T(HandleGetiteratorImm8)                                              \
164     T(HandleCloseiteratorImm8V8)                                          \
165     T(HandlePoplexenv)                                                    \
166     T(HandleLdnan)                                                        \
167     T(HandleLdinfinity)                                                   \
168     T(HandleGetunmappedargs)                                              \
169     T(HandleLdglobal)                                                     \
170     T(HandleLdnewtarget)                                                  \
171     T(HandleLdthis)                                                       \
172     T(HandleLdhole)                                                       \
173     T(HandleCreateregexpwithliteralImm8Id16Imm8)                          \
174     T(HandleCreateregexpwithliteralImm16Id16Imm8)                         \
175     D(HandleCallrangeImm8Imm8V8)                                          \
176     T(HandleDefinefuncImm16Id16Imm8)                                      \
177     T(HandleDefineclasswithbufferImm16Id16Id16Imm16V8)                    \
178     T(HandleGettemplateobjectImm8)                                        \
179     T(HandleSetobjectwithprotoImm8V8)                                     \
180     T(HandleStownbyvalueImm8V8V8)                                         \
181     T(HandleStownbyindexImm8V8Imm16)                                      \
182     T(HandleStownbynameImm8Id16V8)                                        \
183     T(HandleGetmodulenamespaceImm8)                                       \
184     T(HandleStmodulevarImm8)                                              \
185     T(HandleLdlocalmodulevarImm8)                                         \
186     T(HandleLdexternalmodulevarImm8)                                      \
187     T(HandleStglobalvarImm16Id16)                                         \
188     T(HandleCreateemptyarrayImm16)                                        \
189     T(HandleCreatearraywithbufferImm16Id16)                               \
190     T(HandleCreateobjectwithbufferImm16Id16)                              \
191     T(HandleNewobjrangeImm16Imm8V8)                                       \
192     T(HandleTypeofImm16)                                                  \
193     T(HandleLdobjbyvalueImm16V8)                                          \
194     T(HandleStobjbyvalueImm16V8V8)                                        \
195     T(HandleLdsuperbyvalueImm16V8)                                        \
196     T(HandleLdobjbyindexImm16Imm16)                                       \
197     T(HandleStobjbyindexImm16V8Imm16)                                     \
198     T(HandleLdlexvarImm8Imm8)                                             \
199     T(HandleStlexvarImm8Imm8)                                             \
200     T(HandleTryldglobalbynameImm16Id16)                                   \
201     T(HandleTrystglobalbynameImm16Id16)                                   \
202     T(HandleStownbynamewithnamesetImm8Id16V8)                             \
203     T(HandleMovV16V16)                                                    \
204     T(HandleLdobjbynameImm16Id16)                                         \
205     T(HandleStobjbynameImm16Id16V8)                                       \
206     T(HandleLdsuperbynameImm16Id16)                                       \
207     T(HandleLdthisbynameImm16Id16)                                        \
208     T(HandleStthisbynameImm16Id16)                                        \
209     T(HandleLdthisbyvalueImm16)                                           \
210     T(HandleStthisbyvalueImm16V8)                                         \
211     T(HandleAsyncgeneratorrejectV8)                                       \
212     T(HandleJmpImm32)                                                     \
213     T(HandleStownbyvaluewithnamesetImm8V8V8)                              \
214     T(HandleJeqzImm32)                                                    \
215     T(HandleJnezImm16)                                                    \
216     T(HandleJnezImm32)                                                    \
217     T(HandleJstricteqzImm16)                                              \
218     T(HandleJnstricteqzImm16)                                             \
219     T(HandleJeqnullImm16)                                                 \
220     T(HandleJnenullImm16)                                                 \
221     T(HandleJstricteqnullImm16)                                           \
222     T(HandleJnstricteqnullImm16)                                          \
223     T(HandleJequndefinedImm16)                                            \
224     T(HandleJneundefinedImm16)                                            \
225     T(HandleJstrictequndefinedImm16)                                      \
226     T(HandleJnstrictequndefinedImm16)                                     \
227     T(HandleJeqV8Imm16)                                                   \
228     T(HandleJneV8Imm16)                                                   \
229     T(HandleJstricteqV8Imm16)                                             \
230     T(HandleJnstricteqV8Imm16)                                            \
231     T(HandleGetiteratorImm16)                                             \
232     T(HandleCloseiteratorImm16V8)                                         \
233     T(HandleLdsymbol)                                                     \
234     T(HandleAsyncfunctionenter)                                           \
235     T(HandleLdfunction)                                                   \
236     T(HandleDebugger)                                                     \
237     T(HandleCreategeneratorobjV8)                                         \
238     T(HandleCreateiterresultobjV8V8)                                      \
239     T(HandleCreateobjectwithexcludedkeysImm8V8V8)                         \
240     T(HandleNewobjapplyImm8V8)                                            \
241     T(HandleNewobjapplyImm16V8)                                           \
242     T(HandleNewlexenvwithnameImm8Id16)                                    \
243     T(HandleCreateasyncgeneratorobjV8)                                    \
244     T(HandleAsyncgeneratorresolveV8V8V8)                                  \
245     T(HandleSupercallspreadImm8V8)                                        \
246     T(HandleApplyImm8V8V8)                                                \
247     T(HandleSupercallarrowrangeImm8Imm8V8)                                \
248     T(HandleDefinegettersetterbyvalueV8V8V8V8)                            \
249     T(HandleDynamicimport)                                                \
250     T(HandleDefinemethodImm16Id16Imm8)                                    \
251     T(HandleResumegenerator)                                              \
252     T(HandleGetresumemode)                                                \
253     T(HandleGettemplateobjectImm16)                                       \
254     T(HandleDelobjpropV8)                                                 \
255     T(HandleSuspendgeneratorV8)                                           \
256     T(HandleAsyncfunctionawaituncaughtV8)                                 \
257     T(HandleCopydatapropertiesV8)                                         \
258     T(HandleStarrayspreadV8V8)                                            \
259     T(HandleSetobjectwithprotoImm16V8)                                    \
260     T(HandleStownbyvalueImm16V8V8)                                        \
261     T(HandleStsuperbyvalueImm8V8V8)                                       \
262     T(HandleStsuperbyvalueImm16V8V8)                                      \
263     T(HandleStownbyindexImm16V8Imm16)                                     \
264     T(HandleStownbynameImm16Id16V8)                                       \
265     T(HandleAsyncfunctionresolveV8)                                       \
266     T(HandleAsyncfunctionrejectV8)                                        \
267     T(HandleCopyrestargsImm8)                                             \
268     T(HandleStsuperbynameImm8Id16V8)                                      \
269     T(HandleStsuperbynameImm16Id16V8)                                     \
270     T(HandleStownbyvaluewithnamesetImm16V8V8)                             \
271     T(HandleLdbigintId16)                                                 \
272     T(HandleStownbynamewithnamesetImm16Id16V8)                            \
273     T(HandleNop)                                                          \
274     T(HandleSetgeneratorstateImm8)                                        \
275     T(HandleGetasynciteratorImm8)                                         \
276     T(HandleLdPrivatePropertyImm8Imm16Imm16)                              \
277     T(HandleStPrivatePropertyImm8Imm16Imm16V8)                            \
278     T(HandleTestInImm8Imm16Imm16)                                         \
279     T(HandleDefineFieldByNameImm8Id16V8)                                  \
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 
385 #define ASM_INTERPRETER_BC_HELPER_STUB_LIST(V)          \
386     V(SingleStepDebugging)                              \
387     V(BCDebuggerEntry)                                  \
388     V(BCDebuggerExceptionEntry)                         \
389     V(NewObjectRangeThrowException)                     \
390     V(ThrowStackOverflowException)
391 
392 #define APPEND_JIT_SUFFIX(name, V) \
393     V(name##WithJitProf, name, SlotIDFormat::IMM8)
394 
395 #define APPEND_JIT_SUFFIX_IMM16(name, V) \
396     V(name##WithJitProf, name, SlotIDFormat::IMM16)
397 
398 #define ASM_INTERPRETER_BC_JIT_PROFILER_STUB_LIST(V)          \
399     ASM_INTERPRETER_BC_FUNC_HOT_JIT_PROFILER_STUB_LIST(V)     \
400 
401 #define ASM_INTERPRETER_BC_FUNC_HOT_JIT_PROFILER_STUB_LIST(V) \
402     APPEND_JIT_SUFFIX(HandleJmpImm8, V)                       \
403     APPEND_JIT_SUFFIX_IMM16(HandleJmpImm16, V)                \
404     APPEND_JIT_SUFFIX(HandleJmpImm32, V)                      \
405     APPEND_JIT_SUFFIX(HandleJeqzImm8, V)                      \
406     APPEND_JIT_SUFFIX_IMM16(HandleJeqzImm16, V)               \
407     APPEND_JIT_SUFFIX(HandleJeqzImm32, V)                     \
408     APPEND_JIT_SUFFIX(HandleJnezImm8, V)                      \
409     APPEND_JIT_SUFFIX_IMM16(HandleJnezImm16, V)               \
410     APPEND_JIT_SUFFIX(HandleJnezImm32, V)                     \
411     APPEND_JIT_SUFFIX(HandleReturn, V)                        \
412     APPEND_JIT_SUFFIX(HandleReturnundefined, V)               \
413     APPEND_JIT_SUFFIX(HandleSuspendgeneratorV8, V)            \
414     APPEND_JIT_SUFFIX(HandleAsyncgeneratorresolveV8V8V8, V)
415 
416 #define APPEND_SUFFIX(name, V) \
417     V(name##WithProf, name, SlotIDFormat::IMM8)
418 
419 #define APPEND_SUFFIX_IMM8_SECONDBC(name, V) \
420     V(name##WithProf, name, SlotIDFormat::PREF_IMM8)
421 
422 #define APPEND_SUFFIX_IMM16(name, V) \
423     V(name##WithProf, name, SlotIDFormat::IMM16)
424 
425 #define ASM_INTERPRETER_BC_PROFILER_STUB_LIST(V)          \
426     ASM_INTERPRETER_BC_TYPE_PROFILER_STUB_LIST(V)         \
427     ASM_INTERPRETER_BC_LAYOUT_PROFILER_STUB_LIST(V)       \
428     ASM_INTERPRETER_BC_FUNC_HOT_PROFILER_STUB_LIST(V)     \
429     ASM_INTERPRETER_BC_FUNC_COUNT_PROFILER_STUB_LIST(V)   \
430 
431 #define ASM_INTERPRETER_BC_TYPE_PROFILER_STUB_LIST(V) \
432     APPEND_SUFFIX(HandleAdd2Imm8V8, V)                \
433     APPEND_SUFFIX(HandleSub2Imm8V8, V)                \
434     APPEND_SUFFIX(HandleMul2Imm8V8, V)                \
435     APPEND_SUFFIX(HandleDiv2Imm8V8, V)                \
436     APPEND_SUFFIX(HandleMod2Imm8V8, V)                \
437     APPEND_SUFFIX(HandleShl2Imm8V8, V)                \
438     APPEND_SUFFIX(HandleShr2Imm8V8, V)                \
439     APPEND_SUFFIX(HandleAnd2Imm8V8, V)                \
440     APPEND_SUFFIX(HandleOr2Imm8V8, V)                 \
441     APPEND_SUFFIX(HandleXor2Imm8V8, V)                \
442     APPEND_SUFFIX(HandleAshr2Imm8V8, V)               \
443     APPEND_SUFFIX(HandleExpImm8V8, V)                 \
444     APPEND_SUFFIX(HandleNegImm8, V)                   \
445     APPEND_SUFFIX(HandleNotImm8, V)                   \
446     APPEND_SUFFIX(HandleEqImm8V8, V)                  \
447     APPEND_SUFFIX(HandleIncImm8, V)                   \
448     APPEND_SUFFIX(HandleDecImm8, V)                   \
449     APPEND_SUFFIX(HandleNoteqImm8V8, V)               \
450     APPEND_SUFFIX(HandleLessImm8V8, V)                \
451     APPEND_SUFFIX(HandleLesseqImm8V8, V)              \
452     APPEND_SUFFIX(HandleGreaterImm8V8, V)             \
453     APPEND_SUFFIX(HandleGreatereqImm8V8, V)           \
454     APPEND_SUFFIX(HandleStrictnoteqImm8V8, V)         \
455     APPEND_SUFFIX(HandleStricteqImm8V8, V)
456 
457 #define ASM_INTERPRETER_BC_FUNC_HOT_PROFILER_STUB_LIST(V) \
458     APPEND_SUFFIX(HandleJmpImm8, V)                       \
459     APPEND_SUFFIX_IMM16(HandleJmpImm16, V)                \
460     APPEND_SUFFIX(HandleJmpImm32, V)                      \
461     APPEND_SUFFIX(HandleJeqzImm8, V)                      \
462     APPEND_SUFFIX_IMM16(HandleJeqzImm16, V)               \
463     APPEND_SUFFIX(HandleJeqzImm32, V)                     \
464     APPEND_SUFFIX(HandleJnezImm8, V)                      \
465     APPEND_SUFFIX_IMM16(HandleJnezImm16, V)               \
466     APPEND_SUFFIX(HandleJnezImm32, V)                     \
467     APPEND_SUFFIX(HandleReturn, V)                        \
468     APPEND_SUFFIX(HandleReturnundefined, V)               \
469     APPEND_SUFFIX(HandleSuspendgeneratorV8, V)            \
470     APPEND_SUFFIX(HandleAsyncgeneratorresolveV8V8V8, V)
471 
472 #define ASM_INTERPRETER_BC_FUNC_COUNT_PROFILER_STUB_LIST(V)    \
473     APPEND_SUFFIX(HandleCallarg0Imm8, V)                       \
474     APPEND_SUFFIX(HandleCallarg1Imm8V8, V)                     \
475     APPEND_SUFFIX(HandleCallargs2Imm8V8V8, V)                  \
476     APPEND_SUFFIX(HandleCallargs3Imm8V8V8V8, V)                \
477     APPEND_SUFFIX(HandleCallrangeImm8Imm8V8, V)                \
478     APPEND_SUFFIX_IMM16(HandleWideCallrangePrefImm16V8, V)     \
479     APPEND_SUFFIX(HandleCallthisrangeImm8Imm8V8, V)            \
480     APPEND_SUFFIX_IMM16(HandleWideCallthisrangePrefImm16V8, V) \
481     APPEND_SUFFIX(HandleCallthis0Imm8V8, V)                    \
482     APPEND_SUFFIX(HandleCallthis1Imm8V8V8, V)                  \
483     APPEND_SUFFIX(HandleCallthis2Imm8V8V8V8, V)                \
484     APPEND_SUFFIX(HandleCallthis3Imm8V8V8V8V8, V)              \
485     APPEND_SUFFIX_IMM8_SECONDBC(HandleCallRuntimeCallInitPrefImm8V8, V)  \
486     APPEND_SUFFIX(HandleNewobjrangeImm8Imm8V8, V)              \
487     APPEND_SUFFIX_IMM16(HandleNewobjrangeImm16Imm8V8, V)       \
488     APPEND_SUFFIX_IMM16(HandleWideNewobjrangePrefImm16V8, V)   \
489     APPEND_SUFFIX(HandleInstanceofImm8V8, V)                   \
490     APPEND_SUFFIX(HandleGetiteratorImm8, V)                    \
491     APPEND_SUFFIX_IMM16(HandleGetiteratorImm16, V)             \
492     APPEND_SUFFIX(HandleTryldglobalbynameImm8Id16, V)          \
493     APPEND_SUFFIX_IMM16(HandleTryldglobalbynameImm16Id16, V)   \
494     APPEND_SUFFIX(HandleTrystglobalbynameImm8Id16, V)          \
495     APPEND_SUFFIX_IMM16(HandleTrystglobalbynameImm16Id16, V)   \
496     APPEND_SUFFIX_IMM16(HandleLdglobalvarImm16Id16, V)
497 
498 #define ASM_INTERPRETER_BC_LAYOUT_PROFILER_STUB_LIST(V)                     \
499     APPEND_SUFFIX(HandleDefineclasswithbufferImm8Id16Id16Imm16V8, V)        \
500     APPEND_SUFFIX_IMM16(HandleDefineclasswithbufferImm16Id16Id16Imm16V8, V) \
501     APPEND_SUFFIX(HandleDefinefuncImm8Id16Imm8, V)                          \
502     APPEND_SUFFIX_IMM16(HandleDefinefuncImm16Id16Imm8, V)                   \
503     APPEND_SUFFIX(HandleDefinegettersetterbyvalueV8V8V8V8, V)               \
504     APPEND_SUFFIX(HandleCreateobjectwithbufferImm8Id16, V)                  \
505     APPEND_SUFFIX_IMM16(HandleCreateobjectwithbufferImm16Id16, V)           \
506     APPEND_SUFFIX(HandleCreatearraywithbufferImm8Id16, V)                   \
507     APPEND_SUFFIX_IMM16(HandleCreatearraywithbufferImm16Id16, V)            \
508     APPEND_SUFFIX(HandleCreateemptyobject, V)                               \
509     APPEND_SUFFIX(HandleCreateemptyarrayImm8, V)                            \
510     APPEND_SUFFIX_IMM16(HandleCreateemptyarrayImm16, V)                     \
511     APPEND_SUFFIX(HandleLdobjbynameImm8Id16, V)                             \
512     APPEND_SUFFIX_IMM16(HandleLdobjbynameImm16Id16, V)                      \
513     APPEND_SUFFIX_IMM16(HandleLdthisbynameImm16Id16, V)                     \
514     APPEND_SUFFIX(HandleLdthisbynameImm8Id16, V)                            \
515     APPEND_SUFFIX(HandleStthisbynameImm8Id16, V)                            \
516     APPEND_SUFFIX_IMM16(HandleStthisbynameImm16Id16, V)                     \
517     APPEND_SUFFIX(HandleStthisbyvalueImm8V8, V)                             \
518     APPEND_SUFFIX_IMM16(HandleStthisbyvalueImm16V8, V)                      \
519     APPEND_SUFFIX_IMM16(HandleStobjbyvalueImm16V8V8, V)                     \
520     APPEND_SUFFIX(HandleStobjbynameImm8Id16V8, V)                           \
521     APPEND_SUFFIX_IMM16(HandleStobjbynameImm16Id16V8, V)                    \
522     APPEND_SUFFIX(HandleDefineFieldByNameImm8Id16V8, V)                     \
523     APPEND_SUFFIX(HandleStobjbyvalueImm8V8V8, V)                            \
524     APPEND_SUFFIX(HandleStobjbyindexImm8V8Imm16, V)                         \
525     APPEND_SUFFIX_IMM16(HandleStobjbyindexImm16V8Imm16, V)                  \
526     APPEND_SUFFIX(HandleLdobjbyvalueImm8V8, V)                              \
527     APPEND_SUFFIX_IMM16(HandleLdobjbyvalueImm16V8, V)                       \
528     APPEND_SUFFIX_IMM16(HandleLdthisbyvalueImm16, V)                        \
529     APPEND_SUFFIX(HandleLdthisbyvalueImm8, V)                               \
530     APPEND_SUFFIX(HandleLdobjbyindexImm8Imm16, V)                           \
531     APPEND_SUFFIX_IMM16(HandleLdobjbyindexImm16Imm16, V)                    \
532     APPEND_SUFFIX(HandleWideLdobjbyindexPrefImm32, V)                       \
533     APPEND_SUFFIX(HandleWideStobjbyindexPrefV8Imm32, V)                     \
534     APPEND_SUFFIX_IMM16(HandleStownbyindexImm16V8Imm16, V)                  \
535     APPEND_SUFFIX(HandleStownbyindexImm8V8Imm16, V)                         \
536     APPEND_SUFFIX(HandleWideStownbyindexPrefV8Imm32, V)                     \
537     APPEND_SUFFIX_IMM16(HandleStownbyvaluewithnamesetImm16V8V8, V)          \
538     APPEND_SUFFIX(HandleStownbyvaluewithnamesetImm8V8V8, V)                 \
539     APPEND_SUFFIX(HandleStownbyvalueImm8V8V8, V)                            \
540     APPEND_SUFFIX_IMM16(HandleStownbyvalueImm16V8V8, V)                     \
541     APPEND_SUFFIX_IMM16(HandleStownbynamewithnamesetImm16Id16V8, V)         \
542     APPEND_SUFFIX(HandleStownbynamewithnamesetImm8Id16V8, V)                \
543     APPEND_SUFFIX_IMM16(HandleStownbynameImm16Id16V8, V)                    \
544     APPEND_SUFFIX(HandleStownbynameImm8Id16V8, V)
545 
546 #define INTERPRETER_DISABLE_SINGLE_STEP_DEBUGGING_BC_STUB_LIST(V)             \
547     ASM_INTERPRETER_BC_STUB_LIST(IGNORE_BC_STUB, IGNORE_BC_STUB, V)           \
548     ASM_INTERPRETER_DEPRECATED_STUB_LIST(IGNORE_BC_STUB, IGNORE_BC_STUB, V)   \
549     ASM_INTERPRETER_WIDE_STUB_LIST(IGNORE_BC_STUB, IGNORE_BC_STUB, V)         \
550     ASM_INTERPRETER_THROW_STUB_LIST(IGNORE_BC_STUB, IGNORE_BC_STUB, V)        \
551     ASM_INTERPRETER_CALLRUNTIME_STUB_LIST(IGNORE_BC_STUB, IGNORE_BC_STUB, V)
552 
553 #define INTERPRETER_BC_STUB_LIST(V)                              \
554     ASM_INTERPRETER_BC_STUB_LIST(IGNORE_BC_STUB, V, V)           \
555     ASM_INTERPRETER_DEPRECATED_STUB_LIST(IGNORE_BC_STUB, V, V)   \
556     ASM_INTERPRETER_WIDE_STUB_LIST(IGNORE_BC_STUB, V, V)         \
557     ASM_INTERPRETER_THROW_STUB_LIST(IGNORE_BC_STUB, V, V)        \
558     ASM_INTERPRETER_CALLRUNTIME_STUB_LIST(IGNORE_BC_STUB, V, V)
559 
560 #define ASM_INTERPRETER_BC_STUB_ID_LIST(V) \
561     ASM_INTERPRETER_BC_STUB_LIST(V, V, V)
562 
563 #define ASM_INTERPRETER_SECOND_BC_STUB_ID_LIST(V)   \
564     ASM_INTERPRETER_WIDE_STUB_LIST(V, V, V)         \
565     ASM_INTERPRETER_THROW_STUB_LIST(V, V, V)        \
566     ASM_INTERPRETER_DEPRECATED_STUB_LIST(V, V, V)   \
567     ASM_INTERPRETER_CALLRUNTIME_STUB_LIST(V, V, V)
568 
569 class BytecodeStubCSigns {
570 public:
571     // is uint8 max
572     static constexpr size_t LAST_VALID_OPCODE = 0xFF;
573     // all valid stub, include normal and helper stub
574     enum ValidID {
575 #define DEF_VALID_BC_STUB_ID(name) name,
576         INTERPRETER_BC_STUB_LIST(DEF_VALID_BC_STUB_ID)
577         ASM_INTERPRETER_BC_HELPER_STUB_LIST(DEF_VALID_BC_STUB_ID)
578 #undef DEF_VALID_BC_STUB_ID
579 #define DEF_VALID_BC_STUB_ID(name, ...) name,
580         ASM_INTERPRETER_BC_PROFILER_STUB_LIST(DEF_VALID_BC_STUB_ID)
581 #undef DEF_VALID_BC_STUB_ID
582 #define DEF_VALID_BC_STUB_ID(name, ...) name,
583         ASM_INTERPRETER_BC_JIT_PROFILER_STUB_LIST(DEF_VALID_BC_STUB_ID)
584 #undef DEF_VALID_BC_STUB_ID
585         NUM_OF_VALID_STUBS
586     };
587 
588 #define DEF_BC_STUB_ID(name) PREF_ID_##name,
589     enum WideID {
590         ASM_INTERPRETER_WIDE_STUB_LIST(DEF_BC_STUB_ID, DEF_BC_STUB_ID, DEF_BC_STUB_ID)
591         NUM_OF_WIDE_STUBS
592     };
593     enum ThrowID {
594         ASM_INTERPRETER_THROW_STUB_LIST(DEF_BC_STUB_ID, DEF_BC_STUB_ID, DEF_BC_STUB_ID)
595         NUM_OF_THROW_STUBS
596     };
597     enum DeprecatedID {
598         ASM_INTERPRETER_DEPRECATED_STUB_LIST(DEF_BC_STUB_ID, DEF_BC_STUB_ID, DEF_BC_STUB_ID)
599         NUM_OF_DEPRECATED_STUBS
600     };
601     enum CallRuntimeID {
602         ASM_INTERPRETER_CALLRUNTIME_STUB_LIST(DEF_BC_STUB_ID, DEF_BC_STUB_ID, DEF_BC_STUB_ID)
603         NUM_OF_CALLRUNTIME_STUBS
604     };
605 #undef DEF_BC_STUB_ID
606 
607 #define DEF_BC_STUB_ID(name) ID_##name,
608     enum ID {
609         ASM_INTERPRETER_BC_STUB_ID_LIST(DEF_BC_STUB_ID)
610         NUM_OF_ALL_NORMAL_STUBS,
611         lastOpcode = LAST_VALID_OPCODE, // last Opcode is max opcode size
612         ASM_INTERPRETER_SECOND_BC_STUB_ID_LIST(DEF_BC_STUB_ID)
613         ASM_INTERPRETER_BC_HELPER_STUB_LIST(DEF_BC_STUB_ID)
614 #undef DEF_BC_STUB_ID
615 #define DEF_BC_STUB_ID(name, ...) ID_##name,
616         ASM_INTERPRETER_BC_PROFILER_STUB_LIST(DEF_BC_STUB_ID)
617 #undef DEF_BC_STUB_ID
618 #define DEF_BC_STUB_ID(name, ...) ID_##name,
619         ASM_INTERPRETER_BC_JIT_PROFILER_STUB_LIST(DEF_BC_STUB_ID)
620         NUM_OF_STUBS,
621         ID_Wide_Start = lastOpcode + 1,
622         ID_Throw_Start = ID_Wide_Start + NUM_OF_WIDE_STUBS,
623         ID_Deprecated_Start = ID_Throw_Start + NUM_OF_THROW_STUBS,
624         ID_CallRuntime_Start = ID_Deprecated_Start + NUM_OF_DEPRECATED_STUBS
625     };
626 #undef DEF_BC_STUB_ID
627 
628     static void Initialize();
629 
630     static void GetCSigns(std::vector<const CallSignature*>& outCSigns);
631 
Get(size_t index)632     static const CallSignature* Get(size_t index)
633     {
634         ASSERT(index < NUM_OF_VALID_STUBS);
635         return &callSigns_[index];
636     }
637 
BCDebuggerHandler()638     static const CallSignature* BCDebuggerHandler()
639     {
640         return &bcDebuggerHandlerCSign_;
641     }
642 
BCHandler()643     static const CallSignature* BCHandler()
644     {
645         return &bcHandlerCSign_;
646     }
647 
648 private:
649     static CallSignature callSigns_[NUM_OF_VALID_STUBS];
650     static CallSignature bcHandlerCSign_;
651     static CallSignature bcDebuggerHandlerCSign_;
652 };
653 
654 enum class InterpreterHandlerInputs : size_t {
655     GLUE = 0,
656     SP,
657     PC,
658     CONSTPOOL,
659     PROFILE_TYPE_INFO,
660     ACC,
661     HOTNESS_COUNTER,
662     NUM_OF_INPUTS
663 };
664 
665 enum class CallDispatchInputs : size_t {
666     GLUE = 0,
667     SP,
668     CALL_TARGET,
669     METHOD,
670     CALL_FIELD,
671     ARG0,
672     ARG1,
673     ARG2,
674     ARG3,
675     NUM_OF_INPUTS,
676 
677     ARGC = ARG0,
678     ARGV = ARG1,
679 };
680 
681 #define BYTECODE_STUB_END_ID BytecodeStubCSigns::ID_ExceptionHandler
682 #define BCSTUB_ID(name) kungfu::BytecodeStubCSigns::ID_##name
683 }  // namespace panda::ecmascript::kungfu
684 #endif  // ECMASCRIPT_COMPILER_BC_CALL_SIGNATURE_H
685