# 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
#
# 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
#

- name: Phi
  gen_boilerplate: false

- name: Box
  gen_boilerplate: false

- 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

- name: Goto
  gen_boilerplate: false

- name: NewArray
  gen_boilerplate: false

- 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
  gen_boilerplate: false

- 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: 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
  gen_boilerplate: false

- name: WasmRefIsSubtypeOfAbstractAndBranch
  gen_boilerplate: false

- 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: WasmReinterpret
  gen_boilerplate: false

- name: WasmReinterpretFromI64
  gen_boilerplate: false

- name: WasmReinterpretToI64
  gen_boilerplate: false

- name: Rotate
  gen_boilerplate: false

- name: RotateI64
  gen_boilerplate: false

- name: InterruptCheck
  mir_op: true

- name: WasmStackSwitchToMain
  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
  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
  call_instruction: true
  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
  gen_boilerplate: false

- name: EncodeSnapshot

- name: UnreachableResultV
  gen_boilerplate: false

- name: UnreachableResultT
  result_type: WordSized

- name: GetDOMProperty
  gen_boilerplate: false

- name: GetDOMMemberV
  gen_boilerplate: false

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

- name: SetDOMProperty
  gen_boilerplate: false

- 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

- name: TestIAndBranch
  gen_boilerplate: false

- name: TestI64AndBranch
  gen_boilerplate: false

- name: TestDAndBranch
  gen_boilerplate: false

- name: TestFAndBranch
  gen_boilerplate: false

- name: TestBIAndBranch
  gen_boilerplate: false

- name: TestOAndBranch
  gen_boilerplate: false

- name: TestVAndBranch
  gen_boilerplate: false

- name: Compare
  gen_boilerplate: false

- name: CompareI64
  gen_boilerplate: false

- name: CompareI64AndBranch
  gen_boilerplate: false

- name: CompareAndBranch
  gen_boilerplate: false

- 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
  gen_boilerplate: false

- name: CompareFAndBranch
  gen_boilerplate: false

- 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: BitAndAndBranch
  gen_boilerplate: false

# 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
  gen_boilerplate: false

- name: IsNullOrLikeUndefinedAndBranchT
  gen_boilerplate: false

- name: IsNullAndBranch
  gen_boilerplate: false

- name: IsUndefinedAndBranch
  gen_boilerplate: false

- 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 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

- name: BitNotI
  gen_boilerplate: false

- name: BitNotI64
  gen_boilerplate: false

- name: BitOpI
  gen_boilerplate: false

- name: BitOpI64
  gen_boilerplate: false

- name: ShiftI
  gen_boilerplate: false

- name: ShiftI64
  gen_boilerplate: false

- name: SignExtendInt32
  result_type: WordSized
  operands:
    num: WordSized
  arguments:
    mode: MSignExtendInt32::Mode

- name: SignExtendInt64
  gen_boilerplate: false

- name: UrshD
  gen_boilerplate: false

- 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
  gen_boilerplate: false

- name: MinMaxD
  gen_boilerplate: false

- name: MinMaxF
  gen_boilerplate: false

- name: MinMaxArrayI
  gen_boilerplate: false

- name: MinMaxArrayD
  gen_boilerplate: false

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

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

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

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

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

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

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

- name: CopySignD
  gen_boilerplate: false

- name: CopySignF
  gen_boilerplate: false

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

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

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

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

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

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

- name: SqrtD
  result_type: WordSized
  operands:
    num: WordSized

- name: SqrtF
  result_type: WordSized
  operands:
    num: WordSized

- name: Atan2D
  gen_boilerplate: false

- 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:
    num: WordSized

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

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

- name: MathFunctionD
  gen_boilerplate: false

- name: MathFunctionF
  gen_boilerplate: false

- name: AddI
  gen_boilerplate: false

- name: AddI64
  gen_boilerplate: false

- name: SubI
  gen_boilerplate: false

- name: SubI64
  gen_boilerplate: false

- name: MulI64
  gen_boilerplate: false

- name: MathD
  gen_boilerplate: false

- name: MathF
  gen_boilerplate: false

- name: ModD
  gen_boilerplate: false

- name: ModPowTwoD
  gen_boilerplate: false

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

- name: BigIntAdd
  gen_boilerplate: false

- name: BigIntSub
  gen_boilerplate: false

- name: BigIntMul
  gen_boilerplate: false

