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