Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  LIROps.yaml   Sprache: unbekannt

 
Spracherkennung für: .yaml vermutete Sprache: Unknown {[0] [0] [0]} [Methode: Schwerpunktbildung, einfache Gewichte, sechs Dimensionen]

# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

# [SMDOC] LIR Opcodes
# =======================
# This file defines all LIR opcodes as well as LIR opcode class
# definitions. It is parsed by GenerateLIRFiles.py at build time to
# create LIROpsGenerated.h. Each opcode consists of a
# name and a set of attributes that are described below. Unless
# marked as required, attributes are optional.
#
# name [required]
# ====
# Opcode name.
# Possible values:
#   - opcode string: used as the name for LIR opcode.
#
# gen_boilerplate
# ===============
# Used to decide to generate LIR boilerplate.
#   - true (default): auto generate boilerplate for this LIR opcode
#   - false: do not generate boilerplate for this LIR opcode
#
# result_type
# ===========
# Specifies the result type that is produced by this LIR instruction.
# The result type can be any of the following: WordSized, BoxedValue,
# or Int64.
#   - attribute not specified (default): there is no result produced
#     by this LIR instruction
#   - result type: sets result type for this LIR instruction
#
# successors
# ===========
# Specifies the list of successor blocks for control instruction LIR nodes.
# Control instruction nodes inherit from LControlInstructionHelper. The
# "result_type" attribute can't be used when this attribute is present.
#
#   For example:
#     successors: [ifTrue, ifFalse]
#
#   Will generate the following getters:
#     MBasicBlock* ifTrue() const { return getSuccessor(0); }
#     MBasicBlock* ifFalse() const { return getSuccessor(1); }
#
# operands
# ========
# A list of operands to the LIR node. Each operand will be
# passed into and set in the instruction's constructor. A simple getter
# will also be auto generated for the operand. Each operand in the
# following list is defined by its name and an type.
# The type can be WordSized, BoxedValue, or Int64.
#
#   For example:
#     operands:
#       lhs: BoxedValue
#       rhs: WordSized
#
#   Will result in:
#     explicit LInstanceOfV(const LBoxAllocation& lhs, const LAllocation& rhs)
#         : LInstructionHelper(classOpcode) {
#       setBoxOperand(lhsIndex, lhs);
#       setOperand(rhsIndex, rhs);
#     }
#     const LAllocation* rhs() { return getOperand(0); }
#
#     static const size_t lhsIndex = 0;
#     static const size_t rhsIndex = BOX_PIECES;
#
#   - attribute not specified (default): no code generated
#   - list of operand names with their types: operand getters and setters
#     are generated and passed into the constructor
#
# arguments
# =========
# A list of non-LIR node arguments to the LIR op class constructor
# that are passed along with the operands. The arguments require
# both a name and a full type signature for each item in the list.
#
# For example:
#   offset: size_t
#   type: MIRType
#
# For each argument a private variable declaration will be autogenerated
# in the LIR op class, as well as simple accessor for that variable. The
# above arguments list will result in the following declarations and
# accessors:
#
#   size_t offset_;
#   MIRType type_;
#
#   size_t offset() const { return offset_; }
#   MIRType type() const { return type_; }
#
#   - attribute not specified (default): no code generated
#   - argument list: argument names and their full type signature
#
# num_temps
# ========
# Specifies the number of temporary virtual registers, LDefinitions, used by
# this LIR op.
#   - attribute not specified (default): number of temps is set to 0
#   - number of LDefinition temps: sets number of temps max 15
#
# call_instruction
# ================
# Used to define call instructions.
#   - attribute not specified (default): no code generated
#   - true: generates a call to setIsCall in the op's constructor
#
# mir_op
# ======
# If a LIR instruction corresponds one-to-one with a particular MIR
# instruction, this will generate a method that returns that MIR
# instruction.
#   - attribute not specified (default): no code generated
#   - true: generates a method to return MIR instruction
#   - mir string: returns this specified MIR instruction
#
# extra_name
# ==========
# Add a declaration for the `extraName` method.
#   - attribute not specified (default): no code generated
#   - true: adds the `inline const char* extraName() const;` declaration
#
# defer_init
# ==========
# Control whether or not operands and temps are initialized outside the
# constructor.
#   - attribute not specified (default): operands and temps are initialized in
#     the constructor.
#   - true: operands and temps are not initialized in the constructor, instead
#     setter definitions are added for manual initialization.

- name: Phi
  gen_boilerplate: false

- name: Box
  result_type: BoxedValue
  operands:
    payload: WordSized
  arguments:
    type: MIRType
  extra_name: true

- name: OsiPoint
  gen_boilerplate: false

- name: MoveGroup
  gen_boilerplate: false

# Constant 32-bit integer.
- name: Integer
  result_type: WordSized
  arguments:
    i32: int32_t

# Constant 64-bit integer.
- name: Integer64
  result_type: Int64
  arguments:
    i64: int64_t

# Constant pointer.
- name: Pointer
  result_type: WordSized
  arguments:
    gcptr: gc::Cell*

# Constant double.
- name: Double
  result_type: WordSized
  arguments:
    value: double

# Constant float32.
- name: Float32
  result_type: WordSized
  arguments:
    value: float

- name: Value
  gen_boilerplate: false

- name: NurseryObject
  result_type: WordSized
  mir_op: true

# Formal argument for a function, returning a box. Formal arguments are
# initially read from the stack.
- name: Parameter
  result_type: BoxedValue

# Stack offset for a word-sized immutable input value to a frame.
- name: Callee
  result_type: WordSized

- name: IsConstructing
  result_type: WordSized

# Jumps to the start of a basic block.
- name: Goto
  successors: [target]

- name: NewArray
  result_type: WordSized
  num_temps: 1
  mir_op: true
  extra_name: true

- name: NewArrayDynamicLength
  result_type: WordSized
  operands:
    length: WordSized
  num_temps: 1
  mir_op: true

- name: NewIterator
  result_type: WordSized
  num_temps: 1
  mir_op: true

- name: NewTypedArray
  result_type: WordSized
  num_temps: 2
  mir_op: true

- name: NewTypedArrayDynamicLength
  result_type: WordSized
  operands:
    length: WordSized
  num_temps: 1
  mir_op: true

- name: NewTypedArrayFromArray
  result_type: WordSized
  operands:
    array: WordSized
  call_instruction: true
  mir_op: true

- name: NewTypedArrayFromArrayBuffer
  result_type: WordSized
  operands:
    arrayBuffer: WordSized
    byteOffset: BoxedValue
    length: BoxedValue
  call_instruction: true
  mir_op: true

- name: BindFunction
  result_type: WordSized
  operands:
    target: WordSized
  call_instruction: true
  num_temps: 2
  mir_op: true

- name: NewBoundFunction
  result_type: WordSized
  num_temps: 1
  mir_op: true

- name: NewObject
  result_type: WordSized
  num_temps: 1
  mir_op: true
  extra_name: true

- name: NewPlainObject
  result_type: WordSized
  num_temps: 3
  mir_op: true

- name: NewArrayObject
  result_type: WordSized
  num_temps: 2
  mir_op: true

# Allocates a new NamedLambdaObject.
#
# This instruction generates two possible instruction sets:
#   (1) An inline allocation of the call object is attempted.
#   (2) Otherwise, a callVM create a new object.
#
- name: NewNamedLambdaObject
  result_type: WordSized
  num_temps: 1
  mir_op: true

# Allocates a new CallObject.
#
# This instruction generates two possible instruction sets:
#   (1) If the call object is extensible, this is a callVM to create the
#       call object.
#   (2) Otherwise, an inline allocation of the call object is attempted.
#
- name: NewCallObject
  result_type: WordSized
  num_temps: 1
  mir_op: true

- name: NewMapObject
  result_type: WordSized
  num_temps: 1
  mir_op: true

- name: NewSetObject
  result_type: WordSized
  num_temps: 1
  mir_op: true

- name: NewMapObjectFromIterable
  operands:
    iterable: BoxedValue
  result_type: WordSized
  num_temps: 2
  call_instruction: true
  mir_op: true

- name: NewSetObjectFromIterable
  operands:
    iterable: BoxedValue
  result_type: WordSized
  num_temps: 2
  call_instruction: true
  mir_op: true

- name: NewStringObject
  result_type: WordSized
  operands:
    input: WordSized
  num_temps: 1
  mir_op: true

- name: InitElemGetterSetter
  operands:
    object: WordSized
    id: BoxedValue
    value: WordSized
  call_instruction: true
  mir_op: true

# Takes in an Object and a Value.
- name: MutateProto
  operands:
    object: WordSized
    value: BoxedValue
  call_instruction: true

- name: InitPropGetterSetter
  operands:
    object: WordSized
    value: WordSized
  call_instruction: true
  mir_op: true

- name: CheckOverRecursed
  mir_op: true

- name: WasmTrap
  mir_op: true

- name: WasmTrapIfNull
  operands:
    ref: WordSized
  mir_op: true

- name: WasmRefIsSubtypeOfConcrete
  mir_op: true
  operands:
    ref: WordSized
    superSTV: WordSized
  result_type: WordSized
  num_temps: 2

- name: WasmRefIsSubtypeOfAbstract
  mir_op: true
  operands:
    ref: WordSized
  result_type: WordSized
  num_temps: 1

- name: WasmRefIsSubtypeOfConcreteAndBranch
  successors: [ifTrue, ifFalse]
  operands:
    ref: WordSized
    superSTV: WordSized
  arguments:
    sourceType: wasm::RefType
    destType: wasm::RefType
  num_temps: 2

- name: WasmRefIsSubtypeOfAbstractAndBranch
  successors: [ifTrue, ifFalse]
  operands:
    ref: WordSized
  arguments:
    sourceType: wasm::RefType
    destType: wasm::RefType
  num_temps: 1

- name: WasmNewStructObject
  mir_op: true
  operands:
    instance: WordSized
    typeDefData: WordSized
  result_type: WordSized
  num_temps: 2

- name: WasmNewArrayObject
  mir_op: true
  operands:
    instance: WordSized
    numElements: WordSized
    typeDefData: WordSized
  result_type: WordSized
  num_temps: 2

- name: ReinterpretCast
  operands:
    input: WordSized
  result_type: WordSized
  mir_op: ReinterpretCast

- name: ReinterpretCastFromI64
  operands:
    input: Int64
  result_type: WordSized
  mir_op: ReinterpretCast

- name: ReinterpretCastToI64
  operands:
    input: WordSized
  result_type: Int64
  mir_op: ReinterpretCast

- name: Rotate
  result_type: WordSized
  operands:
    input: WordSized
    count: WordSized
  mir_op: true
  defer_init: true

- name: RotateI64
  result_type: Int64
  operands:
    input: Int64
    count: WordSized
  num_temps: 1
  mir_op: Rotate
  defer_init: true

- name: InterruptCheck
  mir_op: true

- name: WasmStackSwitchToMain
  result_type: WordSized
  operands:
    suspender: WordSized
    fn: WordSized
    data: WordSized
  call_instruction: true

- name: WasmStackSwitchToSuspendable
  operands:
    suspender: WordSized
    fn: WordSized
    data: WordSized
  call_instruction: true

- name: WasmStackContinueOnSuspendable
  operands:
    suspender: WordSized
    result: WordSized
  call_instruction: true

- name: WasmInterruptCheck
  operands:
    instance: WordSized
  mir_op: true

- name: TypeOfV
  result_type: WordSized
  operands:
    input: BoxedValue
  num_temps: 1
  mir_op: TypeOf

- name: TypeOfO
  result_type: WordSized
  operands:
    object: WordSized
  mir_op: TypeOf

- name: TypeOfName
  result_type: WordSized
  operands:
    input: WordSized
  mir_op: true

- name: TypeOfIsNonPrimitiveV
  result_type: WordSized
  operands:
    input: BoxedValue
  num_temps: 1
  mir_op: TypeOfIs

- name: TypeOfIsNonPrimitiveO
  result_type: WordSized
  operands:
    input: WordSized
  mir_op: TypeOfIs

- name: TypeOfIsPrimitive
  result_type: WordSized
  operands:
    input: BoxedValue
  mir_op: TypeOfIs

- name: ToAsyncIter
  result_type: WordSized
  operands:
    iterator: WordSized
    nextMethod: BoxedValue
  call_instruction: true

- name: ToPropertyKeyCache
  result_type: BoxedValue
  operands:
    input: BoxedValue
  mir_op: true

# Allocate an object for |new| on the caller-side,
# when there is no templateObject or prototype known
- name: CreateThis
  result_type: BoxedValue
  operands:
    callee: WordSized
    newTarget: WordSized
  call_instruction: true
  mir_op: true

# Allocate a new arguments object for the frame.
- name: CreateArgumentsObject
  result_type: WordSized
  operands:
    callObject: WordSized
  num_temps: 3
  call_instruction: true
  mir_op: true

- name: CreateInlinedArgumentsObject
  gen_boilerplate: false

- name: GetInlinedArgument
  gen_boilerplate: false

- name: GetInlinedArgumentHole
  gen_boilerplate: false

# Get argument from arguments object.
- name: GetArgumentsObjectArg
  result_type: BoxedValue
  operands:
    argsObject: WordSized
  num_temps: 1
  mir_op: true

# Set argument on arguments object.
- name: SetArgumentsObjectArg
  operands:
    argsObject: WordSized
    value: BoxedValue
  num_temps: 1
  mir_op: true

# Load an element from an arguments object.
- name: LoadArgumentsObjectArg
  result_type: BoxedValue
  operands:
    argsObject: WordSized
    index: WordSized
  num_temps: 1

# Load an element from an arguments object. Handles out-of-bounds accesses.
- name: LoadArgumentsObjectArgHole
  result_type: BoxedValue
  operands:
    argsObject: WordSized
    index: WordSized
  num_temps: 1

# Return true if the element exists in the arguments object.
- name: InArgumentsObjectArg
  result_type: WordSized
  operands:
    argsObject: WordSized
    index: WordSized
  num_temps: 1

# Return |arguments.length| unless it has been overridden.
- name: ArgumentsObjectLength
  result_type: WordSized
  operands:
    argsObject: WordSized

# Create an array from an arguments object.
- name: ArrayFromArgumentsObject
  result_type: WordSized
  operands:
    argsObject: WordSized
  call_instruction: true
  mir_op: true

# Guard that the given flags are not set on the arguments object.
- name: GuardArgumentsObjectFlags
  operands:
    argsObject: WordSized
  num_temps: 1
  mir_op: true

- name: BoundFunctionNumArgs
  result_type: WordSized
  operands:
    object: WordSized

- name: GuardBoundFunctionIsConstructor
  operands:
    object: WordSized

# If the Value is an Object, return unbox(Value).
# Otherwise, return the other Object.
- name: ReturnFromCtor
  result_type: WordSized
  operands:
    value: BoxedValue
    object: WordSized

- name: BoxNonStrictThis
  result_type: WordSized
  operands:
    value: BoxedValue
  mir_op: true

- name: ImplicitThis
  result_type: BoxedValue
  operands:
    env: WordSized
  mir_op: true

# Writes a typed argument for a function call to the frame's argument vector.
- name: StackArgT
  operands:
    arg: WordSized
  arguments:
    # Index into frame-scope argument vector.
    argslot: uint32_t
    type: MIRType

# Writes a typed argument for a function call to the frame's argument vector.
- name: StackArgV
  operands:
    value: BoxedValue
  arguments:
    # Index into frame-scope argument vector.
    argslot: uint32_t

- name: CallGeneric
  gen_boilerplate: false

- name: CallKnown
  gen_boilerplate: false

- name: CallNative
  gen_boilerplate: false

- name: CallDOMNative
  gen_boilerplate: false

- name: CallClassHook
  gen_boilerplate: false

- name: Bail

- name: Unreachable
  successors: []

- name: EncodeSnapshot

- name: UnreachableResultV
  result_type: BoxedValue

- name: UnreachableResultT
  result_type: WordSized