- name: BigIntDiv
  gen_boilerplate: false

- name: BigIntMod
  gen_boilerplate: false

- name: BigIntPow
  gen_boilerplate: false

- name: BigIntBitAnd
  gen_boilerplate: false

- name: BigIntBitOr
  gen_boilerplate: false

- name: BigIntBitXor
  gen_boilerplate: false

- name: BigIntLsh
  gen_boilerplate: false

- name: BigIntRsh
  gen_boilerplate: false

- name: BigIntIncrement
  gen_boilerplate: false

- name: BigIntDecrement
  gen_boilerplate: false

- name: BigIntNegate
  gen_boilerplate: false

- name: BigIntBitNot
  gen_boilerplate: false

- 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

# 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

- name: ValueToInt32
  gen_boilerplate: false

# 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:
    in: 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:
    in: 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:
    in: 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:
    in: 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:
    in: 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:
    in: 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

- name: PowHalfD
  gen_boilerplate: false

- 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:
    object: WordSized
  mir_op: true

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

- name: BoundsCheckRange
  gen_boilerplate: false

# 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

- name: LoadElementV
  gen_boilerplate: false

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

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

- name: LoadElementHole
  gen_boilerplate: false

- name: StoreElementV
  gen_boilerplate: false

- name: StoreElementT
  gen_boilerplate: false

- 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
  gen_boilerplate: false

- 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: 1
  mir_op: true

- name: LoadUnboxedBigInt
  gen_boilerplate: false

- name: LoadDataViewElement
  gen_boilerplate: false

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

- name: LoadTypedArrayElementHoleBigInt
  gen_boilerplate: false

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

- name: StoreUnboxedBigInt
  gen_boilerplate: false

- name: StoreDataViewElement
  gen_boilerplate: false

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

- name: StoreTypedArrayElementHoleBigInt
  gen_boilerplate: false

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

- name: CompareExchangeTypedArrayElement
  gen_boilerplate: false

- name: AtomicExchangeTypedArrayElement
  gen_boilerplate: false

- name: AtomicTypedArrayElementBinop
  gen_boilerplate: false

- name: AtomicTypedArrayElementBinopForEffect
  gen_boilerplate: false

- name: AtomicLoad64
  gen_boilerplate: false

- name: AtomicStore64
  gen_boilerplate: false

- name: CompareExchangeTypedArrayElement64
  gen_boilerplate: false

- name: AtomicExchangeTypedArrayElement64
  gen_boilerplate: false

- name: AtomicTypedArrayElementBinop64
  gen_boilerplate: false

- name: AtomicTypedArrayElementBinopForEffect64
  gen_boilerplate: false

- 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:
    in: 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:
    in: 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:
    in: 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:
    num: WordSized

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

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

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

# Round a double precision number and converts it to an int32.
# Implements Math.round().
- name: Round
  result_type: WordSized
  operands:
    num: 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:
    num: 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:
    num: WordSized

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

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

# Rounds a single precision number accordingly to mir()->roundingMode(),
# and keeps a single output.
- name: NearbyIntF
  result_type: WordSized
  operands:
    num: 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
  gen_boilerplate: false

- 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
  gen_boilerplate: false

- 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_temps: 1
  mir_op: true

# 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:
    in: 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: 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:
    in: 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
  gen_boilerplate: false

- 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
  gen_boilerplate: false

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

- name: IsNullOrUndefinedAndBranch
  gen_boilerplate: false

- 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
  gen_boilerplate: false

- name: WasmSelectI64
  gen_boilerplate: false

- name: WasmCompareAndSelect
  gen_boilerplate: false

- 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
  gen_boilerplate: false

- 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: 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
  gen_boilerplate: false

- name: WasmLoadI64
  gen_boilerplate: false

- name: WasmStore
  gen_boilerplate: false

- name: WasmStoreI64
  gen_boilerplate: false

- 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
  gen_boilerplate: false

- name: WasmFence

- name: WasmAtomicExchangeHeap
  gen_boilerplate: false

- name: WasmAtomicBinopHeap
  gen_boilerplate: false

- name: WasmAtomicBinopHeapForEffect
  gen_boilerplate: false

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

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

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

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

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

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

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

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

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

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

- name: WasmDerivedPointer
  gen_boilerplate: false

- name: WasmDerivedIndexPointer
  gen_boilerplate: false

- name: WasmStoreRef
  operands:
    instance: WordSized
    valueBase: WordSized
    value: WordSized
  arguments:
    offset: uint32_t
    maybeTrap: MaybeTrapSiteInfo
    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
  gen_boilerplate: false

- 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
  gen_boilerplate: false

- name: AssertRangeD
  gen_boilerplate: false

- name: AssertRangeF
  gen_boilerplate: false

- name: AssertRangeV
  gen_boilerplate: false

- 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
  gen_boilerplate: false

- name: Debugger
  num_temps: 1
  call_instruction: true

- name: NewTarget
  result_type: BoxedValue

- name: Random
  gen_boilerplate: false

- 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: BigIntAsIntN64
  gen_boilerplate: false

- name: BigIntAsIntN32
  gen_boilerplate: false

- 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: MapObjectGetValue
  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: BigIntAsUintN64
  gen_boilerplate: false

- name: BigIntAsUintN32
  gen_boilerplate: false

- 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: 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

- name: WasmTernarySimd128
  gen_boilerplate: false

- name: WasmBinarySimd128
  gen_boilerplate: false

- name: WasmBinarySimd128WithConstant
  gen_boilerplate: false

- name: WasmVariableShiftSimd128
  gen_boilerplate: false

- name: WasmConstantShiftSimd128
  gen_boilerplate: false

- name: WasmSignReplicationSimd128
  gen_boilerplate: false

- name: WasmShuffleSimd128
  gen_boilerplate: false

- name: WasmPermuteSimd128
  gen_boilerplate: false

- name: WasmReplaceLaneSimd128
  gen_boilerplate: false

- name: WasmReplaceInt64LaneSimd128
  gen_boilerplate: false

- name: WasmScalarToSimd128
  gen_boilerplate: false

- name: WasmInt64ToSimd128
  gen_boilerplate: false

- name: WasmUnarySimd128
  gen_boilerplate: false

- name: WasmReduceSimd128
  gen_boilerplate: false

- name: WasmReduceAndBranchSimd128
  gen_boilerplate: false

- name: WasmReduceSimd128ToInt64
  gen_boilerplate: false

- name: WasmLoadLaneSimd128
  gen_boilerplate: false

- name: WasmStoreLaneSimd128
  gen_boilerplate: false

- name: Unbox
  gen_boilerplate: false

- name: UnboxFloatingPoint
  gen_boilerplate: false

- name: WasmUint32ToDouble
  gen_boilerplate: false

- name: WasmUint32ToFloat32
  gen_boilerplate: false

- name: DivI
  gen_boilerplate: false

- name: ModI
  gen_boilerplate: false

- name: DivPowTwoI
  gen_boilerplate: false

- name: ModPowTwoI
  gen_boilerplate: false

- name: TableSwitch
  gen_boilerplate: false

- name: TableSwitchV
  gen_boilerplate: false

- name: MulI
  gen_boilerplate: false

#ifdef JS_CODEGEN_X86
- name: BoxFloatingPoint
  gen_boilerplate: false

- 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
  gen_boilerplate: false

- name: Int64ToFloatingPoint
  gen_boilerplate: false

- name: WasmAtomicLoadI64
  gen_boilerplate: false

- name: WasmAtomicStoreI64
  gen_boilerplate: false

- name: WasmCompareExchangeI64
  gen_boilerplate: false

- name: WasmAtomicBinopI64
  gen_boilerplate: false

- name: WasmAtomicExchangeI64
  gen_boilerplate: false
#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
  gen_boilerplate: false

- name: Int64ToFloatingPoint
  gen_boilerplate: false
#endif

#ifdef JS_CODEGEN_ARM
- name: BoxFloatingPoint
  gen_boilerplate: false

- name: DivOrModI64
  gen_boilerplate: false

- name: UDivOrModI64
  gen_boilerplate: false

- name: SoftDivI
  gen_boilerplate: false

- name: SoftModI
  gen_boilerplate: false

- name: ModMaskI
  gen_boilerplate: false

- name: UDiv
  gen_boilerplate: false

- name: UMod
  gen_boilerplate: false

- name: SoftUDivOrMod
  gen_boilerplate: false

- name: Int64ToFloatingPointCall
  gen_boilerplate: false

- name: WasmTruncateToInt64
  gen_boilerplate: false

- name: WasmAtomicLoadI64
  gen_boilerplate: false

- name: WasmAtomicStoreI64
  gen_boilerplate: false

- name: WasmCompareExchangeI64
  gen_boilerplate: false

- name: WasmAtomicBinopI64
  gen_boilerplate: false

- name: WasmAtomicExchangeI64
  gen_boilerplate: false
#endif

#ifdef JS_CODEGEN_ARM64
- name: DivOrModI64
  gen_boilerplate: false

- name: UDivOrModI64
  gen_boilerplate: false

- name: DivConstantI
  gen_boilerplate: false

- name: UDivConstantI
  gen_boilerplate: false

- name: ModMaskI
  gen_boilerplate: false

- name: UDiv
  gen_boilerplate: false

- name: UMod
  gen_boilerplate: false

- name: WasmTruncateToInt64
  gen_boilerplate: false

- name: Int64ToFloatingPoint
  gen_boilerplate: false
#endif

#ifdef JS_CODEGEN_MIPS32
- name: BoxFloatingPoint
  gen_boilerplate: false

- name: DivOrModI64
  gen_boilerplate: false

- name: UDivOrModI64
  gen_boilerplate: false

- name: UDivOrMod
  gen_boilerplate: false

- name: ModMaskI
  gen_boilerplate: false

- name: WasmTruncateToInt64
  gen_boilerplate: false

- name: Int64ToFloatingPoint
  gen_boilerplate: false

- name: WasmUnalignedLoad
  gen_boilerplate: false

- name: WasmUnalignedLoadI64
  gen_boilerplate: false

- name: WasmUnalignedStore
  gen_boilerplate: false

- name: WasmUnalignedStoreI64
  gen_boilerplate: false

- name: WasmAtomicLoadI64
  gen_boilerplate: false

- name: WasmAtomicStoreI64
  gen_boilerplate: false

- name: WasmCompareExchangeI64
  gen_boilerplate: false

- name: WasmAtomicBinopI64
  gen_boilerplate: false

- name: WasmAtomicExchangeI64
  gen_boilerplate: false
#endif

#ifdef JS_CODEGEN_MIPS64
- name: DivOrModI64
  gen_boilerplate: false

- name: UDivOrMod
  gen_boilerplate: false

- name: UDivOrModI64
  gen_boilerplate: false

- name: ModMaskI
  gen_boilerplate: false

- name: WasmTruncateToInt64
  gen_boilerplate: false

- name: Int64ToFloatingPoint
  gen_boilerplate: false

- name: WasmUnalignedLoad
  gen_boilerplate: false

- name: WasmUnalignedLoadI64
  gen_boilerplate: false

- name: WasmUnalignedStore
  gen_boilerplate: false

- name: WasmUnalignedStoreI64
  gen_boilerplate: false

- name: WasmCompareExchangeI64
  gen_boilerplate: false

- name: WasmAtomicBinopI64
  gen_boilerplate: false

- name: WasmAtomicExchangeI64
  gen_boilerplate: false
#endif

#ifdef JS_CODEGEN_LOONG64
- name: DivOrModI64
  gen_boilerplate: false

- name: UDivOrMod
  gen_boilerplate: false

- name: UDivOrModI64
  gen_boilerplate: false

- name: ModMaskI
  gen_boilerplate: false

- name: WasmTruncateToInt64
  gen_boilerplate: false

- name: Int64ToFloatingPoint
  gen_boilerplate: false

- name: WasmCompareExchangeI64
  gen_boilerplate: false

- name: WasmAtomicBinopI64
  gen_boilerplate: false

- name: WasmAtomicExchangeI64
  gen_boilerplate: false
#endif

#ifdef JS_CODEGEN_RISCV64
- name: DivOrModI64
  gen_boilerplate: false

- name: UDivOrMod
  gen_boilerplate: false

- name: UDivOrModI64
  gen_boilerplate: false

- name: ModMaskI
  gen_boilerplate: false

- name: WasmTruncateToInt64
  gen_boilerplate: false

- name: Int64ToFloatingPoint
  gen_boilerplate: false

- name: WasmCompareExchangeI64
  gen_boilerplate: false

- name: WasmAtomicBinopI64
  gen_boilerplate: false

- name: WasmAtomicExchangeI64
  gen_boilerplate: false
#endif

#ifdef FUZZING_JS_FUZZILLI
- name: FuzzilliHashT
  gen_boilerplate: false

- name: FuzzilliHashV
  gen_boilerplate: false

- name: FuzzilliHashStore
  gen_boilerplate: false
#endif
