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