- name: GetDOMProperty
  result_type: BoxedValue
  operands:
    object: WordSized
  num_temps: 3
  call_instruction: true
  mir_op: true

- name: GetDOMMemberV
  result_type: BoxedValue
  operands:
    object: WordSized
  mir_op: GetDOMMember

- name: GetDOMMemberT
  result_type: WordSized
  operands:
    object: WordSized
  mir_op: GetDOMMember

- name: SetDOMProperty
  operands:
    object: WordSized
    value: BoxedValue
  num_temps: 3
  call_instruction: true
  mir_op: true

- name: LoadDOMExpandoValue
  result_type: BoxedValue
  operands:
    proxy: WordSized
  mir_op: true

- name: LoadDOMExpandoValueGuardGeneration
  result_type: BoxedValue
  operands:
    proxy: WordSized
  mir_op: true

- name: LoadDOMExpandoValueIgnoreGeneration
  result_type: BoxedValue
  operands:
    proxy: WordSized
  mir_op: true

- name: GuardDOMExpandoMissingOrGuardShape
  operands:
    input: BoxedValue
  num_temps: 1
  mir_op: true

- name: ApplyArgsGeneric
  gen_boilerplate: false

- name: ApplyArgsObj
  gen_boilerplate: false

- name: ApplyArrayGeneric
  gen_boilerplate: false

- name: ConstructArgsGeneric
  gen_boilerplate: false

- name: ConstructArrayGeneric
  gen_boilerplate: false

- name: ApplyArgsNative
  gen_boilerplate: false

- name: ApplyArgsObjNative
  gen_boilerplate: false

- name: ApplyArrayNative
  gen_boilerplate: false

- name: ConstructArgsNative
  gen_boilerplate: false

- name: ConstructArrayNative
  gen_boilerplate: false

# Takes in either an integer or boolean input and tests it for truthiness.
- name: TestIAndBranch
  successors: [ifTrue, ifFalse]
  operands:
    input: WordSized

# Takes in intptr input and tests it for truthiness.
- name: TestIPtrAndBranch
  successors: [ifTrue, ifFalse]
  operands:
    input: WordSized

# Takes in an int64 input and tests it for truthiness.
- name: TestI64AndBranch
  successors: [ifTrue, ifFalse]
  operands:
    input: Int64

# Takes in a double input and tests it for truthiness.
- name: TestDAndBranch
  successors: [ifTrue, ifFalse]
  operands:
    input: WordSized

# Takes in a float32 input and tests it for truthiness.
- name: TestFAndBranch
  successors: [ifTrue, ifFalse]
  operands:
    input: WordSized

# Takes in a bigint input and tests it for truthiness.
- name: TestBIAndBranch
  successors: [ifTrue, ifFalse]
  operands:
    input: WordSized

# Takes an object and tests it for truthiness. An object is falsy iff it
# emulates |undefined|; see js::EmulatesUndefined.
- name: TestOAndBranch
  successors: [ifTruthy, ifFalsy]
  operands:
    input: WordSized
  num_temps: 1
  mir_op: Test

# Takes in a boxed value and tests it for truthiness.
- name: TestVAndBranch
  successors: [ifTruthy, ifFalsy]
  operands:
    input: BoxedValue
  num_temps: 3
  mir_op: Test

# Compares two integral values of the same JS type, either integer or object.
# For objects, both operands are in registers.
- name: Compare
  result_type: WordSized
  operands:
    left: WordSized
    right: WordSized
  arguments:
    jsop: JSOp
  mir_op: true
  extra_name: true

- name: CompareI64
  result_type: WordSized
  operands:
    left: Int64
    right: Int64
  arguments:
    jsop: JSOp
  mir_op: Compare
  extra_name: true

- name: CompareI64AndBranch
  successors: [ifTrue, ifFalse]
  operands:
    left: Int64
    right: Int64
  arguments:
    cmpMir: MCompare*
    jsop: JSOp
  mir_op: Test
  extra_name: true

# Compares two integral values of the same JS type, either integer or object.
# For objects, both operands are in registers.
- name: CompareAndBranch
  successors: [ifTrue, ifFalse]
  operands:
    left: WordSized
    right: WordSized
  arguments:
    cmpMir: MCompare*
    jsop: JSOp
  mir_op: Test
  extra_name: true

- name: CompareD
  result_type: WordSized
  operands:
    left: WordSized
    right: WordSized
  mir_op: Compare

- name: CompareF
  result_type: WordSized
  operands:
    left: WordSized
    right: WordSized
  mir_op: Compare

- name: CompareDAndBranch
  successors: [ifTrue, ifFalse]
  operands:
    left: WordSized
    right: WordSized
  arguments:
    cmpMir: MCompare*

- name: CompareFAndBranch
  successors: [ifTrue, ifFalse]
  operands:
    left: WordSized
    right: WordSized
  arguments:
    cmpMir: MCompare*

- name: CompareS
  result_type: WordSized
  operands:
    left: WordSized
    right: WordSized
  mir_op: Compare

- name: CompareSInline
  result_type: WordSized
  operands:
    input: WordSized
  arguments:
    constant: JSLinearString*
  mir_op: Compare

- name: CompareSSingle
  result_type: WordSized
  operands:
    input: WordSized
  arguments:
    jsop: JSOp
    constant: JSLinearString*
  num_temps: 1
  mir_op: Compare

- name: CompareBigInt
  result_type: WordSized
  operands:
    left: WordSized
    right: WordSized
  num_temps: 3
  mir_op: Compare

- name: CompareBigIntInt32
  result_type: WordSized
  operands:
    left: WordSized
    right: WordSized
  num_temps: 2
  mir_op: Compare

- name: CompareBigIntDouble
  result_type: WordSized
  operands:
    left: WordSized
    right: WordSized
  call_instruction: true
  mir_op: Compare

- name: CompareBigIntString
  result_type: WordSized
  operands:
    left: WordSized
    right: WordSized
  call_instruction: true
  mir_op: Compare

- name: CompareBigIntInt32AndBranch
  successors: [ifTrue, ifFalse]
  operands:
    left: WordSized
    right: WordSized
  arguments:
    cmpMir: MCompare*
  num_temps: 2

- name: BitAndAndBranch
  successors: [ifTrue, ifFalse]
  operands:
    left: WordSized
    right: WordSized
  arguments:
    cond: Assembler::Condition

- name: BitAnd64AndBranch
  successors: [ifTrue, ifFalse]
  operands:
    left: Int64
    right: Int64
  arguments:
    cond: Assembler::Condition

# Takes a value and tests whether it is null, undefined, or is an object that
# emulates |undefined|, as determined by the JSCLASS_EMULATES_UNDEFINED class
# flag on unwrapped objects.  See also js::EmulatesUndefined.
- name: IsNullOrLikeUndefinedV
  result_type: WordSized
  operands:
    value: BoxedValue
  num_temps: 1
  mir_op: Compare

# Takes an object pointer and tests whether it is an object that emulates
# |undefined|, as above.
- name: IsNullOrLikeUndefinedT
  result_type: WordSized
  operands:
    input: WordSized
  mir_op: Compare

# Takes a value and tests whether it is null.
- name: IsNull
  result_type: WordSized
  operands:
    value: BoxedValue
  mir_op: Compare

# Takes a value and tests whether it is undefined.
- name: IsUndefined
  result_type: WordSized
  operands:
    value: BoxedValue
  mir_op: Compare

- name: IsNullOrLikeUndefinedAndBranchV
  successors: [ifTrue, ifFalse]
  operands:
    value: BoxedValue
  arguments:
    cmpMir: MCompare*
  num_temps: 2
  mir_op: Test

- name: IsNullOrLikeUndefinedAndBranchT
  successors: [ifTrue, ifFalse]
  operands:
    value: WordSized
  arguments:
    cmpMir: MCompare*
  num_temps: 1
  mir_op: Test

- name: IsNullAndBranch
  successors: [ifTrue, ifFalse]
  operands:
    value: BoxedValue
  arguments:
    cmpMir: MCompare*

- name: IsUndefinedAndBranch
  successors: [ifTrue, ifFalse]
  operands:
    value: BoxedValue
  arguments:
    cmpMir: MCompare*

- name: SameValueDouble
  result_type: WordSized
  operands:
    left: WordSized
    right: WordSized
  num_temps: 1

- name: SameValue
  result_type: WordSized
  operands:
    lhs: BoxedValue
    rhs: BoxedValue

# Not operation on an integer.
- name: NotI
  result_type: WordSized
  operands:
    input: WordSized

# Not operation on an intptr.
- name: NotIPtr
  result_type: WordSized
  operands:
    input: WordSized

# Not operation on an int64.
- name: NotI64
  result_type: WordSized
  operands:
    inputI64: Int64

# Not operation on a double.
- name: NotD
  result_type: WordSized
  operands:
    input: WordSized
  mir_op: Not

# Not operation on a float32.
- name: NotF
  result_type: WordSized
  operands:
    input: WordSized
  mir_op: Not

# Not operation on a BigInt.
- name: NotBI
  result_type: WordSized
  operands:
    input: WordSized
  mir_op: Not

# Boolean complement operation on an object.
- name: NotO
  result_type: WordSized
  operands:
    input: WordSized
  mir_op: Not

# Boolean complement operation on a value.
- name: NotV
  result_type: WordSized
  operands:
    input: BoxedValue
  num_temps: 2
  mir_op: Not

# Bitwise not operation, takes a 32-bit integer as input and returning
# a 32-bit integer result as an output.
- name: BitNotI
  result_type: WordSized
  operands:
    input: WordSized
  defer_init: true

- name: BitNotI64
  result_type: Int64
  operands:
    input: Int64
  defer_init: true

# Binary bitwise operation, taking two 32-bit integers as inputs and returning
# a 32-bit integer result as an output.
- name: BitOpI
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
  arguments:
    bitop: JSOp
  extra_name: true
  defer_init: true

- name: BitOpI64
  result_type: Int64
  operands:
    lhs: Int64
    rhs: Int64
  arguments:
    bitop: JSOp
  extra_name: true
  defer_init: true

# Shift operation, taking two 32-bit integers as inputs and returning
# a 32-bit integer result as an output.
- name: ShiftI
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
  arguments:
    bitop: JSOp
  mir_op: Instruction
  extra_name: true
  defer_init: true

- name: ShiftI64
  result_type: Int64
  operands:
    lhs: Int64
    rhs: WordSized
  arguments:
    bitop: JSOp
  mir_op: Instruction
  extra_name: true
  defer_init: true

- name: SignExtendInt32
  result_type: WordSized
  operands:
    input: WordSized
  mir_op: true

- name: SignExtendIntPtr
  result_type: WordSized
  operands:
    input: WordSized
  mir_op: true

- name: SignExtendInt64
  result_type: Int64
  operands:
    input: Int64
  mir_op: true

- name: UrshD
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
  num_temps: 1

- name: Return
  gen_boilerplate: false

- name: Throw
  operands:
    value: BoxedValue
  call_instruction: true

- name: ThrowWithStack
  operands:
    value: BoxedValue
    stack: BoxedValue
  call_instruction: true

- name: MinMaxI
  result_type: WordSized
  operands:
    first: WordSized
    second: WordSized
  mir_op: MinMax
  extra_name: true

- name: MinMaxD
  result_type: WordSized
  operands:
    first: WordSized
    second: WordSized
  mir_op: MinMax
  extra_name: true

- name: MinMaxF
  result_type: WordSized
  operands:
    first: WordSized
    second: WordSized
  mir_op: MinMax
  extra_name: true

- name: MinMaxArrayI
  result_type: WordSized
  operands:
    array: WordSized
  num_temps: 3
  mir_op: MinMaxArray

- name: MinMaxArrayD
  result_type: WordSized
  operands:
    array: WordSized
  num_temps: 3
  mir_op: MinMaxArray

# Negative of integer
- name: NegI
  result_type: WordSized
  operands:
    input: WordSized

# Negative of an int64
- name: NegI64
  result_type: Int64
  operands:
    input: Int64

# Negative of double
- name: NegD
  result_type: WordSized
  operands:
    input: WordSized

# Negative of float32
- name: NegF
  result_type: WordSized
  operands:
    input: WordSized

# Absolute value of an integer.
- name: AbsI
  result_type: WordSized
  operands:
    input: WordSized
  mir_op: Abs

# Absolute value of a double.
- name: AbsD
  result_type: WordSized
  operands:
    input: WordSized

# Absolute value of a float32.
- name: AbsF
  result_type: WordSized
  operands:
    input: WordSized

# Copysign for doubles.
- name: CopySignD
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
  num_temps: 2
  defer_init: true

# Copysign for float32.
- name: CopySignF
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
  num_temps: 2
  defer_init: true

# Count leading zeroes on an int32.
- name: ClzI
  result_type: WordSized
  operands:
    input: WordSized
  mir_op: Clz

# Count leading zeroes on an int64.
- name: ClzI64
  result_type: Int64
  operands:
    input: Int64
  mir_op: Clz

# Count trailing zeroes on an int32.
- name: CtzI
  result_type: WordSized
  operands:
    input: WordSized
  mir_op: Ctz

# Count trailing zeroes on an int64.
- name: CtzI64
  result_type: Int64
  operands:
    input: Int64
  mir_op: Ctz

# Count population on an int32.
- name: PopcntI
  result_type: WordSized
  operands:
    input: WordSized
  num_temps: 1
  mir_op: Popcnt

# Count population on an int64.
- name: PopcntI64
  result_type: Int64
  operands:
    input: Int64
  num_temps: 1
  mir_op: Popcnt

- name: SqrtD
  result_type: WordSized
  operands:
    input: WordSized

- name: SqrtF
  result_type: WordSized
  operands:
    input: WordSized

- name: Atan2D
  result_type: WordSized
  operands:
    y: WordSized
    x: WordSized
  call_instruction: true

- name: Hypot
  gen_boilerplate: false

# Double raised to an integer power.
- name: PowI
  result_type: WordSized
  operands:
    value: WordSized
    power: WordSized
  call_instruction: true

# Integer raised to an integer power.
- name: PowII
  result_type: WordSized
  operands:
    value: WordSized
    power: WordSized
  num_temps: 2
  mir_op: Pow

# Double raised to a double power.
- name: PowD
  result_type: WordSized
  operands:
    value: WordSized
    power: WordSized
  call_instruction: true

# Constant of a power of two raised to an integer power.
- name: PowOfTwoI
  result_type: WordSized
  operands:
    power: WordSized
  arguments:
    base: uint32_t

# Sign value of an integer.
- name: SignI
  result_type: WordSized
  operands:
    input: WordSized

# Sign value of an integer.
- name: SignD
  result_type: WordSized
  operands:
    input: WordSized

# Sign value of a double with expected int32 result.
- name: SignDI
  result_type: WordSized
  operands:
    input: WordSized
  num_temps: 1

# Sign value of a int32 with expected double result.
- name: SignID
  result_type: WordSized
  operands:
    input: WordSized
  num_temps: 1

- name: MathFunctionD
  result_type: WordSized
  operands:
    input: WordSized
  call_instruction: true
  mir_op: MathFunction
  extra_name: true

- name: MathFunctionF
  result_type: WordSized
  operands:
    input: WordSized
  call_instruction: true
  mir_op: MathFunction
  extra_name: true

- name: AddI
  gen_boilerplate: false

- name: AddI64
  result_type: Int64
  operands:
    lhs: Int64
    rhs: Int64
  defer_init: true

- name: SubI
  gen_boilerplate: false

- name: SubI64
  result_type: Int64
  operands:
    lhs: Int64
    rhs: Int64
  defer_init: true

- name: MulI64
  result_type: Int64
  operands:
    lhs: Int64
    rhs: Int64
  num_temps: 1
  defer_init: true

# Performs an add, sub, mul, or div on two double values.
- name: MathD
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
  arguments:
    jsop: JSOp
  extra_name: true
  defer_init: true

# Performs an add, sub, mul, or div on two float values.
- name: MathF
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
  arguments:
    jsop: JSOp
  extra_name: true
  defer_init: true

