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