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
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# [SMDOC] LIR Opcodes
# =======================
# This file defines all LIR opcodes as well as LIR opcode class
# definitions. It is parsed by GenerateLIRFiles.py at build time to
# create LIROpsGenerated.h. Each opcode consists of a
# name and a set of attributes that are described below. Unless
# marked as required, attributes are optional.
#
# name [required]
# ====
# Opcode name.
# Possible values:
# - opcode string: used as the name for LIR opcode.
#
# gen_boilerplate
# ===============
# Used to decide to generate LIR boilerplate.
# - true (default): auto generate boilerplate for this LIR opcode
# - false: do not generate boilerplate for this LIR opcode
#
# result_type
# ===========
# Specifies the result type that is produced by this LIR instruction.
# The result type can be any of the following: WordSized, BoxedValue,
# or Int64.
# - attribute not specified (default): there is no result produced
# by this LIR instruction
# - result type: sets result type for this LIR instruction
#
# operands
# ========
# A list of operands to the LIR node. Each operand will be
# passed into and set in the instruction's constructor. A simple getter
# will also be auto generated for the operand. Each operand in the
# following list is defined by its name and an type.
# The type can be WordSized, BoxedValue, or Int64.
#
# For example:
# operands:
# lhs: BoxedValue
# rhs: WordSized
#
# Will result in:
# explicit LInstanceOfV(const LBoxAllocation& lhs, const LAllocation& rhs)
# : LInstructionHelper(classOpcode) {
# setBoxOperand(lhsIndex, lhs);
# setOperand(rhsIndex, rhs);
# }
# const LAllocation* rhs() { return getOperand(0); }
#
# static const size_t lhsIndex = 0;
# static const size_t rhsIndex = BOX_PIECES;
#
# - attribute not specified (default): no code generated
# - list of operand names with their types: operand getters and setters
# are generated and passed into the constructor
#
# arguments
# =========
# A list of non-LIR node arguments to the LIR op class constructor
# that are passed along with the operands. The arguments require
# both a name and a full type signature for each item in the list.
#
# For example:
# offset: size_t
# type: MIRType
#
# For each argument a private variable declaration will be autogenerated
# in the LIR op class, as well as simple accessor for that variable. The
# above arguments list will result in the following declarations and
# accessors:
#
# size_t offset_;
# MIRType type_;
#
# size_t offset() const { return offset_; }
# MIRType type() const { return type_; }
#
# - attribute not specified (default): no code generated
# - argument list: argument names and their full type signature
#
# num_temps
# ========
# Specifies the number of temporary virtual registers, LDefinitions, used by
# this LIR op.
# - attribute not specified (default): number of temps is set to 0
# - number of LDefinition temps: sets number of temps max 15
#
# call_instruction
# ================
# Used to define call instructions.
# - attribute not specified (default): no code generated
# - true: generates a call to setIsCall in the op's constructor
#
# mir_op
# ======
# If a LIR instruction corresponds one-to-one with a particular MIR
# instruction, this will generate a method that returns that MIR
# instruction.
# - attribute not specified (default): no code generated
# - true: generates a method to return MIR instruction
# - mir string: returns this specified MIR instruction
#
- name: Phi
gen_boilerplate: false
- name: Box
gen_boilerplate: false
- name: OsiPoint
gen_boilerplate: false
- name: MoveGroup
gen_boilerplate: false
# Constant 32-bit integer.
- name: Integer
result_type: WordSized
arguments:
i32: int32_t
# Constant 64-bit integer.
- name: Integer64
result_type: Int64
arguments:
i64: int64_t
# Constant pointer.
- name: Pointer
result_type: WordSized
arguments:
gcptr: gc::Cell*
# Constant double.
- name: Double
result_type: WordSized
arguments:
value: double
# Constant float32.
- name: Float32
result_type: WordSized
arguments:
value: float
- name: Value
gen_boilerplate: false
- name: NurseryObject
result_type: WordSized
mir_op: true
# Formal argument for a function, returning a box. Formal arguments are
# initially read from the stack.
- name: Parameter
result_type: BoxedValue
# Stack offset for a word-sized immutable input value to a frame.
- name: Callee
result_type: WordSized
- name: IsConstructing
result_type: WordSized
- name: Goto
gen_boilerplate: false
- name: NewArray
gen_boilerplate: false
- name: NewArrayDynamicLength
result_type: WordSized
operands:
length: WordSized
num_temps: 1
mir_op: true
- name: NewIterator
result_type: WordSized
num_temps: 1
mir_op: true
- name: NewTypedArray
result_type: WordSized
num_temps: 2
mir_op: true
- name: NewTypedArrayDynamicLength
result_type: WordSized
operands:
length: WordSized
num_temps: 1
mir_op: true
- name: NewTypedArrayFromArray
result_type: WordSized
operands:
array: WordSized
call_instruction: true
mir_op: true
- name: NewTypedArrayFromArrayBuffer
result_type: WordSized
operands:
arrayBuffer: WordSized
byteOffset: BoxedValue
length: BoxedValue
call_instruction: true
mir_op: true
- name: BindFunction
result_type: WordSized
operands:
target: WordSized
call_instruction: true
num_temps: 2
mir_op: true
- name: NewBoundFunction
result_type: WordSized
num_temps: 1
mir_op: true
- name: NewObject
gen_boilerplate: false
- name: NewPlainObject
result_type: WordSized
num_temps: 3
mir_op: true
- name: NewArrayObject
result_type: WordSized
num_temps: 2
mir_op: true
# Allocates a new NamedLambdaObject.
#
# This instruction generates two possible instruction sets:
# (1) An inline allocation of the call object is attempted.
# (2) Otherwise, a callVM create a new object.
#
- name: NewNamedLambdaObject
result_type: WordSized
num_temps: 1
mir_op: true
# Allocates a new CallObject.
#
# This instruction generates two possible instruction sets:
# (1) If the call object is extensible, this is a callVM to create the
# call object.
# (2) Otherwise, an inline allocation of the call object is attempted.
#
- name: NewCallObject
result_type: WordSized
num_temps: 1
mir_op: true
- name: NewStringObject
result_type: WordSized
operands:
input: WordSized
num_temps: 1
mir_op: true
- name: InitElemGetterSetter
operands:
object: WordSized
id: BoxedValue
value: WordSized
call_instruction: true
mir_op: true
# Takes in an Object and a Value.
- name: MutateProto
operands:
object: WordSized
value: BoxedValue
call_instruction: true
- name: InitPropGetterSetter
operands:
object: WordSized
value: WordSized
call_instruction: true
mir_op: true
- name: CheckOverRecursed
mir_op: true
- name: WasmTrap
mir_op: true
- name: WasmTrapIfNull
operands:
ref: WordSized
mir_op: true
- name: WasmRefIsSubtypeOfConcrete
mir_op: true
operands:
ref: WordSized
superSTV: WordSized
result_type: WordSized
num_temps: 2
- name: WasmRefIsSubtypeOfAbstract
mir_op: true
operands:
ref: WordSized
result_type: WordSized
num_temps: 1
- name: WasmRefIsSubtypeOfConcreteAndBranch
gen_boilerplate: false
- name: WasmRefIsSubtypeOfAbstractAndBranch
gen_boilerplate: false
- name: 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: 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
- 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
- name: LoadScriptedProxyHandler
result_type: BoxedValue
operands:
object: WordSized
mir_op: true
#ifdef JS_PUNBOX64
- name: CheckScriptedProxyGetResult
operands:
target: BoxedValue
id: BoxedValue
value: BoxedValue
num_temps: 2
mir_op: true
#endif
- name: IdToStringOrSymbol
result_type: BoxedValue
operands:
id: BoxedValue
num_temps: 1
mir_op: true
# Load a boxed value from an object's fixed slot.
- name: LoadFixedSlotV
result_type: BoxedValue
operands:
object: WordSized
mir_op: LoadFixedSlot
# Load a 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