- name: ModD
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
  call_instruction: true
  mir_op: Mod

- name: ModPowTwoD
  result_type: WordSized
  operands:
    lhs: WordSized
  arguments:
    divisor: uint32_t
  mir_op: Mod

- name: WasmBuiltinModD
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
    instance: WordSized
  call_instruction: true
  mir_op: true

- name: BigIntAdd
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
  call_instruction: true
  mir_op: true

- name: BigIntSub
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
  call_instruction: true
  mir_op: true

- name: BigIntMul
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
  call_instruction: true
  mir_op: true

- name: BigIntDiv
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
  call_instruction: true
  mir_op: true

- name: BigIntMod
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
  call_instruction: true
  mir_op: true

- name: BigIntPow
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
  call_instruction: true
  mir_op: true

- name: BigIntBitAnd
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
  call_instruction: true
  mir_op: true

- name: BigIntBitOr
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
  call_instruction: true
  mir_op: true

- name: BigIntBitXor
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
  call_instruction: true
  mir_op: true

- name: BigIntLsh
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
  call_instruction: true
  mir_op: true

- name: BigIntRsh
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
  call_instruction: true
  mir_op: true

- name: BigIntIncrement
  result_type: WordSized
  operands:
    input: WordSized
  call_instruction: true
  mir_op: true

- name: BigIntDecrement
  result_type: WordSized
  operands:
    input: WordSized
  call_instruction: true
  mir_op: true

- name: BigIntNegate
  result_type: WordSized
  operands:
    input: WordSized
  num_temps: 1
  mir_op: true

- name: BigIntBitNot
  result_type: WordSized
  operands:
    input: WordSized
  call_instruction: true
  mir_op: true

- name: BigIntToIntPtr
  result_type: WordSized
  operands:
    input: WordSized
  mir_op: true

- name: IntPtrToBigInt
  result_type: WordSized
  operands:
    input: WordSized
  num_temps: 1
  mir_op: true

- name: BigIntPtrAdd
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
  mir_op: true

- name: BigIntPtrSub
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
  mir_op: true

- name: BigIntPtrMul
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
  mir_op: true

- name: BigIntPtrDiv
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
  num_temps: 2
  mir_op: true

- name: BigIntPtrDivPowTwo
  result_type: WordSized
  operands:
    lhs: WordSized
  arguments:
    shift: int32_t
    negativeDivisor: bool

- name: BigIntPtrMod
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
  num_temps: 2
  mir_op: true

- name: BigIntPtrModPowTwo
  result_type: WordSized
  operands:
    lhs: WordSized
  arguments:
    shift: int32_t
  num_temps: 1

- name: BigIntPtrPow
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
  num_temps: 2
  mir_op: true

- name: BigIntPtrBitAnd
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
  mir_op: true

- name: BigIntPtrBitOr
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
  mir_op: true

- name: BigIntPtrBitXor
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
  mir_op: true

- name: BigIntPtrLsh
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
  num_temps: 2
  mir_op: true

- name: BigIntPtrRsh
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
  num_temps: 2
  mir_op: true

- name: BigIntPtrBitNot
  result_type: WordSized
  operands:
    input: WordSized
  mir_op: true

- name: Int32ToStringWithBase
  result_type: WordSized
  operands:
    input: WordSized
    base: WordSized
  num_temps: 2
  mir_op: true

- name: NumberParseInt
  result_type: BoxedValue
  operands:
    string: WordSized
    radix: WordSized
  num_temps: 1
  call_instruction: true
  mir_op: true

- name: DoubleParseInt
  result_type: WordSized
  operands:
    number: WordSized
  num_temps: 1
  mir_op: true

# Adds two string, returning a string.
- name: Concat
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
  num_temps: 5

# Linearize a string.
- name: LinearizeString
  result_type: WordSized
  operands:
    str: WordSized
  mir_op: true

# Linearize a string before a character access.
- name: LinearizeForCharAccess
  result_type: WordSized
  operands:
    str: WordSized
    index: WordSized
  mir_op: true

# Linearize a string before a code point access.
- name: LinearizeForCodePointAccess
  result_type: WordSized
  operands:
    str: WordSized
    index: WordSized
  num_temps: 1
  mir_op: true

# Compute the relative string index.
- name: ToRelativeStringIndex
  result_type: WordSized
  operands:
    index: WordSized
    length: WordSized
  mir_op: true

# Get uint16 character code from a string.
- name: CharCodeAt
  result_type: WordSized
  operands:
    str: WordSized
    index: WordSized
  num_temps: 2

# Get uint16 character code from a string. Return -1 on out-of-bounds.
- name: CharCodeAtOrNegative
  result_type: WordSized
  operands:
    str: WordSized
    index: WordSized
  num_temps: 2

# Get uint32 code point from a string.
- name: CodePointAt
  result_type: WordSized
  operands:
    str: WordSized
    index: WordSized
  num_temps: 2

# Get uint32 code point from a string. Return -1 on out-of-bounds.
- name: CodePointAtOrNegative
  result_type: WordSized
  operands:
    str: WordSized
    index: WordSized
  num_temps: 2

# Box the input if non-negative. Otherwise return NaN.
- name: NegativeToNaN
  result_type: BoxedValue
  operands:
    input: WordSized

# Box the input if non-negative. Otherwise return undefined.
- name: NegativeToUndefined
  result_type: BoxedValue
  operands:
    input: WordSized

# Convert uint16 character code to a string.
- name: FromCharCode
  result_type: WordSized
  operands:
    code: WordSized

# Convert non-negative input as a uint16 character code to a string. If the
# input is negative, return the empty string.
- name: FromCharCodeEmptyIfNegative
  result_type: WordSized
  operands:
    code: WordSized

# Convert non-negative input as a uint16 character code to a string. If the
# input is negative, return the undefined value.
- name: FromCharCodeUndefinedIfNegative
  result_type: BoxedValue
  operands:
    code: WordSized

# Convert uint32 code point to a string.
- name: FromCodePoint
  result_type: WordSized
  operands:
    codePoint: WordSized
  num_temps: 2

# Test if a string includes the search string.
- name: StringIncludes
  result_type: WordSized
  operands:
    string: WordSized
    searchString: WordSized
  call_instruction: true

# Test if a string includes the constant search string.
- name: StringIncludesSIMD
  result_type: WordSized
  operands:
    string: WordSized
  arguments:
    searchString: JSLinearString*
  num_temps: 3

# Search for the first index of the search string.
- name: StringIndexOf
  result_type: WordSized
  operands:
    string: WordSized
    searchString: WordSized
  call_instruction: true

# Search for the first index of the constant search string.
- name: StringIndexOfSIMD
  result_type: WordSized
  operands:
    string: WordSized
  arguments:
    searchString: JSLinearString*
  num_temps: 3

# Search for the last index of the search string.
- name: StringLastIndexOf
  result_type: WordSized
  operands:
    string: WordSized
    searchString: WordSized
  call_instruction: true

# Test if a string starts with the search string
- name: StringStartsWith
  result_type: WordSized
  operands:
    string: WordSized
    searchString: WordSized
  call_instruction: true

# Test if a string starts with the constant search string
- name: StringStartsWithInline
  result_type: WordSized
  operands:
    string: WordSized
  arguments:
    searchString: JSLinearString*
  num_temps: 1

# Test if a string ends with the search string
- name: StringEndsWith
  result_type: WordSized
  operands:
    string: WordSized
    searchString: WordSized
  call_instruction: true

# Test if a string ends with the constant search string
- name: StringEndsWithInline
  result_type: WordSized
  operands:
    string: WordSized
  arguments:
    searchString: JSLinearString*
  num_temps: 1

# Calls the ToLowerCase case conversion function. Inlines the case conversion
# when possible.
- name: StringToLowerCase
  result_type: WordSized
  operands:
    string: WordSized
  num_temps: 5
  mir_op: StringConvertCase

# Calls the ToLowerCase case conversion function. Inlines the case conversion
# when possible.
- name: CharCodeToLowerCase
  result_type: WordSized
  operands:
    code: WordSized
  num_temps: 1
  mir_op: CharCodeConvertCase

# Calls the ToUpperCase case conversion function.
- name: StringToUpperCase
  result_type: WordSized
  operands:
    string: WordSized
  call_instruction: true
  mir_op: StringConvertCase

# Calls the ToUpperCase case conversion function. Inlines the case conversion
# when possible.
- name: CharCodeToUpperCase
  result_type: WordSized
  operands:
    code: WordSized
  num_temps: 1
  mir_op: CharCodeConvertCase

# Index of first non-whitespace character.
- name: StringTrimStartIndex
  result_type: WordSized
  operands:
    string: WordSized

# Index of last non-whitespace character.
- name: StringTrimEndIndex
  result_type: WordSized
  operands:
    string: WordSized
    start: WordSized

- name: StringSplit
  result_type: WordSized
  operands:
    string: WordSized
    separator: WordSized
  call_instruction: true
  mir_op: true

- name: Substr
  result_type: WordSized
  operands:
    string: WordSized
    begin: WordSized
    length: WordSized
  num_temps: 3
  mir_op: true

- name: Int32ToDouble
  result_type: WordSized
  operands:
    input: WordSized

- name: Float32ToDouble
  result_type: WordSized
  operands:
    input: WordSized

- name: DoubleToFloat32
  result_type: WordSized
  operands:
    input: WordSized

- name: Int32ToFloat32
  result_type: WordSized
  operands:
    input: WordSized

- name: DoubleToFloat16
  result_type: WordSized
  operands:
    input: WordSized
  num_temps: 1

- name: DoubleToFloat32ToFloat16
  result_type: WordSized
  operands:
    input: WordSized
  num_temps: 2

- name: Float32ToFloat16
  result_type: WordSized
  operands:
    input: WordSized
  num_temps: 1

- name: Int32ToFloat16
  result_type: WordSized
  operands:
    input: WordSized
  num_temps: 1

# Convert a value to a double.
- name: ValueToDouble
  result_type: WordSized
  operands:
    input: BoxedValue
  mir_op: ToDouble

# Convert a value to a float32.
- name: ValueToFloat32
  result_type: WordSized
  operands:
    input: BoxedValue
  mir_op: ToFloat32

# Convert a value to a float16.
- name: ValueToFloat16
  result_type: WordSized
  operands:
    input: BoxedValue
  num_temps: 1
  mir_op: ToFloat16

# Convert a value to an int32.
- name: ValueToNumberInt32
  result_type: WordSized
  operands:
    input: BoxedValue
  num_temps: 1
  mir_op: ToNumberInt32

# Convert a value to an int32 with truncation.
- name: ValueTruncateToInt32
  result_type: WordSized
  operands:
    input: BoxedValue
  num_temps: 2
  mir_op: TruncateToInt32

# Convert a value to a BigInt.
- name: ValueToBigInt
  result_type: WordSized
  operands:
    input: BoxedValue
  mir_op: ToBigInt

# Convert a double to an int32.
#   Input: floating-point Register
#   Output: 32-bit integer
#   Bailout: if the double cannot be converted to an integer.
- name: DoubleToInt32
  result_type: WordSized
  operands:
    input: WordSized
  mir_op: ToNumberInt32

# Convert a float32 to an int32.
#   Input: floating-point Register
#   Output: 32-bit integer
#   Bailout: if the float32 cannot be converted to an integer.
- name: Float32ToInt32
  result_type: WordSized
  operands:
    input: WordSized
  mir_op: ToNumberInt32

# Convert a double to a truncated int32.
#   Input: floating-point Register
#   Output: 32-bit integer
- name: TruncateDToInt32
  result_type: WordSized
  operands:
    input: WordSized
  num_temps: 1
  mir_op: TruncateToInt32

# Convert a double to a truncated int32 with instance offset because we need it
# for the slow ool path.
- name: WasmBuiltinTruncateDToInt32
  result_type: WordSized
  operands:
    input: WordSized
    instance: WordSized
  num_temps: 1
  mir_op: WasmBuiltinTruncateToInt32

# Convert a float32 to a truncated int32.
#   Input: floating-point Register
#   Output: 32-bit integer
- name: TruncateFToInt32
  result_type: WordSized
  operands:
    input: WordSized
  num_temps: 1
  mir_op: TruncateToInt32

# Convert a float32 to a truncated int32 with instance offset because we need
# it for the slow ool path.
- name: WasmBuiltinTruncateFToInt32
  result_type: WordSized
  operands:
    input: WordSized
    instance: WordSized
  num_temps: 1
  mir_op: WasmBuiltinTruncateToInt32

- name: WasmTruncateToInt32
  result_type: WordSized
  operands:
    input: WordSized
  mir_op: true

- name: WrapInt64ToInt32
  result_type: WordSized
  operands:
    input: Int64
  mir_op: true

- name: ExtendInt32ToInt64
  result_type: Int64
  operands:
    input: WordSized
  mir_op: true

# Convert a boolean value to a string.
- name: BooleanToString
  result_type: WordSized
  operands:
    input: WordSized
  mir_op: ToString

# Convert an integer hosted on one definition to a string with a function call.
- name: IntToString
  result_type: WordSized
  operands:
    input: WordSized
  mir_op: ToString

# Convert a double hosted on one definition to a string with a function call.
- name: DoubleToString
  result_type: WordSized
  operands:
    input: WordSized
  num_temps: 1
  mir_op: ToString

# Convert a primitive to a string with a function call.
- name: ValueToString
  result_type: WordSized
  operands:
    input: BoxedValue
  num_temps: 1
  mir_op: ToString

# Double raised to a half power.
- name: PowHalfD
  result_type: WordSized
  operands:
    input: WordSized
  mir_op: PowHalf

- name: NaNToZero
  result_type: WordSized
  operands:
    input: WordSized
  num_temps: 1
  mir_op: true

- name: OsrEntry
  gen_boilerplate: false

# Materialize a Value stored in an interpreter frame for OSR.
- name: OsrValue
  result_type: BoxedValue
  operands:
    entry: WordSized
  mir_op: true

# Materialize a JSObject env chain stored in an interpreter frame for OSR.
- name: OsrEnvironmentChain
  result_type: WordSized
  operands:
    entry: WordSized
  mir_op: true

# Materialize a JSObject env chain stored in an interpreter frame for OSR.
- name: OsrReturnValue
  result_type: BoxedValue
  operands:
    entry: WordSized
  mir_op: true

- name: OsrArgumentsObject
  result_type: WordSized
  operands:
    entry: WordSized
  mir_op: true

- name: RegExp
  result_type: WordSized
  num_temps: 1
  mir_op: true

- name: RegExpMatcher
  result_type: BoxedValue
  operands:
    regexp: WordSized
    string: WordSized
    lastIndex: WordSized
  call_instruction: true
  mir_op: true

- name: RegExpSearcher
  result_type: WordSized
  operands:
    regexp: WordSized
    string: WordSized
    lastIndex: WordSized
  call_instruction: true
  mir_op: true

- name: RegExpSearcherLastLimit
  result_type: WordSized
  operands:
  num_temps: 1

- name: RegExpExecMatch
  result_type: BoxedValue
  operands:
    regexp: WordSized
    string: WordSized
  call_instruction: true
  num_temps: 0
  mir_op: true

- name: RegExpExecTest
  result_type: WordSized
  operands:
    regexp: WordSized
    string: WordSized
  call_instruction: true
  num_temps: 0
  mir_op: true

- name: RegExpHasCaptureGroups
  result_type: WordSized
  operands:
    regexp: WordSized
    input: WordSized
  mir_op: true

- name: RegExpPrototypeOptimizable
  result_type: WordSized
  operands:
    object: WordSized
  num_temps: 1
  mir_op: true

- name: RegExpInstanceOptimizable
  result_type: WordSized
  operands:
    object: WordSized
    proto: WordSized
  num_temps: 1
  mir_op: true

- name: GetFirstDollarIndex
  result_type: WordSized
  operands:
    str: WordSized
  num_temps: 3

