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