Source code
Revision control
Copy as Markdown
Other Tools
# 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
# [SMDOC] LIR Opcodes
# =======================
# This file defines all LIR opcodes as well as LIR opcode class
# definitions. It is parsed by GenerateLIRFiles.py at build time to
# create LIROpsGenerated.h. Each opcode consists of a
# name and a set of attributes that are described below. Unless
# marked as required, attributes are optional.
#
# name [required]
# ====
# Opcode name.
# Possible values:
# - opcode string: used as the name for LIR opcode.
#
# gen_boilerplate
# ===============
# Used to decide to generate LIR boilerplate.
# - true (default): auto generate boilerplate for this LIR opcode
# - false: do not generate boilerplate for this LIR opcode
#
# result_type
# ===========
# Specifies the result type that is produced by this LIR instruction.
# The result type can be any of the following: WordSized, BoxedValue,
# or Int64.
# - attribute not specified (default): there is no result produced
# by this LIR instruction
# - result type: sets result type for this LIR instruction
#
# operands
# ========
# A list of operands to the LIR node. Each operand will be
# passed into and set in the instruction's constructor. A simple getter
# will also be auto generated for the operand. Each operand in the
# following list is defined by its name and an type.
# The type can be WordSized, BoxedValue, or Int64.
#
# For example:
# operands:
# lhs: BoxedValue
# rhs: WordSized
#
# Will result in:
# explicit LInstanceOfV(const LBoxAllocation& lhs, const LAllocation& rhs)
# : LInstructionHelper(classOpcode) {
# setBoxOperand(lhsIndex, lhs);
# setOperand(rhsIndex, rhs);
# }
# const LAllocation* rhs() { return getOperand(0); }
#
# static const size_t lhsIndex = 0;
# static const size_t rhsIndex = BOX_PIECES;
#
# - attribute not specified (default): no code generated
# - list of operand names with their types: operand getters and setters
# are generated and passed into the constructor
#
# arguments
# =========
# A list of non-LIR node arguments to the LIR op class constructor
# that are passed along with the operands. The arguments require
# both a name and a full type signature for each item in the list.
#
# For example:
# offset: size_t
# type: MIRType
#
# For each argument a private variable declaration will be autogenerated
# in the LIR op class, as well as simple accessor for that variable. The
# above arguments list will result in the following declarations and
# accessors:
#
# size_t offset_;
# MIRType type_;
#
# size_t offset() const { return offset_; }
# MIRType type() const { return type_; }
#
# - attribute not specified (default): no code generated
# - argument list: argument names and their full type signature
#
# num_temps
# ========
# Specifies the number of temporary virtual registers, LDefinitions, used by
# this LIR op.
# - attribute not specified (default): number of temps is set to 0
# - number of LDefinition temps: sets number of temps max 15
#
# call_instruction
# ================
# Used to define call instructions.
# - attribute not specified (default): no code generated
# - true: generates a call to setIsCall in the op's constructor
#
# mir_op
# ======
# If a LIR instruction corresponds one-to-one with a particular MIR
# instruction, this will generate a method that returns that MIR
# instruction.
# - attribute not specified (default): no code generated
# - true: generates a method to return MIR instruction
# - mir string: returns this specified MIR instruction
#
- name: Phi
gen_boilerplate: false
- name: Box
gen_boilerplate: false
- name: OsiPoint
gen_boilerplate: false
- name: MoveGroup
gen_boilerplate: false
# Constant 32-bit integer.
- name: Integer
result_type: WordSized
arguments:
i32: int32_t
# Constant 64-bit integer.
- name: Integer64
result_type: Int64
arguments:
i64: int64_t
# Constant pointer.
- name: Pointer
result_type: WordSized
arguments:
gcptr: gc::Cell*
# Constant double.
- name: Double
result_type: WordSized
arguments:
value: double
# Constant float32.
- name: Float32
result_type: WordSized
arguments:
value: float
- name: Value
gen_boilerplate: false
- name: NurseryObject
result_type: WordSized
mir_op: true
# Formal argument for a function, returning a box. Formal arguments are
# initially read from the stack.
- name: Parameter
result_type: BoxedValue
# Stack offset for a word-sized immutable input value to a frame.
- name: Callee
result_type: WordSized
- name: IsConstructing
result_type: WordSized
- name: Goto
gen_boilerplate: false
- name: NewArray
gen_boilerplate: false
- name: NewArrayDynamicLength
result_type: WordSized
operands:
length: WordSized
num_temps: 1
mir_op: true
- name: NewIterator
result_type: WordSized
num_temps: 1
mir_op: true
- name: NewTypedArray
result_type: WordSized
num_temps: 2
mir_op: true
- name: NewTypedArrayDynamicLength
result_type: WordSized
operands:
length: WordSized
num_temps: 1
mir_op: true
- name: NewTypedArrayFromArray
result_type: WordSized
operands:
array: WordSized
call_instruction: true
mir_op: true
- name: NewTypedArrayFromArrayBuffer
result_type: WordSized
operands:
arrayBuffer: WordSized
byteOffset: BoxedValue
length: BoxedValue
call_instruction: true
mir_op: true
- name: BindFunction
result_type: WordSized
operands:
target: WordSized
call_instruction: true
num_temps: 2
mir_op: true
- name: NewBoundFunction
result_type: WordSized
num_temps: 1
mir_op: true
- name: NewObject
gen_boilerplate: false
- name: NewPlainObject
result_type: WordSized
num_temps: 3
mir_op: true
- name: NewArrayObject
result_type: WordSized
num_temps: 2
mir_op: true
# Allocates a new NamedLambdaObject.
#
# This instruction generates two possible instruction sets:
# (1) An inline allocation of the call object is attempted.
# (2) Otherwise, a callVM create a new object.
#
- name: NewNamedLambdaObject
result_type: WordSized
num_temps: 1
mir_op: true
# Allocates a new CallObject.
#
# This instruction generates two possible instruction sets:
# (1) If the call object is extensible, this is a callVM to create the
# call object.
# (2) Otherwise, an inline allocation of the call object is attempted.
#
- name: NewCallObject
result_type: WordSized
num_temps: 1
mir_op: true
- name: NewStringObject
result_type: WordSized
operands:
input: WordSized
num_temps: 1
mir_op: true
- name: InitElemGetterSetter
operands:
object: WordSized
id: BoxedValue
value: WordSized
call_instruction: true
mir_op: true
# Takes in an Object and a Value.
- name: MutateProto
operands:
object: WordSized
value: BoxedValue
call_instruction: true
- name: InitPropGetterSetter
operands:
object: WordSized
value: WordSized
call_instruction: true
mir_op: true
- name: CheckOverRecursed
mir_op: true
- name: WasmTrap
mir_op: true
- name: WasmTrapIfNull
operands:
ref: WordSized
mir_op: true
- name: WasmRefIsSubtypeOfConcrete
mir_op: true
operands:
ref: WordSized
superSTV: WordSized
result_type: WordSized
num_temps: 2
- name: WasmRefIsSubtypeOfAbstract
mir_op: true
operands:
ref: WordSized
result_type: WordSized
num_temps: 1
- name: WasmRefIsSubtypeOfConcreteAndBranch
gen_boilerplate: false
- name: WasmRefIsSubtypeOfAbstractAndBranch
gen_boilerplate: false
- name: WasmNewStructObject
mir_op: true
operands:
instance: WordSized
typeDefData: WordSized
result_type: WordSized
num_temps: 2
- name: WasmNewArrayObject
mir_op: true
operands:
instance: WordSized
numElements: WordSized
typeDefData: WordSized
result_type: WordSized
num_temps: 2
- name: WasmReinterpret
gen_boilerplate: false
- name: WasmReinterpretFromI64
gen_boilerplate: false
- name: WasmReinterpretToI64
gen_boilerplate: false
- name: Rotate
gen_boilerplate: false
- name: RotateI64
gen_boilerplate: false
- name: InterruptCheck
mir_op: true
- name: WasmStackSwitchToMain
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
gen_boilerplate: false
- name: EncodeSnapshot
- name: UnreachableResultV
gen_boilerplate: false
- name: UnreachableResultT
result_type: WordSized
- name: GetDOMProperty
gen_boilerplate: false
- name: GetDOMMemberV
gen_boilerplate: false
- name: GetDOMMemberT
result_type: WordSized
operands:
object: WordSized
mir_op: GetDOMMember
- name: SetDOMProperty
gen_boilerplate: false
- name: LoadDOMExpandoValue
result_type: BoxedValue
operands:
proxy: WordSized
mir_op: true
- name: LoadDOMExpandoValueGuardGeneration
result_type: BoxedValue
operands:
proxy: WordSized
mir_op: true
- name: LoadDOMExpandoValueIgnoreGeneration
result_type: BoxedValue
operands:
proxy: WordSized
mir_op: true
- name: GuardDOMExpandoMissingOrGuardShape
operands:
input: BoxedValue
num_temps: 1
mir_op: true
- name: ApplyArgsGeneric
gen_boilerplate: false
- name: ApplyArgsObj
gen_boilerplate: false
- name: ApplyArrayGeneric
gen_boilerplate: false
- name: ConstructArgsGeneric
gen_boilerplate: false
- name: ConstructArrayGeneric
gen_boilerplate: false
- name: ApplyArgsNative
gen_boilerplate: false
- name: ApplyArgsObjNative
gen_boilerplate: false
- name: ApplyArrayNative
gen_boilerplate: false
- name: ConstructArgsNative
gen_boilerplate: false
- name: ConstructArrayNative
gen_boilerplate: false
- name: TestIAndBranch
gen_boilerplate: false
- name: TestIPtrAndBranch
gen_boilerplate: false
- name: TestI64AndBranch
gen_boilerplate: false
- name: TestDAndBranch
gen_boilerplate: false
- name: TestFAndBranch
gen_boilerplate: false
- name: TestBIAndBranch
gen_boilerplate: false
- name: TestOAndBranch
gen_boilerplate: false
- name: TestVAndBranch
gen_boilerplate: false
- name: Compare
gen_boilerplate: false
- name: CompareI64
gen_boilerplate: false
- name: CompareI64AndBranch
gen_boilerplate: false
- name: CompareAndBranch
gen_boilerplate: false
- name: CompareD
result_type: WordSized
operands:
left: WordSized
right: WordSized
mir_op: Compare
- name: CompareF
result_type: WordSized
operands:
left: WordSized
right: WordSized
mir_op: Compare
- name: CompareDAndBranch
gen_boilerplate: false
- name: CompareFAndBranch
gen_boilerplate: false
- name: CompareS
result_type: WordSized
operands:
left: WordSized
right: WordSized
mir_op: Compare
- name: CompareSInline
result_type: WordSized
operands:
input: WordSized
arguments:
constant: JSLinearString*
mir_op: Compare
- name: CompareSSingle
result_type: WordSized
operands:
input: WordSized
arguments:
jsop: JSOp
constant: JSLinearString*
num_temps: 1
mir_op: Compare
- name: CompareBigInt
result_type: WordSized
operands:
left: WordSized
right: WordSized
num_temps: 3
mir_op: Compare
- name: CompareBigIntInt32
result_type: WordSized
operands:
left: WordSized
right: WordSized
num_temps: 2
mir_op: Compare
- name: CompareBigIntDouble
result_type: WordSized
operands:
left: WordSized
right: WordSized
call_instruction: true
mir_op: Compare
- name: CompareBigIntString
result_type: WordSized
operands:
left: WordSized
right: WordSized
call_instruction: true
mir_op: Compare
- name: CompareBigIntInt32AndBranch
gen_boilerplate: false
- name: BitAndAndBranch
gen_boilerplate: false
- name: BitAnd64AndBranch
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 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
- 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
mir_op: true
- name: SignExtendIntPtr
result_type: WordSized
operands:
num: WordSized
mir_op: true
- name: SignExtendInt64
gen_boilerplate: false
- name: UrshD
gen_boilerplate: false
- name: Return
gen_boilerplate: false
- name: Throw
operands:
value: BoxedValue
call_instruction: true
- name: ThrowWithStack
operands:
value: BoxedValue
stack: BoxedValue
call_instruction: true
- name: MinMaxI
gen_boilerplate: false
- name: MinMaxD
gen_boilerplate: false
- name: MinMaxF
gen_boilerplate: false
- name: MinMaxArrayI
gen_boilerplate: false
- name: MinMaxArrayD
gen_boilerplate: false
# Negative of integer
- name: NegI
result_type: WordSized
operands:
num: WordSized
# Negative of an int64
- name: NegI64
result_type: Int64
operands:
num: Int64
# Negative of double
- name: NegD
result_type: WordSized
operands:
num: WordSized
# Negative of float32
- name: NegF
result_type: WordSized
operands:
num: WordSized
# Absolute value of an integer.
- name: AbsI
result_type: WordSized
operands:
num: WordSized
mir_op: Abs
# Absolute value of a double.
- name: AbsD
result_type: WordSized
operands:
num: WordSized
# Absolute value of a float32.
- name: AbsF
result_type: WordSized
operands:
num: WordSized
- name: CopySignD
gen_boilerplate: false
- name: CopySignF
gen_boilerplate: false
# Count leading zeroes on an int32.
- name: ClzI
result_type: WordSized
operands:
num: WordSized
mir_op: Clz
# Count leading zeroes on an int64.
- name: ClzI64
result_type: Int64
operands:
num: Int64
mir_op: Clz
# Count trailing zeroes on an int32.
- name: CtzI
result_type: WordSized
operands:
num: WordSized
mir_op: Ctz
# Count trailing zeroes on an int64.
- name: CtzI64
result_type: Int64
operands:
num: Int64
mir_op: Ctz
# Count population on an int32.
- name: PopcntI
result_type: WordSized
operands:
num: WordSized
num_temps: 1
mir_op: Popcnt
# Count population on an int64.
- name: PopcntI64
result_type: Int64
operands:
num: Int64
num_temps: 1
mir_op: Popcnt
- name: SqrtD
result_type: WordSized
operands:
num: WordSized
- name: SqrtF
result_type: WordSized
operands:
num: WordSized
- name: Atan2D
gen_boilerplate: false
- name: Hypot
gen_boilerplate: false
# Double raised to an integer power.
- name: PowI
result_type: WordSized
operands:
value: WordSized
power: WordSized
call_instruction: true
# Integer raised to an integer power.
- name: PowII
result_type: WordSized
operands:
value: WordSized
power: WordSized
num_temps: 2
mir_op: Pow
# Double raised to a double power.
- name: PowD
result_type: WordSized
operands:
value: WordSized
power: WordSized
call_instruction: true
# Constant of a power of two raised to an integer power.
- name: PowOfTwoI
result_type: WordSized
operands:
power: WordSized
arguments:
base: uint32_t
# Sign value of an integer.
- name: SignI
result_type: WordSized
operands:
num: WordSized
# Sign value of an integer.
- name: SignD
result_type: WordSized
operands:
num: WordSized
# Sign value of a double with expected int32 result.
- name: SignDI
result_type: WordSized
operands:
input: WordSized
num_temps: 1
- name: MathFunctionD
gen_boilerplate: false
- name: MathFunctionF
gen_boilerplate: false
- name: AddI
gen_boilerplate: false
- name: AddI64
gen_boilerplate: false
- name: SubI
gen_boilerplate: false
- name: SubI64
gen_boilerplate: false
- name: MulI64
gen_boilerplate: false
- name: MathD
gen_boilerplate: false
- name: MathF
gen_boilerplate: false
- name: ModD
gen_boilerplate: false
- name: ModPowTwoD
gen_boilerplate: false
- name: WasmBuiltinModD
result_type: WordSized
operands:
lhs: WordSized
rhs: WordSized
instance: WordSized
call_instruction: true
mir_op: true
- name: BigIntAdd
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
- name: ValueToInt32
gen_boilerplate: false
# Convert a value to a BigInt.
- name: ValueToBigInt
result_type: WordSized
operands:
input: BoxedValue
mir_op: ToBigInt
# Convert a double to an int32.
# Input: floating-point Register
# Output: 32-bit integer
# Bailout: if the double cannot be converted to an integer.
- name: DoubleToInt32
result_type: WordSized
operands:
in: WordSized
mir_op: ToNumberInt32
# Convert a float32 to an int32.
# Input: floating-point Register
# Output: 32-bit integer
# Bailout: if the float32 cannot be converted to an integer.
- name: Float32ToInt32
result_type: WordSized
operands:
in: WordSized
mir_op: ToNumberInt32
# Convert a double to a truncated int32.
# Input: floating-point Register
# Output: 32-bit integer
- name: TruncateDToInt32
result_type: WordSized
operands:
in: WordSized
num_temps: 1
mir_op: TruncateToInt32
# Convert a double to a truncated int32 with instance offset because we need it
# for the slow ool path.
- name: WasmBuiltinTruncateDToInt32
result_type: WordSized
operands:
in: WordSized
instance: WordSized
num_temps: 1
mir_op: WasmBuiltinTruncateToInt32
# Convert a float32 to a truncated int32.
# Input: floating-point Register
# Output: 32-bit integer
- name: TruncateFToInt32
result_type: WordSized
operands:
in: WordSized
num_temps: 1
mir_op: TruncateToInt32
# Convert a float32 to a truncated int32 with instance offset because we need
# it for the slow ool path.
- name: WasmBuiltinTruncateFToInt32
result_type: WordSized
operands:
in: WordSized
instance: WordSized
num_temps: 1
mir_op: WasmBuiltinTruncateToInt32
- name: WasmTruncateToInt32
result_type: WordSized
operands:
input: WordSized
mir_op: true
- name: WrapInt64ToInt32
result_type: WordSized
operands:
input: Int64
mir_op: true
- name: ExtendInt32ToInt64
result_type: Int64
operands:
input: WordSized
mir_op: true
# Convert a boolean value to a string.
- name: BooleanToString
result_type: WordSized
operands:
input: WordSized
mir_op: ToString
# Convert an integer hosted on one definition to a string with a function call.
- name: IntToString
result_type: WordSized
operands:
input: WordSized
mir_op: ToString
# Convert a double hosted on one definition to a string with a function call.
- name: DoubleToString
result_type: WordSized
operands:
input: WordSized
num_temps: 1
mir_op: ToString
# Convert a primitive to a string with a function call.
- name: ValueToString
result_type: WordSized
operands:
input: BoxedValue
num_temps: 1
mir_op: ToString
- name: PowHalfD
gen_boilerplate: false
- name: NaNToZero
result_type: WordSized
operands:
input: WordSized
num_temps: 1
mir_op: true
- name: OsrEntry
gen_boilerplate: false
# Materialize a Value stored in an interpreter frame for OSR.
- name: OsrValue
result_type: BoxedValue
operands:
entry: WordSized
mir_op: true
# Materialize a JSObject env chain stored in an interpreter frame for OSR.
- name: OsrEnvironmentChain
result_type: WordSized
operands:
entry: WordSized
mir_op: true
# Materialize a JSObject env chain stored in an interpreter frame for OSR.
- name: OsrReturnValue
result_type: BoxedValue
operands:
entry: WordSized
mir_op: true
- name: OsrArgumentsObject
result_type: WordSized
operands:
entry: WordSized
mir_op: true
- name: RegExp
result_type: WordSized
num_temps: 1
mir_op: true
- name: RegExpMatcher
result_type: BoxedValue
operands:
regexp: WordSized
string: WordSized
lastIndex: WordSized
call_instruction: true
mir_op: true
- name: RegExpSearcher
result_type: WordSized
operands:
regexp: WordSized
string: WordSized
lastIndex: WordSized
call_instruction: true
mir_op: true
- name: RegExpSearcherLastLimit
result_type: WordSized
operands:
num_temps: 1
- name: RegExpExecMatch
result_type: BoxedValue
operands:
regexp: WordSized
string: WordSized
call_instruction: true
num_temps: 0
mir_op: true
- name: RegExpExecTest
result_type: WordSized
operands:
regexp: WordSized
string: WordSized
call_instruction: true
num_temps: 0
mir_op: true
- name: RegExpHasCaptureGroups
result_type: WordSized
operands:
regexp: WordSized
input: WordSized
mir_op: true
- name: RegExpPrototypeOptimizable
result_type: WordSized
operands:
object: WordSized
num_temps: 1
mir_op: true
- name: RegExpInstanceOptimizable
result_type: WordSized
operands:
object: WordSized
proto: WordSized
num_temps: 1
mir_op: true
- name: GetFirstDollarIndex
result_type: WordSized
operands:
str: WordSized
num_temps: 3
- name: StringReplace
result_type: WordSized
operands:
string: WordSized
pattern: WordSized
replacement: WordSized
call_instruction: true
mir_op: true
- name: BinaryValueCache
result_type: BoxedValue
operands:
lhs: BoxedValue
rhs: BoxedValue
# Takes two temps: these are intended to be FloatReg0 and FloatReg1
# to allow the actual cache code to safely clobber those values without
# save and restore.
num_temps: 2
mir_op: BinaryCache
- name: BinaryBoolCache
result_type: WordSized
operands:
lhs: BoxedValue
rhs: BoxedValue
# Takes two temps: these are intendend to be FloatReg0 and FloatReg1
# To allow the actual cache code to safely clobber those values without
# save and restore.
num_temps: 2
mir_op: BinaryCache
- name: UnaryCache
result_type: BoxedValue
operands:
input: BoxedValue
mir_op_cast: true
- name: ModuleMetadata
result_type: WordSized
call_instruction: true
mir_op: true
- name: DynamicImport
result_type: WordSized
operands:
specifier: BoxedValue
options: BoxedValue
call_instruction: true
mir_op: true
- name: Lambda
result_type: WordSized
operands:
environmentChain: WordSized
num_temps: 1
mir_op: true
- name: FunctionWithProto
result_type: WordSized
operands:
envChain: WordSized
prototype: WordSized
call_instruction: true
mir_op: true
- name: SetFunName
result_type: WordSized
operands:
fun: WordSized
name: BoxedValue
call_instruction: true
mir_op: true
- name: KeepAliveObject
operands:
object: WordSized
- name: DebugEnterGCUnsafeRegion
num_temps: 1
- name: DebugLeaveGCUnsafeRegion
num_temps: 1
# Load the "slots" member out of a JSObject.
# Input: JSObject pointer
# Output: slots pointer
- name: Slots
result_type: WordSized
operands:
object: WordSized
# Load the "elements" member out of a JSObject.
# Input: JSObject pointer
# Output: elements pointer
- name: Elements
result_type: WordSized
operands:
object: WordSized
mir_op: true
# Load the initialized length from an elements header.
- name: InitializedLength
result_type: WordSized
operands:
elements: WordSized
# Store to the initialized length in an elements header. Note the input is an
# *index*, one less than the desired initialized length.
- name: SetInitializedLength
operands:
elements: WordSized
index: WordSized
# Load the length from an elements header.
- name: ArrayLength
result_type: WordSized
operands:
elements: WordSized
# Store to the length in an elements header. Note the input is an *index*,
# one less than the desired length.
- name: SetArrayLength
operands:
elements: WordSized
index: WordSized
# Load the "length" property of a function.
- name: FunctionLength
result_type: WordSized
operands:
function: WordSized
# Load the "name" property of a function.
- name: FunctionName
result_type: WordSized
operands:
function: WordSized
- name: GetNextEntryForIterator
result_type: WordSized
operands:
iter: WordSized
result: WordSized
num_temps: 3
mir_op: true
- name: ArrayBufferByteLength
result_type: WordSized
operands:
object: WordSized
- name: ArrayBufferViewLength
result_type: WordSized
operands:
object: WordSized
mir_op: true
# Read the byteOffset of an array buffer view.
- name: ArrayBufferViewByteOffset
result_type: WordSized
operands:
object: WordSized
# Load an array buffer view's elements vector.
- name: ArrayBufferViewElements
result_type: WordSized
operands:
object: WordSized
# Return the element size of a typed array.
- name: TypedArrayElementSize
result_type: WordSized
operands:
object: WordSized
# Read the length of a resizable typed array.
- name: ResizableTypedArrayLength
result_type: WordSized
operands:
object: WordSized
arguments:
synchronization: js::jit::Synchronization
num_temps: 1
# Read the possibly out-of-bounds byteOffset of a resizable typed array.
- name: ResizableTypedArrayByteOffsetMaybeOutOfBounds
result_type: WordSized
operands:
object: WordSized
num_temps: 1
# Read the byte length of a resizable data view.
- name: ResizableDataViewByteLength
result_type: WordSized
operands:
object: WordSized
arguments:
synchronization: js::jit::Synchronization
num_temps: 1
# Read the byte length of a growable shared array buffer.
- name: GrowableSharedArrayBufferByteLength
result_type: WordSized
operands:
object: WordSized
# Guard a resizable array buffer view is in-bounds.
- name: GuardResizableArrayBufferViewInBounds
operands:
object: WordSized
num_temps: 1
# Guard a resizable array buffer view is in-bounds.
- name: GuardResizableArrayBufferViewInBoundsOrDetached
operands:
object: WordSized
num_temps: 1
- name: GuardHasAttachedArrayBuffer
operands:
object: WordSized
num_temps: 1
# Double to IntPtr, eligible for accessing into a TypedArray or DataView. If
# the index isn't exactly representable as an IntPtr, depending on the
# supportOOB flag on the MIR instruction, either bail out or produce an IntPtr
# which is equivalent to an OOB access.
- name: GuardNumberToIntPtrIndex
result_type: WordSized
operands:
object: WordSized
mir_op: true
# Bailout if index >= length.
- name: BoundsCheck
operands:
index: WordSized
length: WordSized
mir_op: true
- name: BoundsCheckRange
gen_boilerplate: false
# Bailout if index < minimum.
- name: BoundsCheckLower
operands:
index: WordSized
mir_op: true
- name: SpectreMaskIndex
result_type: WordSized
operands:
index: WordSized
length: WordSized
mir_op: true
- name: LoadElementV
gen_boilerplate: false
- name: InArray
result_type: WordSized
operands:
elements: WordSized
index: WordSized
initLength: WordSized
mir_op: true
- name: GuardElementNotHole
operands:
elements: WordSized
index: WordSized
- name: LoadElementHole
gen_boilerplate: false
- name: StoreElementV
gen_boilerplate: false
- name: StoreElementT
gen_boilerplate: false
- name: StoreHoleValueElement
operands:
elements: WordSized
index: WordSized
# Like LStoreElementV, but supports indexes >= initialized length.
- name: StoreElementHoleV
operands:
object: WordSized
elements: WordSized
index: WordSized
value: BoxedValue
num_temps: 1
mir_op: StoreElementHole
# Like LStoreElementT, but supports indexes >= initialized length.
- name: StoreElementHoleT
operands:
object: WordSized
elements: WordSized
index: WordSized
value: WordSized
num_temps: 1
mir_op: StoreElementHole