Quellcodebibliothek Statistik Leitseite products/sources/formale Sprachen/C/Firefox/js/src/jit/   (Browser von der Mozilla Stiftung Version 136.0.1©)  Datei vom 10.2.2025 mit Größe 115 kB image not shown  

Quelle  LIROps.yaml   Sprache: unbekannt

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

--> maximum size reached

--> --------------------

[ Dauer der Verarbeitung: 0.20 Sekunden  (vorverarbeitet)  ]