- name: StringReplace
  result_type: WordSized
  operands:
    string: WordSized
    pattern: WordSized
    replacement: WordSized
  call_instruction: true
  mir_op: true

- name: BinaryValueCache
  result_type: BoxedValue
  operands:
    lhs: BoxedValue
    rhs: BoxedValue
  # Takes two temps: these are intended to be FloatReg0 and FloatReg1
  # to allow the actual cache code to safely clobber those values without
  # save and restore.
  num_temps: 2
  mir_op: BinaryCache

- name: BinaryBoolCache
  result_type: WordSized
  operands:
    lhs: BoxedValue
    rhs: BoxedValue
  # Takes two temps: these are intendend to be FloatReg0 and FloatReg1
  # To allow the actual cache code to safely clobber those values without
  # save and restore.
  num_temps: 2
  mir_op: BinaryCache

- name: UnaryCache
  result_type: BoxedValue
  operands:
    input: BoxedValue
  mir_op_cast: true

- name: ModuleMetadata
  result_type: WordSized
  call_instruction: true
  mir_op: true

- name: DynamicImport
  result_type: WordSized
  operands:
    specifier: BoxedValue
    options: BoxedValue
  call_instruction: true
  mir_op: true

- name: Lambda
  result_type: WordSized
  operands:
    environmentChain: WordSized
  num_temps: 1
  mir_op: true

- name: FunctionWithProto
  result_type: WordSized
  operands:
    envChain: WordSized
    prototype: WordSized
  call_instruction: true
  mir_op: true

- name: SetFunName
  result_type: WordSized
  operands:
    fun: WordSized
    name: BoxedValue
  call_instruction: true
  mir_op: true

- name: KeepAliveObject
  operands:
    object: WordSized

- name: DebugEnterGCUnsafeRegion
  num_temps: 1

- name: DebugLeaveGCUnsafeRegion
  num_temps: 1

# Load the "slots" member out of a JSObject.
#   Input: JSObject pointer
#   Output: slots pointer
- name: Slots
  result_type: WordSized
  operands:
    object: WordSized

# Load the "elements" member out of a JSObject.
#   Input: JSObject pointer
#   Output: elements pointer
- name: Elements
  result_type: WordSized
  operands:
    object: WordSized
  mir_op: true

# Load the initialized length from an elements header.
- name: InitializedLength
  result_type: WordSized
  operands:
    elements: WordSized

# Store to the initialized length in an elements header. Note the input is an
# *index*, one less than the desired initialized length.
- name: SetInitializedLength
  operands:
    elements: WordSized
    index: WordSized

# Load the length from an elements header.
- name: ArrayLength
  result_type: WordSized
  operands:
    elements: WordSized

# Store to the length in an elements header. Note the input is an *index*,
# one less than the desired length.
- name: SetArrayLength
  operands:
    elements: WordSized
    index: WordSized

# Load the "length" property of a function.
- name: FunctionLength
  result_type: WordSized
  operands:
    function: WordSized

# Load the "name" property of a function.
- name: FunctionName
  result_type: WordSized
  operands:
    function: WordSized

- name: GetNextEntryForIterator
  result_type: WordSized
  operands:
    iter: WordSized
    result: WordSized
  num_temps: 3
  mir_op: true

- name: ArrayBufferByteLength
  result_type: WordSized
  operands:
    object: WordSized

- name: ArrayBufferViewLength
  result_type: WordSized
  operands:
    object: WordSized
  mir_op: true

# Read the byteOffset of an array buffer view.
- name: ArrayBufferViewByteOffset
  result_type: WordSized
  operands:
    object: WordSized

# Load an array buffer view's elements vector.
- name: ArrayBufferViewElements
  result_type: WordSized
  operands:
    object: WordSized

# Return the element size of a typed array.
- name: TypedArrayElementSize
  result_type: WordSized
  operands:
    object: WordSized

# Read the length of a resizable typed array.
- name: ResizableTypedArrayLength
  result_type: WordSized
  operands:
    object: WordSized
  arguments:
    synchronization: js::jit::Synchronization
  num_temps: 1

# Read the possibly out-of-bounds byteOffset of a resizable typed array.
- name: ResizableTypedArrayByteOffsetMaybeOutOfBounds
  result_type: WordSized
  operands:
    object: WordSized
  num_temps: 1

# Read the byte length of a resizable data view.
- name: ResizableDataViewByteLength
  result_type: WordSized
  operands:
    object: WordSized
  arguments:
    synchronization: js::jit::Synchronization
  num_temps: 1

# Read the byte length of a growable shared array buffer.
- name: GrowableSharedArrayBufferByteLength
  result_type: WordSized
  operands:
    object: WordSized

# Guard a resizable array buffer view is in-bounds.
- name: GuardResizableArrayBufferViewInBounds
  operands:
    object: WordSized
  num_temps: 1

# Guard a resizable array buffer view is in-bounds.
- name: GuardResizableArrayBufferViewInBoundsOrDetached
  operands:
    object: WordSized
  num_temps: 1

- name: GuardHasAttachedArrayBuffer
  operands:
    object: WordSized
  num_temps: 1

# Double to IntPtr, eligible for accessing into a TypedArray or DataView. If
# the index isn't exactly representable as an IntPtr, depending on the
# supportOOB flag on the MIR instruction, either bail out or produce an IntPtr
# which is equivalent to an OOB access.
- name: GuardNumberToIntPtrIndex
  result_type: WordSized
  operands:
    input: WordSized
  mir_op: true

# Bailout if index >= length.
- name: BoundsCheck
  operands:
    index: WordSized
    length: WordSized
  mir_op: true

# Bailout if index + minimum < 0 or index + maximum >= length.
- name: BoundsCheckRange
  operands:
    index: WordSized
    length: WordSized
  num_temps: 1
  mir_op: BoundsCheck

# Bailout if index < minimum.
- name: BoundsCheckLower
  operands:
    index: WordSized
  mir_op: true

- name: SpectreMaskIndex
  result_type: WordSized
  operands:
    index: WordSized
    length: WordSized
  mir_op: true

# Load a value from a dense array's elements vector. Bail out if it's the hole
# value.
- name: LoadElementV
  result_type: BoxedValue
  operands:
    elements: WordSized
    index: WordSized
  mir_op: LoadElement

- name: InArray
  result_type: WordSized
  operands:
    elements: WordSized
    index: WordSized
    initLength: WordSized
  mir_op: true

- name: GuardElementNotHole
  operands:
    elements: WordSized
    index: WordSized

# Load a value from an array's elements vector, loading |undefined| if we hit a
# hole. Bail out if we get a negative index.
- name: LoadElementHole
  result_type: BoxedValue
  operands:
    elements: WordSized
    index: WordSized
    initLength: WordSized
  mir_op: true

# Store a boxed value to a dense array's element vector.
- name: StoreElementV
  operands:
    elements: WordSized
    index: WordSized
    value: BoxedValue
  mir_op: StoreElement
  extra_name: true

# Store a typed value to a dense array's elements vector. Compared to
# LStoreElementV, this instruction can store doubles and constants directly,
# and does not store the type tag if the array is monomorphic and known to
# be packed.
- name: StoreElementT
  operands:
    elements: WordSized
    index: WordSized
    value: WordSized
  mir_op: StoreElement
  extra_name: true

- name: StoreHoleValueElement
  operands:
    elements: WordSized
    index: WordSized

# Like LStoreElementV, but supports indexes >= initialized length.
- name: StoreElementHoleV
  operands:
    object: WordSized
    elements: WordSized
    index: WordSized
    value: BoxedValue
  num_temps: 1
  mir_op: StoreElementHole

# Like LStoreElementT, but supports indexes >= initialized length.
- name: StoreElementHoleT
  operands:
    object: WordSized
    elements: WordSized
    index: WordSized
    value: WordSized
  num_temps: 1
  mir_op: StoreElementHole

- name: ArrayPopShift
  result_type: BoxedValue
  operands:
    object: WordSized
  num_temps: 2
  mir_op: true
  extra_name: true

- name: ArrayPush
  result_type: WordSized
  operands:
    object: WordSized
    value: BoxedValue
  num_temps: 2
  mir_op: true

- name: ArraySlice
  result_type: WordSized
  operands:
    object: WordSized
    begin: WordSized
    end: WordSized
  num_temps: 2
  call_instruction: true
  mir_op: true

- name: ArgumentsSlice
  result_type: WordSized
  operands:
    object: WordSized
    begin: WordSized
    end: WordSized
  num_temps: 2
  call_instruction: true
  mir_op: true

- name: FrameArgumentsSlice
  result_type: WordSized
  operands:
    begin: WordSized
    count: WordSized
  num_temps: 1
  mir_op: true

- name: InlineArgumentsSlice
  gen_boilerplate: false

- name: NormalizeSliceTerm
  result_type: WordSized
  operands:
    value: WordSized
    length: WordSized
  mir_op: true

- name: ArrayJoin
  result_type: WordSized
  operands:
    array: WordSized
    separator: WordSized
  num_temps: 1
  call_instruction: true
  mir_op: true

- name: ObjectKeys
  result_type: WordSized
  operands:
    object: WordSized
  num_temps: 0
  call_instruction: true

- name: ObjectKeysLength
  result_type: WordSized
  operands:
    object: WordSized
  num_temps: 0
  call_instruction: true

- name: LoadUnboxedScalar
  result_type: WordSized
  operands:
    elements: WordSized
    index: WordSized
  num_temps: 2
  mir_op: true

- name: LoadUnboxedInt64
  result_type: Int64
  operands:
    elements: WordSized
    index: WordSized
  mir_op: LoadUnboxedScalar

- name: LoadDataViewElement
  result_type: WordSized
  operands:
    elements: WordSized
    index: WordSized
    littleEndian: WordSized
  num_temps: 2
  num_temps64: 1
  mir_op: true

- name: LoadDataViewElement64
  result_type: Int64
  operands:
    elements: WordSized
    index: WordSized
    littleEndian: WordSized
  mir_op: LoadDataViewElement

- name: LoadTypedArrayElementHole
  result_type: BoxedValue
  operands:
    elements: WordSized
    index: WordSized
    length: WordSized
  num_temps: 1
  mir_op: true

- name: LoadTypedArrayElementHoleBigInt
  result_type: BoxedValue
  operands:
    elements: WordSized
    index: WordSized
    length: WordSized
  num_temps: 1
  num_temps64: 1
  mir_op: LoadTypedArrayElementHole

- name: StoreUnboxedScalar
  operands:
    elements: WordSized
    index: WordSized
    value: WordSized
  num_temps: 1
  mir_op: true

- name: StoreUnboxedInt64
  operands:
    elements: WordSized
    index: WordSized
    value: Int64
  mir_op: StoreUnboxedScalar

- name: StoreDataViewElement
  operands:
    elements: WordSized
    index: WordSized
    value: WordSized
    littleEndian: WordSized
  num_temps: 1
  num_temps64: 1
  mir_op: true

- name: StoreDataViewElement64
  operands:
    elements: WordSized
    index: WordSized
    value: Int64
    littleEndian: WordSized
  num_temps64: 1
  mir_op: StoreDataViewElement

- name: StoreTypedArrayElementHole
  operands:
    elements: WordSized
    length: WordSized
    index: WordSized
    value: WordSized
  num_temps: 1
  mir_op: true

- name: StoreTypedArrayElementHoleInt64
  operands:
    elements: WordSized
    length: WordSized
    index: WordSized
    value: Int64
  num_temps: 1
  mir_op: StoreTypedArrayElementHole

- name: AtomicIsLockFree
  result_type: WordSized
  operands:
    value: WordSized

- name: CompareExchangeTypedArrayElement
  result_type: WordSized
  operands:
    elements: WordSized
    index: WordSized
    oldval: WordSized
    newval: WordSized
  # Needs additional temps on LL/SC platforms to extract/insert bits of word.
#if defined(JS_CODEGEN_MIPS32) || defined(JS_CODEGEN_MIPS64) || defined(JS_CODEGEN_LOONG64) || defined(JS_CODEGEN_RISCV64)
  num_temps: 4
#else
  num_temps: 1
#endif
  mir_op: true

- name: AtomicExchangeTypedArrayElement
  result_type: WordSized
  operands:
    elements: WordSized
    index: WordSized
    value: WordSized
  # Needs additional temps on LL/SC platforms to extract/insert bits of word.
#if defined(JS_CODEGEN_MIPS32) || defined(JS_CODEGEN_MIPS64) || defined(JS_CODEGEN_LOONG64) || defined(JS_CODEGEN_RISCV64)
  num_temps: 4
#else
  num_temps: 1
#endif
  mir_op: true

- name: AtomicTypedArrayElementBinop
  result_type: WordSized
  operands:
    elements: WordSized
    index: WordSized
    value: WordSized
  # Needs additional temps on LL/SC platforms to extract/insert bits of word.
#if defined(JS_CODEGEN_MIPS32) || defined(JS_CODEGEN_MIPS64) || defined(JS_CODEGEN_LOONG64) || defined(JS_CODEGEN_RISCV64)
  num_temps: 4
#else
  num_temps: 2
#endif
  mir_op: true

# Atomic binary operation where the result is discarded.
- name: AtomicTypedArrayElementBinopForEffect
  operands:
    elements: WordSized
    index: WordSized
    value: WordSized
  # Additional temp that may be used on LL/SC platforms for the flag result of the store.
  # Needs additional temps on LL/SC platforms to extract/insert bits of word.
#if defined(JS_CODEGEN_ARM) || defined(JS_CODEGEN_ARM64)
  num_temps: 1
#elif defined(JS_CODEGEN_MIPS32) || defined(JS_CODEGEN_MIPS64) || defined(JS_CODEGEN_LOONG64) || defined(JS_CODEGEN_RISCV64)
  num_temps: 3
#endif
  mir_op: AtomicTypedArrayElementBinop

- name: AtomicLoad64
  result_type: Int64
  operands:
    elements: WordSized
    index: WordSized
#ifdef JS_CODEGEN_X86
  num_temps64: 1
#endif
  mir_op: LoadUnboxedScalar

- name: AtomicStore64
  operands:
    elements: WordSized
    index: WordSized
    value: Int64
#if defined(JS_CODEGEN_X86) || defined(JS_CODEGEN_ARM)
  num_temps64: 1
#endif
  mir_op: StoreUnboxedScalar

- name: CompareExchangeTypedArrayElement64
  result_type: Int64
  operands:
    elements: WordSized
    index: WordSized
    oldval: Int64
    newval: Int64
  mir_op: CompareExchangeTypedArrayElement

- name: AtomicExchangeTypedArrayElement64
  result_type: Int64
  operands:
    elements: WordSized
    index: WordSized
    value: Int64
  mir_op: AtomicExchangeTypedArrayElement

- name: AtomicTypedArrayElementBinop64
  result_type: Int64
  operands:
    elements: WordSized
    index: WordSized
    value: Int64
#ifndef JS_CODEGEN_X86
  num_temps64: 1
#endif
  mir_op: AtomicTypedArrayElementBinop

# Atomic binary operation where the result is discarded.
- name: AtomicTypedArrayElementBinopForEffect64
  operands:
    elements: WordSized
    index: WordSized
    value: Int64
#ifndef JS_CODEGEN_X64
  num_temps64: 1
#endif
  mir_op: AtomicTypedArrayElementBinop

- name: EffectiveAddress
  result_type: WordSized
  operands:
    base: WordSized
    index: WordSized
  mir_op: true

- name: ClampIToUint8
  result_type: WordSized
  operands:
    input: WordSized

- name: ClampDToUint8
  result_type: WordSized
  operands:
    input: WordSized
  num_temps: 1

- name: ClampVToUint8
  result_type: WordSized
  operands:
    input: BoxedValue
  num_temps: 1
  mir_op: ClampToUint8

- name: LoadScriptedProxyHandler
  result_type: WordSized
  operands:
    object: WordSized
  mir_op: true

#ifdef JS_PUNBOX64
- name: CheckScriptedProxyGetResult
  operands:
    target: BoxedValue
    id: BoxedValue
    value: BoxedValue
  num_temps: 2
  mir_op: true
