• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright (c) 2021-2022 Huawei Device Co., Ltd.
2# Licensed under the Apache License, Version 2.0 (the "License");
3# you may not use this file except in compliance with the License.
4# You may obtain a copy of the License at
5#
6# http://www.apache.org/licenses/LICENSE-2.0
7#
8# Unless required by applicable law or agreed to in writing, software
9# distributed under the License is distributed on an "AS IS" BASIS,
10# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11# See the License for the specific language governing permissions and
12# limitations under the License.
13
14---
15
16chapters:
17  - name: General design
18    text: >
19      VM is register based with dedicated accumulator register, which serves as an implicit operand to instructions.
20
21  - name: Registers
22    text: >
23      Registers are wide enough to hold a single reference when working with objects.
24      When used for primitive types, registers width should be considered as 64 bits.
25      When used for object types, registers should be considered wide enough to hold a reference to an object.
26      The scope of a register is function frame (also known as activation record). If instruction defines not all 64
27      bits of a register, undefined bits shall not be accessed in verified code.
28      Register field width in instruction encoding could be 4 (16 addressable registers), 8 (256 registers) or
29      16 (65536 registers) bits.
30
31  - name: Accumulator
32    text: >
33      Accumulator is a special register which is implicitly used by instructions as a source and/or destination operand.
34      The main goal of using accumulator is to improve encoding density without losing much in performance. Therefore,
35      the general intuition regarding accumulator usage is to utilize the accumulator as much as possible taking it as
36      a source from previous instruction result and passing it to the next instruction in its destination operand.
37      Moreover, when instruction has more than one source operands, the value which lives shorter should be passed
38      through the accumulator. If it is profitable however, variations of instructions that don't write into the
39      accumulator are also introduced. For example, moving arguments for `call.range` instruction may be done by
40      register-to-register moves.
41
42  - name: Calling sequence
43    text: >
44      On execution of a call bytecode a new function frame is created. All necessary arguments are copied from the
45      caller frame onto the top of the callee frame such as the last argument is placed in the register with the largest
46      index and the first argument is placed into the register with the index equal to the size of frame subtracted by
47      the number of arguments. Accumulator value is considered as undefined and shall not be read in verified bytecode.
48      On return, callee frame is destroyed. If function return value is non-void, it is passed to caller via
49      accumulator. Otherwise accumulator content in caller frame is considered as undefined and shall not
50      be read in verified bytecode.
51
52  - name: Supported primitive types
53    text: |
54      VM support operations on registers with i32 and i64 integral values. However, 8-bit and 16-bit integral values
55      can be loaded/stored into records and arrays with corresponding bytecodes. In that case, VM will extend/truncate
56      value to match storage size with i32. Similarly, passing an 8-bit or 16-bit value to a function can be emulated by
57      passing a value, which is zero or sign-extended to i32.
58      VM support operations on registers with f32 and f64 values, which corresponds to IEEE-754 single and double precision
59      floating-point represenation.
60      Primitive data type of a register is not tracked by VM and is interpreted by separate bytecodes.
61      Integral values are not inherently signed or unsigned, signedness is interpreted by bytecodes as well.
62      If bytecode treats register value as signed integer, it uses two's complement representation.
63      To denote that bytecode treats register values as unsigned integer, u32/u64 notation is used.
64      For moves, loads and stores it is not always possible to denote a type of result, because it depends on type
65      of source object. In that case, bNN notation is used, where NN is bit size of result. Therefore, for example,
66      b64 is a union of f64 and i64.
67
68      ### Floating-point literals
69
70      Decimal floating-point literals can have the following parts:
71
72      - Sign ("`+`" or "`-`")
73      - Whole number part
74      - Decimal point
75      - Fractional part
76      - Exponent indicator ("`e`")
77      - Exponent sign
78      - Exponent
79
80      Decimal floating-point literals must have at least one digit and either decimal point or exponent part.
81
82      Special values:
83
84      - Positive zero (+0.0, hexadecimal representation is `0x0000000000000000`)
85      - Negative zero (-0.0, hexadecimal representation is `0x8000000000000000`)
86      - Minimal positive value (4.9E-324, hexadecimal representation is `0x0000000000000001`)
87      - Maximal negative value (-4.9E-324, hexadecimal representation is `0x8000000000000001`)
88      - Maximal positive value (1.7976931348623157e308, hexadecimal representation is `0x7fefffffffffffff`)
89      - Minimal negative value (-1.7976931348623157e308, hexadecimal representation is `0xffefffffffffffff`)
90      - Positive infinity (hexadecimal representation is `0x7ff0000000000000`)
91      - Negative infinity (hexadecimal representation is `0xfff0000000000000`)
92      - Not a number - set of all NaN values (one of hexadecimal representations is `0x7ff8000000000000`)
93
94  - name: Language-dependent types
95    text: >
96      Panda VM supports type hierarchies according to the language it executes. That way, creation (or loading
97      from constant pool) of strings, arrays, exception objects results into an object of type native to language,
98      including inheritance relations.
99
100  - name: Dynamically-typed languages support
101    text: >
102      Panda VM supports languages with dynamic types. It represents dynamic values through special 'any' values,
103      which wraps a value itself (both primitive and objects) and corresponding type info. VM tracks type of registers,
104      that hold 'any' value, whether they are primitive or not. Virtual registers and accumulator are wide enough
105      to hold 'any' value. When VM executes code inside dynamically-typed language context, regular static instructions
106      also may be used.
107
108# File format and ISA versioning
109min_version: 0.0.0.2
110version: 11.0.2.0
111
112# 0 is default value, alaways reflects to the newest version
113api_version_map: [[0, 11.0.2.0], [9, 9.0.0.0], [10, 9.0.0.0], [11, 11.0.2.0]]
114
115# When delete bytecode or having any incompatible modification on bytecode,
116# please add the incompatible version in this list for prompting error message.
117incompatible_version: [11.0.0.0, 11.0.1.0]
118
119properties:
120  - tag: type_id
121    description: Use an id which resolves into a type constant.
122  - tag: method_id
123    description: Use an id which resolves into a method constant.
124  - tag: string_id
125    description: Use an id which resolves into a string constant.
126  - tag: literalarray_id
127    description: Use an id which resolves into a constant literalarray.
128  - tag: field_id
129    description: Use an id which resolves into a field reference.
130  - tag: call
131    description: Pass control to the callee method.
132  - tag: call_virt
133    description: Pass control to the callee method via virtual call.
134  - tag: return
135    description: Pass control to the caller method.
136  - tag: suspend
137    description: Suspend current method and pass control to the caller one.
138  - tag: jump
139    description: Pass control to another bytecode in a current method.
140  - tag: conditional
141    description: Operate based on computed condition, otherwise is no operation.
142  - tag: float
143    description: Perform floating point operation.
144  - tag: dynamic
145    description: Operates on 'any' values.
146  - tag: maybe_dynamic
147    description: May operate on 'any' values depending on language context.
148  - tag: language_type
149    description: Creates objects of type depending on language context.
150  - tag: initialize_type
151    description: May initialize type instance during execution.
152  - tag: ic_slot
153    description: Use the immedate number after opcode of length 8-bit or 16-bit as ic slot.
154  - tag: jit_ic_slot
155    description: Use the immedate number after opcode of length 8-bit as jit ic slot.
156  - tag: one_slot
157    description: The intruction occupies one ic slot.
158  - tag: two_slot
159    description: The intruction occupies two ic slots.
160
161exceptions:
162  - tag: x_none
163    description: Bytecode doesn't throw exceptions.
164  - tag: x_null
165    description: Bytecode throws NullPointerException in case of null reference as a source.
166  - tag: x_bounds
167    description: Bytecode throws ArrayIndexOutOfBoundsException if index is out of bounds of an array.
168  - tag: x_negsize
169    description: Bytecode throws NegativeArraySizeException if index is less than zero.
170  - tag: x_store
171    description: Bytecode throws ArrayStoreException if element isn't instance of array's element type.
172  - tag: x_abstract
173    description: Bytecode throws AbstractMethodError if resolved method has no implementation.
174  - tag: x_arith
175    description: Bytecode throws ArithmeticException if the divisor is 0.
176  - tag: x_cast
177    description: Bytecode throws ClassCastException if type cast failed.
178  - tag: x_classdef
179    description: Bytecode throws NoClassDefFoundError if type cast failed.
180  - tag: x_oom
181    description: Bytecode throws OutOfMemoryError if failed to allocate object.
182  - tag: x_init
183    description: Bytecode throws ExceptionInInitializerError if unexpected exception occurred in a static initializer.
184  - tag: x_call
185    description: Bytecode may throw an error if an exception occures in the called bytecode.
186  - tag: x_throw
187    description: Bytecode's primary role is to throw provided exception object.
188  - tag: x_link
189    description: Bytecode may throw NoClassDefFoundError if failed to resolve id.
190verification:
191  - tag: none
192    description: Instruction is always valid.
193  - tag: v1_array
194    description: First operand contains a reference to an array.
195  - tag: v1_object
196    description: First operand contains a reference to an object (other than array).
197  - tag: v1_array_type
198    # TODO: specify
199    description: First operand contains a reference to an array of elements of type corresponding to bytecode.
200  - tag: v1_i32
201    description: First operand contains a value of i32 type.
202  - tag: v1_type
203    description: First operand contains a value of type corresponding to bytecode.
204  - tag: v1_obj_or_null
205    description: First operand contains a reference to an object or null.
206  - tag: v2_i32
207    description: Second operand contains a value of i32 type.
208  - tag: v2_object
209    description: Second operand contains a reference to an object (other than array).
210  - tag: v2_type
211    description: Second operand contains a value of type corresponding to bytecode.
212  - tag: acc_i32
213    description: Accumulator contains a value of i32 type.
214  - tag: acc_type
215    description: Accumulator contains a value of type corresponding to bytecode.  # TODO: specify
216  - tag: acc_return_type
217    # TODO: specify, including assignment compatibility (see Java 'areturn')
218    description: Accumulator type is compatible with method return type.
219  - tag: v1_throw_type
220    description: First operand contains a reference to an instance of class Throwable or of a subclass of Throwable.
221  - tag: acc_obj_or_null
222    description: Accumulator contains a reference to an object or null.
223  - tag: type_id_array
224    description: Type_id operand must correspond to an array type.
225  - tag: type_id_object
226    description: Type_id operand must correspond to an object type (other than array).
227  - tag: type_id_any_object
228    description: Type_id operand must correspond to any object type.
229  - tag: method_id_static
230    description: Method_id must resolve to a static method or into initializer for a type other than one-dimensional array.
231  - tag: method_id_non_static
232    description: Method_id must resolve to a non-static method.
233  - tag: method_id_non_abstract
234    description: Method_id must resolve to a method that has implementation.
235  - tag: method_id_accessible
236    description: Method_id must resolve to a method which is accessible.
237  - tag: constant_string_id
238    description: Id must resolve into a constant-pool string.
239  - tag: constant_literalarray_id
240    description: Id must resolve into a constant literalarray.
241  - tag: compatible_arguments
242    description: Arguments provided to a method must be of compatible types.  # TODO: specify compatibility
243  - tag: method_init_obj
244    description: Method_id must resolve into initializer for a type other than one-dimensional array.
245  - tag: branch_target
246    description: Branch target should point to a beginning of an instruction of the same method.
247  - tag: field_id_non_static
248    description: Field_id must resolve to a non-static object field.
249  - tag: field_id_static
250    description: Field_id must resolve to a static field.
251  - tag: field_id_size
252    description: Field_id must resolve to a field of size corresponding to bytecode.
253  - tag: valid_in_dynamic_context
254    description: Instruction valid only for dynamically-typed language context.
255
256isa_information:
257    - description: The last encoding number of various ISA. It should be maintained as long as ISA changes.
258      last_opcode_idx: 0xdb
259      last_throw_prefixed_opcode_idx: 0x09
260      last_wide_prefixed_opcode_idx: 0x13
261      last_deprecated_prefixed_opcode_idx: 0x2e
262      last_callruntime_prefixed_opcode_idx: 0x08
263
264prefixes:
265  - name: throw
266    description: throw operations.
267    opcode_idx: 0xfe
268  - name: wide
269    description: operations with wider width.
270    opcode_idx: 0xfd
271  - name: deprecated
272    description: deprecated instructions but are keeped for compatibility.
273    opcode_idx: 0xfc
274  - name: callruntime
275    description: call runtime methods.
276    opcode_idx: 0xfb
277
278groups:
279  - title: constant object loaders
280    description: instructions which operate on constant objects.
281    verification:
282      - none
283    exceptions:
284      - x_none
285    properties:
286      - acc_read
287      - acc_write
288    namespace: ecmascript
289    pseudo: |
290      acc = ecma_op(acc, operand_0, ..., operands_n)
291    semantics: |
292      skip
293    instructions:
294      - sig: ldnan
295        acc: out:top
296        opcode_idx: [0x6a]
297        format: [op_none]
298      - sig: ldinfinity
299        acc: out:top
300        opcode_idx: [0x6b]
301        format: [op_none]
302      - sig: ldundefined
303        acc: out:top
304        opcode_idx: [0x00]
305        format: [op_none]
306      - sig: ldnull
307        acc: out:top
308        opcode_idx: [0x01]
309        format: [op_none]
310      - sig: ldsymbol
311        acc: out:top
312        opcode_idx: [0xad]
313        format: [op_none]
314      - sig: ldglobal
315        opcode_idx: [0x6d]
316        acc: out:top
317        format: [op_none]
318      - sig: ldtrue
319        acc: out:top
320        opcode_idx: [0x02]
321        format: [op_none]
322      - sig: ldfalse
323        acc: out:top
324        opcode_idx: [0x03]
325        format: [op_none]
326      - sig: ldhole
327        acc: out:top
328        opcode_idx: [0x70]
329        format: [op_none]
330      - sig: deprecated.ldlexenv
331        acc: out:top
332        opcode_idx: [0x00]
333        format: [pref_op_none]
334        prefix: deprecated
335      - sig: ldnewtarget
336        acc: out:top
337        opcode_idx: [0x6e]
338        format: [op_none]
339      - sig: ldthis
340        acc: out:top
341        opcode_idx: [0x6f]
342        format: [op_none]
343      - sig: poplexenv
344        acc: none
345        opcode_idx: [0x69]
346        format: [op_none]
347      - sig: deprecated.poplexenv
348        acc: out:top
349        opcode_idx: [0x01]
350        format: [pref_op_none]
351        prefix: deprecated
352      - sig: getunmappedargs
353        acc: out:top
354        opcode_idx: [0x6c]
355        format: [op_none]
356      - sig: asyncfunctionenter
357        acc: out:top
358        opcode_idx: [0xae]
359        format: [op_none]
360      - sig: ldfunction
361        acc: out:top
362        opcode_idx: [0xaf]
363        format: [op_none]
364      - sig: debugger
365        acc: none
366        opcode_idx: [0xb0]
367        format: [op_none]
368
369  - title: iterator instructions
370    description: iterator instructions
371    verification:
372      - none
373    exceptions:
374      - x_none
375    properties:
376      - acc_read
377      - acc_write
378    namespace: ecmascript
379    pseudo: |
380      acc = ecma_op(acc, operand_0, ..., operands_n)
381    semantics: |
382      skip
383    instructions:
384      - sig: getpropiterator
385        acc: inout:top
386        opcode_idx: [0x66]
387        format: [op_none]
388      - sig: getiterator imm
389        acc: inout:top
390        opcode_idx: [0x67, 0xab]
391        format: [op_imm_8, op_imm_16]
392        properties: [ic_slot, two_slot]
393      - sig: closeiterator imm, v:in:top
394        acc: out:top
395        opcode_idx: [0x68, 0xac]
396        format: [op_imm_8_v_8, op_imm_16_v_8]
397        properties: [ic_slot, two_slot]
398      - sig: deprecated.getiteratornext v1:in:top, v2:in:top
399        acc: out:top
400        opcode_idx: [0x02]
401        format: [pref_op_v1_8_v2_8]
402        prefix: deprecated
403      - sig: getasynciterator imm
404        acc: inout:top
405        opcode_idx: [0xd7]
406        format: [op_imm_8]
407        properties: [ic_slot]
408      - sig: ldprivateproperty imm1, imm2, imm3
409        acc: inout:top
410        opcode_idx: [0xd8]
411        format: [op_imm1_8_imm2_16_imm3_16]
412        properties: [ic_slot, two_slot]
413      - sig: stprivateproperty imm1, imm2, imm3, v:in:top
414        acc: in:top
415        opcode_idx: [0xd9]
416        format: [op_imm1_8_imm2_16_imm3_16_v_8]
417        properties: [ic_slot, two_slot]
418      - sig: testin imm1, imm2, imm3
419        acc: inout:top
420        opcode_idx: [0xda]
421        format: [op_imm1_8_imm2_16_imm3_16]
422        properties: [ic_slot, two_slot]
423      - sig: definefieldbyname imm, string_id, v:in:top
424        acc: in:top
425        opcode_idx: [0xdb]
426        format: [op_imm_8_id_16_v_8]
427        properties: [string_id, ic_slot, two_slot]
428
429  - title: object creaters
430    description: instructions which create objects
431    verification:
432      - none
433    exceptions:
434      - x_none
435    properties:
436      - acc_read
437      - acc_write
438    namespace: ecmascript
439    pseudo: |
440      acc = ecma_op(acc, operand_0, ..., operands_n)
441    semantics: |
442      skip
443    instructions:
444      - sig: createemptyobject
445        acc: out:top
446        opcode_idx: [0x04]
447        format: [op_none]
448      - sig: createemptyarray imm
449        acc: out:top
450        opcode_idx: [0x05, 0x80]
451        format: [op_imm_8, op_imm_16]
452        properties: [ic_slot, one_slot]
453      - sig: creategeneratorobj v:in:top
454        acc: out:top
455        opcode_idx: [0xb1]
456        format: [op_v_8]
457      - sig: createiterresultobj v1:in:top, v2:in:top
458        acc: out:top
459        opcode_idx: [0xb2]
460        format: [op_v1_8_v2_8]
461      - sig: createobjectwithexcludedkeys imm, v1:in:top, v2:in:top
462        acc: out:top
463        opcode_idx: [0xb3]
464        format: [op_imm_8_v1_8_v2_8]
465      - sig: wide.createobjectwithexcludedkeys imm, v1:in:top, v2:in:top
466        acc: out:top
467        opcode_idx: [0x00]
468        format: [pref_op_imm_16_v1_8_v2_8]
469        prefix: wide
470      - sig: createarraywithbuffer imm, literalarray_id
471        acc: out:top
472        opcode_idx: [0x06, 0x81]
473        format: [op_imm_8_id_16, op_imm_16_id_16]
474        properties: [ic_slot, one_slot, literalarray_id]
475      - sig: deprecated.createarraywithbuffer imm
476        acc: out:top
477        opcode_idx: [0x03]
478        format: [pref_op_imm_16]
479        prefix: deprecated
480      - sig: createobjectwithbuffer imm, literalarray_id
481        opcode_idx: [0x07, 0x82]
482        acc: out:top
483        format: [op_imm_8_id_16, op_imm_16_id_16]
484        properties: [ic_slot, one_slot, literalarray_id]
485      - sig: deprecated.createobjectwithbuffer imm
486        acc: out:top
487        opcode_idx: [0x04]
488        format: [pref_op_imm_16]
489        prefix: deprecated
490      - sig: createregexpwithliteral imm1, string_id, imm2
491        acc: out:top
492        opcode_idx: [0x71, 0x72]
493        format: [op_imm1_8_id_16_imm2_8, op_imm1_16_id_16_imm2_8]
494        properties: [string_id, ic_slot, two_slot]
495      - sig: newobjapply imm, v:in:top
496        acc: inout:top
497        opcode_idx: [0xb4, 0xb5]
498        format: [op_imm_8_v_8, op_imm_16_v_8]
499        properties: [ic_slot, two_slot]
500      - sig: newobjrange imm1, imm2, v:in:top
501        acc: out:top
502        opcode_idx: [0x08, 0x83]
503        format: [op_imm1_8_imm2_8_v_8, op_imm1_16_imm2_8_v_8]
504        properties: [ic_slot, two_slot]
505      - sig: wide.newobjrange imm, v:in:top
506        acc: out:top
507        opcode_idx: [0x01]
508        format: [pref_op_imm_16_v_8]
509        prefix: wide
510      - sig: newlexenv imm
511        acc: out:top
512        opcode_idx: [0x09]
513        format: [op_imm_8]
514      - sig: wide.newlexenv imm
515        acc: out:top
516        opcode_idx: [0x02]
517        format: [pref_op_imm_16]
518        prefix: wide
519      - sig: newlexenvwithname imm, literalarray_id
520        acc: out:top
521        opcode_idx: [0xb6]
522        format: [op_imm_8_id_16]
523        properties: [literalarray_id]
524      - sig: wide.newlexenvwithname imm, literalarray_id
525        acc: out:top
526        opcode_idx: [0x03]
527        format: [pref_op_imm_16_id_16]
528        prefix: wide
529        properties: [literalarray_id]
530      - sig: createasyncgeneratorobj v:in:top
531        acc: out:top
532        opcode_idx: [0xb7]
533        format: [op_v_8]
534      - sig: asyncgeneratorresolve v1:in:top, v2:in:top, v3:in:top
535        acc: out:top
536        opcode_idx: [0xb8]
537        format: [op_v1_8_v2_8_v3_8]
538
539  - title: binary operations
540    description: binary operations
541    verification:
542      - none
543    exceptions:
544      - x_none
545    properties:
546      - acc_read
547      - acc_write
548    namespace: ecmascript
549    pseudo: |
550      acc = ecma_op(acc, operand_0, ..., operands_n)
551    semantics: |
552      skip
553    instructions:
554      - sig: add2 imm, v:in:top
555        acc: inout:top
556        opcode_idx: [0x0a]
557        format: [op_imm_8_v_8]
558        properties: [jit_ic_slot, one_slot]
559      - sig: sub2 imm, v:in:top
560        acc: inout:top
561        opcode_idx: [0x0b]
562        format: [op_imm_8_v_8]
563        properties: [jit_ic_slot, one_slot]
564      - sig: mul2 imm, v:in:top
565        acc: inout:top
566        opcode_idx: [0x0c]
567        format: [op_imm_8_v_8]
568        properties: [jit_ic_slot, one_slot]
569      - sig: div2 imm, v:in:top
570        acc: inout:top
571        opcode_idx: [0x0d]
572        format: [op_imm_8_v_8]
573        properties: [jit_ic_slot, one_slot]
574      - sig: mod2 imm, v:in:top
575        acc: inout:top
576        opcode_idx: [0x0e]
577        format: [op_imm_8_v_8]
578        properties: [jit_ic_slot, one_slot]
579      - sig: eq imm, v:in:top
580        acc: inout:top
581        opcode_idx: [0x0f]
582        format: [op_imm_8_v_8]
583        properties: [jit_ic_slot, one_slot]
584      - sig: noteq imm, v:in:top
585        acc: inout:top
586        opcode_idx: [0x10]
587        format: [op_imm_8_v_8]
588        properties: [jit_ic_slot, one_slot]
589      - sig: less imm, v:in:top
590        acc: inout:top
591        opcode_idx: [0x11]
592        format: [op_imm_8_v_8]
593        properties: [jit_ic_slot, one_slot]
594      - sig: lesseq imm, v:in:top
595        acc: inout:top
596        opcode_idx: [0x12]
597        format: [op_imm_8_v_8]
598        properties: [jit_ic_slot, one_slot]
599      - sig: greater imm, v:in:top
600        acc: inout:top
601        opcode_idx: [0x13]
602        format: [op_imm_8_v_8]
603        properties: [jit_ic_slot, one_slot]
604      - sig: greatereq imm, v:in:top
605        acc: inout:top
606        opcode_idx: [0x14]
607        format: [op_imm_8_v_8]
608        properties: [jit_ic_slot, one_slot]
609      - sig: shl2 imm, v:in:top
610        acc: inout:top
611        opcode_idx: [0x15]
612        format: [op_imm_8_v_8]
613        properties: [jit_ic_slot, one_slot]
614      - sig: shr2 imm, v:in:top
615        acc: inout:top
616        opcode_idx: [0x16]
617        format: [op_imm_8_v_8]
618        properties: [jit_ic_slot, one_slot]
619      - sig: ashr2 imm, v:in:top
620        acc: inout:top
621        opcode_idx: [0x17]
622        format: [op_imm_8_v_8]
623        properties: [jit_ic_slot, one_slot]
624      - sig: and2 imm, v:in:top
625        acc: inout:top
626        opcode_idx: [0x18]
627        format: [op_imm_8_v_8]
628        properties: [jit_ic_slot, one_slot]
629      - sig: or2 imm, v:in:top
630        acc: inout:top
631        opcode_idx: [0x19]
632        format: [op_imm_8_v_8]
633        properties: [jit_ic_slot, one_slot]
634      - sig: xor2 imm, v:in:top
635        acc: inout:top
636        opcode_idx: [0x1a]
637        format: [op_imm_8_v_8]
638        properties: [jit_ic_slot, one_slot]
639      - sig: exp imm, v:in:top
640        acc: inout:top
641        opcode_idx: [0x1b]
642        format: [op_imm_8_v_8]
643        properties: [jit_ic_slot, one_slot]
644
645  - title: unary operations
646    description: unary operations
647    verification:
648      - none
649    exceptions:
650      - x_none
651    properties:
652      - acc_read
653      - acc_write
654    namespace: ecmascript
655    pseudo: |
656      acc = ecma_op(acc, operand_0, ..., operands_n)
657    semantics: |
658      skip
659    instructions:
660      - sig: typeof imm
661        acc: inout:top
662        opcode_idx: [0x1c, 0x84]
663        format: [op_imm_8, op_imm_16]
664        properties: [ic_slot, two_slot]
665      - sig: tonumber imm
666        acc: inout:top
667        opcode_idx: [0x1d]
668        format: [op_imm_8]
669        properties: [jit_ic_slot, one_slot]
670      - sig: deprecated.tonumber v:in:top
671        acc: inout:top
672        opcode_idx: [0x05]
673        format: [pref_op_v_8]
674        prefix: deprecated
675      - sig: tonumeric imm
676        acc: inout:top
677        opcode_idx: [0x1e]
678        format: [op_imm_8]
679        properties: [jit_ic_slot, one_slot]
680      - sig: deprecated.tonumeric v:in:top
681        opcode_idx: [0x06]
682        acc: inout:top
683        prefix: deprecated
684        format: [pref_op_v_8]
685      - sig: neg imm
686        acc: inout:top
687        opcode_idx: [0x1f]
688        format: [op_imm_8]
689        properties: [jit_ic_slot, one_slot]
690      - sig: deprecated.neg v:in:top
691        acc: out:top
692        opcode_idx: [0x07]
693        format: [pref_op_v_8]
694        prefix: deprecated
695      - sig: not imm
696        acc: inout:top
697        opcode_idx: [0x20]
698        format: [op_imm_8]
699        properties: [jit_ic_slot, one_slot]
700      - sig: deprecated.not v:in:top
701        acc: out:top
702        opcode_idx: [0x08]
703        prefix: deprecated
704        format: [pref_op_v_8]
705      - sig: inc imm
706        acc: inout:top
707        opcode_idx: [0x21]
708        format: [op_imm_8]
709        properties: [jit_ic_slot, one_slot]
710      - sig: deprecated.inc v:in:top
711        acc: out:top
712        opcode_idx: [0x09]
713        prefix: deprecated
714        format: [pref_op_v_8]
715      - sig: dec imm
716        acc: inout:top
717        opcode_idx: [0x22]
718        format: [op_imm_8]
719        properties: [jit_ic_slot, one_slot]
720      - sig: deprecated.dec v:in:top
721        acc: out:top
722        opcode_idx: [0x0a]
723        format: [pref_op_v_8]
724        prefix: deprecated
725      - sig: istrue
726        acc: inout:top
727        opcode_idx: [0x23]
728        format: [op_none]
729      - sig: isfalse
730        acc: inout:top
731        opcode_idx: [0x24]
732        format: [op_none]
733
734  - title: comparation instructions
735    description: comparation instructions
736    verification:
737      - none
738    exceptions:
739      - x_none
740    properties:
741      - acc_read
742      - acc_write
743    namespace: ecmascript
744    pseudo: |
745      acc = ecma_op(acc, operand_0, ..., operands_n)
746    semantics: |
747      skip
748    instructions:
749      - sig: isin imm, v:in:top
750        acc: inout:top
751        opcode_idx: [0x25]
752        format: [op_imm_8_v_8]
753        properties: [jit_ic_slot, one_slot]
754      - sig: instanceof imm, v:in:top
755        acc: inout:top
756        opcode_idx: [0x26]
757        format: [op_imm_8_v_8]
758        properties: [jit_ic_slot, two_slot]
759      - sig: strictnoteq imm, v:in:top
760        acc: inout:top
761        opcode_idx: [0x27]
762        format: [op_imm_8_v_8]
763        properties: [jit_ic_slot, one_slot]
764      - sig: stricteq imm, v:in:top
765        acc: inout:top
766        opcode_idx: [0x28]
767        format: [op_imm_8_v_8]
768        properties: [jit_ic_slot, one_slot]
769
770  - title: call runtime functions
771    description: instructions which call runtime functions
772    verification:
773      - none
774    exceptions:
775      - x_none
776    properties:
777      - acc_read
778      - acc_write
779    namespace: ecmascript
780    pseudo: |
781      acc = ecma_op(acc, operand_0, ..., operands_n)
782    semantics: |
783      skip
784    instructions:
785      - sig: callruntime.notifyconcurrentresult
786        acc: in:top
787        opcode_idx: [0x00]
788        format: [pref_op_none]
789        prefix: callruntime
790      - sig: callruntime.definefieldbyvalue imm, v1:in:top, v2:in:top
791        acc: in:top
792        opcode_idx: [0x01]
793        prefix: callruntime
794        format: [pref_op_imm_8_v1_8_v2_8]
795        properties: [ic_slot, two_slot]
796      - sig: callruntime.definefieldbyindex imm1, imm2, v:in:top
797        acc: in:top
798        opcode_idx: [0x02]
799        prefix: callruntime
800        format: [pref_op_imm1_8_imm2_32_v_8]
801        properties: [ic_slot, two_slot]
802      - sig: callruntime.topropertykey
803        acc: inout:top
804        opcode_idx: [0x03]
805        format: [pref_op_none]
806        prefix: callruntime
807      - sig: callruntime.createprivateproperty imm, literalarray_id
808        acc: none
809        opcode_idx: [0x04]
810        format: [pref_op_imm_16_id_16]
811        prefix: callruntime
812        properties: [literalarray_id]
813      - sig: callruntime.defineprivateproperty imm1, imm2, imm3, v:in:top
814        acc: in:top
815        opcode_idx: [0x05]
816        format: [pref_op_imm1_8_imm2_16_imm3_16_v_8]
817        prefix: callruntime
818        properties: [ic_slot, two_slot]
819      - sig: callruntime.callinit imm, v:in:top
820        acc: in:top
821        opcode_idx: [0x06]
822        format: [pref_op_imm_8_v_8]
823        prefix: callruntime
824        properties: [jit_ic_slot, two_slot]
825      - sig: callruntime.definesendableclass imm1, method_id, literalarray_id, imm2, v:in:top
826        acc: out:top
827        opcode_idx: [0x07]
828        format: [pref_op_imm1_16_id1_16_id2_16_imm2_16_v_8]
829        prefix: callruntime
830        properties: [method_id, ic_slot, one_slot, literalarray_id]
831      - sig: callruntime.ldsendableclass imm
832        acc: out:top
833        opcode_idx: [0x08]
834        format: [pref_op_imm_16]
835        prefix: callruntime
836
837  - title: throw instructions
838    description: throw instructions
839    verification:
840      - none
841    exceptions:
842      - x_none
843    properties:
844      - acc_read
845      - acc_write
846    namespace: ecmascript
847    pseudo: |
848      acc = ecma_op(acc, operand_0, ..., operands_n)
849    semantics: |
850      skip
851    instructions:
852      - sig: throw
853        acc: in:top
854        opcode_idx: [0x00]
855        format: [pref_op_none]
856        prefix: throw
857        exceptions:
858          - x_throw
859      - sig: throw.notexists
860        acc: none
861        opcode_idx: [0x01]
862        format: [pref_op_none]
863        prefix: throw
864      - sig: throw.patternnoncoercible
865        acc: none
866        opcode_idx: [0x02]
867        format: [pref_op_none]
868        prefix: throw
869      - sig: throw.deletesuperproperty
870        acc: none
871        opcode_idx: [0x03]
872        format: [pref_op_none]
873        prefix: throw
874      - sig: throw.constassignment v:in:top
875        acc: none
876        opcode_idx: [0x04]
877        format: [pref_op_v_8]
878        prefix: throw
879      - sig: throw.ifnotobject v:in:top
880        acc: none
881        opcode_idx: [0x05]
882        format: [pref_op_v_8]
883        prefix: throw
884      - sig: throw.undefinedifhole v1:in:top, v2:in:top
885        acc: none
886        opcode_idx: [0x06]
887        format: [pref_op_v1_8_v2_8]
888        prefix: throw
889      - sig: throw.ifsupernotcorrectcall imm
890        acc: in:top
891        opcode_idx: [0x07, 0x08]
892        format: [pref_op_imm_8, pref_op_imm_16]
893        prefix: throw
894      - sig: throw.undefinedifholewithname string_id
895        acc: in:top
896        opcode_idx: [0x09]
897        format: [pref_op_id_16]
898        prefix: throw
899        properties: [string_id]
900
901  - title: call instructions
902    description: call
903    verification:
904      - none
905    exceptions:
906      - x_none
907    properties:
908      - acc_read
909      - acc_write
910    namespace: ecmascript
911    pseudo: |
912      acc = ecma_op(acc, operand_0, ..., operands_n)
913    semantics: |
914      skip
915    instructions:
916      - sig: callarg0 imm
917        acc: inout:top
918        opcode_idx: [0x29]
919        format: [op_imm_8]
920        properties: [jit_ic_slot, two_slot]
921      - sig: deprecated.callarg0 v:in:top
922        acc: out:top
923        opcode_idx: [0x0b]
924        format: [pref_op_v_8]
925        prefix: deprecated
926      - sig: callarg1 imm, v:in:top
927        acc: inout:top
928        opcode_idx: [0x2a]
929        format: [op_imm_8_v_8]
930        properties: [jit_ic_slot, two_slot]
931      - sig: deprecated.callarg1 v1:in:top, v2:in:top
932        acc: out:top
933        opcode_idx: [0x0c]
934        format: [pref_op_v1_8_v2_8]
935        prefix: deprecated
936      - sig: callargs2 imm, v1:in:top, v2:in:top
937        acc: inout:top
938        opcode_idx: [0x2b]
939        format: [op_imm_8_v1_8_v2_8]
940        properties: [jit_ic_slot, two_slot]
941      - sig: deprecated.callargs2 v1:in:top, v2:in:top, v3:in:top
942        acc: out:top
943        opcode_idx: [0x0d]
944        format: [pref_op_v1_8_v2_8_v3_8]
945        prefix: deprecated
946      - sig: callargs3 imm, v1:in:top, v2:in:top, v3:in:top
947        acc: inout:top
948        opcode_idx: [0x2c]
949        format: [op_imm_8_v1_8_v2_8_v3_8]
950        properties: [jit_ic_slot, two_slot]
951      - sig: deprecated.callargs3 v1:in:top, v2:in:top, v3:in:top, v4:in:top
952        acc: out:top
953        opcode_idx: [0x0e]
954        format: [pref_op_v1_8_v2_8_v3_8_v4_8]
955        prefix: deprecated
956      - sig: callrange imm1, imm2, v:in:top
957        acc: inout:top
958        opcode_idx: [0x73]
959        format: [op_imm1_8_imm2_8_v_8]
960        properties: [jit_ic_slot, two_slot]
961      - sig: wide.callrange imm, v:in:top
962        acc: inout:top
963        opcode_idx: [0x04]
964        format: [pref_op_imm_16_v_8]
965        prefix: wide
966      - sig: deprecated.callrange imm, v:in:top
967        acc: out:top
968        opcode_idx: [0x0f]
969        format: [pref_op_imm_16_v_8]
970        prefix: deprecated
971      - sig: supercallspread imm, v:in:top
972        acc: inout:top
973        opcode_idx: [0xb9]
974        format: [op_imm_8_v_8]
975        properties: [jit_ic_slot, two_slot]
976      - sig: apply imm, v1:in:top, v2:in:top
977        acc: inout:top
978        opcode_idx: [0xba]
979        format: [op_imm_8_v1_8_v2_8]
980        properties: [jit_ic_slot, two_slot]
981      - sig: deprecated.callspread v1:in:top, v2:in:top, v3:in:top
982        acc: out:top
983        opcode_idx: [0x10]
984        format: [pref_op_v1_8_v2_8_v3_8]
985        prefix: deprecated
986      - sig: callthis0 imm, v:in:top
987        acc: inout:top
988        opcode_idx: [0x2d]
989        format: [op_imm_8_v_8]
990        properties: [jit_ic_slot, two_slot]
991      - sig: callthis1 imm, v1:in:top, v2:in:top
992        acc: inout:top
993        opcode_idx: [0x2e]
994        format: [op_imm_8_v1_8_v2_8]
995        properties: [jit_ic_slot, two_slot]
996      - sig: callthis2 imm, v1:in:top, v2:in:top, v3:in:top
997        acc: inout:top
998        opcode_idx: [0x2f]
999        format: [op_imm_8_v1_8_v2_8_v3_8]
1000        properties: [jit_ic_slot, two_slot]
1001      - sig: callthis3 imm, v1:in:top, v2:in:top, v3:in:top, v4:in:top
1002        acc: inout:top
1003        opcode_idx: [0x30]
1004        format: [op_imm_8_v1_8_v2_8_v3_8_v4_8]
1005        properties: [jit_ic_slot, two_slot]
1006      - sig: callthisrange imm1, imm2, v:in:top
1007        acc: inout:top
1008        opcode_idx: [0x31]
1009        format: [op_imm1_8_imm2_8_v_8]
1010        properties: [jit_ic_slot, two_slot]
1011      - sig: wide.callthisrange imm, v:in:top
1012        acc: inout:top
1013        opcode_idx: [0x05]
1014        format: [pref_op_imm_16_v_8]
1015        prefix: wide
1016      - sig: deprecated.callthisrange imm, v:in:top
1017        acc: out:top
1018        opcode_idx: [0x11]
1019        format: [pref_op_imm_16_v_8]
1020        prefix: deprecated
1021      - sig: supercallthisrange imm1, imm2, v:in:top
1022        acc: out:top
1023        opcode_idx: [0x32]
1024        format: [op_imm1_8_imm2_8_v_8]
1025        properties: [jit_ic_slot, two_slot]
1026      - sig: wide.supercallthisrange imm, v:in:top
1027        acc: out:top
1028        opcode_idx: [0x06]
1029        format: [pref_op_imm_16_v_8]
1030        prefix: wide
1031      - sig: supercallarrowrange imm1, imm2, v:in:top
1032        acc: inout:top
1033        opcode_idx: [0xbb]
1034        format: [op_imm1_8_imm2_8_v_8]
1035        properties: [jit_ic_slot, two_slot]
1036      - sig: wide.supercallarrowrange imm, v:in:top
1037        acc: inout:top
1038        opcode_idx: [0x07]
1039        format: [pref_op_imm_16_v_8]
1040        prefix: wide
1041
1042  - title: definition instuctions
1043    description: instructions which define object
1044    verification:
1045      - none
1046    exceptions:
1047      - x_none
1048    properties:
1049      - acc_read
1050      - acc_write
1051    namespace: ecmascript
1052    pseudo: |
1053      acc = ecma_op(acc, operand_0, ..., operands_n)
1054    semantics: |
1055      skip
1056    instructions:
1057      - sig: definegettersetterbyvalue v1:in:top, v2:in:top, v3:in:top, v4:in:top
1058        acc: inout:top
1059        opcode_idx: [0xbc]
1060        format: [op_v1_8_v2_8_v3_8_v4_8]
1061      - sig: definefunc imm1, method_id, imm2
1062        acc: out:top
1063        opcode_idx: [0x33, 0x74]
1064        format: [op_imm1_8_id_16_imm2_8, op_imm1_16_id_16_imm2_8]
1065        properties: [method_id, ic_slot, one_slot]
1066      - sig: definemethod imm1, method_id, imm2
1067        acc: inout:top
1068        opcode_idx: [0x34, 0xbe]
1069        format: [op_imm1_8_id_16_imm2_8, op_imm1_16_id_16_imm2_8]
1070        properties: [method_id, ic_slot, one_slot]
1071      - sig: defineclasswithbuffer imm1, method_id, literalarray_id, imm2, v:in:top
1072        acc: out:top
1073        opcode_idx: [0x35, 0x75]
1074        format: [op_imm1_8_id1_16_id2_16_imm2_16_v_8, op_imm1_16_id1_16_id2_16_imm2_16_v_8]
1075        properties: [method_id, ic_slot, one_slot, literalarray_id]
1076      - sig: deprecated.defineclasswithbuffer method_id, imm1, imm2, v1:in:top, v2:in:top
1077        acc: out:top
1078        opcode_idx: [0x12]
1079        format: [pref_op_id_16_imm1_16_imm2_16_v1_8_v2_8]
1080        prefix: deprecated
1081        properties: [method_id]
1082
1083  - title: object visitors
1084    description: instructions which visit object
1085    verification:
1086      - none
1087    exceptions:
1088      - x_none
1089    properties:
1090      - acc_read
1091      - acc_write
1092    namespace: ecmascript
1093    pseudo: |
1094      acc = ecma_op(acc, operand_0, ..., operands_n)
1095    semantics: |
1096      skip
1097    instructions:
1098      - sig: resumegenerator
1099        acc: inout:top
1100        opcode_idx: [0xbf]
1101        format: [op_none]
1102      - sig: deprecated.resumegenerator v:in:top
1103        acc: out:top
1104        opcode_idx: [0x13]
1105        format: [pref_op_v_8]
1106        prefix: deprecated
1107      - sig: getresumemode
1108        acc: inout:top
1109        opcode_idx: [0xc0]
1110        format: [op_none]
1111      - sig: deprecated.getresumemode v:in:top
1112        acc: out:top
1113        opcode_idx: [0x14]
1114        format: [pref_op_v_8]
1115        prefix: deprecated
1116      - sig: gettemplateobject imm
1117        acc: inout:top
1118        opcode_idx: [0x76, 0xc1]
1119        format: [op_imm_8, op_imm_16]
1120        properties: [ic_slot, one_slot]
1121      - sig: deprecated.gettemplateobject v:in:top
1122        acc: inout:top
1123        opcode_idx: [0x15]
1124        format: [pref_op_v_8]
1125        prefix: deprecated
1126      - sig: getnextpropname v:in:top
1127        acc: out:top
1128        opcode_idx: [0x36]
1129        format: [op_v_8]
1130      - sig: delobjprop v:in:top
1131        acc: inout:top
1132        opcode_idx: [0xc2]
1133        format: [op_v_8]
1134      - sig: deprecated.delobjprop v1:in:top, v2:in:top
1135        acc: out:top
1136        opcode_idx: [0x16]
1137        format: [pref_op_v1_8_v2_8]
1138        prefix: deprecated
1139      - sig: suspendgenerator v:in:top
1140        acc: inout:top
1141        opcode_idx: [0xc3]
1142        format: [op_v_8]
1143      - sig: deprecated.suspendgenerator v1:in:top, v2:in:top
1144        acc: out:top
1145        opcode_idx: [0x17]
1146        format: [pref_op_v1_8_v2_8]
1147        prefix: deprecated
1148      - sig: asyncfunctionawaituncaught v:in:top
1149        acc: inout:top
1150        opcode_idx: [0xc4]
1151        format: [op_v_8]
1152      - sig: deprecated.asyncfunctionawaituncaught v1:in:top, v2:in:top
1153        acc: out:top
1154        opcode_idx: [0x18]
1155        format: [pref_op_v1_8_v2_8]
1156        prefix: deprecated
1157      - sig: copydataproperties v:in:top
1158        acc: inout:top
1159        opcode_idx: [0xc5]
1160        format: [op_v_8]
1161      - sig: deprecated.copydataproperties v1:in:top, v2:in:top
1162        acc: out:top
1163        opcode_idx: [0x19]
1164        format: [pref_op_v1_8_v2_8]
1165        prefix: deprecated
1166      - sig: starrayspread v1:in:top, v2:in:top
1167        acc: inout:top
1168        opcode_idx: [0xc6]
1169        format: [op_v1_8_v2_8]
1170      - sig: setobjectwithproto imm, v:in:top
1171        acc: in:top
1172        opcode_idx: [0x77, 0xc7]
1173        format: [op_imm_8_v_8, op_imm_16_v_8]
1174        properties: [ic_slot, two_slot]
1175      - sig: deprecated.setobjectwithproto v1:in:top, v2:in:top
1176        acc: none
1177        opcode_idx: [0x1a]
1178        format: [pref_op_v1_8_v2_8]
1179        prefix: deprecated
1180      - sig: ldobjbyvalue imm, v:in:top
1181        acc: inout:top
1182        opcode_idx: [0x37, 0x85]
1183        format: [op_imm_8_v_8, op_imm_16_v_8]
1184        properties: [ic_slot, two_slot]
1185      - sig: deprecated.ldobjbyvalue v1:in:top, v2:in:top
1186        acc: out:top
1187        opcode_idx: [0x1b]
1188        format: [pref_op_v1_8_v2_8]
1189        prefix: deprecated
1190      - sig: stobjbyvalue imm, v1:in:top, v2:in:top
1191        acc: in:top
1192        opcode_idx: [0x38, 0x86]
1193        format: [op_imm_8_v1_8_v2_8, op_imm_16_v1_8_v2_8]
1194        properties: [ic_slot, two_slot]
1195      - sig: stownbyvalue imm, v1:in:top, v2:in:top
1196        acc: in:top
1197        opcode_idx: [0x78, 0xc8]
1198        format: [op_imm_8_v1_8_v2_8, op_imm_16_v1_8_v2_8]
1199        properties: [ic_slot, two_slot]
1200      - sig: ldsuperbyvalue imm, v:in:top
1201        acc: inout:top
1202        opcode_idx: [0x39, 0x87]
1203        format: [op_imm_8_v_8, op_imm_16_v_8]
1204        properties: [ic_slot, two_slot]
1205      - sig: deprecated.ldsuperbyvalue v1:in:top, v2:in:top
1206        acc: out:top
1207        opcode_idx: [0x1c]
1208        format: [pref_op_v1_8_v2_8]
1209        prefix: deprecated
1210      - sig: stsuperbyvalue imm, v1:in:top, v2:in:top
1211        acc: in:top
1212        opcode_idx: [0xc9, 0xca]
1213        format: [op_imm_8_v1_8_v2_8, op_imm_16_v1_8_v2_8]
1214        properties: [ic_slot, two_slot]
1215      - sig: ldobjbyindex imm1, imm2
1216        acc: inout:top
1217        opcode_idx: [0x3a, 0x88]
1218        format: [op_imm1_8_imm2_16, op_imm1_16_imm2_16]
1219        properties: [ic_slot, two_slot]
1220      - sig: wide.ldobjbyindex imm
1221        acc: inout:top
1222        opcode_idx: [0x08]
1223        format: [pref_op_imm_32]
1224        prefix: wide
1225      - sig: deprecated.ldobjbyindex v:in:top, imm
1226        acc: out:top
1227        opcode_idx: [0x1d]
1228        format: [pref_op_v_8_imm_32]
1229        prefix: deprecated
1230      - sig: stobjbyindex imm1, v:in:top, imm2
1231        acc: in:top
1232        opcode_idx: [0x3b, 0x89]
1233        format: [op_imm1_8_v_8_imm2_16, op_imm1_16_v_8_imm2_16]
1234        properties: [ic_slot, two_slot]
1235      - sig: wide.stobjbyindex v:in:top, imm
1236        acc: in:top
1237        opcode_idx: [0x09]
1238        format: [pref_op_v_8_imm_32]
1239        prefix: wide
1240      - sig: stownbyindex imm1, v:in:top, imm2
1241        acc: in:top
1242        opcode_idx: [0x79, 0xcb]
1243        format: [op_imm1_8_v_8_imm2_16, op_imm1_16_v_8_imm2_16]
1244        properties: [ic_slot, two_slot]
1245      - sig: wide.stownbyindex v:in:top, imm
1246        acc: in:top
1247        opcode_idx: [0x0a]
1248        format: [pref_op_v_8_imm_32]
1249        prefix: wide
1250      - sig: asyncfunctionresolve v:in:top
1251        acc: inout:top
1252        opcode_idx: [0xcd]
1253        format: [op_v_8]
1254      - sig: deprecated.asyncfunctionresolve v1:in:top, v2:in:top, v3:in:top
1255        acc: out:top
1256        opcode_idx: [0x1e]
1257        format: [pref_op_v1_8_v2_8_v3_8]
1258        prefix: deprecated
1259      - sig: asyncfunctionreject v:in:top
1260        acc: inout:top
1261        opcode_idx: [0xce]
1262        format: [op_v_8]
1263      - sig: deprecated.asyncfunctionreject v1:in:top, v2:in:top, v3:in:top
1264        acc: out:top
1265        opcode_idx: [0x1f]
1266        format: [pref_op_v1_8_v2_8_v3_8]
1267        prefix: deprecated
1268      - sig: copyrestargs imm
1269        acc: out:top
1270        opcode_idx: [0xcf]
1271        format: [op_imm_8]
1272      - sig: wide.copyrestargs imm
1273        acc: out:top
1274        opcode_idx: [0x0b]
1275        format: [pref_op_imm_16]
1276        prefix: wide
1277      - sig: ldlexvar imm1, imm2
1278        acc: out:top
1279        opcode_idx: [0x3c, 0x8a]
1280        format: [op_imm1_4_imm2_4, op_imm1_8_imm2_8]
1281      - sig: wide.ldlexvar imm1, imm2
1282        acc: out:top
1283        opcode_idx: [0x0c]
1284        format: [pref_op_imm1_16_imm2_16]
1285        prefix: wide
1286      - sig: stlexvar imm1, imm2
1287        acc: in:top
1288        opcode_idx: [0x3d, 0x8b]
1289        format: [op_imm1_4_imm2_4, op_imm1_8_imm2_8]
1290      - sig: wide.stlexvar imm1, imm2
1291        acc: in:top
1292        opcode_idx: [0x0d]
1293        format: [pref_op_imm1_16_imm2_16]
1294        prefix: wide
1295      - sig: deprecated.stlexvar imm1, imm2, v:in:top
1296        acc: none
1297        opcode_idx: [0x20, 0x21, 0x22]
1298        format: [pref_op_imm1_4_imm2_4_v_8, pref_op_imm1_8_imm2_8_v_8, pref_op_imm1_16_imm2_16_v_8]
1299        prefix: deprecated
1300      - sig: getmodulenamespace imm
1301        acc: out:top
1302        opcode_idx: [0x7b]
1303        format: [op_imm_8]
1304      - sig: wide.getmodulenamespace imm
1305        acc: out:top
1306        opcode_idx: [0x0e]
1307        format: [pref_op_imm_16]
1308        prefix: wide
1309      - sig: deprecated.getmodulenamespace string_id
1310        acc: out:top
1311        opcode_idx: [0x23]
1312        format: [pref_op_id_32]
1313        properties: [string_id]
1314        prefix: deprecated
1315      - sig: stmodulevar imm
1316        acc: in:top
1317        opcode_idx: [0x7c]
1318        format: [op_imm_8]
1319      - sig: wide.stmodulevar imm
1320        acc: in:top
1321        opcode_idx: [0x0f]
1322        format: [pref_op_imm_16]
1323        prefix: wide
1324      - sig: deprecated.stmodulevar string_id
1325        acc: in:top
1326        opcode_idx: [0x24]
1327        format: [pref_op_id_32]
1328        properties: [string_id]
1329        prefix: deprecated
1330      - sig: tryldglobalbyname imm, string_id
1331        acc: out:top
1332        opcode_idx: [0x3f, 0x8c]
1333        format: [op_imm_8_id_16, op_imm_16_id_16]
1334        properties: [string_id, ic_slot, one_slot]
1335      - sig: trystglobalbyname imm, string_id
1336        acc: in:top
1337        opcode_idx: [0x40, 0x8d]
1338        format: [op_imm_8_id_16, op_imm_16_id_16]
1339        properties: [string_id, ic_slot, one_slot]
1340      - sig: ldglobalvar imm, string_id
1341        acc: out:top
1342        opcode_idx: [0x41]
1343        format: [op_imm_16_id_16]
1344        properties: [string_id, ic_slot, one_slot]
1345      - sig: stglobalvar imm, string_id
1346        acc: in:top
1347        opcode_idx: [0x7f]
1348        format: [op_imm_16_id_16]
1349        properties: [string_id, ic_slot, one_slot]
1350      - sig: ldobjbyname imm, string_id
1351        acc: inout:top
1352        opcode_idx: [0x42, 0x90]
1353        format: [op_imm_8_id_16, op_imm_16_id_16]
1354        properties: [string_id, ic_slot, two_slot]
1355      - sig: deprecated.ldobjbyname string_id, v:in:top
1356        acc: out:top
1357        opcode_idx: [0x25]
1358        format: [pref_op_id_32_v_8]
1359        properties: [string_id]
1360        prefix: deprecated
1361      - sig: stobjbyname imm, string_id, v:in:top
1362        acc: in:top
1363        opcode_idx: [0x43, 0x91]
1364        format: [op_imm_8_id_16_v_8, op_imm_16_id_16_v_8]
1365        properties: [string_id, ic_slot, two_slot]
1366      - sig: stownbyname imm, string_id, v:in:top
1367        acc: in:top
1368        opcode_idx: [0x7a, 0xcc]
1369        format: [op_imm_8_id_16_v_8, op_imm_16_id_16_v_8]
1370        properties: [string_id, ic_slot, two_slot]
1371      - sig: ldsuperbyname imm, string_id
1372        acc: inout:top
1373        opcode_idx: [0x46, 0x92]
1374        format: [op_imm_8_id_16, op_imm_16_id_16]
1375        properties: [string_id, ic_slot, two_slot]
1376      - sig: deprecated.ldsuperbyname string_id, v:in:top
1377        acc: out:top
1378        opcode_idx: [0x26]
1379        format: [pref_op_id_32_v_8]
1380        properties: [string_id]
1381        prefix: deprecated
1382      - sig: stsuperbyname imm, string_id, v:in:top
1383        acc: in:top
1384        opcode_idx: [0xd0, 0xd1]
1385        format: [op_imm_8_id_16_v_8, op_imm_16_id_16_v_8]
1386        properties: [string_id, ic_slot, two_slot]
1387      - sig: ldlocalmodulevar imm
1388        opcode_idx: [0x7d]
1389        acc: out:top
1390        format: [op_imm_8]
1391      - sig: wide.ldlocalmodulevar imm
1392        acc: out:top
1393        opcode_idx: [0x10]
1394        format: [pref_op_imm_16]
1395        prefix: wide
1396      - sig: ldexternalmodulevar imm
1397        acc: out:top
1398        opcode_idx: [0x7e]
1399        format: [op_imm_8]
1400      - sig: wide.ldexternalmodulevar imm
1401        acc: out:top
1402        opcode_idx: [0x11]
1403        format: [pref_op_imm_16]
1404        prefix: wide
1405      - sig: deprecated.ldmodulevar string_id, imm
1406        acc: out:top
1407        opcode_idx: [0x27]
1408        format: [pref_op_id_32_imm_8]
1409        prefix: deprecated
1410        properties: [string_id]
1411      - sig: stconsttoglobalrecord imm, string_id
1412        acc: in:top
1413        opcode_idx: [0x47]
1414        format: [op_imm_16_id_16]
1415        properties: [string_id, ic_slot, one_slot]
1416      - sig: deprecated.stconsttoglobalrecord string_id
1417        acc: in:top
1418        opcode_idx: [0x28]
1419        format: [pref_op_id_32]
1420        properties: [string_id]
1421        prefix: deprecated
1422      - sig: sttoglobalrecord imm, string_id
1423        acc: in:top
1424        opcode_idx: [0x48]
1425        format: [op_imm_16_id_16]
1426        properties: [string_id, ic_slot, one_slot]
1427      - sig: deprecated.stlettoglobalrecord string_id
1428        acc: in:top
1429        opcode_idx: [0x29]
1430        format: [pref_op_id_32]
1431        properties: [string_id]
1432        prefix: deprecated
1433      - sig: deprecated.stclasstoglobalrecord string_id
1434        acc: in:top
1435        opcode_idx: [0x2a]
1436        format: [pref_op_id_32]
1437        properties: [string_id]
1438        prefix: deprecated
1439      - sig: deprecated.ldhomeobject
1440        acc: out:top
1441        opcode_idx: [0x2b]
1442        format: [pref_op_none]
1443        prefix: deprecated
1444      - sig: deprecated.createobjecthavingmethod imm
1445        acc: inout:top
1446        opcode_idx: [0x2c]
1447        format: [pref_op_imm_16]
1448        prefix: deprecated
1449      - sig: stownbyvaluewithnameset imm, v1:in:top, v2:in:top
1450        acc: in:top
1451        opcode_idx: [0x99, 0xd2]
1452        format: [op_imm_8_v1_8_v2_8, op_imm_16_v1_8_v2_8]
1453        properties: [ic_slot, two_slot]
1454      - sig: stownbynamewithnameset imm, string_id, v:in:top
1455        acc: in:top
1456        opcode_idx: [0x8e, 0xd4]
1457        format: [op_imm_8_id_16_v_8, op_imm_16_id_16_v_8]
1458        properties: [string_id, ic_slot, two_slot]
1459      - sig: ldbigint string_id
1460        acc: out:top
1461        opcode_idx: [0xd3]
1462        format: [op_id_16]
1463        properties: [string_id]
1464      - sig: ldthisbyname imm, string_id
1465        acc: out:top
1466        opcode_idx: [0x49, 0x93]
1467        format: [op_imm_8_id_16, op_imm_16_id_16]
1468        properties: [string_id, ic_slot, two_slot]
1469      - sig: stthisbyname imm, string_id
1470        acc: in:top
1471        opcode_idx: [0x4a, 0x94]
1472        format: [op_imm_8_id_16, op_imm_16_id_16]
1473        properties: [string_id, ic_slot, two_slot]
1474      - sig: ldthisbyvalue imm
1475        acc: inout:top
1476        opcode_idx: [0x4b, 0x95]
1477        format: [op_imm_8, op_imm_16]
1478        properties: [ic_slot, two_slot]
1479      - sig: stthisbyvalue imm, v:in:top
1480        acc: in:top
1481        opcode_idx: [0x4c, 0x96]
1482        format: [op_imm_8_v_8, op_imm_16_v_8]
1483        properties: [ic_slot, two_slot]
1484      - sig: wide.ldpatchvar imm
1485        acc: out:top
1486        opcode_idx: [0x12]
1487        format: [pref_op_imm_16]
1488        prefix: wide
1489      - sig: wide.stpatchvar imm
1490        acc: in:top
1491        opcode_idx: [0x13]
1492        format: [pref_op_imm_16]
1493        prefix: wide
1494      - sig: dynamicimport
1495        acc: inout:top
1496        opcode_idx: [0xbd]
1497        format: [op_none]
1498      - sig: deprecated.dynamicimport v:in:top
1499        acc: out:top
1500        opcode_idx: [0x2d]
1501        format: [pref_op_v_8]
1502        prefix: deprecated
1503      - sig: asyncgeneratorreject v:in:top
1504        acc: inout:top
1505        opcode_idx: [0x97]
1506        format: [op_v_8]
1507      - sig: deprecated.asyncgeneratorreject v1:in:top, v2:in:top
1508        acc: out:top
1509        opcode_idx: [0x2e]
1510        format: [pref_op_v1_8_v2_8]
1511        prefix: deprecated
1512      - sig: setgeneratorstate imm
1513        acc: in:top
1514        opcode_idx: [0xd6]
1515        format: [op_imm_8]
1516
1517  - title: Load accumulator from string constant pool
1518    description: >
1519      Load string specified by id into accumulator. In dynamically-typed language context
1520      load string as 'any' value.
1521    properties:
1522      - string_id
1523      - language_type
1524      - maybe_dynamic
1525    exceptions:
1526      - x_oom
1527    verification:
1528      - constant_string_id
1529    pseudo: |
1530      acc = load(id)
1531    instructions:
1532      - sig: lda.str string_id
1533        acc: out:ref
1534        opcode_idx: [0x3e]
1535        format: [op_id_16]
1536
1537  - title: jump operations
1538    description: >
1539      Transfer execution to an instruction at offset bytes from the beginning of the current
1540      instruction. Offset is sign extended to the size of instruction address.
1541    properties:
1542      - jump
1543    exceptions:
1544      - x_none
1545    verification:
1546      - branch_target
1547    pseudo: |
1548      pc += imm
1549    instructions:
1550      - sig: jmp imm
1551        acc: none
1552        opcode_idx: [0x4d, 0x4e, 0x98]
1553        format: [op_imm_8, op_imm_16, op_imm_32]
1554      - sig: jeqz imm
1555        acc: in:top
1556        opcode_idx: [0x4f, 0x50, 0x9a]
1557        format: [op_imm_8, op_imm_16, op_imm_32]
1558        properties: [conditional]
1559      - sig: jnez imm
1560        acc: in:top
1561        opcode_idx: [0x51, 0x9b, 0x9c]
1562        format: [op_imm_8, op_imm_16, op_imm_32]
1563        properties: [conditional]
1564      - sig: jstricteqz imm
1565        acc: in:top
1566        opcode_idx: [0x52, 0x9d]
1567        format: [op_imm_8, op_imm_16]
1568        properties: [conditional]
1569      - sig: jnstricteqz imm
1570        acc: in:top
1571        opcode_idx: [0x53, 0x9e]
1572        format: [op_imm_8, op_imm_16]
1573        properties: [conditional]
1574      - sig: jeqnull imm
1575        acc: in:top
1576        opcode_idx: [0x54, 0x9f]
1577        format: [op_imm_8, op_imm_16]
1578        properties: [conditional]
1579      - sig: jnenull imm
1580        acc: in:top
1581        opcode_idx: [0x55, 0xa0]
1582        format: [op_imm_8, op_imm_16]
1583        properties: [conditional]
1584      - sig: jstricteqnull imm
1585        acc: in:top
1586        opcode_idx: [0x56, 0xa1]
1587        format: [op_imm_8, op_imm_16]
1588        properties: [conditional]
1589      - sig: jnstricteqnull imm
1590        acc: in:top
1591        opcode_idx: [0x57, 0xa2]
1592        format: [op_imm_8, op_imm_16]
1593        properties: [conditional]
1594      - sig: jequndefined imm
1595        acc: in:top
1596        opcode_idx: [0x58, 0xa3]
1597        format: [op_imm_8, op_imm_16]
1598        properties: [conditional]
1599      - sig: jneundefined imm
1600        acc: in:top
1601        opcode_idx: [0x59, 0xa4]
1602        format: [op_imm_8, op_imm_16]
1603        properties: [conditional]
1604      - sig: jstrictequndefined imm
1605        acc: in:top
1606        opcode_idx: [0x5a, 0xa5]
1607        format: [op_imm_8, op_imm_16]
1608        properties: [conditional]
1609      - sig: jnstrictequndefined imm
1610        acc: in:top
1611        opcode_idx: [0x5b, 0xa6]
1612        format: [op_imm_8, op_imm_16]
1613        properties: [conditional]
1614      - sig: jeq v:in:top, imm
1615        acc: in:top
1616        opcode_idx: [0x5c, 0xa7]
1617        format: [op_v_8_imm_8, op_v_8_imm_16]
1618        properties: [conditional]
1619      - sig: jne v:in:top, imm
1620        acc: in:top
1621        opcode_idx: [0x5d, 0xa8]
1622        format: [op_v_8_imm_8, op_v_8_imm_16]
1623        properties: [conditional]
1624      - sig: jstricteq v:in:top, imm
1625        acc: in:top
1626        opcode_idx: [0x5e, 0xa9]
1627        format: [op_v_8_imm_8, op_v_8_imm_16]
1628        properties: [conditional]
1629      - sig: jnstricteq v:in:top, imm
1630        acc: in:top
1631        opcode_idx: [0x5f, 0xaa]
1632        format: [op_v_8_imm_8, op_v_8_imm_16]
1633        properties: [conditional]
1634
1635  - title: Dynamic move register-to-register
1636    description: >
1637      Move 'any' values between registers
1638    verification:
1639      - valid_in_dynamic_context
1640    exceptions:
1641      - x_none
1642    properties:
1643      - dynamic
1644    pseudo: |
1645      vd = vs
1646    instructions:
1647      - sig: mov v1:out:any, v2:in:any
1648        acc: none
1649        opcode_idx: [0x44, 0x45, 0x8f]
1650        format: [op_v1_4_v2_4, op_v1_8_v2_8, op_v1_16_v2_16]
1651
1652  - title: Dynamic load accumulator from register
1653    description: >
1654      Move 'any' value from register to accumulator
1655    verification:
1656      - valid_in_dynamic_context
1657    exceptions:
1658      - x_none
1659    properties:
1660      - dynamic
1661    pseudo: |
1662      acc = v
1663    instructions:
1664      - sig: lda v:in:any
1665        acc: out:any
1666        opcode_idx: [0x60]
1667        format: [op_v_8]
1668
1669  - title: Dynamic store accumulator
1670    description: >
1671      Move 'any' value from accumulator to register
1672    verification:
1673      - valid_in_dynamic_context
1674    exceptions:
1675      - x_none
1676    properties:
1677      - dynamic
1678    pseudo: |
1679      v = acc
1680    instructions:
1681      - sig: sta v:out:any
1682        acc: in:any
1683        opcode_idx: [0x61]
1684        format: [op_v_8]
1685
1686  - title: Dynamic load accumulator from immediate
1687    description: >
1688      Move immediate as 'any' value to accumulator
1689    verification:
1690      - valid_in_dynamic_context
1691    exceptions:
1692      - x_none
1693    properties:
1694      - dynamic
1695    pseudo: |
1696      acc = imm
1697    instructions:
1698      - sig: ldai imm:i32
1699        acc: out:any
1700        opcode_idx: [0x62]
1701        format: [op_imm_32]
1702      - sig: fldai imm:f64
1703        acc: out:any
1704        opcode_idx: [0x63]
1705        format: [op_imm_64]
1706        properties: [float, dynamic]
1707
1708  - title: dynamic return
1709    description: dynamic return from method
1710    verification:
1711      - valid_in_dynamic_context
1712    exceptions:
1713      - x_none
1714    properties:
1715      - dynamic
1716      - return
1717    namespace: ecmascript
1718    pseudo: |
1719      return acc
1720    instructions:
1721      - sig: return
1722        acc: in:any
1723        opcode_idx: [0x64]
1724        format: [op_none]
1725        properties: [return]
1726      - sig: returnundefined
1727        acc: none
1728        opcode_idx: [0x65]
1729        properties: [return]
1730        format: [op_none]
1731
1732  - title: no operation
1733    description: Perform an operation without behavior
1734    exceptions:
1735      - x_none
1736    verification:
1737      - none
1738    pseudo: |
1739      skip
1740    instructions:
1741      - sig: nop
1742        acc: none
1743        opcode_idx: [0xd5]
1744        format: [op_none]
1745