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