#endif

- name: IdToStringOrSymbol
  result_type: BoxedValue
  operands:
    id: BoxedValue
  num_temps: 1
  mir_op: true

# Load a boxed value from an object's fixed slot.
- name: LoadFixedSlotV
  result_type: BoxedValue
  operands:
    object: WordSized
  mir_op: LoadFixedSlot

# Load a boxed value from an object's fixed slot.
# If it is a non-atom string, atomize it and update the slot.
- name: LoadFixedSlotAndAtomize
  result_type: BoxedValue
  operands:
    object: WordSized
  num_temps: 1
  mir_op: LoadFixedSlot

# Load a typed value from an object's fixed slot.
- name: LoadFixedSlotT
  result_type: WordSized
  operands:
    object: WordSized
  mir_op: LoadFixedSlot

- name: LoadFixedSlotAndUnbox
  result_type: WordSized
  operands:
    object: WordSized
  mir_op: true

- name: LoadDynamicSlotAndUnbox
  result_type: WordSized
  operands:
    slots: WordSized
  mir_op: true

- name: LoadElementAndUnbox
  result_type: WordSized
  operands:
    elements: WordSized
    index: WordSized
  mir_op: true

- name: LoadFixedSlotUnboxAndAtomize
  result_type: WordSized
  operands:
    object: WordSized
  mir_op: LoadFixedSlotAndUnbox

- name: LoadDynamicSlotUnboxAndAtomize
  result_type: WordSized
  operands:
    slots: WordSized
  mir_op: LoadDynamicSlotAndUnbox

- name: AddAndStoreSlot
  operands:
    object: WordSized
    value: BoxedValue
  num_temps: 1
  mir_op: true

- name: AllocateAndStoreSlot
  operands:
    object: WordSized
    value: BoxedValue
  num_temps: 2
  call_instruction: true
  mir_op: true

- name: AddSlotAndCallAddPropHook
  operands:
    object: WordSized
    value: BoxedValue
  call_instruction: true
  mir_op: true

# Store a boxed value to an object's fixed slot.
- name: StoreFixedSlotV
  operands:
    obj: WordSized
    value: BoxedValue
  mir_op: StoreFixedSlot

# Store a typed value to an object's fixed slot.
- name: StoreFixedSlotT
  operands:
    obj: WordSized
    value: WordSized
  mir_op: StoreFixedSlot

# Note, Name ICs always return a Value. There are no V/T variants.
- name: GetNameCache
  result_type: BoxedValue
  operands:
    envObj: WordSized
  num_temps: 1
  mir_op: true

- name: CallGetIntrinsicValue
  result_type: BoxedValue
  call_instruction: true
  mir_op: true

- name: GetPropSuperCache
  result_type: BoxedValue
  operands:
    obj: WordSized
    receiver: BoxedValue
    id: BoxedValue
  mir_op: true

# Patchable jump to stubs generated for a GetProperty cache, which loads a
# boxed value.
- name: GetPropertyCache
  result_type: BoxedValue
  operands:
    value: BoxedValue
    id: BoxedValue
  mir_op: true

- name: BindNameCache
  result_type: WordSized
  operands:
    environmentChain: WordSized
  num_temps: 1
  mir_op: true

- name: CallBindVar
  result_type: WordSized
  operands:
    environmentChain: WordSized
  mir_op: true

# Load a value from an object's dslots or a slots vector.
- name: LoadDynamicSlotV
  result_type: BoxedValue
  operands:
    input: WordSized
  mir_op: LoadDynamicSlot

# Load a value from an object's dslots or a slots vector.
# If it is a non-atom string, atomize it and update the slot.
- name: LoadDynamicSlotAndAtomize
  result_type: BoxedValue
  operands:
    input: WordSized
  num_temps: 1
  mir_op: LoadDynamicSlot

# Store a value to an object's dslots or a slots vector.
- name: StoreDynamicSlotV
  operands:
    slots: WordSized
    value: BoxedValue
  mir_op: StoreDynamicSlot

# Store a typed value to an object's dslots or a slots vector. This has a
# few advantages over LStoreDynamicSlotV:
# 1) We can bypass storing the type tag if the slot has the same type as
#    the value.
# 2) Better Register allocation: we can store constants and FP regs directly
#    without requiring a second Register for the value.
- name: StoreDynamicSlotT
  operands:
    slots: WordSized
    value: WordSized
  mir_op: StoreDynamicSlot

# Read length field of a JSString*.
- name: StringLength
  result_type: WordSized
  operands:
    string: WordSized

# Take the floor of a double precision number and converts it to an int32.
# Implements Math.floor().
- name: Floor
  result_type: WordSized
  operands:
    input: WordSized

# Take the floor of a single precision number and converts it to an int32.
# Implements Math.floor().
- name: FloorF
  result_type: WordSized
  operands:
    input: WordSized

# Take the ceiling of a double precision number and converts it to an int32.
# Implements Math.ceil().
- name: Ceil
  result_type: WordSized
  operands:
    input: WordSized

# Take the ceiling of a single precision number and converts it to an int32.
# Implements Math.ceil().
- name: CeilF
  result_type: WordSized
  operands:
    input: WordSized

# Round a double precision number and converts it to an int32.
# Implements Math.round().
- name: Round
  result_type: WordSized
  operands:
    input: WordSized
  num_temps: 1
  mir_op: true

# Round a single precision number and converts it to an int32.
# Implements Math.round().
- name: RoundF
  result_type: WordSized
  operands:
    input: WordSized
  num_temps: 1
  mir_op: Round

# Truncates a double precision number and converts it to an int32.
# Implements Math.trunc().
- name: Trunc
  result_type: WordSized
  operands:
    input: WordSized

# Truncates a single precision number and converts it to an int32.
# Implements Math.trunc().
- name: TruncF
  result_type: WordSized
  operands:
    input: WordSized

# Rounds a double precision number accordingly to mir()->roundingMode(),
# and keeps a double output.
- name: NearbyInt
  result_type: WordSized
  operands:
    input: WordSized
  mir_op: true

# Rounds a single precision number accordingly to mir()->roundingMode(),
# and keeps a single output.
- name: NearbyIntF
  result_type: WordSized
  operands:
    input: WordSized
  mir_op: NearbyInt

# Load a function's call environment.
- name: FunctionEnvironment
  result_type: WordSized
  operands:
    function: WordSized

- name: HomeObject
  result_type: WordSized
  operands:
    function: WordSized

- name: HomeObjectSuperBase
  result_type: BoxedValue
  operands:
    homeObject: WordSized

- name: NewLexicalEnvironmentObject
  result_type: WordSized
  num_temps: 1
  mir_op: true

- name: NewClassBodyEnvironmentObject
  result_type: WordSized
  num_temps: 1
  mir_op: true

- name: NewVarEnvironmentObject
  result_type: WordSized
  num_temps: 1
  mir_op: true

- name: MegamorphicSetElement
  operands:
    object: WordSized
    index: BoxedValue
    value: BoxedValue
  # On x86 we do not have enough registers to use 3 temps for this *and* take
  # five words worth of operands. Since it's 32-bit, though, we get two
  # registers from pushing `value`, which doesn't get used until the end
  # anyway. This is somewhat klunky, but oh well.
#ifdef JS_CODEGEN_X86
  num_temps: 1
#else
  num_temps: 3
#endif
  call_instruction: true
  mir_op: true

- name: CallDeleteProperty
  result_type: WordSized
  operands:
    value: BoxedValue
  call_instruction: true
  mir_op: DeleteProperty

- name: CallDeleteElement
  result_type: WordSized
  operands:
    value: BoxedValue
    index: BoxedValue
  call_instruction: true
  mir_op: DeleteElement

- name: ObjectToIterator
  result_type: WordSized
  operands:
    object: WordSized
  num_temps: 3
  mir_op: true

- name: ValueToIterator
  result_type: WordSized
  operands:
    value: BoxedValue
  call_instruction: true
  mir_op: ValueToIterator

- name: IteratorHasIndicesAndBranch
  successors: [ifTrue, ifFalse]
  operands:
    object: WordSized
    iterator: WordSized
  num_temps: 2

- name: LoadSlotByIteratorIndex
  result_type: BoxedValue
  operands:
    object: WordSized
    iterator: WordSized

  num_temps: 2

- name: StoreSlotByIteratorIndex
  operands:
    object: WordSized
    iterator: WordSized
    value: BoxedValue
  num_temps: 2
  mir_op: true

# Patchable jump to stubs generated for a SetProperty cache.
- name: SetPropertyCache
  operands:
    object: WordSized
    id: BoxedValue
    value: BoxedValue
  # Takes an additional temp: this is intendend to be FloatReg0 to allow the
  # actual cache code to safely clobber that value without save and restore.
  num_temps: 2
  mir_op: true

- name: GetIteratorCache
  result_type: WordSized
  operands:
    value: BoxedValue
  num_temps: 2
  mir_op: true

- name: OptimizeSpreadCallCache
  result_type: BoxedValue
  operands:
    value: BoxedValue
  num_temps: 1
  mir_op: true

- name: IteratorMore
  result_type: BoxedValue
  operands:
    iterator: WordSized
  num_temps: 1
  mir_op: true

- name: IsNoIterAndBranch
  successors: [ifTrue, ifFalse]
  operands:
    input: BoxedValue

- name: IteratorEnd
  operands:
    object: WordSized
  num_temps: 3
  mir_op: true

- name: CloseIterCache
  operands:
    iter: WordSized
  num_temps: 1
  mir_op: true

- name: OptimizeGetIteratorCache
  result_type: WordSized
  operands:
    value: BoxedValue
  num_temps: 1
  mir_op: true

# Read the number of actual arguments.
- name: ArgumentsLength
  result_type: WordSized

# Load a value from the actual arguments.
- name: GetFrameArgument
  result_type: BoxedValue
  operands:
    index: WordSized

# Load a value from the actual arguments.
# Returns undefined if |index| is larger-or-equals to |length|. Bails out if
# |index| is negative.
- name: GetFrameArgumentHole
  result_type: BoxedValue
  operands:
    index: WordSized
    length: WordSized
  num_temps: 1

# Create the rest parameter.
- name: Rest
  result_type: WordSized
  operands:
    numActuals: WordSized
  num_temps: 4
  call_instruction: true
  mir_op: true

- name: Int32ToIntPtr
  result_type: WordSized
  operands:
    input: WordSized
  mir_op: true

- name: NonNegativeIntPtrToInt32
  result_type: WordSized
  operands:
    input: WordSized

- name: IntPtrToDouble
  result_type: WordSized
  operands:
    input: WordSized

- name: AdjustDataViewLength
  result_type: WordSized
  operands:
    input: WordSized
  mir_op: true

# Convert a Boolean to an Int64, following ToBigInt.
- name: BooleanToInt64
  result_type: Int64
  operands:
    input: WordSized
  mir_op: ToInt64

# Convert a String to an Int64, following ToBigInt.
- name: StringToInt64
  result_type: Int64
  operands:
    input: WordSized
  mir_op: ToInt64

# Simulate ToBigInt on a Value and produce a matching Int64.
- name: ValueToInt64
  result_type: Int64
  operands:
    input: BoxedValue
  num_temps: 1
  mir_op: ToInt64

# Truncate a BigInt to an unboxed int64.
- name: TruncateBigIntToInt64
  result_type: Int64
  operands:
    input: WordSized
  mir_op: true

# Create a new BigInt* from an unboxed int64.
- name: Int64ToBigInt
  result_type: WordSized
  operands:
    input: Int64
  num_temps64: 1

# Create a new BigInt* from an unboxed uint64.
- name: Uint64ToBigInt
  result_type: WordSized
  operands:
    input: Int64
  num_temps: 1
  mir_op: Int64ToBigInt

# Return intptr from an unboxed int64. Bails if the input exceeds intptr limits.
- name: Int64ToIntPtr
  result_type: WordSized
  operands:
    input: Int64
  mir_op: true

# Return an int64 from an intptr.
- name: IntPtrToInt64
  result_type: Int64
  operands:
    input: WordSized

# Generational write barrier used when writing an object to another object.
- name: PostWriteBarrierO
  operands:
    object: WordSized
    value: WordSized
  num_temps: 1
  mir_op: PostWriteBarrier

# Generational write barrier used when writing a string to an object.
- name: PostWriteBarrierS
  operands:
    object: WordSized
    value: WordSized
  num_temps: 1
  mir_op: PostWriteBarrier

# Generational write barrier used when writing a BigInt to an object.
- name: PostWriteBarrierBI
  operands:
    object: WordSized
    value: WordSized
  num_temps: 1
  mir_op: PostWriteBarrier

# Generational write barrier used when writing a value to another object.
- name: PostWriteBarrierV
  operands:
    object: WordSized
    value: BoxedValue
  num_temps: 1
  mir_op: PostWriteBarrier

# Generational write barrier used when writing an object to another object's
# elements.
- name: PostWriteElementBarrierO
  operands:
    object: WordSized
    value: WordSized
    index: WordSized
  num_temps: 1
  mir_op: PostWriteElementBarrier

# Generational write barrier used when writing a string to an object's
# elements.
- name: PostWriteElementBarrierS
  operands:
    object: WordSized
    value: WordSized
    index: WordSized
  num_temps: 1
  mir_op: PostWriteElementBarrier

# Generational write barrier used when writing a BigInt to an object's
# elements.
- name: PostWriteElementBarrierBI
  operands:
    object: WordSized
    value: WordSized
    index: WordSized
  num_temps: 1
  mir_op: PostWriteElementBarrier

# Generational write barrier used when writing a value to another object's
# elements.
- name: PostWriteElementBarrierV
  operands:
    object: WordSized
    index: WordSized
    value: BoxedValue
  num_temps: 1
  mir_op: PostWriteElementBarrier

# Assert in debug mode that a post write barrier can be elided.
- name: AssertCanElidePostWriteBarrier
  operands:
    object: WordSized
    value: BoxedValue
  num_temps: 1

# Guard against an object's identity.
- name: GuardObjectIdentity
  operands:
    input: WordSized
    expected: WordSized
  mir_op: true

# Guard against an function's identity.
- name: GuardSpecificFunction
  operands:
    input: WordSized
    expected: WordSized

- name: GuardSpecificAtom
  operands:
    str: WordSized
  num_temps: 1
  mir_op: true

- name: GuardSpecificSymbol
  operands:
    symbol: WordSized
  mir_op: true

- name: GuardSpecificInt32
  operands:
    num: WordSized
  mir_op: true

- name: GuardStringToIndex
  result_type: WordSized
  operands:
    string: WordSized

- name: GuardStringToInt32
  result_type: WordSized
  operands:
    string: WordSized
  num_temps: 1

- name: GuardStringToDouble
  result_type: WordSized
  operands:
    string: WordSized
  num_temps: 2

- name: GuardShape
  result_type: WordSized
  operands:
    input: WordSized
  num_temps: 1
  mir_op: true

- name: GuardMultipleShapes
  result_type: WordSized
  operands:
    object: WordSized
    shapeList: WordSized
  num_temps: 4
  mir_op: true

- name: GuardProto
  operands:
    object: WordSized
    expected: WordSized
  num_temps: 1

- name: GuardNullProto
  operands:
    object: WordSized
  num_temps: 1

- name: GuardIsNativeObject
  operands:
    object: WordSized
  num_temps: 1

- name: GuardGlobalGeneration
  mir_op: true
  num_temps: 1

- name: GuardFuse
  mir_op: true
  num_temps: 1

- name: GuardIsProxy
  operands:
    object: WordSized
  num_temps: 1

- name: GuardIsNotProxy
  operands:
    object: WordSized
  num_temps: 1

- name: GuardIsNotDOMProxy
  operands:
    proxy: WordSized
  num_temps: 1

- name: ProxyGet
  result_type: BoxedValue
  operands:
    proxy: WordSized
  num_temps: 1
  call_instruction: true
  mir_op: true

