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