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