- name: ProxyGetByValue
  result_type: BoxedValue
  operands:
    proxy: WordSized
    id: BoxedValue
  call_instruction: true

- name: ProxyHasProp
  result_type: BoxedValue
  operands:
    proxy: WordSized
    id: BoxedValue
  call_instruction: true
  mir_op: true

- name: ProxySet
  operands:
    proxy: WordSized
    rhs: BoxedValue
  num_temps: 1
  call_instruction: true
  mir_op: true

- name: ProxySetByValue
  operands:
    proxy: WordSized
    id: BoxedValue
    rhs: BoxedValue
  call_instruction: true
  mir_op: true

- name: CallSetArrayLength
  operands:
    obj: WordSized
    rhs: BoxedValue
  call_instruction: true
  mir_op: true

- name: MegamorphicLoadSlot
  result_type: BoxedValue
  operands:
    object: WordSized
  num_temps: 4
  call_instruction: true
  mir_op: true

- name: MegamorphicLoadSlotByValue
  result_type: BoxedValue
  operands:
    object: WordSized
    id: BoxedValue
  num_temps: 3
  call_instruction: true
  mir_op: true

- name: MegamorphicLoadSlotPermissive
  result_type: BoxedValue
  operands:
    object: WordSized
  num_temps: 3
  call_instruction: true
  mir_op: true

- name: MegamorphicLoadSlotByValuePermissive
  result_type: BoxedValue
  operands:
    object: WordSized
    id: BoxedValue
  num_temps: 3
  call_instruction: true
  mir_op: true

- name: MegamorphicStoreSlot
  operands:
    object: WordSized
    rhs: BoxedValue
#ifdef JS_CODEGEN_X86
  num_temps: 1
#else
  num_temps: 3
#endif
  call_instruction: true
  mir_op: true

- name: MegamorphicHasProp
  result_type: WordSized
  operands:
    object: WordSized
    id: BoxedValue
  num_temps: 3
  call_instruction: true
  mir_op: true

- name: SmallObjectVariableKeyHasProp
  result_type: WordSized
  operands:
    id: WordSized
  num_temps: 0
  mir_op: true

- name: GuardIsNotArrayBufferMaybeShared
  operands:
    object: WordSized
  num_temps: 1

- name: GuardIsTypedArray
  operands:
    object: WordSized
  num_temps: 1

- name: GuardIsFixedLengthTypedArray
  operands:
    object: WordSized
  num_temps: 1

- name: GuardIsResizableTypedArray
  operands:
    object: WordSized
  num_temps: 1

- name: GuardHasProxyHandler
  operands:
    object: WordSized
  mir_op: true

- name: GuardNoDenseElements
  operands:
    input: WordSized
  num_temps: 1

- name: InCache
  result_type: WordSized
  operands:
    lhs: BoxedValue
    rhs: WordSized
  num_temps: 1
  mir_op: true

- name: HasOwnCache
  result_type: WordSized
  operands:
    value: BoxedValue
    id: BoxedValue
  mir_op: true

- name: CheckPrivateFieldCache
  result_type: WordSized
  operands:
    value: BoxedValue
    id: BoxedValue
  mir_op: true

- name: NewPrivateName
  result_type: WordSized
  call_instruction: true
  mir_op: true

- name: InstanceOfO
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
  mir_op: InstanceOf

- name: InstanceOfV
  result_type: WordSized
  operands:
    lhs: BoxedValue
    rhs: WordSized
  mir_op: InstanceOf

- name: InstanceOfCache
  result_type: WordSized
  operands:
    lhs: BoxedValue
    rhs: WordSized

- name: IsCallableO
  result_type: WordSized
  operands:
    object: WordSized
  mir_op: IsCallable

- name: IsCallableV
  result_type: WordSized
  operands:
    object: BoxedValue
  num_temps: 1
  mir_op: IsCallable

- name: IsConstructor
  result_type: WordSized
  operands:
    object: WordSized
  mir_op: true

- name: IsCrossRealmArrayConstructor
  result_type: WordSized
  operands:
    object: WordSized

- name: IsArrayO
  result_type: WordSized
  operands:
    object: WordSized
  mir_op: IsArray

- name: IsArrayV
  result_type: WordSized
  operands:
    value: BoxedValue
  num_temps: 1
  mir_op: IsArray

- name: IsTypedArray
  result_type: WordSized
  operands:
    object: WordSized
  mir_op: true

- name: IsObject
  result_type: WordSized
  operands:
    object: BoxedValue
  mir_op: true

- name: IsObjectAndBranch
  successors: [ifTrue, ifFalse]
  operands:
    input: BoxedValue

- name: IsNullOrUndefined
  result_type: WordSized
  operands:
    input: BoxedValue
  mir_op: true

- name: IsNullOrUndefinedAndBranch
  successors: [ifTrue, ifFalse]
  operands:
    input: BoxedValue

- name: HasClass
  result_type: WordSized
  operands:
    lhs: WordSized
  mir_op: true

- name: GuardToClass
  result_type: WordSized
  operands:
    lhs: WordSized
  num_temps: 1
  mir_op: true

- name: GuardToEitherClass
  result_type: WordSized
  operands:
    lhs: WordSized
  num_temps: 1
  mir_op: true

- name: GuardToFunction
  result_type: WordSized
  operands:
    lhs: WordSized
  num_temps: 1
  mir_op: true

- name: ObjectClassToString
  result_type: WordSized
  operands:
    lhs: WordSized
  num_temps: 1
  call_instruction: true
  mir_op: true

- name: WasmSelect
  result_type: WordSized
  operands:
    trueExpr: WordSized
    falseExpr: WordSized
    condExpr: WordSized
  mir_op: true

- name: WasmSelectI64
  result_type: Int64
  operands:
    trueExpr: Int64
    falseExpr: Int64
    condExpr: WordSized
  mir_op: WasmSelect

- name: WasmCompareAndSelect
  result_type: WordSized
  operands:
    leftExpr: WordSized
    rightExpr: WordSized
    ifTrueExpr: WordSized
    ifFalseExpr: WordSized
  arguments:
    compareType: MCompare::CompareType
    jsop: JSOp
  mir_op: WasmSelect

- name: WasmAddOffset
  result_type: WordSized
  operands:
    base: WordSized
  mir_op: true

- name: WasmAddOffset64
  result_type: Int64
  operands:
    base: Int64
  mir_op: WasmAddOffset

- name: WasmBoundsCheck
  result_type: WordSized
  operands:
    ptr: WordSized
    boundsCheckLimit: WordSized
  mir_op: true

- name: WasmBoundsCheck64
  result_type: Int64
  operands:
    ptr: Int64
    boundsCheckLimit: Int64
  mir_op: WasmBoundsCheck

- name: WasmBoundsCheckRange32
  result_type: WordSized
  operands:
    index: WordSized
    length: WordSized
    limit: WordSized
  mir_op: true
  num_temps: 1

- name: WasmExtendU32Index
  result_type: WordSized
  operands:
    input: WordSized
  mir_op: true

- name: WasmWrapU32Index
  result_type: WordSized
  operands:
    input: WordSized
  mir_op: true

- name: WasmClampTable64Address
  result_type: WordSized
  operands:
    address: Int64
  mir_op: true

- name: WasmAlignmentCheck
  operands:
    ptr: WordSized
  mir_op: true

- name: WasmAlignmentCheck64
  operands:
    ptr: Int64
  mir_op: WasmAlignmentCheck

- name: WasmLoadInstance
  result_type: WordSized
  operands:
    instance: WordSized
  mir_op: true

- name: WasmLoadInstance64
  result_type: Int64
  operands:
    instance: WordSized
  mir_op: WasmLoadInstance

- name: WasmHeapReg
  result_type: WordSized
  mir_op: true

- name: WasmLoad
  result_type: WordSized
  operands:
    ptr: WordSized
    memoryBase: WordSized
#if defined(JS_CODEGEN_ARM) || defined(JS_CODEGEN_MIPS32) || defined(JS_CODEGEN_MIPS64) || defined(JS_CODEGEN_LOONG64) || defined(JS_CODEGEN_RISCV64)
  num_temps: 1
#endif
  mir_op: true

- name: WasmLoadI64
  result_type: Int64
  operands:
    ptr: WordSized
    memoryBase: WordSized
#ifdef JS_CODEGEN_ARM
  num_temps: 2
#elif defined(JS_CODEGEN_MIPS32) || defined(JS_CODEGEN_MIPS64) || defined(JS_CODEGEN_LOONG64) || defined(JS_CODEGEN_RISCV64)
  num_temps: 1
#endif
  mir_op: WasmLoad

- name: WasmStore
  operands:
    ptr: WordSized
    value: WordSized
    memoryBase: WordSized
#if defined(JS_CODEGEN_ARM) || defined(JS_CODEGEN_MIPS32) || defined(JS_CODEGEN_MIPS64) || defined(JS_CODEGEN_LOONG64) || defined(JS_CODEGEN_RISCV64)
  num_temps: 1
#endif
  mir_op: true

- name: WasmStoreI64
  operands:
    ptr: WordSized
    value: Int64
    memoryBase: WordSized
#if defined(JS_CODEGEN_ARM) || defined(JS_CODEGEN_MIPS32) || defined(JS_CODEGEN_MIPS64) || defined(JS_CODEGEN_LOONG64) || defined(JS_CODEGEN_RISCV64)
  num_temps: 1
#endif
  mir_op: WasmStore

- name: AsmJSLoadHeap
  result_type: WordSized
  operands:
    ptr: WordSized
    boundsCheckLimit: WordSized
    memoryBase: WordSized
  mir_op: true

- name: AsmJSStoreHeap
  result_type: WordSized
  operands:
    ptr: WordSized
    value: WordSized
    boundsCheckLimit: WordSized
    memoryBase: WordSized
  mir_op: true

- name: WasmCompareExchangeHeap
  result_type: WordSized
  operands:
    ptr: WordSized
    oldValue: WordSized
    newValue: WordSized
    memoryBase: WordSized
#ifdef JS_CODEGEN_X86
  num_temps: 1
#elif defined(JS_CODEGEN_MIPS32) || defined(JS_CODEGEN_MIPS64) || defined(JS_CODEGEN_LOONG64) || defined(JS_CODEGEN_RISCV64)
  # Temp that may be used on LL/SC platforms for extract/insert bits of word.
  num_temps: 3
#endif
  mir_op: true

- name: WasmFence

- name: WasmAtomicExchangeHeap
  result_type: WordSized
  operands:
    ptr: WordSized
    value: WordSized
    memoryBase: WordSized
#ifdef JS_CODEGEN_X86
  num_temps: 1
#elif defined(JS_CODEGEN_MIPS32) || defined(JS_CODEGEN_MIPS64) || defined(JS_CODEGEN_LOONG64) || defined(JS_CODEGEN_RISCV64)
  # Temp that may be used on LL/SC platforms for extract/insert bits of word.
  num_temps: 3
#endif
  mir_op: true

- name: WasmAtomicBinopHeap
  result_type: WordSized
  operands:
    ptr: WordSized
    value: WordSized
    memoryBase: WordSized
#if defined(JS_CODEGEN_MIPS32) || defined(JS_CODEGEN_MIPS64) || defined(JS_CODEGEN_LOONG64) || defined(JS_CODEGEN_RISCV64)
  # Temp that may be used on LL/SC platforms for extract/insert bits of word.
  num_temps: 3
#elifdef JS_CODEGEN_X86
  # Additional temp to hold a computed address.
  num_temps: 2
#else
  num_temps: 1
#endif
  mir_op: true

# Atomic binary operation where the result is discarded.
- name: WasmAtomicBinopHeapForEffect
  operands:
    ptr: WordSized
    value: WordSized
    memoryBase: WordSized
#if defined(JS_CODEGEN_MIPS32) || defined(JS_CODEGEN_MIPS64) || defined(JS_CODEGEN_LOONG64) || defined(JS_CODEGEN_RISCV64)
  # Temp that may be used on LL/SC platforms for extract/insert bits of word.
  num_temps: 3
#elif defined(JS_CODEGEN_X86) || defined(JS_CODEGEN_ARM) || defined(JS_CODEGEN_ARM64)
  num_temps: 1
#endif
  mir_op: WasmAtomicBinopHeap

- name: WasmLoadSlot
  result_type: WordSized
  operands:
    containerRef: WordSized
  arguments:
    offset: size_t
    type: MIRType
    wideningOp: MWideningOp
    maybeTrap: wasm::MaybeTrapSiteDesc

- name: WasmLoadElement
  result_type: WordSized
  operands:
    base: WordSized
    index: WordSized
  arguments:
    type: MIRType
    wideningOp: MWideningOp
    scale: Scale
    maybeTrap: wasm::MaybeTrapSiteDesc
  num_temps: 1

- name: WasmLoadSlotI64
  result_type: Int64
  operands:
    containerRef: WordSized
  arguments:
    offset: size_t
    maybeTrap: wasm::MaybeTrapSiteDesc

- name: WasmLoadElementI64
  result_type: Int64
  operands:
    base: WordSized
    index: WordSized
  arguments:
    maybeTrap: wasm::MaybeTrapSiteDesc

- name: WasmStoreSlot
  operands:
    value: WordSized
    containerRef: WordSized
  arguments:
    offset: size_t
    type: MIRType
    narrowingOp: MNarrowingOp
    maybeTrap: wasm::MaybeTrapSiteDesc

- name: WasmStoreSlotI64
  operands:
    value: Int64
    containerRef: WordSized
  arguments:
    offset: size_t
    maybeTrap: wasm::MaybeTrapSiteDesc

- name: WasmStoreElement
  operands:
    base: WordSized
    index: WordSized
    value: WordSized
  arguments:
    type: MIRType
    narrowingOp: MNarrowingOp
    scale: Scale
    maybeTrap: wasm::MaybeTrapSiteDesc
  num_temps: 1

- name: WasmStoreElementI64
  operands:
    base: WordSized
    index: WordSized
    value: Int64
  arguments:
    maybeTrap: wasm::MaybeTrapSiteDesc

- name: WasmStoreElementRef
  operands:
    instance: WordSized
    base: WordSized
    index: WordSized
    value: WordSized
  arguments:
    maybeTrap: wasm::MaybeTrapSiteDesc
    preBarrierKind: WasmPreBarrierKind
  num_temps: 2

- name: WasmLoadTableElement
  result_type: WordSized
  operands:
    elements: WordSized
    index: WordSized

- name: WasmDerivedPointer
  result_type: WordSized
  operands:
    base: WordSized
  mir_op: true

- name: WasmDerivedIndexPointer
  result_type: WordSized
  operands:
    base: WordSized
    index: WordSized
  mir_op: true

- name: WasmStoreRef
  operands:
    instance: WordSized
    valueBase: WordSized
    value: WordSized
  arguments:
    offset: uint32_t
    maybeTrap: wasm::MaybeTrapSiteDesc
    preBarrierKind: WasmPreBarrierKind
  num_temps: 1
  mir_op: true

# Generational write barrier used when writing an object to another object.
- name: WasmPostWriteBarrierImmediate
  operands:
    instance: WordSized
    object: WordSized
    valueBase: WordSized
    value: WordSized
  arguments:
    valueOffset: uint32_t
  num_temps: 1
  mir_op: true

# Ditto, but with a scaled index instead of a constant offset.
- name: WasmPostWriteBarrierIndex
  operands:
    instance: WordSized
    object: WordSized
    valueBase: WordSized
    index: WordSized
    value: WordSized
  arguments:
    elemSize: uint32_t
  num_temps: 1
  mir_op: true

- name: WasmParameter
  result_type: WordSized

- name: WasmParameterI64
  result_type: Int64

- name: WasmReturn
  operands:
    rval: WordSized
    instance: WordSized

- name: WasmReturnI64
  operands:
    rval: Int64
    instance: WordSized

- name: WasmReturnVoid
  operands:
    rval: WordSized

- name: WasmStackArg
  operands:
    arg: WordSized
  mir_op: true

