tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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