From 26a029d407be480d791972afb5975cf62c9360a6 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Fri, 19 Apr 2024 02:47:55 +0200 Subject: Adding upstream version 124.0.1. Signed-off-by: Daniel Baumann --- js/src/jit/LIROps.yaml | 4332 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 4332 insertions(+) create mode 100644 js/src/jit/LIROps.yaml (limited to 'js/src/jit/LIROps.yaml') diff --git a/js/src/jit/LIROps.yaml b/js/src/jit/LIROps.yaml new file mode 100644 index 0000000000..44ef48a4d8 --- /dev/null +++ b/js/src/jit/LIROps.yaml @@ -0,0 +1,4332 @@ +# 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: 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: 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: 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: 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: 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 + 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. +- 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 + +# 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: ObjectKeys + result_type: WordSized + operands: + object: WordSized + num_temps: 0 + call_instruction: true + +- name: ObjectKeysLength + result_type: WordSized + operands: + object: WordSized + num_temps: 0 + call_instruction: true + +- name: LoadUnboxedScalar + result_type: WordSized + operands: + elements: WordSized + index: WordSized + num_temps: 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 boxed value from an object's fixed slot. +# If it is a non-atom string, atomize it and update the slot. +- name: LoadFixedSlotAndAtomize + result_type: BoxedValue + operands: + object: WordSized + num_temps: 1 + mir_op: LoadFixedSlot + +# Load a typed value from an object's fixed slot. +- name: LoadFixedSlotT + result_type: WordSized + operands: + object: WordSized + mir_op: LoadFixedSlot + +- name: LoadFixedSlotAndUnbox + result_type: WordSized + operands: + object: WordSized + mir_op: true + +- name: LoadDynamicSlotAndUnbox + result_type: WordSized + operands: + slots: WordSized + mir_op: true + +- name: LoadElementAndUnbox + result_type: WordSized + operands: + elements: WordSized + index: WordSized + mir_op: true + +- name: LoadFixedSlotUnboxAndAtomize + result_type: WordSized + operands: + object: WordSized + mir_op: LoadFixedSlotAndUnbox + +- name: LoadDynamicSlotUnboxAndAtomize + result_type: WordSized + operands: + slots: WordSized + mir_op: LoadDynamicSlotAndUnbox + +- name: AddAndStoreSlot + operands: + object: WordSized + value: BoxedValue + num_temps: 1 + mir_op: true + +- name: AllocateAndStoreSlot + operands: + object: WordSized + value: BoxedValue + num_temps: 2 + call_instruction: true + mir_op: true + +- name: AddSlotAndCallAddPropHook + operands: + object: WordSized + value: BoxedValue + call_instruction: true + mir_op: true + +# Store a boxed value to an object's fixed slot. +- name: StoreFixedSlotV + operands: + obj: WordSized + value: BoxedValue + mir_op: StoreFixedSlot + +# Store a typed value to an object's fixed slot. +- name: StoreFixedSlotT + operands: + obj: WordSized + value: WordSized + mir_op: StoreFixedSlot + +# Note, Name ICs always return a Value. There are no V/T variants. +- name: GetNameCache + result_type: BoxedValue + operands: + envObj: WordSized + num_temps: 1 + mir_op: true + +- name: CallGetIntrinsicValue + result_type: BoxedValue + call_instruction: true + mir_op: true + +- name: GetPropSuperCache + result_type: BoxedValue + operands: + obj: WordSized + receiver: BoxedValue + id: BoxedValue + mir_op: true + +# Patchable jump to stubs generated for a GetProperty cache, which loads a +# boxed value. +- name: GetPropertyCache + result_type: BoxedValue + operands: + value: BoxedValue + id: BoxedValue + mir_op: true + +- name: BindNameCache + result_type: WordSized + operands: + environmentChain: WordSized + num_temps: 1 + mir_op: true + +- name: CallBindVar + result_type: WordSized + operands: + environmentChain: WordSized + mir_op: true + +# Load a value from an object's dslots or a slots vector. +- name: LoadDynamicSlotV + result_type: BoxedValue + operands: + in: WordSized + mir_op: LoadDynamicSlot + +# Load a value from an object's dslots or a slots vector. +# If it is a non-atom string, atomize it and update the slot. +- name: LoadDynamicSlotAndAtomize + result_type: BoxedValue + operands: + in: WordSized + num_temps: 1 + mir_op: LoadDynamicSlot + +# Store a value to an object's dslots or a slots vector. +- name: StoreDynamicSlotV + operands: + slots: WordSized + value: BoxedValue + mir_op: StoreDynamicSlot + +# Store a typed value to an object's dslots or a slots vector. This has a +# few advantages over LStoreDynamicSlotV: +# 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 + +- name: OptimizeGetIteratorCache + result_type: WordSized + operands: + value: BoxedValue + 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: 4 + 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: GuardFuse + 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: SmallObjectVariableKeyHasProp + result_type: WordSized + operands: + id: WordSized + num_temps: 0 + mir_op: true + +- name: GuardIsNotArrayBufferMaybeShared + operands: + object: WordSized + num_temps: 1 + +- name: GuardIsTypedArray + operands: + object: WordSized + num_temps: 1 + +- name: GuardIsFixedLengthTypedArray + operands: + object: WordSized + num_temps: 1 + +- name: GuardHasProxyHandler + operands: + object: WordSized + mir_op: true + +- 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: WasmBoundsCheckRange32 + result_type: WordSized + operands: + index: WordSized + length: WordSized + limit: WordSized + mir_op: true + num_temps: 1 + +- 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: WasmHeapReg + result_type: 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: WasmLoadElement + result_type: WordSized + operands: + base: WordSized + index: WordSized + arguments: + type: MIRType + wideningOp: MWideningOp + scale: Scale + maybeTrap: MaybeTrapSiteInfo + num_temps: 1 + +- name: WasmLoadSlotI64 + result_type: Int64 + operands: + containerRef: WordSized + arguments: + offset: size_t + maybeTrap: MaybeTrapSiteInfo + +- name: WasmLoadElementI64 + result_type: Int64 + operands: + base: WordSized + index: WordSized + arguments: + 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: WasmStoreElement + operands: + base: WordSized + index: WordSized + value: WordSized + arguments: + type: MIRType + narrowingOp: MNarrowingOp + scale: Scale + maybeTrap: MaybeTrapSiteInfo + num_temps: 1 + +- name: WasmStoreElementI64 + operands: + base: WordSized + index: WordSized + value: Int64 + arguments: + maybeTrap: MaybeTrapSiteInfo + +- name: WasmStoreElementRef + operands: + instance: WordSized + base: WordSized + index: WordSized + value: WordSized + arguments: + maybeTrap: MaybeTrapSiteInfo + preBarrierKind: WasmPreBarrierKind + num_temps: 2 + +- 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: WasmPostWriteBarrierImmediate + operands: + instance: WordSized + object: WordSized + valueBase: WordSized + value: WordSized + arguments: + valueOffset: uint32_t + num_temps: 1 + mir_op: true + +# Ditto, but with a scaled index instead of a constant offset. +- name: WasmPostWriteBarrierIndex + operands: + instance: WordSized + object: WordSized + valueBase: WordSized + index: WordSized + value: WordSized + arguments: + elemSize: 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 + value: BoxedValue + call_instruction: true + mir_op: true + +- name: AsyncReject + result_type: WordSized + operands: + generator: WordSized + reason: BoxedValue + stack: 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: WasmAnyRefFromJSValue + result_type: WordSized + operands: + input: BoxedValue + num_temps: 1 + +- name: WasmAnyRefFromJSObject + result_type: WordSized + operands: + input: WordSized + +- name: WasmAnyRefFromJSString + result_type: WordSized + operands: + input: WordSized + +- name: WasmNewI31Ref + mir_op: true + result_type: WordSized + operands: + value: WordSized + +- name: WasmI31RefGet + mir_op: true + result_type: WordSized + operands: + value: 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 -- cgit v1.2.3