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


SSL LIROps.yaml   Sprache: unbekannt

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

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

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

- name: Phi
  gen_boilerplate: false

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

- name: OsiPoint
  gen_boilerplate: false

- name: MoveGroup
  gen_boilerplate: false

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

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

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

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

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

- name: Value
  gen_boilerplate: false

- name: NurseryObject
  result_type: WordSized
  mir_op: true

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

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

- name: IsConstructing
  result_type: WordSized

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- name: CheckOverRecursed
  mir_op: true

- name: WasmTrap
  mir_op: true

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

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

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

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

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

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

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

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

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

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

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

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

- name: InterruptCheck
  mir_op: true

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- name: CreateInlinedArgumentsObject
  gen_boilerplate: false

- name: GetInlinedArgument
  gen_boilerplate: false

- name: GetInlinedArgumentHole
  gen_boilerplate: false

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

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

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

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

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

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

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

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

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

- name: GuardBoundFunctionIsConstructor
  operands:
    object: WordSized

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

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

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

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

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

- name: CallGeneric
  gen_boilerplate: false

- name: CallKnown
  gen_boilerplate: false

- name: CallNative
  gen_boilerplate: false

- name: CallDOMNative
  gen_boilerplate: false

- name: CallClassHook
  gen_boilerplate: false

- name: Bail

- name: Unreachable
  successors: []

- name: EncodeSnapshot

- name: UnreachableResultV
  result_type: BoxedValue

- name: UnreachableResultT
  result_type: WordSized

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

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

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

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

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

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

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

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

- name: ApplyArgsGeneric
  gen_boilerplate: false

- name: ApplyArgsObj
  gen_boilerplate: false

- name: ApplyArrayGeneric
  gen_boilerplate: false

- name: ConstructArgsGeneric
  gen_boilerplate: false

- name: ConstructArrayGeneric
  gen_boilerplate: false

- name: ApplyArgsNative
  gen_boilerplate: false

- name: ApplyArgsObjNative
  gen_boilerplate: false

- name: ApplyArrayNative
  gen_boilerplate: false

- name: ConstructArgsNative
  gen_boilerplate: false

- name: ConstructArrayNative
  gen_boilerplate: false

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- name: Return
  gen_boilerplate: false

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- name: Hypot
  gen_boilerplate: false

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

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

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

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

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

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

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

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

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

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

- name: AddI
  gen_boilerplate: false

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

- name: SubI
  gen_boilerplate: false

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- name: OsrEntry
  gen_boilerplate: false

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- name: KeepAliveObject
  operands:
    object: WordSized

- name: DebugEnterGCUnsafeRegion
  num_temps: 1

- name: DebugLeaveGCUnsafeRegion
  num_temps: 1

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- name: InlineArgumentsSlice
  gen_boilerplate: false

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

# Store a typed value to an object's dslots or a slots vector. This has a
# few advantages over LStoreDynamicSlotV:
--> --------------------

--> maximum size reached

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

[ Verzeichnis aufwärts0.72unsichere Verbindung  ]

                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge