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