LIROps.yaml (91306B)
1 # This Source Code Form is subject to the terms of the Mozilla Public 2 # License, v. 2.0. If a copy of the MPL was not distributed with this 3 # file, You can obtain one at http://mozilla.org/MPL/2.0/. 4 5 # [SMDOC] LIR Opcodes 6 # ======================= 7 # This file defines all LIR opcodes as well as LIR opcode class 8 # definitions. It is parsed by GenerateLIRFiles.py at build time to 9 # create LIROpsGenerated.h. Each opcode consists of a 10 # name and a set of attributes that are described below. Unless 11 # marked as required, attributes are optional. 12 # 13 # name [required] 14 # ==== 15 # Opcode name. 16 # Possible values: 17 # - opcode string: used as the name for LIR opcode. 18 # 19 # gen_boilerplate 20 # =============== 21 # Used to decide to generate LIR boilerplate. 22 # - true (default): auto generate boilerplate for this LIR opcode 23 # - false: do not generate boilerplate for this LIR opcode 24 # 25 # result_type 26 # =========== 27 # Specifies the result type that is produced by this LIR instruction. 28 # The result type can be any of the following: WordSized, BoxedValue, 29 # or Int64. 30 # - attribute not specified (default): there is no result produced 31 # by this LIR instruction 32 # - result type: sets result type for this LIR instruction 33 # 34 # successors 35 # =========== 36 # Specifies the list of successor blocks for control instruction LIR nodes. 37 # Control instruction nodes inherit from LControlInstructionHelper. The 38 # "result_type" attribute can't be used when this attribute is present. 39 # 40 # For example: 41 # successors: [ifTrue, ifFalse] 42 # 43 # Will generate the following getters: 44 # MBasicBlock* ifTrue() const { return getSuccessor(0); } 45 # MBasicBlock* ifFalse() const { return getSuccessor(1); } 46 # 47 # operands 48 # ======== 49 # A list of operands to the LIR node. Each operand will be 50 # passed into and set in the instruction's constructor. A simple getter 51 # will also be auto generated for the operand. Each operand in the 52 # following list is defined by its name and an type. 53 # The type can be WordSized, BoxedValue, or Int64. 54 # 55 # For example: 56 # operands: 57 # lhs: BoxedValue 58 # rhs: WordSized 59 # 60 # Will result in: 61 # explicit LInstanceOfV(const LBoxAllocation& lhs, const LAllocation& rhs) 62 # : LInstructionHelper(classOpcode) { 63 # setBoxOperand(lhsIndex, lhs); 64 # setOperand(rhsIndex, rhs); 65 # } 66 # const LAllocation* rhs() { return getOperand(0); } 67 # 68 # static const size_t lhsIndex = 0; 69 # static const size_t rhsIndex = BOX_PIECES; 70 # 71 # - attribute not specified (default): no code generated 72 # - list of operand names with their types: operand getters and setters 73 # are generated and passed into the constructor 74 # 75 # arguments 76 # ========= 77 # A list of non-LIR node arguments to the LIR op class constructor 78 # that are passed along with the operands. The arguments require 79 # both a name and a full type signature for each item in the list. 80 # 81 # For example: 82 # offset: size_t 83 # type: MIRType 84 # 85 # For each argument a private variable declaration will be autogenerated 86 # in the LIR op class, as well as simple accessor for that variable. The 87 # above arguments list will result in the following declarations and 88 # accessors: 89 # 90 # size_t offset_; 91 # MIRType type_; 92 # 93 # size_t offset() const { return offset_; } 94 # MIRType type() const { return type_; } 95 # 96 # - attribute not specified (default): no code generated 97 # - argument list: argument names and their full type signature 98 # 99 # num_temps 100 # ======== 101 # Specifies the number of temporary virtual registers, LDefinitions, used by 102 # this LIR op. 103 # - attribute not specified (default): number of temps is set to 0 104 # - number of LDefinition temps: sets number of temps max 15 105 # 106 # call_instruction 107 # ================ 108 # Used to define call instructions. 109 # - attribute not specified (default): no code generated 110 # - true: generates a call to setIsCall in the op's constructor 111 # 112 # mir_op 113 # ====== 114 # If a LIR instruction corresponds one-to-one with a particular MIR 115 # instruction, this will generate a method that returns that MIR 116 # instruction. 117 # - attribute not specified (default): no code generated 118 # - true: generates a method to return MIR instruction 119 # - mir string: returns this specified MIR instruction 120 # 121 # extra_name 122 # ========== 123 # Add a declaration for the `extraName` method. 124 # - attribute not specified (default): no code generated 125 # - true: adds the `inline const char* extraName() const;` declaration 126 # 127 # defer_init 128 # ========== 129 # Control whether or not operands and temps are initialized outside the 130 # constructor. 131 # - attribute not specified (default): operands and temps are initialized in 132 # the constructor. 133 # - true: operands and temps are not initialized in the constructor, instead 134 # setter definitions are added for manual initialization. 135 136 - name: Phi 137 gen_boilerplate: false 138 139 - name: Box 140 result_type: BoxedValue 141 operands: 142 payload: WordSized 143 arguments: 144 type: MIRType 145 extra_name: true 146 147 - name: OsiPoint 148 gen_boilerplate: false 149 150 - name: MoveGroup 151 gen_boilerplate: false 152 153 # Constant 32-bit integer. 154 - name: Integer 155 result_type: WordSized 156 arguments: 157 i32: int32_t 158 159 # Constant 64-bit integer. 160 - name: Integer64 161 result_type: Int64 162 arguments: 163 i64: int64_t 164 165 # Constant pointer. 166 - name: Pointer 167 result_type: WordSized 168 arguments: 169 gcptr: const gc::Cell* 170 171 # Constant double. 172 - name: Double 173 result_type: WordSized 174 arguments: 175 value: double 176 177 # Constant float32. 178 - name: Float32 179 result_type: WordSized 180 arguments: 181 value: float 182 183 - name: Value 184 gen_boilerplate: false 185 186 # Formal argument for a function, returning a box. Formal arguments are 187 # initially read from the stack. 188 - name: Parameter 189 result_type: BoxedValue 190 191 # Jumps to the start of a basic block. 192 - name: Goto 193 successors: [target] 194 195 - name: NewArray 196 result_type: WordSized 197 num_temps: 1 198 mir_op: true 199 extra_name: true 200 201 - name: NewIterator 202 result_type: WordSized 203 num_temps: 1 204 mir_op: true 205 206 - name: NewTypedArray 207 result_type: WordSized 208 call_instruction: true 209 num_temps: 4 210 mir_op: true 211 212 - name: NewTypedArrayInline 213 result_type: WordSized 214 num_temps: 1 215 mir_op: NewTypedArray 216 217 - name: BindFunction 218 result_type: WordSized 219 operands: 220 target: WordSized 221 call_instruction: true 222 num_temps: 2 223 mir_op: true 224 225 - name: NewObject 226 result_type: WordSized 227 num_temps: 1 228 mir_op: true 229 extra_name: true 230 231 - name: NewPlainObject 232 result_type: WordSized 233 num_temps: 3 234 mir_op: true 235 236 - name: NewArrayObject 237 result_type: WordSized 238 num_temps: 2 239 mir_op: true 240 241 # Allocates a new CallObject. 242 # 243 # This instruction generates two possible instruction sets: 244 # (1) If the call object is extensible, this is a callVM to create the 245 # call object. 246 # (2) Otherwise, an inline allocation of the call object is attempted. 247 # 248 - name: NewCallObject 249 result_type: WordSized 250 num_temps: 1 251 mir_op: true 252 253 - name: NewMapObject 254 result_type: WordSized 255 num_temps: 1 256 mir_op: true 257 258 - name: NewSetObject 259 result_type: WordSized 260 num_temps: 1 261 mir_op: true 262 263 - name: NewStringObject 264 result_type: WordSized 265 operands: 266 input: WordSized 267 num_temps: 1 268 mir_op: true 269 270 - name: WasmRefAsNonNull 271 operands: 272 ref: WordSized 273 result_type: WordSized 274 mir_op: true 275 276 - name: WasmRefTestConcrete 277 mir_op: true 278 operands: 279 ref: WordSized 280 superSTV: WordSized 281 result_type: WordSized 282 num_temps: 2 283 284 - name: WasmRefTestAbstract 285 mir_op: true 286 operands: 287 ref: WordSized 288 result_type: WordSized 289 num_temps: 1 290 291 - name: WasmRefTestConcreteAndBranch 292 successors: [ifTrue, ifFalse] 293 operands: 294 ref: WordSized 295 superSTV: WordSized 296 arguments: 297 sourceType: wasm::MaybeRefType 298 destType: wasm::RefType 299 num_temps: 2 300 301 - name: WasmRefTestAbstractAndBranch 302 successors: [ifTrue, ifFalse] 303 operands: 304 ref: WordSized 305 arguments: 306 sourceType: wasm::MaybeRefType 307 destType: wasm::RefType 308 num_temps: 1 309 310 - name: WasmRefCastConcrete 311 mir_op: true 312 operands: 313 ref: WordSized 314 superSTV: WordSized 315 result_type: WordSized 316 num_temps: 2 317 318 - name: WasmRefCastAbstract 319 mir_op: true 320 operands: 321 ref: WordSized 322 result_type: WordSized 323 num_temps: 1 324 325 - name: WasmNewStructObject 326 mir_op: true 327 operands: 328 instance: WordSized 329 allocSite: WordSized 330 result_type: WordSized 331 num_temps: 1 332 333 - name: WasmNewArrayObject 334 mir_op: true 335 operands: 336 instance: WordSized 337 numElements: WordSized 338 allocSite: WordSized 339 result_type: WordSized 340 num_temps: 2 341 342 - name: ReinterpretCast 343 operands: 344 input: WordSized 345 result_type: WordSized 346 mir_op: ReinterpretCast 347 348 - name: ReinterpretCastFromI64 349 operands: 350 input: Int64 351 result_type: WordSized 352 mir_op: ReinterpretCast 353 354 - name: ReinterpretCastToI64 355 operands: 356 input: WordSized 357 result_type: Int64 358 mir_op: ReinterpretCast 359 360 - name: Rotate 361 result_type: WordSized 362 operands: 363 input: WordSized 364 count: WordSized 365 mir_op: true 366 defer_init: true 367 368 - name: RotateI64 369 result_type: Int64 370 operands: 371 input: Int64 372 count: WordSized 373 num_temps: 1 374 mir_op: Rotate 375 defer_init: true 376 377 - name: WasmInterruptCheck 378 operands: 379 instance: WordSized 380 mir_op: true 381 382 - name: TypeOfV 383 result_type: WordSized 384 operands: 385 input: BoxedValue 386 num_temps: 1 387 mir_op: TypeOf 388 389 - name: TypeOfO 390 result_type: WordSized 391 operands: 392 object: WordSized 393 mir_op: TypeOf 394 395 - name: TypeOfIsNonPrimitiveV 396 result_type: WordSized 397 operands: 398 input: BoxedValue 399 num_temps: 1 400 mir_op: TypeOfIs 401 402 - name: TypeOfIsNonPrimitiveO 403 result_type: WordSized 404 operands: 405 input: WordSized 406 mir_op: TypeOfIs 407 408 - name: TypeOfIsPrimitive 409 result_type: WordSized 410 operands: 411 input: BoxedValue 412 mir_op: TypeOfIs 413 414 # Allocate a new arguments object for the frame. 415 - name: CreateArgumentsObject 416 result_type: WordSized 417 operands: 418 callObject: WordSized 419 num_temps: 3 420 call_instruction: true 421 mir_op: true 422 423 - name: CreateInlinedArgumentsObject 424 gen_boilerplate: false 425 426 - name: GetInlinedArgument 427 gen_boilerplate: false 428 429 - name: GetInlinedArgumentHole 430 gen_boilerplate: false 431 432 - name: BoxNonStrictThis 433 result_type: WordSized 434 operands: 435 value: BoxedValue 436 mir_op: true 437 438 # Writes a typed argument for a function call to the frame's argument vector. 439 - name: StackArgT 440 operands: 441 arg: WordSized 442 arguments: 443 # Index into frame-scope argument vector. 444 argslot: uint32_t 445 type: MIRType 446 447 # Writes a typed argument for a function call to the frame's argument vector. 448 - name: StackArgV 449 operands: 450 value: BoxedValue 451 arguments: 452 # Index into frame-scope argument vector. 453 argslot: uint32_t 454 455 - name: CallGeneric 456 gen_boilerplate: false 457 458 - name: CallKnown 459 gen_boilerplate: false 460 461 - name: CallNative 462 gen_boilerplate: false 463 464 - name: CallDOMNative 465 gen_boilerplate: false 466 467 - name: CallClassHook 468 gen_boilerplate: false 469 470 - name: Unreachable 471 successors: [] 472 473 - name: UnreachableResultV 474 result_type: BoxedValue 475 476 - name: UnreachableResultT 477 result_type: WordSized 478 479 - name: GetDOMProperty 480 result_type: BoxedValue 481 operands: 482 object: WordSized 483 num_temps: 3 484 call_instruction: true 485 mir_op: true 486 487 - name: GetDOMMemberV 488 result_type: BoxedValue 489 operands: 490 object: WordSized 491 mir_op: GetDOMMember 492 493 - name: GetDOMMemberT 494 result_type: WordSized 495 operands: 496 object: WordSized 497 mir_op: GetDOMMember 498 499 - name: SetDOMProperty 500 operands: 501 object: WordSized 502 value: BoxedValue 503 num_temps: 3 504 call_instruction: true 505 mir_op: true 506 507 - name: LoadDOMExpandoValueGuardGeneration 508 result_type: BoxedValue 509 operands: 510 proxy: WordSized 511 mir_op: true 512 513 - name: ApplyArgsGeneric 514 gen_boilerplate: false 515 516 - name: ApplyArgsObj 517 gen_boilerplate: false 518 519 - name: ApplyArrayGeneric 520 gen_boilerplate: false 521 522 - name: ConstructArgsGeneric 523 gen_boilerplate: false 524 525 - name: ConstructArrayGeneric 526 gen_boilerplate: false 527 528 - name: ApplyArgsNative 529 gen_boilerplate: false 530 531 - name: ApplyArgsObjNative 532 gen_boilerplate: false 533 534 - name: ApplyArrayNative 535 gen_boilerplate: false 536 537 - name: ConstructArgsNative 538 gen_boilerplate: false 539 540 - name: ConstructArrayNative 541 gen_boilerplate: false 542 543 # Takes in either an integer or boolean input and tests it for truthiness. 544 - name: TestIAndBranch 545 successors: [ifTrue, ifFalse] 546 operands: 547 input: WordSized 548 549 # Takes in intptr input and tests it for truthiness. 550 - name: TestIPtrAndBranch 551 successors: [ifTrue, ifFalse] 552 operands: 553 input: WordSized 554 555 # Takes in an int64 input and tests it for truthiness. 556 - name: TestI64AndBranch 557 successors: [ifTrue, ifFalse] 558 operands: 559 input: Int64 560 561 # Takes in a double input and tests it for truthiness. 562 - name: TestDAndBranch 563 successors: [ifTrue, ifFalse] 564 operands: 565 input: WordSized 566 567 # Takes in a float32 input and tests it for truthiness. 568 - name: TestFAndBranch 569 successors: [ifTrue, ifFalse] 570 operands: 571 input: WordSized 572 573 # Takes in a bigint input and tests it for truthiness. 574 - name: TestBIAndBranch 575 successors: [ifTrue, ifFalse] 576 operands: 577 input: WordSized 578 579 # Takes an object and tests it for truthiness. An object is falsy iff it 580 # emulates |undefined|; see js::EmulatesUndefined. 581 - name: TestOAndBranch 582 successors: [ifTruthy, ifFalsy] 583 operands: 584 input: WordSized 585 num_temps: 1 586 mir_op: Test 587 588 # Takes in a boxed value and tests it for truthiness. 589 - name: TestVAndBranch 590 successors: [ifTruthy, ifFalsy] 591 operands: 592 input: BoxedValue 593 num_temps: 3 594 mir_op: Test 595 596 # Compares two integral values of the same JS type, either integer or object. 597 # For objects, both operands are in registers. 598 - name: Compare 599 result_type: WordSized 600 operands: 601 left: WordSized 602 right: WordSized 603 arguments: 604 jsop: JSOp 605 mir_op: true 606 extra_name: true 607 608 - name: CompareI64 609 result_type: WordSized 610 operands: 611 left: Int64 612 right: Int64 613 arguments: 614 jsop: JSOp 615 mir_op: Compare 616 extra_name: true 617 618 - name: CompareI64AndBranch 619 successors: [ifTrue, ifFalse] 620 operands: 621 left: Int64 622 right: Int64 623 arguments: 624 cmpMir: MCompare* 625 jsop: JSOp 626 mir_op: Test 627 extra_name: true 628 629 # Compares two integral values of the same JS type, either integer or object. 630 # For objects, both operands are in registers. 631 - name: CompareAndBranch 632 successors: [ifTrue, ifFalse] 633 operands: 634 left: WordSized 635 right: WordSized 636 arguments: 637 cmpMir: MCompare* 638 jsop: JSOp 639 mir_op: Test 640 extra_name: true 641 642 - name: CompareD 643 result_type: WordSized 644 operands: 645 left: WordSized 646 right: WordSized 647 mir_op: Compare 648 649 - name: CompareF 650 result_type: WordSized 651 operands: 652 left: WordSized 653 right: WordSized 654 mir_op: Compare 655 656 - name: CompareDAndBranch 657 successors: [ifTrue, ifFalse] 658 operands: 659 left: WordSized 660 right: WordSized 661 arguments: 662 cmpMir: MCompare* 663 664 - name: CompareFAndBranch 665 successors: [ifTrue, ifFalse] 666 operands: 667 left: WordSized 668 right: WordSized 669 arguments: 670 cmpMir: MCompare* 671 672 - name: CompareS 673 result_type: WordSized 674 operands: 675 left: WordSized 676 right: WordSized 677 mir_op: Compare 678 679 - name: CompareSInline 680 result_type: WordSized 681 operands: 682 input: WordSized 683 arguments: 684 constant: JSOffThreadAtom* 685 mir_op: Compare 686 687 - name: CompareSSingle 688 result_type: WordSized 689 operands: 690 input: WordSized 691 arguments: 692 jsop: JSOp 693 constant: JSOffThreadAtom* 694 num_temps: 1 695 mir_op: Compare 696 697 - name: CompareBigInt 698 result_type: WordSized 699 operands: 700 left: WordSized 701 right: WordSized 702 num_temps: 3 703 mir_op: Compare 704 705 - name: CompareBigIntInt32 706 result_type: WordSized 707 operands: 708 left: WordSized 709 right: WordSized 710 num_temps: 2 711 mir_op: Compare 712 713 - name: CompareBigIntDouble 714 result_type: WordSized 715 operands: 716 left: WordSized 717 right: WordSized 718 call_instruction: true 719 mir_op: Compare 720 721 - name: CompareBigIntString 722 result_type: WordSized 723 operands: 724 left: WordSized 725 right: WordSized 726 call_instruction: true 727 mir_op: Compare 728 729 - name: CompareBigIntInt32AndBranch 730 successors: [ifTrue, ifFalse] 731 operands: 732 left: WordSized 733 right: WordSized 734 arguments: 735 cmpMir: MCompare* 736 num_temps: 2 737 738 # Fused Test and StrictConstantCompareInt32. 739 - name: StrictConstantCompareInt32AndBranch 740 successors: [ifTrue, ifFalse] 741 operands: 742 value: BoxedValue 743 arguments: 744 cmpMir: MStrictConstantCompareInt32* 745 mir_op: Test 746 extra_name: true 747 748 # Fused Test and StrictConstantCompareBoolean. 749 - name: StrictConstantCompareBooleanAndBranch 750 successors: [ifTrue, ifFalse] 751 operands: 752 value: BoxedValue 753 arguments: 754 cmpMir: MStrictConstantCompareBoolean* 755 mir_op: Test 756 extra_name: true 757 758 - name: BitAndAndBranch 759 successors: [ifTrue, ifFalse] 760 operands: 761 left: WordSized 762 right: WordSized 763 arguments: 764 cond: Assembler::Condition 765 766 - name: BitAnd64AndBranch 767 successors: [ifTrue, ifFalse] 768 operands: 769 left: Int64 770 right: Int64 771 arguments: 772 cond: Assembler::Condition 773 774 # Takes a value and tests whether it is null, undefined, or is an object that 775 # emulates |undefined|, as determined by the JSCLASS_EMULATES_UNDEFINED class 776 # flag on unwrapped objects. See also js::EmulatesUndefined. 777 - name: IsNullOrLikeUndefinedV 778 result_type: WordSized 779 operands: 780 value: BoxedValue 781 num_temps: 1 782 mir_op: Compare 783 784 # Takes an object pointer and tests whether it is an object that emulates 785 # |undefined|, as above. 786 - name: IsNullOrLikeUndefinedT 787 result_type: WordSized 788 operands: 789 input: WordSized 790 mir_op: Compare 791 792 # Takes a value and tests whether it is null. 793 - name: IsNull 794 result_type: WordSized 795 operands: 796 value: BoxedValue 797 mir_op: Compare 798 799 # Takes a value and tests whether it is undefined. 800 - name: IsUndefined 801 result_type: WordSized 802 operands: 803 value: BoxedValue 804 mir_op: Compare 805 806 - name: IsNullOrLikeUndefinedAndBranchV 807 successors: [ifTrue, ifFalse] 808 operands: 809 value: BoxedValue 810 arguments: 811 cmpMir: MCompare* 812 num_temps: 2 813 mir_op: Test 814 815 - name: IsNullOrLikeUndefinedAndBranchT 816 successors: [ifTrue, ifFalse] 817 operands: 818 value: WordSized 819 arguments: 820 cmpMir: MCompare* 821 num_temps: 1 822 mir_op: Test 823 824 - name: IsNullAndBranch 825 successors: [ifTrue, ifFalse] 826 operands: 827 value: BoxedValue 828 arguments: 829 cmpMir: MCompare* 830 831 - name: IsUndefinedAndBranch 832 successors: [ifTrue, ifFalse] 833 operands: 834 value: BoxedValue 835 arguments: 836 cmpMir: MCompare* 837 838 # Not operation on an integer. 839 - name: NotI 840 result_type: WordSized 841 operands: 842 input: WordSized 843 844 # Not operation on an intptr. 845 - name: NotIPtr 846 result_type: WordSized 847 operands: 848 input: WordSized 849 850 # Not operation on an int64. 851 - name: NotI64 852 result_type: WordSized 853 operands: 854 inputI64: Int64 855 856 # Not operation on a double. 857 - name: NotD 858 result_type: WordSized 859 operands: 860 input: WordSized 861 mir_op: Not 862 863 # Not operation on a float32. 864 - name: NotF 865 result_type: WordSized 866 operands: 867 input: WordSized 868 mir_op: Not 869 870 # Not operation on a BigInt. 871 - name: NotBI 872 result_type: WordSized 873 operands: 874 input: WordSized 875 mir_op: Not 876 877 # Boolean complement operation on an object. 878 - name: NotO 879 result_type: WordSized 880 operands: 881 input: WordSized 882 mir_op: Not 883 884 # Boolean complement operation on a value. 885 - name: NotV 886 result_type: WordSized 887 operands: 888 input: BoxedValue 889 num_temps: 2 890 mir_op: Not 891 892 # Bitwise not operation, takes a 32-bit integer as input and returning 893 # a 32-bit integer result as an output. 894 - name: BitNotI 895 result_type: WordSized 896 operands: 897 input: WordSized 898 defer_init: true 899 900 - name: BitNotI64 901 result_type: Int64 902 operands: 903 input: Int64 904 defer_init: true 905 906 # Binary bitwise operation, taking two 32-bit integers as inputs and returning 907 # a 32-bit integer result as an output. 908 - name: BitOpI 909 result_type: WordSized 910 operands: 911 lhs: WordSized 912 rhs: WordSized 913 arguments: 914 bitop: JSOp 915 extra_name: true 916 defer_init: true 917 918 - name: BitOpI64 919 result_type: Int64 920 operands: 921 lhs: Int64 922 rhs: Int64 923 arguments: 924 bitop: JSOp 925 extra_name: true 926 defer_init: true 927 928 # Shift operation, taking two 32-bit integers as inputs and returning 929 # a 32-bit integer result as an output. 930 - name: ShiftI 931 result_type: WordSized 932 operands: 933 lhs: WordSized 934 rhs: WordSized 935 arguments: 936 bitop: JSOp 937 mir_op: Instruction 938 extra_name: true 939 defer_init: true 940 941 - name: ShiftIntPtr 942 result_type: WordSized 943 operands: 944 lhs: WordSized 945 rhs: WordSized 946 arguments: 947 bitop: JSOp 948 mir_op: Instruction 949 extra_name: true 950 defer_init: true 951 952 - name: ShiftI64 953 result_type: Int64 954 operands: 955 lhs: Int64 956 rhs: WordSized 957 arguments: 958 bitop: JSOp 959 mir_op: Instruction 960 extra_name: true 961 defer_init: true 962 963 - name: SignExtendInt32 964 result_type: WordSized 965 operands: 966 input: WordSized 967 mir_op: true 968 969 - name: SignExtendIntPtr 970 result_type: WordSized 971 operands: 972 input: WordSized 973 mir_op: true 974 975 - name: SignExtendInt64 976 result_type: Int64 977 operands: 978 input: Int64 979 mir_op: true 980 981 - name: UrshD 982 result_type: WordSized 983 operands: 984 lhs: WordSized 985 rhs: WordSized 986 num_temps: 1 987 988 - name: Return 989 gen_boilerplate: false 990 991 - name: MinMaxI 992 result_type: WordSized 993 operands: 994 first: WordSized 995 second: WordSized 996 mir_op: MinMax 997 extra_name: true 998 999 - name: MinMaxIntPtr 1000 result_type: WordSized 1001 operands: 1002 first: WordSized 1003 second: WordSized 1004 mir_op: MinMax 1005 extra_name: true 1006 1007 - name: MinMaxD 1008 result_type: WordSized 1009 operands: 1010 first: WordSized 1011 second: WordSized 1012 mir_op: MinMax 1013 extra_name: true 1014 1015 - name: MinMaxF 1016 result_type: WordSized 1017 operands: 1018 first: WordSized 1019 second: WordSized 1020 mir_op: MinMax 1021 extra_name: true 1022 1023 - name: MinMaxArrayI 1024 result_type: WordSized 1025 operands: 1026 array: WordSized 1027 num_temps: 3 1028 mir_op: MinMaxArray 1029 1030 - name: MinMaxArrayD 1031 result_type: WordSized 1032 operands: 1033 array: WordSized 1034 num_temps: 3 1035 mir_op: MinMaxArray 1036 1037 # Negative of integer 1038 - name: NegI 1039 result_type: WordSized 1040 operands: 1041 input: WordSized 1042 defer_init: true 1043 1044 # Negative of an int64 1045 - name: NegI64 1046 result_type: Int64 1047 operands: 1048 input: Int64 1049 defer_init: true 1050 1051 # Negative of double 1052 - name: NegD 1053 result_type: WordSized 1054 operands: 1055 input: WordSized 1056 defer_init: true 1057 1058 # Negative of float32 1059 - name: NegF 1060 result_type: WordSized 1061 operands: 1062 input: WordSized 1063 defer_init: true 1064 1065 # Absolute value of an integer. 1066 - name: AbsI 1067 result_type: WordSized 1068 operands: 1069 input: WordSized 1070 defer_init: true 1071 mir_op: Abs 1072 1073 # Absolute value of a double. 1074 - name: AbsD 1075 result_type: WordSized 1076 operands: 1077 input: WordSized 1078 defer_init: true 1079 1080 # Absolute value of a float32. 1081 - name: AbsF 1082 result_type: WordSized 1083 operands: 1084 input: WordSized 1085 defer_init: true 1086 1087 # Copysign for doubles. 1088 - name: CopySignD 1089 result_type: WordSized 1090 operands: 1091 lhs: WordSized 1092 rhs: WordSized 1093 defer_init: true 1094 1095 # Copysign for float32. 1096 - name: CopySignF 1097 result_type: WordSized 1098 operands: 1099 lhs: WordSized 1100 rhs: WordSized 1101 defer_init: true 1102 1103 # Count leading zeroes on an int32. 1104 - name: ClzI 1105 result_type: WordSized 1106 operands: 1107 input: WordSized 1108 mir_op: Clz 1109 1110 # Count leading zeroes on an int64. 1111 - name: ClzI64 1112 result_type: Int64 1113 operands: 1114 input: Int64 1115 mir_op: Clz 1116 1117 # Count trailing zeroes on an int32. 1118 - name: CtzI 1119 result_type: WordSized 1120 operands: 1121 input: WordSized 1122 mir_op: Ctz 1123 1124 # Count trailing zeroes on an int64. 1125 - name: CtzI64 1126 result_type: Int64 1127 operands: 1128 input: Int64 1129 mir_op: Ctz 1130 1131 # Count population on an int32. 1132 - name: PopcntI 1133 result_type: WordSized 1134 operands: 1135 input: WordSized 1136 num_temps: 1 1137 mir_op: Popcnt 1138 1139 # Count population on an int64. 1140 - name: PopcntI64 1141 result_type: Int64 1142 operands: 1143 input: Int64 1144 num_temps: 1 1145 mir_op: Popcnt 1146 1147 - name: SqrtD 1148 result_type: WordSized 1149 operands: 1150 input: WordSized 1151 1152 - name: SqrtF 1153 result_type: WordSized 1154 operands: 1155 input: WordSized 1156 1157 - name: Atan2D 1158 result_type: WordSized 1159 operands: 1160 y: WordSized 1161 x: WordSized 1162 call_instruction: true 1163 1164 - name: Hypot 1165 gen_boilerplate: false 1166 1167 # Double raised to an integer power. 1168 - name: PowI 1169 result_type: WordSized 1170 operands: 1171 value: WordSized 1172 power: WordSized 1173 call_instruction: true 1174 1175 # Integer raised to an integer power. 1176 - name: PowII 1177 result_type: WordSized 1178 operands: 1179 value: WordSized 1180 power: WordSized 1181 num_temps: 2 1182 mir_op: Pow 1183 1184 # Double raised to a double power. 1185 - name: PowD 1186 result_type: WordSized 1187 operands: 1188 value: WordSized 1189 power: WordSized 1190 call_instruction: true 1191 1192 # Constant of a power of two raised to an integer power. 1193 - name: PowOfTwoI 1194 result_type: WordSized 1195 operands: 1196 power: WordSized 1197 arguments: 1198 base: uint32_t 1199 1200 # Sign value of an integer. 1201 - name: SignI 1202 result_type: WordSized 1203 operands: 1204 input: WordSized 1205 1206 # Sign value of an integer. 1207 - name: SignD 1208 result_type: WordSized 1209 operands: 1210 input: WordSized 1211 1212 # Sign value of a double with expected int32 result. 1213 - name: SignDI 1214 result_type: WordSized 1215 operands: 1216 input: WordSized 1217 num_temps: 1 1218 1219 # Sign value of a int32 with expected double result. 1220 - name: SignID 1221 result_type: WordSized 1222 operands: 1223 input: WordSized 1224 num_temps: 1 1225 1226 - name: MathFunctionD 1227 result_type: WordSized 1228 operands: 1229 input: WordSized 1230 call_instruction: true 1231 mir_op: MathFunction 1232 extra_name: true 1233 1234 - name: MathFunctionF 1235 result_type: WordSized 1236 operands: 1237 input: WordSized 1238 call_instruction: true 1239 mir_op: MathFunction 1240 extra_name: true 1241 1242 - name: AddI 1243 gen_boilerplate: false 1244 1245 - name: AddI64 1246 result_type: Int64 1247 operands: 1248 lhs: Int64 1249 rhs: Int64 1250 defer_init: true 1251 1252 - name: AddIntPtr 1253 result_type: WordSized 1254 operands: 1255 lhs: WordSized 1256 rhs: WordSized 1257 defer_init: true 1258 1259 - name: SubI 1260 gen_boilerplate: false 1261 1262 - name: SubI64 1263 result_type: Int64 1264 operands: 1265 lhs: Int64 1266 rhs: Int64 1267 defer_init: true 1268 1269 - name: SubIntPtr 1270 result_type: WordSized 1271 operands: 1272 lhs: WordSized 1273 rhs: WordSized 1274 defer_init: true 1275 1276 - name: MulI64 1277 result_type: Int64 1278 operands: 1279 lhs: Int64 1280 rhs: Int64 1281 #if defined(JS_CODEGEN_X86) || defined(JS_CODEGEN_ARM) 1282 num_temps: 1 1283 #endif 1284 defer_init: true 1285 1286 - name: MulIntPtr 1287 result_type: WordSized 1288 operands: 1289 lhs: WordSized 1290 rhs: WordSized 1291 defer_init: true 1292 1293 # Performs an add, sub, mul, or div on two double values. 1294 - name: MathD 1295 result_type: WordSized 1296 operands: 1297 lhs: WordSized 1298 rhs: WordSized 1299 arguments: 1300 jsop: JSOp 1301 extra_name: true 1302 defer_init: true 1303 1304 # Performs an add, sub, mul, or div on two float values. 1305 - name: MathF 1306 result_type: WordSized 1307 operands: 1308 lhs: WordSized 1309 rhs: WordSized 1310 arguments: 1311 jsop: JSOp 1312 extra_name: true 1313 defer_init: true 1314 1315 - name: ModD 1316 result_type: WordSized 1317 operands: 1318 lhs: WordSized 1319 rhs: WordSized 1320 call_instruction: true 1321 mir_op: Mod 1322 1323 - name: ModPowTwoD 1324 result_type: WordSized 1325 operands: 1326 lhs: WordSized 1327 arguments: 1328 divisor: uint32_t 1329 mir_op: Mod 1330 1331 - name: WasmBuiltinModD 1332 result_type: WordSized 1333 operands: 1334 lhs: WordSized 1335 rhs: WordSized 1336 instance: WordSized 1337 call_instruction: true 1338 mir_op: true 1339 1340 - name: BigIntAdd 1341 result_type: WordSized 1342 operands: 1343 lhs: WordSized 1344 rhs: WordSized 1345 call_instruction: true 1346 mir_op: true 1347 1348 - name: BigIntSub 1349 result_type: WordSized 1350 operands: 1351 lhs: WordSized 1352 rhs: WordSized 1353 call_instruction: true 1354 mir_op: true 1355 1356 - name: BigIntMul 1357 result_type: WordSized 1358 operands: 1359 lhs: WordSized 1360 rhs: WordSized 1361 call_instruction: true 1362 mir_op: true 1363 1364 - name: BigIntDiv 1365 result_type: WordSized 1366 operands: 1367 lhs: WordSized 1368 rhs: WordSized 1369 call_instruction: true 1370 mir_op: true 1371 1372 - name: BigIntMod 1373 result_type: WordSized 1374 operands: 1375 lhs: WordSized 1376 rhs: WordSized 1377 call_instruction: true 1378 mir_op: true 1379 1380 - name: BigIntPow 1381 result_type: WordSized 1382 operands: 1383 lhs: WordSized 1384 rhs: WordSized 1385 call_instruction: true 1386 mir_op: true 1387 1388 - name: BigIntBitAnd 1389 result_type: WordSized 1390 operands: 1391 lhs: WordSized 1392 rhs: WordSized 1393 call_instruction: true 1394 mir_op: true 1395 1396 - name: BigIntBitOr 1397 result_type: WordSized 1398 operands: 1399 lhs: WordSized 1400 rhs: WordSized 1401 call_instruction: true 1402 mir_op: true 1403 1404 - name: BigIntBitXor 1405 result_type: WordSized 1406 operands: 1407 lhs: WordSized 1408 rhs: WordSized 1409 call_instruction: true 1410 mir_op: true 1411 1412 - name: BigIntLsh 1413 result_type: WordSized 1414 operands: 1415 lhs: WordSized 1416 rhs: WordSized 1417 call_instruction: true 1418 mir_op: true 1419 1420 - name: BigIntRsh 1421 result_type: WordSized 1422 operands: 1423 lhs: WordSized 1424 rhs: WordSized 1425 call_instruction: true 1426 mir_op: true 1427 1428 - name: BigIntIncrement 1429 result_type: WordSized 1430 operands: 1431 input: WordSized 1432 call_instruction: true 1433 mir_op: true 1434 1435 - name: BigIntDecrement 1436 result_type: WordSized 1437 operands: 1438 input: WordSized 1439 call_instruction: true 1440 mir_op: true 1441 1442 - name: BigIntNegate 1443 result_type: WordSized 1444 operands: 1445 input: WordSized 1446 num_temps: 1 1447 mir_op: true 1448 1449 - name: BigIntBitNot 1450 result_type: WordSized 1451 operands: 1452 input: WordSized 1453 call_instruction: true 1454 mir_op: true 1455 1456 - name: BigIntPtrAdd 1457 result_type: WordSized 1458 operands: 1459 lhs: WordSized 1460 rhs: WordSized 1461 mir_op: true 1462 1463 - name: BigIntPtrSub 1464 result_type: WordSized 1465 operands: 1466 lhs: WordSized 1467 rhs: WordSized 1468 mir_op: true 1469 1470 - name: BigIntPtrMul 1471 result_type: WordSized 1472 operands: 1473 lhs: WordSized 1474 rhs: WordSized 1475 mir_op: true 1476 1477 - name: BigIntPtrDiv 1478 result_type: WordSized 1479 operands: 1480 lhs: WordSized 1481 rhs: WordSized 1482 num_temps: 2 1483 mir_op: true 1484 1485 - name: BigIntPtrDivPowTwo 1486 result_type: WordSized 1487 operands: 1488 lhs: WordSized 1489 arguments: 1490 shift: int32_t 1491 negativeDivisor: bool 1492 1493 - name: BigIntPtrMod 1494 result_type: WordSized 1495 operands: 1496 lhs: WordSized 1497 rhs: WordSized 1498 num_temps: 2 1499 mir_op: true 1500 1501 - name: BigIntPtrModPowTwo 1502 result_type: WordSized 1503 operands: 1504 lhs: WordSized 1505 arguments: 1506 shift: int32_t 1507 num_temps: 1 1508 1509 - name: BigIntPtrPow 1510 result_type: WordSized 1511 operands: 1512 lhs: WordSized 1513 rhs: WordSized 1514 num_temps: 2 1515 mir_op: true 1516 1517 - name: BigIntPtrBitAnd 1518 result_type: WordSized 1519 operands: 1520 lhs: WordSized 1521 rhs: WordSized 1522 mir_op: true 1523 1524 - name: BigIntPtrBitOr 1525 result_type: WordSized 1526 operands: 1527 lhs: WordSized 1528 rhs: WordSized 1529 mir_op: true 1530 1531 - name: BigIntPtrBitXor 1532 result_type: WordSized 1533 operands: 1534 lhs: WordSized 1535 rhs: WordSized 1536 mir_op: true 1537 1538 - name: BigIntPtrLsh 1539 result_type: WordSized 1540 operands: 1541 lhs: WordSized 1542 rhs: WordSized 1543 num_temps: 2 1544 mir_op: true 1545 1546 - name: BigIntPtrRsh 1547 result_type: WordSized 1548 operands: 1549 lhs: WordSized 1550 rhs: WordSized 1551 num_temps: 2 1552 mir_op: true 1553 1554 - name: BigIntPtrBitNot 1555 result_type: WordSized 1556 operands: 1557 input: WordSized 1558 mir_op: true 1559 1560 # Adds two string, returning a string. 1561 - name: Concat 1562 result_type: WordSized 1563 operands: 1564 lhs: WordSized 1565 rhs: WordSized 1566 num_temps: 5 1567 1568 # Test if a string includes the constant search string. 1569 - name: StringIncludesSIMD 1570 result_type: WordSized 1571 operands: 1572 string: WordSized 1573 arguments: 1574 searchString: JSOffThreadAtom* 1575 num_temps: 3 1576 1577 # Search for the first index of the constant search string. 1578 - name: StringIndexOfSIMD 1579 result_type: WordSized 1580 operands: 1581 string: WordSized 1582 arguments: 1583 searchString: JSOffThreadAtom* 1584 num_temps: 3 1585 1586 # Test if a string starts with the constant search string 1587 - name: StringStartsWithInline 1588 result_type: WordSized 1589 operands: 1590 string: WordSized 1591 arguments: 1592 searchString: JSOffThreadAtom* 1593 num_temps: 1 1594 1595 # Test if a string ends with the constant search string 1596 - name: StringEndsWithInline 1597 result_type: WordSized 1598 operands: 1599 string: WordSized 1600 arguments: 1601 searchString: JSOffThreadAtom* 1602 num_temps: 1 1603 1604 # Calls the ToLowerCase case conversion function. Inlines the case conversion 1605 # when possible. 1606 - name: StringToLowerCase 1607 result_type: WordSized 1608 operands: 1609 string: WordSized 1610 num_temps: 5 1611 mir_op: StringConvertCase 1612 1613 # Calls the ToLowerCase case conversion function. Inlines the case conversion 1614 # when possible. 1615 - name: CharCodeToLowerCase 1616 result_type: WordSized 1617 operands: 1618 code: WordSized 1619 num_temps: 1 1620 mir_op: CharCodeConvertCase 1621 1622 # Calls the ToUpperCase case conversion function. 1623 - name: StringToUpperCase 1624 result_type: WordSized 1625 operands: 1626 string: WordSized 1627 call_instruction: true 1628 mir_op: StringConvertCase 1629 1630 # Calls the ToUpperCase case conversion function. Inlines the case conversion 1631 # when possible. 1632 - name: CharCodeToUpperCase 1633 result_type: WordSized 1634 operands: 1635 code: WordSized 1636 num_temps: 1 1637 mir_op: CharCodeConvertCase 1638 1639 - name: Int32ToDouble 1640 result_type: WordSized 1641 operands: 1642 input: WordSized 1643 1644 - name: Float32ToDouble 1645 result_type: WordSized 1646 operands: 1647 input: WordSized 1648 1649 - name: DoubleToFloat32 1650 result_type: WordSized 1651 operands: 1652 input: WordSized 1653 1654 - name: Int32ToFloat32 1655 result_type: WordSized 1656 operands: 1657 input: WordSized 1658 1659 - name: DoubleToFloat16 1660 result_type: WordSized 1661 operands: 1662 input: WordSized 1663 num_temps: 1 1664 1665 - name: DoubleToFloat32ToFloat16 1666 result_type: WordSized 1667 operands: 1668 input: WordSized 1669 num_temps: 2 1670 1671 - name: Float32ToFloat16 1672 result_type: WordSized 1673 operands: 1674 input: WordSized 1675 num_temps: 1 1676 1677 - name: Int32ToFloat16 1678 result_type: WordSized 1679 operands: 1680 input: WordSized 1681 num_temps: 1 1682 1683 # Convert a value to a double. 1684 - name: ValueToDouble 1685 result_type: WordSized 1686 operands: 1687 input: BoxedValue 1688 mir_op: ToDouble 1689 1690 # Convert a value to a float32. 1691 - name: ValueToFloat32 1692 result_type: WordSized 1693 operands: 1694 input: BoxedValue 1695 mir_op: ToFloat32 1696 1697 # Convert a value to a float16. 1698 - name: ValueToFloat16 1699 result_type: WordSized 1700 operands: 1701 input: BoxedValue 1702 num_temps: 1 1703 mir_op: ToFloat16 1704 1705 # Convert a value to an int32. 1706 - name: ValueToNumberInt32 1707 result_type: WordSized 1708 operands: 1709 input: BoxedValue 1710 num_temps: 1 1711 mir_op: ToNumberInt32 1712 1713 # Convert a value to an int32 with truncation. 1714 - name: ValueTruncateToInt32 1715 result_type: WordSized 1716 operands: 1717 input: BoxedValue 1718 num_temps: 2 1719 mir_op: TruncateToInt32 1720 1721 # Convert a value to a BigInt. 1722 - name: ValueToBigInt 1723 result_type: WordSized 1724 operands: 1725 input: BoxedValue 1726 mir_op: ToBigInt 1727 1728 # Convert a double to an int32. 1729 # Input: floating-point Register 1730 # Output: 32-bit integer 1731 # Bailout: if the double cannot be converted to an integer. 1732 - name: DoubleToInt32 1733 result_type: WordSized 1734 operands: 1735 input: WordSized 1736 mir_op: ToNumberInt32 1737 1738 # Convert a float32 to an int32. 1739 # Input: floating-point Register 1740 # Output: 32-bit integer 1741 # Bailout: if the float32 cannot be converted to an integer. 1742 - name: Float32ToInt32 1743 result_type: WordSized 1744 operands: 1745 input: WordSized 1746 mir_op: ToNumberInt32 1747 1748 # Convert a double to a truncated int32. 1749 # Input: floating-point Register 1750 # Output: 32-bit integer 1751 - name: TruncateDToInt32 1752 result_type: WordSized 1753 operands: 1754 input: WordSized 1755 num_temps: 1 1756 mir_op: TruncateToInt32 1757 1758 # Convert a double to a truncated int32 with instance offset because we need it 1759 # for the slow ool path. 1760 - name: WasmBuiltinTruncateDToInt32 1761 result_type: WordSized 1762 operands: 1763 input: WordSized 1764 instance: WordSized 1765 num_temps: 1 1766 mir_op: WasmBuiltinTruncateToInt32 1767 1768 # Convert a float32 to a truncated int32. 1769 # Input: floating-point Register 1770 # Output: 32-bit integer 1771 - name: TruncateFToInt32 1772 result_type: WordSized 1773 operands: 1774 input: WordSized 1775 num_temps: 1 1776 mir_op: TruncateToInt32 1777 1778 # Convert a float32 to a truncated int32 with instance offset because we need 1779 # it for the slow ool path. 1780 - name: WasmBuiltinTruncateFToInt32 1781 result_type: WordSized 1782 operands: 1783 input: WordSized 1784 instance: WordSized 1785 num_temps: 1 1786 mir_op: WasmBuiltinTruncateToInt32 1787 1788 - name: WasmTruncateToInt32 1789 result_type: WordSized 1790 operands: 1791 input: WordSized 1792 mir_op: true 1793 1794 - name: WrapInt64ToInt32 1795 result_type: WordSized 1796 operands: 1797 input: Int64 1798 mir_op: true 1799 1800 - name: ExtendInt32ToInt64 1801 result_type: Int64 1802 operands: 1803 input: WordSized 1804 mir_op: true 1805 1806 # Convert a boolean value to a string. 1807 - name: BooleanToString 1808 result_type: WordSized 1809 operands: 1810 input: WordSized 1811 mir_op: ToString 1812 1813 # Convert an integer hosted on one definition to a string with a function call. 1814 - name: IntToString 1815 result_type: WordSized 1816 operands: 1817 input: WordSized 1818 mir_op: ToString 1819 1820 # Convert a double hosted on one definition to a string with a function call. 1821 - name: DoubleToString 1822 result_type: WordSized 1823 operands: 1824 input: WordSized 1825 num_temps: 1 1826 mir_op: ToString 1827 1828 # Convert a primitive to a string with a function call. 1829 - name: ValueToString 1830 result_type: WordSized 1831 operands: 1832 input: BoxedValue 1833 num_temps: 1 1834 mir_op: ToString 1835 1836 # Double raised to a half power. 1837 - name: PowHalfD 1838 result_type: WordSized 1839 operands: 1840 input: WordSized 1841 mir_op: PowHalf 1842 1843 - name: NaNToZero 1844 result_type: WordSized 1845 operands: 1846 input: WordSized 1847 num_temps: 1 1848 mir_op: true 1849 1850 - name: OsrEntry 1851 gen_boilerplate: false 1852 1853 # Materialize a Value stored in an interpreter frame for OSR. 1854 - name: OsrValue 1855 result_type: BoxedValue 1856 operands: 1857 entry: WordSized 1858 mir_op: true 1859 1860 # Materialize a JSObject env chain stored in an interpreter frame for OSR. 1861 - name: OsrEnvironmentChain 1862 result_type: WordSized 1863 operands: 1864 entry: WordSized 1865 mir_op: true 1866 1867 # Materialize a JSObject env chain stored in an interpreter frame for OSR. 1868 - name: OsrReturnValue 1869 result_type: BoxedValue 1870 operands: 1871 entry: WordSized 1872 mir_op: true 1873 1874 - name: OsrArgumentsObject 1875 result_type: WordSized 1876 operands: 1877 entry: WordSized 1878 mir_op: true 1879 1880 - name: RegExp 1881 result_type: WordSized 1882 num_temps: 1 1883 mir_op: true 1884 1885 - name: RegExpHasCaptureGroups 1886 result_type: WordSized 1887 operands: 1888 regexp: WordSized 1889 input: WordSized 1890 mir_op: true 1891 1892 - name: GetFirstDollarIndex 1893 result_type: WordSized 1894 operands: 1895 str: WordSized 1896 num_temps: 3 1897 1898 - name: StringReplace 1899 result_type: WordSized 1900 operands: 1901 string: WordSized 1902 pattern: WordSized 1903 replacement: WordSized 1904 call_instruction: true 1905 mir_op: true 1906 1907 - name: BinaryValueCache 1908 result_type: BoxedValue 1909 operands: 1910 lhs: BoxedValue 1911 rhs: BoxedValue 1912 # Takes two temps: these are intended to be FloatReg0 and FloatReg1 1913 # to allow the actual cache code to safely clobber those values without 1914 # save and restore. 1915 num_temps: 2 1916 mir_op: BinaryCache 1917 1918 - name: BinaryBoolCache 1919 result_type: WordSized 1920 operands: 1921 lhs: BoxedValue 1922 rhs: BoxedValue 1923 # Takes two temps: these are intendend to be FloatReg0 and FloatReg1 1924 # To allow the actual cache code to safely clobber those values without 1925 # save and restore. 1926 num_temps: 2 1927 mir_op: BinaryCache 1928 1929 - name: Lambda 1930 result_type: WordSized 1931 operands: 1932 environmentChain: WordSized 1933 num_temps: 1 1934 mir_op: true 1935 1936 - name: FunctionWithProto 1937 result_type: WordSized 1938 operands: 1939 envChain: WordSized 1940 prototype: WordSized 1941 call_instruction: true 1942 mir_op: true 1943 1944 - name: GetNextEntryForIterator 1945 result_type: WordSized 1946 operands: 1947 iter: WordSized 1948 result: WordSized 1949 num_temps: 3 1950 mir_op: true 1951 1952 # Double to IntPtr, eligible for accessing into a TypedArray or DataView. If 1953 # the index isn't exactly representable as an IntPtr, depending on the 1954 # supportOOB flag on the MIR instruction, either bail out or produce an IntPtr 1955 # which is equivalent to an OOB access. 1956 - name: GuardNumberToIntPtrIndex 1957 result_type: WordSized 1958 operands: 1959 input: WordSized 1960 mir_op: true 1961 1962 # Bailout if index >= length. 1963 - name: BoundsCheck 1964 operands: 1965 index: WordSized 1966 length: WordSized 1967 mir_op: true 1968 1969 # Bailout if index + minimum < 0 or index + maximum >= length. 1970 - name: BoundsCheckRange 1971 operands: 1972 index: WordSized 1973 length: WordSized 1974 num_temps: 1 1975 mir_op: BoundsCheck 1976 1977 # Bailout if index < minimum. 1978 - name: BoundsCheckLower 1979 operands: 1980 index: WordSized 1981 mir_op: true 1982 1983 - name: SpectreMaskIndex 1984 result_type: WordSized 1985 operands: 1986 index: WordSized 1987 length: WordSized 1988 mir_op: true 1989 1990 # Load a value from a dense array's elements vector. Bail out if it's the hole 1991 # value. 1992 - name: LoadElementV 1993 result_type: BoxedValue 1994 operands: 1995 elements: WordSized 1996 index: WordSized 1997 mir_op: LoadElement 1998 1999 - name: InArray 2000 result_type: WordSized 2001 operands: 2002 elements: WordSized 2003 index: WordSized 2004 initLength: WordSized 2005 mir_op: true 2006 2007 - name: GuardElementNotHole 2008 operands: 2009 elements: WordSized 2010 index: WordSized 2011 2012 # Load a value from an array's elements vector, loading |undefined| if we hit a 2013 # hole. Bail out if we get a negative index. 2014 - name: LoadElementHole 2015 result_type: BoxedValue 2016 operands: 2017 elements: WordSized 2018 index: WordSized 2019 initLength: WordSized 2020 mir_op: true 2021 2022 # Store a boxed value to a dense array's element vector. 2023 - name: StoreElementV 2024 operands: 2025 elements: WordSized 2026 index: WordSized 2027 value: BoxedValue 2028 mir_op: StoreElement 2029 extra_name: true 2030 2031 # Store a typed value to a dense array's elements vector. Compared to 2032 # LStoreElementV, this instruction can store doubles and constants directly, 2033 # and does not store the type tag if the array is monomorphic and known to 2034 # be packed. 2035 - name: StoreElementT 2036 operands: 2037 elements: WordSized 2038 index: WordSized 2039 value: WordSized 2040 mir_op: StoreElement 2041 extra_name: true 2042 2043 - name: StoreHoleValueElement 2044 operands: 2045 elements: WordSized 2046 index: WordSized 2047 2048 # Like LStoreElementV, but supports indexes >= initialized length. 2049 - name: StoreElementHoleV 2050 operands: 2051 object: WordSized 2052 elements: WordSized 2053 index: WordSized 2054 value: BoxedValue 2055 num_temps: 1 2056 mir_op: StoreElementHole 2057 2058 # Like LStoreElementT, but supports indexes >= initialized length. 2059 - name: StoreElementHoleT 2060 operands: 2061 object: WordSized 2062 elements: WordSized 2063 index: WordSized 2064 value: WordSized 2065 num_temps: 1 2066 mir_op: StoreElementHole 2067 2068 - name: ArrayPopShift 2069 result_type: BoxedValue 2070 operands: 2071 object: WordSized 2072 num_temps: 2 2073 mir_op: true 2074 extra_name: true 2075 2076 - name: FrameArgumentsSlice 2077 result_type: WordSized 2078 operands: 2079 begin: WordSized 2080 count: WordSized 2081 num_temps: 1 2082 mir_op: true 2083 2084 - name: InlineArgumentsSlice 2085 gen_boilerplate: false 2086 2087 - name: LoadUnboxedScalar 2088 result_type: WordSized 2089 operands: 2090 elements: WordSized 2091 index: WordSized 2092 num_temps: 2 2093 mir_op: true 2094 2095 - name: LoadUnboxedInt64 2096 result_type: Int64 2097 operands: 2098 elements: WordSized 2099 index: WordSized 2100 mir_op: LoadUnboxedScalar 2101 2102 - name: LoadDataViewElement 2103 result_type: WordSized 2104 operands: 2105 elements: WordSized 2106 index: WordSized 2107 littleEndian: WordSized 2108 num_temps: 2 2109 num_temps64: 1 2110 mir_op: true 2111 2112 - name: LoadDataViewElement64 2113 result_type: Int64 2114 operands: 2115 elements: WordSized 2116 index: WordSized 2117 littleEndian: WordSized 2118 mir_op: LoadDataViewElement 2119 2120 - name: LoadTypedArrayElementHole 2121 result_type: BoxedValue 2122 operands: 2123 elements: WordSized 2124 index: WordSized 2125 length: WordSized 2126 num_temps: 1 2127 mir_op: true 2128 2129 - name: LoadTypedArrayElementHoleBigInt 2130 result_type: BoxedValue 2131 operands: 2132 elements: WordSized 2133 index: WordSized 2134 length: WordSized 2135 num_temps: 1 2136 num_temps64: 1 2137 mir_op: LoadTypedArrayElementHole 2138 2139 - name: StoreUnboxedScalar 2140 operands: 2141 elements: WordSized 2142 index: WordSized 2143 value: WordSized 2144 num_temps: 1 2145 mir_op: true 2146 2147 - name: StoreUnboxedInt64 2148 operands: 2149 elements: WordSized 2150 index: WordSized 2151 value: Int64 2152 mir_op: StoreUnboxedScalar 2153 2154 - name: StoreDataViewElement 2155 operands: 2156 elements: WordSized 2157 index: WordSized 2158 value: WordSized 2159 littleEndian: WordSized 2160 num_temps: 1 2161 num_temps64: 1 2162 mir_op: true 2163 2164 - name: StoreDataViewElement64 2165 operands: 2166 elements: WordSized 2167 index: WordSized 2168 value: Int64 2169 littleEndian: WordSized 2170 num_temps64: 1 2171 mir_op: StoreDataViewElement 2172 2173 - name: StoreTypedArrayElementHole 2174 operands: 2175 elements: WordSized 2176 length: WordSized 2177 index: WordSized 2178 value: WordSized 2179 num_temps: 1 2180 mir_op: true 2181 2182 - name: StoreTypedArrayElementHoleInt64 2183 operands: 2184 elements: WordSized 2185 length: WordSized 2186 index: WordSized 2187 value: Int64 2188 num_temps: 1 2189 mir_op: StoreTypedArrayElementHole 2190 2191 - name: TypedArraySubarray 2192 result_type: WordSized 2193 operands: 2194 object: WordSized 2195 start: WordSized 2196 length: WordSized 2197 call_instruction: true 2198 mir_op: true 2199 2200 - name: TypedArrayFill 2201 operands: 2202 object: WordSized 2203 value: WordSized 2204 start: WordSized 2205 end: WordSized 2206 call_instruction: true 2207 mir_op: true 2208 2209 - name: TypedArrayFill64 2210 operands: 2211 object: WordSized 2212 value: Int64 2213 start: WordSized 2214 end: WordSized 2215 call_instruction: true 2216 mir_op: TypedArrayFill 2217 2218 - name: AtomicIsLockFree 2219 result_type: WordSized 2220 operands: 2221 value: WordSized 2222 2223 - name: CompareExchangeTypedArrayElement 2224 result_type: WordSized 2225 operands: 2226 elements: WordSized 2227 index: WordSized 2228 oldval: WordSized 2229 newval: WordSized 2230 # Needs additional temps on LL/SC platforms to extract/insert bits of word. 2231 #if defined(JS_CODEGEN_MIPS64) || defined(JS_CODEGEN_LOONG64) || defined(JS_CODEGEN_RISCV64) 2232 num_temps: 4 2233 #else 2234 num_temps: 1 2235 #endif 2236 mir_op: true 2237 2238 - name: AtomicExchangeTypedArrayElement 2239 result_type: WordSized 2240 operands: 2241 elements: WordSized 2242 index: WordSized 2243 value: WordSized 2244 # Needs additional temps on LL/SC platforms to extract/insert bits of word. 2245 #if defined(JS_CODEGEN_MIPS64) || defined(JS_CODEGEN_LOONG64) || defined(JS_CODEGEN_RISCV64) 2246 num_temps: 4 2247 #else 2248 num_temps: 1 2249 #endif 2250 mir_op: true 2251 2252 - name: AtomicTypedArrayElementBinop 2253 result_type: WordSized 2254 operands: 2255 elements: WordSized 2256 index: WordSized 2257 value: WordSized 2258 # Needs additional temps on LL/SC platforms to extract/insert bits of word. 2259 #if defined(JS_CODEGEN_MIPS64) || defined(JS_CODEGEN_LOONG64) || defined(JS_CODEGEN_RISCV64) 2260 num_temps: 4 2261 #else 2262 num_temps: 2 2263 #endif 2264 mir_op: true 2265 2266 # Atomic binary operation where the result is discarded. 2267 - name: AtomicTypedArrayElementBinopForEffect 2268 operands: 2269 elements: WordSized 2270 index: WordSized 2271 value: WordSized 2272 # Additional temp that may be used on LL/SC platforms for the flag result of the store. 2273 # Needs additional temps on LL/SC platforms to extract/insert bits of word. 2274 #if defined(JS_CODEGEN_ARM) || defined(JS_CODEGEN_ARM64) 2275 num_temps: 1 2276 #elif defined(JS_CODEGEN_MIPS64) || defined(JS_CODEGEN_LOONG64) || defined(JS_CODEGEN_RISCV64) 2277 num_temps: 3 2278 #endif 2279 mir_op: AtomicTypedArrayElementBinop 2280 2281 - name: AtomicLoad64 2282 result_type: Int64 2283 operands: 2284 elements: WordSized 2285 index: WordSized 2286 #ifdef JS_CODEGEN_X86 2287 num_temps64: 1 2288 #endif 2289 mir_op: LoadUnboxedScalar 2290 2291 - name: AtomicStore64 2292 operands: 2293 elements: WordSized 2294 index: WordSized 2295 value: Int64 2296 #if defined(JS_CODEGEN_X86) || defined(JS_CODEGEN_ARM) 2297 num_temps64: 1 2298 #endif 2299 mir_op: StoreUnboxedScalar 2300 2301 - name: CompareExchangeTypedArrayElement64 2302 result_type: Int64 2303 operands: 2304 elements: WordSized 2305 index: WordSized 2306 oldval: Int64 2307 newval: Int64 2308 mir_op: CompareExchangeTypedArrayElement 2309 2310 - name: AtomicExchangeTypedArrayElement64 2311 result_type: Int64 2312 operands: 2313 elements: WordSized 2314 index: WordSized 2315 value: Int64 2316 mir_op: AtomicExchangeTypedArrayElement 2317 2318 - name: AtomicTypedArrayElementBinop64 2319 result_type: Int64 2320 operands: 2321 elements: WordSized 2322 index: WordSized 2323 value: Int64 2324 #ifndef JS_CODEGEN_X86 2325 num_temps64: 1 2326 #endif 2327 mir_op: AtomicTypedArrayElementBinop 2328 2329 # Atomic binary operation where the result is discarded. 2330 - name: AtomicTypedArrayElementBinopForEffect64 2331 operands: 2332 elements: WordSized 2333 index: WordSized 2334 value: Int64 2335 #ifndef JS_CODEGEN_X64 2336 num_temps64: 1 2337 #endif 2338 mir_op: AtomicTypedArrayElementBinop 2339 2340 - name: EffectiveAddress3 2341 result_type: WordSized 2342 operands: 2343 base: WordSized 2344 index: WordSized 2345 mir_op: true 2346 2347 - name: EffectiveAddress2 2348 result_type: WordSized 2349 operands: 2350 index: WordSized 2351 mir_op: true 2352 2353 - name: ClampIToUint8 2354 result_type: WordSized 2355 operands: 2356 input: WordSized 2357 2358 - name: ClampDToUint8 2359 result_type: WordSized 2360 operands: 2361 input: WordSized 2362 num_temps: 1 2363 2364 - name: ClampVToUint8 2365 result_type: WordSized 2366 operands: 2367 input: BoxedValue 2368 num_temps: 1 2369 mir_op: ClampToUint8 2370 2371 # Load a boxed value from an object's fixed slot. 2372 - name: LoadFixedSlotV 2373 result_type: BoxedValue 2374 operands: 2375 object: WordSized 2376 mir_op: LoadFixedSlot 2377 2378 # Load a boxed value from an object's fixed slot. 2379 # If it is a non-atom string, atomize it and update the slot. 2380 - name: LoadFixedSlotAndAtomize 2381 result_type: BoxedValue 2382 operands: 2383 object: WordSized 2384 num_temps: 1 2385 mir_op: LoadFixedSlot 2386 2387 # Load a typed value from an object's fixed slot. 2388 - name: LoadFixedSlotT 2389 result_type: WordSized 2390 operands: 2391 object: WordSized 2392 mir_op: LoadFixedSlot 2393 2394 - name: LoadFixedSlotAndUnbox 2395 result_type: WordSized 2396 operands: 2397 object: WordSized 2398 num_temps64: 1 2399 mir_op: true 2400 2401 - name: LoadDynamicSlotAndUnbox 2402 result_type: WordSized 2403 operands: 2404 slots: WordSized 2405 num_temps64: 1 2406 mir_op: true 2407 2408 - name: LoadElementAndUnbox 2409 result_type: WordSized 2410 operands: 2411 elements: WordSized 2412 index: WordSized 2413 num_temps64: 1 2414 mir_op: true 2415 2416 - name: LoadFixedSlotUnboxAndAtomize 2417 result_type: WordSized 2418 operands: 2419 object: WordSized 2420 mir_op: LoadFixedSlotAndUnbox 2421 2422 - name: LoadDynamicSlotUnboxAndAtomize 2423 result_type: WordSized 2424 operands: 2425 slots: WordSized 2426 mir_op: LoadDynamicSlotAndUnbox 2427 2428 - name: AddAndStoreSlot 2429 operands: 2430 object: WordSized 2431 value: BoxedValue 2432 num_temps: 1 2433 mir_op: true 2434 2435 - name: AddAndStoreSlotPreserveWrapper 2436 operands: 2437 object: WordSized 2438 value: BoxedValue 2439 num_temps: 2 2440 mir_op: AddAndStoreSlot 2441 2442 # Store a boxed value to an object's fixed slot. 2443 - name: StoreFixedSlotV 2444 operands: 2445 obj: WordSized 2446 value: BoxedValue 2447 mir_op: StoreFixedSlot 2448 2449 # Store a typed value to an object's fixed slot. 2450 - name: StoreFixedSlotT 2451 operands: 2452 obj: WordSized 2453 value: WordSized 2454 mir_op: StoreFixedSlot 2455 2456 - name: StoreFixedSlotFromOffsetV 2457 operands: 2458 object: WordSized 2459 offset: WordSized 2460 value: BoxedValue 2461 num_temps: 1 2462 mir_op: StoreFixedSlotFromOffset 2463 2464 - name: StoreFixedSlotFromOffsetT 2465 operands: 2466 object: WordSized 2467 offset: WordSized 2468 value: WordSized 2469 num_temps: 1 2470 mir_op: StoreFixedSlotFromOffset 2471 2472 - name: GetPropSuperCache 2473 result_type: BoxedValue 2474 operands: 2475 obj: WordSized 2476 receiver: BoxedValue 2477 id: BoxedValue 2478 mir_op: true 2479 2480 # Patchable jump to stubs generated for a GetProperty cache, which loads a 2481 # boxed value. 2482 - name: GetPropertyCache 2483 result_type: BoxedValue 2484 operands: 2485 value: BoxedValue 2486 id: BoxedValue 2487 mir_op: true 2488 2489 # Load a value from an object's dslots or a slots vector. 2490 - name: LoadDynamicSlotV 2491 result_type: BoxedValue 2492 operands: 2493 input: WordSized 2494 mir_op: LoadDynamicSlot 2495 2496 # Load a value from an object's dslots or a slots vector. 2497 # If it is a non-atom string, atomize it and update the slot. 2498 - name: LoadDynamicSlotAndAtomize 2499 result_type: BoxedValue 2500 operands: 2501 input: WordSized 2502 num_temps: 1 2503 mir_op: LoadDynamicSlot 2504 2505 # Store a value to an object's dslots or a slots vector. 2506 - name: StoreDynamicSlotV 2507 operands: 2508 slots: WordSized 2509 value: BoxedValue 2510 mir_op: StoreDynamicSlot 2511 2512 # Store a typed value to an object's dslots or a slots vector. This has a 2513 # few advantages over LStoreDynamicSlotV: 2514 # 1) We can bypass storing the type tag if the slot has the same type as 2515 # the value. 2516 # 2) Better Register allocation: we can store constants and FP regs directly 2517 # without requiring a second Register for the value. 2518 - name: StoreDynamicSlotT 2519 operands: 2520 slots: WordSized 2521 value: WordSized 2522 mir_op: StoreDynamicSlot 2523 2524 - name: StoreDynamicSlotFromOffsetV 2525 operands: 2526 slots: WordSized 2527 offset: WordSized 2528 value: BoxedValue 2529 num_temps: 1 2530 mir_op: StoreDynamicSlotFromOffset 2531 2532 - name: StoreDynamicSlotFromOffsetT 2533 operands: 2534 slots: WordSized 2535 offset: WordSized 2536 value: WordSized 2537 num_temps: 1 2538 mir_op: StoreDynamicSlotFromOffset 2539 2540 # Take the floor of a double precision number and converts it to an int32. 2541 # Implements Math.floor(). 2542 - name: Floor 2543 result_type: WordSized 2544 operands: 2545 input: WordSized 2546 2547 # Take the floor of a single precision number and converts it to an int32. 2548 # Implements Math.floor(). 2549 - name: FloorF 2550 result_type: WordSized 2551 operands: 2552 input: WordSized 2553 2554 # Take the ceiling of a double precision number and converts it to an int32. 2555 # Implements Math.ceil(). 2556 - name: Ceil 2557 result_type: WordSized 2558 operands: 2559 input: WordSized 2560 2561 # Take the ceiling of a single precision number and converts it to an int32. 2562 # Implements Math.ceil(). 2563 - name: CeilF 2564 result_type: WordSized 2565 operands: 2566 input: WordSized 2567 2568 # Round a double precision number and converts it to an int32. 2569 # Implements Math.round(). 2570 - name: Round 2571 result_type: WordSized 2572 operands: 2573 input: WordSized 2574 num_temps: 1 2575 mir_op: true 2576 2577 # Round a single precision number and converts it to an int32. 2578 # Implements Math.round(). 2579 - name: RoundF 2580 result_type: WordSized 2581 operands: 2582 input: WordSized 2583 num_temps: 1 2584 mir_op: Round 2585 2586 # Truncates a double precision number and converts it to an int32. 2587 # Implements Math.trunc(). 2588 - name: Trunc 2589 result_type: WordSized 2590 operands: 2591 input: WordSized 2592 2593 # Truncates a single precision number and converts it to an int32. 2594 # Implements Math.trunc(). 2595 - name: TruncF 2596 result_type: WordSized 2597 operands: 2598 input: WordSized 2599 2600 # Rounds a double precision number accordingly to mir()->roundingMode(), 2601 # and keeps a double output. 2602 - name: NearbyInt 2603 result_type: WordSized 2604 operands: 2605 input: WordSized 2606 mir_op: true 2607 2608 # Rounds a single precision number accordingly to mir()->roundingMode(), 2609 # and keeps a single output. 2610 - name: NearbyIntF 2611 result_type: WordSized 2612 operands: 2613 input: WordSized 2614 mir_op: NearbyInt 2615 2616 # Rounds a double precision number and keeps a double output. 2617 # Implements Math.round(). 2618 - name: RoundToDouble 2619 result_type: WordSized 2620 operands: 2621 input: WordSized 2622 mir_op: true 2623 2624 # Rounds a single precision number and keeps a single output. 2625 # Implements Math.round(). 2626 - name: RoundToFloat32 2627 result_type: WordSized 2628 operands: 2629 input: WordSized 2630 mir_op: RoundToDouble 2631 2632 - name: NewLexicalEnvironmentObject 2633 result_type: WordSized 2634 num_temps: 1 2635 mir_op: true 2636 2637 - name: NewClassBodyEnvironmentObject 2638 result_type: WordSized 2639 num_temps: 1 2640 mir_op: true 2641 2642 - name: NewVarEnvironmentObject 2643 result_type: WordSized 2644 num_temps: 1 2645 mir_op: true 2646 2647 - name: MegamorphicSetElement 2648 operands: 2649 object: WordSized 2650 index: BoxedValue 2651 value: BoxedValue 2652 # On x86 we do not have enough registers to use 3 temps for this *and* take 2653 # five words worth of operands. Since it's 32-bit, though, we get two 2654 # registers from pushing `value`, which doesn't get used until the end 2655 # anyway. This is somewhat klunky, but oh well. 2656 #ifdef JS_CODEGEN_X86 2657 num_temps: 1 2658 #else 2659 num_temps: 3 2660 #endif 2661 call_instruction: true 2662 mir_op: true 2663 2664 - name: ObjectToIterator 2665 result_type: WordSized 2666 operands: 2667 object: WordSized 2668 num_temps: 3 2669 mir_op: true 2670 2671 - name: IteratorHasIndicesAndBranch 2672 successors: [ifTrue, ifFalse] 2673 operands: 2674 object: WordSized 2675 iterator: WordSized 2676 num_temps: 2 2677 2678 - name: IteratorsMatchAndHaveIndicesAndBranch 2679 successors: [ifTrue, ifFalse] 2680 operands: 2681 object: WordSized 2682 iterator: WordSized 2683 otherIterator: WordSized 2684 num_temps: 2 2685 2686 # Patchable jump to stubs generated for a SetProperty cache. 2687 - name: SetPropertyCache 2688 operands: 2689 object: WordSized 2690 id: BoxedValue 2691 value: BoxedValue 2692 # Takes an additional temp: this is intendend to be FloatReg0 to allow the 2693 # actual cache code to safely clobber that value without save and restore. 2694 num_temps: 2 2695 mir_op: true 2696 2697 - name: GetIteratorCache 2698 result_type: WordSized 2699 operands: 2700 value: BoxedValue 2701 num_temps: 2 2702 mir_op: true 2703 2704 - name: IsNoIterAndBranch 2705 successors: [ifTrue, ifFalse] 2706 operands: 2707 input: BoxedValue 2708 2709 - name: CloseIterCache 2710 operands: 2711 iter: WordSized 2712 num_temps: 1 2713 mir_op: true 2714 2715 - name: Int32ToIntPtr 2716 result_type: WordSized 2717 operands: 2718 input: WordSized 2719 mir_op: true 2720 2721 - name: NonNegativeIntPtrToInt32 2722 result_type: WordSized 2723 operands: 2724 input: WordSized 2725 2726 - name: IntPtrToDouble 2727 result_type: WordSized 2728 operands: 2729 input: WordSized 2730 2731 - name: AdjustDataViewLength 2732 result_type: WordSized 2733 operands: 2734 input: WordSized 2735 mir_op: true 2736 2737 # Convert a Boolean to an Int64, following ToBigInt. 2738 - name: BooleanToInt64 2739 result_type: Int64 2740 operands: 2741 input: WordSized 2742 mir_op: ToInt64 2743 2744 # Convert a String to an Int64, following ToBigInt. 2745 - name: StringToInt64 2746 result_type: Int64 2747 operands: 2748 input: WordSized 2749 mir_op: ToInt64 2750 2751 # Simulate ToBigInt on a Value and produce a matching Int64. 2752 - name: ValueToInt64 2753 result_type: Int64 2754 operands: 2755 input: BoxedValue 2756 num_temps: 1 2757 mir_op: ToInt64 2758 2759 # Truncate a BigInt to an unboxed int64. 2760 - name: TruncateBigIntToInt64 2761 result_type: Int64 2762 operands: 2763 input: WordSized 2764 mir_op: true 2765 2766 # Create a new BigInt* from an unboxed int64. 2767 - name: Int64ToBigInt 2768 result_type: WordSized 2769 operands: 2770 input: Int64 2771 num_temps64: 1 2772 2773 # Create a new BigInt* from an unboxed uint64. 2774 - name: Uint64ToBigInt 2775 result_type: WordSized 2776 operands: 2777 input: Int64 2778 num_temps: 1 2779 mir_op: Int64ToBigInt 2780 2781 # Return intptr from an unboxed int64. Bails if the input exceeds intptr limits. 2782 - name: Int64ToIntPtr 2783 result_type: WordSized 2784 operands: 2785 input: Int64 2786 mir_op: true 2787 2788 # Return an int64 from an intptr. 2789 - name: IntPtrToInt64 2790 result_type: Int64 2791 operands: 2792 input: WordSized 2793 2794 # Generational write barrier used when writing an object to another object. 2795 - name: PostWriteBarrierO 2796 operands: 2797 object: WordSized 2798 value: WordSized 2799 num_temps: 1 2800 mir_op: PostWriteBarrier 2801 2802 # Generational write barrier used when writing a string to an object. 2803 - name: PostWriteBarrierS 2804 operands: 2805 object: WordSized 2806 value: WordSized 2807 num_temps: 1 2808 mir_op: PostWriteBarrier 2809 2810 # Generational write barrier used when writing a BigInt to an object. 2811 - name: PostWriteBarrierBI 2812 operands: 2813 object: WordSized 2814 value: WordSized 2815 num_temps: 1 2816 mir_op: PostWriteBarrier 2817 2818 # Generational write barrier used when writing a value to another object. 2819 - name: PostWriteBarrierV 2820 operands: 2821 object: WordSized 2822 value: BoxedValue 2823 num_temps: 1 2824 mir_op: PostWriteBarrier 2825 2826 # Generational write barrier used when writing an object to another object's 2827 # elements. 2828 - name: PostWriteElementBarrierO 2829 operands: 2830 object: WordSized 2831 value: WordSized 2832 index: WordSized 2833 num_temps: 1 2834 mir_op: PostWriteElementBarrier 2835 2836 # Generational write barrier used when writing a string to an object's 2837 # elements. 2838 - name: PostWriteElementBarrierS 2839 operands: 2840 object: WordSized 2841 value: WordSized 2842 index: WordSized 2843 num_temps: 1 2844 mir_op: PostWriteElementBarrier 2845 2846 # Generational write barrier used when writing a BigInt to an object's 2847 # elements. 2848 - name: PostWriteElementBarrierBI 2849 operands: 2850 object: WordSized 2851 value: WordSized 2852 index: WordSized 2853 num_temps: 1 2854 mir_op: PostWriteElementBarrier 2855 2856 # Generational write barrier used when writing a value to another object's 2857 # elements. 2858 - name: PostWriteElementBarrierV 2859 operands: 2860 object: WordSized 2861 index: WordSized 2862 value: BoxedValue 2863 num_temps: 1 2864 mir_op: PostWriteElementBarrier 2865 2866 # Guard against an object's identity. 2867 - name: GuardObjectIdentity 2868 operands: 2869 input: WordSized 2870 expected: WordSized 2871 mir_op: true 2872 2873 # Guard against an function's identity. 2874 - name: GuardSpecificFunction 2875 operands: 2876 input: WordSized 2877 expected: WordSized 2878 2879 - name: GuardSpecificSymbol 2880 operands: 2881 symbol: WordSized 2882 mir_op: true 2883 2884 - name: GuardMultipleShapesToOffset 2885 result_type: WordSized 2886 operands: 2887 object: WordSized 2888 shapeList: WordSized 2889 num_temps: 3 2890 mir_op: true 2891 2892 - name: GuardProto 2893 operands: 2894 object: WordSized 2895 expected: WordSized 2896 num_temps: 1 2897 2898 - name: GuardNullProto 2899 operands: 2900 object: WordSized 2901 num_temps: 1 2902 2903 - name: ProxyHasProp 2904 result_type: BoxedValue 2905 operands: 2906 proxy: WordSized 2907 id: BoxedValue 2908 call_instruction: true 2909 mir_op: true 2910 2911 - name: InCache 2912 result_type: WordSized 2913 operands: 2914 lhs: BoxedValue 2915 rhs: WordSized 2916 num_temps: 1 2917 mir_op: true 2918 2919 - name: HasOwnCache 2920 result_type: WordSized 2921 operands: 2922 value: BoxedValue 2923 id: BoxedValue 2924 mir_op: true 2925 2926 - name: CheckPrivateFieldCache 2927 result_type: WordSized 2928 operands: 2929 value: BoxedValue 2930 id: BoxedValue 2931 mir_op: true 2932 2933 - name: InstanceOfO 2934 result_type: WordSized 2935 operands: 2936 lhs: WordSized 2937 rhs: WordSized 2938 mir_op: InstanceOf 2939 2940 - name: InstanceOfV 2941 result_type: WordSized 2942 operands: 2943 lhs: BoxedValue 2944 rhs: WordSized 2945 mir_op: InstanceOf 2946 2947 - name: IsCallableO 2948 result_type: WordSized 2949 operands: 2950 object: WordSized 2951 mir_op: IsCallable 2952 2953 - name: IsCallableV 2954 result_type: WordSized 2955 operands: 2956 object: BoxedValue 2957 num_temps: 1 2958 mir_op: IsCallable 2959 2960 - name: IsArrayO 2961 result_type: WordSized 2962 operands: 2963 object: WordSized 2964 mir_op: IsArray 2965 2966 - name: IsArrayV 2967 result_type: WordSized 2968 operands: 2969 value: BoxedValue 2970 num_temps: 1 2971 mir_op: IsArray 2972 2973 - name: IsTypedArray 2974 result_type: WordSized 2975 operands: 2976 object: WordSized 2977 mir_op: true 2978 2979 - name: IsObjectAndBranch 2980 successors: [ifTrue, ifFalse] 2981 operands: 2982 input: BoxedValue 2983 2984 - name: IsNullOrUndefinedAndBranch 2985 successors: [ifTrue, ifFalse] 2986 operands: 2987 input: BoxedValue 2988 2989 - name: HasClass 2990 result_type: WordSized 2991 operands: 2992 lhs: WordSized 2993 mir_op: true 2994 2995 - name: GuardToClass 2996 result_type: WordSized 2997 operands: 2998 lhs: WordSized 2999 num_temps: 1 3000 mir_op: true 3001 3002 - name: GuardToFunction 3003 result_type: WordSized 3004 operands: 3005 lhs: WordSized 3006 num_temps: 1 3007 mir_op: true 3008 3009 - name: WasmSelect 3010 result_type: WordSized 3011 operands: 3012 trueExpr: WordSized 3013 falseExpr: WordSized 3014 condExpr: WordSized 3015 mir_op: true 3016 3017 - name: WasmSelectI64 3018 result_type: Int64 3019 operands: 3020 trueExpr: Int64 3021 falseExpr: Int64 3022 condExpr: WordSized 3023 mir_op: WasmSelect 3024 3025 - name: WasmCompareAndSelect 3026 result_type: WordSized 3027 operands: 3028 leftExpr: WordSized 3029 rightExpr: WordSized 3030 ifTrueExpr: WordSized 3031 ifFalseExpr: WordSized 3032 arguments: 3033 compareType: MCompare::CompareType 3034 jsop: JSOp 3035 mir_op: WasmSelect 3036 3037 - name: WasmAddOffset 3038 result_type: WordSized 3039 operands: 3040 base: WordSized 3041 mir_op: true 3042 3043 - name: WasmAddOffset64 3044 result_type: Int64 3045 operands: 3046 base: Int64 3047 mir_op: WasmAddOffset 3048 3049 - name: WasmBoundsCheck 3050 result_type: WordSized 3051 operands: 3052 ptr: WordSized 3053 boundsCheckLimit: WordSized 3054 mir_op: true 3055 3056 - name: WasmBoundsCheck64 3057 result_type: Int64 3058 operands: 3059 ptr: Int64 3060 boundsCheckLimit: Int64 3061 mir_op: WasmBoundsCheck 3062 3063 - name: WasmBoundsCheckInstanceField 3064 result_type: WordSized 3065 operands: 3066 instance: WordSized 3067 ptr: WordSized 3068 arguments: 3069 offset: uint32_t 3070 mir_op: WasmBoundsCheck 3071 3072 - name: WasmBoundsCheckInstanceField64 3073 result_type: Int64 3074 operands: 3075 instance: WordSized 3076 ptr: Int64 3077 arguments: 3078 offset: uint32_t 3079 mir_op: WasmBoundsCheck 3080 3081 - name: WasmExtendU32Index 3082 result_type: WordSized 3083 operands: 3084 input: WordSized 3085 mir_op: true 3086 3087 - name: WasmWrapU32Index 3088 result_type: WordSized 3089 operands: 3090 input: WordSized 3091 mir_op: true 3092 3093 - name: WasmAlignmentCheck 3094 operands: 3095 ptr: WordSized 3096 mir_op: true 3097 3098 - name: WasmAlignmentCheck64 3099 operands: 3100 ptr: Int64 3101 mir_op: WasmAlignmentCheck 3102 3103 - name: WasmLoadInstance 3104 result_type: WordSized 3105 operands: 3106 instance: WordSized 3107 mir_op: true 3108 3109 - name: WasmLoadInstance64 3110 result_type: Int64 3111 operands: 3112 instance: WordSized 3113 mir_op: WasmLoadInstance 3114 3115 - name: WasmHeapReg 3116 result_type: WordSized 3117 mir_op: true 3118 3119 - name: WasmLoad 3120 result_type: WordSized 3121 operands: 3122 ptr: WordSized 3123 memoryBase: WordSized 3124 #if defined(JS_CODEGEN_ARM) || defined(JS_CODEGEN_MIPS64) || defined(JS_CODEGEN_LOONG64) || defined(JS_CODEGEN_RISCV64) 3125 num_temps: 1 3126 #endif 3127 mir_op: true 3128 3129 - name: WasmLoadI64 3130 result_type: Int64 3131 operands: 3132 ptr: WordSized 3133 memoryBase: WordSized 3134 #ifdef JS_CODEGEN_ARM 3135 num_temps: 2 3136 #elif defined(JS_CODEGEN_MIPS64) || defined(JS_CODEGEN_LOONG64) || defined(JS_CODEGEN_RISCV64) 3137 num_temps: 1 3138 #endif 3139 mir_op: WasmLoad 3140 3141 - name: WasmStore 3142 operands: 3143 ptr: WordSized 3144 value: WordSized 3145 memoryBase: WordSized 3146 #if defined(JS_CODEGEN_ARM) || defined(JS_CODEGEN_MIPS64) || defined(JS_CODEGEN_LOONG64) || defined(JS_CODEGEN_RISCV64) 3147 num_temps: 1 3148 #endif 3149 mir_op: true 3150 3151 - name: WasmStoreI64 3152 operands: 3153 ptr: WordSized 3154 value: Int64 3155 memoryBase: WordSized 3156 #if defined(JS_CODEGEN_ARM) || defined(JS_CODEGEN_MIPS64) || defined(JS_CODEGEN_LOONG64) || defined(JS_CODEGEN_RISCV64) 3157 num_temps: 1 3158 #endif 3159 mir_op: WasmStore 3160 3161 - name: AsmJSLoadHeap 3162 result_type: WordSized 3163 operands: 3164 ptr: WordSized 3165 boundsCheckLimit: WordSized 3166 memoryBase: WordSized 3167 mir_op: true 3168 3169 - name: AsmJSStoreHeap 3170 operands: 3171 ptr: WordSized 3172 value: WordSized 3173 boundsCheckLimit: WordSized 3174 memoryBase: WordSized 3175 mir_op: true 3176 3177 - name: WasmCompareExchangeHeap 3178 result_type: WordSized 3179 operands: 3180 ptr: WordSized 3181 oldValue: WordSized 3182 newValue: WordSized 3183 memoryBase: WordSized 3184 #ifdef JS_CODEGEN_X86 3185 num_temps: 1 3186 #elif defined(JS_CODEGEN_MIPS64) || defined(JS_CODEGEN_LOONG64) || defined(JS_CODEGEN_RISCV64) 3187 # Temp that may be used on LL/SC platforms for extract/insert bits of word. 3188 num_temps: 3 3189 #endif 3190 mir_op: true 3191 3192 - name: WasmAtomicExchangeHeap 3193 result_type: WordSized 3194 operands: 3195 ptr: WordSized 3196 value: WordSized 3197 memoryBase: WordSized 3198 #ifdef JS_CODEGEN_X86 3199 num_temps: 1 3200 #elif defined(JS_CODEGEN_MIPS64) || defined(JS_CODEGEN_LOONG64) || defined(JS_CODEGEN_RISCV64) 3201 # Temp that may be used on LL/SC platforms for extract/insert bits of word. 3202 num_temps: 3 3203 #endif 3204 mir_op: true 3205 3206 - name: WasmAtomicBinopHeap 3207 result_type: WordSized 3208 operands: 3209 ptr: WordSized 3210 value: WordSized 3211 memoryBase: WordSized 3212 #if defined(JS_CODEGEN_MIPS64) || defined(JS_CODEGEN_LOONG64) || defined(JS_CODEGEN_RISCV64) 3213 # Temp that may be used on LL/SC platforms for extract/insert bits of word. 3214 num_temps: 3 3215 #elifdef JS_CODEGEN_X86 3216 # Additional temp to hold a computed address. 3217 num_temps: 2 3218 #else 3219 num_temps: 1 3220 #endif 3221 mir_op: true 3222 3223 # Atomic binary operation where the result is discarded. 3224 - name: WasmAtomicBinopHeapForEffect 3225 operands: 3226 ptr: WordSized 3227 value: WordSized 3228 memoryBase: WordSized 3229 #if defined(JS_CODEGEN_MIPS64) || defined(JS_CODEGEN_LOONG64) || defined(JS_CODEGEN_RISCV64) 3230 # Temp that may be used on LL/SC platforms for extract/insert bits of word. 3231 num_temps: 3 3232 #elif defined(JS_CODEGEN_X86) || defined(JS_CODEGEN_ARM) || defined(JS_CODEGEN_ARM64) 3233 num_temps: 1 3234 #endif 3235 mir_op: WasmAtomicBinopHeap 3236 3237 - name: WasmLoadSlot 3238 result_type: WordSized 3239 operands: 3240 containerRef: WordSized 3241 arguments: 3242 offset: size_t 3243 type: MIRType 3244 wideningOp: MWideningOp 3245 maybeTrap: wasm::MaybeTrapSiteDesc 3246 3247 - name: WasmLoadElement 3248 result_type: WordSized 3249 operands: 3250 base: WordSized 3251 index: WordSized 3252 arguments: 3253 type: MIRType 3254 wideningOp: MWideningOp 3255 scale: Scale 3256 maybeTrap: wasm::MaybeTrapSiteDesc 3257 num_temps: 1 3258 3259 - name: WasmLoadSlotI64 3260 result_type: Int64 3261 operands: 3262 containerRef: WordSized 3263 arguments: 3264 offset: size_t 3265 maybeTrap: wasm::MaybeTrapSiteDesc 3266 3267 - name: WasmLoadElementI64 3268 result_type: Int64 3269 operands: 3270 base: WordSized 3271 index: WordSized 3272 arguments: 3273 maybeTrap: wasm::MaybeTrapSiteDesc 3274 3275 - name: WasmStoreSlot 3276 operands: 3277 value: WordSized 3278 containerRef: WordSized 3279 arguments: 3280 offset: size_t 3281 type: MIRType 3282 narrowingOp: MNarrowingOp 3283 maybeTrap: wasm::MaybeTrapSiteDesc 3284 3285 - name: WasmStoreSlotI64 3286 operands: 3287 value: Int64 3288 containerRef: WordSized 3289 arguments: 3290 offset: size_t 3291 maybeTrap: wasm::MaybeTrapSiteDesc 3292 3293 - name: WasmStoreStackResult 3294 operands: 3295 value: WordSized 3296 stackResultsArea: WordSized 3297 arguments: 3298 offset: size_t 3299 type: MIRType 3300 3301 - name: WasmStoreStackResultI64 3302 operands: 3303 value: Int64 3304 stackResultsArea: WordSized 3305 arguments: 3306 offset: size_t 3307 3308 - name: WasmStoreElement 3309 operands: 3310 base: WordSized 3311 index: WordSized 3312 value: WordSized 3313 arguments: 3314 type: MIRType 3315 narrowingOp: MNarrowingOp 3316 scale: Scale 3317 maybeTrap: wasm::MaybeTrapSiteDesc 3318 num_temps: 1 3319 3320 - name: WasmStoreElementI64 3321 operands: 3322 base: WordSized 3323 index: WordSized 3324 value: Int64 3325 arguments: 3326 maybeTrap: wasm::MaybeTrapSiteDesc 3327 3328 - name: WasmStoreElementRef 3329 operands: 3330 instance: WordSized 3331 base: WordSized 3332 index: WordSized 3333 value: WordSized 3334 arguments: 3335 maybeTrap: wasm::MaybeTrapSiteDesc 3336 preBarrierKind: WasmPreBarrierKind 3337 num_temps: 2 3338 3339 - name: WasmLoadTableElement 3340 result_type: WordSized 3341 operands: 3342 elements: WordSized 3343 index: WordSized 3344 3345 - name: WasmDerivedPointer 3346 result_type: WordSized 3347 operands: 3348 base: WordSized 3349 mir_op: true 3350 3351 - name: WasmDerivedIndexPointer 3352 result_type: WordSized 3353 operands: 3354 base: WordSized 3355 index: WordSized 3356 mir_op: true 3357 3358 - name: WasmStoreRef 3359 operands: 3360 instance: WordSized 3361 valueBase: WordSized 3362 value: WordSized 3363 arguments: 3364 offset: uint32_t 3365 maybeTrap: wasm::MaybeTrapSiteDesc 3366 preBarrierKind: WasmPreBarrierKind 3367 num_temps: 1 3368 mir_op: true 3369 3370 # Generational write barrier used when writing an object to another object. 3371 - name: WasmPostWriteBarrierWholeCell 3372 operands: 3373 instance: WordSized 3374 object: WordSized 3375 value: WordSized 3376 num_temps: 1 3377 mir_op: true 3378 3379 # Ditto, but with a scaled index instead of a constant offset. 3380 - name: WasmPostWriteBarrierEdgeAtIndex 3381 operands: 3382 instance: WordSized 3383 object: WordSized 3384 valueBase: WordSized 3385 index: WordSized 3386 value: WordSized 3387 arguments: 3388 elemSize: uint32_t 3389 num_temps: 1 3390 mir_op: true 3391 3392 - name: WasmParameter 3393 result_type: WordSized 3394 3395 - name: WasmParameterI64 3396 result_type: Int64 3397 3398 - name: WasmReturn 3399 operands: 3400 rval: WordSized 3401 instance: WordSized 3402 3403 - name: WasmReturnI64 3404 operands: 3405 rval: Int64 3406 instance: WordSized 3407 3408 - name: WasmReturnVoid 3409 operands: 3410 rval: WordSized 3411 3412 - name: WasmStackArg 3413 operands: 3414 arg: WordSized 3415 mir_op: true 3416 3417 - name: WasmStackArgI64 3418 operands: 3419 arg: Int64 3420 mir_op: WasmStackArg 3421 3422 - name: WasmNullConstant 3423 result_type: WordSized 3424 3425 - name: WasmCallIndirectAdjunctSafepoint 3426 gen_boilerplate: false 3427 3428 - name: WasmCall 3429 gen_boilerplate: false 3430 3431 - name: WasmRegisterResult 3432 gen_boilerplate: false 3433 3434 - name: WasmRegisterPairResult 3435 gen_boilerplate: false 3436 3437 - name: WasmSystemFloatRegisterResult 3438 gen_boilerplate: false 3439 3440 - name: WasmStackResultArea 3441 result_type: WordSized 3442 num_temps: 1 3443 mir_op: true 3444 3445 - name: WasmStackResult 3446 gen_boilerplate: false 3447 3448 - name: WasmStackResult64 3449 gen_boilerplate: false 3450 3451 - name: AssertRangeI 3452 operands: 3453 input: WordSized 3454 mir_op: AssertRange 3455 3456 - name: AssertRangeD 3457 operands: 3458 input: WordSized 3459 num_temps: 1 3460 mir_op: AssertRange 3461 3462 - name: AssertRangeF 3463 operands: 3464 input: WordSized 3465 num_temps: 2 3466 mir_op: AssertRange 3467 3468 - name: AssertRangeV 3469 operands: 3470 input: BoxedValue 3471 num_temps: 3 3472 mir_op: AssertRange 3473 3474 - name: AssertClass 3475 operands: 3476 input: WordSized 3477 num_temps: 1 3478 mir_op: true 3479 3480 - name: AssertShape 3481 operands: 3482 input: WordSized 3483 mir_op: true 3484 3485 - name: GuardValue 3486 operands: 3487 input: BoxedValue 3488 num_temps: 1 3489 mir_op: true 3490 3491 - name: GuardFunctionFlags 3492 operands: 3493 function: WordSized 3494 mir_op: true 3495 3496 - name: LexicalCheck 3497 operands: 3498 input: BoxedValue 3499 mir_op: true 3500 3501 - name: ThrowMsg 3502 call_instruction: true 3503 mir_op: true 3504 3505 - name: MemoryBarrier 3506 arguments: 3507 barrier: jit::MemoryBarrier 3508 3509 - name: Debugger 3510 num_temps: 1 3511 call_instruction: true 3512 3513 - name: Generator 3514 result_type: WordSized 3515 operands: 3516 callee: WordSized 3517 environmentChain: WordSized 3518 argsObject: WordSized 3519 call_instruction: true 3520 mir_op: true 3521 3522 - name: MaybeExtractAwaitValue 3523 result_type: BoxedValue 3524 operands: 3525 value: BoxedValue 3526 canSkip: WordSized 3527 call_instruction: true 3528 mir_op: true 3529 3530 - name: ObjectStaticProto 3531 result_type: WordSized 3532 operands: 3533 object: WordSized 3534 3535 - name: GuardTagNotEqual 3536 operands: 3537 lhs: WordSized 3538 rhs: WordSized 3539 3540 # Canonicalize a double value. 3541 - name: CanonicalizeNaND 3542 result_type: WordSized 3543 operands: 3544 input: WordSized 3545 3546 # Canonicalize a float32 value. 3547 - name: CanonicalizeNaNF 3548 result_type: WordSized 3549 operands: 3550 input: WordSized 3551 3552 - name: IonToWasmCall 3553 gen_boilerplate: false 3554 3555 - name: IonToWasmCallV 3556 gen_boilerplate: false 3557 3558 - name: IonToWasmCallI64 3559 gen_boilerplate: false 3560 3561 - name: WasmNewI31Ref 3562 mir_op: true 3563 result_type: WordSized 3564 operands: 3565 value: WordSized 3566 3567 # Constant Simd128 3568 - name: Simd128 3569 result_type: WordSized 3570 arguments: 3571 simd128: SimdConstant 3572 3573 # (v128, v128, v128) -> v128 effect-free operation. 3574 # temp is FPR. 3575 - name: WasmTernarySimd128 3576 result_type: WordSized 3577 operands: 3578 v0: WordSized 3579 v1: WordSized 3580 v2: WordSized 3581 arguments: 3582 simdOp: wasm::SimdOp 3583 num_temps: 1 3584 3585 # (v128, v128) -> v128 effect-free operations 3586 # lhs and dest are the same. 3587 # temps (if in use) are FPR. 3588 # The op may differ from the MIR node's op. 3589 - name: WasmBinarySimd128 3590 result_type: WordSized 3591 operands: 3592 lhs: WordSized 3593 rhs: WordSized 3594 arguments: 3595 simdOp: wasm::SimdOp 3596 num_temps: 2 3597 3598 - name: WasmBinarySimd128WithConstant 3599 result_type: WordSized 3600 operands: 3601 lhs: WordSized 3602 arguments: 3603 rhs: SimdConstant 3604 num_temps: 1 3605 mir_op: true 3606 3607 # (v128, i32) -> v128 effect-free variable-width shift operations 3608 # lhs and dest are the same. 3609 - name: WasmVariableShiftSimd128 3610 result_type: WordSized 3611 operands: 3612 lhs: WordSized 3613 rhs: WordSized 3614 #if defined(JS_CODEGEN_X86) || defined(JS_CODEGEN_X64) 3615 # temp is an FPR (if in use). 3616 num_temps: 1 3617 #endif 3618 mir_op: WasmShiftSimd128 3619 3620 # (v128, i32) -> v128 effect-free constant-width shift operations 3621 - name: WasmConstantShiftSimd128 3622 result_type: WordSized 3623 operands: 3624 src: WordSized 3625 arguments: 3626 shift: int32_t 3627 mir_op: WasmShiftSimd128 3628 3629 # (v128) -> v128 sign replication operation. 3630 - name: WasmSignReplicationSimd128 3631 result_type: WordSized 3632 operands: 3633 src: WordSized 3634 mir_op: WasmShiftSimd128 3635 3636 # // (v128, v128, imm_simd) -> v128 effect-free operation. 3637 - name: WasmShuffleSimd128 3638 result_type: WordSized 3639 operands: 3640 lhs: WordSized 3641 rhs: WordSized 3642 arguments: 3643 op: SimdShuffleOp 3644 control: SimdConstant 3645 #if defined(JS_CODEGEN_X86) || defined(JS_CODEGEN_X64) 3646 # temp is FPR (and always in use). 3647 num_temps: 1 3648 #endif 3649 3650 # (v128, imm_simd) -> v128 effect-free operation. 3651 - name: WasmPermuteSimd128 3652 result_type: WordSized 3653 operands: 3654 src: WordSized 3655 arguments: 3656 op: SimdPermuteOp 3657 control: SimdConstant 3658 3659 - name: WasmReplaceLaneSimd128 3660 result_type: WordSized 3661 operands: 3662 lhs: WordSized 3663 rhs: WordSized 3664 mir_op: true 3665 3666 - name: WasmReplaceInt64LaneSimd128 3667 result_type: WordSized 3668 operands: 3669 lhs: WordSized 3670 rhs: Int64 3671 mir_op: WasmReplaceLaneSimd128 3672 3673 # (scalar) -> v128 effect-free operations, scalar != int64 3674 - name: WasmScalarToSimd128 3675 result_type: WordSized 3676 operands: 3677 src: WordSized 3678 mir_op: true 3679 3680 # (int64) -> v128 effect-free operations 3681 - name: WasmInt64ToSimd128 3682 result_type: WordSized 3683 operands: 3684 src: Int64 3685 mir_op: WasmScalarToSimd128 3686 3687 # // (v128, imm) -> scalar effect-free operations. 3688 - name: WasmReduceSimd128 3689 result_type: WordSized 3690 operands: 3691 src: WordSized 3692 #ifdef JS_CODEGEN_ARM64 3693 # temp is FPR (if in use). 3694 num_temps: 1 3695 #endif 3696 mir_op: true 3697 3698 # (v128, onTrue, onFalse) test-and-branch operations. 3699 - name: WasmReduceAndBranchSimd128 3700 successors: [ifTrue, ifFalse] 3701 operands: 3702 src: WordSized 3703 arguments: 3704 simdOp: wasm::SimdOp 3705 3706 # (v128, imm) -> i64 effect-free operations 3707 - name: WasmReduceSimd128ToInt64 3708 result_type: Int64 3709 operands: 3710 src: WordSized 3711 mir_op: WasmReduceSimd128 3712 3713 - name: WasmLoadLaneSimd128 3714 result_type: WordSized 3715 operands: 3716 ptr: WordSized 3717 src: WordSized 3718 memoryBase: WordSized 3719 #ifdef JS_CODEGEN_ARM64 3720 num_temps: 1 3721 #endif 3722 mir_op: true 3723 3724 - name: WasmStoreLaneSimd128 3725 operands: 3726 ptr: WordSized 3727 src: WordSized 3728 memoryBase: WordSized 3729 #ifdef JS_CODEGEN_ARM64 3730 num_temps: 1 3731 #endif 3732 mir_op: true 3733 3734 - name: Unbox 3735 gen_boilerplate: false 3736 3737 - name: UnboxFloatingPoint 3738 result_type: WordSized 3739 operands: 3740 input: BoxedValue 3741 mir_op: Unbox 3742 3743 # Convert a 32-bit unsigned integer to a double. 3744 - name: WasmUint32ToDouble 3745 result_type: WordSized 3746 operands: 3747 input: WordSized 3748 #ifdef JS_CODEGEN_X86 3749 num_temps: 1 3750 #endif 3751 3752 # Convert a 32-bit unsigned integer to a float32. 3753 - name: WasmUint32ToFloat32 3754 result_type: WordSized 3755 operands: 3756 input: WordSized 3757 #ifdef JS_CODEGEN_X86 3758 num_temps: 1 3759 #endif 3760 3761 - name: DivI 3762 result_type: WordSized 3763 operands: 3764 lhs: WordSized 3765 rhs: WordSized 3766 num_temps: 1 3767 mir_op: Div 3768 extra_name: true 3769 3770 - name: ModI 3771 result_type: WordSized 3772 operands: 3773 lhs: WordSized 3774 rhs: WordSized 3775 #if defined(JS_CODEGEN_X86) || defined(JS_CODEGEN_X64) 3776 num_temps: 1 3777 #endif 3778 mir_op: Mod 3779 extra_name: true 3780 3781 # Signed division by a power-of-two constant. 3782 - name: DivPowTwoI 3783 result_type: WordSized 3784 operands: 3785 numerator: WordSized 3786 #if defined(JS_CODEGEN_X86) || defined(JS_CODEGEN_X64) 3787 numeratorCopy: WordSized 3788 #endif 3789 arguments: 3790 shift: int32_t 3791 #if defined(JS_CODEGEN_X86) || defined(JS_CODEGEN_X64) || defined(JS_CODEGEN_ARM64) 3792 # Negative divisor case not implemented for all targets. 3793 negativeDivisor: bool 3794 #endif 3795 #if defined(JS_CODEGEN_MIPS64) || defined(JS_CODEGEN_LOONG64) 3796 num_temps: 1 3797 #endif 3798 mir_op: Div 3799 3800 - name: ModPowTwoI 3801 result_type: WordSized 3802 operands: 3803 input: WordSized 3804 arguments: 3805 shift: int32_t 3806 mir_op: Mod 3807 3808 # Takes a tableswitch with an integer to decide. 3809 - name: TableSwitch 3810 operands: 3811 index: WordSized 3812 num_temps: 2 3813 mir_op: true 3814 3815 # Takes a tableswitch with a value to decide. 3816 - name: TableSwitchV 3817 operands: 3818 input: BoxedValue 3819 num_temps: 3 3820 mir_op: TableSwitch 3821 3822 - name: MulI 3823 result_type: WordSized 3824 operands: 3825 lhs: WordSized 3826 rhs: WordSized 3827 #if defined(JS_CODEGEN_X86) || defined(JS_CODEGEN_X64) 3828 lhsCopy: WordSized 3829 #endif 3830 mir_op: Mul 3831 extra_name: true 3832 #if !defined(JS_CODEGEN_X86) && !defined(JS_CODEGEN_X64) 3833 defer_init: true 3834 #endif 3835 3836 #if defined(JS_CODEGEN_X86) || defined(JS_CODEGEN_X64) 3837 - name: DivConstantI 3838 result_type: WordSized 3839 operands: 3840 numerator: WordSized 3841 arguments: 3842 denominator: int32_t 3843 num_temps: 1 3844 mir_op: Div 3845 3846 - name: ModConstantI 3847 result_type: WordSized 3848 operands: 3849 numerator: WordSized 3850 arguments: 3851 denominator: int32_t 3852 num_temps: 1 3853 mir_op: Mod 3854 3855 - name: UDivConstant 3856 result_type: WordSized 3857 operands: 3858 numerator: WordSized 3859 arguments: 3860 denominator: uint32_t 3861 num_temps: 1 3862 mir_op: Div 3863 3864 - name: UModConstant 3865 result_type: WordSized 3866 operands: 3867 numerator: WordSized 3868 arguments: 3869 denominator: uint32_t 3870 num_temps: 1 3871 mir_op: Mod 3872 3873 - name: UDiv 3874 result_type: WordSized 3875 operands: 3876 lhs: WordSized 3877 rhs: WordSized 3878 num_temps: 1 3879 mir_op: Div 3880 3881 - name: UMod 3882 result_type: WordSized 3883 operands: 3884 lhs: WordSized 3885 rhs: WordSized 3886 num_temps: 1 3887 mir_op: Mod 3888 #endif 3889 3890 #ifdef JS_CODEGEN_X86 3891 - name: BoxFloatingPoint 3892 result_type: BoxedValue 3893 operands: 3894 input: WordSized 3895 arguments: 3896 type: MIRType 3897 num_temps: 2 3898 extra_name: true 3899 3900 - name: DivOrModI64 3901 gen_boilerplate: false 3902 3903 - name: UDivOrModI64 3904 gen_boilerplate: false 3905 3906 - name: WasmTruncateToInt64 3907 result_type: Int64 3908 operands: 3909 input: WordSized 3910 num_temps: 1 3911 mir_op: true 3912 3913 - name: Int64ToFloatingPoint 3914 result_type: WordSized 3915 operands: 3916 input: Int64 3917 num_temps: 1 3918 mir_op: true 3919 3920 - name: WasmAtomicLoadI64 3921 result_type: Int64 3922 operands: 3923 ptr: WordSized 3924 memoryBase: WordSized 3925 num_temps64: 1 3926 mir_op: WasmLoad 3927 3928 - name: WasmAtomicStoreI64 3929 operands: 3930 ptr: WordSized 3931 value: Int64 3932 memoryBase: WordSized 3933 num_temps64: 1 3934 mir_op: WasmStore 3935 3936 - name: WasmCompareExchangeI64 3937 result_type: Int64 3938 operands: 3939 ptr: WordSized 3940 expected: Int64 3941 replacement: Int64 3942 memoryBase: WordSized 3943 mir_op: WasmCompareExchangeHeap 3944 3945 - name: WasmAtomicBinopI64 3946 result_type: Int64 3947 operands: 3948 ptr: WordSized 3949 value: Int64 3950 memoryBase: WordSized 3951 arguments: 3952 access: const wasm::MemoryAccessDesc& 3953 operation: AtomicOp 3954 3955 - name: WasmAtomicExchangeI64 3956 result_type: Int64 3957 operands: 3958 ptr: WordSized 3959 value: Int64 3960 memoryBase: WordSized 3961 arguments: 3962 access: const wasm::MemoryAccessDesc& 3963 #endif 3964 3965 #ifdef JS_CODEGEN_X64 3966 - name: DivI64 3967 result_type: Int64 3968 operands: 3969 lhs: WordSized 3970 rhs: WordSized 3971 num_temps: 1 3972 mir_op: Div 3973 3974 - name: ModI64 3975 result_type: Int64 3976 operands: 3977 lhs: WordSized 3978 rhs: WordSized 3979 num_temps: 1 3980 mir_op: Mod 3981 3982 - name: UDivI64 3983 result_type: Int64 3984 operands: 3985 lhs: WordSized 3986 rhs: WordSized 3987 num_temps: 1 3988 mir_op: Div 3989 3990 - name: UModI64 3991 result_type: Int64 3992 operands: 3993 lhs: WordSized 3994 rhs: WordSized 3995 num_temps: 1 3996 mir_op: Mod 3997 3998 - name: DivPowTwoI64 3999 result_type: WordSized 4000 operands: 4001 numerator: WordSized 4002 numeratorCopy: WordSized 4003 arguments: 4004 shift: int32_t 4005 negativeDivisor: bool 4006 mir_op: Div 4007 4008 - name: ModPowTwoI64 4009 result_type: WordSized 4010 operands: 4011 input: WordSized 4012 arguments: 4013 shift: int32_t 4014 mir_op: Mod 4015 4016 - name: DivConstantI64 4017 result_type: WordSized 4018 operands: 4019 numerator: WordSized 4020 arguments: 4021 denominator: int64_t 4022 num_temps: 1 4023 mir_op: Div 4024 4025 - name: ModConstantI64 4026 result_type: WordSized 4027 operands: 4028 numerator: WordSized 4029 arguments: 4030 denominator: int64_t 4031 num_temps: 1 4032 mir_op: Mod 4033 4034 - name: UDivConstantI64 4035 result_type: WordSized 4036 operands: 4037 numerator: WordSized 4038 arguments: 4039 denominator: uint64_t 4040 num_temps: 1 4041 mir_op: Div 4042 4043 - name: UModConstantI64 4044 result_type: WordSized 4045 operands: 4046 numerator: WordSized 4047 arguments: 4048 denominator: uint64_t 4049 num_temps: 1 4050 mir_op: Mod 4051 4052 - name: WasmTruncateToInt64 4053 result_type: Int64 4054 operands: 4055 input: WordSized 4056 num_temps: 1 4057 mir_op: true 4058 4059 - name: Int64ToFloatingPoint 4060 result_type: WordSized 4061 operands: 4062 input: Int64 4063 num_temps: 1 4064 mir_op: true 4065 #endif 4066 4067 #ifdef JS_CODEGEN_ARM 4068 - name: BoxFloatingPoint 4069 result_type: BoxedValue 4070 operands: 4071 input: WordSized 4072 arguments: 4073 type: MIRType 4074 num_temps: 1 4075 extra_name: true 4076 4077 - name: DivOrModI64 4078 gen_boilerplate: false 4079 4080 - name: UDivOrModI64 4081 gen_boilerplate: false 4082 4083 # LSoftDivI is a software divide for ARM cores that don't support a hardware 4084 # divide instruction, implemented as a C++ native call. 4085 - name: SoftDivI 4086 result_type: WordSized 4087 operands: 4088 lhs: WordSized 4089 rhs: WordSized 4090 call_instruction: true 4091 mir_op: Div 4092 4093 - name: SoftModI 4094 result_type: WordSized 4095 operands: 4096 lhs: WordSized 4097 rhs: WordSized 4098 num_temps: 1 4099 call_instruction: true 4100 mir_op: Mod 4101 4102 - name: ModMaskI 4103 result_type: WordSized 4104 operands: 4105 input: WordSized 4106 arguments: 4107 shift: int32_t 4108 num_temps: 2 4109 mir_op: Mod 4110 4111 - name: UDiv 4112 result_type: WordSized 4113 operands: 4114 lhs: WordSized 4115 rhs: WordSized 4116 mir_op: Div 4117 4118 - name: UMod 4119 result_type: WordSized 4120 operands: 4121 lhs: WordSized 4122 rhs: WordSized 4123 mir_op: Mod 4124 4125 - name: SoftUDivOrMod 4126 result_type: WordSized 4127 operands: 4128 lhs: WordSized 4129 rhs: WordSized 4130 call_instruction: true 4131 mir_op: Instruction 4132 4133 - name: Int64ToFloatingPointCall 4134 result_type: WordSized 4135 operands: 4136 input: Int64 4137 instance: WordSized 4138 call_instruction: true 4139 mir_op: BuiltinInt64ToFloatingPoint 4140 4141 - name: WasmTruncateToInt64 4142 result_type: Int64 4143 operands: 4144 input: WordSized 4145 instance: WordSized 4146 call_instruction: true 4147 mir_op: WasmBuiltinTruncateToInt64 4148 4149 - name: WasmAtomicLoadI64 4150 result_type: Int64 4151 operands: 4152 ptr: WordSized 4153 memoryBase: WordSized 4154 mir_op: WasmLoad 4155 4156 - name: WasmAtomicStoreI64 4157 operands: 4158 ptr: WordSized 4159 value: Int64 4160 memoryBase: WordSized 4161 num_temps64: 1 4162 mir_op: WasmStore 4163 4164 - name: WasmCompareExchangeI64 4165 result_type: Int64 4166 operands: 4167 ptr: WordSized 4168 expected: Int64 4169 replacement: Int64 4170 memoryBase: WordSized 4171 mir_op: WasmCompareExchangeHeap 4172 4173 - name: WasmAtomicBinopI64 4174 result_type: Int64 4175 operands: 4176 ptr: WordSized 4177 value: Int64 4178 memoryBase: WordSized 4179 arguments: 4180 access: const wasm::MemoryAccessDesc& 4181 operation: AtomicOp 4182 num_temps64: 1 4183 4184 - name: WasmAtomicExchangeI64 4185 result_type: Int64 4186 operands: 4187 ptr: WordSized 4188 value: Int64 4189 memoryBase: WordSized 4190 arguments: 4191 access: const wasm::MemoryAccessDesc& 4192 #endif 4193 4194 #ifdef JS_CODEGEN_ARM64 4195 - name: DivI64 4196 result_type: WordSized 4197 operands: 4198 lhs: WordSized 4199 rhs: WordSized 4200 mir_op: Div 4201 4202 - name: ModI64 4203 result_type: WordSized 4204 operands: 4205 lhs: WordSized 4206 rhs: WordSized 4207 mir_op: Mod 4208 4209 - name: UDivI64 4210 result_type: WordSized 4211 operands: 4212 lhs: WordSized 4213 rhs: WordSized 4214 mir_op: Div 4215 4216 - name: UModI64 4217 result_type: WordSized 4218 operands: 4219 lhs: WordSized 4220 rhs: WordSized 4221 mir_op: Mod 4222 4223 - name: DivConstantI 4224 result_type: WordSized 4225 operands: 4226 numerator: WordSized 4227 arguments: 4228 denominator: int32_t 4229 mir_op: Div 4230 4231 - name: UDivConstant 4232 result_type: WordSized 4233 operands: 4234 numerator: WordSized 4235 arguments: 4236 denominator: uint32_t 4237 mir_op: Div 4238 4239 - name: ModConstantI 4240 result_type: WordSized 4241 operands: 4242 numerator: WordSized 4243 arguments: 4244 denominator: int32_t 4245 mir_op: Mod 4246 4247 - name: UModConstant 4248 result_type: WordSized 4249 operands: 4250 numerator: WordSized 4251 arguments: 4252 denominator: uint32_t 4253 mir_op: Mod 4254 4255 - name: DivPowTwoI64 4256 result_type: WordSized 4257 operands: 4258 numerator: WordSized 4259 arguments: 4260 shift: int32_t 4261 negativeDivisor: bool 4262 mir_op: Div 4263 4264 - name: ModPowTwoI64 4265 result_type: WordSized 4266 operands: 4267 input: WordSized 4268 arguments: 4269 shift: int32_t 4270 mir_op: Mod 4271 4272 - name: DivConstantI64 4273 result_type: WordSized 4274 operands: 4275 numerator: WordSized 4276 arguments: 4277 denominator: int64_t 4278 mir_op: Div 4279 4280 - name: ModConstantI64 4281 result_type: WordSized 4282 operands: 4283 numerator: WordSized 4284 arguments: 4285 denominator: int64_t 4286 mir_op: Mod 4287 4288 - name: UDivConstantI64 4289 result_type: WordSized 4290 operands: 4291 numerator: WordSized 4292 arguments: 4293 denominator: uint64_t 4294 mir_op: Div 4295 4296 - name: UModConstantI64 4297 result_type: WordSized 4298 operands: 4299 numerator: WordSized 4300 arguments: 4301 denominator: uint64_t 4302 mir_op: Mod 4303 4304 - name: UDiv 4305 result_type: WordSized 4306 operands: 4307 lhs: WordSized 4308 rhs: WordSized 4309 mir_op: Div 4310 4311 - name: UMod 4312 result_type: WordSized 4313 operands: 4314 lhs: WordSized 4315 rhs: WordSized 4316 mir_op: Mod 4317 4318 - name: WasmTruncateToInt64 4319 result_type: Int64 4320 operands: 4321 input: WordSized 4322 mir_op: true 4323 4324 - name: Int64ToFloatingPoint 4325 result_type: WordSized 4326 operands: 4327 input: Int64 4328 mir_op: true 4329 #endif 4330 4331 #ifdef JS_CODEGEN_MIPS64 4332 - name: DivOrModI64 4333 gen_boilerplate: false 4334 4335 - name: UDivOrMod 4336 gen_boilerplate: false 4337 4338 - name: UDivOrModI64 4339 gen_boilerplate: false 4340 4341 - name: ModMaskI 4342 result_type: WordSized 4343 operands: 4344 input: WordSized 4345 arguments: 4346 shift: int32_t 4347 num_temps: 2 4348 mir_op: Mod 4349 4350 - name: WasmTruncateToInt64 4351 result_type: Int64 4352 operands: 4353 input: WordSized 4354 mir_op: true 4355 4356 - name: Int64ToFloatingPoint 4357 result_type: WordSized 4358 operands: 4359 input: Int64 4360 mir_op: true 4361 4362 - name: WasmUnalignedLoad 4363 result_type: WordSized 4364 operands: 4365 ptr: WordSized 4366 memoryBase: WordSized 4367 num_temps: 2 4368 mir_op: WasmLoad 4369 4370 - name: WasmUnalignedLoadI64 4371 result_type: Int64 4372 operands: 4373 ptr: WordSized 4374 memoryBase: WordSized 4375 num_temps: 2 4376 mir_op: WasmLoad 4377 4378 - name: WasmUnalignedStore 4379 operands: 4380 ptr: WordSized 4381 value: WordSized 4382 memoryBase: WordSized 4383 num_temps: 2 4384 mir_op: WasmStore 4385 4386 - name: WasmUnalignedStoreI64 4387 operands: 4388 ptr: WordSized 4389 value: Int64 4390 memoryBase: WordSized 4391 num_temps: 2 4392 mir_op: WasmStore 4393 4394 - name: WasmCompareExchangeI64 4395 result_type: Int64 4396 operands: 4397 ptr: WordSized 4398 oldValue: Int64 4399 newValue: Int64 4400 memoryBase: WordSized 4401 mir_op: WasmCompareExchangeHeap 4402 4403 - name: WasmAtomicBinopI64 4404 result_type: Int64 4405 operands: 4406 ptr: WordSized 4407 value: Int64 4408 memoryBase: WordSized 4409 num_temps64: 1 4410 mir_op: WasmAtomicBinopHeap 4411 4412 - name: WasmAtomicExchangeI64 4413 result_type: Int64 4414 operands: 4415 ptr: WordSized 4416 value: Int64 4417 memoryBase: WordSized 4418 mir_op: WasmAtomicExchangeHeap 4419 #endif 4420 4421 #ifdef JS_CODEGEN_LOONG64 4422 - name: DivOrModI64 4423 gen_boilerplate: false 4424 4425 - name: UDivOrMod 4426 gen_boilerplate: false 4427 4428 - name: UDivOrModI64 4429 gen_boilerplate: false 4430 4431 - name: ModMaskI 4432 result_type: WordSized 4433 operands: 4434 input: WordSized 4435 arguments: 4436 shift: int32_t 4437 num_temps: 2 4438 mir_op: Mod 4439 4440 - name: WasmTruncateToInt64 4441 result_type: Int64 4442 operands: 4443 input: WordSized 4444 mir_op: true 4445 4446 - name: Int64ToFloatingPoint 4447 result_type: WordSized 4448 operands: 4449 input: Int64 4450 mir_op: true 4451 4452 - name: WasmCompareExchangeI64 4453 result_type: Int64 4454 operands: 4455 ptr: WordSized 4456 oldValue: Int64 4457 newValue: Int64 4458 memoryBase: WordSized 4459 mir_op: WasmCompareExchangeHeap 4460 4461 - name: WasmAtomicBinopI64 4462 result_type: Int64 4463 operands: 4464 ptr: WordSized 4465 value: Int64 4466 memoryBase: WordSized 4467 num_temps64: 1 4468 mir_op: WasmAtomicBinopHeap 4469 4470 - name: WasmAtomicExchangeI64 4471 result_type: Int64 4472 operands: 4473 ptr: WordSized 4474 value: Int64 4475 memoryBase: WordSized 4476 mir_op: WasmAtomicExchangeHeap 4477 #endif 4478 4479 #ifdef JS_CODEGEN_RISCV64 4480 - name: UDiv 4481 result_type: WordSized 4482 operands: 4483 lhs: WordSized 4484 rhs: WordSized 4485 mir_op: Div 4486 4487 - name: UMod 4488 result_type: WordSized 4489 operands: 4490 lhs: WordSized 4491 rhs: WordSized 4492 mir_op: Mod 4493 4494 - name: DivI64 4495 result_type: Int64 4496 operands: 4497 lhs: WordSized 4498 rhs: WordSized 4499 mir_op: Div 4500 4501 - name: ModI64 4502 result_type: Int64 4503 operands: 4504 lhs: WordSized 4505 rhs: WordSized 4506 mir_op: Mod 4507 4508 - name: UDivI64 4509 result_type: Int64 4510 operands: 4511 lhs: WordSized 4512 rhs: WordSized 4513 mir_op: Div 4514 4515 - name: UModI64 4516 result_type: Int64 4517 operands: 4518 lhs: WordSized 4519 rhs: WordSized 4520 mir_op: Mod 4521 4522 - name: ModMaskI 4523 result_type: WordSized 4524 operands: 4525 input: WordSized 4526 arguments: 4527 shift: int32_t 4528 num_temps: 2 4529 mir_op: Mod 4530 4531 - name: WasmTruncateToInt64 4532 result_type: Int64 4533 operands: 4534 input: WordSized 4535 mir_op: true 4536 4537 - name: Int64ToFloatingPoint 4538 result_type: WordSized 4539 operands: 4540 input: Int64 4541 mir_op: true 4542 4543 - name: WasmCompareExchangeI64 4544 result_type: Int64 4545 operands: 4546 ptr: WordSized 4547 oldValue: Int64 4548 newValue: Int64 4549 memoryBase: WordSized 4550 mir_op: WasmCompareExchangeHeap 4551 4552 - name: WasmAtomicBinopI64 4553 result_type: Int64 4554 operands: 4555 ptr: WordSized 4556 value: Int64 4557 memoryBase: WordSized 4558 num_temps64: 1 4559 mir_op: WasmAtomicBinopHeap 4560 4561 - name: WasmAtomicExchangeI64 4562 result_type: Int64 4563 operands: 4564 ptr: WordSized 4565 value: Int64 4566 memoryBase: WordSized 4567 mir_op: WasmAtomicExchangeHeap 4568 #endif 4569 4570 #ifdef FUZZING_JS_FUZZILLI 4571 - name: FuzzilliHashT 4572 result_type: WordSized 4573 operands: 4574 value: WordSized 4575 num_temps: 2 4576 mir_op: FuzzilliHash 4577 4578 - name: FuzzilliHashV 4579 result_type: WordSized 4580 operands: 4581 value: BoxedValue 4582 num_temps: 2 4583 mir_op: FuzzilliHash 4584 4585 - name: FuzzilliHashStore 4586 operands: 4587 value: WordSized 4588 num_temps: 2 4589 mir_op: FuzzilliHashStore 4590 #endif