- name: WasmStackArgI64
  operands:
    arg: Int64
  mir_op: WasmStackArg

- name: WasmNullConstant
  result_type: WordSized

- name: WasmCallIndirectAdjunctSafepoint
  gen_boilerplate: false

- name: WasmCall
  gen_boilerplate: false

- name: WasmCallLandingPrePad
  mir_op: true

- name: WasmRegisterResult
  gen_boilerplate: false

- name: WasmRegisterPairResult
  gen_boilerplate: false

- name: WasmStackResultArea
  result_type: WordSized
  num_temps: 1
  mir_op: true

- name: WasmStackResult
  gen_boilerplate: false

- name: WasmStackResult64
  gen_boilerplate: false

- name: AssertRangeI
  operands:
    input: WordSized
  mir_op: AssertRange

- name: AssertRangeD
  operands:
    input: WordSized
  num_temps: 1
  mir_op: AssertRange

- name: AssertRangeF
  operands:
    input: WordSized
  num_temps: 2
  mir_op: AssertRange

- name: AssertRangeV
  operands:
    input: BoxedValue
  num_temps: 3
  mir_op: AssertRange

- name: AssertClass
  operands:
    input: WordSized
  num_temps: 1
  mir_op: true

- name: AssertShape
  operands:
    input: WordSized
  mir_op: true

- name: GuardValue
  operands:
    input: BoxedValue
  mir_op: true

- name: GuardNullOrUndefined
  operands:
    input: BoxedValue
  mir_op: true

- name: GuardIsNotObject
  operands:
    input: BoxedValue
  mir_op: true

- name: GuardFunctionFlags
  operands:
    function: WordSized
  mir_op: true

- name: GuardFunctionIsNonBuiltinCtor
  operands:
    function: WordSized
  num_temps: 1

- name: GuardFunctionKind
  operands:
    function: WordSized
  num_temps: 1
  mir_op: true

- name: GuardFunctionScript
  operands:
    function: WordSized
  mir_op: true

- name: IncrementWarmUpCounter
  num_temps: 1
  mir_op: true

- name: LexicalCheck
  operands:
    input: BoxedValue
  mir_op: true

- name: ThrowRuntimeLexicalError
  call_instruction: true
  mir_op: true

- name: ThrowMsg
  call_instruction: true
  mir_op: true

- name: GlobalDeclInstantiation
  mir_op: true

- name: MemoryBarrier
  arguments:
    barrier: jit::MemoryBarrier

- name: Debugger
  num_temps: 1
  call_instruction: true

- name: NewTarget
  result_type: BoxedValue

# Math.random()
- name: Random
  result_type: WordSized
  num_temps: 1
  num_temps64: 2
  mir_op: true

- name: CheckReturn
  result_type: BoxedValue
  operands:
    returnValue: BoxedValue
    thisValue: BoxedValue

- name: CheckIsObj
  result_type: WordSized
  operands:
    value: BoxedValue
  mir_op: true

- name: CheckObjCoercible
  operands:
    value: BoxedValue

- name: CheckClassHeritage
  operands:
    heritage: BoxedValue
  num_temps: 2

- name: CheckThis
  operands:
    value: BoxedValue

- name: CheckThisReinit
  operands:
    thisValue: BoxedValue

- name: Generator
  result_type: WordSized
  operands:
    callee: WordSized
    environmentChain: WordSized
    argsObject: WordSized
  call_instruction: true
  mir_op: true

- name: AsyncResolve
  result_type: WordSized
  operands:
    generator: WordSized
    value: BoxedValue
  call_instruction: true
  mir_op: true

- name: AsyncReject
  result_type: WordSized
  operands:
    generator: WordSized
    reason: BoxedValue
    stack: BoxedValue
  call_instruction: true
  mir_op: true

- name: AsyncAwait
  result_type: WordSized
  operands:
    value: BoxedValue
    generator: WordSized
  call_instruction: true
  mir_op: true

- name: CanSkipAwait
  result_type: WordSized
  operands:
    value: BoxedValue
  call_instruction: true
  mir_op: true

- name: MaybeExtractAwaitValue
  result_type: BoxedValue
  operands:
    value: BoxedValue
    canSkip: WordSized
  call_instruction: true
  mir_op: true

- name: DebugCheckSelfHosted
  operands:
    value: BoxedValue
  call_instruction: true

- name: IsPackedArray
  result_type: WordSized
  operands:
    object: WordSized
  num_temps: 1

- name: GuardArrayIsPacked
  operands:
    array: WordSized
  num_temps: 2
  mir_op: true

- name: GetPrototypeOf
  result_type: BoxedValue
  operands:
    target: WordSized

- name: ObjectWithProto
  result_type: WordSized
  operands:
    prototype: BoxedValue
  call_instruction: true

- name: ObjectStaticProto
  result_type: WordSized
  operands:
    object: WordSized

- name: BuiltinObject
  result_type: WordSized
  call_instruction: true
  mir_op: true

- name: SuperFunction
  result_type: BoxedValue
  operands:
    callee: WordSized
  num_temps: 1

- name: InitHomeObject
  result_type: WordSized
  operands:
    function: WordSized
    homeObject: BoxedValue

- name: IsTypedArrayConstructor
  result_type: WordSized
  operands:
    object: WordSized

- name: LoadValueTag
  result_type: WordSized
  operands:
    value: BoxedValue

- name: GuardTagNotEqual
  operands:
    lhs: WordSized
    rhs: WordSized

- name: LoadWrapperTarget
  result_type: WordSized
  operands:
    object: WordSized
  mir_op: true

- name: GuardHasGetterSetter
  operands:
    object: WordSized
  num_temps: 3
  call_instruction: true
  mir_op: true

- name: GuardIsExtensible
  operands:
    object: WordSized
  num_temps: 1

- name: GuardInt32IsNonNegative
  operands:
    index: WordSized

- name: GuardInt32Range
  operands:
    input: WordSized
  mir_op: true

- name: GuardIndexIsNotDenseElement
  operands:
    object: WordSized
    index: WordSized
  num_temps: 2

- name: GuardIndexIsValidUpdateOrAdd
  operands:
    object: WordSized
    index: WordSized
  num_temps: 2

- name: CallAddOrUpdateSparseElement
  operands:
    object: WordSized
    index: WordSized
    value: BoxedValue
  call_instruction: true
  mir_op: true

- name: CallGetSparseElement
  result_type: BoxedValue
  operands:
    object: WordSized
    index: WordSized
  call_instruction: true

- name: CallNativeGetElement
  result_type: BoxedValue
  operands:
    object: WordSized
    index: WordSized
  call_instruction: true

- name: CallNativeGetElementSuper
  result_type: BoxedValue
  operands:
    object: WordSized
    index: WordSized
    receiver: BoxedValue
  call_instruction: true

- name: CallObjectHasSparseElement
  result_type: WordSized
  operands:
    object: WordSized
    index: WordSized
  num_temps: 2
  call_instruction: true

- name: BigIntAsIntN
  result_type: WordSized
  operands:
    bits: WordSized
    input: WordSized
  call_instruction: true

- name: GuardNonGCThing
  operands:
    input: BoxedValue

- name: ToHashableNonGCThing
  result_type: BoxedValue
  operands:
    input: BoxedValue
  num_temps: 1

- name: ToHashableString
  result_type: WordSized
  operands:
    input: WordSized

- name: ToHashableValue
  result_type: BoxedValue
  operands:
    input: BoxedValue
  num_temps: 1

- name: HashNonGCThing
  result_type: WordSized
  operands:
    input: BoxedValue
  num_temps: 1

- name: HashString
  result_type: WordSized
  operands:
    input: WordSized
  num_temps: 1

- name: HashSymbol
  result_type: WordSized
  operands:
    input: WordSized

- name: HashBigInt
  result_type: WordSized
  operands:
    input: WordSized
  num_temps: 3

- name: HashObject
  result_type: WordSized
  operands:
    setObject: WordSized
    input: BoxedValue
  num_temps: 4

- name: HashValue
  result_type: WordSized
  operands:
    setObject: WordSized
    input: BoxedValue
  num_temps: 4

- name: SetObjectHasNonBigInt
  result_type: WordSized
  operands:
    setObject: WordSized
    input: BoxedValue
    hash: WordSized
  num_temps: 2

- name: SetObjectHasBigInt
  result_type: WordSized
  operands:
    setObject: WordSized
    input: BoxedValue
    hash: WordSized
  num_temps: 4

- name: SetObjectHasValue
  result_type: WordSized
  operands:
    setObject: WordSized
    input: BoxedValue
    hash: WordSized
  num_temps: 4

- name: SetObjectHasValueVMCall
  result_type: WordSized
  call_instruction: true
  operands:
    setObject: WordSized
    input: BoxedValue

- name: SetObjectSize
  result_type: WordSized
  operands:
    setObject: WordSized

- name: MapObjectHasNonBigInt
  result_type: WordSized
  operands:
    mapObject: WordSized
    input: BoxedValue
    hash: WordSized
  num_temps: 2

- name: MapObjectHasBigInt
  result_type: WordSized
  operands:
    mapObject: WordSized
    input: BoxedValue
    hash: WordSized
  num_temps: 4

- name: MapObjectHasValue
  result_type: WordSized
  operands:
    mapObject: WordSized
    input: BoxedValue
    hash: WordSized
  num_temps: 4

- name: MapObjectHasValueVMCall
  result_type: WordSized
  call_instruction: true
  operands:
    mapObject: WordSized
    input: BoxedValue

- name: MapObjectGetNonBigInt
  result_type: BoxedValue
  operands:
    mapObject: WordSized
    input: BoxedValue
    hash: WordSized
  num_temps: 2

- name: MapObjectGetBigInt
  result_type: BoxedValue
  operands:
    mapObject: WordSized
    input: BoxedValue
    hash: WordSized
  num_temps: 4

- name: MapObjectGetValueVMCall
  result_type: BoxedValue
  call_instruction: true
  operands:
    mapObject: WordSized
    input: BoxedValue

- name: MapObjectSize
  result_type: WordSized
  operands:
    mapObject: WordSized

- name: BigIntAsUintN
  result_type: WordSized
  operands:
    bits: WordSized
    input: WordSized
  call_instruction: true

- name: IonToWasmCall
  gen_boilerplate: false

- name: IonToWasmCallV
  gen_boilerplate: false

- name: IonToWasmCallI64
  gen_boilerplate: false

- name: WasmAnyRefFromJSValue
  result_type: WordSized
  operands:
    input: BoxedValue
  num_temps: 1

- name: WasmAnyRefFromJSObject
  result_type: WordSized
  operands:
    input: WordSized

- name: WasmAnyRefFromJSString
  result_type: WordSized
  operands:
    input: WordSized

- name: WasmAnyRefIsJSString
  result_type: WordSized
  operands:
    input: WordSized
  num_temps: 1

- name: WasmTrapIfAnyRefIsNotJSString
  mir_op: true
  operands:
    input: WordSized
  num_temps: 1

- name: WasmAnyRefJSStringLength
  mir_op: true
  result_type: WordSized
  operands:
    input: WordSized
  num_temps: 1

- name: WasmNewI31Ref
  mir_op: true
  result_type: WordSized
  operands:
    value: WordSized

- name: WasmI31RefGet
  mir_op: true
  result_type: WordSized
  operands:
    value: WordSized

# Constant Simd128
- name: Simd128
  result_type: WordSized
  arguments:
    simd128: SimdConstant

# (v128, v128, v128) -> v128 effect-free operation.
# temp is FPR.
- name: WasmTernarySimd128
  result_type: WordSized
  operands:
    v0: WordSized
    v1: WordSized
    v2: WordSized
  arguments:
    simdOp: wasm::SimdOp
  num_temps: 1

# (v128, v128) -> v128 effect-free operations
# lhs and dest are the same.
# temps (if in use) are FPR.
# The op may differ from the MIR node's op.
- name: WasmBinarySimd128
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
  arguments:
    simdOp: wasm::SimdOp
  num_temps: 2

- name: WasmBinarySimd128WithConstant
  result_type: WordSized
  operands:
    lhs: WordSized
  arguments:
    rhs: SimdConstant
  num_temps: 1
  mir_op: true

# (v128, i32) -> v128 effect-free variable-width shift operations
# lhs and dest are the same.
- name: WasmVariableShiftSimd128
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
#if defined(JS_CODEGEN_X86) || defined(JS_CODEGEN_X64)
  # temp is an FPR (if in use).
  num_temps: 1
#endif
  mir_op: WasmShiftSimd128

# (v128, i32) -> v128 effect-free constant-width shift operations
- name: WasmConstantShiftSimd128
  result_type: WordSized
  operands:
    src: WordSized
  arguments:
    shift: int32_t
  mir_op: WasmShiftSimd128

# (v128) -> v128 sign replication operation.
- name: WasmSignReplicationSimd128
  result_type: WordSized
  operands:
    src: WordSized
  mir_op: WasmShiftSimd128

# // (v128, v128, imm_simd) -> v128 effect-free operation.
- name: WasmShuffleSimd128
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
  arguments:
    op: SimdShuffleOp
    control: SimdConstant
#if defined(JS_CODEGEN_X86) || defined(JS_CODEGEN_X64)
  # temp is FPR (and always in use).
  num_temps: 1
#endif

# (v128, imm_simd) -> v128 effect-free operation.
- name: WasmPermuteSimd128
  result_type: WordSized
  operands:
    src: WordSized
  arguments:
    op: SimdPermuteOp
    control: SimdConstant

- name: WasmReplaceLaneSimd128
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
  mir_op: true

- name: WasmReplaceInt64LaneSimd128
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: Int64
  mir_op: WasmReplaceLaneSimd128

# (scalar) -> v128 effect-free operations, scalar != int64
- name: WasmScalarToSimd128
  result_type: WordSized
  operands:
    src: WordSized
  mir_op: true

# (int64) -> v128 effect-free operations
- name: WasmInt64ToSimd128
  result_type: WordSized
  operands:
    src: Int64
  mir_op: WasmScalarToSimd128

# (v128) -> v128 effect-free operations
- name: WasmUnarySimd128
  result_type: WordSized
  operands:
    src: WordSized
  # temp is FPR (if in use).
  num_temps: 1
  mir_op: true

# // (v128, imm) -> scalar effect-free operations.
- name: WasmReduceSimd128
  result_type: WordSized
  operands:
    src: WordSized
#ifdef JS_CODEGEN_ARM64
  # temp is FPR (if in use).
  num_temps: 1
#endif
  mir_op: true

# (v128, onTrue, onFalse) test-and-branch operations.
- name: WasmReduceAndBranchSimd128
  successors: [ifTrue, ifFalse]
  operands:
    src: WordSized
  arguments:
    simdOp: wasm::SimdOp

# (v128, imm) -> i64 effect-free operations
- name: WasmReduceSimd128ToInt64
  result_type: Int64
  operands:
    src: WordSized
  mir_op: WasmReduceSimd128

- name: WasmLoadLaneSimd128
  result_type: WordSized
  operands:
    ptr: WordSized
    src: WordSized
    memoryBase: WordSized
#ifdef JS_CODEGEN_ARM64
  num_temps: 1
#endif
  mir_op: true

- name: WasmStoreLaneSimd128
  result_type: WordSized
  operands:
    ptr: WordSized
    src: WordSized
    memoryBase: WordSized
#ifdef JS_CODEGEN_ARM64
  num_temps: 1
#endif
  mir_op: true

- name: Unbox
  gen_boilerplate: false

- name: UnboxFloatingPoint
  result_type: WordSized
  operands:
    input: BoxedValue
  mir_op: Unbox

# Convert a 32-bit unsigned integer to a double.
- name: WasmUint32ToDouble
  result_type: WordSized
  operands:
    input: WordSized
#ifdef JS_CODEGEN_X86
  num_temps: 1
#endif

# Convert a 32-bit unsigned integer to a float32.
- name: WasmUint32ToFloat32
  result_type: WordSized
  operands:
    input: WordSized
