summaryrefslogtreecommitdiffstats
path: root/js/src/jit/LIROps.yaml
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit/LIROps.yaml')
-rw-r--r--js/src/jit/LIROps.yaml3972
1 files changed, 3972 insertions, 0 deletions
diff --git a/js/src/jit/LIROps.yaml b/js/src/jit/LIROps.yaml
new file mode 100644
index 0000000000..de497278e0
--- /dev/null
+++ b/js/src/jit/LIROps.yaml
@@ -0,0 +1,3972 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+# [SMDOC] LIR Opcodes
+# =======================
+# This file defines all LIR opcodes as well as LIR opcode class
+# definitions. It is parsed by GenerateLIRFiles.py at build time to
+# create LIROpsGenerated.h. Each opcode consists of a
+# name and a set of attributes that are described below. Unless
+# marked as required, attributes are optional.
+#
+# name [required]
+# ====
+# Opcode name.
+# Possible values:
+# - opcode string: used as the name for LIR opcode.
+#
+# gen_boilerplate
+# ===============
+# Used to decide to generate LIR boilerplate.
+# - true (default): auto generate boilerplate for this LIR opcode
+# - false: do not generate boilerplate for this LIR opcode
+#
+# result_type
+# ===========
+# Specifies the result type that is produced by this LIR instruction.
+# The result type can be any of the following: WordSized, BoxedValue,
+# or Int64.
+# - attribute not specified (default): there is no result produced
+# by this LIR instruction
+# - result type: sets result type for this LIR instruction
+#
+# operands
+# ========
+# A list of operands to the LIR node. Each operand will be
+# passed into and set in the instruction's constructor. A simple getter
+# will also be auto generated for the operand. Each operand in the
+# following list is defined by its name and an type.
+# The type can be WordSized, BoxedValue, or Int64.
+#
+# For example:
+# operands:
+# lhs: BoxedValue
+# rhs: WordSized
+#
+# Will result in:
+# explicit LInstanceOfV(const LBoxAllocation& lhs, const LAllocation& rhs)
+# : LInstructionHelper(classOpcode) {
+# setBoxOperand(lhsIndex, lhs);
+# setOperand(rhsIndex, rhs);
+# }
+# const LAllocation* rhs() { return getOperand(0); }
+#
+# static const size_t lhsIndex = 0;
+# static const size_t rhsIndex = BOX_PIECES;
+#
+# - attribute not specified (default): no code generated
+# - list of operand names with their types: operand getters and setters
+# are generated and passed into the constructor
+#
+# arguments
+# =========
+# A list of non-LIR node arguments to the LIR op class constructor
+# that are passed along with the operands. The arguments require
+# both a name and a full type signature for each item in the list.
+#
+# For example:
+# offset: size_t
+# type: MIRType
+#
+# For each argument a private variable declaration will be autogenerated
+# in the LIR op class, as well as simple accessor for that variable. The
+# above arguments list will result in the following declarations and
+# accessors:
+#
+# size_t offset_;
+# MIRType type_;
+#
+# size_t offset() const { return offset_; }
+# MIRType type() const { return type_; }
+#
+# - attribute not specified (default): no code generated
+# - argument list: argument names and their full type signature
+#
+# num_temps
+# ========
+# Specifies the number of temporary virtual registers, LDefinitions, used by
+# this LIR op.
+# - attribute not specified (default): number of temps is set to 0
+# - number of LDefinition temps: sets number of temps max 15
+#
+# call_instruction
+# ================
+# Used to define call instructions.
+# - attribute not specified (default): no code generated
+# - true: generates a call to setIsCall in the op's constructor
+#
+# mir_op
+# ======
+# If a LIR instruction corresponds one-to-one with a particular MIR
+# instruction, this will generate a method that returns that MIR
+# instruction.
+# - attribute not specified (default): no code generated
+# - true: generates a method to return MIR instruction
+# - mir string: returns this specified MIR instruction
+#
+
+- name: Phi
+ gen_boilerplate: false
+
+- name: Box
+ gen_boilerplate: false
+
+- name: OsiPoint
+ gen_boilerplate: false
+
+- name: MoveGroup
+ gen_boilerplate: false
+
+# Constant 32-bit integer.
+- name: Integer
+ result_type: WordSized
+ arguments:
+ i32: int32_t
+
+# Constant 64-bit integer.
+- name: Integer64
+ result_type: Int64
+ arguments:
+ i64: int64_t
+
+# Constant pointer.
+- name: Pointer
+ result_type: WordSized
+ arguments:
+ gcptr: gc::Cell*
+
+# Constant double.
+- name: Double
+ result_type: WordSized
+ arguments:
+ value: double
+
+# Constant float32.
+- name: Float32
+ result_type: WordSized
+ arguments:
+ value: float
+
+- name: Value
+ gen_boilerplate: false
+
+- name: NurseryObject
+ result_type: WordSized
+ mir_op: true
+
+# Formal argument for a function, returning a box. Formal arguments are
+# initially read from the stack.
+- name: Parameter
+ result_type: BoxedValue
+
+# Stack offset for a word-sized immutable input value to a frame.
+- name: Callee
+ result_type: WordSized
+
+- name: IsConstructing
+ result_type: WordSized
+
+- name: Goto
+ gen_boilerplate: false
+
+- name: NewArray
+ gen_boilerplate: false
+
+- name: NewArrayDynamicLength
+ result_type: WordSized
+ operands:
+ length: WordSized
+ num_temps: 1
+ mir_op: true
+
+- name: NewIterator
+ result_type: WordSized
+ num_temps: 1
+ mir_op: true
+
+- name: NewTypedArray
+ result_type: WordSized
+ num_temps: 2
+ mir_op: true
+
+- name: NewTypedArrayDynamicLength
+ result_type: WordSized
+ operands:
+ length: WordSized
+ num_temps: 1
+ mir_op: true
+
+- name: NewTypedArrayFromArray
+ result_type: WordSized
+ operands:
+ array: WordSized
+ call_instruction: true
+ mir_op: true
+
+- name: NewTypedArrayFromArrayBuffer
+ result_type: WordSized
+ operands:
+ arrayBuffer: WordSized
+ byteOffset: BoxedValue
+ length: BoxedValue
+ call_instruction: true
+ mir_op: true
+
+- name: BindFunction
+ result_type: WordSized
+ operands:
+ target: WordSized
+ call_instruction: true
+ num_temps: 2
+ mir_op: true
+
+- name: NewBoundFunction
+ result_type: WordSized
+ num_temps: 1
+ mir_op: true
+
+- name: NewObject
+ gen_boilerplate: false
+
+- name: NewPlainObject
+ result_type: WordSized
+ num_temps: 3
+ mir_op: true
+
+- name: NewArrayObject
+ result_type: WordSized
+ num_temps: 2
+ mir_op: true
+
+# Allocates a new NamedLambdaObject.
+#
+# This instruction generates two possible instruction sets:
+# (1) An inline allocation of the call object is attempted.
+# (2) Otherwise, a callVM create a new object.
+#
+- name: NewNamedLambdaObject
+ result_type: WordSized
+ num_temps: 1
+ mir_op: true
+
+# Allocates a new CallObject.
+#
+# This instruction generates two possible instruction sets:
+# (1) If the call object is extensible, this is a callVM to create the
+# call object.
+# (2) Otherwise, an inline allocation of the call object is attempted.
+#
+- name: NewCallObject
+ result_type: WordSized
+ num_temps: 1
+ mir_op: true
+
+- name: NewStringObject
+ result_type: WordSized
+ operands:
+ input: WordSized
+ num_temps: 1
+ mir_op: true
+
+- name: InitElemGetterSetter
+ operands:
+ object: WordSized
+ id: BoxedValue
+ value: WordSized
+ call_instruction: true
+ mir_op: true
+
+# Takes in an Object and a Value.
+- name: MutateProto
+ operands:
+ object: WordSized
+ value: BoxedValue
+ call_instruction: true
+
+- name: InitPropGetterSetter
+ operands:
+ object: WordSized
+ value: WordSized
+ call_instruction: true
+ mir_op: true
+
+- name: CheckOverRecursed
+ mir_op: true
+
+- name: WasmTrap
+ mir_op: true
+
+- name: WasmTrapIfNull
+ operands:
+ object: WordSized
+ mir_op: true
+
+- name: WasmGcObjectIsSubtypeOfConcrete
+ mir_op: true
+ operands:
+ object: WordSized
+ superSuperTypeVector: WordSized
+ result_type: WordSized
+ num_temps: 2
+
+- name: WasmGcObjectIsSubtypeOfAbstract
+ mir_op: true
+ operands:
+ object: WordSized
+ result_type: WordSized
+ num_temps: 1
+
+- name: WasmGcObjectIsSubtypeOfConcreteAndBranch
+ gen_boilerplate: false
+
+- name: WasmGcObjectIsSubtypeOfAbstractAndBranch
+ gen_boilerplate: false
+
+- name: WasmReinterpret
+ gen_boilerplate: false
+
+- name: WasmReinterpretFromI64
+ gen_boilerplate: false
+
+- name: WasmReinterpretToI64
+ gen_boilerplate: false
+
+- name: Rotate
+ gen_boilerplate: false
+
+- name: RotateI64
+ gen_boilerplate: false
+
+- name: InterruptCheck
+ mir_op: true
+
+- name: WasmInterruptCheck
+ operands:
+ instance: WordSized
+ mir_op: true
+
+- name: TypeOfV
+ result_type: WordSized
+ operands:
+ input: BoxedValue
+ num_temps: 1
+ mir_op: TypeOf
+
+- name: TypeOfO
+ result_type: WordSized
+ operands:
+ object: WordSized
+ mir_op: TypeOf
+
+- name: TypeOfName
+ result_type: WordSized
+ operands:
+ input: WordSized
+ mir_op: true
+
+- name: TypeOfIsNonPrimitiveV
+ result_type: WordSized
+ operands:
+ input: BoxedValue
+ num_temps: 1
+ mir_op: TypeOfIs
+
+- name: TypeOfIsNonPrimitiveO
+ result_type: WordSized
+ operands:
+ input: WordSized
+ mir_op: TypeOfIs
+
+- name: TypeOfIsPrimitive
+ result_type: WordSized
+ operands:
+ input: BoxedValue
+ mir_op: TypeOfIs
+
+- name: ToAsyncIter
+ result_type: WordSized
+ operands:
+ iterator: WordSized
+ nextMethod: BoxedValue
+ call_instruction: true
+
+- name: ToPropertyKeyCache
+ result_type: BoxedValue
+ operands:
+ input: BoxedValue
+ mir_op: true
+
+# Allocate an object for |new| on the caller-side,
+# when there is no templateObject or prototype known
+- name: CreateThis
+ result_type: BoxedValue
+ operands:
+ callee: WordSized
+ newTarget: WordSized
+ call_instruction: true
+ mir_op: true
+
+# Allocate a new arguments object for the frame.
+- name: CreateArgumentsObject
+ result_type: WordSized
+ operands:
+ callObject: WordSized
+ num_temps: 3
+ call_instruction: true
+ mir_op: true
+
+- name: CreateInlinedArgumentsObject
+ gen_boilerplate: false
+
+- name: GetInlinedArgument
+ gen_boilerplate: false
+
+- name: GetInlinedArgumentHole
+ gen_boilerplate: false
+
+# Get argument from arguments object.
+- name: GetArgumentsObjectArg
+ result_type: BoxedValue
+ operands:
+ argsObject: WordSized
+ num_temps: 1
+ mir_op: true
+
+# Set argument on arguments object.
+- name: SetArgumentsObjectArg
+ operands:
+ argsObject: WordSized
+ value: BoxedValue
+ num_temps: 1
+ mir_op: true
+
+# Load an element from an arguments object.
+- name: LoadArgumentsObjectArg
+ result_type: BoxedValue
+ operands:
+ argsObject: WordSized
+ index: WordSized
+ num_temps: 1
+
+# Load an element from an arguments object. Handles out-of-bounds accesses.
+- name: LoadArgumentsObjectArgHole
+ result_type: BoxedValue
+ operands:
+ argsObject: WordSized
+ index: WordSized
+ num_temps: 1
+
+# Return true if the element exists in the arguments object.
+- name: InArgumentsObjectArg
+ result_type: WordSized
+ operands:
+ argsObject: WordSized
+ index: WordSized
+ num_temps: 1
+
+# Return |arguments.length| unless it has been overridden.
+- name: ArgumentsObjectLength
+ result_type: WordSized
+ operands:
+ argsObject: WordSized
+
+# Create an array from an arguments object.
+- name: ArrayFromArgumentsObject
+ result_type: WordSized
+ operands:
+ argsObject: WordSized
+ call_instruction: true
+ mir_op: true
+
+# Guard that the given flags are not set on the arguments object.
+- name: GuardArgumentsObjectFlags
+ operands:
+ argsObject: WordSized
+ num_temps: 1
+ mir_op: true
+
+- name: BoundFunctionNumArgs
+ result_type: WordSized
+ operands:
+ object: WordSized
+
+- name: GuardBoundFunctionIsConstructor
+ operands:
+ object: WordSized
+
+# If the Value is an Object, return unbox(Value).
+# Otherwise, return the other Object.
+- name: ReturnFromCtor
+ result_type: WordSized
+ operands:
+ value: BoxedValue
+ object: WordSized
+
+- name: BoxNonStrictThis
+ result_type: WordSized
+ operands:
+ value: BoxedValue
+ mir_op: true
+
+- name: ImplicitThis
+ result_type: BoxedValue
+ operands:
+ env: WordSized
+ call_instruction: true
+ mir_op: true
+
+# Writes a typed argument for a function call to the frame's argument vector.
+- name: StackArgT
+ operands:
+ arg: WordSized
+ arguments:
+ # Index into frame-scope argument vector.
+ argslot: uint32_t
+ type: MIRType
+
+# Writes a typed argument for a function call to the frame's argument vector.
+- name: StackArgV
+ operands:
+ value: BoxedValue
+ arguments:
+ # Index into frame-scope argument vector.
+ argslot: uint32_t
+
+- name: CallGeneric
+ gen_boilerplate: false
+
+- name: CallKnown
+ gen_boilerplate: false
+
+- name: CallNative
+ gen_boilerplate: false
+
+- name: CallDOMNative
+ gen_boilerplate: false
+
+- name: CallClassHook
+ gen_boilerplate: false
+
+- name: Bail
+
+- name: Unreachable
+ gen_boilerplate: false
+
+- name: EncodeSnapshot
+
+- name: UnreachableResultV
+ gen_boilerplate: false
+
+- name: UnreachableResultT
+ result_type: WordSized
+
+- name: GetDOMProperty
+ gen_boilerplate: false
+
+- name: GetDOMMemberV
+ gen_boilerplate: false
+
+- name: GetDOMMemberT
+ result_type: WordSized
+ operands:
+ object: WordSized
+ mir_op: GetDOMMember
+
+- name: SetDOMProperty
+ gen_boilerplate: false
+
+- name: LoadDOMExpandoValue
+ result_type: BoxedValue
+ operands:
+ proxy: WordSized
+ mir_op: true
+
+- name: LoadDOMExpandoValueGuardGeneration
+ result_type: BoxedValue
+ operands:
+ proxy: WordSized
+ mir_op: true
+
+- name: LoadDOMExpandoValueIgnoreGeneration
+ result_type: BoxedValue
+ operands:
+ proxy: WordSized
+ mir_op: true
+
+- name: GuardDOMExpandoMissingOrGuardShape
+ operands:
+ input: BoxedValue
+ num_temps: 1
+ mir_op: true
+
+- name: ApplyArgsGeneric
+ gen_boilerplate: false
+
+- name: ApplyArgsObj
+ gen_boilerplate: false
+
+- name: ApplyArrayGeneric
+ gen_boilerplate: false
+
+- name: ConstructArgsGeneric
+ gen_boilerplate: false
+
+- name: ConstructArrayGeneric
+ gen_boilerplate: false
+
+- name: TestIAndBranch
+ gen_boilerplate: false
+
+- name: TestI64AndBranch
+ gen_boilerplate: false
+
+- name: TestDAndBranch
+ gen_boilerplate: false
+
+- name: TestFAndBranch
+ gen_boilerplate: false
+
+- name: TestBIAndBranch
+ gen_boilerplate: false
+
+- name: TestOAndBranch
+ gen_boilerplate: false
+
+- name: TestVAndBranch
+ gen_boilerplate: false
+
+- name: Compare
+ gen_boilerplate: false
+
+- name: CompareI64
+ gen_boilerplate: false
+
+- name: CompareI64AndBranch
+ gen_boilerplate: false
+
+- name: CompareAndBranch
+ gen_boilerplate: false
+
+- name: CompareD
+ result_type: WordSized
+ operands:
+ left: WordSized
+ right: WordSized
+ mir_op: Compare
+
+- name: CompareF
+ result_type: WordSized
+ operands:
+ left: WordSized
+ right: WordSized
+ mir_op: Compare
+
+- name: CompareDAndBranch
+ gen_boilerplate: false
+
+- name: CompareFAndBranch
+ gen_boilerplate: false
+
+- name: CompareS
+ result_type: WordSized
+ operands:
+ left: WordSized
+ right: WordSized
+ mir_op: Compare
+
+- name: CompareSInline
+ result_type: WordSized
+ operands:
+ input: WordSized
+ arguments:
+ constant: JSLinearString*
+ mir_op: Compare
+
+- name: CompareBigInt
+ result_type: WordSized
+ operands:
+ left: WordSized
+ right: WordSized
+ num_temps: 3
+ mir_op: Compare
+
+- name: CompareBigIntInt32
+ result_type: WordSized
+ operands:
+ left: WordSized
+ right: WordSized
+ num_temps: 2
+ mir_op: Compare
+
+- name: CompareBigIntDouble
+ result_type: WordSized
+ operands:
+ left: WordSized
+ right: WordSized
+ call_instruction: true
+ mir_op: Compare
+
+- name: CompareBigIntString
+ result_type: WordSized
+ operands:
+ left: WordSized
+ right: WordSized
+ call_instruction: true
+ mir_op: Compare
+
+- name: BitAndAndBranch
+ gen_boilerplate: false
+
+# Takes a value and tests whether it is null, undefined, or is an object that
+# emulates |undefined|, as determined by the JSCLASS_EMULATES_UNDEFINED class
+# flag on unwrapped objects. See also js::EmulatesUndefined.
+- name: IsNullOrLikeUndefinedV
+ result_type: WordSized
+ operands:
+ value: BoxedValue
+ num_temps: 1
+ mir_op: Compare
+
+# Takes an object pointer and tests whether it is an object that emulates
+# |undefined|, as above.
+- name: IsNullOrLikeUndefinedT
+ result_type: WordSized
+ operands:
+ input: WordSized
+ mir_op: Compare
+
+# Takes a value and tests whether it is null.
+- name: IsNull
+ result_type: WordSized
+ operands:
+ value: BoxedValue
+ mir_op: Compare
+
+# Takes a value and tests whether it is undefined.
+- name: IsUndefined
+ result_type: WordSized
+ operands:
+ value: BoxedValue
+ mir_op: Compare
+
+- name: IsNullOrLikeUndefinedAndBranchV
+ gen_boilerplate: false
+
+- name: IsNullOrLikeUndefinedAndBranchT
+ gen_boilerplate: false
+
+- name: IsNullAndBranch
+ gen_boilerplate: false
+
+- name: IsUndefinedAndBranch
+ gen_boilerplate: false
+
+- name: SameValueDouble
+ result_type: WordSized
+ operands:
+ left: WordSized
+ right: WordSized
+ num_temps: 1
+
+- name: SameValue
+ result_type: WordSized
+ operands:
+ lhs: BoxedValue
+ rhs: BoxedValue
+
+# Not operation on an integer.
+- name: NotI
+ result_type: WordSized
+ operands:
+ input: WordSized
+
+# Not operation on an int64.
+- name: NotI64
+ result_type: WordSized
+ operands:
+ inputI64: Int64
+
+# Not operation on a double.
+- name: NotD
+ result_type: WordSized
+ operands:
+ input: WordSized
+ mir_op: Not
+
+# Not operation on a float32.
+- name: NotF
+ result_type: WordSized
+ operands:
+ input: WordSized
+ mir_op: Not
+
+# Not operation on a BigInt.
+- name: NotBI
+ result_type: WordSized
+ operands:
+ input: WordSized
+ mir_op: Not
+
+# Boolean complement operation on an object.
+- name: NotO
+ result_type: WordSized
+ operands:
+ input: WordSized
+ mir_op: Not
+
+# Boolean complement operation on a value.
+- name: NotV
+ result_type: WordSized
+ operands:
+ input: BoxedValue
+ num_temps: 2
+ mir_op: Not
+
+- name: BitNotI
+ gen_boilerplate: false
+
+- name: BitNotI64
+ gen_boilerplate: false
+
+- name: BitOpI
+ gen_boilerplate: false
+
+- name: BitOpI64
+ gen_boilerplate: false
+
+- name: ShiftI
+ gen_boilerplate: false
+
+- name: ShiftI64
+ gen_boilerplate: false
+
+- name: SignExtendInt32
+ result_type: WordSized
+ operands:
+ num: WordSized
+ arguments:
+ mode: MSignExtendInt32::Mode
+
+- name: SignExtendInt64
+ gen_boilerplate: false
+
+- name: UrshD
+ gen_boilerplate: false
+
+- name: Return
+ gen_boilerplate: false
+
+- name: Throw
+ operands:
+ value: BoxedValue
+ call_instruction: true
+
+- name: MinMaxI
+ gen_boilerplate: false
+
+- name: MinMaxD
+ gen_boilerplate: false
+
+- name: MinMaxF
+ gen_boilerplate: false
+
+- name: MinMaxArrayI
+ gen_boilerplate: false
+
+- name: MinMaxArrayD
+ gen_boilerplate: false
+
+# Negative of integer
+- name: NegI
+ result_type: WordSized
+ operands:
+ num: WordSized
+
+# Negative of an int64
+- name: NegI64
+ result_type: Int64
+ operands:
+ num: Int64
+
+# Negative of double
+- name: NegD
+ result_type: WordSized
+ operands:
+ num: WordSized
+
+# Negative of float32
+- name: NegF
+ result_type: WordSized
+ operands:
+ num: WordSized
+
+# Absolute value of an integer.
+- name: AbsI
+ result_type: WordSized
+ operands:
+ num: WordSized
+ mir_op: Abs
+
+# Absolute value of a double.
+- name: AbsD
+ result_type: WordSized
+ operands:
+ num: WordSized
+
+# Absolute value of a float32.
+- name: AbsF
+ result_type: WordSized
+ operands:
+ num: WordSized
+
+- name: CopySignD
+ gen_boilerplate: false
+
+- name: CopySignF
+ gen_boilerplate: false
+
+# Count leading zeroes on an int32.
+- name: ClzI
+ result_type: WordSized
+ operands:
+ num: WordSized
+ mir_op: Clz
+
+# Count leading zeroes on an int64.
+- name: ClzI64
+ result_type: Int64
+ operands:
+ num: Int64
+ mir_op: Clz
+
+# Count trailing zeroes on an int32.
+- name: CtzI
+ result_type: WordSized
+ operands:
+ num: WordSized
+ mir_op: Ctz
+
+# Count trailing zeroes on an int64.
+- name: CtzI64
+ result_type: Int64
+ operands:
+ num: Int64
+ mir_op: Ctz
+
+# Count population on an int32.
+- name: PopcntI
+ result_type: WordSized
+ operands:
+ num: WordSized
+ num_temps: 1
+ mir_op: Popcnt
+
+# Count population on an int64.
+- name: PopcntI64
+ result_type: Int64
+ operands:
+ num: Int64
+ num_temps: 1
+ mir_op: Popcnt
+
+- name: SqrtD
+ result_type: WordSized
+ operands:
+ num: WordSized
+
+- name: SqrtF
+ result_type: WordSized
+ operands:
+ num: WordSized
+
+- name: Atan2D
+ gen_boilerplate: false
+
+- name: Hypot
+ gen_boilerplate: false
+
+# Double raised to an integer power.
+- name: PowI
+ result_type: WordSized
+ operands:
+ value: WordSized
+ power: WordSized
+ call_instruction: true
+
+# Integer raised to an integer power.
+- name: PowII
+ result_type: WordSized
+ operands:
+ value: WordSized
+ power: WordSized
+ num_temps: 2
+ mir_op: Pow
+
+# Double raised to a double power.
+- name: PowD
+ result_type: WordSized
+ operands:
+ value: WordSized
+ power: WordSized
+ call_instruction: true
+
+# Constant of a power of two raised to an integer power.
+- name: PowOfTwoI
+ result_type: WordSized
+ operands:
+ power: WordSized
+ arguments:
+ base: uint32_t
+
+# Sign value of an integer.
+- name: SignI
+ result_type: WordSized
+ operands:
+ num: WordSized
+
+# Sign value of an integer.
+- name: SignD
+ result_type: WordSized
+ operands:
+ num: WordSized
+
+# Sign value of a double with expected int32 result.
+- name: SignDI
+ result_type: WordSized
+ operands:
+ input: WordSized
+ num_temps: 1
+
+- name: MathFunctionD
+ gen_boilerplate: false
+
+- name: MathFunctionF
+ gen_boilerplate: false
+
+- name: AddI
+ gen_boilerplate: false
+
+- name: AddI64
+ gen_boilerplate: false
+
+- name: SubI
+ gen_boilerplate: false
+
+- name: SubI64
+ gen_boilerplate: false
+
+- name: MulI64
+ gen_boilerplate: false
+
+- name: MathD
+ gen_boilerplate: false
+
+- name: MathF
+ gen_boilerplate: false
+
+- name: ModD
+ gen_boilerplate: false
+
+- name: ModPowTwoD
+ gen_boilerplate: false
+
+- name: WasmBuiltinModD
+ result_type: WordSized
+ operands:
+ lhs: WordSized
+ rhs: WordSized
+ instance: WordSized
+ call_instruction: true
+ mir_op: true
+
+- name: BigIntAdd
+ gen_boilerplate: false
+
+- name: BigIntSub
+ gen_boilerplate: false
+
+- name: BigIntMul
+ gen_boilerplate: false
+
+- name: BigIntDiv
+ gen_boilerplate: false
+
+- name: BigIntMod
+ gen_boilerplate: false
+
+- name: BigIntPow
+ gen_boilerplate: false
+
+- name: BigIntBitAnd
+ gen_boilerplate: false
+
+- name: BigIntBitOr
+ gen_boilerplate: false
+
+- name: BigIntBitXor
+ gen_boilerplate: false
+
+- name: BigIntLsh
+ gen_boilerplate: false
+
+- name: BigIntRsh
+ gen_boilerplate: false
+
+- name: BigIntIncrement
+ gen_boilerplate: false
+
+- name: BigIntDecrement
+ gen_boilerplate: false
+
+- name: BigIntNegate
+ gen_boilerplate: false
+
+- name: BigIntBitNot
+ gen_boilerplate: false
+
+- name: Int32ToStringWithBase
+ result_type: WordSized
+ operands:
+ input: WordSized
+ base: WordSized
+ num_temps: 2
+ mir_op: true
+
+- name: NumberParseInt
+ result_type: BoxedValue
+ operands:
+ string: WordSized
+ radix: WordSized
+ num_temps: 1
+ call_instruction: true
+ mir_op: true
+
+- name: DoubleParseInt
+ result_type: WordSized
+ operands:
+ number: WordSized
+ num_temps: 1
+ mir_op: true
+
+# Adds two string, returning a string.
+- name: Concat
+ result_type: WordSized
+ operands:
+ lhs: WordSized
+ rhs: WordSized
+ num_temps: 5
+
+# Linearize a string before a character access.
+- name: LinearizeForCharAccess
+ result_type: WordSized
+ operands:
+ str: WordSized
+ index: 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 NaN on out-of-bounds.
+- name: CharCodeAtMaybeOutOfBounds
+ result_type: BoxedValue
+ operands:
+ str: WordSized
+ index: WordSized
+ num_temps: 2
+
+# Get uint16 character code from a string and convert it to a string. Return
+# the empty string on out-of-bounds.
+- name: CharAtMaybeOutOfBounds
+ result_type: WordSized
+ operands:
+ str: WordSized
+ index: WordSized
+ num_temps: 2
+
+# Convert uint16 character code to a string.
+- name: FromCharCode
+ result_type: WordSized
+ operands:
+ code: WordSized
+
+# Convert uint32 code point to a string.
+- name: FromCodePoint
+ result_type: WordSized
+ operands:
+ codePoint: WordSized
+ num_temps: 2
+
+# Search for the first index of the search string.
+- name: StringIndexOf
+ 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 ToUpperCase case conversion function.
+- name: StringToUpperCase
+ result_type: WordSized
+ operands:
+ string: WordSized
+ call_instruction: true
+ mir_op: StringConvertCase
+
+- 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: StringSplit
+
+- name: Int32ToDouble
+ result_type: WordSized
+ operands:
+ input: WordSized
+
+- name: Float32ToDouble
+ result_type: WordSized
+ operands:
+ input: WordSized
+
+- name: DoubleToFloat32
+ result_type: WordSized
+ operands:
+ input: WordSized
+
+- name: Int32ToFloat32
+ result_type: WordSized
+ operands:
+ input: WordSized
+
+# Convert a value to a double.
+- name: ValueToDouble
+ result_type: WordSized
+ operands:
+ input: BoxedValue
+ mir_op: ToDouble
+
+# Convert a value to a float32.
+- name: ValueToFloat32
+ result_type: WordSized
+ operands:
+ input: BoxedValue
+ mir_op: ToFloat32
+
+- name: ValueToInt32
+ gen_boilerplate: false
+
+# Convert a value to a BigInt.
+- name: ValueToBigInt
+ result_type: WordSized
+ operands:
+ input: BoxedValue
+ mir_op: ToBigInt
+
+# Convert a double to an int32.
+# Input: floating-point Register
+# Output: 32-bit integer
+# Bailout: if the double cannot be converted to an integer.
+- name: DoubleToInt32
+ result_type: WordSized
+ operands:
+ in: WordSized
+ mir_op: ToNumberInt32
+
+# Convert a float32 to an int32.
+# Input: floating-point Register
+# Output: 32-bit integer
+# Bailout: if the float32 cannot be converted to an integer.
+- name: Float32ToInt32
+ result_type: WordSized
+ operands:
+ in: WordSized
+ mir_op: ToNumberInt32
+
+# Convert a double to a truncated int32.
+# Input: floating-point Register
+# Output: 32-bit integer
+- name: TruncateDToInt32
+ result_type: WordSized
+ operands:
+ in: WordSized
+ num_temps: 1
+ mir_op: TruncateToInt32
+
+# Convert a double to a truncated int32 with instance offset because we need it
+# for the slow ool path.
+- name: WasmBuiltinTruncateDToInt32
+ result_type: WordSized
+ operands:
+ in: WordSized
+ instance: WordSized
+ num_temps: 1
+ mir_op: WasmBuiltinTruncateToInt32
+
+# Convert a float32 to a truncated int32.
+# Input: floating-point Register
+# Output: 32-bit integer
+- name: TruncateFToInt32
+ result_type: WordSized
+ operands:
+ in: WordSized
+ num_temps: 1
+ mir_op: TruncateToInt32
+
+# Convert a float32 to a truncated int32 with instance offset because we need
+# it for the slow ool path.
+- name: WasmBuiltinTruncateFToInt32
+ result_type: WordSized
+ operands:
+ in: WordSized
+ instance: WordSized
+ num_temps: 1
+ mir_op: WasmBuiltinTruncateToInt32
+
+- name: WasmTruncateToInt32
+ result_type: WordSized
+ operands:
+ input: WordSized
+ mir_op: true
+
+- name: WrapInt64ToInt32
+ result_type: WordSized
+ operands:
+ input: Int64
+ mir_op: true
+
+- name: ExtendInt32ToInt64
+ result_type: Int64
+ operands:
+ input: WordSized
+ mir_op: true
+
+# Convert a boolean value to a string.
+- name: BooleanToString
+ result_type: WordSized
+ operands:
+ input: WordSized
+ mir_op: ToString
+
+# Convert an integer hosted on one definition to a string with a function call.
+- name: IntToString
+ result_type: WordSized
+ operands:
+ input: WordSized
+ mir_op: ToString
+
+# Convert a double hosted on one definition to a string with a function call.
+- name: DoubleToString
+ result_type: WordSized
+ operands:
+ input: WordSized
+ num_temps: 1
+ mir_op: ToString
+
+# Convert a primitive to a string with a function call.
+- name: ValueToString
+ result_type: WordSized
+ operands:
+ input: BoxedValue
+ num_temps: 1
+ mir_op: ToString
+
+- name: PowHalfD
+ gen_boilerplate: false
+
+- name: NaNToZero
+ result_type: WordSized
+ operands:
+ input: WordSized
+ num_temps: 1
+ mir_op: true
+
+- name: OsrEntry
+ gen_boilerplate: false
+
+# Materialize a Value stored in an interpreter frame for OSR.
+- name: OsrValue
+ result_type: BoxedValue
+ operands:
+ entry: WordSized
+ mir_op: true
+
+# Materialize a JSObject env chain stored in an interpreter frame for OSR.
+- name: OsrEnvironmentChain
+ result_type: WordSized
+ operands:
+ entry: WordSized
+ mir_op: true
+
+# Materialize a JSObject env chain stored in an interpreter frame for OSR.
+- name: OsrReturnValue
+ result_type: BoxedValue
+ operands:
+ entry: WordSized
+ mir_op: true
+
+- name: OsrArgumentsObject
+ result_type: WordSized
+ operands:
+ entry: WordSized
+ mir_op: true
+
+- name: RegExp
+ result_type: WordSized
+ num_temps: 1
+ mir_op: true
+
+- name: RegExpMatcher
+ result_type: BoxedValue
+ operands:
+ regexp: WordSized
+ string: WordSized
+ lastIndex: WordSized
+ call_instruction: true
+ mir_op: true
+
+- name: RegExpSearcher
+ result_type: WordSized
+ operands:
+ regexp: WordSized
+ string: WordSized
+ lastIndex: WordSized
+ call_instruction: true
+ mir_op: true
+
+- name: 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: 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
+
+- name: GuardHasAttachedArrayBuffer
+ operands:
+ object: WordSized
+ num_temps: 1
+
+# Double to IntPtr, eligible for accessing into a TypedArray or DataView. If
+# the index isn't exactly representable as an IntPtr, depending on the
+# supportOOB flag on the MIR instruction, either bail out or produce an IntPtr
+# which is equivalent to an OOB access.
+- name: GuardNumberToIntPtrIndex
+ result_type: WordSized
+ operands:
+ object: WordSized
+ mir_op: true
+
+# Bailout if index >= length.
+- name: BoundsCheck
+ operands:
+ index: WordSized
+ length: WordSized
+ mir_op: true
+
+- name: BoundsCheckRange
+ gen_boilerplate: false
+
+# Bailout if index < minimum.
+- name: BoundsCheckLower
+ operands:
+ index: WordSized
+ mir_op: true
+
+- name: SpectreMaskIndex
+ result_type: WordSized
+ operands:
+ index: WordSized
+ length: WordSized
+ mir_op: true
+
+- name: LoadElementV
+ gen_boilerplate: false
+
+- name: InArray
+ result_type: WordSized
+ operands:
+ elements: WordSized
+ index: WordSized
+ initLength: WordSized
+ mir_op: true
+
+- name: GuardElementNotHole
+ operands:
+ elements: WordSized
+ index: WordSized
+
+- name: LoadElementHole
+ gen_boilerplate: false
+
+- name: StoreElementV
+ gen_boilerplate: false
+
+- name: StoreElementT
+ gen_boilerplate: false
+
+- name: StoreHoleValueElement
+ operands:
+ elements: WordSized
+ index: WordSized
+
+# Like LStoreElementV, but supports indexes >= initialized length.
+- name: StoreElementHoleV
+ operands:
+ object: WordSized
+ elements: WordSized
+ index: WordSized
+ value: BoxedValue
+ num_temps: 1
+ mir_op: StoreElementHole
+
+# Like LStoreElementT, but supports indexes >= initialized length.
+- name: StoreElementHoleT
+ operands:
+ object: WordSized
+ elements: WordSized
+ index: WordSized
+ value: WordSized
+ num_temps: 1
+ mir_op: StoreElementHole
+
+- name: ArrayPopShift
+ gen_boilerplate: false
+
+- name: ArrayPush
+ result_type: WordSized
+ operands:
+ object: WordSized
+ value: BoxedValue
+ num_temps: 2
+ mir_op: true
+
+- name: ArraySlice
+ result_type: WordSized
+ operands:
+ object: WordSized
+ begin: WordSized
+ end: WordSized
+ num_temps: 2
+ call_instruction: true
+ mir_op: true
+
+- name: ArgumentsSlice
+ result_type: WordSized
+ operands:
+ object: WordSized
+ begin: WordSized
+ end: WordSized
+ num_temps: 2
+ call_instruction: true
+ mir_op: true
+
+- name: FrameArgumentsSlice
+ result_type: WordSized
+ operands:
+ begin: WordSized
+ count: WordSized
+ num_temps: 1
+ mir_op: true
+
+- name: InlineArgumentsSlice
+ gen_boilerplate: false
+
+- name: NormalizeSliceTerm
+ result_type: WordSized
+ operands:
+ value: WordSized
+ length: WordSized
+ mir_op: true
+
+- name: ArrayJoin
+ result_type: WordSized
+ operands:
+ array: WordSized
+ separator: WordSized
+ num_temps: 1
+ call_instruction: true
+ mir_op: true
+
+- name: LoadUnboxedScalar
+ result_type: WordSized
+ operands:
+ elements: WordSized
+ index: WordSized
+ num_temps: 1
+ mir_op: true
+
+- name: LoadUnboxedBigInt
+ gen_boilerplate: false
+
+- name: LoadDataViewElement
+ gen_boilerplate: false
+
+- name: LoadTypedArrayElementHole
+ result_type: BoxedValue
+ operands:
+ object: WordSized
+ index: WordSized
+ num_temps: 1
+ mir_op: true
+
+- name: LoadTypedArrayElementHoleBigInt
+ gen_boilerplate: false
+
+- name: StoreUnboxedScalar
+ operands:
+ elements: WordSized
+ index: WordSized
+ value: WordSized
+ mir_op: true
+
+- name: StoreUnboxedBigInt
+ gen_boilerplate: false
+
+- name: StoreDataViewElement
+ gen_boilerplate: false
+
+- name: StoreTypedArrayElementHole
+ operands:
+ elements: WordSized
+ length: WordSized
+ index: WordSized
+ value: WordSized
+ num_temps: 1
+ mir_op: true
+
+- name: StoreTypedArrayElementHoleBigInt
+ gen_boilerplate: false
+
+- name: AtomicIsLockFree
+ result_type: WordSized
+ operands:
+ value: WordSized
+
+- name: CompareExchangeTypedArrayElement
+ gen_boilerplate: false
+
+- name: AtomicExchangeTypedArrayElement
+ gen_boilerplate: false
+
+- name: AtomicTypedArrayElementBinop
+ gen_boilerplate: false
+
+- name: AtomicTypedArrayElementBinopForEffect
+ gen_boilerplate: false
+
+- name: AtomicLoad64
+ gen_boilerplate: false
+
+- name: AtomicStore64
+ gen_boilerplate: false
+
+- name: CompareExchangeTypedArrayElement64
+ gen_boilerplate: false
+
+- name: AtomicExchangeTypedArrayElement64
+ gen_boilerplate: false
+
+- name: AtomicTypedArrayElementBinop64
+ gen_boilerplate: false
+
+- name: AtomicTypedArrayElementBinopForEffect64
+ gen_boilerplate: false
+
+- name: EffectiveAddress
+ result_type: WordSized
+ operands:
+ base: WordSized
+ index: WordSized
+ mir_op: true
+
+- name: ClampIToUint8
+ result_type: WordSized
+ operands:
+ input: WordSized
+
+- name: ClampDToUint8
+ result_type: WordSized
+ operands:
+ in: WordSized
+ num_temps: 1
+
+- name: ClampVToUint8
+ result_type: WordSized
+ operands:
+ input: BoxedValue
+ num_temps: 1
+ mir_op: ClampToUint8
+
+# Load a boxed value from an object's fixed slot.
+- name: LoadFixedSlotV
+ result_type: BoxedValue
+ operands:
+ object: WordSized
+ 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: AddAndStoreSlot
+ operands:
+ object: WordSized
+ value: BoxedValue
+ num_temps: 1
+ mir_op: true
+
+- name: AllocateAndStoreSlot
+ operands:
+ object: WordSized
+ value: BoxedValue
+ num_temps: 2
+ call_instruction: true
+ mir_op: true
+
+- name: AddSlotAndCallAddPropHook
+ operands:
+ object: WordSized
+ value: BoxedValue
+ call_instruction: true
+ mir_op: true
+
+# Store a boxed value to an object's fixed slot.
+- name: StoreFixedSlotV
+ operands:
+ obj: WordSized
+ value: BoxedValue
+ mir_op: StoreFixedSlot
+
+# Store a typed value to an object's fixed slot.
+- name: StoreFixedSlotT
+ operands:
+ obj: WordSized
+ value: WordSized
+ mir_op: StoreFixedSlot
+
+# Note, Name ICs always return a Value. There are no V/T variants.
+- name: GetNameCache
+ result_type: BoxedValue
+ operands:
+ envObj: WordSized
+ num_temps: 1
+ mir_op: true
+
+- name: CallGetIntrinsicValue
+ result_type: BoxedValue
+ call_instruction: true
+ mir_op: true
+
+- name: GetPropSuperCache
+ result_type: BoxedValue
+ operands:
+ obj: WordSized
+ receiver: BoxedValue
+ id: BoxedValue
+ mir_op: true
+
+# Patchable jump to stubs generated for a GetProperty cache, which loads a
+# boxed value.
+- name: GetPropertyCache
+ result_type: BoxedValue
+ operands:
+ value: BoxedValue
+ id: BoxedValue
+ mir_op: true
+
+- name: BindNameCache
+ result_type: WordSized
+ operands:
+ environmentChain: WordSized
+ num_temps: 1
+ mir_op: true
+
+- name: CallBindVar
+ result_type: WordSized
+ operands:
+ environmentChain: WordSized
+ mir_op: true
+
+# Load a value from an object's dslots or a slots vector.
+- name: LoadDynamicSlotV
+ result_type: BoxedValue
+ operands:
+ in: WordSized
+ mir_op: LoadDynamicSlot
+
+# Store a value to an object's dslots or a slots vector.
+- name: StoreDynamicSlotV
+ operands:
+ slots: WordSized
+ value: BoxedValue
+ mir_op: StoreDynamicSlot
+
+# Store a typed value to an object's dslots or a slots vector. This has a
+# few advantages over LStoreDynamicSlotV:
+# 1) We can bypass storing the type tag if the slot has the same type as
+# the value.
+# 2) Better Register allocation: we can store constants and FP regs directly
+# without requiring a second Register for the value.
+- name: StoreDynamicSlotT
+ operands:
+ slots: WordSized
+ value: WordSized
+ mir_op: StoreDynamicSlot
+
+# Read length field of a JSString*.
+- name: StringLength
+ result_type: WordSized
+ operands:
+ string: WordSized
+
+# Take the floor of a double precision number and converts it to an int32.
+# Implements Math.floor().
+- name: Floor
+ result_type: WordSized
+ operands:
+ num: WordSized
+
+# Take the floor of a single precision number and converts it to an int32.
+# Implements Math.floor().
+- name: FloorF
+ result_type: WordSized
+ operands:
+ num: WordSized
+
+# Take the ceiling of a double precision number and converts it to an int32.
+# Implements Math.ceil().
+- name: Ceil
+ result_type: WordSized
+ operands:
+ num: WordSized
+
+# Take the ceiling of a single precision number and converts it to an int32.
+# Implements Math.ceil().
+- name: CeilF
+ result_type: WordSized
+ operands:
+ string: WordSized
+
+# Round a double precision number and converts it to an int32.
+# Implements Math.round().
+- name: Round
+ result_type: WordSized
+ operands:
+ num: WordSized
+ num_temps: 1
+ mir_op: true
+
+# Round a single precision number and converts it to an int32.
+# Implements Math.round().
+- name: RoundF
+ result_type: WordSized
+ operands:
+ num: WordSized
+ num_temps: 1
+ mir_op: Round
+
+# Truncates a double precision number and converts it to an int32.
+# Implements Math.trunc().
+- name: Trunc
+ result_type: WordSized
+ operands:
+ num: WordSized
+
+# Truncates a single precision number and converts it to an int32.
+# Implements Math.trunc().
+- name: TruncF
+ result_type: WordSized
+ operands:
+ num: WordSized
+
+# Rounds a double precision number accordingly to mir()->roundingMode(),
+# and keeps a double output.
+- name: NearbyInt
+ result_type: WordSized
+ operands:
+ num: WordSized
+ mir_op: true
+
+# Rounds a single precision number accordingly to mir()->roundingMode(),
+# and keeps a single output.
+- name: NearbyIntF
+ result_type: WordSized
+ operands:
+ num: WordSized
+ mir_op: NearbyInt
+
+# Load a function's call environment.
+- name: FunctionEnvironment
+ result_type: WordSized
+ operands:
+ function: WordSized
+
+- name: HomeObject
+ result_type: WordSized
+ operands:
+ function: WordSized
+
+- name: HomeObjectSuperBase
+ result_type: BoxedValue
+ operands:
+ homeObject: WordSized
+
+- name: NewLexicalEnvironmentObject
+ result_type: WordSized
+ num_temps: 1
+ mir_op: true
+
+- name: NewClassBodyEnvironmentObject
+ result_type: WordSized
+ num_temps: 1
+ mir_op: true
+
+- name: NewVarEnvironmentObject
+ result_type: WordSized
+ num_temps: 1
+ mir_op: true
+
+- name: MegamorphicSetElement
+ operands:
+ object: WordSized
+ index: BoxedValue
+ value: BoxedValue
+ # On x86 we do not have enough registers to use 3 temps for this *and* take
+ # five words worth of operands. Since it's 32-bit, though, we get two
+ # registers from pushing `value`, which doesn't get used until the end
+ # anyway. This is somewhat klunky, but oh well.
+#ifdef JS_CODEGEN_X86
+ num_temps: 1
+#else
+ num_temps: 3
+#endif
+ call_instruction: true
+ mir_op: true
+
+- name: CallDeleteProperty
+ result_type: WordSized
+ operands:
+ value: BoxedValue
+ call_instruction: true
+ mir_op: DeleteProperty
+
+- name: CallDeleteElement
+ result_type: WordSized
+ operands:
+ value: BoxedValue
+ index: BoxedValue
+ call_instruction: true
+ mir_op: DeleteElement
+
+- name: ObjectToIterator
+ result_type: WordSized
+ operands:
+ object: WordSized
+ num_temps: 3
+ mir_op: true
+
+- name: ValueToIterator
+ result_type: WordSized
+ operands:
+ value: BoxedValue
+ call_instruction: true
+ mir_op: ValueToIterator
+
+- name: IteratorHasIndicesAndBranch
+ gen_boilerplate: false
+
+- name: LoadSlotByIteratorIndex
+ result_type: BoxedValue
+ operands:
+ object: WordSized
+ iterator: WordSized
+
+ num_temps: 2
+
+- name: StoreSlotByIteratorIndex
+ operands:
+ object: WordSized
+ iterator: WordSized
+ value: BoxedValue
+ num_temps: 2
+ mir_op: true
+
+# Patchable jump to stubs generated for a SetProperty cache.
+- name: SetPropertyCache
+ operands:
+ object: WordSized
+ id: BoxedValue
+ value: BoxedValue
+ # Takes an additional temp: this is intendend to be FloatReg0 to allow the
+ # actual cache code to safely clobber that value without save and restore.
+ num_temps: 2
+ mir_op: true
+
+- name: GetIteratorCache
+ result_type: WordSized
+ operands:
+ value: BoxedValue
+ num_temps: 2
+ mir_op: true
+
+- name: OptimizeSpreadCallCache
+ result_type: BoxedValue
+ operands:
+ value: BoxedValue
+ num_temps: 1
+ mir_op: true
+
+- name: IteratorMore
+ result_type: BoxedValue
+ operands:
+ iterator: WordSized
+ num_temps: 1
+ mir_op: true
+
+- name: IsNoIterAndBranch
+ gen_boilerplate: false
+
+- name: IteratorEnd
+ operands:
+ object: WordSized
+ num_temps: 3
+ mir_op: true
+
+- name: CloseIterCache
+ operands:
+ iter: WordSized
+ num_temps: 1
+ mir_op: true
+
+# Read the number of actual arguments.
+- name: ArgumentsLength
+ result_type: WordSized
+
+# Load a value from the actual arguments.
+- name: GetFrameArgument
+ result_type: BoxedValue
+ operands:
+ index: WordSized
+
+# Load a value from the actual arguments.
+# Returns undefined if |index| is larger-or-equals to |length|. Bails out if
+# |index| is negative.
+- name: GetFrameArgumentHole
+ result_type: BoxedValue
+ operands:
+ index: WordSized
+ length: WordSized
+ num_temps: 1
+
+# Create the rest parameter.
+- name: Rest
+ result_type: WordSized
+ operands:
+ numActuals: WordSized
+ num_temps: 3
+ call_instruction: true
+ mir_op: true
+
+- name: Int32ToIntPtr
+ result_type: WordSized
+ operands:
+ input: WordSized
+ mir_op: true
+
+- name: NonNegativeIntPtrToInt32
+ result_type: WordSized
+ operands:
+ input: WordSized
+
+- name: IntPtrToDouble
+ result_type: WordSized
+ operands:
+ input: WordSized
+
+- name: AdjustDataViewLength
+ result_type: WordSized
+ operands:
+ input: WordSized
+ mir_op: true
+
+# Convert a Boolean to an Int64, following ToBigInt.
+- name: BooleanToInt64
+ result_type: Int64
+ operands:
+ input: WordSized
+ mir_op: ToInt64
+
+# Convert a String to an Int64, following ToBigInt.
+- name: StringToInt64
+ result_type: Int64
+ operands:
+ input: WordSized
+ mir_op: ToInt64
+
+# Simulate ToBigInt on a Value and produce a matching Int64.
+- name: ValueToInt64
+ result_type: Int64
+ operands:
+ input: BoxedValue
+ num_temps: 1
+ mir_op: ToInt64
+
+# Truncate a BigInt to an unboxed int64.
+- name: TruncateBigIntToInt64
+ result_type: Int64
+ operands:
+ input: WordSized
+ mir_op: true
+
+# Create a new BigInt* from an unboxed int64.
+- name: Int64ToBigInt
+ result_type: WordSized
+ operands:
+ input: Int64
+ num_temps: 1
+ mir_op: true
+
+# Generational write barrier used when writing an object to another object.
+- name: PostWriteBarrierO
+ operands:
+ object: WordSized
+ value: WordSized
+ num_temps: 1
+ mir_op: PostWriteBarrier
+
+# Generational write barrier used when writing a string to an object.
+- name: PostWriteBarrierS
+ operands:
+ object: WordSized
+ value: WordSized
+ num_temps: 1
+ mir_op: PostWriteBarrier
+
+# Generational write barrier used when writing a BigInt to an object.
+- name: PostWriteBarrierBI
+ operands:
+ object: WordSized
+ value: WordSized
+ num_temps: 1
+ mir_op: PostWriteBarrier
+
+# Generational write barrier used when writing a value to another object.
+- name: PostWriteBarrierV
+ operands:
+ object: WordSized
+ value: BoxedValue
+ num_temps: 1
+ mir_op: PostWriteBarrier
+
+# Generational write barrier used when writing an object to another object's
+# elements.
+- name: PostWriteElementBarrierO
+ operands:
+ object: WordSized
+ value: WordSized
+ index: WordSized
+ num_temps: 1
+ mir_op: PostWriteElementBarrier
+
+# Generational write barrier used when writing a string to an object's
+# elements.
+- name: PostWriteElementBarrierS
+ operands:
+ object: WordSized
+ value: WordSized
+ index: WordSized
+ num_temps: 1
+ mir_op: PostWriteElementBarrier
+
+# Generational write barrier used when writing a BigInt to an object's
+# elements.
+- name: PostWriteElementBarrierBI
+ operands:
+ object: WordSized
+ value: WordSized
+ index: WordSized
+ num_temps: 1
+ mir_op: PostWriteElementBarrier
+
+# Generational write barrier used when writing a value to another object's
+# elements.
+- name: PostWriteElementBarrierV
+ operands:
+ object: WordSized
+ index: WordSized
+ value: BoxedValue
+ num_temps: 1
+ mir_op: PostWriteElementBarrier
+
+# Assert in debug mode that a post write barrier can be elided.
+- name: AssertCanElidePostWriteBarrier
+ operands:
+ object: WordSized
+ value: BoxedValue
+ num_temps: 1
+
+# Guard against an object's identity.
+- name: GuardObjectIdentity
+ operands:
+ input: WordSized
+ expected: WordSized
+ mir_op: true
+
+# Guard against an function's identity.
+- name: GuardSpecificFunction
+ operands:
+ input: WordSized
+ expected: WordSized
+
+- name: GuardSpecificAtom
+ operands:
+ str: WordSized
+ num_temps: 1
+ mir_op: true
+
+- name: GuardSpecificSymbol
+ operands:
+ symbol: WordSized
+ mir_op: true
+
+- name: GuardSpecificInt32
+ operands:
+ num: WordSized
+ mir_op: true
+
+- name: GuardStringToIndex
+ result_type: WordSized
+ operands:
+ string: WordSized
+
+- name: GuardStringToInt32
+ result_type: WordSized
+ operands:
+ string: WordSized
+ num_temps: 1
+
+- name: GuardStringToDouble
+ result_type: WordSized
+ operands:
+ string: WordSized
+ num_temps: 2
+
+- name: GuardShape
+ result_type: WordSized
+ operands:
+ in: WordSized
+ num_temps: 1
+ mir_op: true
+
+- name: GuardMultipleShapes
+ result_type: WordSized
+ operands:
+ object: WordSized
+ shapeList: WordSized
+ num_temps: 4
+ mir_op: true
+
+- name: GuardProto
+ operands:
+ object: WordSized
+ expected: WordSized
+ num_temps: 1
+
+- name: GuardNullProto
+ operands:
+ object: WordSized
+ num_temps: 1
+
+- name: GuardIsNativeObject
+ operands:
+ object: WordSized
+ num_temps: 1
+
+- name: GuardGlobalGeneration
+ mir_op: true
+ num_temps: 1
+
+- name: GuardIsProxy
+ operands:
+ object: WordSized
+ num_temps: 1
+
+- name: GuardIsNotProxy
+ operands:
+ object: WordSized
+ num_temps: 1
+
+- name: GuardIsNotDOMProxy
+ operands:
+ proxy: WordSized
+ num_temps: 1
+
+- name: ProxyGet
+ result_type: BoxedValue
+ operands:
+ proxy: WordSized
+ num_temps: 1
+ call_instruction: true
+ mir_op: true
+
+- name: ProxyGetByValue
+ result_type: BoxedValue
+ operands:
+ proxy: WordSized
+ id: BoxedValue
+ call_instruction: true
+
+- name: ProxyHasProp
+ result_type: BoxedValue
+ operands:
+ proxy: WordSized
+ id: BoxedValue
+ call_instruction: true
+ mir_op: true
+
+- name: ProxySet
+ operands:
+ proxy: WordSized
+ rhs: BoxedValue
+ num_temps: 1
+ call_instruction: true
+ mir_op: true
+
+- name: ProxySetByValue
+ operands:
+ proxy: WordSized
+ id: BoxedValue
+ rhs: BoxedValue
+ call_instruction: true
+ mir_op: true
+
+- name: CallSetArrayLength
+ operands:
+ obj: WordSized
+ rhs: BoxedValue
+ call_instruction: true
+ mir_op: true
+
+- name: MegamorphicLoadSlot
+ result_type: BoxedValue
+ operands:
+ object: WordSized
+ num_temps: 4
+ call_instruction: true
+ mir_op: true
+
+- name: MegamorphicLoadSlotByValue
+ result_type: BoxedValue
+ operands:
+ object: WordSized
+ id: BoxedValue
+ num_temps: 3
+ call_instruction: true
+ mir_op: true
+
+- name: MegamorphicStoreSlot
+ operands:
+ object: WordSized
+ rhs: BoxedValue
+#ifdef JS_CODEGEN_X86
+ num_temps: 1
+#else
+ num_temps: 3
+#endif
+ call_instruction: true
+ mir_op: true
+
+- name: MegamorphicHasProp
+ result_type: WordSized
+ operands:
+ object: WordSized
+ id: BoxedValue
+ num_temps: 3
+ call_instruction: true
+ mir_op: true
+
+- name: GuardIsNotArrayBufferMaybeShared
+ operands:
+ object: WordSized
+ num_temps: 1
+
+- name: GuardIsTypedArray
+ operands:
+ object: WordSized
+ num_temps: 1
+
+- name: GuardNoDenseElements
+ operands:
+ in: WordSized
+ num_temps: 1
+
+- name: InCache
+ result_type: WordSized
+ operands:
+ lhs: BoxedValue
+ rhs: WordSized
+ num_temps: 1
+ mir_op: true
+
+- name: HasOwnCache
+ result_type: WordSized
+ operands:
+ value: BoxedValue
+ id: BoxedValue
+ mir_op: true
+
+- name: CheckPrivateFieldCache
+ result_type: WordSized
+ operands:
+ value: BoxedValue
+ id: BoxedValue
+ mir_op: true
+
+- name: NewPrivateName
+ result_type: WordSized
+ call_instruction: true
+ mir_op: true
+
+- name: InstanceOfO
+ result_type: WordSized
+ operands:
+ lhs: WordSized
+ rhs: WordSized
+ mir_op: InstanceOf
+
+- name: InstanceOfV
+ result_type: WordSized
+ operands:
+ lhs: BoxedValue
+ rhs: WordSized
+ mir_op: InstanceOf
+
+- name: InstanceOfCache
+ gen_boilerplate: false
+
+- name: IsCallableO
+ result_type: WordSized
+ operands:
+ object: WordSized
+ mir_op: IsCallable
+
+- name: IsCallableV
+ result_type: WordSized
+ operands:
+ object: BoxedValue
+ num_temps: 1
+ mir_op: IsCallable
+
+- name: IsConstructor
+ result_type: WordSized
+ operands:
+ object: WordSized
+ mir_op: true
+
+- name: IsCrossRealmArrayConstructor
+ result_type: WordSized
+ operands:
+ object: WordSized
+
+- name: IsArrayO
+ result_type: WordSized
+ operands:
+ object: WordSized
+ mir_op: IsArray
+
+- name: IsArrayV
+ result_type: WordSized
+ operands:
+ value: BoxedValue
+ num_temps: 1
+ mir_op: IsArray
+
+- name: IsTypedArray
+ result_type: WordSized
+ operands:
+ object: WordSized
+ mir_op: true
+
+- name: IsObject
+ result_type: WordSized
+ operands:
+ object: BoxedValue
+ mir_op: true
+
+- name: IsObjectAndBranch
+ gen_boilerplate: false
+
+- name: IsNullOrUndefined
+ result_type: WordSized
+ operands:
+ input: BoxedValue
+ mir_op: true
+
+- name: IsNullOrUndefinedAndBranch
+ gen_boilerplate: false
+
+- name: HasClass
+ result_type: WordSized
+ operands:
+ lhs: WordSized
+ mir_op: true
+
+- name: GuardToClass
+ result_type: WordSized
+ operands:
+ lhs: WordSized
+ num_temps: 1
+ mir_op: true
+
+- name: GuardToFunction
+ result_type: WordSized
+ operands:
+ lhs: WordSized
+ num_temps: 1
+ mir_op: true
+
+- name: ObjectClassToString
+ result_type: WordSized
+ operands:
+ lhs: WordSized
+ num_temps: 1
+ call_instruction: true
+ mir_op: true
+
+- name: WasmSelect
+ gen_boilerplate: false
+
+- name: WasmSelectI64
+ gen_boilerplate: false
+
+- name: WasmCompareAndSelect
+ gen_boilerplate: false
+
+- name: WasmAddOffset
+ result_type: WordSized
+ operands:
+ base: WordSized
+ mir_op: true
+
+- name: WasmAddOffset64
+ result_type: Int64
+ operands:
+ base: Int64
+ mir_op: WasmAddOffset
+
+- name: WasmBoundsCheck
+ result_type: WordSized
+ operands:
+ ptr: WordSized
+ boundsCheckLimit: WordSized
+ mir_op: true
+
+- name: WasmBoundsCheck64
+ gen_boilerplate: false
+
+- name: WasmExtendU32Index
+ result_type: WordSized
+ operands:
+ input: WordSized
+ mir_op: true
+
+- name: WasmWrapU32Index
+ result_type: WordSized
+ operands:
+ input: WordSized
+ mir_op: true
+
+- name: WasmAlignmentCheck
+ operands:
+ ptr: WordSized
+ mir_op: true
+
+- name: WasmAlignmentCheck64
+ operands:
+ ptr: Int64
+ mir_op: WasmAlignmentCheck
+
+- name: WasmLoadInstance
+ result_type: WordSized
+ operands:
+ instance: WordSized
+ mir_op: true
+
+- name: WasmLoadInstance64
+ result_type: Int64
+ operands:
+ instance: WordSized
+ mir_op: WasmLoadInstance
+
+- name: WasmHeapBase
+ result_type: WordSized
+ operands:
+ instance: WordSized
+ mir_op: true
+
+- name: WasmLoad
+ gen_boilerplate: false
+
+- name: WasmLoadI64
+ gen_boilerplate: false
+
+- name: WasmStore
+ gen_boilerplate: false
+
+- name: WasmStoreI64
+ gen_boilerplate: false
+
+- name: AsmJSLoadHeap
+ result_type: WordSized
+ operands:
+ ptr: WordSized
+ boundsCheckLimit: WordSized
+ memoryBase: WordSized
+ mir_op: true
+
+- name: AsmJSStoreHeap
+ result_type: WordSized
+ operands:
+ ptr: WordSized
+ value: WordSized
+ boundsCheckLimit: WordSized
+ memoryBase: WordSized
+ mir_op: true
+
+- name: WasmCompareExchangeHeap
+ gen_boilerplate: false
+
+- name: WasmFence
+
+- name: WasmAtomicExchangeHeap
+ gen_boilerplate: false
+
+- name: WasmAtomicBinopHeap
+ gen_boilerplate: false
+
+- name: WasmAtomicBinopHeapForEffect
+ gen_boilerplate: false
+
+- name: WasmLoadSlot
+ result_type: WordSized
+ operands:
+ containerRef: WordSized
+ arguments:
+ offset: size_t
+ type: MIRType
+ wideningOp: MWideningOp
+ maybeTrap: MaybeTrapSiteInfo
+
+- name: WasmLoadSlotI64
+ result_type: Int64
+ operands:
+ containerRef: WordSized
+ arguments:
+ offset: size_t
+ maybeTrap: MaybeTrapSiteInfo
+
+- name: WasmStoreSlot
+ operands:
+ value: WordSized
+ containerRef: WordSized
+ arguments:
+ offset: size_t
+ type: MIRType
+ narrowingOp: MNarrowingOp
+ maybeTrap: MaybeTrapSiteInfo
+
+- name: WasmStoreSlotI64
+ operands:
+ value: Int64
+ containerRef: WordSized
+ arguments:
+ offset: size_t
+ maybeTrap: MaybeTrapSiteInfo
+
+- name: WasmLoadTableElement
+ result_type: WordSized
+ operands:
+ elements: WordSized
+ index: WordSized
+
+- name: WasmDerivedPointer
+ gen_boilerplate: false
+
+- name: WasmDerivedIndexPointer
+ gen_boilerplate: false
+
+- name: WasmStoreRef
+ operands:
+ instance: WordSized
+ valueBase: WordSized
+ value: WordSized
+ arguments:
+ offset: uint32_t
+ maybeTrap: MaybeTrapSiteInfo
+ preBarrierKind: WasmPreBarrierKind
+ num_temps: 1
+ mir_op: true
+
+# Generational write barrier used when writing an object to another object.
+- name: WasmPostWriteBarrier
+ operands:
+ instance: WordSized
+ object: WordSized
+ valueBase: WordSized
+ value: WordSized
+ arguments:
+ valueOffset: uint32_t
+ num_temps: 1
+ mir_op: true
+
+- name: WasmParameter
+ result_type: WordSized
+
+- name: WasmParameterI64
+ gen_boilerplate: false
+
+- name: WasmReturn
+ operands:
+ rval: WordSized
+ instance: WordSized
+
+- name: WasmReturnI64
+ operands:
+ rval: Int64
+ instance: WordSized
+
+- name: WasmReturnVoid
+ operands:
+ rval: WordSized
+
+- name: WasmStackArg
+ operands:
+ arg: WordSized
+ mir_op: true
+
+- name: WasmStackArgI64
+ operands:
+ arg: Int64
+ mir_op: WasmStackArg
+
+- name: WasmNullConstant
+ result_type: WordSized
+
+- name: WasmCallIndirectAdjunctSafepoint
+ gen_boilerplate: false
+
+- name: WasmCall
+ gen_boilerplate: false
+
+- name: WasmCallLandingPrePad
+ mir_op: true
+
+- name: WasmRegisterResult
+ gen_boilerplate: false
+
+- name: WasmRegisterPairResult
+ gen_boilerplate: false
+
+- name: WasmStackResultArea
+ result_type: WordSized
+ num_temps: 1
+ mir_op: true
+
+- name: WasmStackResult
+ gen_boilerplate: false
+
+- name: WasmStackResult64
+ gen_boilerplate: false
+
+- name: AssertRangeI
+ gen_boilerplate: false
+
+- name: AssertRangeD
+ gen_boilerplate: false
+
+- name: AssertRangeF
+ gen_boilerplate: false
+
+- name: AssertRangeV
+ gen_boilerplate: false
+
+- name: AssertClass
+ operands:
+ input: WordSized
+ num_temps: 1
+ mir_op: true
+
+- name: AssertShape
+ operands:
+ input: WordSized
+ mir_op: true
+
+- name: GuardValue
+ operands:
+ input: BoxedValue
+ mir_op: true
+
+- name: GuardNullOrUndefined
+ operands:
+ input: BoxedValue
+ mir_op: true
+
+- name: GuardIsNotObject
+ operands:
+ input: BoxedValue
+ mir_op: true
+
+- name: GuardFunctionFlags
+ operands:
+ function: WordSized
+ mir_op: true
+
+- name: GuardFunctionIsNonBuiltinCtor
+ operands:
+ function: WordSized
+ num_temps: 1
+
+- name: GuardFunctionKind
+ operands:
+ function: WordSized
+ num_temps: 1
+ mir_op: true
+
+- name: GuardFunctionScript
+ operands:
+ function: WordSized
+ mir_op: true
+
+- name: IncrementWarmUpCounter
+ num_temps: 1
+ mir_op: true
+
+- name: LexicalCheck
+ operands:
+ input: BoxedValue
+ mir_op: true
+
+- name: ThrowRuntimeLexicalError
+ call_instruction: true
+ mir_op: true
+
+- name: ThrowMsg
+ call_instruction: true
+ mir_op: true
+
+- name: GlobalDeclInstantiation
+ mir_op: true
+
+- name: MemoryBarrier
+ gen_boilerplate: false
+
+- name: Debugger
+ num_temps: 1
+ call_instruction: true
+
+- name: NewTarget
+ result_type: BoxedValue
+
+- name: Random
+ gen_boilerplate: false
+
+- name: CheckReturn
+ result_type: BoxedValue
+ operands:
+ returnValue: BoxedValue
+ thisValue: BoxedValue
+
+- name: CheckIsObj
+ result_type: WordSized
+ operands:
+ value: BoxedValue
+ mir_op: true
+
+- name: CheckObjCoercible
+ operands:
+ value: BoxedValue
+
+- name: CheckClassHeritage
+ operands:
+ heritage: BoxedValue
+ num_temps: 2
+
+- name: CheckThis
+ operands:
+ value: BoxedValue
+
+- name: CheckThisReinit
+ operands:
+ thisValue: BoxedValue
+
+- name: Generator
+ result_type: WordSized
+ operands:
+ callee: WordSized
+ environmentChain: WordSized
+ argsObject: WordSized
+ call_instruction: true
+ mir_op: true
+
+- name: AsyncResolve
+ result_type: WordSized
+ operands:
+ generator: WordSized
+ valueOrReason: BoxedValue
+ call_instruction: true
+ mir_op: true
+
+- name: AsyncAwait
+ result_type: WordSized
+ operands:
+ value: BoxedValue
+ generator: WordSized
+ call_instruction: true
+ mir_op: true
+
+- name: CanSkipAwait
+ result_type: WordSized
+ operands:
+ value: BoxedValue
+ call_instruction: true
+ mir_op: true
+
+- name: MaybeExtractAwaitValue
+ result_type: BoxedValue
+ operands:
+ value: BoxedValue
+ canSkip: WordSized
+ call_instruction: true
+ mir_op: true
+
+- name: DebugCheckSelfHosted
+ operands:
+ value: BoxedValue
+ call_instruction: true
+
+- name: IsPackedArray
+ result_type: WordSized
+ operands:
+ object: WordSized
+ num_temps: 1
+
+- name: GuardArrayIsPacked
+ operands:
+ array: WordSized
+ num_temps: 2
+ mir_op: true
+
+- name: GetPrototypeOf
+ result_type: BoxedValue
+ operands:
+ target: WordSized
+
+- name: ObjectWithProto
+ result_type: WordSized
+ operands:
+ prototype: BoxedValue
+ call_instruction: true
+
+- name: ObjectStaticProto
+ result_type: WordSized
+ operands:
+ object: WordSized
+
+- name: BuiltinObject
+ result_type: WordSized
+ call_instruction: true
+ mir_op: true
+
+- name: SuperFunction
+ result_type: BoxedValue
+ operands:
+ callee: WordSized
+ num_temps: 1
+
+- name: InitHomeObject
+ result_type: WordSized
+ operands:
+ function: WordSized
+ homeObject: BoxedValue
+
+- name: IsTypedArrayConstructor
+ result_type: WordSized
+ operands:
+ object: WordSized
+
+- name: LoadValueTag
+ result_type: WordSized
+ operands:
+ value: BoxedValue
+
+- name: GuardTagNotEqual
+ operands:
+ lhs: WordSized
+ rhs: WordSized
+
+- name: LoadWrapperTarget
+ result_type: WordSized
+ operands:
+ object: WordSized
+
+- name: GuardHasGetterSetter
+ operands:
+ object: WordSized
+ num_temps: 3
+ call_instruction: true
+ mir_op: true
+
+- name: GuardIsExtensible
+ operands:
+ object: WordSized
+ num_temps: 1
+
+- name: GuardInt32IsNonNegative
+ operands:
+ index: WordSized
+
+- name: GuardInt32Range
+ operands:
+ input: WordSized
+ mir_op: true
+
+- name: GuardIndexIsNotDenseElement
+ operands:
+ object: WordSized
+ index: WordSized
+ num_temps: 2
+
+- name: GuardIndexIsValidUpdateOrAdd
+ operands:
+ object: WordSized
+ index: WordSized
+ num_temps: 2
+
+- name: CallAddOrUpdateSparseElement
+ operands:
+ object: WordSized
+ index: WordSized
+ value: BoxedValue
+ call_instruction: true
+ mir_op: true
+
+- name: CallGetSparseElement
+ result_type: BoxedValue
+ operands:
+ object: WordSized
+ index: WordSized
+ call_instruction: true
+
+- name: CallNativeGetElement
+ result_type: BoxedValue
+ operands:
+ object: WordSized
+ index: WordSized
+ call_instruction: true
+
+- name: CallNativeGetElementSuper
+ result_type: BoxedValue
+ operands:
+ object: WordSized
+ index: WordSized
+ receiver: BoxedValue
+ call_instruction: true
+
+- name: CallObjectHasSparseElement
+ result_type: WordSized
+ operands:
+ object: WordSized
+ index: WordSized
+ num_temps: 2
+ call_instruction: true
+
+- name: BigIntAsIntN
+ result_type: WordSized
+ operands:
+ bits: WordSized
+ input: WordSized
+ call_instruction: true
+
+- name: BigIntAsIntN64
+ gen_boilerplate: false
+
+- name: BigIntAsIntN32
+ gen_boilerplate: false
+
+- name: GuardNonGCThing
+ operands:
+ input: BoxedValue
+
+- name: ToHashableNonGCThing
+ result_type: BoxedValue
+ operands:
+ input: BoxedValue
+ num_temps: 1
+
+- name: ToHashableString
+ result_type: WordSized
+ operands:
+ input: WordSized
+
+- name: ToHashableValue
+ result_type: BoxedValue
+ operands:
+ input: BoxedValue
+ num_temps: 1
+
+- name: HashNonGCThing
+ result_type: WordSized
+ operands:
+ input: BoxedValue
+ num_temps: 1
+
+- name: HashString
+ result_type: WordSized
+ operands:
+ input: WordSized
+ num_temps: 1
+
+- name: HashSymbol
+ result_type: WordSized
+ operands:
+ input: WordSized
+
+- name: HashBigInt
+ result_type: WordSized
+ operands:
+ input: WordSized
+ num_temps: 3
+
+- name: HashObject
+ result_type: WordSized
+ operands:
+ setObject: WordSized
+ input: BoxedValue
+ num_temps: 4
+
+- name: HashValue
+ result_type: WordSized
+ operands:
+ setObject: WordSized
+ input: BoxedValue
+ num_temps: 4
+
+- name: SetObjectHasNonBigInt
+ result_type: WordSized
+ operands:
+ setObject: WordSized
+ input: BoxedValue
+ hash: WordSized
+ num_temps: 2
+
+- name: SetObjectHasBigInt
+ result_type: WordSized
+ operands:
+ setObject: WordSized
+ input: BoxedValue
+ hash: WordSized
+ num_temps: 4
+
+- name: SetObjectHasValue
+ result_type: WordSized
+ operands:
+ setObject: WordSized
+ input: BoxedValue
+ hash: WordSized
+ num_temps: 4
+
+- name: SetObjectHasValueVMCall
+ result_type: WordSized
+ call_instruction: true
+ operands:
+ setObject: WordSized
+ input: BoxedValue
+
+- name: SetObjectSize
+ result_type: WordSized
+ operands:
+ setObject: WordSized
+
+- name: MapObjectHasNonBigInt
+ result_type: WordSized
+ operands:
+ mapObject: WordSized
+ input: BoxedValue
+ hash: WordSized
+ num_temps: 2
+
+- name: MapObjectHasBigInt
+ result_type: WordSized
+ operands:
+ mapObject: WordSized
+ input: BoxedValue
+ hash: WordSized
+ num_temps: 4
+
+- name: MapObjectHasValue
+ result_type: WordSized
+ operands:
+ mapObject: WordSized
+ input: BoxedValue
+ hash: WordSized
+ num_temps: 4
+
+- name: MapObjectHasValueVMCall
+ result_type: WordSized
+ call_instruction: true
+ operands:
+ mapObject: WordSized
+ input: BoxedValue
+
+- name: MapObjectGetNonBigInt
+ result_type: BoxedValue
+ operands:
+ mapObject: WordSized
+ input: BoxedValue
+ hash: WordSized
+ num_temps: 2
+
+- name: MapObjectGetBigInt
+ result_type: BoxedValue
+ operands:
+ mapObject: WordSized
+ input: BoxedValue
+ hash: WordSized
+ num_temps: 4
+
+- name: MapObjectGetValue
+ result_type: BoxedValue
+ operands:
+ mapObject: WordSized
+ input: BoxedValue
+ hash: WordSized
+ num_temps: 4
+
+- name: MapObjectGetValueVMCall
+ result_type: BoxedValue
+ call_instruction: true
+ operands:
+ mapObject: WordSized
+ input: BoxedValue
+
+- name: MapObjectSize
+ result_type: WordSized
+ operands:
+ mapObject: WordSized
+
+- name: BigIntAsUintN
+ result_type: WordSized
+ operands:
+ bits: WordSized
+ input: WordSized
+ call_instruction: true
+
+- name: BigIntAsUintN64
+ gen_boilerplate: false
+
+- name: BigIntAsUintN32
+ gen_boilerplate: false
+
+- name: IonToWasmCall
+ gen_boilerplate: false
+
+- name: IonToWasmCallV
+ gen_boilerplate: false
+
+- name: IonToWasmCallI64
+ gen_boilerplate: false
+
+- name: WasmBoxValue
+ result_type: WordSized
+ operands:
+ input: BoxedValue
+
+- name: WasmAnyRefFromJSObject
+ result_type: WordSized
+ operands:
+ input: WordSized
+
+# Constant Simd128
+- name: Simd128
+ result_type: WordSized
+ arguments:
+ simd128: SimdConstant
+
+- name: WasmTernarySimd128
+ gen_boilerplate: false
+
+- name: WasmBinarySimd128
+ gen_boilerplate: false
+
+- name: WasmBinarySimd128WithConstant
+ gen_boilerplate: false
+
+- name: WasmVariableShiftSimd128
+ gen_boilerplate: false
+
+- name: WasmConstantShiftSimd128
+ gen_boilerplate: false
+
+- name: WasmSignReplicationSimd128
+ gen_boilerplate: false
+
+- name: WasmShuffleSimd128
+ gen_boilerplate: false
+
+- name: WasmPermuteSimd128
+ gen_boilerplate: false
+
+- name: WasmReplaceLaneSimd128
+ gen_boilerplate: false
+
+- name: WasmReplaceInt64LaneSimd128
+ gen_boilerplate: false
+
+- name: WasmScalarToSimd128
+ gen_boilerplate: false
+
+- name: WasmInt64ToSimd128
+ gen_boilerplate: false
+
+- name: WasmUnarySimd128
+ gen_boilerplate: false
+
+- name: WasmReduceSimd128
+ gen_boilerplate: false
+
+- name: WasmReduceAndBranchSimd128
+ gen_boilerplate: false
+
+- name: WasmReduceSimd128ToInt64
+ gen_boilerplate: false
+
+- name: WasmLoadLaneSimd128
+ gen_boilerplate: false
+
+- name: WasmStoreLaneSimd128
+ gen_boilerplate: false
+
+- name: Unbox
+ gen_boilerplate: false
+
+- name: UnboxFloatingPoint
+ gen_boilerplate: false
+
+- name: WasmUint32ToDouble
+ gen_boilerplate: false
+
+- name: WasmUint32ToFloat32
+ gen_boilerplate: false
+
+- name: DivI
+ gen_boilerplate: false
+
+- name: ModI
+ gen_boilerplate: false
+
+- name: DivPowTwoI
+ gen_boilerplate: false
+
+- name: ModPowTwoI
+ gen_boilerplate: false
+
+- name: TableSwitch
+ gen_boilerplate: false
+
+- name: TableSwitchV
+ gen_boilerplate: false
+
+- name: MulI
+ gen_boilerplate: false
+
+#ifdef JS_CODEGEN_X86
+- name: BoxFloatingPoint
+ gen_boilerplate: false
+
+- name: DivOrModI64
+ gen_boilerplate: false
+
+- name: UDivOrModI64
+ gen_boilerplate: false
+
+- name: DivOrModConstantI
+ gen_boilerplate: false
+
+- name: UDivOrMod
+ gen_boilerplate: false
+
+- name: UDivOrModConstant
+ gen_boilerplate: false
+
+- name: WasmTruncateToInt64
+ gen_boilerplate: false
+
+- name: Int64ToFloatingPoint
+ gen_boilerplate: false
+
+- name: WasmAtomicLoadI64
+ gen_boilerplate: false
+
+- name: WasmAtomicStoreI64
+ gen_boilerplate: false
+
+- name: WasmCompareExchangeI64
+ gen_boilerplate: false
+
+- name: WasmAtomicBinopI64
+ gen_boilerplate: false
+
+- name: WasmAtomicExchangeI64
+ gen_boilerplate: false
+#endif
+
+#ifdef JS_CODEGEN_X64
+- name: DivOrModI64
+ gen_boilerplate: false
+
+- name: UDivOrModI64
+ gen_boilerplate: false
+
+- name: DivOrModConstantI
+ gen_boilerplate: false
+
+- name: UDivOrMod
+ gen_boilerplate: false
+
+- name: UDivOrModConstant
+ gen_boilerplate: false
+
+- name: WasmTruncateToInt64
+ gen_boilerplate: false
+
+- name: Int64ToFloatingPoint
+ gen_boilerplate: false
+#endif
+
+#ifdef JS_CODEGEN_ARM
+- name: BoxFloatingPoint
+ gen_boilerplate: false
+
+- name: DivOrModI64
+ gen_boilerplate: false
+
+- name: UDivOrModI64
+ gen_boilerplate: false
+
+- name: SoftDivI
+ gen_boilerplate: false
+
+- name: SoftModI
+ gen_boilerplate: false
+
+- name: ModMaskI
+ gen_boilerplate: false
+
+- name: UDiv
+ gen_boilerplate: false
+
+- name: UMod
+ gen_boilerplate: false
+
+- name: SoftUDivOrMod
+ gen_boilerplate: false
+
+- name: Int64ToFloatingPointCall
+ gen_boilerplate: false
+
+- name: WasmTruncateToInt64
+ gen_boilerplate: false
+
+- name: WasmAtomicLoadI64
+ gen_boilerplate: false
+
+- name: WasmAtomicStoreI64
+ gen_boilerplate: false
+
+- name: WasmCompareExchangeI64
+ gen_boilerplate: false
+
+- name: WasmAtomicBinopI64
+ gen_boilerplate: false
+
+- name: WasmAtomicExchangeI64
+ gen_boilerplate: false
+#endif
+
+#ifdef JS_CODEGEN_ARM64
+- name: DivOrModI64
+ gen_boilerplate: false
+
+- name: UDivOrModI64
+ gen_boilerplate: false
+
+- name: DivConstantI
+ gen_boilerplate: false
+
+- name: UDivConstantI
+ gen_boilerplate: false
+
+- name: ModMaskI
+ gen_boilerplate: false
+
+- name: UDiv
+ gen_boilerplate: false
+
+- name: UMod
+ gen_boilerplate: false
+
+- name: WasmTruncateToInt64
+ gen_boilerplate: false
+
+- name: Int64ToFloatingPoint
+ gen_boilerplate: false
+#endif
+
+#ifdef JS_CODEGEN_MIPS32
+- name: BoxFloatingPoint
+ gen_boilerplate: false
+
+- name: DivOrModI64
+ gen_boilerplate: false
+
+- name: UDivOrModI64
+ gen_boilerplate: false
+
+- name: UDivOrMod
+ gen_boilerplate: false
+
+- name: ModMaskI
+ gen_boilerplate: false
+
+- name: WasmTruncateToInt64
+ gen_boilerplate: false
+
+- name: Int64ToFloatingPoint
+ gen_boilerplate: false
+
+- name: WasmUnalignedLoad
+ gen_boilerplate: false
+
+- name: WasmUnalignedLoadI64
+ gen_boilerplate: false
+
+- name: WasmUnalignedStore
+ gen_boilerplate: false
+
+- name: WasmUnalignedStoreI64
+ gen_boilerplate: false
+
+- name: WasmAtomicLoadI64
+ gen_boilerplate: false
+
+- name: WasmAtomicStoreI64
+ gen_boilerplate: false
+
+- name: WasmCompareExchangeI64
+ gen_boilerplate: false
+
+- name: WasmAtomicBinopI64
+ gen_boilerplate: false
+
+- name: WasmAtomicExchangeI64
+ gen_boilerplate: false
+#endif
+
+#ifdef JS_CODEGEN_MIPS64
+- name: DivOrModI64
+ gen_boilerplate: false
+
+- name: UDivOrMod
+ gen_boilerplate: false
+
+- name: UDivOrModI64
+ gen_boilerplate: false
+
+- name: ModMaskI
+ gen_boilerplate: false
+
+- name: WasmTruncateToInt64
+ gen_boilerplate: false
+
+- name: Int64ToFloatingPoint
+ gen_boilerplate: false
+
+- name: WasmUnalignedLoad
+ gen_boilerplate: false
+
+- name: WasmUnalignedLoadI64
+ gen_boilerplate: false
+
+- name: WasmUnalignedStore
+ gen_boilerplate: false
+
+- name: WasmUnalignedStoreI64
+ gen_boilerplate: false
+
+- name: WasmCompareExchangeI64
+ gen_boilerplate: false
+
+- name: WasmAtomicBinopI64
+ gen_boilerplate: false
+
+- name: WasmAtomicExchangeI64
+ gen_boilerplate: false
+#endif
+
+#ifdef JS_CODEGEN_LOONG64
+- name: DivOrModI64
+ gen_boilerplate: false
+
+- name: UDivOrMod
+ gen_boilerplate: false
+
+- name: UDivOrModI64
+ gen_boilerplate: false
+
+- name: ModMaskI
+ gen_boilerplate: false
+
+- name: WasmTruncateToInt64
+ gen_boilerplate: false
+
+- name: Int64ToFloatingPoint
+ gen_boilerplate: false
+
+- name: WasmCompareExchangeI64
+ gen_boilerplate: false
+
+- name: WasmAtomicBinopI64
+ gen_boilerplate: false
+
+- name: WasmAtomicExchangeI64
+ gen_boilerplate: false
+#endif
+
+#ifdef JS_CODEGEN_RISCV64
+- name: DivOrModI64
+ gen_boilerplate: false
+
+- name: UDivOrMod
+ gen_boilerplate: false
+
+- name: UDivOrModI64
+ gen_boilerplate: false
+
+- name: ModMaskI
+ gen_boilerplate: false
+
+- name: WasmTruncateToInt64
+ gen_boilerplate: false
+
+- name: Int64ToFloatingPoint
+ gen_boilerplate: false
+
+- name: WasmCompareExchangeI64
+ gen_boilerplate: false
+
+- name: WasmAtomicBinopI64
+ gen_boilerplate: false
+
+- name: WasmAtomicExchangeI64
+ gen_boilerplate: false
+#endif
+
+#ifdef FUZZING_JS_FUZZILLI
+- name: FuzzilliHashT
+ gen_boilerplate: false
+
+- name: FuzzilliHashV
+ gen_boilerplate: false
+
+- name: FuzzilliHashStore
+ gen_boilerplate: false
+#endif