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