#ifdef JS_CODEGEN_X86
  num_temps: 1
#endif

- name: DivI
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
  num_temps: 1
  mir_op: Div
  extra_name: true

- name: ModI
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
#if !defined(JS_CODEGEN_ARM) && !defined(JS_CODEGEN_ARM64)
  num_temps: 1
#endif
  mir_op: Mod
  extra_name: true

# Signed division by a power-of-two constant.
- name: DivPowTwoI
  result_type: WordSized
  operands:
    numerator: WordSized
#if defined(JS_CODEGEN_X86) || defined(JS_CODEGEN_X64)
    numeratorCopy: WordSized
#endif
  arguments:
    shift: int32_t
#if defined(JS_CODEGEN_X86) || defined(JS_CODEGEN_X64) || defined(JS_CODEGEN_ARM64)
    # Negative divisor case not implemented for all targets.
    negativeDivisor: bool
#endif
#if defined(JS_CODEGEN_MIPS32) || defined(JS_CODEGEN_MIPS64) || defined(JS_CODEGEN_LOONG64) || defined(JS_CODEGEN_RISCV64)
  num_temps: 1
#endif
  mir_op: Div

- name: ModPowTwoI
  result_type: WordSized
  operands:
    input: WordSized
  arguments:
    shift: int32_t
  mir_op: Mod

# Takes a tableswitch with an integer to decide.
- name: TableSwitch
  operands:
    index: WordSized
  num_temps: 2
  mir_op: true

# Takes a tableswitch with a value to decide.
- name: TableSwitchV
  operands:
    input: BoxedValue
  num_temps: 3
  mir_op: TableSwitch

- name: MulI
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
#if defined(JS_CODEGEN_X86) || defined(JS_CODEGEN_X64)
    lhsCopy: WordSized
#endif
  mir_op: Mul
  extra_name: true
#if !defined(JS_CODEGEN_X86) && !defined(JS_CODEGEN_X64)
  defer_init: true
#endif

#ifdef JS_CODEGEN_X86
- name: BoxFloatingPoint
  result_type: BoxedValue
  operands:
    input: WordSized
  arguments:
    type: MIRType
  num_temps: 2
  extra_name: true

- name: DivOrModI64
  gen_boilerplate: false

- name: UDivOrModI64
  gen_boilerplate: false

- name: DivOrModConstantI
  gen_boilerplate: false

- name: UDivOrMod
  gen_boilerplate: false

- name: UDivOrModConstant
  gen_boilerplate: false

- name: WasmTruncateToInt64
  result_type: Int64
  operands:
    input: WordSized
  num_temps: 1
  mir_op: true

- name: Int64ToFloatingPoint
  result_type: WordSized
  operands:
    input: Int64
  num_temps: 1
  mir_op: true

- name: WasmAtomicLoadI64
  result_type: Int64
  operands:
    memoryBase: WordSized
    ptr: WordSized
  num_temps64: 1
  mir_op: WasmLoad

- name: WasmAtomicStoreI64
  operands:
    memoryBase: WordSized
    ptr: WordSized
    value: Int64
  num_temps64: 1
  mir_op: WasmStore

- name: WasmCompareExchangeI64
  result_type: Int64
  operands:
    memoryBase: WordSized
    ptr: WordSized
    expected: Int64
    replacement: Int64
  mir_op: WasmCompareExchangeHeap

- name: WasmAtomicBinopI64
  result_type: Int64
  operands:
    memoryBase: WordSized
    ptr: WordSized
    value: Int64
  arguments:
    access: const wasm::MemoryAccessDesc&
    operation: AtomicOp

- name: WasmAtomicExchangeI64
  result_type: Int64
  operands:
    memoryBase: WordSized
    ptr: WordSized
    value: Int64
  arguments:
    access: const wasm::MemoryAccessDesc&
#endif

#ifdef JS_CODEGEN_X64
- name: DivOrModI64
  gen_boilerplate: false

- name: UDivOrModI64
  gen_boilerplate: false

- name: DivOrModConstantI
  gen_boilerplate: false

- name: UDivOrMod
  gen_boilerplate: false

- name: UDivOrModConstant
  gen_boilerplate: false

- name: WasmTruncateToInt64
  result_type: Int64
  operands:
    input: WordSized
  num_temps: 1
  mir_op: true

- name: Int64ToFloatingPoint
  result_type: WordSized
  operands:
    input: Int64
  num_temps: 1
  mir_op: true
#endif

#ifdef JS_CODEGEN_ARM
- name: BoxFloatingPoint
  result_type: BoxedValue
  operands:
    input: WordSized
  arguments:
    type: MIRType
  num_temps: 1
  extra_name: true

- name: DivOrModI64
  gen_boilerplate: false

- name: UDivOrModI64
  gen_boilerplate: false

# LSoftDivI is a software divide for ARM cores that don't support a hardware
# divide instruction, implemented as a C++ native call.
- name: SoftDivI
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
  call_instruction: true
  mir_op: Div

- name: SoftModI
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
  num_temps: 1
  call_instruction: true
  mir_op: Mod

- name: ModMaskI
  result_type: WordSized
  operands:
    input: WordSized
  arguments:
    shift: int32_t
  num_temps: 2
  mir_op: Mod

- name: UDiv
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
  mir_op: Div
  defer_init: true

- name: UMod
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
  mir_op: Mod
  defer_init: true

- name: SoftUDivOrMod
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
  call_instruction: true
  mir_op: Instruction

- name: Int64ToFloatingPointCall
  result_type: WordSized
  operands:
    input: Int64
    instance: WordSized
  call_instruction: true
  mir_op: BuiltinInt64ToFloatingPoint

- name: WasmTruncateToInt64
  result_type: Int64
  operands:
    input: WordSized
    instance: WordSized
  call_instruction: true
  mir_op: WasmBuiltinTruncateToInt64

- name: WasmAtomicLoadI64
  result_type: Int64
  operands:
    ptr: WordSized
    memoryBase: WordSized
  mir_op: WasmLoad

- name: WasmAtomicStoreI64
  operands:
    ptr: WordSized
    value: Int64
    memoryBase: WordSized
  num_temps64: 1
  mir_op: WasmStore

- name: WasmCompareExchangeI64
  result_type: Int64
  operands:
    ptr: WordSized
    expected: Int64
    replacement: Int64
    memoryBase: WordSized
  mir_op: WasmCompareExchangeHeap

- name: WasmAtomicBinopI64
  result_type: Int64
  operands:
    ptr: WordSized
    value: Int64
    memoryBase: WordSized
  arguments:
    access: const wasm::MemoryAccessDesc&
    operation: AtomicOp
  num_temps64: 1

- name: WasmAtomicExchangeI64
  result_type: Int64
  operands:
    ptr: WordSized
    value: Int64
    memoryBase: WordSized
  arguments:
    access: const wasm::MemoryAccessDesc&
#endif

#ifdef JS_CODEGEN_ARM64
- name: DivOrModI64
  gen_boilerplate: false

- name: UDivOrModI64
  gen_boilerplate: false

- name: DivConstantI
  result_type: WordSized
  operands:
    numerator: WordSized
  arguments:
    denominator: int32_t
  num_temps: 1
  mir_op: Div

- name: UDivConstantI
  result_type: WordSized
  operands:
    numerator: WordSized
  arguments:
    denominator: int32_t
  num_temps: 1
  mir_op: Div

- name: ModMaskI
  result_type: WordSized
  operands:
    input: WordSized
  arguments:
    shift: int32_t
  num_temps: 2
  mir_op: Mod

- name: UDiv
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
  num_temps: 1
  mir_op: Div

- name: UMod
  result_type: WordSized
  operands:
    lhs: WordSized
    rhs: WordSized
  mir_op: Mod

- name: WasmTruncateToInt64
  result_type: Int64
  operands:
    input: WordSized
  mir_op: true

- name: Int64ToFloatingPoint
  result_type: WordSized
  operands:
    input: Int64
  mir_op: true
#endif

#ifdef JS_CODEGEN_MIPS32
- name: BoxFloatingPoint
  result_type: BoxedValue
  operands:
    input: WordSized
  arguments:
    type: MIRType
  num_temps: 1
  extra_name: true

- name: DivOrModI64
  gen_boilerplate: false

- name: UDivOrModI64
  gen_boilerplate: false

- name: UDivOrMod
  gen_boilerplate: false

- name: ModMaskI
  result_type: WordSized
  operands:
    input: WordSized
  arguments:
    shift: int32_t
  num_temps: 2
  mir_op: Mod

- name: WasmTruncateToInt64
  result_type: Int64
  operands:
    input: WordSized
  mir_op: true

- name: Int64ToFloatingPoint
  result_type: WordSized
  operands:
    input: Int64
  call_instruction: true
  mir_op: true

- name: WasmUnalignedLoad
  result_type: WordSized
  operands:
    ptr: WordSized
    memoryBase: WordSized
  num_temps: 2
  mir_op: WasmLoad

- name: WasmUnalignedLoadI64
  result_type: Int64
  operands:
    ptr: WordSized
    memoryBase: WordSized
  num_temps: 2
  mir_op: WasmLoad

- name: WasmUnalignedStore
  operands:
    ptr: WordSized
    value: WordSized
    memoryBase: WordSized
  num_temps: 2
  mir_op: WasmStore

- name: WasmUnalignedStoreI64
  operands:
    ptr: WordSized
    value: Int64
    memoryBase: WordSized
  num_temps: 2
  mir_op: WasmStore

- name: WasmAtomicLoadI64
  result_type: Int64
  operands:
    ptr: WordSized
  mir_op: WasmLoad

- name: WasmAtomicStoreI64
  operands:
    ptr: WordSized
    value: Int64
  num_temps: 1
  mir_op: WasmStore

- name: WasmCompareExchangeI64
  result_type: Int64
  operands:
    ptr: WordSized
    oldValue: Int64
    newValue: Int64
    memoryBase: WordSized
  mir_op: WasmCompareExchangeHeap

- name: WasmAtomicBinopI64
  result_type: Int64
  operands:
    ptr: WordSized
    value: Int64
    memoryBase: WordSized
  num_temps64: 1
  mir_op: WasmAtomicBinopHeap

- name: WasmAtomicExchangeI64
  result_type: Int64
  operands:
    ptr: WordSized
    value: Int64
    memoryBase: WordSized
  mir_op: WasmAtomicExchangeHeap
#endif

#ifdef JS_CODEGEN_MIPS64
- name: DivOrModI64
  gen_boilerplate: false

- name: UDivOrMod
  gen_boilerplate: false

- name: UDivOrModI64
  gen_boilerplate: false

- name: ModMaskI
  result_type: WordSized
  operands:
    input: WordSized
  arguments:
    shift: int32_t
  num_temps: 2
  mir_op: Mod

- name: WasmTruncateToInt64
  result_type: Int64
  operands:
    input: WordSized
  mir_op: true

- name: Int64ToFloatingPoint
  result_type: WordSized
  operands:
    input: Int64
  mir_op: true

- name: WasmUnalignedLoad
  result_type: WordSized
  operands:
    ptr: WordSized
    memoryBase: WordSized
  num_temps: 2
  mir_op: WasmLoad

- name: WasmUnalignedLoadI64
  result_type: Int64
  operands:
    ptr: WordSized
    memoryBase: WordSized
  num_temps: 2
  mir_op: WasmLoad

- name: WasmUnalignedStore
  operands:
    ptr: WordSized
    value: WordSized
    memoryBase: WordSized
  num_temps: 2
  mir_op: WasmStore

- name: WasmUnalignedStoreI64
  operands:
    ptr: WordSized
    value: Int64
    memoryBase: WordSized
  num_temps: 2
  mir_op: WasmStore

- name: WasmCompareExchangeI64
  result_type: Int64
  operands:
    ptr: WordSized
    oldValue: Int64
    newValue: Int64
    memoryBase: WordSized
  mir_op: WasmCompareExchangeHeap

- name: WasmAtomicBinopI64
  result_type: Int64
  operands:
    ptr: WordSized
    value: Int64
    memoryBase: WordSized
  num_temps64: 1
  mir_op: WasmAtomicBinopHeap

- name: WasmAtomicExchangeI64
  result_type: Int64
  operands:
    ptr: WordSized
    value: Int64
    memoryBase: WordSized
  mir_op: WasmAtomicExchangeHeap
#endif

#ifdef JS_CODEGEN_LOONG64
- name: DivOrModI64
  gen_boilerplate: false

- name: UDivOrMod
  gen_boilerplate: false

- name: UDivOrModI64
  gen_boilerplate: false

- name: ModMaskI
  result_type: WordSized
  operands:
    input: WordSized
  arguments:
    shift: int32_t
  num_temps: 2
  mir_op: Mod

- name: WasmTruncateToInt64
  result_type: Int64
  operands:
    input: WordSized
  mir_op: true

- name: Int64ToFloatingPoint
  result_type: WordSized
  operands:
    input: Int64
  mir_op: true

- name: WasmCompareExchangeI64
  result_type: Int64
  operands:
    ptr: WordSized
    oldValue: Int64
    newValue: Int64
    memoryBase: WordSized
  mir_op: WasmCompareExchangeHeap

- name: WasmAtomicBinopI64
  result_type: Int64
  operands:
    ptr: WordSized
    value: Int64
    memoryBase: WordSized
  num_temps64: 1
  mir_op: WasmAtomicBinopHeap

- name: WasmAtomicExchangeI64
  result_type: Int64
  operands:
    ptr: WordSized
    value: Int64
    memoryBase: WordSized
  mir_op: WasmAtomicExchangeHeap
#endif

#ifdef JS_CODEGEN_RISCV64
- name: DivOrModI64
  gen_boilerplate: false

- name: UDivOrMod
  gen_boilerplate: false

- name: UDivOrModI64
  gen_boilerplate: false

- name: ModMaskI
  result_type: WordSized
  operands:
    input: WordSized
  arguments:
    shift: int32_t
  num_temps: 2
  mir_op: Mod

- name: WasmTruncateToInt64
  result_type: Int64
  operands:
    input: WordSized
  mir_op: true

- name: Int64ToFloatingPoint
  result_type: WordSized
  operands:
    input: Int64
  mir_op: true

- name: WasmCompareExchangeI64
  result_type: Int64
  operands:
    ptr: WordSized
    oldValue: Int64
    newValue: Int64
    memoryBase: WordSized
  mir_op: WasmCompareExchangeHeap

- name: WasmAtomicBinopI64
  result_type: Int64
  operands:
    ptr: WordSized
    value: Int64
    memoryBase: WordSized
  num_temps64: 1
  mir_op: WasmAtomicBinopHeap

- name: WasmAtomicExchangeI64
  result_type: Int64
  operands:
    ptr: WordSized
    value: Int64
    memoryBase: WordSized
  mir_op: WasmAtomicExchangeHeap
#endif

#ifdef FUZZING_JS_FUZZILLI
- name: FuzzilliHashT
  result_type: WordSized
  operands:
    value: WordSized
  num_temps: 2
  mir_op: FuzzilliHash

- name: FuzzilliHashV
  result_type: WordSized
  operands:
    value: BoxedValue
  num_temps: 2
  mir_op: FuzzilliHash

- name: FuzzilliHashStore
  operands:
    value: WordSized
  num_temps: 2
  mir_op: FuzzilliHashStore
#endif

#ifdef ENABLE_EXPLICIT_RESOURCE_MANAGEMENT
- name: AddDisposableResource
  operands:
    environment: WordSized
    resource: BoxedValue
    method: BoxedValue
    needsClosure: WordSized
  arguments:
    hint: uint8_t
  call_instruction: true

- name: TakeDisposeCapability
  operands:
    environment: WordSized
  result_type: BoxedValue

- name: CreateSuppressedError
  operands:
    error: BoxedValue
    suppressed: BoxedValue
  result_type: WordSized
  call_instruction: true
#endif

[zur Elbe Produktseite wechseln0.73QuellennavigatorsAnalyse erneut starten2026-04-30]

                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge