• 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 #include "ecmascript/compiler/bytecode_circuit_builder.h"
16 #include "ecmascript/compiler/bytecodes.h"
17 #include "ecmascript/interpreter/interpreter-inl.h"
18 
19 namespace panda::ecmascript::kungfu {
InitBytecodeMetaData(const uint8_t * pc)20 BytecodeMetaData BytecodeMetaData::InitBytecodeMetaData(const uint8_t *pc)
21 {
22     BytecodeInstruction inst(pc);
23     uint32_t flags = 0;
24     BytecodeKind kind = BytecodeKind::GENERAL;
25     if (inst.HasFlag(BytecodeInstruction::Flags::ACC_READ)) {
26         flags |= BytecodeFlags::READ_ACC;
27     }
28     if (inst.HasFlag(BytecodeInstruction::Flags::ACC_WRITE)) {
29         flags |= BytecodeFlags::WRITE_ACC;
30     }
31 
32     switch (inst.GetOpcode()) {
33         case EcmaOpcode::GETPROPITERATOR:
34         case EcmaOpcode::TYPEOF_IMM8:
35         case EcmaOpcode::TYPEOF_IMM16:
36         case EcmaOpcode::LDSYMBOL:
37         case EcmaOpcode::LDGLOBAL:
38         case EcmaOpcode::LDBIGINT_ID16:
39         case EcmaOpcode::LDEXTERNALMODULEVAR_IMM8:
40         case EcmaOpcode::WIDE_LDEXTERNALMODULEVAR_PREF_IMM16:
41         case EcmaOpcode::GETMODULENAMESPACE_IMM8:
42         case EcmaOpcode::WIDE_GETMODULENAMESPACE_PREF_IMM16:
43         case EcmaOpcode::ISTRUE:
44         case EcmaOpcode::ISFALSE:
45         case EcmaOpcode::LDGLOBALVAR_IMM16_ID16:
46         case EcmaOpcode::LDOBJBYINDEX_IMM8_IMM16:
47         case EcmaOpcode::LDOBJBYINDEX_IMM16_IMM16:
48         case EcmaOpcode::WIDE_LDOBJBYINDEX_PREF_IMM32:
49         case EcmaOpcode::LDLEXVAR_IMM4_IMM4:
50         case EcmaOpcode::LDLEXVAR_IMM8_IMM8:
51         case EcmaOpcode::WIDE_LDLEXVAR_PREF_IMM16_IMM16:
52         case EcmaOpcode::WIDE_LDPATCHVAR_PREF_IMM16:
53         case EcmaOpcode::LDLOCALMODULEVAR_IMM8:
54         case EcmaOpcode::WIDE_LDLOCALMODULEVAR_PREF_IMM16:
55         case EcmaOpcode::LDA_STR_ID16:
56         case EcmaOpcode::CALLRUNTIME_LDSENDABLECLASS_PREF_IMM16:
57             flags |= BytecodeFlags::NO_SIDE_EFFECTS;
58             break;
59         default:
60             break;
61     }
62 
63     switch (inst.GetOpcode()) {
64         case EcmaOpcode::MOV_V4_V4:
65         case EcmaOpcode::MOV_V8_V8:
66         case EcmaOpcode::MOV_V16_V16:
67         case EcmaOpcode::STA_V8:
68         case EcmaOpcode::LDA_V8:
69         case EcmaOpcode::LDHOLE:
70         case EcmaOpcode::LDAI_IMM32:
71         case EcmaOpcode::FLDAI_IMM64:
72         case EcmaOpcode::LDFUNCTION:
73         case EcmaOpcode::TYPEOF_IMM8:
74         case EcmaOpcode::TYPEOF_IMM16:
75         case EcmaOpcode::LDNAN:
76         case EcmaOpcode::LDINFINITY:
77         case EcmaOpcode::LDUNDEFINED:
78         case EcmaOpcode::LDNULL:
79         case EcmaOpcode::LDTRUE:
80         case EcmaOpcode::LDFALSE:
81         case EcmaOpcode::LDSYMBOL:
82         case EcmaOpcode::LDGLOBAL:
83         case EcmaOpcode::LDBIGINT_ID16:
84         case EcmaOpcode::LDLEXVAR_IMM4_IMM4:
85         case EcmaOpcode::LDLEXVAR_IMM8_IMM8:
86         case EcmaOpcode::WIDE_LDLEXVAR_PREF_IMM16_IMM16:
87         case EcmaOpcode::WIDE_LDPATCHVAR_PREF_IMM16:
88         case EcmaOpcode::LDA_STR_ID16:
89         case EcmaOpcode::CALLRUNTIME_LDSENDABLECLASS_PREF_IMM16:
90         case EcmaOpcode::RETURN:
91         case EcmaOpcode::RETURNUNDEFINED:
92             flags |= BytecodeFlags::NO_GC;
93             break;
94         default:
95             break;
96     }
97 
98     switch (inst.GetOpcode()) {
99         case EcmaOpcode::MOV_V4_V4:
100         case EcmaOpcode::MOV_V8_V8:
101         case EcmaOpcode::MOV_V16_V16:
102         case EcmaOpcode::STA_V8:
103         case EcmaOpcode::LDA_V8:
104         case EcmaOpcode::LDNAN:
105         case EcmaOpcode::LDINFINITY:
106         case EcmaOpcode::LDUNDEFINED:
107         case EcmaOpcode::LDNULL:
108         case EcmaOpcode::LDTRUE:
109         case EcmaOpcode::LDFALSE:
110         case EcmaOpcode::LDHOLE:
111         case EcmaOpcode::LDAI_IMM32:
112         case EcmaOpcode::FLDAI_IMM64:
113         case EcmaOpcode::LDFUNCTION:
114         case EcmaOpcode::LDA_STR_ID16:
115         case EcmaOpcode::TYPEOF_IMM8:
116         case EcmaOpcode::TYPEOF_IMM16:
117         case EcmaOpcode::ISTRUE:
118         case EcmaOpcode::ISFALSE:
119         case EcmaOpcode::JEQZ_IMM8:
120         case EcmaOpcode::JEQZ_IMM16:
121         case EcmaOpcode::JEQZ_IMM32:
122         case EcmaOpcode::JNEZ_IMM8:
123         case EcmaOpcode::JNEZ_IMM16:
124         case EcmaOpcode::JNEZ_IMM32:
125         case EcmaOpcode::JMP_IMM8:
126         case EcmaOpcode::JMP_IMM16:
127         case EcmaOpcode::JMP_IMM32:
128         case EcmaOpcode::STMODULEVAR_IMM8:
129         case EcmaOpcode::WIDE_STMODULEVAR_PREF_IMM16:
130         case EcmaOpcode::LDEXTERNALMODULEVAR_IMM8:
131         case EcmaOpcode::WIDE_LDEXTERNALMODULEVAR_PREF_IMM16:
132         case EcmaOpcode::NEWLEXENV_IMM8:
133         case EcmaOpcode::WIDE_NEWLEXENV_PREF_IMM16:
134         case EcmaOpcode::POPLEXENV:
135         case EcmaOpcode::NEWLEXENVWITHNAME_IMM8_ID16:
136         case EcmaOpcode::WIDE_NEWLEXENVWITHNAME_PREF_IMM16_ID16:
137         case EcmaOpcode::ASYNCFUNCTIONENTER:
138         case EcmaOpcode::SETGENERATORSTATE_IMM8:
139         case EcmaOpcode::GETRESUMEMODE:
140         case EcmaOpcode::RESUMEGENERATOR:
141         case EcmaOpcode::RETURN:
142         case EcmaOpcode::RETURNUNDEFINED:
143         case EcmaOpcode::LDLEXVAR_IMM4_IMM4:
144         case EcmaOpcode::LDLEXVAR_IMM8_IMM8:
145         case EcmaOpcode::WIDE_LDLEXVAR_PREF_IMM16_IMM16:
146         case EcmaOpcode::STLEXVAR_IMM4_IMM4:
147         case EcmaOpcode::STLEXVAR_IMM8_IMM8:
148         case EcmaOpcode::WIDE_STLEXVAR_PREF_IMM16_IMM16:
149         case EcmaOpcode::STRICTNOTEQ_IMM8_V8:
150         case EcmaOpcode::STRICTEQ_IMM8_V8:
151         case EcmaOpcode::CREATEEMPTYARRAY_IMM8:
152         case EcmaOpcode::CREATEEMPTYARRAY_IMM16:
153         case EcmaOpcode::CREATEEMPTYOBJECT:
154         case EcmaOpcode::CREATEARRAYWITHBUFFER_IMM8_ID16:
155         case EcmaOpcode::CREATEARRAYWITHBUFFER_IMM16_ID16:
156         case EcmaOpcode::CREATEITERRESULTOBJ_V8_V8:
157         case EcmaOpcode::DEFINEFUNC_IMM8_ID16_IMM8:
158         case EcmaOpcode::DEFINEFUNC_IMM16_ID16_IMM8:
159         case EcmaOpcode::DEFINEMETHOD_IMM8_ID16_IMM8:
160         case EcmaOpcode::DEFINEMETHOD_IMM16_ID16_IMM8:
161         case EcmaOpcode::CALLRUNTIME_LDSENDABLECLASS_PREF_IMM16:
162         case EcmaOpcode::GETUNMAPPEDARGS:
163         case EcmaOpcode::DEBUGGER:
164         case EcmaOpcode::NOP:
165             flags |= BytecodeFlags::NO_THROW;
166             break;
167         default:
168             break;
169     }
170 
171     switch (inst.GetOpcode()) {
172         case EcmaOpcode::MOV_V4_V4:
173         case EcmaOpcode::MOV_V8_V8:
174         case EcmaOpcode::MOV_V16_V16:
175         case EcmaOpcode::STA_V8:
176         case EcmaOpcode::LDA_V8:
177             kind = BytecodeKind::MOV;
178             flags |= BytecodeFlags::NO_SIDE_EFFECTS;
179             break;
180         case EcmaOpcode::LDNAN:
181         case EcmaOpcode::LDINFINITY:
182         case EcmaOpcode::LDUNDEFINED:
183         case EcmaOpcode::LDNULL:
184         case EcmaOpcode::LDTRUE:
185         case EcmaOpcode::LDFALSE:
186         case EcmaOpcode::LDHOLE:
187         case EcmaOpcode::LDAI_IMM32:
188         case EcmaOpcode::FLDAI_IMM64:
189         case EcmaOpcode::LDFUNCTION:
190             kind = BytecodeKind::SET_CONSTANT;
191             flags |= BytecodeFlags::NO_SIDE_EFFECTS;
192             break;
193         case EcmaOpcode::LDTHISBYVALUE_IMM8:
194         case EcmaOpcode::LDTHISBYVALUE_IMM16:
195         case EcmaOpcode::STTHISBYVALUE_IMM8_V8:
196         case EcmaOpcode::STTHISBYVALUE_IMM16_V8:
197             flags |= BytecodeFlags::READ_THIS_OBJECT;
198             break;
199         case EcmaOpcode::LDTHISBYNAME_IMM8_ID16:
200         case EcmaOpcode::LDTHISBYNAME_IMM16_ID16:
201         case EcmaOpcode::STTHISBYNAME_IMM8_ID16:
202         case EcmaOpcode::STTHISBYNAME_IMM16_ID16:
203             flags |= BytecodeFlags::READ_THIS_OBJECT;
204             [[fallthrough]];
205         case EcmaOpcode::ADD2_IMM8_V8:
206         case EcmaOpcode::SUB2_IMM8_V8:
207         case EcmaOpcode::MUL2_IMM8_V8:
208         case EcmaOpcode::DIV2_IMM8_V8:
209         case EcmaOpcode::EQ_IMM8_V8:
210         case EcmaOpcode::NOTEQ_IMM8_V8:
211         case EcmaOpcode::LESS_IMM8_V8:
212         case EcmaOpcode::LESSEQ_IMM8_V8:
213         case EcmaOpcode::GREATER_IMM8_V8:
214         case EcmaOpcode::GREATEREQ_IMM8_V8:
215         case EcmaOpcode::STRICTEQ_IMM8_V8:
216         case EcmaOpcode::STRICTNOTEQ_IMM8_V8:
217         case EcmaOpcode::TONUMERIC_IMM8:
218         case EcmaOpcode::ISTRUE:
219         case EcmaOpcode::ISFALSE:
220         case EcmaOpcode::INC_IMM8:
221         case EcmaOpcode::DEC_IMM8:
222         case EcmaOpcode::NEG_IMM8:
223         case EcmaOpcode::NOT_IMM8:
224         case EcmaOpcode::MOD2_IMM8_V8:
225         case EcmaOpcode::SHL2_IMM8_V8:
226         case EcmaOpcode::SHR2_IMM8_V8:
227         case EcmaOpcode::ASHR2_IMM8_V8:
228         case EcmaOpcode::AND2_IMM8_V8:
229         case EcmaOpcode::OR2_IMM8_V8:
230         case EcmaOpcode::XOR2_IMM8_V8:
231         case EcmaOpcode::LDOBJBYNAME_IMM8_ID16:
232         case EcmaOpcode::LDOBJBYNAME_IMM16_ID16:
233         case EcmaOpcode::STOBJBYNAME_IMM8_ID16_V8:
234         case EcmaOpcode::STOBJBYNAME_IMM16_ID16_V8:
235         case EcmaOpcode::LDOBJBYINDEX_IMM8_IMM16:
236         case EcmaOpcode::LDOBJBYINDEX_IMM16_IMM16:
237         case EcmaOpcode::WIDE_LDOBJBYINDEX_PREF_IMM32:
238         case EcmaOpcode::STOBJBYINDEX_IMM8_V8_IMM16:
239         case EcmaOpcode::STOBJBYINDEX_IMM16_V8_IMM16:
240         case EcmaOpcode::WIDE_STOBJBYINDEX_PREF_V8_IMM32:
241         case EcmaOpcode::LDOBJBYVALUE_IMM8_V8:
242         case EcmaOpcode::LDOBJBYVALUE_IMM16_V8:
243         case EcmaOpcode::STOBJBYVALUE_IMM8_V8_V8:
244         case EcmaOpcode::STOBJBYVALUE_IMM16_V8_V8:
245         case EcmaOpcode::NEWOBJRANGE_IMM8_IMM8_V8:
246         case EcmaOpcode::NEWOBJRANGE_IMM16_IMM8_V8:
247         case EcmaOpcode::WIDE_NEWOBJRANGE_PREF_IMM16_V8:
248         case EcmaOpcode::SUPERCALLTHISRANGE_IMM8_IMM8_V8:
249         case EcmaOpcode::WIDE_SUPERCALLTHISRANGE_PREF_IMM16_V8:
250         case EcmaOpcode::LDPRIVATEPROPERTY_IMM8_IMM16_IMM16:
251         case EcmaOpcode::STPRIVATEPROPERTY_IMM8_IMM16_IMM16_V8:
252         case EcmaOpcode::TESTIN_IMM8_IMM16_IMM16:
253         case EcmaOpcode::DEFINEFIELDBYNAME_IMM8_ID16_V8:
254         case EcmaOpcode::CALLRUNTIME_DEFINEFIELDBYVALUE_PREF_IMM8_V8_V8:
255         case EcmaOpcode::CALLRUNTIME_DEFINEFIELDBYINDEX_PREF_IMM8_IMM32_V8:
256         case EcmaOpcode::CALLRUNTIME_TOPROPERTYKEY_PREF_NONE:
257         case EcmaOpcode::CALLRUNTIME_CREATEPRIVATEPROPERTY_PREF_IMM16_ID16:
258         case EcmaOpcode::CALLRUNTIME_DEFINEPRIVATEPROPERTY_PREF_IMM8_IMM16_IMM16_V8:
259             flags |= BytecodeFlags::SUPPORT_DEOPT;
260             break;
261         case EcmaOpcode::CALLTHIS1_IMM8_V8_V8:
262         case EcmaOpcode::CALLARG0_IMM8:
263         case EcmaOpcode::CALLARG1_IMM8_V8:
264         case EcmaOpcode::CALLARGS2_IMM8_V8_V8:
265         case EcmaOpcode::CALLARGS3_IMM8_V8_V8_V8:
266         case EcmaOpcode::CALLRANGE_IMM8_IMM8_V8:
267         case EcmaOpcode::CALLTHIS0_IMM8_V8:
268         case EcmaOpcode::CALLTHIS2_IMM8_V8_V8_V8:
269         case EcmaOpcode::CALLTHIS3_IMM8_V8_V8_V8_V8:
270         case EcmaOpcode::CALLTHISRANGE_IMM8_IMM8_V8:
271         case EcmaOpcode::CALLRUNTIME_CALLINIT_PREF_IMM8_V8:
272             flags |= BytecodeFlags::SUPPORT_DEOPT;
273             kind = BytecodeKind::CALL_BC;
274             break;
275         case EcmaOpcode::RETURN:
276             flags |= BytecodeFlags::READ_ACC;
277             [[fallthrough]];
278         case EcmaOpcode::RETURNUNDEFINED:
279             flags |= BytecodeFlags::NO_SIDE_EFFECTS;
280             kind = BytecodeKind::RETURN_BC;
281             break;
282         case EcmaOpcode::SUSPENDGENERATOR_V8:
283             flags |= BytecodeFlags::READ_THIS_OBJECT;
284             U_FALLTHROUGH;
285         case EcmaOpcode::DEPRECATED_SUSPENDGENERATOR_PREF_V8_V8:
286             kind = BytecodeKind::SUSPEND;
287             break;
288         case EcmaOpcode::RESUMEGENERATOR:
289             kind = BytecodeKind::RESUME;
290             break;
291         case EcmaOpcode::DEBUGGER:
292             flags |= BytecodeFlags::DEBUGGER_STMT;
293             break;
294         case EcmaOpcode::NOP:
295             kind = BytecodeKind::DISCARDED;
296             flags |= BytecodeFlags::NO_SIDE_EFFECTS;
297             break;
298         case EcmaOpcode::THROW_PREF_NONE:
299         case EcmaOpcode::THROW_NOTEXISTS_PREF_NONE:
300         case EcmaOpcode::THROW_PATTERNNONCOERCIBLE_PREF_NONE:
301         case EcmaOpcode::THROW_DELETESUPERPROPERTY_PREF_NONE:
302         case EcmaOpcode::THROW_CONSTASSIGNMENT_PREF_V8:
303             kind = BytecodeKind::THROW_BC;
304             break;
305         case EcmaOpcode::JEQZ_IMM8:
306         case EcmaOpcode::JEQZ_IMM16:
307         case EcmaOpcode::JEQZ_IMM32:
308         case EcmaOpcode::JNEZ_IMM8:
309         case EcmaOpcode::JNEZ_IMM16:
310         case EcmaOpcode::JNEZ_IMM32:
311             kind = BytecodeKind::CONDITIONAL_JUMP;
312             flags |= BytecodeFlags::NO_SIDE_EFFECTS;
313             break;
314         case EcmaOpcode::JMP_IMM8:
315         case EcmaOpcode::JMP_IMM16:
316         case EcmaOpcode::JMP_IMM32:
317             kind = BytecodeKind::JUMP_IMM;
318             flags |= BytecodeFlags::NO_SIDE_EFFECTS;
319             break;
320         case EcmaOpcode::CALLRUNTIME_NOTIFYCONCURRENTRESULT_PREF_NONE:
321             flags |= BytecodeFlags::READ_FUNC;
322             break;
323         case EcmaOpcode::ASYNCGENERATORRESOLVE_V8_V8_V8:
324             flags |= BytecodeFlags::READ_THIS_OBJECT;
325             flags |= BytecodeFlags::READ_ACC;
326             kind = BytecodeKind::GENERATOR_RESOLVE;
327             break;
328         default:
329             break;
330     }
331 
332     switch (inst.GetOpcode()) {
333         case EcmaOpcode::NEWLEXENV_IMM8:
334         case EcmaOpcode::WIDE_NEWLEXENV_PREF_IMM16:
335         case EcmaOpcode::NEWLEXENVWITHNAME_IMM8_ID16:
336         case EcmaOpcode::WIDE_NEWLEXENVWITHNAME_PREF_IMM16_ID16:
337         case EcmaOpcode::POPLEXENV:
338             flags |= BytecodeFlags::WRITE_ENV;
339             [[fallthrough]];
340         case EcmaOpcode::LDLEXVAR_IMM4_IMM4:
341         case EcmaOpcode::LDLEXVAR_IMM8_IMM8:
342         case EcmaOpcode::WIDE_LDLEXVAR_PREF_IMM16_IMM16:
343         case EcmaOpcode::CREATEOBJECTWITHBUFFER_IMM8_ID16:
344         case EcmaOpcode::CREATEOBJECTWITHBUFFER_IMM16_ID16:
345         case EcmaOpcode::DEFINECLASSWITHBUFFER_IMM8_ID16_ID16_IMM16_V8:
346         case EcmaOpcode::DEFINECLASSWITHBUFFER_IMM16_ID16_ID16_IMM16_V8:
347         case EcmaOpcode::DEFINEFUNC_IMM8_ID16_IMM8:
348         case EcmaOpcode::DEFINEFUNC_IMM16_ID16_IMM8:
349         case EcmaOpcode::DEFINEMETHOD_IMM8_ID16_IMM8:
350         case EcmaOpcode::DEFINEMETHOD_IMM16_ID16_IMM8:
351         case EcmaOpcode::LDPRIVATEPROPERTY_IMM8_IMM16_IMM16:
352         case EcmaOpcode::STPRIVATEPROPERTY_IMM8_IMM16_IMM16_V8:
353         case EcmaOpcode::TESTIN_IMM8_IMM16_IMM16:
354         case EcmaOpcode::CALLRUNTIME_CREATEPRIVATEPROPERTY_PREF_IMM16_ID16:
355         case EcmaOpcode::CALLRUNTIME_DEFINEPRIVATEPROPERTY_PREF_IMM8_IMM16_IMM16_V8:
356         case EcmaOpcode::CALLRUNTIME_LDSENDABLECLASS_PREF_IMM16:
357             flags |= BytecodeFlags::READ_ENV;
358             break;
359         default:
360             break;
361     }
362 
363     switch (inst.GetOpcode()) {
364         case EcmaOpcode::SUSPENDGENERATOR_V8:
365         case EcmaOpcode::RESUMEGENERATOR:
366         case EcmaOpcode::TRYLDGLOBALBYNAME_IMM8_ID16:
367         case EcmaOpcode::TRYLDGLOBALBYNAME_IMM16_ID16:
368         case EcmaOpcode::STGLOBALVAR_IMM16_ID16:
369         case EcmaOpcode::THROW_UNDEFINEDIFHOLEWITHNAME_PREF_ID16:
370         case EcmaOpcode::DEFINEFUNC_IMM8_ID16_IMM8:
371         case EcmaOpcode::DEFINEFUNC_IMM16_ID16_IMM8:
372         case EcmaOpcode::DEFINEMETHOD_IMM8_ID16_IMM8:
373         case EcmaOpcode::DEFINEMETHOD_IMM16_ID16_IMM8:
374         case EcmaOpcode::DEFINECLASSWITHBUFFER_IMM8_ID16_ID16_IMM16_V8:
375         case EcmaOpcode::DEFINECLASSWITHBUFFER_IMM16_ID16_ID16_IMM16_V8:
376         case EcmaOpcode::INSTANCEOF_IMM8_V8:
377         case EcmaOpcode::CREATEOBJECTWITHBUFFER_IMM8_ID16:
378         case EcmaOpcode::CREATEOBJECTWITHBUFFER_IMM16_ID16:
379         case EcmaOpcode::CREATEARRAYWITHBUFFER_IMM8_ID16:
380         case EcmaOpcode::CREATEARRAYWITHBUFFER_IMM16_ID16:
381         case EcmaOpcode::STMODULEVAR_IMM8:
382         case EcmaOpcode::WIDE_STMODULEVAR_PREF_IMM16:
383         case EcmaOpcode::SETGENERATORSTATE_IMM8:
384         case EcmaOpcode::DYNAMICIMPORT:
385         case EcmaOpcode::LDEXTERNALMODULEVAR_IMM8:
386         case EcmaOpcode::WIDE_LDEXTERNALMODULEVAR_PREF_IMM16:
387         case EcmaOpcode::GETMODULENAMESPACE_IMM8:
388         case EcmaOpcode::WIDE_GETMODULENAMESPACE_PREF_IMM16:
389         case EcmaOpcode::NEWLEXENVWITHNAME_IMM8_ID16:
390         case EcmaOpcode::WIDE_NEWLEXENVWITHNAME_PREF_IMM16_ID16:
391         case EcmaOpcode::LDSUPERBYVALUE_IMM8_V8:
392         case EcmaOpcode::LDSUPERBYVALUE_IMM16_V8:
393         case EcmaOpcode::STSUPERBYVALUE_IMM16_V8_V8:
394         case EcmaOpcode::STSUPERBYVALUE_IMM8_V8_V8:
395         case EcmaOpcode::TRYSTGLOBALBYNAME_IMM8_ID16:
396         case EcmaOpcode::TRYSTGLOBALBYNAME_IMM16_ID16:
397         case EcmaOpcode::LDGLOBALVAR_IMM16_ID16:
398         case EcmaOpcode::LDOBJBYNAME_IMM8_ID16:
399         case EcmaOpcode::LDOBJBYNAME_IMM16_ID16:
400         case EcmaOpcode::STOBJBYNAME_IMM8_ID16_V8:
401         case EcmaOpcode::STOBJBYNAME_IMM16_ID16_V8:
402         case EcmaOpcode::LDOBJBYVALUE_IMM8_V8:
403         case EcmaOpcode::LDOBJBYVALUE_IMM16_V8:
404         case EcmaOpcode::LDTHISBYVALUE_IMM8:
405         case EcmaOpcode::LDTHISBYVALUE_IMM16:
406         case EcmaOpcode::STOBJBYVALUE_IMM8_V8_V8:
407         case EcmaOpcode::STOBJBYVALUE_IMM16_V8_V8:
408         case EcmaOpcode::STTHISBYVALUE_IMM8_V8:
409         case EcmaOpcode::STTHISBYVALUE_IMM16_V8:
410         case EcmaOpcode::LDSUPERBYNAME_IMM8_ID16:
411         case EcmaOpcode::LDSUPERBYNAME_IMM16_ID16:
412         case EcmaOpcode::STSUPERBYNAME_IMM8_ID16_V8:
413         case EcmaOpcode::STSUPERBYNAME_IMM16_ID16_V8:
414         case EcmaOpcode::LDLOCALMODULEVAR_IMM8:
415         case EcmaOpcode::WIDE_LDLOCALMODULEVAR_PREF_IMM16:
416         case EcmaOpcode::LDTHISBYNAME_IMM8_ID16:
417         case EcmaOpcode::LDTHISBYNAME_IMM16_ID16:
418         case EcmaOpcode::STTHISBYNAME_IMM8_ID16:
419         case EcmaOpcode::STTHISBYNAME_IMM16_ID16:
420         case EcmaOpcode::ASYNCGENERATORRESOLVE_V8_V8_V8:
421         case EcmaOpcode::CALLARG0_IMM8:
422         case EcmaOpcode::CALLARG1_IMM8_V8:
423         case EcmaOpcode::CALLARGS2_IMM8_V8_V8:
424         case EcmaOpcode::CALLARGS3_IMM8_V8_V8_V8:
425         case EcmaOpcode::CALLRANGE_IMM8_IMM8_V8:
426         case EcmaOpcode::WIDE_CALLRANGE_PREF_IMM16_V8:
427         case EcmaOpcode::CALLTHIS0_IMM8_V8:
428         case EcmaOpcode::CALLTHIS1_IMM8_V8_V8:
429         case EcmaOpcode::CALLTHIS2_IMM8_V8_V8_V8:
430         case EcmaOpcode::CALLTHIS3_IMM8_V8_V8_V8_V8:
431         case EcmaOpcode::CALLTHISRANGE_IMM8_IMM8_V8:
432         case EcmaOpcode::WIDE_CALLTHISRANGE_PREF_IMM16_V8:
433         case EcmaOpcode::LDA_STR_ID16:
434         case EcmaOpcode::STOWNBYNAMEWITHNAMESET_IMM8_ID16_V8:
435         case EcmaOpcode::STOWNBYNAMEWITHNAMESET_IMM16_ID16_V8:
436         case EcmaOpcode::STTOGLOBALRECORD_IMM16_ID16:
437         case EcmaOpcode::STCONSTTOGLOBALRECORD_IMM16_ID16:
438         case EcmaOpcode::STOWNBYNAME_IMM8_ID16_V8:
439         case EcmaOpcode::STOWNBYNAME_IMM16_ID16_V8:
440         case EcmaOpcode::CREATEREGEXPWITHLITERAL_IMM8_ID16_IMM8:
441         case EcmaOpcode::CREATEREGEXPWITHLITERAL_IMM16_ID16_IMM8:
442         case EcmaOpcode::LDBIGINT_ID16:
443         case EcmaOpcode::DEFINEFIELDBYNAME_IMM8_ID16_V8:
444         case EcmaOpcode::CALLRUNTIME_DEFINEFIELDBYVALUE_PREF_IMM8_V8_V8:
445         case EcmaOpcode::CALLRUNTIME_DEFINEFIELDBYINDEX_PREF_IMM8_IMM32_V8:
446         case EcmaOpcode::CALLRUNTIME_CREATEPRIVATEPROPERTY_PREF_IMM16_ID16:
447         case EcmaOpcode::CALLRUNTIME_DEFINEPRIVATEPROPERTY_PREF_IMM8_IMM16_IMM16_V8:
448         case EcmaOpcode::CALLRUNTIME_CALLINIT_PREF_IMM8_V8:
449         case EcmaOpcode::CALLRUNTIME_DEFINESENDABLECLASS_PREF_IMM16_ID16_ID16_IMM16_V8:
450             flags |= BytecodeFlags::READ_FUNC;
451             break;
452         case EcmaOpcode::SUPERCALLTHISRANGE_IMM8_IMM8_V8:
453         case EcmaOpcode::WIDE_SUPERCALLTHISRANGE_PREF_IMM16_V8:
454             flags |= BytecodeFlags::READ_FUNC;
455             flags |= BytecodeFlags::READ_NEWTARGET;
456             break;
457         case EcmaOpcode::SUPERCALLARROWRANGE_IMM8_IMM8_V8:
458         case EcmaOpcode::WIDE_SUPERCALLARROWRANGE_PREF_IMM16_V8:
459         case EcmaOpcode::SUPERCALLSPREAD_IMM8_V8:
460             flags |= BytecodeFlags::READ_NEWTARGET;
461             break;
462         case EcmaOpcode::GETUNMAPPEDARGS:
463         case EcmaOpcode::COPYRESTARGS_IMM8:
464         case EcmaOpcode::WIDE_COPYRESTARGS_PREF_IMM16:
465             flags |= BytecodeFlags::READ_ARGC;
466             [[fallthrough]];
467         default:
468             break;
469     }
470 
471     switch (inst.GetOpcode()) {
472         case EcmaOpcode::LDOBJBYNAME_IMM8_ID16:
473         case EcmaOpcode::LDOBJBYNAME_IMM16_ID16:
474         case EcmaOpcode::LDTHISBYNAME_IMM8_ID16:
475         case EcmaOpcode::LDTHISBYNAME_IMM16_ID16:
476         case EcmaOpcode::STOBJBYNAME_IMM8_ID16_V8:
477         case EcmaOpcode::STOBJBYNAME_IMM16_ID16_V8:
478         case EcmaOpcode::STTHISBYNAME_IMM8_ID16:
479         case EcmaOpcode::STTHISBYNAME_IMM16_ID16:
480             kind = BytecodeKind::ACCESSOR_BC;
481             break;
482         default:
483             break;
484     }
485 
486     if (kind == BytecodeKind::GENERAL ||
487         kind == BytecodeKind::THROW_BC ||
488         kind == BytecodeKind::RESUME ||
489         kind == BytecodeKind::SUSPEND ||
490         kind == BytecodeKind::GENERATOR_RESOLVE ||
491         kind == BytecodeKind::CALL_BC ||
492         kind == BytecodeKind::ACCESSOR_BC) {
493         flags |= BytecodeFlags::GENERAL_BC;
494     }
495     auto size = inst.GetSize();
496     uint64_t value = SizeField::Encode(size) | KindField::Encode(kind) |
497                      FlagsField::Encode(static_cast<BytecodeFlags>(flags)) |
498                      OpcodeField::Encode(inst.GetOpcode());
499     return BytecodeMetaData(value);
500 }
501 
Bytecodes()502 Bytecodes::Bytecodes()
503 {
504     for (uint8_t pc = 0; pc <= static_cast<uint8_t>(Bytecodes::LAST_OPCODE); pc++) {
505         auto info = BytecodeMetaData::InitBytecodeMetaData(&pc);
506         bytecodes_[pc] = info;
507     }
508     auto last = (static_cast<uint16_t>(Bytecodes::LAST_CALLRUNTIME_OPCODE) & OPCODE_MASK) >> BYTE_SIZE;
509     for (uint8_t pc = 0; pc <= last; pc++) {
510         std::array<uint8_t, 2> bytecode{CALLRUNTIME_PREFIX_OPCODE_INDEX, pc}; // 2: 2 opcode
511         auto info = BytecodeMetaData::InitBytecodeMetaData(&bytecode[0]);
512         callRuntimeBytecodes_[pc] = info;
513     }
514     last = (static_cast<uint16_t>(Bytecodes::LAST_DEPRECATED_OPCODE) & OPCODE_MASK) >> BYTE_SIZE;
515     for (uint8_t pc = 0; pc <= last; pc++) {
516         std::array<uint8_t, 2> bytecode{DEPRECATED_PREFIX_OPCODE_INDEX, pc}; // 2: 2 opcode
517         auto info = BytecodeMetaData::InitBytecodeMetaData(&bytecode[0]);
518         deprecatedBytecodes_[pc] = info;
519     }
520     last = (static_cast<uint16_t>(Bytecodes::LAST_WIDE_OPCODE) & OPCODE_MASK) >> BYTE_SIZE;
521     for (uint8_t pc = 0; pc <= last; pc++) {
522         std::array<uint8_t, 2> bytecode{WIDE_PREFIX_OPCODE_INDEX, pc}; // 2: 2 opcode
523         auto info = BytecodeMetaData::InitBytecodeMetaData(&bytecode[0]);
524         wideBytecodes_[pc] = info;
525     }
526     last = (static_cast<uint16_t>(Bytecodes::LAST_THROW_OPCODE) & OPCODE_MASK) >> BYTE_SIZE;
527     for (uint8_t pc = 0; pc <= last; pc++) {
528         std::array<uint8_t, 2> bytecode{THROW_PREFIX_OPCODE_INDEX, pc}; // 2: 2 opcode
529         auto info = BytecodeMetaData::InitBytecodeMetaData(&bytecode[0]);
530         throwBytecodes_[pc] = info;
531     }
532 }
533 
InitBytecodeInfo(BytecodeCircuitBuilder * builder,BytecodeInfo & info,const uint8_t * pc)534 void BytecodeInfo::InitBytecodeInfo(BytecodeCircuitBuilder *builder,
535                                     BytecodeInfo &info, const uint8_t *pc)
536 {
537     auto opcode = info.GetOpcode();
538     switch (opcode) {
539         case EcmaOpcode::MOV_V4_V4: {
540             uint16_t vdst = READ_INST_4_0();
541             uint16_t vsrc = READ_INST_4_1();
542             info.vregOut.emplace_back(vdst);
543             info.inputs.emplace_back(VirtualRegister(vsrc));
544             break;
545         }
546         case EcmaOpcode::MOV_V8_V8: {
547             uint16_t vdst = READ_INST_8_0();
548             uint16_t vsrc = READ_INST_8_1();
549             info.vregOut.emplace_back(vdst);
550             info.inputs.emplace_back(VirtualRegister(vsrc));
551             break;
552         }
553         case EcmaOpcode::MOV_V16_V16: {
554             uint16_t vdst = READ_INST_16_0();
555             uint16_t vsrc = READ_INST_16_2();
556             info.vregOut.emplace_back(vdst);
557             info.inputs.emplace_back(VirtualRegister(vsrc));
558             break;
559         }
560         case EcmaOpcode::LDA_STR_ID16: {
561             uint16_t stringId = READ_INST_16_0();
562             info.inputs.emplace_back(ConstDataId(ConstDataIDType::StringIDType, stringId));
563             break;
564         }
565         case EcmaOpcode::LDA_V8: {
566             uint16_t vsrc = READ_INST_8_0();
567             info.inputs.emplace_back(VirtualRegister(vsrc));
568             break;
569         }
570         case EcmaOpcode::STA_V8: {
571             uint16_t vdst = READ_INST_8_0();
572             info.vregOut.emplace_back(vdst);
573             break;
574         }
575         case EcmaOpcode::LDAI_IMM32: {
576             info.inputs.emplace_back(Immediate(READ_INST_32_0()));
577             break;
578         }
579         case EcmaOpcode::FLDAI_IMM64: {
580             info.inputs.emplace_back(Immediate(READ_INST_64_0()));
581             break;
582         }
583         case EcmaOpcode::CALLARG1_IMM8_V8: {
584             uint32_t a0 = READ_INST_8_1();
585             info.inputs.emplace_back(VirtualRegister(a0));
586             break;
587         }
588         case EcmaOpcode::CALLTHIS1_IMM8_V8_V8: {
589             uint32_t startReg = READ_INST_8_1(); // this
590             uint32_t a0 = READ_INST_8_2();
591             info.inputs.emplace_back(VirtualRegister(startReg));
592             info.inputs.emplace_back(VirtualRegister(a0));
593             break;
594         }
595         case EcmaOpcode::CALLARGS2_IMM8_V8_V8: {
596             uint32_t a0 = READ_INST_8_1();
597             uint32_t a1 = READ_INST_8_2();
598             info.inputs.emplace_back(VirtualRegister(a0));
599             info.inputs.emplace_back(VirtualRegister(a1));
600             break;
601         }
602         case EcmaOpcode::CALLARGS3_IMM8_V8_V8_V8: {
603             uint32_t a0 = READ_INST_8_1();
604             uint32_t a1 = READ_INST_8_2();
605             uint32_t a2 = READ_INST_8_3();
606             info.inputs.emplace_back(VirtualRegister(a0));
607             info.inputs.emplace_back(VirtualRegister(a1));
608             info.inputs.emplace_back(VirtualRegister(a2));
609             break;
610         }
611         case EcmaOpcode::CALLTHISRANGE_IMM8_IMM8_V8: {
612             uint32_t actualNumArgs = READ_INST_8_1();
613             uint32_t startReg = READ_INST_8_2();
614             info.inputs.emplace_back(VirtualRegister(startReg));
615             for (size_t i = 1; i <= actualNumArgs; i++) {
616                 info.inputs.emplace_back(VirtualRegister(startReg + i));
617             }
618             break;
619         }
620         case EcmaOpcode::WIDE_CALLTHISRANGE_PREF_IMM16_V8: {
621             uint32_t actualNumArgs = READ_INST_16_1();
622             uint32_t startReg = READ_INST_8_3();
623             info.inputs.emplace_back(VirtualRegister(startReg));
624             for (size_t i = 1; i <= actualNumArgs; i++) {
625                 info.inputs.emplace_back(VirtualRegister(startReg + i));
626             }
627             break;
628         }
629         case EcmaOpcode::CALLTHIS0_IMM8_V8: {
630             int32_t startReg = READ_INST_8_1();
631             info.inputs.emplace_back(VirtualRegister(startReg));
632             break;
633         }
634         case EcmaOpcode::CALLTHIS2_IMM8_V8_V8_V8: {
635             int32_t startReg = READ_INST_8_1();
636             uint32_t a0 = READ_INST_8_2();
637             uint32_t a1 = READ_INST_8_3();
638             info.inputs.emplace_back(VirtualRegister(startReg));
639             info.inputs.emplace_back(VirtualRegister(a0));
640             info.inputs.emplace_back(VirtualRegister(a1));
641             break;
642         }
643         case EcmaOpcode::CALLTHIS3_IMM8_V8_V8_V8_V8: {
644             int32_t startReg = READ_INST_8_1();
645             uint32_t a0 = READ_INST_8_2();
646             uint32_t a1 = READ_INST_8_3();
647             uint32_t a2 = READ_INST_8_4();
648             info.inputs.emplace_back(VirtualRegister(startReg));
649             info.inputs.emplace_back(VirtualRegister(a0));
650             info.inputs.emplace_back(VirtualRegister(a1));
651             info.inputs.emplace_back(VirtualRegister(a2));
652             break;
653         }
654         case EcmaOpcode::CALLRUNTIME_CALLINIT_PREF_IMM8_V8: {
655             int32_t startReg = READ_INST_8_2();
656             info.inputs.emplace_back(VirtualRegister(startReg));
657             break;
658         }
659 
660         case EcmaOpcode::APPLY_IMM8_V8_V8: {
661             uint16_t v0 = READ_INST_8_1();
662             uint16_t v1 = READ_INST_8_2();
663             info.inputs.emplace_back(VirtualRegister(v0));
664             info.inputs.emplace_back(VirtualRegister(v1));
665             break;
666         }
667         case EcmaOpcode::CALLRANGE_IMM8_IMM8_V8: {
668             int32_t actualNumArgs = READ_INST_8_1();
669             int32_t startReg = READ_INST_8_2();
670             for (int i = 0; i < actualNumArgs; i++) {
671                 info.inputs.emplace_back(VirtualRegister(startReg + i));
672             }
673             break;
674         }
675         case EcmaOpcode::WIDE_CALLRANGE_PREF_IMM16_V8: {
676             int32_t actualNumArgs = READ_INST_16_1();
677             int32_t startReg = READ_INST_8_3();
678             for (int i = 0; i < actualNumArgs; i++) {
679                 info.inputs.emplace_back(VirtualRegister(startReg + i));
680             }
681             break;
682         }
683         case EcmaOpcode::THROW_CONSTASSIGNMENT_PREF_V8: {
684             uint16_t v0 = READ_INST_8_1();
685             info.inputs.emplace_back(VirtualRegister(v0));
686             break;
687         }
688         case EcmaOpcode::THROW_IFNOTOBJECT_PREF_V8: {
689             uint16_t v0 = READ_INST_8_1();
690             info.inputs.emplace_back(VirtualRegister(v0));
691             break;
692         }
693         case EcmaOpcode::THROW_UNDEFINEDIFHOLE_PREF_V8_V8: {
694             uint16_t v0 = READ_INST_8_1();
695             uint16_t v1 = READ_INST_8_2();
696             info.inputs.emplace_back(VirtualRegister(v0));
697             info.inputs.emplace_back(VirtualRegister(v1));
698             break;
699         }
700         case EcmaOpcode::THROW_UNDEFINEDIFHOLEWITHNAME_PREF_ID16: {
701             uint16_t stringId = READ_INST_16_1();
702             info.inputs.emplace_back(ICSlotId(stringId));
703             break;
704         }
705         case EcmaOpcode::THROW_IFSUPERNOTCORRECTCALL_PREF_IMM8: {
706             uint8_t imm = READ_INST_8_1();
707             info.inputs.emplace_back(Immediate(imm));
708             break;
709         }
710         case EcmaOpcode::THROW_IFSUPERNOTCORRECTCALL_PREF_IMM16: {
711             uint16_t imm = READ_INST_16_1();
712             info.inputs.emplace_back(Immediate(imm));
713             break;
714         }
715         case EcmaOpcode::CLOSEITERATOR_IMM8_V8: {
716             uint16_t v0 = READ_INST_8_1();
717             info.inputs.emplace_back(VirtualRegister(v0));
718             break;
719         }
720         case EcmaOpcode::ADD2_IMM8_V8: {
721             uint16_t v0 = READ_INST_8_1();
722             info.inputs.emplace_back(VirtualRegister(v0));
723             break;
724         }
725         case EcmaOpcode::SUB2_IMM8_V8: {
726             uint16_t v0 = READ_INST_8_1();
727             info.inputs.emplace_back(VirtualRegister(v0));
728             break;
729         }
730         case EcmaOpcode::MUL2_IMM8_V8: {
731             uint16_t v0 = READ_INST_8_1();
732             info.inputs.emplace_back(VirtualRegister(v0));
733             break;
734         }
735         case EcmaOpcode::DIV2_IMM8_V8: {
736             uint16_t v0 = READ_INST_8_1();
737             info.inputs.emplace_back(VirtualRegister(v0));
738             break;
739         }
740         case EcmaOpcode::MOD2_IMM8_V8: {
741             uint16_t v0 = READ_INST_8_1();
742             info.inputs.emplace_back(VirtualRegister(v0));
743             break;
744         }
745         case EcmaOpcode::EQ_IMM8_V8: {
746             uint16_t v0 = READ_INST_8_1();
747             info.inputs.emplace_back(VirtualRegister(v0));
748             break;
749         }
750         case EcmaOpcode::NOTEQ_IMM8_V8: {
751             uint16_t v0 = READ_INST_8_1();
752             info.inputs.emplace_back(VirtualRegister(v0));
753             break;
754         }
755         case EcmaOpcode::LESS_IMM8_V8: {
756             uint16_t v0 = READ_INST_8_1();
757             info.inputs.emplace_back(VirtualRegister(v0));
758             break;
759         }
760         case EcmaOpcode::LESSEQ_IMM8_V8: {
761             uint16_t v0 = READ_INST_8_1();
762             info.inputs.emplace_back(VirtualRegister(v0));
763             break;
764         }
765         case EcmaOpcode::GREATER_IMM8_V8: {
766             uint16_t v0 = READ_INST_8_1();
767             info.inputs.emplace_back(VirtualRegister(v0));
768             break;
769         }
770         case EcmaOpcode::GREATEREQ_IMM8_V8: {
771             uint16_t vs = READ_INST_8_1();
772             info.inputs.emplace_back(VirtualRegister(vs));
773             break;
774         }
775         case EcmaOpcode::SHL2_IMM8_V8: {
776             uint16_t v0 = READ_INST_8_1();
777             info.inputs.emplace_back(VirtualRegister(v0));
778             break;
779         }
780         case EcmaOpcode::SHR2_IMM8_V8: {
781             uint16_t v0 = READ_INST_8_1();
782             info.inputs.emplace_back(VirtualRegister(v0));
783             break;
784         }
785         case EcmaOpcode::ASHR2_IMM8_V8: {
786             uint16_t v0 = READ_INST_8_1();
787             info.inputs.emplace_back(VirtualRegister(v0));
788             break;
789         }
790         case EcmaOpcode::AND2_IMM8_V8: {
791             uint16_t v0 = READ_INST_8_1();
792             info.inputs.emplace_back(VirtualRegister(v0));
793             break;
794         }
795         case EcmaOpcode::OR2_IMM8_V8: {
796             uint16_t v0 = READ_INST_8_1();
797             info.inputs.emplace_back(VirtualRegister(v0));
798             break;
799         }
800         case EcmaOpcode::XOR2_IMM8_V8: {
801             uint16_t v0 = READ_INST_8_1();
802             info.inputs.emplace_back(VirtualRegister(v0));
803             break;
804         }
805         case EcmaOpcode::EXP_IMM8_V8: {
806             uint16_t v0 = READ_INST_8_1();
807             info.inputs.emplace_back(VirtualRegister(v0));
808             break;
809         }
810         case EcmaOpcode::ISIN_IMM8_V8: {
811             uint16_t v0 = READ_INST_8_1();
812             info.inputs.emplace_back(VirtualRegister(v0));
813             break;
814         }
815         case EcmaOpcode::INSTANCEOF_IMM8_V8: {
816             uint16_t slotId = READ_INST_8_0();
817             uint16_t v0 = READ_INST_8_1();
818             info.inputs.emplace_back(ICSlotId(slotId));
819             info.inputs.emplace_back(VirtualRegister(v0));
820             break;
821         }
822         case EcmaOpcode::STRICTNOTEQ_IMM8_V8: {
823             uint16_t v0 = READ_INST_8_1();
824             info.inputs.emplace_back(VirtualRegister(v0));
825             break;
826         }
827         case EcmaOpcode::STRICTEQ_IMM8_V8: {
828             uint16_t v0 = READ_INST_8_1();
829             info.inputs.emplace_back(VirtualRegister(v0));
830             break;
831         }
832         case EcmaOpcode::DELOBJPROP_V8: {
833             uint16_t v0 = READ_INST_8_0();
834             info.inputs.emplace_back(VirtualRegister(v0));
835             break;
836         }
837         case EcmaOpcode::DEFINEFUNC_IMM8_ID16_IMM8: {
838             uint16_t methodId = READ_INST_16_1();
839             uint16_t length = READ_INST_8_3();
840             info.inputs.emplace_back(ConstDataId(ConstDataIDType::MethodIDType, methodId));
841             info.inputs.emplace_back(Immediate(length));
842             info.inputs.emplace_back(VirtualRegister(builder->GetEnvVregIdx()));
843             break;
844         }
845         case EcmaOpcode::DEFINEFUNC_IMM16_ID16_IMM8: {
846             uint16_t methodId = READ_INST_16_2();
847             uint16_t length = READ_INST_8_4();
848             info.inputs.emplace_back(ConstDataId(ConstDataIDType::MethodIDType, methodId));
849             info.inputs.emplace_back(Immediate(length));
850             info.inputs.emplace_back(VirtualRegister(builder->GetEnvVregIdx()));
851             break;
852         }
853         case EcmaOpcode::DEFINEMETHOD_IMM8_ID16_IMM8: {
854             uint16_t methodId = READ_INST_16_1();
855             uint16_t length = READ_INST_8_3();
856             info.inputs.emplace_back(ConstDataId(ConstDataIDType::MethodIDType, methodId));
857             info.inputs.emplace_back(Immediate(length));
858             info.inputs.emplace_back(VirtualRegister(builder->GetEnvVregIdx()));
859             break;
860         }
861         case EcmaOpcode::DEFINEMETHOD_IMM16_ID16_IMM8: {
862             uint16_t methodId = READ_INST_16_2();
863             uint16_t length = READ_INST_8_4();
864             info.inputs.emplace_back(ConstDataId(ConstDataIDType::MethodIDType, methodId));
865             info.inputs.emplace_back(Immediate(length));
866             info.inputs.emplace_back(VirtualRegister(builder->GetEnvVregIdx()));
867             break;
868         }
869         case EcmaOpcode::NEWOBJRANGE_IMM8_IMM8_V8: {
870             uint16_t numArgs = READ_INST_8_1();
871             uint16_t firstArgRegIdx = READ_INST_8_2();
872             for (uint16_t i = 0; i < numArgs; ++i) {
873                 info.inputs.emplace_back(VirtualRegister(firstArgRegIdx + i));
874             }
875             break;
876         }
877         case EcmaOpcode::NEWOBJRANGE_IMM16_IMM8_V8: {
878             uint16_t numArgs = READ_INST_8_2();
879             uint16_t firstArgRegIdx = READ_INST_8_3();
880             for (uint16_t i = 0; i < numArgs; ++i) {
881                 info.inputs.emplace_back(VirtualRegister(firstArgRegIdx + i));
882             }
883             break;
884         }
885         case EcmaOpcode::WIDE_NEWOBJRANGE_PREF_IMM16_V8: {
886             uint16_t numArgs = READ_INST_16_1();
887             uint16_t firstArgRegIdx = READ_INST_8_3();
888             for (uint16_t i = 0; i < numArgs; ++i) {
889                 info.inputs.emplace_back(VirtualRegister(firstArgRegIdx + i));
890             }
891             break;
892         }
893         case EcmaOpcode::LDLEXVAR_IMM4_IMM4: {
894             uint16_t level = READ_INST_4_0();
895             uint16_t slot = READ_INST_4_1();
896             info.inputs.emplace_back(Immediate(level));
897             info.inputs.emplace_back(Immediate(slot));
898             info.inputs.emplace_back(VirtualRegister(builder->GetEnvVregIdx()));
899             break;
900         }
901         case EcmaOpcode::LDLEXVAR_IMM8_IMM8: {
902             uint16_t level = READ_INST_8_0();
903             uint16_t slot = READ_INST_8_1();
904             info.inputs.emplace_back(Immediate(level));
905             info.inputs.emplace_back(Immediate(slot));
906             info.inputs.emplace_back(VirtualRegister(builder->GetEnvVregIdx()));
907             break;
908         }
909         case EcmaOpcode::WIDE_LDLEXVAR_PREF_IMM16_IMM16: {
910             uint16_t level = READ_INST_16_1();
911             uint16_t slot = READ_INST_16_3();
912             info.inputs.emplace_back(Immediate(level));
913             info.inputs.emplace_back(Immediate(slot));
914             info.inputs.emplace_back(VirtualRegister(builder->GetEnvVregIdx()));
915             break;
916         }
917         case EcmaOpcode::STLEXVAR_IMM4_IMM4: {
918             uint16_t level = READ_INST_4_0();
919             uint16_t slot = READ_INST_4_1();
920             info.inputs.emplace_back(Immediate(level));
921             info.inputs.emplace_back(Immediate(slot));
922             info.inputs.emplace_back(VirtualRegister(builder->GetEnvVregIdx()));
923             break;
924         }
925         case EcmaOpcode::STLEXVAR_IMM8_IMM8: {
926             uint16_t level = READ_INST_8_0();
927             uint16_t slot = READ_INST_8_1();
928             info.inputs.emplace_back(Immediate(level));
929             info.inputs.emplace_back(Immediate(slot));
930             info.inputs.emplace_back(VirtualRegister(builder->GetEnvVregIdx()));
931             break;
932         }
933         case EcmaOpcode::WIDE_STLEXVAR_PREF_IMM16_IMM16: {
934             uint16_t level = READ_INST_16_1();
935             uint16_t slot = READ_INST_16_3();
936             info.inputs.emplace_back(Immediate(level));
937             info.inputs.emplace_back(Immediate(slot));
938             info.inputs.emplace_back(VirtualRegister(builder->GetEnvVregIdx()));
939             break;
940         }
941         case EcmaOpcode::NEWLEXENV_IMM8: {
942             uint8_t numVars = READ_INST_8_0();
943             info.inputs.emplace_back(Immediate(numVars));
944             info.inputs.emplace_back(VirtualRegister(builder->GetEnvVregIdx()));
945             info.vregOut.emplace_back(builder->GetEnvVregIdx());
946             break;
947         }
948         case EcmaOpcode::WIDE_NEWLEXENV_PREF_IMM16: {
949             uint16_t numVars = READ_INST_16_1();
950             info.inputs.emplace_back(Immediate(numVars));
951             info.inputs.emplace_back(VirtualRegister(builder->GetEnvVregIdx()));
952             info.vregOut.emplace_back(builder->GetEnvVregIdx());
953             break;
954         }
955         case EcmaOpcode::NEWLEXENVWITHNAME_IMM8_ID16: {
956             uint16_t numVars = READ_INST_8_0();
957             uint16_t scopeId = READ_INST_16_1();
958             info.inputs.emplace_back(Immediate(numVars));
959             info.inputs.emplace_back(Immediate(scopeId));
960             info.inputs.emplace_back(VirtualRegister(builder->GetEnvVregIdx()));
961             info.vregOut.emplace_back(builder->GetEnvVregIdx());
962             break;
963         }
964         case EcmaOpcode::WIDE_NEWLEXENVWITHNAME_PREF_IMM16_ID16: {
965             uint16_t numVars = READ_INST_16_1();
966             uint16_t scopeId = READ_INST_16_3();
967             info.inputs.emplace_back(Immediate(numVars));
968             info.inputs.emplace_back(Immediate(scopeId));
969             info.inputs.emplace_back(VirtualRegister(builder->GetEnvVregIdx()));
970             info.vregOut.emplace_back(builder->GetEnvVregIdx());
971             break;
972         }
973         case EcmaOpcode::CREATEITERRESULTOBJ_V8_V8: {
974             uint16_t v0 = READ_INST_8_0();
975             uint16_t v1 = READ_INST_8_1();
976             info.inputs.emplace_back(VirtualRegister(v0));
977             info.inputs.emplace_back(VirtualRegister(v1));
978             break;
979         }
980         case EcmaOpcode::SUSPENDGENERATOR_V8: {
981             uint16_t v0 = READ_INST_8_0();
982             uint32_t offset = builder->GetPcOffset(pc);
983             info.inputs.emplace_back(Immediate(offset)); // Save the pc offset when suspend
984             info.inputs.emplace_back(VirtualRegister(v0));
985             break;
986         }
987         case EcmaOpcode::ASYNCFUNCTIONAWAITUNCAUGHT_V8: {
988             uint16_t v0 = READ_INST_8_0();
989             info.inputs.emplace_back(VirtualRegister(v0));
990             break;
991         }
992         case EcmaOpcode::ASYNCFUNCTIONRESOLVE_V8: {
993             uint16_t v0 = READ_INST_8_0();
994             info.inputs.emplace_back(VirtualRegister(v0));
995             break;
996         }
997         case EcmaOpcode::ASYNCFUNCTIONREJECT_V8: {
998             uint16_t v0 = READ_INST_8_0();
999             info.inputs.emplace_back(VirtualRegister(v0));
1000             break;
1001         }
1002         case EcmaOpcode::CLOSEITERATOR_IMM16_V8: {
1003             uint16_t v0 = READ_INST_8_2();
1004             info.inputs.emplace_back(VirtualRegister(v0));
1005             break;
1006         }
1007         case EcmaOpcode::NEWOBJAPPLY_IMM8_V8: {
1008             uint16_t v0 = READ_INST_8_1();
1009             info.inputs.emplace_back(VirtualRegister(v0));
1010             break;
1011         }
1012         case EcmaOpcode::NEWOBJAPPLY_IMM16_V8: {
1013             uint16_t v0 = READ_INST_8_2();
1014             info.inputs.emplace_back(VirtualRegister(v0));
1015             break;
1016         }
1017         case EcmaOpcode::STOWNBYNAME_IMM8_ID16_V8: {
1018             uint16_t stringId = READ_INST_16_1();
1019             uint32_t v0 = READ_INST_8_3();
1020             info.inputs.emplace_back(ConstDataId(ConstDataIDType::StringIDType, stringId));
1021             info.inputs.emplace_back(VirtualRegister(v0));
1022             break;
1023         }
1024         case EcmaOpcode::STOWNBYNAME_IMM16_ID16_V8: {
1025             uint16_t stringId = READ_INST_16_2();
1026             uint32_t v0 = READ_INST_8_4();
1027             info.inputs.emplace_back(ConstDataId(ConstDataIDType::StringIDType, stringId));
1028             info.inputs.emplace_back(VirtualRegister(v0));
1029             break;
1030         }
1031         case EcmaOpcode::CREATEREGEXPWITHLITERAL_IMM8_ID16_IMM8: {
1032             uint16_t stringId = READ_INST_16_1();
1033             uint8_t flags = READ_INST_8_3();
1034             info.inputs.emplace_back(ConstDataId(ConstDataIDType::StringIDType, stringId));
1035             info.inputs.emplace_back(Immediate(flags));
1036             break;
1037         }
1038         case EcmaOpcode::CREATEREGEXPWITHLITERAL_IMM16_ID16_IMM8: {
1039             uint16_t stringId = READ_INST_16_2();
1040             uint8_t flags = READ_INST_8_4();
1041             info.inputs.emplace_back(ConstDataId(ConstDataIDType::StringIDType, stringId));
1042             info.inputs.emplace_back(Immediate(flags));
1043             break;
1044         }
1045         case EcmaOpcode::GETNEXTPROPNAME_V8: {
1046             uint16_t v0 = READ_INST_8_0();
1047             info.inputs.emplace_back(VirtualRegister(v0));
1048             break;
1049         }
1050         case EcmaOpcode::CREATEOBJECTWITHBUFFER_IMM8_ID16: {
1051             uint16_t imm = READ_INST_16_1();
1052             info.inputs.emplace_back(ConstDataId(ConstDataIDType::ObjectLiteralIDType, imm));
1053             info.inputs.emplace_back(VirtualRegister(builder->GetEnvVregIdx()));
1054             break;
1055         }
1056         case EcmaOpcode::CREATEOBJECTWITHBUFFER_IMM16_ID16: {
1057             uint16_t imm = READ_INST_16_2();
1058             info.inputs.emplace_back(ConstDataId(ConstDataIDType::ObjectLiteralIDType, imm));
1059             info.inputs.emplace_back(VirtualRegister(builder->GetEnvVregIdx()));
1060             break;
1061         }
1062         case EcmaOpcode::SETOBJECTWITHPROTO_IMM8_V8: {
1063             uint16_t v0 = READ_INST_8_1();
1064             info.inputs.emplace_back(VirtualRegister(v0));
1065             break;
1066         }
1067         case EcmaOpcode::SETOBJECTWITHPROTO_IMM16_V8: {
1068             uint16_t v0 = READ_INST_8_2();
1069             info.inputs.emplace_back(VirtualRegister(v0));
1070             break;
1071         }
1072         case EcmaOpcode::CREATEARRAYWITHBUFFER_IMM8_ID16: {
1073             uint16_t imm = READ_INST_16_1();
1074             info.inputs.emplace_back(ConstDataId(ConstDataIDType::ArrayLiteralIDType, imm));
1075             break;
1076         }
1077         case EcmaOpcode::CREATEARRAYWITHBUFFER_IMM16_ID16: {
1078             uint16_t imm = READ_INST_16_2();
1079             info.inputs.emplace_back(ConstDataId(ConstDataIDType::ArrayLiteralIDType, imm));
1080             break;
1081         }
1082         case EcmaOpcode::GETMODULENAMESPACE_IMM8: {
1083             int32_t index = READ_INST_8_0();
1084             info.inputs.emplace_back(Immediate(index));
1085             break;
1086         }
1087         case EcmaOpcode::WIDE_GETMODULENAMESPACE_PREF_IMM16: {
1088             int32_t index = READ_INST_16_1();
1089             info.inputs.emplace_back(Immediate(index));
1090             break;
1091         }
1092         case EcmaOpcode::STMODULEVAR_IMM8: {
1093             int32_t index = READ_INST_8_0();
1094             info.inputs.emplace_back(Immediate(index));
1095             break;
1096         }
1097         case EcmaOpcode::SETGENERATORSTATE_IMM8: {
1098             int32_t index = READ_INST_8_0();
1099             info.inputs.emplace_back(Immediate(index));
1100             break;
1101         }
1102         case EcmaOpcode::WIDE_STMODULEVAR_PREF_IMM16: {
1103             int32_t index = READ_INST_16_1();
1104             info.inputs.emplace_back(Immediate(index));
1105             break;
1106         }
1107         case EcmaOpcode::LDLOCALMODULEVAR_IMM8: {
1108             int32_t index = READ_INST_8_0();
1109             info.inputs.emplace_back(Immediate(index));
1110             break;
1111         }
1112         case EcmaOpcode::WIDE_LDLOCALMODULEVAR_PREF_IMM16: {
1113             int32_t index = READ_INST_16_1();
1114             info.inputs.emplace_back(Immediate(index));
1115             break;
1116         }
1117         case EcmaOpcode::LDEXTERNALMODULEVAR_IMM8: {
1118             int32_t index = READ_INST_8_0();
1119             info.inputs.emplace_back(Immediate(index));
1120             break;
1121         }
1122         case EcmaOpcode::WIDE_LDEXTERNALMODULEVAR_PREF_IMM16: {
1123             int32_t index = READ_INST_16_1();
1124             info.inputs.emplace_back(Immediate(index));
1125             break;
1126         }
1127         case EcmaOpcode::STCONSTTOGLOBALRECORD_IMM16_ID16: {
1128             uint16_t stringId = READ_INST_16_2();
1129             info.inputs.emplace_back(ConstDataId(ConstDataIDType::StringIDType, stringId));
1130             break;
1131         }
1132         case EcmaOpcode::GETTEMPLATEOBJECT_IMM8:
1133         case EcmaOpcode::GETTEMPLATEOBJECT_IMM16:
1134             break;
1135         case EcmaOpcode::COPYDATAPROPERTIES_V8: {
1136             uint16_t v0 = READ_INST_8_0();
1137             info.inputs.emplace_back(VirtualRegister(v0));
1138             break;
1139         }
1140         case EcmaOpcode::STOWNBYINDEX_IMM8_V8_IMM16: {
1141             uint8_t v0 = READ_INST_8_1();
1142             uint16_t index = READ_INST_16_2();
1143             info.inputs.emplace_back(VirtualRegister(v0));
1144             info.inputs.emplace_back(Immediate(index));
1145             break;
1146         }
1147         case EcmaOpcode::STOWNBYINDEX_IMM16_V8_IMM16: {
1148             uint8_t v0 = READ_INST_8_2();
1149             uint16_t index = READ_INST_16_3();
1150             info.inputs.emplace_back(VirtualRegister(v0));
1151             info.inputs.emplace_back(Immediate(index));
1152             break;
1153         }
1154         case EcmaOpcode::WIDE_STOWNBYINDEX_PREF_V8_IMM32: {
1155             uint32_t v0 = READ_INST_8_1();
1156             uint32_t index = READ_INST_32_2();
1157             info.inputs.emplace_back(VirtualRegister(v0));
1158             info.inputs.emplace_back(Immediate(index));
1159             break;
1160         }
1161         case EcmaOpcode::STOWNBYVALUE_IMM8_V8_V8: {
1162             uint32_t v0 = READ_INST_8_1();
1163             uint32_t v1 = READ_INST_8_2();
1164             info.inputs.emplace_back(VirtualRegister(v0));
1165             info.inputs.emplace_back(VirtualRegister(v1));
1166             break;
1167         }
1168         case EcmaOpcode::STOWNBYVALUE_IMM16_V8_V8: {
1169             uint32_t v0 = READ_INST_8_2();
1170             uint32_t v1 = READ_INST_8_3();
1171             info.inputs.emplace_back(VirtualRegister(v0));
1172             info.inputs.emplace_back(VirtualRegister(v1));
1173             break;
1174         }
1175         case EcmaOpcode::CREATEOBJECTWITHEXCLUDEDKEYS_IMM8_V8_V8: {
1176             uint8_t numKeys = READ_INST_8_0();
1177             uint16_t v0 = READ_INST_8_1();
1178             uint16_t firstArgRegIdx = READ_INST_8_2();
1179             info.inputs.emplace_back(VirtualRegister(v0));
1180             for (int i = 0; i <= numKeys; i++) {
1181                 info.inputs.emplace_back(VirtualRegister(firstArgRegIdx + i));
1182             }
1183             break;
1184         }
1185         case EcmaOpcode::WIDE_CREATEOBJECTWITHEXCLUDEDKEYS_PREF_IMM16_V8_V8: {
1186             uint16_t numKeys = READ_INST_16_1();
1187             uint16_t v0 = READ_INST_8_3();
1188             uint16_t firstArgRegIdx = READ_INST_8_4();
1189             info.inputs.emplace_back(VirtualRegister(v0));
1190             for (int i = 0; i <= numKeys; i++) {
1191                 info.inputs.emplace_back(VirtualRegister(firstArgRegIdx + i));
1192             }
1193             break;
1194         }
1195         case EcmaOpcode::COPYRESTARGS_IMM8: {
1196             uint16_t restIdx = READ_INST_8_0();
1197             info.inputs.emplace_back(Immediate(restIdx));
1198             break;
1199         }
1200         case EcmaOpcode::WIDE_COPYRESTARGS_PREF_IMM16: {
1201             uint16_t restIdx = READ_INST_16_1();
1202             info.inputs.emplace_back(Immediate(restIdx));
1203             break;
1204         }
1205         case EcmaOpcode::DEFINEGETTERSETTERBYVALUE_V8_V8_V8_V8: {
1206             uint16_t v0 = READ_INST_8_0();
1207             uint16_t v1 = READ_INST_8_1();
1208             uint16_t v2 = READ_INST_8_2();
1209             uint16_t v3 = READ_INST_8_3();
1210             info.inputs.emplace_back(VirtualRegister(v0));
1211             info.inputs.emplace_back(VirtualRegister(v1));
1212             info.inputs.emplace_back(VirtualRegister(v2));
1213             info.inputs.emplace_back(VirtualRegister(v3));
1214             break;
1215         }
1216         case EcmaOpcode::LDOBJBYINDEX_IMM8_IMM16: {
1217             uint32_t idx = READ_INST_16_1();
1218             info.inputs.emplace_back(Immediate(idx));
1219             break;
1220         }
1221         case EcmaOpcode::LDOBJBYINDEX_IMM16_IMM16: {
1222             uint32_t idx = READ_INST_16_2();
1223             info.inputs.emplace_back(Immediate(idx));
1224             break;
1225         }
1226         case EcmaOpcode::WIDE_LDOBJBYINDEX_PREF_IMM32: {
1227             uint32_t idx = READ_INST_32_1();
1228             info.inputs.emplace_back(Immediate(idx));
1229             break;
1230         }
1231         case EcmaOpcode::STOBJBYINDEX_IMM8_V8_IMM16: {
1232             uint8_t v0 = READ_INST_8_1();
1233             uint16_t index = READ_INST_16_2();
1234             info.inputs.emplace_back(VirtualRegister(v0));
1235             info.inputs.emplace_back(Immediate(index));
1236             break;
1237         }
1238         case EcmaOpcode::STOBJBYINDEX_IMM16_V8_IMM16: {
1239             uint8_t v0 = READ_INST_8_2();
1240             uint16_t index = READ_INST_16_3();
1241             info.inputs.emplace_back(VirtualRegister(v0));
1242             info.inputs.emplace_back(Immediate(index));
1243             break;
1244         }
1245         case EcmaOpcode::WIDE_STOBJBYINDEX_PREF_V8_IMM32: {
1246             uint8_t v0 = READ_INST_8_1();
1247             uint32_t index = READ_INST_32_2();
1248             info.inputs.emplace_back(VirtualRegister(v0));
1249             info.inputs.emplace_back(Immediate(index));
1250             break;
1251         }
1252         case EcmaOpcode::LDOBJBYVALUE_IMM8_V8: {
1253             uint16_t slotId = READ_INST_8_0();
1254             uint32_t v0 = READ_INST_8_1();
1255             info.inputs.emplace_back(ICSlotId(slotId));
1256             info.inputs.emplace_back(VirtualRegister(v0));
1257             break;
1258         }
1259         case EcmaOpcode::LDOBJBYVALUE_IMM16_V8: {
1260             uint16_t slotId = READ_INST_16_0();
1261             uint32_t v0 = READ_INST_8_2();
1262             info.inputs.emplace_back(ICSlotId(slotId));
1263             info.inputs.emplace_back(VirtualRegister(v0));
1264             break;
1265         }
1266         case EcmaOpcode::STOBJBYVALUE_IMM8_V8_V8: {
1267             uint16_t slotId = READ_INST_8_0();
1268             uint32_t v0 = READ_INST_8_1();
1269             uint32_t v1 = READ_INST_8_2();
1270             info.inputs.emplace_back(ICSlotId(slotId));
1271             info.inputs.emplace_back(VirtualRegister(v0));
1272             info.inputs.emplace_back(VirtualRegister(v1));
1273             break;
1274         }
1275         case EcmaOpcode::STOBJBYVALUE_IMM16_V8_V8: {
1276             uint16_t slotId = READ_INST_16_0();
1277             uint32_t v0 = READ_INST_8_2();
1278             uint32_t v1 = READ_INST_8_3();
1279             info.inputs.emplace_back(ICSlotId(slotId));
1280             info.inputs.emplace_back(VirtualRegister(v0));
1281             info.inputs.emplace_back(VirtualRegister(v1));
1282             break;
1283         }
1284         case EcmaOpcode::LDSUPERBYVALUE_IMM8_V8: {
1285             uint32_t v0 = READ_INST_8_1();
1286             info.inputs.emplace_back(VirtualRegister(v0));
1287             break;
1288         }
1289         case EcmaOpcode::LDSUPERBYVALUE_IMM16_V8: {
1290             uint32_t v0 = READ_INST_8_2();
1291             info.inputs.emplace_back(VirtualRegister(v0));
1292             break;
1293         }
1294         case EcmaOpcode::STSUPERBYVALUE_IMM8_V8_V8: {
1295             uint32_t v0 = READ_INST_8_1();
1296             uint32_t v1 = READ_INST_8_2();
1297             info.inputs.emplace_back(VirtualRegister(v0));
1298             info.inputs.emplace_back(VirtualRegister(v1));
1299             break;
1300         }
1301         case EcmaOpcode::STSUPERBYVALUE_IMM16_V8_V8: {
1302             uint32_t v0 = READ_INST_8_2();
1303             uint32_t v1 = READ_INST_8_3();
1304             info.inputs.emplace_back(VirtualRegister(v0));
1305             info.inputs.emplace_back(VirtualRegister(v1));
1306             break;
1307         }
1308         case EcmaOpcode::TRYLDGLOBALBYNAME_IMM8_ID16: {
1309             uint16_t slotId = READ_INST_8_0();
1310             uint16_t stringId = READ_INST_16_1();
1311             info.inputs.emplace_back(ICSlotId(slotId));
1312             info.inputs.emplace_back(ConstDataId(ConstDataIDType::StringIDType, stringId));
1313             break;
1314         }
1315         case EcmaOpcode::TRYLDGLOBALBYNAME_IMM16_ID16: {
1316             uint16_t slotId = READ_INST_16_0();
1317             uint16_t stringId = READ_INST_16_2();
1318             info.inputs.emplace_back(ICSlotId(slotId));
1319             info.inputs.emplace_back(ConstDataId(ConstDataIDType::StringIDType, stringId));
1320             break;
1321         }
1322         case EcmaOpcode::TRYSTGLOBALBYNAME_IMM8_ID16: {
1323             uint16_t slotId = READ_INST_8_0();
1324             uint16_t stringId = READ_INST_16_1();
1325             info.inputs.emplace_back(ICSlotId(slotId));
1326             info.inputs.emplace_back(ConstDataId(ConstDataIDType::StringIDType, stringId));
1327             break;
1328         }
1329         case EcmaOpcode::TRYSTGLOBALBYNAME_IMM16_ID16: {
1330             uint16_t slotId = READ_INST_16_0();
1331             uint16_t stringId = READ_INST_16_2();
1332             info.inputs.emplace_back(ICSlotId(slotId));
1333             info.inputs.emplace_back(ConstDataId(ConstDataIDType::StringIDType, stringId));
1334             break;
1335         }
1336         case EcmaOpcode::STTOGLOBALRECORD_IMM16_ID16: {
1337             uint16_t stringId = READ_INST_16_2();
1338             info.inputs.emplace_back(ConstDataId(ConstDataIDType::StringIDType, stringId));
1339             break;
1340         }
1341         case EcmaOpcode::STOWNBYVALUEWITHNAMESET_IMM8_V8_V8: {
1342             uint32_t v0 = READ_INST_8_1();
1343             uint32_t v1 = READ_INST_8_2();
1344             info.inputs.emplace_back(VirtualRegister(v0));
1345             info.inputs.emplace_back(VirtualRegister(v1));
1346             break;
1347         }
1348         case EcmaOpcode::STOWNBYVALUEWITHNAMESET_IMM16_V8_V8: {
1349             uint32_t v0 = READ_INST_8_2();
1350             uint32_t v1 = READ_INST_8_3();
1351             info.inputs.emplace_back(VirtualRegister(v0));
1352             info.inputs.emplace_back(VirtualRegister(v1));
1353             break;
1354         }
1355         case EcmaOpcode::STOWNBYNAMEWITHNAMESET_IMM8_ID16_V8: {
1356             uint16_t stringId = READ_INST_16_1();
1357             uint32_t v0 = READ_INST_8_3();
1358             info.inputs.emplace_back(ConstDataId(ConstDataIDType::StringIDType, stringId));
1359             info.inputs.emplace_back(VirtualRegister(v0));
1360             break;
1361         }
1362         case EcmaOpcode::STOWNBYNAMEWITHNAMESET_IMM16_ID16_V8: {
1363             uint16_t stringId = READ_INST_16_2();
1364             uint32_t v0 = READ_INST_8_4();
1365             info.inputs.emplace_back(ConstDataId(ConstDataIDType::StringIDType, stringId));
1366             info.inputs.emplace_back(VirtualRegister(v0));
1367             break;
1368         }
1369         case EcmaOpcode::STTHISBYVALUE_IMM8_V8: {
1370             uint16_t slotId = READ_INST_8_0();
1371             uint32_t v0 = READ_INST_8_1();
1372             info.inputs.emplace_back(ICSlotId(slotId));
1373             info.inputs.emplace_back(VirtualRegister(v0));
1374             break;
1375         }
1376         case EcmaOpcode::STTHISBYVALUE_IMM16_V8: {
1377             uint16_t slotId = READ_INST_16_0();
1378             uint32_t v0 = READ_INST_8_2();
1379             info.inputs.emplace_back(ICSlotId(slotId));
1380             info.inputs.emplace_back(VirtualRegister(v0));
1381             break;
1382         }
1383         // not implement
1384         case EcmaOpcode::JSTRICTEQZ_IMM8:
1385         case EcmaOpcode::JSTRICTEQZ_IMM16:
1386         case EcmaOpcode::JNSTRICTEQZ_IMM8:
1387         case EcmaOpcode::JNSTRICTEQZ_IMM16:
1388         case EcmaOpcode::JEQNULL_IMM8:
1389         case EcmaOpcode::JEQNULL_IMM16:
1390         case EcmaOpcode::JNENULL_IMM8:
1391         case EcmaOpcode::JNENULL_IMM16:
1392         case EcmaOpcode::JSTRICTEQNULL_IMM8:
1393         case EcmaOpcode::JSTRICTEQNULL_IMM16:
1394         case EcmaOpcode::JNSTRICTEQNULL_IMM8:
1395         case EcmaOpcode::JNSTRICTEQNULL_IMM16:
1396         case EcmaOpcode::JEQUNDEFINED_IMM8:
1397         case EcmaOpcode::JEQUNDEFINED_IMM16:
1398         case EcmaOpcode::JNEUNDEFINED_IMM8:
1399         case EcmaOpcode::JNEUNDEFINED_IMM16:
1400         case EcmaOpcode::JSTRICTEQUNDEFINED_IMM8:
1401         case EcmaOpcode::JSTRICTEQUNDEFINED_IMM16:
1402         case EcmaOpcode::JNSTRICTEQUNDEFINED_IMM8:
1403         case EcmaOpcode::JNSTRICTEQUNDEFINED_IMM16:
1404         case EcmaOpcode::JEQ_V8_IMM8:
1405         case EcmaOpcode::JEQ_V8_IMM16:
1406         case EcmaOpcode::JNE_V8_IMM8:
1407         case EcmaOpcode::JNE_V8_IMM16:
1408         case EcmaOpcode::JSTRICTEQ_V8_IMM8:
1409         case EcmaOpcode::JSTRICTEQ_V8_IMM16:
1410         case EcmaOpcode::JNSTRICTEQ_V8_IMM8:
1411         case EcmaOpcode::JNSTRICTEQ_V8_IMM16:
1412         case EcmaOpcode::LDTHIS:
1413             break;
1414         case EcmaOpcode::LDTHISBYNAME_IMM8_ID16: {
1415             uint16_t slotId = READ_INST_8_0();
1416             uint16_t stringId = READ_INST_16_1();
1417             info.inputs.emplace_back(ICSlotId(slotId));
1418             info.inputs.emplace_back(ConstDataId(ConstDataIDType::StringIDType, stringId));
1419             break;
1420         }
1421         case EcmaOpcode::LDTHISBYNAME_IMM16_ID16: {
1422             uint16_t slotId = READ_INST_16_0();
1423             uint16_t stringId = READ_INST_16_2();
1424             info.inputs.emplace_back(ICSlotId(slotId));
1425             info.inputs.emplace_back(ConstDataId(ConstDataIDType::StringIDType, stringId));
1426             break;
1427         }
1428         case EcmaOpcode::STTHISBYNAME_IMM8_ID16: {
1429             uint16_t slotId = READ_INST_8_0();
1430             uint16_t stringId = READ_INST_16_1();
1431             info.inputs.emplace_back(ICSlotId(slotId));
1432             info.inputs.emplace_back(ConstDataId(ConstDataIDType::StringIDType, stringId));
1433             break;
1434         }
1435         case EcmaOpcode::STTHISBYNAME_IMM16_ID16: {
1436             uint16_t slotId = READ_INST_16_0();
1437             uint16_t stringId = READ_INST_16_2();
1438             info.inputs.emplace_back(ICSlotId(slotId));
1439             info.inputs.emplace_back(ConstDataId(ConstDataIDType::StringIDType, stringId));
1440             break;
1441         }
1442         case EcmaOpcode::LDGLOBALVAR_IMM16_ID16: {
1443             uint16_t slotId = READ_INST_16_0();
1444             uint16_t stringId = READ_INST_16_2();
1445             info.inputs.emplace_back(ICSlotId(slotId));
1446             info.inputs.emplace_back(ConstDataId(ConstDataIDType::StringIDType, stringId));
1447             break;
1448         }
1449         case EcmaOpcode::LDOBJBYNAME_IMM8_ID16: {
1450             uint16_t slotId = READ_INST_8_0();
1451             uint16_t stringId = READ_INST_16_1();
1452             info.inputs.emplace_back(ICSlotId(slotId));
1453             info.inputs.emplace_back(ConstDataId(ConstDataIDType::StringIDType, stringId));
1454             break;
1455         }
1456         case EcmaOpcode::LDOBJBYNAME_IMM16_ID16: {
1457             uint16_t slotId = READ_INST_16_0();
1458             uint16_t stringId = READ_INST_16_2();
1459             info.inputs.emplace_back(ICSlotId(slotId));
1460             info.inputs.emplace_back(ConstDataId(ConstDataIDType::StringIDType, stringId));
1461             break;
1462         }
1463         case EcmaOpcode::STOBJBYNAME_IMM8_ID16_V8: {
1464             uint16_t slotId = READ_INST_8_0();
1465             uint16_t stringId = READ_INST_16_1();
1466             uint32_t v0 = READ_INST_8_3();
1467             info.inputs.emplace_back(ICSlotId(slotId));
1468             info.inputs.emplace_back(ConstDataId(ConstDataIDType::StringIDType, stringId));
1469             info.inputs.emplace_back(VirtualRegister(v0));
1470             break;
1471         }
1472         case EcmaOpcode::STOBJBYNAME_IMM16_ID16_V8: {
1473             uint16_t slotId = READ_INST_16_0();
1474             uint16_t stringId = READ_INST_16_2();
1475             uint32_t v0 = READ_INST_8_4();
1476             info.inputs.emplace_back(ICSlotId(slotId));
1477             info.inputs.emplace_back(ConstDataId(ConstDataIDType::StringIDType, stringId));
1478             info.inputs.emplace_back(VirtualRegister(v0));
1479             break;
1480         }
1481         case EcmaOpcode::LDSUPERBYNAME_IMM8_ID16: {
1482             uint16_t stringId = READ_INST_16_1();
1483             info.inputs.emplace_back(ConstDataId(ConstDataIDType::StringIDType, stringId));
1484             break;
1485         }
1486         case EcmaOpcode::LDSUPERBYNAME_IMM16_ID16: {
1487             uint16_t stringId = READ_INST_16_2();
1488             info.inputs.emplace_back(ConstDataId(ConstDataIDType::StringIDType, stringId));
1489             break;
1490         }
1491         case EcmaOpcode::STSUPERBYNAME_IMM8_ID16_V8: {
1492             uint16_t stringId = READ_INST_16_1();
1493             uint32_t v0 = READ_INST_8_3();
1494             info.inputs.emplace_back(ConstDataId(ConstDataIDType::StringIDType, stringId));
1495             info.inputs.emplace_back(VirtualRegister(v0));
1496             break;
1497         }
1498         case EcmaOpcode::STSUPERBYNAME_IMM16_ID16_V8: {
1499             uint16_t stringId = READ_INST_16_2();
1500             uint32_t v0 = READ_INST_8_4();
1501             info.inputs.emplace_back(ConstDataId(ConstDataIDType::StringIDType, stringId));
1502             info.inputs.emplace_back(VirtualRegister(v0));
1503             break;
1504         }
1505         case EcmaOpcode::STGLOBALVAR_IMM16_ID16: {
1506             uint16_t slotId = READ_INST_16_0();
1507             uint32_t stringId = READ_INST_16_2();
1508             info.inputs.emplace_back(ICSlotId(slotId));
1509             info.inputs.emplace_back(ConstDataId(ConstDataIDType::StringIDType, stringId));
1510             break;
1511         }
1512         case EcmaOpcode::CREATEGENERATOROBJ_V8: {
1513             uint16_t v0 = READ_INST_8_0();
1514             info.inputs.emplace_back(VirtualRegister(v0));
1515             break;
1516         }
1517         case EcmaOpcode::CREATEASYNCGENERATOROBJ_V8: {
1518             uint16_t v0 = READ_INST_8_0();
1519             info.inputs.emplace_back(VirtualRegister(v0));
1520             break;
1521         }
1522         case EcmaOpcode::ASYNCGENERATORRESOLVE_V8_V8_V8: {
1523             uint16_t v0 = READ_INST_8_0();
1524             uint16_t v1 = READ_INST_8_1();
1525             uint16_t v2 = READ_INST_8_2();
1526             uint32_t offset = builder->GetPcOffset(pc);
1527             info.inputs.emplace_back(Immediate(offset)); // Save the pc offset
1528             info.inputs.emplace_back(VirtualRegister(v0));
1529             info.inputs.emplace_back(VirtualRegister(v1));
1530             info.inputs.emplace_back(VirtualRegister(v2));
1531             break;
1532         }
1533         case EcmaOpcode::ASYNCGENERATORREJECT_V8: {
1534             uint16_t v0 = READ_INST_8_0();
1535             info.inputs.emplace_back(VirtualRegister(v0));
1536             break;
1537         }
1538         case EcmaOpcode::STARRAYSPREAD_V8_V8: {
1539             uint16_t v0 = READ_INST_8_0();
1540             uint16_t v1 = READ_INST_8_1();
1541             info.inputs.emplace_back(VirtualRegister(v0));
1542             info.inputs.emplace_back(VirtualRegister(v1));
1543             break;
1544         }
1545         case EcmaOpcode::DEFINECLASSWITHBUFFER_IMM8_ID16_ID16_IMM16_V8: {
1546             uint16_t methodId = READ_INST_16_1();
1547             uint16_t literaId = READ_INST_16_3();
1548             uint16_t length = READ_INST_16_5();
1549             uint16_t v0 = READ_INST_8_7();
1550             info.inputs.emplace_back(ConstDataId(ConstDataIDType::MethodIDType, methodId));
1551             info.inputs.emplace_back(ConstDataId(ConstDataIDType::ClassLiteralIDType, literaId));
1552             info.inputs.emplace_back(Immediate(length));
1553             info.inputs.emplace_back(VirtualRegister(v0));
1554             info.inputs.emplace_back(VirtualRegister(builder->GetEnvVregIdx()));
1555             break;
1556         }
1557         case EcmaOpcode::DEFINECLASSWITHBUFFER_IMM16_ID16_ID16_IMM16_V8: {
1558             uint16_t methodId = READ_INST_16_2();
1559             uint16_t literaId = READ_INST_16_4();
1560             uint16_t length = READ_INST_16_6();
1561             uint16_t v0 = READ_INST_8_8();
1562             info.inputs.emplace_back(ConstDataId(ConstDataIDType::MethodIDType, methodId));
1563             info.inputs.emplace_back(ConstDataId(ConstDataIDType::ClassLiteralIDType, literaId));
1564             info.inputs.emplace_back(Immediate(length));
1565             info.inputs.emplace_back(VirtualRegister(v0));
1566             info.inputs.emplace_back(VirtualRegister(builder->GetEnvVregIdx()));
1567             break;
1568         }
1569         case EcmaOpcode::LDFUNCTION: {
1570             break;
1571         }
1572         case EcmaOpcode::LDBIGINT_ID16: {
1573             uint32_t stringId = READ_INST_16_0();
1574             info.inputs.emplace_back(ConstDataId(ConstDataIDType::StringIDType, stringId));
1575             break;
1576         }
1577         case EcmaOpcode::DYNAMICIMPORT: {
1578             break;
1579         }
1580         case EcmaOpcode::SUPERCALLTHISRANGE_IMM8_IMM8_V8:
1581         case EcmaOpcode::SUPERCALLARROWRANGE_IMM8_IMM8_V8: {
1582             uint16_t range = READ_INST_8_1();
1583             uint16_t v0 = READ_INST_8_2();
1584             for (size_t i = 0; i < range; i++) {
1585                 info.inputs.emplace_back(VirtualRegister(v0 + i));
1586             }
1587             break;
1588         }
1589         case EcmaOpcode::WIDE_SUPERCALLTHISRANGE_PREF_IMM16_V8:
1590         case EcmaOpcode::WIDE_SUPERCALLARROWRANGE_PREF_IMM16_V8: {
1591             uint16_t range = READ_INST_16_1();
1592             uint16_t v0 = READ_INST_8_3();
1593             for (size_t i = 0; i < range; i++) {
1594                 info.inputs.emplace_back(VirtualRegister(v0 + i));
1595             }
1596             break;
1597         }
1598         case EcmaOpcode::SUPERCALLSPREAD_IMM8_V8: {
1599             uint16_t v0 = READ_INST_8_1();
1600             info.inputs.emplace_back(VirtualRegister(v0));
1601             break;
1602         }
1603         case EcmaOpcode::POPLEXENV: {
1604             info.inputs.emplace_back(VirtualRegister(builder->GetEnvVregIdx()));
1605             info.vregOut.emplace_back(builder->GetEnvVregIdx());
1606             break;
1607         }
1608         case EcmaOpcode::LDPRIVATEPROPERTY_IMM8_IMM16_IMM16: {
1609             uint32_t slotId = READ_INST_8_0();
1610             uint32_t levelIndex = READ_INST_16_1();
1611             uint32_t slotIndex = READ_INST_16_3();
1612             info.inputs.emplace_back(Immediate(slotId));
1613             info.inputs.emplace_back(Immediate(levelIndex));
1614             info.inputs.emplace_back(Immediate(slotIndex));
1615             info.inputs.emplace_back(VirtualRegister(builder->GetEnvVregIdx()));
1616             break;
1617         }
1618         case EcmaOpcode::STPRIVATEPROPERTY_IMM8_IMM16_IMM16_V8:
1619         {
1620             uint32_t slotId = READ_INST_8_0();
1621             uint32_t levelIndex = READ_INST_16_1();
1622             uint32_t slotIndex = READ_INST_16_3();
1623             uint32_t v0 = READ_INST_8_5();
1624             info.inputs.emplace_back(Immediate(slotId));
1625             info.inputs.emplace_back(Immediate(levelIndex));
1626             info.inputs.emplace_back(Immediate(slotIndex));
1627             info.inputs.emplace_back(VirtualRegister(v0));
1628             info.inputs.emplace_back(VirtualRegister(builder->GetEnvVregIdx()));
1629             break;
1630         }
1631         case EcmaOpcode::TESTIN_IMM8_IMM16_IMM16: {
1632             uint32_t slotId = READ_INST_8_0();
1633             uint32_t levelIndex = READ_INST_16_1();
1634             uint32_t slotIndex = READ_INST_16_3();
1635             info.inputs.emplace_back(Immediate(slotId));
1636             info.inputs.emplace_back(Immediate(levelIndex));
1637             info.inputs.emplace_back(Immediate(slotIndex));
1638             info.inputs.emplace_back(VirtualRegister(builder->GetEnvVregIdx()));
1639             break;
1640         }
1641         case EcmaOpcode::DEFINEFIELDBYNAME_IMM8_ID16_V8: {
1642             uint16_t slotId = READ_INST_8_0();
1643             uint16_t stringId = READ_INST_16_1();
1644             uint32_t v0 = READ_INST_8_3();
1645             info.inputs.emplace_back(ICSlotId(slotId));
1646             info.inputs.emplace_back(ConstDataId(ConstDataIDType::StringIDType, stringId));
1647             info.inputs.emplace_back(VirtualRegister(v0));
1648             break;
1649         }
1650         case EcmaOpcode::CALLRUNTIME_DEFINEFIELDBYVALUE_PREF_IMM8_V8_V8: {
1651             uint32_t v0 = READ_INST_8_2();
1652             uint32_t v1 = READ_INST_8_3();
1653             info.inputs.emplace_back(VirtualRegister(v0));
1654             info.inputs.emplace_back(VirtualRegister(v1));
1655             break;
1656         }
1657         case EcmaOpcode::CALLRUNTIME_DEFINEFIELDBYINDEX_PREF_IMM8_IMM32_V8: {
1658             uint32_t index = READ_INST_32_2();
1659             uint32_t v0 = READ_INST_8_6();
1660             info.inputs.emplace_back(Immediate(index));
1661             info.inputs.emplace_back(VirtualRegister(v0));
1662             break;
1663         }
1664         case EcmaOpcode::CALLRUNTIME_CREATEPRIVATEPROPERTY_PREF_IMM16_ID16: {
1665             uint32_t count = READ_INST_16_1();
1666             uint32_t literalId = READ_INST_16_3();
1667             info.inputs.emplace_back(Immediate(count));
1668             info.inputs.emplace_back(Immediate(literalId));
1669             info.inputs.emplace_back(VirtualRegister(builder->GetEnvVregIdx()));
1670             break;
1671         }
1672         case EcmaOpcode::CALLRUNTIME_DEFINEPRIVATEPROPERTY_PREF_IMM8_IMM16_IMM16_V8: {
1673             uint32_t levelIndex = READ_INST_16_2();
1674             uint32_t slotIndex = READ_INST_16_4();
1675             uint32_t v0 = READ_INST_8_6();
1676             info.inputs.emplace_back(Immediate(levelIndex));
1677             info.inputs.emplace_back(Immediate(slotIndex));
1678             info.inputs.emplace_back(VirtualRegister(v0));
1679             info.inputs.emplace_back(VirtualRegister(builder->GetEnvVregIdx()));
1680             break;
1681         }
1682         case EcmaOpcode::CALLRUNTIME_DEFINESENDABLECLASS_PREF_IMM16_ID16_ID16_IMM16_V8: {
1683             uint16_t methodId = READ_INST_16_3();
1684             uint16_t literaId = READ_INST_16_5();
1685             uint16_t length = READ_INST_16_7();
1686             uint16_t v0 = READ_INST_8_9();
1687             info.inputs.emplace_back(ConstDataId(ConstDataIDType::MethodIDType, methodId));
1688             info.inputs.emplace_back(ConstDataId(ConstDataIDType::ClassLiteralIDType, literaId));
1689             info.inputs.emplace_back(Immediate(length));
1690             info.inputs.emplace_back(VirtualRegister(v0));
1691             break;
1692         }
1693         case EcmaOpcode::CALLRUNTIME_LDSENDABLECLASS_PREF_IMM16: {
1694             uint16_t level = READ_INST_16_1();
1695             info.inputs.emplace_back(Immediate(level));
1696             info.inputs.emplace_back(VirtualRegister(builder->GetEnvVregIdx()));
1697             break;
1698         }
1699         case EcmaOpcode::TONUMERIC_IMM8:
1700         case EcmaOpcode::INC_IMM8:
1701         case EcmaOpcode::DEC_IMM8:
1702         case EcmaOpcode::NOT_IMM8:
1703         case EcmaOpcode::NEG_IMM8:
1704         case EcmaOpcode::JMP_IMM8:
1705         case EcmaOpcode::JMP_IMM16:
1706         case EcmaOpcode::JMP_IMM32:
1707         case EcmaOpcode::JEQZ_IMM8:
1708         case EcmaOpcode::JEQZ_IMM16:
1709         case EcmaOpcode::JEQZ_IMM32:
1710         case EcmaOpcode::JNEZ_IMM8:
1711         case EcmaOpcode::JNEZ_IMM16:
1712         case EcmaOpcode::JNEZ_IMM32:
1713         case EcmaOpcode::RETURN:
1714         case EcmaOpcode::RETURNUNDEFINED:
1715         case EcmaOpcode::LDNAN:
1716         case EcmaOpcode::LDINFINITY:
1717         case EcmaOpcode::LDNEWTARGET:
1718         case EcmaOpcode::LDUNDEFINED:
1719         case EcmaOpcode::LDNULL:
1720         case EcmaOpcode::LDSYMBOL:
1721         case EcmaOpcode::LDGLOBAL:
1722         case EcmaOpcode::LDTRUE:
1723         case EcmaOpcode::LDFALSE:
1724         case EcmaOpcode::LDHOLE:
1725         case EcmaOpcode::CALLARG0_IMM8:
1726         case EcmaOpcode::GETUNMAPPEDARGS:
1727         case EcmaOpcode::ASYNCFUNCTIONENTER:
1728         case EcmaOpcode::TYPEOF_IMM8:
1729         case EcmaOpcode::TYPEOF_IMM16:
1730         case EcmaOpcode::TONUMBER_IMM8:
1731         case EcmaOpcode::THROW_PREF_NONE:
1732         case EcmaOpcode::GETPROPITERATOR:
1733         case EcmaOpcode::GETRESUMEMODE:
1734         case EcmaOpcode::CREATEEMPTYARRAY_IMM8:
1735         case EcmaOpcode::CREATEEMPTYARRAY_IMM16:
1736         case EcmaOpcode::CREATEEMPTYOBJECT:
1737         case EcmaOpcode::DEBUGGER:
1738         case EcmaOpcode::ISTRUE:
1739         case EcmaOpcode::ISFALSE:
1740         case EcmaOpcode::NOP:
1741         case EcmaOpcode::GETITERATOR_IMM8:
1742         case EcmaOpcode::GETITERATOR_IMM16:
1743         case EcmaOpcode::GETASYNCITERATOR_IMM8:
1744         case EcmaOpcode::THROW_NOTEXISTS_PREF_NONE:
1745         case EcmaOpcode::THROW_PATTERNNONCOERCIBLE_PREF_NONE:
1746         case EcmaOpcode::THROW_DELETESUPERPROPERTY_PREF_NONE:
1747         case EcmaOpcode::RESUMEGENERATOR:
1748         case EcmaOpcode::CALLRUNTIME_NOTIFYCONCURRENTRESULT_PREF_NONE:
1749         case EcmaOpcode::CALLRUNTIME_TOPROPERTYKEY_PREF_NONE:
1750             break;
1751         case EcmaOpcode::LDTHISBYVALUE_IMM8: {
1752             uint16_t slotId = READ_INST_8_0();
1753             info.inputs.emplace_back(ICSlotId(slotId));
1754             break;
1755         }
1756         case EcmaOpcode::LDTHISBYVALUE_IMM16: {
1757             uint16_t slotId = READ_INST_16_0();
1758             info.inputs.emplace_back(ICSlotId(slotId));
1759             break;
1760         }
1761         case EcmaOpcode::WIDE_LDPATCHVAR_PREF_IMM16: {
1762             uint16_t index = READ_INST_16_1();
1763             info.inputs.emplace_back(Immediate(index));
1764             break;
1765         }
1766         case EcmaOpcode::WIDE_STPATCHVAR_PREF_IMM16: {
1767             uint16_t index = READ_INST_16_1();
1768             info.inputs.emplace_back(Immediate(index));
1769             break;
1770         }
1771         default: {
1772             LOG_COMPILER(FATAL) << "Error bytecode: " << static_cast<uint16_t>(opcode);
1773             UNREACHABLE();
1774             break;
1775         }
1776     }
1777 }
1778 
GetBytecodeInfo() const1779 const BytecodeInfo &BytecodeIterator::GetBytecodeInfo() const
1780 {
1781     return builder_->GetBytecodeInfo(index_);
1782 }
1783 
PeekNextPc(size_t i) const1784 const uint8_t *BytecodeIterator::PeekNextPc(size_t i) const
1785 {
1786     ASSERT(index_ + static_cast<int32_t>(i) <= end_);
1787     return builder_->GetPCByIndex(static_cast<uint32_t>(index_ + i));
1788 }
1789 
PeekPrevPc(size_t i) const1790 const uint8_t *BytecodeIterator::PeekPrevPc(size_t i) const
1791 {
1792     ASSERT(index_ - static_cast<int32_t>(i) >= start_);
1793     return builder_->GetPCByIndex(static_cast<uint32_t>(index_ - i));
1794 }
1795 } // panda::ecmascript::kungfu
1796