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