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