| /* |
| * DO NOT EDIT THIS FILE, it is autogenerated. |
| */ |
| |
| "use strict"; |
| |
| let expectedASTDumpedAsLines = [ |
| "if ARMv7k", |
| "", |
| "else", |
| " skip", |
| "end", |
| "if ARMv7s", |
| "", |
| "else", |
| " skip", |
| "end", |
| "const PtrSize = constexpr (sizeof(void*))", |
| "if JSVALUE64", |
| "const CallFrameHeaderSlots = 5", |
| "else", |
| "const CallFrameHeaderSlots = 4", |
| "const CallFrameAlignSlots = 1", |
| "end", |
| "const SlotSize = 8", |
| "const JSEnvironmentRecord_variables = (((sizeof JSEnvironmentRecord + SlotSize) - 1) & (~(SlotSize - 1)))", |
| "const DirectArguments_storage = (((sizeof DirectArguments + SlotSize) - 1) & (~(SlotSize - 1)))", |
| "const StackAlignment = 16", |
| "const StackAlignmentSlots = 2", |
| "const StackAlignmentMask = (StackAlignment - 1)", |
| "const CallerFrameAndPCSize = (2 * PtrSize)", |
| "const CallerFrame = 0", |
| "const ReturnPC = (CallerFrame + PtrSize)", |
| "const CodeBlock = (ReturnPC + PtrSize)", |
| "const Callee = (CodeBlock + SlotSize)", |
| "const ArgumentCount = (Callee + SlotSize)", |
| "const ThisArgumentOffset = (ArgumentCount + SlotSize)", |
| "const FirstArgumentOffset = (ThisArgumentOffset + SlotSize)", |
| "const CallFrameHeaderSize = ThisArgumentOffset", |
| "if JSVALUE64", |
| "const TagBitTypeOther = 2", |
| "const TagBitBool = 4", |
| "const TagBitUndefined = 8", |
| "const ValueEmpty = 0", |
| "const ValueFalse = (TagBitTypeOther | TagBitBool)", |
| "const ValueTrue = ((TagBitTypeOther | TagBitBool) | 1)", |
| "const ValueUndefined = (TagBitTypeOther | TagBitUndefined)", |
| "const ValueNull = TagBitTypeOther", |
| "const TagTypeNumber = 18446462598732840000", |
| "const TagMask = (TagTypeNumber | TagBitTypeOther)", |
| "else", |
| "const Int32Tag = (-1)", |
| "const BooleanTag = (-2)", |
| "const NullTag = (-3)", |
| "const UndefinedTag = (-4)", |
| "const CellTag = (-5)", |
| "const EmptyValueTag = (-6)", |
| "const DeletedValueTag = (-7)", |
| "const LowestTag = DeletedValueTag", |
| "end", |
| "const PutByIdPrimaryTypeMask = constexpr (PutByIdPrimaryTypeMask)", |
| "const PutByIdPrimaryTypeSecondary = constexpr (PutByIdPrimaryTypeSecondary)", |
| "const PutByIdPrimaryTypeObjectWithStructure = constexpr (PutByIdPrimaryTypeObjectWithStructure)", |
| "const PutByIdPrimaryTypeObjectWithStructureOrOther = constexpr (PutByIdPrimaryTypeObjectWithStructureOrOther)", |
| "const PutByIdSecondaryTypeMask = constexpr (PutByIdSecondaryTypeMask)", |
| "const PutByIdSecondaryTypeBottom = constexpr (PutByIdSecondaryTypeBottom)", |
| "const PutByIdSecondaryTypeBoolean = constexpr (PutByIdSecondaryTypeBoolean)", |
| "const PutByIdSecondaryTypeOther = constexpr (PutByIdSecondaryTypeOther)", |
| "const PutByIdSecondaryTypeInt32 = constexpr (PutByIdSecondaryTypeInt32)", |
| "const PutByIdSecondaryTypeNumber = constexpr (PutByIdSecondaryTypeNumber)", |
| "const PutByIdSecondaryTypeString = constexpr (PutByIdSecondaryTypeString)", |
| "const PutByIdSecondaryTypeSymbol = constexpr (PutByIdSecondaryTypeSymbol)", |
| "const PutByIdSecondaryTypeObject = constexpr (PutByIdSecondaryTypeObject)", |
| "const PutByIdSecondaryTypeObjectOrOther = constexpr (PutByIdSecondaryTypeObjectOrOther)", |
| "const PutByIdSecondaryTypeTop = constexpr (PutByIdSecondaryTypeTop)", |
| "const CallOpCodeSize = 9", |
| "if ((X86_64 or ARM64) or C_LOOP)", |
| "const maxFrameExtentForSlowPathCall = 0", |
| "else", |
| "if ((ARM or ARMv7_TRADITIONAL) or ARMv7)", |
| "const maxFrameExtentForSlowPathCall = 24", |
| "else", |
| "if (X86 or X86_WIN)", |
| "const maxFrameExtentForSlowPathCall = 40", |
| "else", |
| "if MIPS", |
| "const maxFrameExtentForSlowPathCall = 40", |
| "else", |
| "if X86_64_WIN", |
| "const maxFrameExtentForSlowPathCall = 64", |
| "else", |
| " skip", |
| "end", |
| "end", |
| "end", |
| "end", |
| "end", |
| "if ((X86_64 or X86_64_WIN) or ARM64)", |
| "const CalleeSaveSpaceAsVirtualRegisters = 3", |
| "else", |
| "const CalleeSaveSpaceAsVirtualRegisters = 0", |
| "end", |
| "const CalleeSaveSpaceStackAligned = ((((CalleeSaveSpaceAsVirtualRegisters * SlotSize) + StackAlignment) - 1) & (~StackAlignmentMask))", |
| "const ClearWatchpoint = constexpr (ClearWatchpoint)", |
| "const IsWatched = constexpr (IsWatched)", |
| "const IsInvalidated = constexpr (IsInvalidated)", |
| "const ShadowChickenTailMarker = constexpr (ShadowChicken::Packet::tailMarkerValue)", |
| "const ArithProfileInt = 1048576", |
| "const ArithProfileIntInt = 1179648", |
| "const ArithProfileNumber = 2097152", |
| "const ArithProfileNumberInt = 2228224", |
| "const ArithProfileNumberNumber = 2359296", |
| "const ArithProfileIntNumber = 1310720", |
| "if JSVALUE64", |
| "const PC = t4", |
| "if ARM64", |
| "const PB = csr7", |
| "const tagTypeNumber = csr8", |
| "const tagMask = csr9", |
| "else", |
| "if X86_64", |
| "const PB = csr2", |
| "const tagTypeNumber = csr3", |
| "const tagMask = csr4", |
| "else", |
| "if X86_64_WIN", |
| "const PB = csr4", |
| "const tagTypeNumber = csr5", |
| "const tagMask = csr6", |
| "else", |
| "if C_LOOP", |
| "const PB = csr0", |
| "const tagTypeNumber = csr1", |
| "const tagMask = csr2", |
| "else", |
| " skip", |
| "end", |
| "end", |
| "end", |
| "end", |
| "macro loadisFromInstruction(offset, dest)", |
| " loadis (offset * 8)[PB, PC, 8], dest", |
| "end", |
| "macro loadpFromInstruction(offset, dest)", |
| " loadp (offset * 8)[PB, PC, 8], dest", |
| "end", |
| "macro storeisToInstruction(value, offset)", |
| " storei value, (offset * 8)[PB, PC, 8]", |
| "end", |
| "macro storepToInstruction(value, offset)", |
| " storep value, (offset * 8)[PB, PC, 8]", |
| "end", |
| "else", |
| "const PC = t4", |
| "macro loadisFromInstruction(offset, dest)", |
| " loadis (offset * 4)[PC], dest", |
| "end", |
| "macro loadpFromInstruction(offset, dest)", |
| " loadp (offset * 4)[PC], dest", |
| "end", |
| "macro storeisToInstruction(value, offset)", |
| " storei value, (offset * 4)[PC]", |
| "end", |
| "end", |
| "if X86_64_WIN", |
| "const extraTempReg = t0", |
| "else", |
| "const extraTempReg = t5", |
| "end", |
| "if BIG_ENDIAN", |
| "const TagOffset = 0", |
| "const PayloadOffset = 4", |
| "else", |
| "const TagOffset = 4", |
| "const PayloadOffset = 0", |
| "end", |
| "const IsArray = constexpr (IsArray)", |
| "const IndexingShapeMask = constexpr (IndexingShapeMask)", |
| "const NoIndexingShape = constexpr (NoIndexingShape)", |
| "const Int32Shape = constexpr (Int32Shape)", |
| "const DoubleShape = constexpr (DoubleShape)", |
| "const ContiguousShape = constexpr (ContiguousShape)", |
| "const ArrayStorageShape = constexpr (ArrayStorageShape)", |
| "const SlowPutArrayStorageShape = constexpr (SlowPutArrayStorageShape)", |
| "const StringType = constexpr (StringType)", |
| "const SymbolType = constexpr (SymbolType)", |
| "const ObjectType = constexpr (ObjectType)", |
| "const FinalObjectType = constexpr (FinalObjectType)", |
| "const JSFunctionType = constexpr (JSFunctionType)", |
| "const ArrayType = constexpr (ArrayType)", |
| "const DerivedArrayType = constexpr (DerivedArrayType)", |
| "const ProxyObjectType = constexpr (ProxyObjectType)", |
| "const Int8ArrayType = constexpr (Int8ArrayType)", |
| "const Int16ArrayType = constexpr (Int16ArrayType)", |
| "const Int32ArrayType = constexpr (Int32ArrayType)", |
| "const Uint8ArrayType = constexpr (Uint8ArrayType)", |
| "const Uint8ClampedArrayType = constexpr (Uint8ClampedArrayType)", |
| "const Uint16ArrayType = constexpr (Uint16ArrayType)", |
| "const Uint32ArrayType = constexpr (Uint32ArrayType)", |
| "const Float32ArrayType = constexpr (Float32ArrayType)", |
| "const Float64ArrayType = constexpr (Float64ArrayType)", |
| "const FirstArrayType = Int8ArrayType", |
| "const LastArrayType = Float64ArrayType", |
| "const MasqueradesAsUndefined = constexpr (MasqueradesAsUndefined)", |
| "const ImplementsDefaultHasInstance = constexpr (ImplementsDefaultHasInstance)", |
| "const FirstConstantRegisterIndex = constexpr (FirstConstantRegisterIndex)", |
| "const GlobalCode = constexpr (GlobalCode)", |
| "const EvalCode = constexpr (EvalCode)", |
| "const FunctionCode = constexpr (FunctionCode)", |
| "const ModuleCode = constexpr (ModuleCode)", |
| "const LLIntReturnPC = (ArgumentCount + TagOffset)", |
| "const HashFlags8BitBuffer = 8", |
| "const firstOutOfLineOffset = 100", |
| "const GlobalProperty = constexpr (GlobalProperty)", |
| "const GlobalVar = constexpr (GlobalVar)", |
| "const GlobalLexicalVar = constexpr (GlobalLexicalVar)", |
| "const ClosureVar = constexpr (ClosureVar)", |
| "const LocalClosureVar = constexpr (LocalClosureVar)", |
| "const ModuleVar = constexpr (ModuleVar)", |
| "const GlobalPropertyWithVarInjectionChecks = constexpr (GlobalPropertyWithVarInjectionChecks)", |
| "const GlobalVarWithVarInjectionChecks = constexpr (GlobalVarWithVarInjectionChecks)", |
| "const GlobalLexicalVarWithVarInjectionChecks = constexpr (GlobalLexicalVarWithVarInjectionChecks)", |
| "const ClosureVarWithVarInjectionChecks = constexpr (ClosureVarWithVarInjectionChecks)", |
| "const ResolveTypeMask = constexpr (GetPutInfo::typeBits)", |
| "const InitializationModeMask = constexpr (GetPutInfo::initializationBits)", |
| "const InitializationModeShift = constexpr (GetPutInfo::initializationShift)", |
| "const NotInitialization = constexpr (InitializationMode::NotInitialization)", |
| "const MarkedBlockSize = constexpr (MarkedBlock::blockSize)", |
| "const MarkedBlockMask = (~(MarkedBlockSize - 1))", |
| "const BlackThreshold = constexpr (blackThreshold)", |
| "if JSVALUE64", |
| "const JSFinalObjectSizeClassIndex = 1", |
| "else", |
| "const JSFinalObjectSizeClassIndex = 3", |
| "end", |
| "const VectorBufferOffset = 0", |
| "if JSVALUE64", |
| "const VectorSizeOffset = 12", |
| "else", |
| "const VectorSizeOffset = 8", |
| "end", |
| "macro crash()", |
| "if C_LOOP", |
| " cloopCrash ", |
| "else", |
| " call _llint_crash", |
| "end", |
| "end", |
| "macro assert(assertion)", |
| "if ASSERT_ENABLED", |
| " assertion(.ok)", |
| " crash()", |
| ".ok:", |
| "else", |
| " skip", |
| "end", |
| "end", |
| "if X86_64", |
| "macro probe(action)", |
| " push a0, a1", |
| " push a2, a3", |
| " push t0, t1", |
| " push t2, t3", |
| " push t4, t5", |
| " action()", |
| " pop t5, t4", |
| " pop t3, t2", |
| " pop t1, t0", |
| " pop a3, a2", |
| " pop a1, a0", |
| "end", |
| "else", |
| " skip", |
| "end", |
| "macro checkStackPointerAlignment(tempReg, location)", |
| "if (ARM64 or C_LOOP)", |
| "", |
| "else", |
| "if ((ARM or ARMv7) or ARMv7_TRADITIONAL)", |
| " move sp, tempReg", |
| " andp StackAlignmentMask, tempReg", |
| "else", |
| " andp sp, StackAlignmentMask, tempReg", |
| "end", |
| " btpz tempReg, .stackPointerOkay", |
| " move location, tempReg", |
| " break ", |
| ".stackPointerOkay:", |
| "end", |
| "end", |
| "if (((C_LOOP or ARM64) or X86_64) or X86_64_WIN)", |
| "const CalleeSaveRegisterCount = 0", |
| "else", |
| "if ((ARM or ARMv7_TRADITIONAL) or ARMv7)", |
| "const CalleeSaveRegisterCount = 7", |
| "else", |
| "if MIPS", |
| "const CalleeSaveRegisterCount = 1", |
| "else", |
| "if (X86 or X86_WIN)", |
| "const CalleeSaveRegisterCount = 3", |
| "else", |
| " skip", |
| "end", |
| "end", |
| "end", |
| "end", |
| "const CalleeRegisterSaveSize = (CalleeSaveRegisterCount * PtrSize)", |
| "const VMEntryTotalFrameSize = ((((CalleeRegisterSaveSize + sizeof VMEntryRecord) + StackAlignment) - 1) & (~StackAlignmentMask))", |
| "macro pushCalleeSaves()", |
| "if (((C_LOOP or ARM64) or X86_64) or X86_64_WIN)", |
| "", |
| "else", |
| "if (ARM or ARMv7_TRADITIONAL)", |
| " emit \"push {r4-r10}\"", |
| "else", |
| "if ARMv7", |
| " emit \"push {r4-r6, r8-r11}\"", |
| "else", |
| "if MIPS", |
| " emit \"addiu $sp, $sp, -4\"", |
| " emit \"sw $s4, 0($sp)\"", |
| " emit \"move $s4, $gp\"", |
| "else", |
| "if X86", |
| " emit \"push %esi\"", |
| " emit \"push %edi\"", |
| " emit \"push %ebx\"", |
| "else", |
| "if X86_WIN", |
| " emit \"push esi\"", |
| " emit \"push edi\"", |
| " emit \"push ebx\"", |
| "else", |
| " skip", |
| "end", |
| "end", |
| "end", |
| "end", |
| "end", |
| "end", |
| "end", |
| "macro popCalleeSaves()", |
| "if (((C_LOOP or ARM64) or X86_64) or X86_64_WIN)", |
| "", |
| "else", |
| "if (ARM or ARMv7_TRADITIONAL)", |
| " emit \"pop {r4-r10}\"", |
| "else", |
| "if ARMv7", |
| " emit \"pop {r4-r6, r8-r11}\"", |
| "else", |
| "if MIPS", |
| " emit \"lw $s4, 0($sp)\"", |
| " emit \"addiu $sp, $sp, 4\"", |
| "else", |
| "if X86", |
| " emit \"pop %ebx\"", |
| " emit \"pop %edi\"", |
| " emit \"pop %esi\"", |
| "else", |
| "if X86_WIN", |
| " emit \"pop ebx\"", |
| " emit \"pop edi\"", |
| " emit \"pop esi\"", |
| "else", |
| " skip", |
| "end", |
| "end", |
| "end", |
| "end", |
| "end", |
| "end", |
| "end", |
| "macro preserveCallerPCAndCFR()", |
| "if ((((C_LOOP or ARM) or ARMv7) or ARMv7_TRADITIONAL) or MIPS)", |
| " push lr", |
| " push cfr", |
| "else", |
| "if (((X86 or X86_WIN) or X86_64) or X86_64_WIN)", |
| " push cfr", |
| "else", |
| "if ARM64", |
| " push cfr, lr", |
| "else", |
| " error", |
| "end", |
| "end", |
| "end", |
| " move sp, cfr", |
| "end", |
| "macro restoreCallerPCAndCFR()", |
| " move cfr, sp", |
| "if ((((C_LOOP or ARM) or ARMv7) or ARMv7_TRADITIONAL) or MIPS)", |
| " pop cfr", |
| " pop lr", |
| "else", |
| "if (((X86 or X86_WIN) or X86_64) or X86_64_WIN)", |
| " pop cfr", |
| "else", |
| "if ARM64", |
| " pop lr, cfr", |
| "else", |
| " skip", |
| "end", |
| "end", |
| "end", |
| "end", |
| "macro preserveCalleeSavesUsedByLLInt()", |
| " subp CalleeSaveSpaceStackAligned, sp", |
| "if C_LOOP", |
| "", |
| "else", |
| "if (ARM or ARMv7_TRADITIONAL)", |
| "", |
| "else", |
| "if ARMv7", |
| "", |
| "else", |
| "if ARM64", |
| " emit \"stp x27, x28, [x29, #-16]\"", |
| " emit \"stp xzr, x26, [x29, #-32]\"", |
| "else", |
| "if MIPS", |
| "", |
| "else", |
| "if X86", |
| "", |
| "else", |
| "if X86_WIN", |
| "", |
| "else", |
| "if X86_64", |
| " storep csr4, (-8)[cfr]", |
| " storep csr3, (-16)[cfr]", |
| " storep csr2, (-24)[cfr]", |
| "else", |
| "if X86_64_WIN", |
| " storep csr6, (-8)[cfr]", |
| " storep csr5, (-16)[cfr]", |
| " storep csr4, (-24)[cfr]", |
| "else", |
| " skip", |
| "end", |
| "end", |
| "end", |
| "end", |
| "end", |
| "end", |
| "end", |
| "end", |
| "end", |
| "end", |
| "macro restoreCalleeSavesUsedByLLInt()", |
| "if C_LOOP", |
| "", |
| "else", |
| "if (ARM or ARMv7_TRADITIONAL)", |
| "", |
| "else", |
| "if ARMv7", |
| "", |
| "else", |
| "if ARM64", |
| " emit \"ldp xzr, x26, [x29, #-32]\"", |
| " emit \"ldp x27, x28, [x29, #-16]\"", |
| "else", |
| "if MIPS", |
| "", |
| "else", |
| "if X86", |
| "", |
| "else", |
| "if X86_WIN", |
| "", |
| "else", |
| "if X86_64", |
| " loadp (-24)[cfr], csr2", |
| " loadp (-16)[cfr], csr3", |
| " loadp (-8)[cfr], csr4", |
| "else", |
| "if X86_64_WIN", |
| " loadp (-24)[cfr], csr4", |
| " loadp (-16)[cfr], csr5", |
| " loadp (-8)[cfr], csr6", |
| "else", |
| " skip", |
| "end", |
| "end", |
| "end", |
| "end", |
| "end", |
| "end", |
| "end", |
| "end", |
| "end", |
| "end", |
| "macro copyCalleeSavesToVMEntryFrameCalleeSavesBuffer(vm, temp)", |
| "if ((ARM64 or X86_64) or X86_64_WIN)", |
| " loadp VM::topVMEntryFrame[vm], temp", |
| " vmEntryRecord(temp, temp)", |
| " leap VMEntryRecord::calleeSaveRegistersBuffer[temp], temp", |
| "if ARM64", |
| " storep csr0, 0[temp]", |
| " storep csr1, 8[temp]", |
| " storep csr2, 16[temp]", |
| " storep csr3, 24[temp]", |
| " storep csr4, 32[temp]", |
| " storep csr5, 40[temp]", |
| " storep csr6, 48[temp]", |
| " storep csr7, 56[temp]", |
| " storep csr8, 64[temp]", |
| " storep csr9, 72[temp]", |
| " stored csfr0, 80[temp]", |
| " stored csfr1, 88[temp]", |
| " stored csfr2, 96[temp]", |
| " stored csfr3, 104[temp]", |
| " stored csfr4, 112[temp]", |
| " stored csfr5, 120[temp]", |
| " stored csfr6, 128[temp]", |
| " stored csfr7, 136[temp]", |
| "else", |
| "if X86_64", |
| " storep csr0, 0[temp]", |
| " storep csr1, 8[temp]", |
| " storep csr2, 16[temp]", |
| " storep csr3, 24[temp]", |
| " storep csr4, 32[temp]", |
| "else", |
| "if X86_64_WIN", |
| " storep csr0, 0[temp]", |
| " storep csr1, 8[temp]", |
| " storep csr2, 16[temp]", |
| " storep csr3, 24[temp]", |
| " storep csr4, 32[temp]", |
| " storep csr5, 40[temp]", |
| " storep csr6, 48[temp]", |
| "else", |
| " skip", |
| "end", |
| "end", |
| "end", |
| "else", |
| " skip", |
| "end", |
| "end", |
| "macro restoreCalleeSavesFromVMEntryFrameCalleeSavesBuffer(vm, temp)", |
| "if ((ARM64 or X86_64) or X86_64_WIN)", |
| " loadp VM::topVMEntryFrame[vm], temp", |
| " vmEntryRecord(temp, temp)", |
| " leap VMEntryRecord::calleeSaveRegistersBuffer[temp], temp", |
| "if ARM64", |
| " loadp 0[temp], csr0", |
| " loadp 8[temp], csr1", |
| " loadp 16[temp], csr2", |
| " loadp 24[temp], csr3", |
| " loadp 32[temp], csr4", |
| " loadp 40[temp], csr5", |
| " loadp 48[temp], csr6", |
| " loadp 56[temp], csr7", |
| " loadp 64[temp], csr8", |
| " loadp 72[temp], csr9", |
| " loadd 80[temp], csfr0", |
| " loadd 88[temp], csfr1", |
| " loadd 96[temp], csfr2", |
| " loadd 104[temp], csfr3", |
| " loadd 112[temp], csfr4", |
| " loadd 120[temp], csfr5", |
| " loadd 128[temp], csfr6", |
| " loadd 136[temp], csfr7", |
| "else", |
| "if X86_64", |
| " loadp 0[temp], csr0", |
| " loadp 8[temp], csr1", |
| " loadp 16[temp], csr2", |
| " loadp 24[temp], csr3", |
| " loadp 32[temp], csr4", |
| "else", |
| "if X86_64_WIN", |
| " loadp 0[temp], csr0", |
| " loadp 8[temp], csr1", |
| " loadp 16[temp], csr2", |
| " loadp 24[temp], csr3", |
| " loadp 32[temp], csr4", |
| " loadp 40[temp], csr5", |
| " loadp 48[temp], csr6", |
| "else", |
| " skip", |
| "end", |
| "end", |
| "end", |
| "else", |
| " skip", |
| "end", |
| "end", |
| "macro preserveReturnAddressAfterCall(destinationRegister)", |
| "if (((((C_LOOP or ARM) or ARMv7) or ARMv7_TRADITIONAL) or ARM64) or MIPS)", |
| " move lr, destinationRegister", |
| "else", |
| "if (((X86 or X86_WIN) or X86_64) or X86_64_WIN)", |
| " pop destinationRegister", |
| "else", |
| " error", |
| "end", |
| "end", |
| "end", |
| "macro functionPrologue()", |
| "if (((X86 or X86_WIN) or X86_64) or X86_64_WIN)", |
| " push cfr", |
| "else", |
| "if ARM64", |
| " push cfr, lr", |
| "else", |
| "if ((((C_LOOP or ARM) or ARMv7) or ARMv7_TRADITIONAL) or MIPS)", |
| " push lr", |
| " push cfr", |
| "else", |
| " skip", |
| "end", |
| "end", |
| "end", |
| " move sp, cfr", |
| "end", |
| "macro functionEpilogue()", |
| "if (((X86 or X86_WIN) or X86_64) or X86_64_WIN)", |
| " pop cfr", |
| "else", |
| "if ARM64", |
| " pop lr, cfr", |
| "else", |
| "if ((((C_LOOP or ARM) or ARMv7) or ARMv7_TRADITIONAL) or MIPS)", |
| " pop cfr", |
| " pop lr", |
| "else", |
| " skip", |
| "end", |
| "end", |
| "end", |
| "end", |
| "macro vmEntryRecord(entryFramePointer, resultReg)", |
| " subp entryFramePointer, VMEntryTotalFrameSize, resultReg", |
| "end", |
| "macro getFrameRegisterSizeForCodeBlock(codeBlock, size)", |
| " loadi CodeBlock::m_numCalleeLocals[codeBlock], size", |
| " lshiftp 3, size", |
| " addp maxFrameExtentForSlowPathCall, size", |
| "end", |
| "macro restoreStackPointerAfterCall()", |
| " loadp CodeBlock[cfr], t2", |
| " getFrameRegisterSizeForCodeBlock(t2, t2)", |
| "if ARMv7", |
| " subp cfr, t2, t2", |
| " move t2, sp", |
| "else", |
| " subp cfr, t2, sp", |
| "end", |
| "end", |
| "macro traceExecution()", |
| "if COLLECT_STATS", |
| " callSlowPath(_llint_count_opcode)", |
| "else", |
| " skip", |
| "end", |
| "if EXECUTION_TRACING", |
| " callSlowPath(_llint_trace)", |
| "else", |
| " skip", |
| "end", |
| "end", |
| "macro traceSlowPathExecution()", |
| "if COLLECT_STATS", |
| " callSlowPath(_llint_count_opcode_slow_path)", |
| "else", |
| " skip", |
| "end", |
| "end", |
| "macro callOpcodeSlowPath(slowPath)", |
| " traceSlowPathExecution()", |
| " callSlowPath(slowPath)", |
| "end", |
| "macro callTargetFunction(callee)", |
| "if C_LOOP", |
| " cloopCallJSFunction callee", |
| "else", |
| " call callee", |
| "end", |
| " restoreStackPointerAfterCall()", |
| " dispatchAfterCall()", |
| "end", |
| "macro prepareForRegularCall(callee, temp1, temp2, temp3)", |
| " addp CallerFrameAndPCSize, sp", |
| "end", |
| "macro prepareForTailCall(callee, temp1, temp2, temp3)", |
| " restoreCalleeSavesUsedByLLInt()", |
| " loadi (PayloadOffset + ArgumentCount)[cfr], temp2", |
| " loadp CodeBlock[cfr], temp1", |
| " loadp CodeBlock::m_numParameters[temp1], temp1", |
| " bilteq temp1, temp2, .noArityFixup", |
| " move temp1, temp2", |
| ".noArityFixup:", |
| " muli SlotSize, temp2", |
| " addi ((StackAlignment - 1) + CallFrameHeaderSize), temp2", |
| " andi (~StackAlignmentMask), temp2", |
| " move cfr, temp1", |
| " addp temp2, temp1", |
| " loadi (PayloadOffset + ArgumentCount)[sp], temp2", |
| " muli SlotSize, temp2", |
| " addi ((StackAlignment - 1) + CallFrameHeaderSize), temp2", |
| " andi (~StackAlignmentMask), temp2", |
| "if (((((ARM or ARMv7_TRADITIONAL) or ARMv7) or ARM64) or C_LOOP) or MIPS)", |
| " addp (2 * PtrSize), sp", |
| " subi (2 * PtrSize), temp2", |
| " loadp PtrSize[cfr], lr", |
| "else", |
| " addp PtrSize, sp", |
| " subi PtrSize, temp2", |
| " loadp PtrSize[cfr], temp3", |
| " storep temp3, 0[sp]", |
| "end", |
| " subp temp2, temp1", |
| " loadp 0[cfr], cfr", |
| ".copyLoop:", |
| " subi PtrSize, temp2", |
| " loadp 0[sp, temp2, 1], temp3", |
| " storep temp3, 0[temp1, temp2, 1]", |
| " btinz temp2, .copyLoop", |
| " move temp1, sp", |
| " jmp callee", |
| "end", |
| "macro slowPathForCall(slowPath, prepareCall)", |
| " traceSlowPathExecution()", |
| " callCallSlowPath(slowPath, macro (callee, calleeFramePtr)", |
| " btpz calleeFramePtr, .dontUpdateSP", |
| " move calleeFramePtr, sp", |
| " prepareCall(callee, t2, t3, t4)", |
| ".dontUpdateSP:", |
| " callTargetFunction(callee)", |
| "end)", |
| "end", |
| "macro arrayProfile(cellAndIndexingType, profile, scratch)", |
| "const cell = cellAndIndexingType", |
| "const indexingType = cellAndIndexingType", |
| " loadi JSCell::m_structureID[cell], scratch", |
| " storei scratch, ArrayProfile::m_lastSeenStructureID[profile]", |
| " loadb JSCell::m_indexingTypeAndMisc[cell], indexingType", |
| "end", |
| "macro skipIfIsRememberedOrInEden(cell, slowPath)", |
| " memfence ", |
| " bba JSCell::m_cellState[cell], BlackThreshold, .done", |
| " slowPath()", |
| ".done:", |
| "end", |
| "macro notifyWrite(set, slow)", |
| " bbneq WatchpointSet::m_state[set], IsInvalidated, slow", |
| "end", |
| "macro checkSwitchToJIT(increment, action)", |
| " loadp CodeBlock[cfr], t0", |
| " baddis increment, (CodeBlock::m_llintExecuteCounter + BaselineExecutionCounter::m_counter)[t0], .continue", |
| " action()", |
| ".continue:", |
| "end", |
| "macro checkSwitchToJITForEpilogue()", |
| " checkSwitchToJIT(10, macro ()", |
| " callOpcodeSlowPath(_llint_replace)", |
| "end)", |
| "end", |
| "macro assertNotConstant(index)", |
| " assert(macro (ok)", |
| " bilt index, FirstConstantRegisterIndex, ok", |
| "end)", |
| "end", |
| "macro functionForCallCodeBlockGetter(targetRegister)", |
| "if JSVALUE64", |
| " loadp Callee[cfr], targetRegister", |
| "else", |
| " loadp (Callee + PayloadOffset)[cfr], targetRegister", |
| "end", |
| " loadp JSFunction::m_executable[targetRegister], targetRegister", |
| " loadp FunctionExecutable::m_codeBlockForCall[targetRegister], targetRegister", |
| "end", |
| "macro functionForConstructCodeBlockGetter(targetRegister)", |
| "if JSVALUE64", |
| " loadp Callee[cfr], targetRegister", |
| "else", |
| " loadp (Callee + PayloadOffset)[cfr], targetRegister", |
| "end", |
| " loadp JSFunction::m_executable[targetRegister], targetRegister", |
| " loadp FunctionExecutable::m_codeBlockForConstruct[targetRegister], targetRegister", |
| "end", |
| "macro notFunctionCodeBlockGetter(targetRegister)", |
| " loadp CodeBlock[cfr], targetRegister", |
| "end", |
| "macro functionCodeBlockSetter(sourceRegister)", |
| " storep sourceRegister, CodeBlock[cfr]", |
| "end", |
| "macro notFunctionCodeBlockSetter(sourceRegister)", |
| "", |
| "end", |
| "macro prologue(codeBlockGetter, codeBlockSetter, osrSlowPath, traceSlowPath)", |
| " preserveCallerPCAndCFR()", |
| "if EXECUTION_TRACING", |
| " subp maxFrameExtentForSlowPathCall, sp", |
| " callSlowPath(traceSlowPath)", |
| " addp maxFrameExtentForSlowPathCall, sp", |
| "else", |
| " skip", |
| "end", |
| " codeBlockGetter(t1)", |
| "if (notC_LOOP)", |
| " baddis 5, (CodeBlock::m_llintExecuteCounter + BaselineExecutionCounter::m_counter)[t1], .continue", |
| "if JSVALUE64", |
| " move cfr, a0", |
| " move PC, a1", |
| " cCall2(osrSlowPath)", |
| "else", |
| " subp 8, sp", |
| " move cfr, a0", |
| " move PC, a1", |
| " cCall2(osrSlowPath)", |
| " addp 8, sp", |
| "end", |
| " btpz r0, .recover", |
| " move cfr, sp", |
| "if ARM64", |
| " pop lr, cfr", |
| "else", |
| "if (((ARM or ARMv7) or ARMv7_TRADITIONAL) or MIPS)", |
| " pop cfr", |
| " pop lr", |
| "else", |
| " pop cfr", |
| "end", |
| "end", |
| " jmp r0", |
| ".recover:", |
| " codeBlockGetter(t1)", |
| ".continue:", |
| "else", |
| " skip", |
| "end", |
| " codeBlockSetter(t1)", |
| " preserveCalleeSavesUsedByLLInt()", |
| "if JSVALUE64", |
| " loadp CodeBlock::m_instructions[t1], PB", |
| " move 0, PC", |
| "else", |
| " loadp CodeBlock::m_instructions[t1], PC", |
| "end", |
| " getFrameRegisterSizeForCodeBlock(t1, t0)", |
| " subp cfr, t0, t0", |
| " bpa t0, cfr, .needStackCheck", |
| " loadp CodeBlock::m_vm[t1], t2", |
| "if C_LOOP", |
| " bpbeq VM::m_cloopStackLimit[t2], t0, .stackHeightOK", |
| "else", |
| " bpbeq VM::m_softStackLimit[t2], t0, .stackHeightOK", |
| "end", |
| ".needStackCheck:", |
| " subp maxFrameExtentForSlowPathCall, sp", |
| " callSlowPath(_llint_stack_check)", |
| " bpeq r1, 0, .stackHeightOKGetCodeBlock", |
| " move r1, cfr", |
| " dispatch(0)", |
| ".stackHeightOKGetCodeBlock:", |
| " codeBlockGetter(t1)", |
| " getFrameRegisterSizeForCodeBlock(t1, t0)", |
| " subp cfr, t0, t0", |
| ".stackHeightOK:", |
| " move t0, sp", |
| "if JSVALUE64", |
| " move TagTypeNumber, tagTypeNumber", |
| " addp TagBitTypeOther, tagTypeNumber, tagMask", |
| "else", |
| " skip", |
| "end", |
| "end", |
| "macro functionInitialization(profileArgSkip)", |
| " loadi CodeBlock::m_numParameters[t1], t0", |
| " addp (-profileArgSkip), t0", |
| " assert(macro (ok)", |
| " bpgteq t0, 0, ok", |
| "end)", |
| " btpz t0, .argumentProfileDone", |
| " loadp (CodeBlock::m_argumentValueProfiles + VectorBufferOffset)[t1], t3", |
| " mulp sizeof ValueProfile, t0, t2", |
| " lshiftp 3, t0", |
| " addp t2, t3", |
| ".argumentProfileLoop:", |
| "if JSVALUE64", |
| " loadq ((ThisArgumentOffset - 8) + (profileArgSkip * 8))[cfr, t0, 1], t2", |
| " subp sizeof ValueProfile, t3", |
| " storeq t2, ((profileArgSkip * sizeof ValueProfile) + ValueProfile::m_buckets)[t3]", |
| "else", |
| " loadi (((ThisArgumentOffset + TagOffset) - 8) + (profileArgSkip * 8))[cfr, t0, 1], t2", |
| " subp sizeof ValueProfile, t3", |
| " storei t2, (((profileArgSkip * sizeof ValueProfile) + ValueProfile::m_buckets) + TagOffset)[t3]", |
| " loadi (((ThisArgumentOffset + PayloadOffset) - 8) + (profileArgSkip * 8))[cfr, t0, 1], t2", |
| " storei t2, (((profileArgSkip * sizeof ValueProfile) + ValueProfile::m_buckets) + PayloadOffset)[t3]", |
| "end", |
| " baddpnz (-8), t0, .argumentProfileLoop", |
| ".argumentProfileDone:", |
| "end", |
| "macro doReturn()", |
| " restoreCalleeSavesUsedByLLInt()", |
| " restoreCallerPCAndCFR()", |
| " ret ", |
| "end", |
| "if C_LOOP", |
| "_llint_vm_entry_to_javascript:", |
| "else", |
| "_vmEntryToJavaScript:", |
| "end", |
| " doVMEntry(makeJavaScriptCall)", |
| "if C_LOOP", |
| "_llint_vm_entry_to_native:", |
| "else", |
| "_vmEntryToNative:", |
| "end", |
| " doVMEntry(makeHostFunctionCall)", |
| "if (notC_LOOP)", |
| "_sanitizeStackForVMImpl:", |
| "if (X86 or X86_WIN)", |
| " loadp 4[sp], a0", |
| "else", |
| " skip", |
| "end", |
| "const vm = a0", |
| "const address = a1", |
| "const zeroValue = a2", |
| " loadp VM::m_lastStackTop[vm], address", |
| " bpbeq sp, address, .zeroFillDone", |
| " move 0, zeroValue", |
| ".zeroFillLoop:", |
| " storep zeroValue, 0[address]", |
| " addp PtrSize, address", |
| " bpa sp, address, .zeroFillLoop", |
| ".zeroFillDone:", |
| " move sp, address", |
| " storep address, VM::m_lastStackTop[vm]", |
| " ret ", |
| "_vmEntryRecord:", |
| "if (X86 or X86_WIN)", |
| " loadp 4[sp], a0", |
| "else", |
| " skip", |
| "end", |
| " vmEntryRecord(a0, r0)", |
| " ret ", |
| "else", |
| " skip", |
| "end", |
| "if C_LOOP", |
| "_llint_entry:", |
| " crash()", |
| "else", |
| "macro initPCRelative(pcBase)", |
| "if (((X86_64 or X86_64_WIN) or X86) or X86_WIN)", |
| " call _relativePCBase", |
| "_relativePCBase:", |
| " pop pcBase", |
| "else", |
| "if ARM64", |
| "", |
| "else", |
| "if ARMv7", |
| "_relativePCBase:", |
| " move pc, pcBase", |
| " subp 3, pcBase", |
| "else", |
| "if (ARM or ARMv7_TRADITIONAL)", |
| "_relativePCBase:", |
| " move pc, pcBase", |
| " subp 8, pcBase", |
| "else", |
| "if MIPS", |
| " la _relativePCBase, pcBase", |
| " setcallreg pcBase", |
| "_relativePCBase:", |
| "else", |
| " skip", |
| "end", |
| "end", |
| "end", |
| "end", |
| "end", |
| "end", |
| "macro setEntryAddress(index, label)", |
| "if (X86_64 or X86_64_WIN)", |
| " leap (label - _relativePCBase)[t1], t3", |
| " move index, t4", |
| " storep t3, 0[a0, t4, 8]", |
| "else", |
| "if (X86 or X86_WIN)", |
| " leap (label - _relativePCBase)[t1], t3", |
| " move index, t4", |
| " storep t3, 0[a0, t4, 4]", |
| "else", |
| "if ARM64", |
| " pcrtoaddr label, t1", |
| " move index, t4", |
| " storep t1, 0[a0, t4, 8]", |
| "else", |
| "if ((ARM or ARMv7) or ARMv7_TRADITIONAL)", |
| " mvlbl (label - _relativePCBase), t4", |
| " addp t4, t1, t4", |
| " move index, t3", |
| " storep t4, 0[a0, t3, 4]", |
| "else", |
| "if MIPS", |
| " la label, t4", |
| " la _relativePCBase, t3", |
| " subp t3, t4", |
| " addp t4, t1, t4", |
| " move index, t3", |
| " storep t4, 0[a0, t3, 4]", |
| "else", |
| " skip", |
| "end", |
| "end", |
| "end", |
| "end", |
| "end", |
| "end", |
| "_llint_entry:", |
| " functionPrologue()", |
| " pushCalleeSaves()", |
| "if (X86 or X86_WIN)", |
| " loadp 20[sp], a0", |
| "else", |
| " skip", |
| "end", |
| " initPCRelative(t1)", |
| " setEntryAddress(0, _llint_op_enter)", |
| " setEntryAddress(1, _llint_op_get_scope)", |
| " setEntryAddress(2, _llint_op_create_direct_arguments)", |
| " setEntryAddress(3, _llint_op_create_scoped_arguments)", |
| " setEntryAddress(4, _llint_op_create_cloned_arguments)", |
| " setEntryAddress(5, _llint_op_create_this)", |
| " setEntryAddress(6, _llint_op_get_argument)", |
| " setEntryAddress(7, _llint_op_argument_count)", |
| " setEntryAddress(8, _llint_op_to_this)", |
| " setEntryAddress(9, _llint_op_check_tdz)", |
| " setEntryAddress(10, _llint_op_new_object)", |
| " setEntryAddress(11, _llint_op_new_array)", |
| " setEntryAddress(12, _llint_op_new_array_with_size)", |
| " setEntryAddress(13, _llint_op_new_array_with_spread)", |
| " setEntryAddress(14, _llint_op_spread)", |
| " setEntryAddress(15, _llint_op_new_array_buffer)", |
| " setEntryAddress(16, _llint_op_new_regexp)", |
| " setEntryAddress(17, _llint_op_mov)", |
| " setEntryAddress(18, _llint_op_not)", |
| " setEntryAddress(19, _llint_op_eq)", |
| " setEntryAddress(20, _llint_op_eq_null)", |
| " setEntryAddress(21, _llint_op_neq)", |
| " setEntryAddress(22, _llint_op_neq_null)", |
| " setEntryAddress(23, _llint_op_stricteq)", |
| " setEntryAddress(24, _llint_op_nstricteq)", |
| " setEntryAddress(25, _llint_op_less)", |
| " setEntryAddress(26, _llint_op_lesseq)", |
| " setEntryAddress(27, _llint_op_greater)", |
| " setEntryAddress(28, _llint_op_greatereq)", |
| " setEntryAddress(29, _llint_op_inc)", |
| " setEntryAddress(30, _llint_op_dec)", |
| " setEntryAddress(31, _llint_op_to_number)", |
| " setEntryAddress(32, _llint_op_to_string)", |
| " setEntryAddress(33, _llint_op_negate)", |
| " setEntryAddress(34, _llint_op_add)", |
| " setEntryAddress(35, _llint_op_mul)", |
| " setEntryAddress(36, _llint_op_div)", |
| " setEntryAddress(37, _llint_op_mod)", |
| " setEntryAddress(38, _llint_op_sub)", |
| " setEntryAddress(39, _llint_op_pow)", |
| " setEntryAddress(40, _llint_op_lshift)", |
| " setEntryAddress(41, _llint_op_rshift)", |
| " setEntryAddress(42, _llint_op_urshift)", |
| " setEntryAddress(43, _llint_op_unsigned)", |
| " setEntryAddress(44, _llint_op_bitand)", |
| " setEntryAddress(45, _llint_op_bitxor)", |
| " setEntryAddress(46, _llint_op_bitor)", |
| " setEntryAddress(47, _llint_op_overrides_has_instance)", |
| " setEntryAddress(48, _llint_op_instanceof)", |
| " setEntryAddress(49, _llint_op_instanceof_custom)", |
| " setEntryAddress(50, _llint_op_typeof)", |
| " setEntryAddress(51, _llint_op_is_empty)", |
| " setEntryAddress(52, _llint_op_is_undefined)", |
| " setEntryAddress(53, _llint_op_is_boolean)", |
| " setEntryAddress(54, _llint_op_is_number)", |
| " setEntryAddress(55, _llint_op_is_object)", |
| " setEntryAddress(56, _llint_op_is_object_or_null)", |
| " setEntryAddress(57, _llint_op_is_function)", |
| " setEntryAddress(58, _llint_op_is_cell_with_type)", |
| " setEntryAddress(59, _llint_op_in)", |
| " setEntryAddress(60, _llint_op_get_array_length)", |
| " setEntryAddress(61, _llint_op_get_by_id)", |
| " setEntryAddress(62, _llint_op_get_by_id_proto_load)", |
| " setEntryAddress(63, _llint_op_get_by_id_unset)", |
| " setEntryAddress(64, _llint_op_get_by_id_with_this)", |
| " setEntryAddress(65, _llint_op_get_by_val_with_this)", |
| " setEntryAddress(66, _llint_op_try_get_by_id)", |
| " setEntryAddress(67, _llint_op_put_by_id)", |
| " setEntryAddress(68, _llint_op_put_by_id_with_this)", |
| " setEntryAddress(69, _llint_op_del_by_id)", |
| " setEntryAddress(70, _llint_op_get_by_val)", |
| " setEntryAddress(71, _llint_op_put_by_val)", |
| " setEntryAddress(72, _llint_op_put_by_val_with_this)", |
| " setEntryAddress(73, _llint_op_put_by_val_direct)", |
| " setEntryAddress(74, _llint_op_del_by_val)", |
| " setEntryAddress(75, _llint_op_put_by_index)", |
| " setEntryAddress(76, _llint_op_put_getter_by_id)", |
| " setEntryAddress(77, _llint_op_put_setter_by_id)", |
| " setEntryAddress(78, _llint_op_put_getter_setter_by_id)", |
| " setEntryAddress(79, _llint_op_put_getter_by_val)", |
| " setEntryAddress(80, _llint_op_put_setter_by_val)", |
| " setEntryAddress(81, _llint_op_define_data_property)", |
| " setEntryAddress(82, _llint_op_define_accessor_property)", |
| " setEntryAddress(83, _llint_op_jmp)", |
| " setEntryAddress(84, _llint_op_jtrue)", |
| " setEntryAddress(85, _llint_op_jfalse)", |
| " setEntryAddress(86, _llint_op_jeq_null)", |
| " setEntryAddress(87, _llint_op_jneq_null)", |
| " setEntryAddress(88, _llint_op_jneq_ptr)", |
| " setEntryAddress(89, _llint_op_jless)", |
| " setEntryAddress(90, _llint_op_jlesseq)", |
| " setEntryAddress(91, _llint_op_jgreater)", |
| " setEntryAddress(92, _llint_op_jgreatereq)", |
| " setEntryAddress(93, _llint_op_jnless)", |
| " setEntryAddress(94, _llint_op_jnlesseq)", |
| " setEntryAddress(95, _llint_op_jngreater)", |
| " setEntryAddress(96, _llint_op_jngreatereq)", |
| " setEntryAddress(97, _llint_op_loop_hint)", |
| " setEntryAddress(98, _llint_op_switch_imm)", |
| " setEntryAddress(99, _llint_op_switch_char)", |
| " setEntryAddress(100, _llint_op_switch_string)", |
| " setEntryAddress(101, _llint_op_new_func)", |
| " setEntryAddress(102, _llint_op_new_func_exp)", |
| " setEntryAddress(103, _llint_op_new_generator_func)", |
| " setEntryAddress(104, _llint_op_new_generator_func_exp)", |
| " setEntryAddress(105, _llint_op_new_async_func)", |
| " setEntryAddress(106, _llint_op_new_async_func_exp)", |
| " setEntryAddress(107, _llint_op_set_function_name)", |
| " setEntryAddress(108, _llint_op_call)", |
| " setEntryAddress(109, _llint_op_tail_call)", |
| " setEntryAddress(110, _llint_op_call_eval)", |
| " setEntryAddress(111, _llint_op_call_varargs)", |
| " setEntryAddress(112, _llint_op_tail_call_varargs)", |
| " setEntryAddress(113, _llint_op_tail_call_forward_arguments)", |
| " setEntryAddress(114, _llint_op_ret)", |
| " setEntryAddress(115, _llint_op_construct)", |
| " setEntryAddress(116, _llint_op_construct_varargs)", |
| " setEntryAddress(117, _llint_op_strcat)", |
| " setEntryAddress(118, _llint_op_to_primitive)", |
| " setEntryAddress(119, _llint_op_resolve_scope)", |
| " setEntryAddress(120, _llint_op_get_from_scope)", |
| " setEntryAddress(121, _llint_op_put_to_scope)", |
| " setEntryAddress(122, _llint_op_get_from_arguments)", |
| " setEntryAddress(123, _llint_op_put_to_arguments)", |
| " setEntryAddress(124, _llint_op_push_with_scope)", |
| " setEntryAddress(125, _llint_op_create_lexical_environment)", |
| " setEntryAddress(126, _llint_op_get_parent_scope)", |
| " setEntryAddress(127, _llint_op_catch)", |
| " setEntryAddress(128, _llint_op_throw)", |
| " setEntryAddress(129, _llint_op_throw_static_error)", |
| " setEntryAddress(130, _llint_op_debug)", |
| " setEntryAddress(131, _llint_op_end)", |
| " setEntryAddress(132, _llint_op_profile_type)", |
| " setEntryAddress(133, _llint_op_profile_control_flow)", |
| " setEntryAddress(134, _llint_op_get_enumerable_length)", |
| " setEntryAddress(135, _llint_op_has_indexed_property)", |
| " setEntryAddress(136, _llint_op_has_structure_property)", |
| " setEntryAddress(137, _llint_op_has_generic_property)", |
| " setEntryAddress(138, _llint_op_get_direct_pname)", |
| " setEntryAddress(139, _llint_op_get_property_enumerator)", |
| " setEntryAddress(140, _llint_op_enumerator_structure_pname)", |
| " setEntryAddress(141, _llint_op_enumerator_generic_pname)", |
| " setEntryAddress(142, _llint_op_to_index_string)", |
| " setEntryAddress(143, _llint_op_assert)", |
| " setEntryAddress(144, _llint_op_unreachable)", |
| " setEntryAddress(145, _llint_op_create_rest)", |
| " setEntryAddress(146, _llint_op_get_rest_length)", |
| " setEntryAddress(147, _llint_op_yield)", |
| " setEntryAddress(148, _llint_op_check_traps)", |
| " setEntryAddress(149, _llint_op_log_shadow_chicken_prologue)", |
| " setEntryAddress(150, _llint_op_log_shadow_chicken_tail)", |
| " setEntryAddress(151, _llint_op_resolve_scope_for_hoisting_func_decl_in_eval)", |
| " setEntryAddress(152, _llint_op_nop)", |
| " setEntryAddress(153, _llint_program_prologue)", |
| " setEntryAddress(154, _llint_eval_prologue)", |
| " setEntryAddress(155, _llint_module_program_prologue)", |
| " setEntryAddress(156, _llint_function_for_call_prologue)", |
| " setEntryAddress(157, _llint_function_for_construct_prologue)", |
| " setEntryAddress(158, _llint_function_for_call_arity_check)", |
| " setEntryAddress(159, _llint_function_for_construct_arity_check)", |
| " setEntryAddress(160, _llint_generic_return_point)", |
| " setEntryAddress(161, _llint_throw_from_slow_path_trampoline)", |
| " setEntryAddress(162, _llint_throw_during_call_trampoline)", |
| " setEntryAddress(163, _llint_native_call_trampoline)", |
| " setEntryAddress(164, _llint_native_construct_trampoline)", |
| " setEntryAddress(165, _handleUncaughtException)", |
| " popCalleeSaves()", |
| " functionEpilogue()", |
| " ret ", |
| "end", |
| "_llint_program_prologue:", |
| " prologue(notFunctionCodeBlockGetter, notFunctionCodeBlockSetter, _llint_entry_osr, _llint_trace_prologue)", |
| " dispatch(0)", |
| "_llint_module_program_prologue:", |
| " prologue(notFunctionCodeBlockGetter, notFunctionCodeBlockSetter, _llint_entry_osr, _llint_trace_prologue)", |
| " dispatch(0)", |
| "_llint_eval_prologue:", |
| " prologue(notFunctionCodeBlockGetter, notFunctionCodeBlockSetter, _llint_entry_osr, _llint_trace_prologue)", |
| " dispatch(0)", |
| "_llint_function_for_call_prologue:", |
| " prologue(functionForCallCodeBlockGetter, functionCodeBlockSetter, _llint_entry_osr_function_for_call, _llint_trace_prologue_function_for_call)", |
| " functionInitialization(0)", |
| " dispatch(0)", |
| "_llint_function_for_construct_prologue:", |
| " prologue(functionForConstructCodeBlockGetter, functionCodeBlockSetter, _llint_entry_osr_function_for_construct, _llint_trace_prologue_function_for_construct)", |
| " functionInitialization(1)", |
| " dispatch(0)", |
| "_llint_function_for_call_arity_check:", |
| " prologue(functionForCallCodeBlockGetter, functionCodeBlockSetter, _llint_entry_osr_function_for_call_arityCheck, _llint_trace_arityCheck_for_call)", |
| " functionArityCheck(.functionForCallBegin, _slow_path_call_arityCheck)", |
| ".functionForCallBegin:", |
| " functionInitialization(0)", |
| " dispatch(0)", |
| "_llint_function_for_construct_arity_check:", |
| " prologue(functionForConstructCodeBlockGetter, functionCodeBlockSetter, _llint_entry_osr_function_for_construct_arityCheck, _llint_trace_arityCheck_for_construct)", |
| " functionArityCheck(.functionForConstructBegin, _slow_path_construct_arityCheck)", |
| ".functionForConstructBegin:", |
| " functionInitialization(1)", |
| " dispatch(0)", |
| "if JSVALUE64", |
| "macro jumpToInstruction()", |
| " jmp 0[PB, PC, 8]", |
| "end", |
| "macro dispatch(advance)", |
| " addp advance, PC", |
| " jumpToInstruction()", |
| "end", |
| "macro dispatchInt(advance)", |
| " addi advance, PC", |
| " jumpToInstruction()", |
| "end", |
| "macro dispatchIntIndirect(offset)", |
| " dispatchInt((offset * 8)[PB, PC, 8])", |
| "end", |
| "macro dispatchAfterCall()", |
| " loadi (ArgumentCount + TagOffset)[cfr], PC", |
| " loadp CodeBlock[cfr], PB", |
| " loadp CodeBlock::m_instructions[PB], PB", |
| " loadisFromInstruction(1, t1)", |
| " storeq r0, 0[cfr, t1, 8]", |
| " valueProfile(r0, (CallOpCodeSize - 1), t3)", |
| " dispatch(CallOpCodeSize)", |
| "end", |
| "macro cCall2(function)", |
| " checkStackPointerAlignment(t4, 3134242818)", |
| "if (X86_64 or ARM64)", |
| " call function", |
| "else", |
| "if X86_64_WIN", |
| " move a1, a2", |
| " move a0, a1", |
| " subp 48, sp", |
| " move sp, a0", |
| " addp 32, a0", |
| " call function", |
| " addp 48, sp", |
| " move 8[r0], r1", |
| " move 0[r0], r0", |
| "else", |
| "if C_LOOP", |
| " cloopCallSlowPath function, a0, a1", |
| "else", |
| " error", |
| "end", |
| "end", |
| "end", |
| "end", |
| "macro cCall2Void(function)", |
| "if C_LOOP", |
| " cloopCallSlowPathVoid function, a0, a1", |
| "else", |
| "if X86_64_WIN", |
| " subp 32, sp", |
| " call function", |
| " addp 32, sp", |
| "else", |
| " cCall2(function)", |
| "end", |
| "end", |
| "end", |
| "macro cCall4(function)", |
| " checkStackPointerAlignment(t4, 3134242820)", |
| "if (X86_64 or ARM64)", |
| " call function", |
| "else", |
| "if X86_64_WIN", |
| " subp 64, sp", |
| " call function", |
| " addp 64, sp", |
| "else", |
| " error", |
| "end", |
| "end", |
| "end", |
| "macro doVMEntry(makeCall)", |
| " functionPrologue()", |
| " pushCalleeSaves()", |
| "const entry = a0", |
| "const vm = a1", |
| "const protoCallFrame = a2", |
| " vmEntryRecord(cfr, sp)", |
| " checkStackPointerAlignment(t4, 3134249985)", |
| " storep vm, VMEntryRecord::m_vm[sp]", |
| " loadp VM::topCallFrame[vm], t4", |
| " storep t4, VMEntryRecord::m_prevTopCallFrame[sp]", |
| " loadp VM::topVMEntryFrame[vm], t4", |
| " storep t4, VMEntryRecord::m_prevTopVMEntryFrame[sp]", |
| " loadi ProtoCallFrame::paddedArgCount[protoCallFrame], t4", |
| " addp CallFrameHeaderSlots, t4, t4", |
| " lshiftp 3, t4", |
| " subp sp, t4, t3", |
| " bqbeq sp, t3, .throwStackOverflow", |
| "if C_LOOP", |
| " bpaeq t3, VM::m_cloopStackLimit[vm], .stackHeightOK", |
| "else", |
| " bpaeq t3, VM::m_softStackLimit[vm], .stackHeightOK", |
| "end", |
| "if C_LOOP", |
| " move entry, t4", |
| " move vm, t5", |
| " cloopCallSlowPath _llint_stack_check_at_vm_entry, vm, t3", |
| " bpeq t0, 0, .stackCheckFailed", |
| " move t4, entry", |
| " move t5, vm", |
| " jmp .stackHeightOK", |
| ".stackCheckFailed:", |
| " move t4, entry", |
| " move t5, vm", |
| "else", |
| " skip", |
| "end", |
| ".throwStackOverflow:", |
| " move vm, a0", |
| " move protoCallFrame, a1", |
| " cCall2(_llint_throw_stack_overflow_error)", |
| " vmEntryRecord(cfr, t4)", |
| " loadp VMEntryRecord::m_vm[t4], vm", |
| " loadp VMEntryRecord::m_prevTopCallFrame[t4], extraTempReg", |
| " storep extraTempReg, VM::topCallFrame[vm]", |
| " loadp VMEntryRecord::m_prevTopVMEntryFrame[t4], extraTempReg", |
| " storep extraTempReg, VM::topVMEntryFrame[vm]", |
| " subp cfr, CalleeRegisterSaveSize, sp", |
| " popCalleeSaves()", |
| " functionEpilogue()", |
| " ret ", |
| ".stackHeightOK:", |
| " move t3, sp", |
| " move 4, t3", |
| ".copyHeaderLoop:", |
| " subi 1, t3", |
| " loadq 0[protoCallFrame, t3, 8], extraTempReg", |
| " storeq extraTempReg, CodeBlock[sp, t3, 8]", |
| " btinz t3, .copyHeaderLoop", |
| " loadi (PayloadOffset + ProtoCallFrame::argCountAndCodeOriginValue)[protoCallFrame], t4", |
| " subi 1, t4", |
| " loadi ProtoCallFrame::paddedArgCount[protoCallFrame], extraTempReg", |
| " subi 1, extraTempReg", |
| " bieq t4, extraTempReg, .copyArgs", |
| " move ValueUndefined, t3", |
| ".fillExtraArgsLoop:", |
| " subi 1, extraTempReg", |
| " storeq t3, (ThisArgumentOffset + 8)[sp, extraTempReg, 8]", |
| " bineq t4, extraTempReg, .fillExtraArgsLoop", |
| ".copyArgs:", |
| " loadp ProtoCallFrame::args[protoCallFrame], t3", |
| ".copyArgsLoop:", |
| " btiz t4, .copyArgsDone", |
| " subi 1, t4", |
| " loadq 0[t3, t4, 8], extraTempReg", |
| " storeq extraTempReg, (ThisArgumentOffset + 8)[sp, t4, 8]", |
| " jmp .copyArgsLoop", |
| ".copyArgsDone:", |
| "if ARM64", |
| " move sp, t4", |
| " storep t4, VM::topCallFrame[vm]", |
| "else", |
| " storep sp, VM::topCallFrame[vm]", |
| "end", |
| " storep cfr, VM::topVMEntryFrame[vm]", |
| " checkStackPointerAlignment(extraTempReg, 3134249986)", |
| " makeCall(entry, t3)", |
| " checkStackPointerAlignment(t2, 3134249987)", |
| " vmEntryRecord(cfr, t4)", |
| " loadp VMEntryRecord::m_vm[t4], vm", |
| " loadp VMEntryRecord::m_prevTopCallFrame[t4], t2", |
| " storep t2, VM::topCallFrame[vm]", |
| " loadp VMEntryRecord::m_prevTopVMEntryFrame[t4], t2", |
| " storep t2, VM::topVMEntryFrame[vm]", |
| " subp cfr, CalleeRegisterSaveSize, sp", |
| " popCalleeSaves()", |
| " functionEpilogue()", |
| " ret ", |
| "end", |
| "macro makeJavaScriptCall(entry, temp)", |
| " addp 16, sp", |
| "if C_LOOP", |
| " cloopCallJSFunction entry", |
| "else", |
| " call entry", |
| "end", |
| " subp 16, sp", |
| "end", |
| "macro makeHostFunctionCall(entry, temp)", |
| " move entry, temp", |
| " storep cfr, 0[sp]", |
| " move sp, a0", |
| "if C_LOOP", |
| " storep lr, 8[sp]", |
| " cloopCallNative temp", |
| "else", |
| "if X86_64_WIN", |
| " subp 32, sp", |
| " call temp", |
| " addp 32, sp", |
| "else", |
| " call temp", |
| "end", |
| "end", |
| "end", |
| "_handleUncaughtException:", |
| " loadp Callee[cfr], t3", |
| " andp MarkedBlockMask, t3", |
| " loadp MarkedBlock::m_vm[t3], t3", |
| " restoreCalleeSavesFromVMEntryFrameCalleeSavesBuffer(t3, t0)", |
| " loadp VM::callFrameForCatch[t3], cfr", |
| " storep 0, VM::callFrameForCatch[t3]", |
| " loadp CallerFrame[cfr], cfr", |
| " vmEntryRecord(cfr, t2)", |
| " loadp VMEntryRecord::m_vm[t2], t3", |
| " loadp VMEntryRecord::m_prevTopCallFrame[t2], extraTempReg", |
| " storep extraTempReg, VM::topCallFrame[t3]", |
| " loadp VMEntryRecord::m_prevTopVMEntryFrame[t2], extraTempReg", |
| " storep extraTempReg, VM::topVMEntryFrame[t3]", |
| " subp cfr, CalleeRegisterSaveSize, sp", |
| " popCalleeSaves()", |
| " functionEpilogue()", |
| " ret ", |
| "macro prepareStateForCCall()", |
| " leap 0[PB, PC, 8], PC", |
| "end", |
| "macro restoreStateAfterCCall()", |
| " move r0, PC", |
| " subp PB, PC", |
| " rshiftp 3, PC", |
| "end", |
| "macro callSlowPath(slowPath)", |
| " prepareStateForCCall()", |
| " move cfr, a0", |
| " move PC, a1", |
| " cCall2(slowPath)", |
| " restoreStateAfterCCall()", |
| "end", |
| "macro traceOperand(fromWhere, operand)", |
| " prepareStateForCCall()", |
| " move fromWhere, a2", |
| " move operand, a3", |
| " move cfr, a0", |
| " move PC, a1", |
| " cCall4(_llint_trace_operand)", |
| " restoreStateAfterCCall()", |
| "end", |
| "macro traceValue(fromWhere, operand)", |
| " prepareStateForCCall()", |
| " move fromWhere, a2", |
| " move operand, a3", |
| " move cfr, a0", |
| " move PC, a1", |
| " cCall4(_llint_trace_value)", |
| " restoreStateAfterCCall()", |
| "end", |
| "macro callCallSlowPath(slowPath, action)", |
| " storei PC, (ArgumentCount + TagOffset)[cfr]", |
| " prepareStateForCCall()", |
| " move cfr, a0", |
| " move PC, a1", |
| " cCall2(slowPath)", |
| " action(r0, r1)", |
| "end", |
| "macro callTrapHandler(throwHandler)", |
| " storei PC, (ArgumentCount + TagOffset)[cfr]", |
| " prepareStateForCCall()", |
| " move cfr, a0", |
| " move PC, a1", |
| " cCall2(_llint_slow_path_handle_traps)", |
| " btpnz r0, throwHandler", |
| " loadi (ArgumentCount + TagOffset)[cfr], PC", |
| "end", |
| "macro checkSwitchToJITForLoop()", |
| " checkSwitchToJIT(1, macro ()", |
| " storei PC, (ArgumentCount + TagOffset)[cfr]", |
| " prepareStateForCCall()", |
| " move cfr, a0", |
| " move PC, a1", |
| " cCall2(_llint_loop_osr)", |
| " btpz r0, .recover", |
| " move r1, sp", |
| " jmp r0", |
| ".recover:", |
| " loadi (ArgumentCount + TagOffset)[cfr], PC", |
| "end)", |
| "end", |
| "macro loadCaged(basePtr, source, dest, scratch)", |
| " loadp source, dest", |
| "if (GIGACAGE_ENABLED and (notC_LOOP))", |
| " loadp basePtr, scratch", |
| " btpz scratch, .done", |
| " andp constexpr (GIGACAGE_MASK), dest", |
| " addp scratch, dest", |
| ".done:", |
| "else", |
| " skip", |
| "end", |
| "end", |
| "macro loadVariable(operand, value)", |
| " loadisFromInstruction(operand, value)", |
| " loadq 0[cfr, value, 8], value", |
| "end", |
| "macro loadConstantOrVariable(index, value)", |
| " bpgteq index, FirstConstantRegisterIndex, .constant", |
| " loadq 0[cfr, index, 8], value", |
| " jmp .done", |
| ".constant:", |
| " loadp CodeBlock[cfr], value", |
| " loadp (CodeBlock::m_constantRegisters + VectorBufferOffset)[value], value", |
| " subp FirstConstantRegisterIndex, index", |
| " loadq 0[value, index, 8], value", |
| ".done:", |
| "end", |
| "macro loadConstantOrVariableInt32(index, value, slow)", |
| " loadConstantOrVariable(index, value)", |
| " bqb value, tagTypeNumber, slow", |
| "end", |
| "macro loadConstantOrVariableCell(index, value, slow)", |
| " loadConstantOrVariable(index, value)", |
| " btqnz value, tagMask, slow", |
| "end", |
| "macro writeBarrierOnOperand(cellOperand)", |
| " loadisFromInstruction(cellOperand, t1)", |
| " loadConstantOrVariableCell(t1, t2, .writeBarrierDone)", |
| " skipIfIsRememberedOrInEden(t2, macro ()", |
| " push PB, PC", |
| " move t2, a1", |
| " move cfr, a0", |
| " cCall2Void(_llint_write_barrier_slow)", |
| " pop PC, PB", |
| "end)", |
| ".writeBarrierDone:", |
| "end", |
| "macro writeBarrierOnOperands(cellOperand, valueOperand)", |
| " loadisFromInstruction(valueOperand, t1)", |
| " loadConstantOrVariableCell(t1, t0, .writeBarrierDone)", |
| " btpz t0, .writeBarrierDone", |
| " writeBarrierOnOperand(cellOperand)", |
| ".writeBarrierDone:", |
| "end", |
| "macro writeBarrierOnGlobal(valueOperand, loadHelper)", |
| " loadisFromInstruction(valueOperand, t1)", |
| " loadConstantOrVariableCell(t1, t0, .writeBarrierDone)", |
| " btpz t0, .writeBarrierDone", |
| " loadHelper(t3)", |
| " skipIfIsRememberedOrInEden(t3, macro ()", |
| " push PB, PC", |
| " move cfr, a0", |
| " move t3, a1", |
| " cCall2Void(_llint_write_barrier_slow)", |
| " pop PC, PB", |
| "end)", |
| ".writeBarrierDone:", |
| "end", |
| "macro writeBarrierOnGlobalObject(valueOperand)", |
| " writeBarrierOnGlobal(valueOperand, macro (registerToStoreGlobal)", |
| " loadp CodeBlock[cfr], registerToStoreGlobal", |
| " loadp CodeBlock::m_globalObject[registerToStoreGlobal], registerToStoreGlobal", |
| "end)", |
| "end", |
| "macro writeBarrierOnGlobalLexicalEnvironment(valueOperand)", |
| " writeBarrierOnGlobal(valueOperand, macro (registerToStoreGlobal)", |
| " loadp CodeBlock[cfr], registerToStoreGlobal", |
| " loadp CodeBlock::m_globalObject[registerToStoreGlobal], registerToStoreGlobal", |
| " loadp JSGlobalObject::m_globalLexicalEnvironment[registerToStoreGlobal], registerToStoreGlobal", |
| "end)", |
| "end", |
| "macro valueProfile(value, operand, scratch)", |
| " loadpFromInstruction(operand, scratch)", |
| " storeq value, ValueProfile::m_buckets[scratch]", |
| "end", |
| "macro structureIDToStructureWithScratch(structureIDThenStructure, scratch)", |
| " loadp CodeBlock[cfr], scratch", |
| " loadp CodeBlock::m_vm[scratch], scratch", |
| " loadp ((VM::heap + Heap::m_structureIDTable) + StructureIDTable::m_table)[scratch], scratch", |
| " loadp 0[scratch, structureIDThenStructure, 8], structureIDThenStructure", |
| "end", |
| "macro loadStructureWithScratch(cell, structure, scratch)", |
| " loadi JSCell::m_structureID[cell], structure", |
| " structureIDToStructureWithScratch(structure, scratch)", |
| "end", |
| "macro loadStructureAndClobberFirstArg(cell, structure)", |
| " loadi JSCell::m_structureID[cell], structure", |
| " loadp CodeBlock[cfr], cell", |
| " loadp CodeBlock::m_vm[cell], cell", |
| " loadp ((VM::heap + Heap::m_structureIDTable) + StructureIDTable::m_table)[cell], cell", |
| " loadp 0[cell, structure, 8], structure", |
| "end", |
| "macro functionArityCheck(doneLabel, slowPath)", |
| " loadi (PayloadOffset + ArgumentCount)[cfr], t0", |
| " biaeq t0, CodeBlock::m_numParameters[t1], doneLabel", |
| " prepareStateForCCall()", |
| " move cfr, a0", |
| " move PC, a1", |
| " cCall2(slowPath)", |
| " btiz r0, .noError", |
| " move r1, cfr", |
| " jmp _llint_throw_from_slow_path_trampoline", |
| ".noError:", |
| " loadi CommonSlowPaths::ArityCheckData::paddedStackSpace[r1], t1", |
| " btiz t1, .continue", |
| " loadi (PayloadOffset + ArgumentCount)[cfr], t2", |
| " addi CallFrameHeaderSlots, t2", |
| " move t1, t3", |
| " andi (StackAlignmentSlots - 1), t3", |
| " btiz t3, .noExtraSlot", |
| " move ValueUndefined, t0", |
| ".fillExtraSlots:", |
| " storeq t0, 0[cfr, t2, 8]", |
| " addi 1, t2", |
| " bsubinz 1, t3, .fillExtraSlots", |
| " andi (~(StackAlignmentSlots - 1)), t1", |
| " btiz t1, .continue", |
| ".noExtraSlot:", |
| " negq t1", |
| " move cfr, t3", |
| " subp (CalleeSaveSpaceAsVirtualRegisters * 8), t3", |
| " addi CalleeSaveSpaceAsVirtualRegisters, t2", |
| " move t1, t0", |
| " lshiftp 3, t0", |
| " addp t0, cfr", |
| " addp t0, sp", |
| ".copyLoop:", |
| " loadq 0[t3], t0", |
| " storeq t0, 0[t3, t1, 8]", |
| " addp 8, t3", |
| " bsubinz 1, t2, .copyLoop", |
| " move t1, t2", |
| " move ValueUndefined, t0", |
| ".fillLoop:", |
| " storeq t0, 0[t3, t1, 8]", |
| " addp 8, t3", |
| " baddinz 1, t2, .fillLoop", |
| ".continue:", |
| " loadp CodeBlock[cfr], t1", |
| " loadp CodeBlock::m_instructions[t1], PB", |
| " move 0, PC", |
| " jmp doneLabel", |
| "end", |
| "macro branchIfException(label)", |
| " loadp Callee[cfr], t3", |
| " andp MarkedBlockMask, t3", |
| " loadp MarkedBlock::m_vm[t3], t3", |
| " btqz VM::m_exception[t3], .noException", |
| " jmp label", |
| ".noException:", |
| "end", |
| "_llint_op_enter:", |
| " traceExecution()", |
| " checkStackPointerAlignment(t2, 3735879905)", |
| " loadp CodeBlock[cfr], t2", |
| " loadi CodeBlock::m_numVars[t2], t2", |
| " subq CalleeSaveSpaceAsVirtualRegisters, t2", |
| " move cfr, t1", |
| " subq (CalleeSaveSpaceAsVirtualRegisters * 8), t1", |
| " btiz t2, .opEnterDone", |
| " move ValueUndefined, t0", |
| " negi t2", |
| " sxi2q t2, t2", |
| ".opEnterLoop:", |
| " storeq t0, 0[t1, t2, 8]", |
| " addq 1, t2", |
| " btqnz t2, .opEnterLoop", |
| ".opEnterDone:", |
| " callOpcodeSlowPath(_slow_path_enter)", |
| " dispatch(constexpr (op_enter_length))", |
| "_llint_op_get_argument:", |
| " traceExecution()", |
| " loadisFromInstruction(1, t1)", |
| " loadisFromInstruction(2, t2)", |
| " loadi (PayloadOffset + ArgumentCount)[cfr], t0", |
| " bilteq t0, t2, .opGetArgumentOutOfBounds", |
| " loadq ThisArgumentOffset[cfr, t2, 8], t0", |
| " storeq t0, 0[cfr, t1, 8]", |
| " valueProfile(t0, 3, t2)", |
| " dispatch(constexpr (op_get_argument_length))", |
| ".opGetArgumentOutOfBounds:", |
| " storeq ValueUndefined, 0[cfr, t1, 8]", |
| " valueProfile(ValueUndefined, 3, t2)", |
| " dispatch(constexpr (op_get_argument_length))", |
| "_llint_op_argument_count:", |
| " traceExecution()", |
| " loadisFromInstruction(1, t1)", |
| " loadi (PayloadOffset + ArgumentCount)[cfr], t0", |
| " subi 1, t0", |
| " orq TagTypeNumber, t0", |
| " storeq t0, 0[cfr, t1, 8]", |
| " dispatch(constexpr (op_argument_count_length))", |
| "_llint_op_get_scope:", |
| " traceExecution()", |
| " loadp Callee[cfr], t0", |
| " loadp JSCallee::m_scope[t0], t0", |
| " loadisFromInstruction(1, t1)", |
| " storeq t0, 0[cfr, t1, 8]", |
| " dispatch(constexpr (op_get_scope_length))", |
| "_llint_op_to_this:", |
| " traceExecution()", |
| " loadisFromInstruction(1, t0)", |
| " loadq 0[cfr, t0, 8], t0", |
| " btqnz t0, tagMask, .opToThisSlow", |
| " bbneq JSCell::m_type[t0], FinalObjectType, .opToThisSlow", |
| " loadStructureWithScratch(t0, t1, t2)", |
| " loadpFromInstruction(2, t2)", |
| " bpneq t1, t2, .opToThisSlow", |
| " dispatch(constexpr (op_to_this_length))", |
| ".opToThisSlow:", |
| " callOpcodeSlowPath(_slow_path_to_this)", |
| " dispatch(constexpr (op_to_this_length))", |
| "_llint_op_check_tdz:", |
| " traceExecution()", |
| " loadisFromInstruction(1, t0)", |
| " loadConstantOrVariable(t0, t1)", |
| " bqneq t1, ValueEmpty, .opNotTDZ", |
| " callOpcodeSlowPath(_slow_path_throw_tdz_error)", |
| ".opNotTDZ:", |
| " dispatch(constexpr (op_check_tdz_length))", |
| "_llint_op_mov:", |
| " traceExecution()", |
| " loadisFromInstruction(2, t1)", |
| " loadisFromInstruction(1, t0)", |
| " loadConstantOrVariable(t1, t2)", |
| " storeq t2, 0[cfr, t0, 8]", |
| " dispatch(constexpr (op_mov_length))", |
| "_llint_op_not:", |
| " traceExecution()", |
| " loadisFromInstruction(2, t0)", |
| " loadisFromInstruction(1, t1)", |
| " loadConstantOrVariable(t0, t2)", |
| " xorq ValueFalse, t2", |
| " btqnz t2, (~1), .opNotSlow", |
| " xorq ValueTrue, t2", |
| " storeq t2, 0[cfr, t1, 8]", |
| " dispatch(constexpr (op_not_length))", |
| ".opNotSlow:", |
| " callOpcodeSlowPath(_slow_path_not)", |
| " dispatch(constexpr (op_not_length))", |
| "macro equalityComparison(integerComparison, slowPath)", |
| " traceExecution()", |
| " loadisFromInstruction(3, t0)", |
| " loadisFromInstruction(2, t2)", |
| " loadisFromInstruction(1, t3)", |
| " loadConstantOrVariableInt32(t0, t1, .slow)", |
| " loadConstantOrVariableInt32(t2, t0, .slow)", |
| " integerComparison(t0, t1, t0)", |
| " orq ValueFalse, t0", |
| " storeq t0, 0[cfr, t3, 8]", |
| " dispatch(4)", |
| ".slow:", |
| " callOpcodeSlowPath(slowPath)", |
| " dispatch(4)", |
| "end", |
| "_llint_op_eq:", |
| " equalityComparison(macro (left, right, result)", |
| " cieq left, right, result", |
| "end, _slow_path_eq)", |
| "_llint_op_neq:", |
| " equalityComparison(macro (left, right, result)", |
| " cineq left, right, result", |
| "end, _slow_path_neq)", |
| "macro equalNullComparison()", |
| " loadisFromInstruction(2, t0)", |
| " loadq 0[cfr, t0, 8], t0", |
| " btqnz t0, tagMask, .immediate", |
| " btbnz JSCell::m_flags[t0], MasqueradesAsUndefined, .masqueradesAsUndefined", |
| " move 0, t0", |
| " jmp .done", |
| ".masqueradesAsUndefined:", |
| " loadStructureWithScratch(t0, t2, t1)", |
| " loadp CodeBlock[cfr], t0", |
| " loadp CodeBlock::m_globalObject[t0], t0", |
| " cpeq Structure::m_globalObject[t2], t0, t0", |
| " jmp .done", |
| ".immediate:", |
| " andq (~TagBitUndefined), t0", |
| " cqeq t0, ValueNull, t0", |
| ".done:", |
| "end", |
| "_llint_op_eq_null:", |
| " traceExecution()", |
| " equalNullComparison()", |
| " loadisFromInstruction(1, t1)", |
| " orq ValueFalse, t0", |
| " storeq t0, 0[cfr, t1, 8]", |
| " dispatch(constexpr (op_eq_null_length))", |
| "_llint_op_neq_null:", |
| " traceExecution()", |
| " equalNullComparison()", |
| " loadisFromInstruction(1, t1)", |
| " xorq ValueTrue, t0", |
| " storeq t0, 0[cfr, t1, 8]", |
| " dispatch(constexpr (op_neq_null_length))", |
| "macro strictEq(equalityOperation, slowPath)", |
| " traceExecution()", |
| " loadisFromInstruction(3, t0)", |
| " loadisFromInstruction(2, t2)", |
| " loadConstantOrVariable(t0, t1)", |
| " loadConstantOrVariable(t2, t0)", |
| " move t0, t2", |
| " orq t1, t2", |
| " btqz t2, tagMask, .slow", |
| " bqaeq t0, tagTypeNumber, .leftOK", |
| " btqnz t0, tagTypeNumber, .slow", |
| ".leftOK:", |
| " bqaeq t1, tagTypeNumber, .rightOK", |
| " btqnz t1, tagTypeNumber, .slow", |
| ".rightOK:", |
| " equalityOperation(t0, t1, t0)", |
| " loadisFromInstruction(1, t1)", |
| " orq ValueFalse, t0", |
| " storeq t0, 0[cfr, t1, 8]", |
| " dispatch(4)", |
| ".slow:", |
| " callOpcodeSlowPath(slowPath)", |
| " dispatch(4)", |
| "end", |
| "_llint_op_stricteq:", |
| " strictEq(macro (left, right, result)", |
| " cqeq left, right, result", |
| "end, _slow_path_stricteq)", |
| "_llint_op_nstricteq:", |
| " strictEq(macro (left, right, result)", |
| " cqneq left, right, result", |
| "end, _slow_path_nstricteq)", |
| "macro preOp(arithmeticOperation, slowPath)", |
| " traceExecution()", |
| " loadisFromInstruction(1, t0)", |
| " loadq 0[cfr, t0, 8], t1", |
| " bqb t1, tagTypeNumber, .slow", |
| " arithmeticOperation(t1, .slow)", |
| " orq tagTypeNumber, t1", |
| " storeq t1, 0[cfr, t0, 8]", |
| " dispatch(2)", |
| ".slow:", |
| " callOpcodeSlowPath(slowPath)", |
| " dispatch(2)", |
| "end", |
| "_llint_op_inc:", |
| " preOp(macro (value, slow)", |
| " baddio 1, value, slow", |
| "end, _slow_path_inc)", |
| "_llint_op_dec:", |
| " preOp(macro (value, slow)", |
| " bsubio 1, value, slow", |
| "end, _slow_path_dec)", |
| "_llint_op_to_number:", |
| " traceExecution()", |
| " loadisFromInstruction(2, t0)", |
| " loadisFromInstruction(1, t1)", |
| " loadConstantOrVariable(t0, t2)", |
| " bqaeq t2, tagTypeNumber, .opToNumberIsImmediate", |
| " btqz t2, tagTypeNumber, .opToNumberSlow", |
| ".opToNumberIsImmediate:", |
| " storeq t2, 0[cfr, t1, 8]", |
| " valueProfile(t2, 3, t0)", |
| " dispatch(constexpr (op_to_number_length))", |
| ".opToNumberSlow:", |
| " callOpcodeSlowPath(_slow_path_to_number)", |
| " dispatch(constexpr (op_to_number_length))", |
| "_llint_op_to_string:", |
| " traceExecution()", |
| " loadisFromInstruction(2, t1)", |
| " loadisFromInstruction(1, t2)", |
| " loadConstantOrVariable(t1, t0)", |
| " btqnz t0, tagMask, .opToStringSlow", |
| " bbneq JSCell::m_type[t0], StringType, .opToStringSlow", |
| ".opToStringIsString:", |
| " storeq t0, 0[cfr, t2, 8]", |
| " dispatch(constexpr (op_to_string_length))", |
| ".opToStringSlow:", |
| " callOpcodeSlowPath(_slow_path_to_string)", |
| " dispatch(constexpr (op_to_string_length))", |
| "_llint_op_negate:", |
| " traceExecution()", |
| " loadisFromInstruction(2, t0)", |
| " loadisFromInstruction(1, t1)", |
| " loadConstantOrVariable(t0, t3)", |
| " loadisFromInstruction(3, t2)", |
| " bqb t3, tagTypeNumber, .opNegateNotInt", |
| " btiz t3, 2147483647, .opNegateSlow", |
| " negi t3", |
| " ori ArithProfileInt, t2", |
| " orq tagTypeNumber, t3", |
| " storeisToInstruction(t2, 3)", |
| " storeq t3, 0[cfr, t1, 8]", |
| " dispatch(constexpr (op_negate_length))", |
| ".opNegateNotInt:", |
| " btqz t3, tagTypeNumber, .opNegateSlow", |
| " xorq 9223372036854776000, t3", |
| " ori ArithProfileNumber, t2", |
| " storeq t3, 0[cfr, t1, 8]", |
| " storeisToInstruction(t2, 3)", |
| " dispatch(constexpr (op_negate_length))", |
| ".opNegateSlow:", |
| " callOpcodeSlowPath(_slow_path_negate)", |
| " dispatch(constexpr (op_negate_length))", |
| "macro binaryOpCustomStore(integerOperationAndStore, doubleOperation, slowPath)", |
| " loadisFromInstruction(3, t0)", |
| " loadisFromInstruction(2, t2)", |
| " loadConstantOrVariable(t0, t1)", |
| " loadConstantOrVariable(t2, t0)", |
| " bqb t0, tagTypeNumber, .op1NotInt", |
| " bqb t1, tagTypeNumber, .op2NotInt", |
| " loadisFromInstruction(1, t2)", |
| " integerOperationAndStore(t1, t0, .slow, t2)", |
| " loadisFromInstruction(4, t1)", |
| " ori ArithProfileIntInt, t1", |
| " storeisToInstruction(t1, 4)", |
| " dispatch(5)", |
| ".op1NotInt:", |
| " btqz t0, tagTypeNumber, .slow", |
| " bqaeq t1, tagTypeNumber, .op1NotIntOp2Int", |
| " btqz t1, tagTypeNumber, .slow", |
| " addq tagTypeNumber, t1", |
| " fq2d t1, ft1", |
| " loadisFromInstruction(4, t2)", |
| " ori ArithProfileNumberNumber, t2", |
| " storeisToInstruction(t2, 4)", |
| " jmp .op1NotIntReady", |
| ".op1NotIntOp2Int:", |
| " loadisFromInstruction(4, t2)", |
| " ori ArithProfileNumberInt, t2", |
| " storeisToInstruction(t2, 4)", |
| " ci2d t1, ft1", |
| ".op1NotIntReady:", |
| " loadisFromInstruction(1, t2)", |
| " addq tagTypeNumber, t0", |
| " fq2d t0, ft0", |
| " doubleOperation(ft1, ft0)", |
| " fd2q ft0, t0", |
| " subq tagTypeNumber, t0", |
| " storeq t0, 0[cfr, t2, 8]", |
| " dispatch(5)", |
| ".op2NotInt:", |
| " loadisFromInstruction(1, t2)", |
| " btqz t1, tagTypeNumber, .slow", |
| " loadisFromInstruction(4, t3)", |
| " ori ArithProfileIntNumber, t3", |
| " storeisToInstruction(t3, 4)", |
| " ci2d t0, ft0", |
| " addq tagTypeNumber, t1", |
| " fq2d t1, ft1", |
| " doubleOperation(ft1, ft0)", |
| " fd2q ft0, t0", |
| " subq tagTypeNumber, t0", |
| " storeq t0, 0[cfr, t2, 8]", |
| " dispatch(5)", |
| ".slow:", |
| " callOpcodeSlowPath(slowPath)", |
| " dispatch(5)", |
| "end", |
| "macro binaryOp(integerOperation, doubleOperation, slowPath)", |
| " binaryOpCustomStore(macro (left, right, slow, index)", |
| " integerOperation(left, right, slow)", |
| " orq tagTypeNumber, right", |
| " storeq right, 0[cfr, index, 8]", |
| "end, doubleOperation, slowPath)", |
| "end", |
| "_llint_op_add:", |
| " traceExecution()", |
| " binaryOp(macro (left, right, slow)", |
| " baddio left, right, slow", |
| "end, macro (left, right)", |
| " addd left, right", |
| "end, _slow_path_add)", |
| "_llint_op_mul:", |
| " traceExecution()", |
| " binaryOpCustomStore(macro (left, right, slow, index)", |
| " move right, t3", |
| " bmulio left, t3, slow", |
| " btinz t3, .done", |
| " bilt left, 0, slow", |
| " bilt right, 0, slow", |
| ".done:", |
| " orq tagTypeNumber, t3", |
| " storeq t3, 0[cfr, index, 8]", |
| "end, macro (left, right)", |
| " muld left, right", |
| "end, _slow_path_mul)", |
| "_llint_op_sub:", |
| " traceExecution()", |
| " binaryOp(macro (left, right, slow)", |
| " bsubio left, right, slow", |
| "end, macro (left, right)", |
| " subd left, right", |
| "end, _slow_path_sub)", |
| "_llint_op_div:", |
| " traceExecution()", |
| "if (X86_64 or X86_64_WIN)", |
| " binaryOpCustomStore(macro (left, right, slow, index)", |
| " btiz left, slow", |
| " bineq left, (-1), .notNeg2TwoThe31DivByNeg1", |
| " bieq right, (-2147483648), .slow", |
| ".notNeg2TwoThe31DivByNeg1:", |
| " btinz right, .intOK", |
| " bilt left, 0, slow", |
| ".intOK:", |
| " move left, t3", |
| " move right, t0", |
| " cdqi ", |
| " idivi t3", |
| " btinz t1, slow", |
| " orq tagTypeNumber, t0", |
| " storeq t0, 0[cfr, index, 8]", |
| "end, macro (left, right)", |
| " divd left, right", |
| "end, _slow_path_div)", |
| "else", |
| " callOpcodeSlowPath(_slow_path_div)", |
| " dispatch(constexpr (op_div_length))", |
| "end", |
| "macro bitOp(operation, slowPath, advance)", |
| " loadisFromInstruction(3, t0)", |
| " loadisFromInstruction(2, t2)", |
| " loadisFromInstruction(1, t3)", |
| " loadConstantOrVariable(t0, t1)", |
| " loadConstantOrVariable(t2, t0)", |
| " bqb t0, tagTypeNumber, .slow", |
| " bqb t1, tagTypeNumber, .slow", |
| " operation(t1, t0)", |
| " orq tagTypeNumber, t0", |
| " storeq t0, 0[cfr, t3, 8]", |
| " dispatch(advance)", |
| ".slow:", |
| " callOpcodeSlowPath(slowPath)", |
| " dispatch(advance)", |
| "end", |
| "_llint_op_lshift:", |
| " traceExecution()", |
| " bitOp(macro (left, right)", |
| " lshifti left, right", |
| "end, _slow_path_lshift, constexpr (op_lshift_length))", |
| "_llint_op_rshift:", |
| " traceExecution()", |
| " bitOp(macro (left, right)", |
| " rshifti left, right", |
| "end, _slow_path_rshift, constexpr (op_rshift_length))", |
| "_llint_op_urshift:", |
| " traceExecution()", |
| " bitOp(macro (left, right)", |
| " urshifti left, right", |
| "end, _slow_path_urshift, constexpr (op_urshift_length))", |
| "_llint_op_unsigned:", |
| " traceExecution()", |
| " loadisFromInstruction(1, t0)", |
| " loadisFromInstruction(2, t1)", |
| " loadConstantOrVariable(t1, t2)", |
| " bilt t2, 0, .opUnsignedSlow", |
| " storeq t2, 0[cfr, t0, 8]", |
| " dispatch(constexpr (op_unsigned_length))", |
| ".opUnsignedSlow:", |
| " callOpcodeSlowPath(_slow_path_unsigned)", |
| " dispatch(constexpr (op_unsigned_length))", |
| "_llint_op_bitand:", |
| " traceExecution()", |
| " bitOp(macro (left, right)", |
| " andi left, right", |
| "end, _slow_path_bitand, constexpr (op_bitand_length))", |
| "_llint_op_bitxor:", |
| " traceExecution()", |
| " bitOp(macro (left, right)", |
| " xori left, right", |
| "end, _slow_path_bitxor, constexpr (op_bitxor_length))", |
| "_llint_op_bitor:", |
| " traceExecution()", |
| " bitOp(macro (left, right)", |
| " ori left, right", |
| "end, _slow_path_bitor, constexpr (op_bitor_length))", |
| "_llint_op_overrides_has_instance:", |
| " traceExecution()", |
| " loadisFromInstruction(1, t3)", |
| " loadisFromInstruction(3, t1)", |
| " loadConstantOrVariable(t1, t0)", |
| " loadp CodeBlock[cfr], t2", |
| " loadp CodeBlock::m_globalObject[t2], t2", |
| " loadp JSGlobalObject::m_functionProtoHasInstanceSymbolFunction[t2], t2", |
| " bqneq t0, t2, .opOverridesHasInstanceNotDefaultSymbol", |
| " loadisFromInstruction(2, t1)", |
| " loadConstantOrVariable(t1, t0)", |
| " tbz JSCell::m_flags[t0], ImplementsDefaultHasInstance, t1", |
| " orq ValueFalse, t1", |
| " storeq t1, 0[cfr, t3, 8]", |
| " dispatch(constexpr (op_overrides_has_instance_length))", |
| ".opOverridesHasInstanceNotDefaultSymbol:", |
| " storeq ValueTrue, 0[cfr, t3, 8]", |
| " dispatch(constexpr (op_overrides_has_instance_length))", |
| "_llint_op_instanceof_custom:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_llint_slow_path_instanceof_custom)", |
| " dispatch(constexpr (op_instanceof_custom_length))", |
| "_llint_op_is_empty:", |
| " traceExecution()", |
| " loadisFromInstruction(2, t1)", |
| " loadisFromInstruction(1, t2)", |
| " loadConstantOrVariable(t1, t0)", |
| " cqeq t0, ValueEmpty, t3", |
| " orq ValueFalse, t3", |
| " storeq t3, 0[cfr, t2, 8]", |
| " dispatch(constexpr (op_is_empty_length))", |
| "_llint_op_is_undefined:", |
| " traceExecution()", |
| " loadisFromInstruction(2, t1)", |
| " loadisFromInstruction(1, t2)", |
| " loadConstantOrVariable(t1, t0)", |
| " btqz t0, tagMask, .opIsUndefinedCell", |
| " cqeq t0, ValueUndefined, t3", |
| " orq ValueFalse, t3", |
| " storeq t3, 0[cfr, t2, 8]", |
| " dispatch(constexpr (op_is_undefined_length))", |
| ".opIsUndefinedCell:", |
| " btbnz JSCell::m_flags[t0], MasqueradesAsUndefined, .masqueradesAsUndefined", |
| " move ValueFalse, t1", |
| " storeq t1, 0[cfr, t2, 8]", |
| " dispatch(constexpr (op_is_undefined_length))", |
| ".masqueradesAsUndefined:", |
| " loadStructureWithScratch(t0, t3, t1)", |
| " loadp CodeBlock[cfr], t1", |
| " loadp CodeBlock::m_globalObject[t1], t1", |
| " cpeq Structure::m_globalObject[t3], t1, t0", |
| " orq ValueFalse, t0", |
| " storeq t0, 0[cfr, t2, 8]", |
| " dispatch(constexpr (op_is_undefined_length))", |
| "_llint_op_is_boolean:", |
| " traceExecution()", |
| " loadisFromInstruction(2, t1)", |
| " loadisFromInstruction(1, t2)", |
| " loadConstantOrVariable(t1, t0)", |
| " xorq ValueFalse, t0", |
| " tqz t0, (~1), t0", |
| " orq ValueFalse, t0", |
| " storeq t0, 0[cfr, t2, 8]", |
| " dispatch(constexpr (op_is_boolean_length))", |
| "_llint_op_is_number:", |
| " traceExecution()", |
| " loadisFromInstruction(2, t1)", |
| " loadisFromInstruction(1, t2)", |
| " loadConstantOrVariable(t1, t0)", |
| " tqnz t0, tagTypeNumber, t1", |
| " orq ValueFalse, t1", |
| " storeq t1, 0[cfr, t2, 8]", |
| " dispatch(constexpr (op_is_number_length))", |
| "_llint_op_is_cell_with_type:", |
| " traceExecution()", |
| " loadisFromInstruction(3, t0)", |
| " loadisFromInstruction(2, t1)", |
| " loadisFromInstruction(1, t2)", |
| " loadConstantOrVariable(t1, t3)", |
| " btqnz t3, tagMask, .notCellCase", |
| " cbeq JSCell::m_type[t3], t0, t1", |
| " orq ValueFalse, t1", |
| " storeq t1, 0[cfr, t2, 8]", |
| " dispatch(constexpr (op_is_cell_with_type_length))", |
| ".notCellCase:", |
| " storeq ValueFalse, 0[cfr, t2, 8]", |
| " dispatch(constexpr (op_is_cell_with_type_length))", |
| "_llint_op_is_object:", |
| " traceExecution()", |
| " loadisFromInstruction(2, t1)", |
| " loadisFromInstruction(1, t2)", |
| " loadConstantOrVariable(t1, t0)", |
| " btqnz t0, tagMask, .opIsObjectNotCell", |
| " cbaeq JSCell::m_type[t0], ObjectType, t1", |
| " orq ValueFalse, t1", |
| " storeq t1, 0[cfr, t2, 8]", |
| " dispatch(constexpr (op_is_object_length))", |
| ".opIsObjectNotCell:", |
| " storeq ValueFalse, 0[cfr, t2, 8]", |
| " dispatch(constexpr (op_is_object_length))", |
| "macro loadPropertyAtVariableOffset(propertyOffsetAsInt, objectAndStorage, value)", |
| " bilt propertyOffsetAsInt, firstOutOfLineOffset, .isInline", |
| " loadCaged(_g_jsValueGigacageBasePtr, JSObject::m_butterfly[objectAndStorage], objectAndStorage, value)", |
| " negi propertyOffsetAsInt", |
| " sxi2q propertyOffsetAsInt, propertyOffsetAsInt", |
| " jmp .ready", |
| ".isInline:", |
| " addp (sizeof JSObject - ((firstOutOfLineOffset - 2) * 8)), objectAndStorage", |
| ".ready:", |
| " loadq ((firstOutOfLineOffset - 2) * 8)[objectAndStorage, propertyOffsetAsInt, 8], value", |
| "end", |
| "macro storePropertyAtVariableOffset(propertyOffsetAsInt, objectAndStorage, value, scratch)", |
| " bilt propertyOffsetAsInt, firstOutOfLineOffset, .isInline", |
| " loadCaged(_g_jsValueGigacageBasePtr, JSObject::m_butterfly[objectAndStorage], objectAndStorage, scratch)", |
| " negi propertyOffsetAsInt", |
| " sxi2q propertyOffsetAsInt, propertyOffsetAsInt", |
| " jmp .ready", |
| ".isInline:", |
| " addp (sizeof JSObject - ((firstOutOfLineOffset - 2) * 8)), objectAndStorage", |
| ".ready:", |
| " storeq value, ((firstOutOfLineOffset - 2) * 8)[objectAndStorage, propertyOffsetAsInt, 8]", |
| "end", |
| "_llint_op_get_by_id:", |
| " traceExecution()", |
| " loadisFromInstruction(2, t0)", |
| " loadConstantOrVariableCell(t0, t3, .opGetByIdSlow)", |
| " loadi JSCell::m_structureID[t3], t1", |
| " loadisFromInstruction(4, t2)", |
| " bineq t2, t1, .opGetByIdSlow", |
| " loadisFromInstruction(5, t1)", |
| " loadisFromInstruction(1, t2)", |
| " loadPropertyAtVariableOffset(t1, t3, t0)", |
| " storeq t0, 0[cfr, t2, 8]", |
| " valueProfile(t0, 8, t1)", |
| " dispatch(constexpr (op_get_by_id_length))", |
| ".opGetByIdSlow:", |
| " callOpcodeSlowPath(_llint_slow_path_get_by_id)", |
| " dispatch(constexpr (op_get_by_id_length))", |
| "_llint_op_get_by_id_proto_load:", |
| " traceExecution()", |
| " loadisFromInstruction(2, t0)", |
| " loadConstantOrVariableCell(t0, t3, .opGetByIdProtoSlow)", |
| " loadi JSCell::m_structureID[t3], t1", |
| " loadisFromInstruction(4, t2)", |
| " bineq t2, t1, .opGetByIdProtoSlow", |
| " loadisFromInstruction(5, t1)", |
| " loadpFromInstruction(6, t3)", |
| " loadisFromInstruction(1, t2)", |
| " loadPropertyAtVariableOffset(t1, t3, t0)", |
| " storeq t0, 0[cfr, t2, 8]", |
| " valueProfile(t0, 8, t1)", |
| " dispatch(constexpr (op_get_by_id_proto_load_length))", |
| ".opGetByIdProtoSlow:", |
| " callOpcodeSlowPath(_llint_slow_path_get_by_id)", |
| " dispatch(constexpr (op_get_by_id_proto_load_length))", |
| "_llint_op_get_by_id_unset:", |
| " traceExecution()", |
| " loadisFromInstruction(2, t0)", |
| " loadConstantOrVariableCell(t0, t3, .opGetByIdUnsetSlow)", |
| " loadi JSCell::m_structureID[t3], t1", |
| " loadisFromInstruction(4, t2)", |
| " bineq t2, t1, .opGetByIdUnsetSlow", |
| " loadisFromInstruction(1, t2)", |
| " storeq ValueUndefined, 0[cfr, t2, 8]", |
| " valueProfile(ValueUndefined, 8, t1)", |
| " dispatch(constexpr (op_get_by_id_unset_length))", |
| ".opGetByIdUnsetSlow:", |
| " callOpcodeSlowPath(_llint_slow_path_get_by_id)", |
| " dispatch(constexpr (op_get_by_id_unset_length))", |
| "_llint_op_get_array_length:", |
| " traceExecution()", |
| " loadisFromInstruction(2, t0)", |
| " loadpFromInstruction(4, t1)", |
| " loadConstantOrVariableCell(t0, t3, .opGetArrayLengthSlow)", |
| " move t3, t2", |
| " arrayProfile(t2, t1, t0)", |
| " btiz t2, IsArray, .opGetArrayLengthSlow", |
| " btiz t2, IndexingShapeMask, .opGetArrayLengthSlow", |
| " loadisFromInstruction(1, t1)", |
| " loadCaged(_g_jsValueGigacageBasePtr, JSObject::m_butterfly[t3], t0, t2)", |
| " loadi ((-sizeof IndexingHeader) + IndexingHeader::u.lengths.publicLength)[t0], t0", |
| " bilt t0, 0, .opGetArrayLengthSlow", |
| " orq tagTypeNumber, t0", |
| " valueProfile(t0, 8, t2)", |
| " storeq t0, 0[cfr, t1, 8]", |
| " dispatch(constexpr (op_get_array_length_length))", |
| ".opGetArrayLengthSlow:", |
| " callOpcodeSlowPath(_llint_slow_path_get_by_id)", |
| " dispatch(constexpr (op_get_array_length_length))", |
| "_llint_op_put_by_id:", |
| " traceExecution()", |
| " loadisFromInstruction(1, t3)", |
| " loadConstantOrVariableCell(t3, t0, .opPutByIdSlow)", |
| " loadisFromInstruction(4, t2)", |
| " bineq t2, JSCell::m_structureID[t0], .opPutByIdSlow", |
| " loadisFromInstruction(3, t1)", |
| " loadConstantOrVariable(t1, t3)", |
| " loadpFromInstruction(8, t1)", |
| " btpnz t1, PutByIdPrimaryTypeMask, .opPutByIdTypeCheckObjectWithStructureOrOther", |
| " andp PutByIdSecondaryTypeMask, t1", |
| " bplt t1, PutByIdSecondaryTypeString, .opPutByIdTypeCheckLessThanString", |
| " bplt t1, PutByIdSecondaryTypeObjectOrOther, .opPutByIdTypeCheckLessThanObjectOrOther", |
| " bpeq t1, PutByIdSecondaryTypeTop, .opPutByIdDoneCheckingTypes", |
| " btqz t3, tagMask, .opPutByIdTypeCheckObject", |
| ".opPutByIdTypeCheckOther:", |
| " andq (~TagBitUndefined), t3", |
| " bqeq t3, ValueNull, .opPutByIdDoneCheckingTypes", |
| " jmp .opPutByIdSlow", |
| ".opPutByIdTypeCheckLessThanObjectOrOther:", |
| " btqnz t3, tagMask, .opPutByIdSlow", |
| " bpeq t1, PutByIdSecondaryTypeObject, .opPutByIdTypeCheckObject", |
| " bpeq t1, PutByIdSecondaryTypeSymbol, .opPutByIdTypeCheckSymbol", |
| " bbeq JSCell::m_type[t3], StringType, .opPutByIdDoneCheckingTypes", |
| " jmp .opPutByIdSlow", |
| ".opPutByIdTypeCheckObject:", |
| " bbaeq JSCell::m_type[t3], ObjectType, .opPutByIdDoneCheckingTypes", |
| " jmp .opPutByIdSlow", |
| ".opPutByIdTypeCheckSymbol:", |
| " bbeq JSCell::m_type[t3], SymbolType, .opPutByIdDoneCheckingTypes", |
| " jmp .opPutByIdSlow", |
| ".opPutByIdTypeCheckLessThanString:", |
| " bplt t1, PutByIdSecondaryTypeInt32, .opPutByIdTypeCheckLessThanInt32", |
| " bpeq t1, PutByIdSecondaryTypeNumber, .opPutByIdTypeCheckNumber", |
| " bqaeq t3, tagTypeNumber, .opPutByIdDoneCheckingTypes", |
| " jmp .opPutByIdSlow", |
| ".opPutByIdTypeCheckNumber:", |
| " btqnz t3, tagTypeNumber, .opPutByIdDoneCheckingTypes", |
| " jmp .opPutByIdSlow", |
| ".opPutByIdTypeCheckLessThanInt32:", |
| " bpneq t1, PutByIdSecondaryTypeBoolean, .opPutByIdTypeCheckBottomOrOther", |
| " xorq ValueFalse, t3", |
| " btqz t3, (~1), .opPutByIdDoneCheckingTypes", |
| " jmp .opPutByIdSlow", |
| ".opPutByIdTypeCheckBottomOrOther:", |
| " bpeq t1, PutByIdSecondaryTypeOther, .opPutByIdTypeCheckOther", |
| " jmp .opPutByIdSlow", |
| ".opPutByIdTypeCheckObjectWithStructureOrOther:", |
| " btqz t3, tagMask, .opPutByIdTypeCheckObjectWithStructure", |
| " btpnz t1, PutByIdPrimaryTypeObjectWithStructureOrOther, .opPutByIdTypeCheckOther", |
| " jmp .opPutByIdSlow", |
| ".opPutByIdTypeCheckObjectWithStructure:", |
| " urshiftp 3, t1", |
| " bineq t1, JSCell::m_structureID[t3], .opPutByIdSlow", |
| ".opPutByIdDoneCheckingTypes:", |
| " loadisFromInstruction(6, t1)", |
| " btiz t1, .opPutByIdNotTransition", |
| " loadpFromInstruction(7, t3)", |
| " btpz t3, .opPutByIdTransitionDirect", |
| " loadp StructureChain::m_vector[t3], t3", |
| " assert(macro (ok)", |
| " btpnz t3, ok", |
| "end)", |
| " structureIDToStructureWithScratch(t2, t1)", |
| " loadq Structure::m_prototype[t2], t2", |
| " bqeq t2, ValueNull, .opPutByIdTransitionChainDone", |
| ".opPutByIdTransitionChainLoop:", |
| " loadp 0[t3], t1", |
| " loadi JSCell::m_structureID[t2], t2", |
| " bineq t2, (Structure::m_blob + StructureIDBlob::u.fields.structureID)[t1], .opPutByIdSlow", |
| " addp 8, t3", |
| " loadq Structure::m_prototype[t1], t2", |
| " bqneq t2, ValueNull, .opPutByIdTransitionChainLoop", |
| ".opPutByIdTransitionChainDone:", |
| " loadisFromInstruction(6, t1)", |
| ".opPutByIdTransitionDirect:", |
| " storei t1, JSCell::m_structureID[t0]", |
| " writeBarrierOnOperand(1)", |
| " loadisFromInstruction(1, t1)", |
| " loadConstantOrVariable(t1, t0)", |
| ".opPutByIdNotTransition:", |
| " loadisFromInstruction(3, t1)", |
| " loadConstantOrVariable(t1, t2)", |
| " loadisFromInstruction(5, t1)", |
| " storePropertyAtVariableOffset(t1, t0, t2, t3)", |
| " writeBarrierOnOperands(1, 3)", |
| " dispatch(constexpr (op_put_by_id_length))", |
| ".opPutByIdSlow:", |
| " callOpcodeSlowPath(_llint_slow_path_put_by_id)", |
| " dispatch(constexpr (op_put_by_id_length))", |
| "macro finishGetByVal(result, scratch)", |
| " loadisFromInstruction(1, scratch)", |
| " storeq result, 0[cfr, scratch, 8]", |
| " valueProfile(result, 5, scratch)", |
| " dispatch(6)", |
| "end", |
| "macro finishIntGetByVal(result, scratch)", |
| " orq tagTypeNumber, result", |
| " finishGetByVal(result, scratch)", |
| "end", |
| "macro finishDoubleGetByVal(result, scratch1, scratch2)", |
| " fd2q result, scratch1", |
| " subq tagTypeNumber, scratch1", |
| " finishGetByVal(scratch1, scratch2)", |
| "end", |
| "_llint_op_get_by_val:", |
| " traceExecution()", |
| " loadisFromInstruction(2, t2)", |
| " loadConstantOrVariableCell(t2, t0, .opGetByValSlow)", |
| " loadpFromInstruction(4, t3)", |
| " move t0, t2", |
| " arrayProfile(t2, t3, t1)", |
| " loadisFromInstruction(3, t3)", |
| " loadConstantOrVariableInt32(t3, t1, .opGetByValSlow)", |
| " sxi2q t1, t1", |
| " loadCaged(_g_jsValueGigacageBasePtr, JSObject::m_butterfly[t0], t3, t5)", |
| " andi IndexingShapeMask, t2", |
| " bieq t2, Int32Shape, .opGetByValIsContiguous", |
| " bineq t2, ContiguousShape, .opGetByValNotContiguous", |
| ".opGetByValIsContiguous:", |
| " biaeq t1, ((-sizeof IndexingHeader) + IndexingHeader::u.lengths.publicLength)[t3], .opGetByValOutOfBounds", |
| " loadisFromInstruction(1, t0)", |
| " loadq 0[t3, t1, 8], t2", |
| " btqz t2, .opGetByValOutOfBounds", |
| " jmp .opGetByValDone", |
| ".opGetByValNotContiguous:", |
| " bineq t2, DoubleShape, .opGetByValNotDouble", |
| " biaeq t1, ((-sizeof IndexingHeader) + IndexingHeader::u.lengths.publicLength)[t3], .opGetByValOutOfBounds", |
| " loadis 8[PB, PC, 8], t0", |
| " loadd 0[t3, t1, 8], ft0", |
| " bdnequn ft0, ft0, .opGetByValOutOfBounds", |
| " fd2q ft0, t2", |
| " subq tagTypeNumber, t2", |
| " jmp .opGetByValDone", |
| ".opGetByValNotDouble:", |
| " subi ArrayStorageShape, t2", |
| " bia t2, (SlowPutArrayStorageShape - ArrayStorageShape), .opGetByValNotIndexedStorage", |
| " biaeq t1, ((-sizeof IndexingHeader) + IndexingHeader::u.lengths.vectorLength)[t3], .opGetByValOutOfBounds", |
| " loadisFromInstruction(1, t0)", |
| " loadq ArrayStorage::m_vector[t3, t1, 8], t2", |
| " btqz t2, .opGetByValOutOfBounds", |
| ".opGetByValDone:", |
| " storeq t2, 0[cfr, t0, 8]", |
| " valueProfile(t2, 5, t0)", |
| " dispatch(constexpr (op_get_by_val_length))", |
| ".opGetByValOutOfBounds:", |
| " loadpFromInstruction(4, t0)", |
| " storeb 1, ArrayProfile::m_outOfBounds[t0]", |
| " jmp .opGetByValSlow", |
| ".opGetByValNotIndexedStorage:", |
| " loadb JSCell::m_type[t0], t2", |
| " subi FirstArrayType, t2", |
| " bia t2, (LastArrayType - FirstArrayType), .opGetByValSlow", |
| " loadCaged(_g_primitiveGigacageBasePtr, JSArrayBufferView::m_vector[t0], t3, t5)", |
| " biaeq t1, JSArrayBufferView::m_length[t0], .opGetByValSlow", |
| " bia t2, (Uint8ClampedArrayType - FirstArrayType), .opGetByValAboveUint8ClampedArray", |
| " bia t2, (Int16ArrayType - FirstArrayType), .opGetByValInt32ArrayOrUint8Array", |
| " bineq t2, (Int8ArrayType - FirstArrayType), .opGetByValInt16Array", |
| " loadbs 0[t3, t1, 1], t0", |
| " finishIntGetByVal(t0, t1)", |
| ".opGetByValInt16Array:", |
| " loadhs 0[t3, t1, 2], t0", |
| " finishIntGetByVal(t0, t1)", |
| ".opGetByValInt32ArrayOrUint8Array:", |
| " bieq t2, (Int32ArrayType - FirstArrayType), .opGetByValInt32Array", |
| " loadb 0[t3, t1, 1], t0", |
| " finishIntGetByVal(t0, t1)", |
| ".opGetByValInt32Array:", |
| " loadi 0[t3, t1, 4], t0", |
| " finishIntGetByVal(t0, t1)", |
| ".opGetByValAboveUint8ClampedArray:", |
| " bia t2, (Uint32ArrayType - FirstArrayType), .opGetByValAboveUint32Array", |
| " bieq t2, (Uint32ArrayType - FirstArrayType), .opGetByValUint32Array", |
| " loadh 0[t3, t1, 2], t0", |
| " finishIntGetByVal(t0, t1)", |
| ".opGetByValUint32Array:", |
| " loadi 0[t3, t1, 4], t0", |
| " bilt t0, 0, .opGetByValSlow", |
| " finishIntGetByVal(t0, t1)", |
| ".opGetByValAboveUint32Array:", |
| " bieq t2, (Float32ArrayType - FirstArrayType), .opGetByValSlow", |
| " loadd 0[t3, t1, 8], ft0", |
| " bdnequn ft0, ft0, .opGetByValSlow", |
| " finishDoubleGetByVal(ft0, t0, t1)", |
| ".opGetByValSlow:", |
| " callOpcodeSlowPath(_llint_slow_path_get_by_val)", |
| " dispatch(constexpr (op_get_by_val_length))", |
| "macro contiguousPutByVal(storeCallback)", |
| " biaeq t3, ((-sizeof IndexingHeader) + IndexingHeader::u.lengths.publicLength)[t0], .outOfBounds", |
| ".storeResult:", |
| " loadisFromInstruction(3, t2)", |
| " storeCallback(t2, t1, 0[t0, t3, 8])", |
| " dispatch(5)", |
| ".outOfBounds:", |
| " biaeq t3, ((-sizeof IndexingHeader) + IndexingHeader::u.lengths.vectorLength)[t0], .opPutByValOutOfBounds", |
| " loadp 32[PB, PC, 8], t2", |
| " storeb 1, ArrayProfile::m_mayStoreToHole[t2]", |
| " addi 1, t3, t2", |
| " storei t2, ((-sizeof IndexingHeader) + IndexingHeader::u.lengths.publicLength)[t0]", |
| " jmp .storeResult", |
| "end", |
| "macro putByVal(slowPath)", |
| " traceExecution()", |
| " loadisFromInstruction(1, t0)", |
| " loadConstantOrVariableCell(t0, t1, .opPutByValSlow)", |
| " loadpFromInstruction(4, t3)", |
| " move t1, t2", |
| " arrayProfile(t2, t3, t0)", |
| " loadisFromInstruction(2, t0)", |
| " loadConstantOrVariableInt32(t0, t3, .opPutByValSlow)", |
| " sxi2q t3, t3", |
| " loadCaged(_g_jsValueGigacageBasePtr, JSObject::m_butterfly[t1], t0, t5)", |
| " andi IndexingShapeMask, t2", |
| " bineq t2, Int32Shape, .opPutByValNotInt32", |
| " contiguousPutByVal(macro (operand, scratch, address)", |
| " loadConstantOrVariable(operand, scratch)", |
| " bpb scratch, tagTypeNumber, .opPutByValSlow", |
| " storep scratch, address", |
| " writeBarrierOnOperands(1, 3)", |
| "end)", |
| ".opPutByValNotInt32:", |
| " bineq t2, DoubleShape, .opPutByValNotDouble", |
| " contiguousPutByVal(macro (operand, scratch, address)", |
| " loadConstantOrVariable(operand, scratch)", |
| " bqb scratch, tagTypeNumber, .notInt", |
| " ci2d scratch, ft0", |
| " jmp .ready", |
| ".notInt:", |
| " addp tagTypeNumber, scratch", |
| " fq2d scratch, ft0", |
| " bdnequn ft0, ft0, .opPutByValSlow", |
| ".ready:", |
| " stored ft0, address", |
| " writeBarrierOnOperands(1, 3)", |
| "end)", |
| ".opPutByValNotDouble:", |
| " bineq t2, ContiguousShape, .opPutByValNotContiguous", |
| " contiguousPutByVal(macro (operand, scratch, address)", |
| " loadConstantOrVariable(operand, scratch)", |
| " storep scratch, address", |
| " writeBarrierOnOperands(1, 3)", |
| "end)", |
| ".opPutByValNotContiguous:", |
| " bineq t2, ArrayStorageShape, .opPutByValSlow", |
| " biaeq t3, ((-sizeof IndexingHeader) + IndexingHeader::u.lengths.vectorLength)[t0], .opPutByValOutOfBounds", |
| " btqz ArrayStorage::m_vector[t0, t3, 8], .opPutByValArrayStorageEmpty", |
| ".opPutByValArrayStorageStoreResult:", |
| " loadisFromInstruction(3, t2)", |
| " loadConstantOrVariable(t2, t1)", |
| " storeq t1, ArrayStorage::m_vector[t0, t3, 8]", |
| " writeBarrierOnOperands(1, 3)", |
| " dispatch(5)", |
| ".opPutByValArrayStorageEmpty:", |
| " loadpFromInstruction(4, t1)", |
| " storeb 1, ArrayProfile::m_mayStoreToHole[t1]", |
| " addi 1, ArrayStorage::m_numValuesInVector[t0]", |
| " bib t3, ((-sizeof IndexingHeader) + IndexingHeader::u.lengths.publicLength)[t0], .opPutByValArrayStorageStoreResult", |
| " addi 1, t3, t1", |
| " storei t1, ((-sizeof IndexingHeader) + IndexingHeader::u.lengths.publicLength)[t0]", |
| " jmp .opPutByValArrayStorageStoreResult", |
| ".opPutByValOutOfBounds:", |
| " loadpFromInstruction(4, t0)", |
| " storeb 1, ArrayProfile::m_outOfBounds[t0]", |
| ".opPutByValSlow:", |
| " callOpcodeSlowPath(slowPath)", |
| " dispatch(5)", |
| "end", |
| "_llint_op_put_by_val:", |
| " putByVal(_llint_slow_path_put_by_val)", |
| "_llint_op_put_by_val_direct:", |
| " putByVal(_llint_slow_path_put_by_val_direct)", |
| "_llint_op_jmp:", |
| " traceExecution()", |
| " dispatchIntIndirect(1)", |
| "macro jumpTrueOrFalse(conditionOp, slow)", |
| " loadisFromInstruction(1, t1)", |
| " loadConstantOrVariable(t1, t0)", |
| " xorq ValueFalse, t0", |
| " btqnz t0, (-1), .slow", |
| " conditionOp(t0, .target)", |
| " dispatch(3)", |
| ".target:", |
| " dispatchIntIndirect(2)", |
| ".slow:", |
| " callOpcodeSlowPath(slow)", |
| " dispatch(0)", |
| "end", |
| "macro equalNull(cellHandler, immediateHandler)", |
| " loadisFromInstruction(1, t0)", |
| " assertNotConstant(t0)", |
| " loadq 0[cfr, t0, 8], t0", |
| " btqnz t0, tagMask, .immediate", |
| " loadStructureWithScratch(t0, t2, t1)", |
| " cellHandler(t2, JSCell::m_flags[t0], .target)", |
| " dispatch(3)", |
| ".target:", |
| " dispatchIntIndirect(2)", |
| ".immediate:", |
| " andq (~TagBitUndefined), t0", |
| " immediateHandler(t0, .target)", |
| " dispatch(3)", |
| "end", |
| "_llint_op_jeq_null:", |
| " traceExecution()", |
| " equalNull(macro (structure, value, target)", |
| " btbz value, MasqueradesAsUndefined, .notMasqueradesAsUndefined", |
| " loadp CodeBlock[cfr], t0", |
| " loadp CodeBlock::m_globalObject[t0], t0", |
| " bpeq Structure::m_globalObject[structure], t0, target", |
| ".notMasqueradesAsUndefined:", |
| "end, macro (value, target)", |
| " bqeq value, ValueNull, target", |
| "end)", |
| "_llint_op_jneq_null:", |
| " traceExecution()", |
| " equalNull(macro (structure, value, target)", |
| " btbz value, MasqueradesAsUndefined, target", |
| " loadp CodeBlock[cfr], t0", |
| " loadp CodeBlock::m_globalObject[t0], t0", |
| " bpneq Structure::m_globalObject[structure], t0, target", |
| "end, macro (value, target)", |
| " bqneq value, ValueNull, target", |
| "end)", |
| "_llint_op_jneq_ptr:", |
| " traceExecution()", |
| " loadisFromInstruction(1, t0)", |
| " loadisFromInstruction(2, t1)", |
| " loadp CodeBlock[cfr], t2", |
| " loadp CodeBlock::m_globalObject[t2], t2", |
| " loadp JSGlobalObject::m_specialPointers[t2, t1, 8], t1", |
| " bpneq t1, 0[cfr, t0, 8], .opJneqPtrTarget", |
| " dispatch(5)", |
| ".opJneqPtrTarget:", |
| " storei 1, 32[PB, PC, 8]", |
| " dispatchIntIndirect(3)", |
| "macro compare(integerCompare, doubleCompare, slowPath)", |
| " loadisFromInstruction(1, t2)", |
| " loadisFromInstruction(2, t3)", |
| " loadConstantOrVariable(t2, t0)", |
| " loadConstantOrVariable(t3, t1)", |
| " bqb t0, tagTypeNumber, .op1NotInt", |
| " bqb t1, tagTypeNumber, .op2NotInt", |
| " integerCompare(t0, t1, .jumpTarget)", |
| " dispatch(4)", |
| ".op1NotInt:", |
| " btqz t0, tagTypeNumber, .slow", |
| " bqb t1, tagTypeNumber, .op1NotIntOp2NotInt", |
| " ci2d t1, ft1", |
| " jmp .op1NotIntReady", |
| ".op1NotIntOp2NotInt:", |
| " btqz t1, tagTypeNumber, .slow", |
| " addq tagTypeNumber, t1", |
| " fq2d t1, ft1", |
| ".op1NotIntReady:", |
| " addq tagTypeNumber, t0", |
| " fq2d t0, ft0", |
| " doubleCompare(ft0, ft1, .jumpTarget)", |
| " dispatch(4)", |
| ".op2NotInt:", |
| " ci2d t0, ft0", |
| " btqz t1, tagTypeNumber, .slow", |
| " addq tagTypeNumber, t1", |
| " fq2d t1, ft1", |
| " doubleCompare(ft0, ft1, .jumpTarget)", |
| " dispatch(4)", |
| ".jumpTarget:", |
| " dispatchIntIndirect(3)", |
| ".slow:", |
| " callOpcodeSlowPath(slowPath)", |
| " dispatch(0)", |
| "end", |
| "_llint_op_switch_imm:", |
| " traceExecution()", |
| " loadisFromInstruction(3, t2)", |
| " loadisFromInstruction(1, t3)", |
| " loadConstantOrVariable(t2, t1)", |
| " loadp CodeBlock[cfr], t2", |
| " loadp CodeBlock::m_rareData[t2], t2", |
| " muli sizeof SimpleJumpTable, t3", |
| " loadp (CodeBlock::RareData::m_switchJumpTables + VectorBufferOffset)[t2], t2", |
| " addp t3, t2", |
| " bqb t1, tagTypeNumber, .opSwitchImmNotInt", |
| " subi SimpleJumpTable::min[t2], t1", |
| " biaeq t1, (SimpleJumpTable::branchOffsets + VectorSizeOffset)[t2], .opSwitchImmFallThrough", |
| " loadp (SimpleJumpTable::branchOffsets + VectorBufferOffset)[t2], t3", |
| " loadis 0[t3, t1, 4], t1", |
| " btiz t1, .opSwitchImmFallThrough", |
| " dispatch(t1)", |
| ".opSwitchImmNotInt:", |
| " btqnz t1, tagTypeNumber, .opSwitchImmSlow", |
| ".opSwitchImmFallThrough:", |
| " dispatchIntIndirect(2)", |
| ".opSwitchImmSlow:", |
| " callOpcodeSlowPath(_llint_slow_path_switch_imm)", |
| " dispatch(0)", |
| "_llint_op_switch_char:", |
| " traceExecution()", |
| " loadisFromInstruction(3, t2)", |
| " loadisFromInstruction(1, t3)", |
| " loadConstantOrVariable(t2, t1)", |
| " loadp CodeBlock[cfr], t2", |
| " loadp CodeBlock::m_rareData[t2], t2", |
| " muli sizeof SimpleJumpTable, t3", |
| " loadp (CodeBlock::RareData::m_switchJumpTables + VectorBufferOffset)[t2], t2", |
| " addp t3, t2", |
| " btqnz t1, tagMask, .opSwitchCharFallThrough", |
| " bbneq JSCell::m_type[t1], StringType, .opSwitchCharFallThrough", |
| " bineq JSString::m_length[t1], 1, .opSwitchCharFallThrough", |
| " loadp JSString::m_value[t1], t0", |
| " btpz t0, .opSwitchOnRope", |
| " loadp StringImpl::m_data8[t0], t1", |
| " btinz StringImpl::m_hashAndFlags[t0], HashFlags8BitBuffer, .opSwitchChar8Bit", |
| " loadh 0[t1], t0", |
| " jmp .opSwitchCharReady", |
| ".opSwitchChar8Bit:", |
| " loadb 0[t1], t0", |
| ".opSwitchCharReady:", |
| " subi SimpleJumpTable::min[t2], t0", |
| " biaeq t0, (SimpleJumpTable::branchOffsets + VectorSizeOffset)[t2], .opSwitchCharFallThrough", |
| " loadp (SimpleJumpTable::branchOffsets + VectorBufferOffset)[t2], t2", |
| " loadis 0[t2, t0, 4], t1", |
| " btiz t1, .opSwitchCharFallThrough", |
| " dispatch(t1)", |
| ".opSwitchCharFallThrough:", |
| " dispatchIntIndirect(2)", |
| ".opSwitchOnRope:", |
| " callOpcodeSlowPath(_llint_slow_path_switch_char)", |
| " dispatch(0)", |
| "macro arrayProfileForCall()", |
| " loadisFromInstruction(4, t3)", |
| " negp t3", |
| " loadq ThisArgumentOffset[cfr, t3, 8], t0", |
| " btqnz t0, tagMask, .done", |
| " loadpFromInstruction((CallOpCodeSize - 2), t1)", |
| " loadi JSCell::m_structureID[t0], t3", |
| " storei t3, ArrayProfile::m_lastSeenStructureID[t1]", |
| ".done:", |
| "end", |
| "macro doCall(slowPath, prepareCall)", |
| " loadisFromInstruction(2, t0)", |
| " loadpFromInstruction(5, t1)", |
| " loadp LLIntCallLinkInfo::callee[t1], t2", |
| " loadConstantOrVariable(t0, t3)", |
| " bqneq t3, t2, .opCallSlow", |
| " loadisFromInstruction(4, t3)", |
| " lshifti 3, t3", |
| " negp t3", |
| " addp cfr, t3", |
| " storeq t2, Callee[t3]", |
| " loadisFromInstruction(3, t2)", |
| " storei PC, (ArgumentCount + TagOffset)[cfr]", |
| " storei t2, (ArgumentCount + PayloadOffset)[t3]", |
| " move t3, sp", |
| " prepareCall(LLIntCallLinkInfo::machineCodeTarget[t1], t2, t3, t4)", |
| " callTargetFunction(LLIntCallLinkInfo::machineCodeTarget[t1])", |
| ".opCallSlow:", |
| " slowPathForCall(slowPath, prepareCall)", |
| "end", |
| "_llint_op_ret:", |
| " traceExecution()", |
| " checkSwitchToJITForEpilogue()", |
| " loadisFromInstruction(1, t2)", |
| " loadConstantOrVariable(t2, r0)", |
| " doReturn()", |
| "_llint_op_to_primitive:", |
| " traceExecution()", |
| " loadisFromInstruction(2, t2)", |
| " loadisFromInstruction(1, t3)", |
| " loadConstantOrVariable(t2, t0)", |
| " btqnz t0, tagMask, .opToPrimitiveIsImm", |
| " bbaeq JSCell::m_type[t0], ObjectType, .opToPrimitiveSlowCase", |
| ".opToPrimitiveIsImm:", |
| " storeq t0, 0[cfr, t3, 8]", |
| " dispatch(constexpr (op_to_primitive_length))", |
| ".opToPrimitiveSlowCase:", |
| " callOpcodeSlowPath(_slow_path_to_primitive)", |
| " dispatch(constexpr (op_to_primitive_length))", |
| "_llint_op_catch:", |
| " loadp Callee[cfr], t3", |
| " andp MarkedBlockMask, t3", |
| " loadp MarkedBlock::m_vm[t3], t3", |
| " restoreCalleeSavesFromVMEntryFrameCalleeSavesBuffer(t3, t0)", |
| " loadp VM::callFrameForCatch[t3], cfr", |
| " storep 0, VM::callFrameForCatch[t3]", |
| " restoreStackPointerAfterCall()", |
| " loadp CodeBlock[cfr], PB", |
| " loadp CodeBlock::m_instructions[PB], PB", |
| " loadp VM::targetInterpreterPCForThrow[t3], PC", |
| " subp PB, PC", |
| " rshiftp 3, PC", |
| " callOpcodeSlowPath(_llint_slow_path_check_if_exception_is_uncatchable_and_notify_profiler)", |
| " bpeq r1, 0, .isCatchableException", |
| " jmp _llint_throw_from_slow_path_trampoline", |
| ".isCatchableException:", |
| " loadp Callee[cfr], t3", |
| " andp MarkedBlockMask, t3", |
| " loadp MarkedBlock::m_vm[t3], t3", |
| " loadq VM::m_exception[t3], t0", |
| " storeq 0, VM::m_exception[t3]", |
| " loadisFromInstruction(1, t2)", |
| " storeq t0, 0[cfr, t2, 8]", |
| " loadq Exception::m_value[t0], t3", |
| " loadisFromInstruction(2, t2)", |
| " storeq t3, 0[cfr, t2, 8]", |
| " traceExecution()", |
| " dispatch(constexpr (op_catch_length))", |
| "_llint_op_end:", |
| " traceExecution()", |
| " checkSwitchToJITForEpilogue()", |
| " loadisFromInstruction(1, t0)", |
| " assertNotConstant(t0)", |
| " loadq 0[cfr, t0, 8], r0", |
| " doReturn()", |
| "_llint_throw_from_slow_path_trampoline:", |
| " loadp Callee[cfr], t1", |
| " andp MarkedBlockMask, t1", |
| " loadp MarkedBlock::m_vm[t1], t1", |
| " copyCalleeSavesToVMEntryFrameCalleeSavesBuffer(t1, t2)", |
| " callSlowPath(_llint_slow_path_handle_exception)", |
| " loadp Callee[cfr], t1", |
| " andp MarkedBlockMask, t1", |
| " loadp MarkedBlock::m_vm[t1], t1", |
| " jmp VM::targetMachinePCForThrow[t1]", |
| "_llint_throw_during_call_trampoline:", |
| " preserveReturnAddressAfterCall(t2)", |
| " jmp _llint_throw_from_slow_path_trampoline", |
| "macro nativeCallTrampoline(executableOffsetToFunction)", |
| " functionPrologue()", |
| " storep 0, CodeBlock[cfr]", |
| " loadp Callee[cfr], t0", |
| " andp MarkedBlockMask, t0, t1", |
| " loadp MarkedBlock::m_vm[t1], t1", |
| " storep cfr, VM::topCallFrame[t1]", |
| "if (ARM64 or C_LOOP)", |
| " storep lr, ReturnPC[cfr]", |
| "else", |
| " skip", |
| "end", |
| " move cfr, a0", |
| " loadp Callee[cfr], t1", |
| " loadp JSFunction::m_executable[t1], t1", |
| " checkStackPointerAlignment(t3, 3735879681)", |
| "if C_LOOP", |
| " cloopCallNative executableOffsetToFunction[t1]", |
| "else", |
| "if X86_64_WIN", |
| " subp 32, sp", |
| "else", |
| " skip", |
| "end", |
| " call executableOffsetToFunction[t1]", |
| "if X86_64_WIN", |
| " addp 32, sp", |
| "else", |
| " skip", |
| "end", |
| "end", |
| " loadp Callee[cfr], t3", |
| " andp MarkedBlockMask, t3", |
| " loadp MarkedBlock::m_vm[t3], t3", |
| " btqnz VM::m_exception[t3], .handleException", |
| " functionEpilogue()", |
| " ret ", |
| ".handleException:", |
| " storep cfr, VM::topCallFrame[t3]", |
| " jmp _llint_throw_from_slow_path_trampoline", |
| "end", |
| "macro getConstantScope(dst)", |
| " loadpFromInstruction(6, t0)", |
| " loadisFromInstruction(dst, t1)", |
| " storeq t0, 0[cfr, t1, 8]", |
| "end", |
| "macro varInjectionCheck(slowPath)", |
| " loadp CodeBlock[cfr], t0", |
| " loadp CodeBlock::m_globalObject[t0], t0", |
| " loadp JSGlobalObject::m_varInjectionWatchpoint[t0], t0", |
| " bbeq WatchpointSet::m_state[t0], IsInvalidated, slowPath", |
| "end", |
| "macro resolveScope()", |
| " loadisFromInstruction(5, t2)", |
| " loadisFromInstruction(2, t0)", |
| " loadp 0[cfr, t0, 8], t0", |
| " btiz t2, .resolveScopeLoopEnd", |
| ".resolveScopeLoop:", |
| " loadp JSScope::m_next[t0], t0", |
| " subi 1, t2", |
| " btinz t2, .resolveScopeLoop", |
| ".resolveScopeLoopEnd:", |
| " loadisFromInstruction(1, t1)", |
| " storeq t0, 0[cfr, t1, 8]", |
| "end", |
| "_llint_op_resolve_scope:", |
| " traceExecution()", |
| " loadisFromInstruction(4, t0)", |
| " bineq t0, GlobalProperty, .rGlobalVar", |
| " getConstantScope(1)", |
| " dispatch(constexpr (op_resolve_scope_length))", |
| ".rGlobalVar:", |
| " bineq t0, GlobalVar, .rGlobalLexicalVar", |
| " getConstantScope(1)", |
| " dispatch(constexpr (op_resolve_scope_length))", |
| ".rGlobalLexicalVar:", |
| " bineq t0, GlobalLexicalVar, .rClosureVar", |
| " getConstantScope(1)", |
| " dispatch(constexpr (op_resolve_scope_length))", |
| ".rClosureVar:", |
| " bineq t0, ClosureVar, .rModuleVar", |
| " resolveScope()", |
| " dispatch(constexpr (op_resolve_scope_length))", |
| ".rModuleVar:", |
| " bineq t0, ModuleVar, .rGlobalPropertyWithVarInjectionChecks", |
| " getConstantScope(1)", |
| " dispatch(constexpr (op_resolve_scope_length))", |
| ".rGlobalPropertyWithVarInjectionChecks:", |
| " bineq t0, GlobalPropertyWithVarInjectionChecks, .rGlobalVarWithVarInjectionChecks", |
| " varInjectionCheck(.rDynamic)", |
| " getConstantScope(1)", |
| " dispatch(constexpr (op_resolve_scope_length))", |
| ".rGlobalVarWithVarInjectionChecks:", |
| " bineq t0, GlobalVarWithVarInjectionChecks, .rGlobalLexicalVarWithVarInjectionChecks", |
| " varInjectionCheck(.rDynamic)", |
| " getConstantScope(1)", |
| " dispatch(constexpr (op_resolve_scope_length))", |
| ".rGlobalLexicalVarWithVarInjectionChecks:", |
| " bineq t0, GlobalLexicalVarWithVarInjectionChecks, .rClosureVarWithVarInjectionChecks", |
| " varInjectionCheck(.rDynamic)", |
| " getConstantScope(1)", |
| " dispatch(constexpr (op_resolve_scope_length))", |
| ".rClosureVarWithVarInjectionChecks:", |
| " bineq t0, ClosureVarWithVarInjectionChecks, .rDynamic", |
| " varInjectionCheck(.rDynamic)", |
| " resolveScope()", |
| " dispatch(constexpr (op_resolve_scope_length))", |
| ".rDynamic:", |
| " callOpcodeSlowPath(_slow_path_resolve_scope)", |
| " dispatch(constexpr (op_resolve_scope_length))", |
| "macro loadWithStructureCheck(operand, slowPath)", |
| " loadisFromInstruction(operand, t0)", |
| " loadq 0[cfr, t0, 8], t0", |
| " loadStructureWithScratch(t0, t2, t1)", |
| " loadpFromInstruction(5, t1)", |
| " bpneq t2, t1, slowPath", |
| "end", |
| "macro getProperty()", |
| " loadisFromInstruction(6, t1)", |
| " loadPropertyAtVariableOffset(t1, t0, t2)", |
| " valueProfile(t2, 7, t0)", |
| " loadisFromInstruction(1, t0)", |
| " storeq t2, 0[cfr, t0, 8]", |
| "end", |
| "macro getGlobalVar(tdzCheckIfNecessary)", |
| " loadpFromInstruction(6, t0)", |
| " loadq 0[t0], t0", |
| " tdzCheckIfNecessary(t0)", |
| " valueProfile(t0, 7, t1)", |
| " loadisFromInstruction(1, t1)", |
| " storeq t0, 0[cfr, t1, 8]", |
| "end", |
| "macro getClosureVar()", |
| " loadisFromInstruction(6, t1)", |
| " loadq JSEnvironmentRecord_variables[t0, t1, 8], t0", |
| " valueProfile(t0, 7, t1)", |
| " loadisFromInstruction(1, t1)", |
| " storeq t0, 0[cfr, t1, 8]", |
| "end", |
| "_llint_op_get_from_scope:", |
| " traceExecution()", |
| " loadisFromInstruction(4, t0)", |
| " andi ResolveTypeMask, t0", |
| " bineq t0, GlobalProperty, .gGlobalVar", |
| " loadWithStructureCheck(2, .gDynamic)", |
| " getProperty()", |
| " dispatch(constexpr (op_get_from_scope_length))", |
| ".gGlobalVar:", |
| " bineq t0, GlobalVar, .gGlobalLexicalVar", |
| " getGlobalVar(macro (v)", |
| "", |
| "end)", |
| " dispatch(constexpr (op_get_from_scope_length))", |
| ".gGlobalLexicalVar:", |
| " bineq t0, GlobalLexicalVar, .gClosureVar", |
| " getGlobalVar(macro (value)", |
| " bqeq value, ValueEmpty, .gDynamic", |
| "end)", |
| " dispatch(constexpr (op_get_from_scope_length))", |
| ".gClosureVar:", |
| " bineq t0, ClosureVar, .gGlobalPropertyWithVarInjectionChecks", |
| " loadVariable(2, t0)", |
| " getClosureVar()", |
| " dispatch(constexpr (op_get_from_scope_length))", |
| ".gGlobalPropertyWithVarInjectionChecks:", |
| " bineq t0, GlobalPropertyWithVarInjectionChecks, .gGlobalVarWithVarInjectionChecks", |
| " loadWithStructureCheck(2, .gDynamic)", |
| " getProperty()", |
| " dispatch(constexpr (op_get_from_scope_length))", |
| ".gGlobalVarWithVarInjectionChecks:", |
| " bineq t0, GlobalVarWithVarInjectionChecks, .gGlobalLexicalVarWithVarInjectionChecks", |
| " varInjectionCheck(.gDynamic)", |
| " getGlobalVar(macro (v)", |
| "", |
| "end)", |
| " dispatch(constexpr (op_get_from_scope_length))", |
| ".gGlobalLexicalVarWithVarInjectionChecks:", |
| " bineq t0, GlobalLexicalVarWithVarInjectionChecks, .gClosureVarWithVarInjectionChecks", |
| " varInjectionCheck(.gDynamic)", |
| " getGlobalVar(macro (value)", |
| " bqeq value, ValueEmpty, .gDynamic", |
| "end)", |
| " dispatch(constexpr (op_get_from_scope_length))", |
| ".gClosureVarWithVarInjectionChecks:", |
| " bineq t0, ClosureVarWithVarInjectionChecks, .gDynamic", |
| " varInjectionCheck(.gDynamic)", |
| " loadVariable(2, t0)", |
| " getClosureVar()", |
| " dispatch(constexpr (op_get_from_scope_length))", |
| ".gDynamic:", |
| " callOpcodeSlowPath(_llint_slow_path_get_from_scope)", |
| " dispatch(constexpr (op_get_from_scope_length))", |
| "macro putProperty()", |
| " loadisFromInstruction(3, t1)", |
| " loadConstantOrVariable(t1, t2)", |
| " loadisFromInstruction(6, t1)", |
| " storePropertyAtVariableOffset(t1, t0, t2, t3)", |
| "end", |
| "macro putGlobalVariable()", |
| " loadisFromInstruction(3, t0)", |
| " loadConstantOrVariable(t0, t1)", |
| " loadpFromInstruction(5, t2)", |
| " loadpFromInstruction(6, t0)", |
| " notifyWrite(t2, .pDynamic)", |
| " storeq t1, 0[t0]", |
| "end", |
| "macro putClosureVar()", |
| " loadisFromInstruction(3, t1)", |
| " loadConstantOrVariable(t1, t2)", |
| " loadisFromInstruction(6, t1)", |
| " storeq t2, JSEnvironmentRecord_variables[t0, t1, 8]", |
| "end", |
| "macro putLocalClosureVar()", |
| " loadisFromInstruction(3, t1)", |
| " loadConstantOrVariable(t1, t2)", |
| " loadpFromInstruction(5, t3)", |
| " btpz t3, .noVariableWatchpointSet", |
| " notifyWrite(t3, .pDynamic)", |
| ".noVariableWatchpointSet:", |
| " loadisFromInstruction(6, t1)", |
| " storeq t2, JSEnvironmentRecord_variables[t0, t1, 8]", |
| "end", |
| "macro checkTDZInGlobalPutToScopeIfNecessary()", |
| " loadisFromInstruction(4, t0)", |
| " andi InitializationModeMask, t0", |
| " rshifti InitializationModeShift, t0", |
| " bineq t0, NotInitialization, .noNeedForTDZCheck", |
| " loadpFromInstruction(6, t0)", |
| " loadq 0[t0], t0", |
| " bqeq t0, ValueEmpty, .pDynamic", |
| ".noNeedForTDZCheck:", |
| "end", |
| "_llint_op_put_to_scope:", |
| " traceExecution()", |
| " loadisFromInstruction(4, t0)", |
| " andi ResolveTypeMask, t0", |
| " bineq t0, LocalClosureVar, .pGlobalProperty", |
| " loadVariable(1, t0)", |
| " putLocalClosureVar()", |
| " writeBarrierOnOperands(1, 3)", |
| " dispatch(constexpr (op_put_to_scope_length))", |
| ".pGlobalProperty:", |
| " bineq t0, GlobalProperty, .pGlobalVar", |
| " loadWithStructureCheck(1, .pDynamic)", |
| " putProperty()", |
| " writeBarrierOnOperands(1, 3)", |
| " dispatch(constexpr (op_put_to_scope_length))", |
| ".pGlobalVar:", |
| " bineq t0, GlobalVar, .pGlobalLexicalVar", |
| " writeBarrierOnGlobalObject(3)", |
| " putGlobalVariable()", |
| " dispatch(constexpr (op_put_to_scope_length))", |
| ".pGlobalLexicalVar:", |
| " bineq t0, GlobalLexicalVar, .pClosureVar", |
| " writeBarrierOnGlobalLexicalEnvironment(3)", |
| " checkTDZInGlobalPutToScopeIfNecessary()", |
| " putGlobalVariable()", |
| " dispatch(constexpr (op_put_to_scope_length))", |
| ".pClosureVar:", |
| " bineq t0, ClosureVar, .pGlobalPropertyWithVarInjectionChecks", |
| " loadVariable(1, t0)", |
| " putClosureVar()", |
| " writeBarrierOnOperands(1, 3)", |
| " dispatch(constexpr (op_put_to_scope_length))", |
| ".pGlobalPropertyWithVarInjectionChecks:", |
| " bineq t0, GlobalPropertyWithVarInjectionChecks, .pGlobalVarWithVarInjectionChecks", |
| " loadWithStructureCheck(1, .pDynamic)", |
| " putProperty()", |
| " writeBarrierOnOperands(1, 3)", |
| " dispatch(constexpr (op_put_to_scope_length))", |
| ".pGlobalVarWithVarInjectionChecks:", |
| " bineq t0, GlobalVarWithVarInjectionChecks, .pGlobalLexicalVarWithVarInjectionChecks", |
| " writeBarrierOnGlobalObject(3)", |
| " varInjectionCheck(.pDynamic)", |
| " putGlobalVariable()", |
| " dispatch(constexpr (op_put_to_scope_length))", |
| ".pGlobalLexicalVarWithVarInjectionChecks:", |
| " bineq t0, GlobalLexicalVarWithVarInjectionChecks, .pClosureVarWithVarInjectionChecks", |
| " writeBarrierOnGlobalLexicalEnvironment(3)", |
| " varInjectionCheck(.pDynamic)", |
| " checkTDZInGlobalPutToScopeIfNecessary()", |
| " putGlobalVariable()", |
| " dispatch(constexpr (op_put_to_scope_length))", |
| ".pClosureVarWithVarInjectionChecks:", |
| " bineq t0, ClosureVarWithVarInjectionChecks, .pModuleVar", |
| " varInjectionCheck(.pDynamic)", |
| " loadVariable(1, t0)", |
| " putClosureVar()", |
| " writeBarrierOnOperands(1, 3)", |
| " dispatch(constexpr (op_put_to_scope_length))", |
| ".pModuleVar:", |
| " bineq t0, ModuleVar, .pDynamic", |
| " callOpcodeSlowPath(_slow_path_throw_strict_mode_readonly_property_write_error)", |
| " dispatch(constexpr (op_put_to_scope_length))", |
| ".pDynamic:", |
| " callOpcodeSlowPath(_llint_slow_path_put_to_scope)", |
| " dispatch(constexpr (op_put_to_scope_length))", |
| "_llint_op_get_from_arguments:", |
| " traceExecution()", |
| " loadVariable(2, t0)", |
| " loadi 24[PB, PC, 8], t1", |
| " loadq DirectArguments_storage[t0, t1, 8], t0", |
| " valueProfile(t0, 4, t1)", |
| " loadisFromInstruction(1, t1)", |
| " storeq t0, 0[cfr, t1, 8]", |
| " dispatch(constexpr (op_get_from_arguments_length))", |
| "_llint_op_put_to_arguments:", |
| " traceExecution()", |
| " loadVariable(1, t0)", |
| " loadi 16[PB, PC, 8], t1", |
| " loadisFromInstruction(3, t3)", |
| " loadConstantOrVariable(t3, t2)", |
| " storeq t2, DirectArguments_storage[t0, t1, 8]", |
| " writeBarrierOnOperands(1, 3)", |
| " dispatch(constexpr (op_put_to_arguments_length))", |
| "_llint_op_get_parent_scope:", |
| " traceExecution()", |
| " loadVariable(2, t0)", |
| " loadp JSScope::m_next[t0], t0", |
| " loadisFromInstruction(1, t1)", |
| " storeq t0, 0[cfr, t1, 8]", |
| " dispatch(constexpr (op_get_parent_scope_length))", |
| "_llint_op_profile_type:", |
| " traceExecution()", |
| " loadp CodeBlock[cfr], t1", |
| " loadp CodeBlock::m_vm[t1], t1", |
| " loadp VM::m_typeProfilerLog[t1], t1", |
| " loadp TypeProfilerLog::m_currentLogEntryPtr[t1], t2", |
| " loadisFromInstruction(1, t3)", |
| " loadConstantOrVariable(t3, t0)", |
| " bqeq t0, ValueEmpty, .opProfileTypeDone", |
| " storeq t0, TypeProfilerLog::LogEntry::value[t2]", |
| " loadpFromInstruction(2, t3)", |
| " storep t3, TypeProfilerLog::LogEntry::location[t2]", |
| " btqz t0, tagMask, .opProfileTypeIsCell", |
| " storei 0, TypeProfilerLog::LogEntry::structureID[t2]", |
| " jmp .opProfileTypeSkipIsCell", |
| ".opProfileTypeIsCell:", |
| " loadi JSCell::m_structureID[t0], t3", |
| " storei t3, TypeProfilerLog::LogEntry::structureID[t2]", |
| ".opProfileTypeSkipIsCell:", |
| " addp sizeof TypeProfilerLog::LogEntry, t2", |
| " storep t2, TypeProfilerLog::m_currentLogEntryPtr[t1]", |
| " loadp TypeProfilerLog::m_logEndPtr[t1], t1", |
| " bpneq t2, t1, .opProfileTypeDone", |
| " callOpcodeSlowPath(_slow_path_profile_type_clear_log)", |
| ".opProfileTypeDone:", |
| " dispatch(constexpr (op_profile_type_length))", |
| "_llint_op_profile_control_flow:", |
| " traceExecution()", |
| " loadpFromInstruction(1, t0)", |
| " addq 1, BasicBlockLocation::m_executionCount[t0]", |
| " dispatch(constexpr (op_profile_control_flow_length))", |
| "_llint_op_get_rest_length:", |
| " traceExecution()", |
| " loadi (PayloadOffset + ArgumentCount)[cfr], t0", |
| " subi 1, t0", |
| " loadisFromInstruction(2, t1)", |
| " bilteq t0, t1, .storeZero", |
| " subi t1, t0", |
| " jmp .boxUp", |
| ".storeZero:", |
| " move 0, t0", |
| ".boxUp:", |
| " orq tagTypeNumber, t0", |
| " loadisFromInstruction(1, t1)", |
| " storeq t0, 0[cfr, t1, 8]", |
| " dispatch(constexpr (op_get_rest_length_length))", |
| "_llint_op_log_shadow_chicken_prologue:", |
| " traceExecution()", |
| " acquireShadowChickenPacket(.opLogShadowChickenPrologueSlow)", |
| " storep cfr, ShadowChicken::Packet::frame[t0]", |
| " loadp CallerFrame[cfr], t1", |
| " storep t1, ShadowChicken::Packet::callerFrame[t0]", |
| " loadp Callee[cfr], t1", |
| " storep t1, ShadowChicken::Packet::callee[t0]", |
| " loadVariable(1, t1)", |
| " storep t1, ShadowChicken::Packet::scope[t0]", |
| " dispatch(constexpr (op_log_shadow_chicken_prologue_length))", |
| ".opLogShadowChickenPrologueSlow:", |
| " callOpcodeSlowPath(_llint_slow_path_log_shadow_chicken_prologue)", |
| " dispatch(constexpr (op_log_shadow_chicken_prologue_length))", |
| "_llint_op_log_shadow_chicken_tail:", |
| " traceExecution()", |
| " acquireShadowChickenPacket(.opLogShadowChickenTailSlow)", |
| " storep cfr, ShadowChicken::Packet::frame[t0]", |
| " storep ShadowChickenTailMarker, ShadowChicken::Packet::callee[t0]", |
| " loadVariable(1, t1)", |
| " storep t1, ShadowChicken::Packet::thisValue[t0]", |
| " loadVariable(2, t1)", |
| " storep t1, ShadowChicken::Packet::scope[t0]", |
| " loadp CodeBlock[cfr], t1", |
| " storep t1, ShadowChicken::Packet::codeBlock[t0]", |
| " storei PC, ShadowChicken::Packet::callSiteIndex[t0]", |
| " dispatch(constexpr (op_log_shadow_chicken_tail_length))", |
| ".opLogShadowChickenTailSlow:", |
| " callOpcodeSlowPath(_llint_slow_path_log_shadow_chicken_tail)", |
| " dispatch(constexpr (op_log_shadow_chicken_tail_length))", |
| "else", |
| "macro dispatch(advance)", |
| " addp (advance * 4), PC", |
| " jmp 0[PC]", |
| "end", |
| "macro dispatchBranchWithOffset(pcOffset)", |
| " lshifti 2, pcOffset", |
| " addp pcOffset, PC", |
| " jmp 0[PC]", |
| "end", |
| "macro dispatchBranch(pcOffset)", |
| " loadi pcOffset, t0", |
| " dispatchBranchWithOffset(t0)", |
| "end", |
| "macro dispatchAfterCall()", |
| " loadi (ArgumentCount + TagOffset)[cfr], PC", |
| " loadi 4[PC], t3", |
| " storei r1, TagOffset[cfr, t3, 8]", |
| " storei r0, PayloadOffset[cfr, t3, 8]", |
| " valueProfile(r1, r0, (4 * (CallOpCodeSize - 1)), t3)", |
| " dispatch(CallOpCodeSize)", |
| "end", |
| "macro cCall2(function)", |
| "if (((ARM or ARMv7) or ARMv7_TRADITIONAL) or MIPS)", |
| " call function", |
| "else", |
| "if (X86 or X86_WIN)", |
| " subp 8, sp", |
| " push a1", |
| " push a0", |
| " call function", |
| " addp 16, sp", |
| "else", |
| "if C_LOOP", |
| " cloopCallSlowPath function, a0, a1", |
| "else", |
| " error", |
| "end", |
| "end", |
| "end", |
| "end", |
| "macro cCall2Void(function)", |
| "if C_LOOP", |
| " cloopCallSlowPathVoid function, a0, a1", |
| "else", |
| " cCall2(function)", |
| "end", |
| "end", |
| "macro cCall4(function)", |
| "if (((ARM or ARMv7) or ARMv7_TRADITIONAL) or MIPS)", |
| " call function", |
| "else", |
| "if (X86 or X86_WIN)", |
| " push a3", |
| " push a2", |
| " push a1", |
| " push a0", |
| " call function", |
| " addp 16, sp", |
| "else", |
| "if C_LOOP", |
| " error", |
| "else", |
| " error", |
| "end", |
| "end", |
| "end", |
| "end", |
| "macro callSlowPath(slowPath)", |
| " move cfr, a0", |
| " move PC, a1", |
| " cCall2(slowPath)", |
| " move r0, PC", |
| "end", |
| "macro doVMEntry(makeCall)", |
| " functionPrologue()", |
| " pushCalleeSaves()", |
| "if (X86 or X86_WIN)", |
| " loadp 16[cfr], a2", |
| " loadp 12[cfr], a1", |
| " loadp 8[cfr], a0", |
| "else", |
| " skip", |
| "end", |
| "const entry = a0", |
| "const vm = a1", |
| "const protoCallFrame = a2", |
| "if ARMv7", |
| " vmEntryRecord(cfr, t3)", |
| " move t3, sp", |
| "else", |
| " vmEntryRecord(cfr, sp)", |
| "end", |
| " storep vm, VMEntryRecord::m_vm[sp]", |
| " loadp VM::topCallFrame[vm], t4", |
| " storep t4, VMEntryRecord::m_prevTopCallFrame[sp]", |
| " loadp VM::topVMEntryFrame[vm], t4", |
| " storep t4, VMEntryRecord::m_prevTopVMEntryFrame[sp]", |
| "if (X86_WIN or MIPS)", |
| " addp (CallFrameAlignSlots * SlotSize), sp, t3", |
| " andp (~StackAlignmentMask), t3", |
| " subp t3, (CallFrameAlignSlots * SlotSize), sp", |
| "else", |
| "if ((ARM or ARMv7) or ARMv7_TRADITIONAL)", |
| " addp (CallFrameAlignSlots * SlotSize), sp, t3", |
| " clrbp t3, StackAlignmentMask, t3", |
| "if ARMv7", |
| " subp t3, (CallFrameAlignSlots * SlotSize), t3", |
| " move t3, sp", |
| "else", |
| " subp t3, (CallFrameAlignSlots * SlotSize), sp", |
| "end", |
| "else", |
| " skip", |
| "end", |
| "end", |
| " loadi ProtoCallFrame::paddedArgCount[protoCallFrame], t4", |
| " addp CallFrameHeaderSlots, t4, t4", |
| " lshiftp 3, t4", |
| " subp sp, t4, t3", |
| " bpa t3, sp, .throwStackOverflow", |
| "if C_LOOP", |
| " bpaeq t3, VM::m_cloopStackLimit[vm], .stackHeightOK", |
| "else", |
| " bpaeq t3, VM::m_softStackLimit[vm], .stackHeightOK", |
| "end", |
| "if C_LOOP", |
| " move entry, t4", |
| " move vm, t5", |
| " cloopCallSlowPath _llint_stack_check_at_vm_entry, vm, t3", |
| " bpeq t0, 0, .stackCheckFailed", |
| " move t4, entry", |
| " move t5, vm", |
| " jmp .stackHeightOK", |
| ".stackCheckFailed:", |
| " move t4, entry", |
| " move t5, vm", |
| "else", |
| " skip", |
| "end", |
| ".throwStackOverflow:", |
| " subp 8, sp", |
| " move vm, a0", |
| " move protoCallFrame, a1", |
| " cCall2(_llint_throw_stack_overflow_error)", |
| "if ARMv7", |
| " vmEntryRecord(cfr, t3)", |
| " move t3, sp", |
| "else", |
| " vmEntryRecord(cfr, sp)", |
| "end", |
| " loadp VMEntryRecord::m_vm[sp], t5", |
| " loadp VMEntryRecord::m_prevTopCallFrame[sp], t4", |
| " storep t4, VM::topCallFrame[t5]", |
| " loadp VMEntryRecord::m_prevTopVMEntryFrame[sp], t4", |
| " storep t4, VM::topVMEntryFrame[t5]", |
| "if ARMv7", |
| " subp cfr, CalleeRegisterSaveSize, t5", |
| " move t5, sp", |
| "else", |
| " subp cfr, CalleeRegisterSaveSize, sp", |
| "end", |
| " popCalleeSaves()", |
| " functionEpilogue()", |
| " ret ", |
| ".stackHeightOK:", |
| " move t3, sp", |
| " move 4, t3", |
| ".copyHeaderLoop:", |
| " subi 1, t3", |
| " loadi TagOffset[protoCallFrame, t3, 8], t5", |
| " storei t5, (TagOffset + CodeBlock)[sp, t3, 8]", |
| " loadi PayloadOffset[protoCallFrame, t3, 8], t5", |
| " storei t5, (PayloadOffset + CodeBlock)[sp, t3, 8]", |
| " btinz t3, .copyHeaderLoop", |
| " loadi (PayloadOffset + ProtoCallFrame::argCountAndCodeOriginValue)[protoCallFrame], t4", |
| " subi 1, t4", |
| " loadi ProtoCallFrame::paddedArgCount[protoCallFrame], t5", |
| " subi 1, t5", |
| " bieq t4, t5, .copyArgs", |
| ".fillExtraArgsLoop:", |
| " subi 1, t5", |
| " storei UndefinedTag, ((ThisArgumentOffset + 8) + TagOffset)[sp, t5, 8]", |
| " storei 0, ((ThisArgumentOffset + 8) + PayloadOffset)[sp, t5, 8]", |
| " bineq t4, t5, .fillExtraArgsLoop", |
| ".copyArgs:", |
| " loadp ProtoCallFrame::args[protoCallFrame], t3", |
| ".copyArgsLoop:", |
| " btiz t4, .copyArgsDone", |
| " subi 1, t4", |
| " loadi TagOffset[t3, t4, 8], t5", |
| " storei t5, ((ThisArgumentOffset + 8) + TagOffset)[sp, t4, 8]", |
| " loadi PayloadOffset[t3, t4, 8], t5", |
| " storei t5, ((ThisArgumentOffset + 8) + PayloadOffset)[sp, t4, 8]", |
| " jmp .copyArgsLoop", |
| ".copyArgsDone:", |
| " storep sp, VM::topCallFrame[vm]", |
| " storep cfr, VM::topVMEntryFrame[vm]", |
| " makeCall(entry, t3, t4)", |
| "if ARMv7", |
| " vmEntryRecord(cfr, t3)", |
| " move t3, sp", |
| "else", |
| " vmEntryRecord(cfr, sp)", |
| "end", |
| " loadp VMEntryRecord::m_vm[sp], t5", |
| " loadp VMEntryRecord::m_prevTopCallFrame[sp], t4", |
| " storep t4, VM::topCallFrame[t5]", |
| " loadp VMEntryRecord::m_prevTopVMEntryFrame[sp], t4", |
| " storep t4, VM::topVMEntryFrame[t5]", |
| "if ARMv7", |
| " subp cfr, CalleeRegisterSaveSize, t5", |
| " move t5, sp", |
| "else", |
| " subp cfr, CalleeRegisterSaveSize, sp", |
| "end", |
| " popCalleeSaves()", |
| " functionEpilogue()", |
| " ret ", |
| "end", |
| "macro makeJavaScriptCall(entry, temp, unused)", |
| " addp CallerFrameAndPCSize, sp", |
| " checkStackPointerAlignment(temp, 3134249986)", |
| "if C_LOOP", |
| " cloopCallJSFunction entry", |
| "else", |
| " call entry", |
| "end", |
| " checkStackPointerAlignment(temp, 3134249987)", |
| " subp CallerFrameAndPCSize, sp", |
| "end", |
| "macro makeHostFunctionCall(entry, temp1, temp2)", |
| " move entry, temp1", |
| " storep cfr, 0[sp]", |
| "if C_LOOP", |
| " move sp, a0", |
| " storep lr, PtrSize[sp]", |
| " cloopCallNative temp1", |
| "else", |
| "if (X86 or X86_WIN)", |
| " move 0, temp2", |
| " move temp2, 4[sp]", |
| " move sp, a0", |
| " push temp2", |
| " push a0", |
| " call temp1", |
| " addp 8, sp", |
| "else", |
| " move sp, a0", |
| " call temp1", |
| "end", |
| "end", |
| "end", |
| "_handleUncaughtException:", |
| " loadp (Callee + PayloadOffset)[cfr], t3", |
| " andp MarkedBlockMask, t3", |
| " loadp MarkedBlock::m_vm[t3], t3", |
| " restoreCalleeSavesFromVMEntryFrameCalleeSavesBuffer(t3, t0)", |
| " loadp VM::callFrameForCatch[t3], cfr", |
| " storep 0, VM::callFrameForCatch[t3]", |
| " loadp CallerFrame[cfr], cfr", |
| "if ARMv7", |
| " vmEntryRecord(cfr, t3)", |
| " move t3, sp", |
| "else", |
| " vmEntryRecord(cfr, sp)", |
| "end", |
| " loadp VMEntryRecord::m_vm[sp], t3", |
| " loadp VMEntryRecord::m_prevTopCallFrame[sp], t5", |
| " storep t5, VM::topCallFrame[t3]", |
| " loadp VMEntryRecord::m_prevTopVMEntryFrame[sp], t5", |
| " storep t5, VM::topVMEntryFrame[t3]", |
| "if ARMv7", |
| " subp cfr, CalleeRegisterSaveSize, t3", |
| " move t3, sp", |
| "else", |
| " subp cfr, CalleeRegisterSaveSize, sp", |
| "end", |
| " popCalleeSaves()", |
| " functionEpilogue()", |
| " ret ", |
| "macro doReturnFromHostFunction(extraStackSpace)", |
| " functionEpilogue(extraStackSpace)", |
| " ret ", |
| "end", |
| "macro traceOperand(fromWhere, operand)", |
| " move fromWhere, a2", |
| " move operand, a3", |
| " move cfr, a0", |
| " move PC, a1", |
| " cCall4(_llint_trace_operand)", |
| " move r0, PC", |
| " move r1, cfr", |
| "end", |
| "macro traceValue(fromWhere, operand)", |
| " move fromWhere, a2", |
| " move operand, a3", |
| " move cfr, a0", |
| " move PC, a1", |
| " cCall4(_llint_trace_value)", |
| " move r0, PC", |
| " move r1, cfr", |
| "end", |
| "macro callCallSlowPath(slowPath, action)", |
| " storep PC, (ArgumentCount + TagOffset)[cfr]", |
| " move cfr, a0", |
| " move PC, a1", |
| " cCall2(slowPath)", |
| " action(r0, r1)", |
| "end", |
| "macro callTrapHandler(throwHandler)", |
| " storei PC, (ArgumentCount + TagOffset)[cfr]", |
| " move cfr, a0", |
| " move PC, a1", |
| " cCall2(_llint_slow_path_handle_traps)", |
| " btpnz r0, throwHandler", |
| " loadi (ArgumentCount + TagOffset)[cfr], PC", |
| "end", |
| "macro checkSwitchToJITForLoop()", |
| " checkSwitchToJIT(1, macro ()", |
| " storei PC, (ArgumentCount + TagOffset)[cfr]", |
| " move cfr, a0", |
| " move PC, a1", |
| " cCall2(_llint_loop_osr)", |
| " btpz r0, .recover", |
| " move r1, sp", |
| " jmp r0", |
| ".recover:", |
| " loadi (ArgumentCount + TagOffset)[cfr], PC", |
| "end)", |
| "end", |
| "macro loadVariable(operand, index, tag, payload)", |
| " loadisFromInstruction(operand, index)", |
| " loadi TagOffset[cfr, index, 8], tag", |
| " loadi PayloadOffset[cfr, index, 8], payload", |
| "end", |
| "macro loadConstantOrVariable(index, tag, payload)", |
| " bigteq index, FirstConstantRegisterIndex, .constant", |
| " loadi TagOffset[cfr, index, 8], tag", |
| " loadi PayloadOffset[cfr, index, 8], payload", |
| " jmp .done", |
| ".constant:", |
| " loadp CodeBlock[cfr], payload", |
| " loadp (CodeBlock::m_constantRegisters + VectorBufferOffset)[payload], payload", |
| " loadp TagOffset[payload, index, 8], tag", |
| " loadp PayloadOffset[payload, index, 8], payload", |
| ".done:", |
| "end", |
| "macro loadConstantOrVariableTag(index, tag)", |
| " bigteq index, FirstConstantRegisterIndex, .constant", |
| " loadi TagOffset[cfr, index, 8], tag", |
| " jmp .done", |
| ".constant:", |
| " loadp CodeBlock[cfr], tag", |
| " loadp (CodeBlock::m_constantRegisters + VectorBufferOffset)[tag], tag", |
| " loadp TagOffset[tag, index, 8], tag", |
| ".done:", |
| "end", |
| "macro loadConstantOrVariable2Reg(index, tag, payload)", |
| " bigteq index, FirstConstantRegisterIndex, .constant", |
| " loadi TagOffset[cfr, index, 8], tag", |
| " loadi PayloadOffset[cfr, index, 8], payload", |
| " jmp .done", |
| ".constant:", |
| " loadp CodeBlock[cfr], tag", |
| " loadp (CodeBlock::m_constantRegisters + VectorBufferOffset)[tag], tag", |
| " lshifti 3, index", |
| " addp index, tag", |
| " loadp PayloadOffset[tag], payload", |
| " loadp TagOffset[tag], tag", |
| ".done:", |
| "end", |
| "macro loadConstantOrVariablePayloadTagCustom(index, tagCheck, payload)", |
| " bigteq index, FirstConstantRegisterIndex, .constant", |
| " tagCheck(TagOffset[cfr, index, 8])", |
| " loadi PayloadOffset[cfr, index, 8], payload", |
| " jmp .done", |
| ".constant:", |
| " loadp CodeBlock[cfr], payload", |
| " loadp (CodeBlock::m_constantRegisters + VectorBufferOffset)[payload], payload", |
| " tagCheck(TagOffset[payload, index, 8])", |
| " loadp PayloadOffset[payload, index, 8], payload", |
| ".done:", |
| "end", |
| "macro loadConstantOrVariablePayload(index, expectedTag, payload, slow)", |
| " loadConstantOrVariablePayloadTagCustom(index, macro (actualTag)", |
| " bineq actualTag, expectedTag, slow", |
| "end, payload)", |
| "end", |
| "macro loadConstantOrVariablePayloadUnchecked(index, payload)", |
| " loadConstantOrVariablePayloadTagCustom(index, macro (actualTag)", |
| "", |
| "end, payload)", |
| "end", |
| "macro writeBarrierOnOperand(cellOperand)", |
| " loadisFromInstruction(cellOperand, t1)", |
| " loadConstantOrVariablePayload(t1, CellTag, t2, .writeBarrierDone)", |
| " skipIfIsRememberedOrInEden(t2, macro ()", |
| " push cfr, PC", |
| " subp 8, sp", |
| " move t2, a1", |
| " move cfr, a0", |
| " cCall2Void(_llint_write_barrier_slow)", |
| " addp 8, sp", |
| " pop PC, cfr", |
| "end)", |
| ".writeBarrierDone:", |
| "end", |
| "macro writeBarrierOnOperands(cellOperand, valueOperand)", |
| " loadisFromInstruction(valueOperand, t1)", |
| " loadConstantOrVariableTag(t1, t0)", |
| " bineq t0, CellTag, .writeBarrierDone", |
| " writeBarrierOnOperand(cellOperand)", |
| ".writeBarrierDone:", |
| "end", |
| "macro writeBarrierOnGlobal(valueOperand, loadHelper)", |
| " loadisFromInstruction(valueOperand, t1)", |
| " loadConstantOrVariableTag(t1, t0)", |
| " bineq t0, CellTag, .writeBarrierDone", |
| " loadHelper(t3)", |
| " skipIfIsRememberedOrInEden(t3, macro ()", |
| " push cfr, PC", |
| " subp 8, sp", |
| " move cfr, a0", |
| " move t3, a1", |
| " cCall2Void(_llint_write_barrier_slow)", |
| " addp 8, sp", |
| " pop PC, cfr", |
| "end)", |
| ".writeBarrierDone:", |
| "end", |
| "macro writeBarrierOnGlobalObject(valueOperand)", |
| " writeBarrierOnGlobal(valueOperand, macro (registerToStoreGlobal)", |
| " loadp CodeBlock[cfr], registerToStoreGlobal", |
| " loadp CodeBlock::m_globalObject[registerToStoreGlobal], registerToStoreGlobal", |
| "end)", |
| "end", |
| "macro writeBarrierOnGlobalLexicalEnvironment(valueOperand)", |
| " writeBarrierOnGlobal(valueOperand, macro (registerToStoreGlobal)", |
| " loadp CodeBlock[cfr], registerToStoreGlobal", |
| " loadp CodeBlock::m_globalObject[registerToStoreGlobal], registerToStoreGlobal", |
| " loadp JSGlobalObject::m_globalLexicalEnvironment[registerToStoreGlobal], registerToStoreGlobal", |
| "end)", |
| "end", |
| "macro valueProfile(tag, payload, operand, scratch)", |
| " loadp operand[PC], scratch", |
| " storei tag, (ValueProfile::m_buckets + TagOffset)[scratch]", |
| " storei payload, (ValueProfile::m_buckets + PayloadOffset)[scratch]", |
| "end", |
| "macro functionArityCheck(doneLabel, slowPath)", |
| " loadi (PayloadOffset + ArgumentCount)[cfr], t0", |
| " biaeq t0, CodeBlock::m_numParameters[t1], doneLabel", |
| " move cfr, a0", |
| " move PC, a1", |
| " cCall2(slowPath)", |
| " btiz r0, .noError", |
| " move r1, cfr", |
| " jmp _llint_throw_from_slow_path_trampoline", |
| ".noError:", |
| " loadp CommonSlowPaths::ArityCheckData::thunkToCall[r1], t3", |
| " btpz t3, .proceedInline", |
| " loadp CommonSlowPaths::ArityCheckData::paddedStackSpace[r1], a0", |
| " call t3", |
| "if ASSERT_ENABLED", |
| " loadp ReturnPC[cfr], t0", |
| " loadp 0[t0], t0", |
| "else", |
| " skip", |
| "end", |
| " jmp .continue", |
| ".proceedInline:", |
| " loadi CommonSlowPaths::ArityCheckData::paddedStackSpace[r1], t1", |
| " btiz t1, .continue", |
| " loadi (PayloadOffset + ArgumentCount)[cfr], t2", |
| " addi CallFrameHeaderSlots, t2", |
| " move t1, t3", |
| " andi (StackAlignmentSlots - 1), t3", |
| " btiz t3, .noExtraSlot", |
| ".fillExtraSlots:", |
| " move 0, t0", |
| " storei t0, PayloadOffset[cfr, t2, 8]", |
| " move UndefinedTag, t0", |
| " storei t0, TagOffset[cfr, t2, 8]", |
| " addi 1, t2", |
| " bsubinz 1, t3, .fillExtraSlots", |
| " andi (~(StackAlignmentSlots - 1)), t1", |
| " btiz t1, .continue", |
| ".noExtraSlot:", |
| " negi t1", |
| " move cfr, t3", |
| " move t1, t0", |
| " lshiftp 3, t0", |
| " addp t0, cfr", |
| " addp t0, sp", |
| ".copyLoop:", |
| " loadi PayloadOffset[t3], t0", |
| " storei t0, PayloadOffset[t3, t1, 8]", |
| " loadi TagOffset[t3], t0", |
| " storei t0, TagOffset[t3, t1, 8]", |
| " addp 8, t3", |
| " bsubinz 1, t2, .copyLoop", |
| " move t1, t2", |
| ".fillLoop:", |
| " move 0, t0", |
| " storei t0, PayloadOffset[t3, t1, 8]", |
| " move UndefinedTag, t0", |
| " storei t0, TagOffset[t3, t1, 8]", |
| " addp 8, t3", |
| " baddinz 1, t2, .fillLoop", |
| ".continue:", |
| " loadp CodeBlock[cfr], t1", |
| " loadp CodeBlock::m_instructions[t1], PC", |
| " jmp doneLabel", |
| "end", |
| "macro branchIfException(label)", |
| " loadp (Callee + PayloadOffset)[cfr], t3", |
| " andp MarkedBlockMask, t3", |
| " loadp MarkedBlock::m_vm[t3], t3", |
| " btiz VM::m_exception[t3], .noException", |
| " jmp label", |
| ".noException:", |
| "end", |
| "_llint_op_enter:", |
| " traceExecution()", |
| " checkStackPointerAlignment(t2, 3735879905)", |
| " loadp CodeBlock[cfr], t2", |
| " loadi CodeBlock::m_numVars[t2], t2", |
| " btiz t2, .opEnterDone", |
| " move UndefinedTag, t0", |
| " move 0, t1", |
| " negi t2", |
| ".opEnterLoop:", |
| " storei t0, TagOffset[cfr, t2, 8]", |
| " storei t1, PayloadOffset[cfr, t2, 8]", |
| " addi 1, t2", |
| " btinz t2, .opEnterLoop", |
| ".opEnterDone:", |
| " callOpcodeSlowPath(_slow_path_enter)", |
| " dispatch(constexpr (op_enter_length))", |
| "_llint_op_get_argument:", |
| " traceExecution()", |
| " loadisFromInstruction(1, t1)", |
| " loadisFromInstruction(2, t2)", |
| " loadi (PayloadOffset + ArgumentCount)[cfr], t0", |
| " bilteq t0, t2, .opGetArgumentOutOfBounds", |
| " loadi (ThisArgumentOffset + TagOffset)[cfr, t2, 8], t0", |
| " loadi (ThisArgumentOffset + PayloadOffset)[cfr, t2, 8], t3", |
| " storei t0, TagOffset[cfr, t1, 8]", |
| " storei t3, PayloadOffset[cfr, t1, 8]", |
| " valueProfile(t0, t3, 12, t1)", |
| " dispatch(constexpr (op_get_argument_length))", |
| ".opGetArgumentOutOfBounds:", |
| " storei UndefinedTag, TagOffset[cfr, t1, 8]", |
| " storei 0, PayloadOffset[cfr, t1, 8]", |
| " valueProfile(UndefinedTag, 0, 12, t1)", |
| " dispatch(constexpr (op_get_argument_length))", |
| "_llint_op_argument_count:", |
| " traceExecution()", |
| " loadisFromInstruction(1, t2)", |
| " loadi (PayloadOffset + ArgumentCount)[cfr], t0", |
| " subi 1, t0", |
| " move Int32Tag, t1", |
| " storei t1, TagOffset[cfr, t2, 8]", |
| " storei t0, PayloadOffset[cfr, t2, 8]", |
| " dispatch(constexpr (op_argument_count_length))", |
| "_llint_op_get_scope:", |
| " traceExecution()", |
| " loadi (Callee + PayloadOffset)[cfr], t0", |
| " loadi JSCallee::m_scope[t0], t0", |
| " loadisFromInstruction(1, t1)", |
| " storei CellTag, TagOffset[cfr, t1, 8]", |
| " storei t0, PayloadOffset[cfr, t1, 8]", |
| " dispatch(constexpr (op_get_scope_length))", |
| "_llint_op_to_this:", |
| " traceExecution()", |
| " loadi 4[PC], t0", |
| " bineq TagOffset[cfr, t0, 8], CellTag, .opToThisSlow", |
| " loadi PayloadOffset[cfr, t0, 8], t0", |
| " bbneq JSCell::m_type[t0], FinalObjectType, .opToThisSlow", |
| " loadpFromInstruction(2, t2)", |
| " bpneq JSCell::m_structureID[t0], t2, .opToThisSlow", |
| " dispatch(constexpr (op_to_this_length))", |
| ".opToThisSlow:", |
| " callOpcodeSlowPath(_slow_path_to_this)", |
| " dispatch(constexpr (op_to_this_length))", |
| "_llint_op_check_tdz:", |
| " traceExecution()", |
| " loadisFromInstruction(1, t0)", |
| " loadConstantOrVariableTag(t0, t1)", |
| " bineq t1, EmptyValueTag, .opNotTDZ", |
| " callOpcodeSlowPath(_slow_path_throw_tdz_error)", |
| ".opNotTDZ:", |
| " dispatch(constexpr (op_check_tdz_length))", |
| "_llint_op_mov:", |
| " traceExecution()", |
| " loadi 8[PC], t1", |
| " loadi 4[PC], t0", |
| " loadConstantOrVariable(t1, t2, t3)", |
| " storei t2, TagOffset[cfr, t0, 8]", |
| " storei t3, PayloadOffset[cfr, t0, 8]", |
| " dispatch(constexpr (op_mov_length))", |
| "_llint_op_not:", |
| " traceExecution()", |
| " loadi 8[PC], t0", |
| " loadi 4[PC], t1", |
| " loadConstantOrVariable(t0, t2, t3)", |
| " bineq t2, BooleanTag, .opNotSlow", |
| " xori 1, t3", |
| " storei t2, TagOffset[cfr, t1, 8]", |
| " storei t3, PayloadOffset[cfr, t1, 8]", |
| " dispatch(constexpr (op_not_length))", |
| ".opNotSlow:", |
| " callOpcodeSlowPath(_slow_path_not)", |
| " dispatch(constexpr (op_not_length))", |
| "_llint_op_eq:", |
| " traceExecution()", |
| " loadi 12[PC], t2", |
| " loadi 8[PC], t0", |
| " loadConstantOrVariable(t2, t3, t1)", |
| " loadConstantOrVariable2Reg(t0, t2, t0)", |
| " bineq t2, t3, .opEqSlow", |
| " bieq t2, CellTag, .opEqSlow", |
| " bib t2, LowestTag, .opEqSlow", |
| " loadi 4[PC], t2", |
| " cieq t0, t1, t0", |
| " storei BooleanTag, TagOffset[cfr, t2, 8]", |
| " storei t0, PayloadOffset[cfr, t2, 8]", |
| " dispatch(constexpr (op_eq_length))", |
| ".opEqSlow:", |
| " callOpcodeSlowPath(_slow_path_eq)", |
| " dispatch(constexpr (op_eq_length))", |
| "_llint_op_eq_null:", |
| " traceExecution()", |
| " loadi 8[PC], t0", |
| " loadi 4[PC], t3", |
| " assertNotConstant(t0)", |
| " loadi TagOffset[cfr, t0, 8], t1", |
| " loadi PayloadOffset[cfr, t0, 8], t0", |
| " bineq t1, CellTag, .opEqNullImmediate", |
| " btbnz JSCell::m_flags[t0], MasqueradesAsUndefined, .opEqNullMasqueradesAsUndefined", |
| " move 0, t1", |
| " jmp .opEqNullNotImmediate", |
| ".opEqNullMasqueradesAsUndefined:", |
| " loadp JSCell::m_structureID[t0], t1", |
| " loadp CodeBlock[cfr], t0", |
| " loadp CodeBlock::m_globalObject[t0], t0", |
| " cpeq Structure::m_globalObject[t1], t0, t1", |
| " jmp .opEqNullNotImmediate", |
| ".opEqNullImmediate:", |
| " cieq t1, NullTag, t2", |
| " cieq t1, UndefinedTag, t1", |
| " ori t2, t1", |
| ".opEqNullNotImmediate:", |
| " storei BooleanTag, TagOffset[cfr, t3, 8]", |
| " storei t1, PayloadOffset[cfr, t3, 8]", |
| " dispatch(constexpr (op_eq_null_length))", |
| "_llint_op_neq:", |
| " traceExecution()", |
| " loadi 12[PC], t2", |
| " loadi 8[PC], t0", |
| " loadConstantOrVariable(t2, t3, t1)", |
| " loadConstantOrVariable2Reg(t0, t2, t0)", |
| " bineq t2, t3, .opNeqSlow", |
| " bieq t2, CellTag, .opNeqSlow", |
| " bib t2, LowestTag, .opNeqSlow", |
| " loadi 4[PC], t2", |
| " cineq t0, t1, t0", |
| " storei BooleanTag, TagOffset[cfr, t2, 8]", |
| " storei t0, PayloadOffset[cfr, t2, 8]", |
| " dispatch(constexpr (op_neq_length))", |
| ".opNeqSlow:", |
| " callOpcodeSlowPath(_slow_path_neq)", |
| " dispatch(constexpr (op_neq_length))", |
| "_llint_op_neq_null:", |
| " traceExecution()", |
| " loadi 8[PC], t0", |
| " loadi 4[PC], t3", |
| " assertNotConstant(t0)", |
| " loadi TagOffset[cfr, t0, 8], t1", |
| " loadi PayloadOffset[cfr, t0, 8], t0", |
| " bineq t1, CellTag, .opNeqNullImmediate", |
| " btbnz JSCell::m_flags[t0], MasqueradesAsUndefined, .opNeqNullMasqueradesAsUndefined", |
| " move 1, t1", |
| " jmp .opNeqNullNotImmediate", |
| ".opNeqNullMasqueradesAsUndefined:", |
| " loadp JSCell::m_structureID[t0], t1", |
| " loadp CodeBlock[cfr], t0", |
| " loadp CodeBlock::m_globalObject[t0], t0", |
| " cpneq Structure::m_globalObject[t1], t0, t1", |
| " jmp .opNeqNullNotImmediate", |
| ".opNeqNullImmediate:", |
| " cineq t1, NullTag, t2", |
| " cineq t1, UndefinedTag, t1", |
| " andi t2, t1", |
| ".opNeqNullNotImmediate:", |
| " storei BooleanTag, TagOffset[cfr, t3, 8]", |
| " storei t1, PayloadOffset[cfr, t3, 8]", |
| " dispatch(constexpr (op_neq_null_length))", |
| "macro strictEq(equalityOperation, slowPath)", |
| " loadi 12[PC], t2", |
| " loadi 8[PC], t0", |
| " loadConstantOrVariable(t2, t3, t1)", |
| " loadConstantOrVariable2Reg(t0, t2, t0)", |
| " bineq t2, t3, .slow", |
| " bib t2, LowestTag, .slow", |
| " bineq t2, CellTag, .notStringOrSymbol", |
| " bbaeq JSCell::m_type[t0], ObjectType, .notStringOrSymbol", |
| " bbb JSCell::m_type[t1], ObjectType, .slow", |
| ".notStringOrSymbol:", |
| " loadi 4[PC], t2", |
| " equalityOperation(t0, t1, t0)", |
| " storei BooleanTag, TagOffset[cfr, t2, 8]", |
| " storei t0, PayloadOffset[cfr, t2, 8]", |
| " dispatch(4)", |
| ".slow:", |
| " callOpcodeSlowPath(slowPath)", |
| " dispatch(4)", |
| "end", |
| "_llint_op_stricteq:", |
| " traceExecution()", |
| " strictEq(macro (left, right, result)", |
| " cieq left, right, result", |
| "end, _slow_path_stricteq)", |
| "_llint_op_nstricteq:", |
| " traceExecution()", |
| " strictEq(macro (left, right, result)", |
| " cineq left, right, result", |
| "end, _slow_path_nstricteq)", |
| "_llint_op_inc:", |
| " traceExecution()", |
| " loadi 4[PC], t0", |
| " bineq TagOffset[cfr, t0, 8], Int32Tag, .opIncSlow", |
| " loadi PayloadOffset[cfr, t0, 8], t1", |
| " baddio 1, t1, .opIncSlow", |
| " storei t1, PayloadOffset[cfr, t0, 8]", |
| " dispatch(constexpr (op_inc_length))", |
| ".opIncSlow:", |
| " callOpcodeSlowPath(_slow_path_inc)", |
| " dispatch(constexpr (op_inc_length))", |
| "_llint_op_dec:", |
| " traceExecution()", |
| " loadi 4[PC], t0", |
| " bineq TagOffset[cfr, t0, 8], Int32Tag, .opDecSlow", |
| " loadi PayloadOffset[cfr, t0, 8], t1", |
| " bsubio 1, t1, .opDecSlow", |
| " storei t1, PayloadOffset[cfr, t0, 8]", |
| " dispatch(constexpr (op_dec_length))", |
| ".opDecSlow:", |
| " callOpcodeSlowPath(_slow_path_dec)", |
| " dispatch(constexpr (op_dec_length))", |
| "_llint_op_to_number:", |
| " traceExecution()", |
| " loadi 8[PC], t0", |
| " loadi 4[PC], t1", |
| " loadConstantOrVariable(t0, t2, t3)", |
| " bieq t2, Int32Tag, .opToNumberIsInt", |
| " biaeq t2, LowestTag, .opToNumberSlow", |
| ".opToNumberIsInt:", |
| " storei t2, TagOffset[cfr, t1, 8]", |
| " storei t3, PayloadOffset[cfr, t1, 8]", |
| " valueProfile(t2, t3, 12, t1)", |
| " dispatch(constexpr (op_to_number_length))", |
| ".opToNumberSlow:", |
| " callOpcodeSlowPath(_slow_path_to_number)", |
| " dispatch(constexpr (op_to_number_length))", |
| "_llint_op_to_string:", |
| " traceExecution()", |
| " loadi 8[PC], t0", |
| " loadi 4[PC], t1", |
| " loadConstantOrVariable(t0, t2, t3)", |
| " bineq t2, CellTag, .opToStringSlow", |
| " bbneq JSCell::m_type[t3], StringType, .opToStringSlow", |
| ".opToStringIsString:", |
| " storei t2, TagOffset[cfr, t1, 8]", |
| " storei t3, PayloadOffset[cfr, t1, 8]", |
| " dispatch(constexpr (op_to_string_length))", |
| ".opToStringSlow:", |
| " callOpcodeSlowPath(_slow_path_to_string)", |
| " dispatch(constexpr (op_to_string_length))", |
| "_llint_op_negate:", |
| " traceExecution()", |
| " loadi 8[PC], t0", |
| " loadi 4[PC], t3", |
| " loadConstantOrVariable(t0, t1, t2)", |
| " loadisFromInstruction(3, t0)", |
| " bineq t1, Int32Tag, .opNegateSrcNotInt", |
| " btiz t2, 2147483647, .opNegateSlow", |
| " negi t2", |
| " ori ArithProfileInt, t0", |
| " storei Int32Tag, TagOffset[cfr, t3, 8]", |
| " storeisToInstruction(t0, 3)", |
| " storei t2, PayloadOffset[cfr, t3, 8]", |
| " dispatch(constexpr (op_negate_length))", |
| ".opNegateSrcNotInt:", |
| " bia t1, LowestTag, .opNegateSlow", |
| " xori 2147483648, t1", |
| " ori ArithProfileNumber, t0", |
| " storei t2, PayloadOffset[cfr, t3, 8]", |
| " storeisToInstruction(t0, 3)", |
| " storei t1, TagOffset[cfr, t3, 8]", |
| " dispatch(constexpr (op_negate_length))", |
| ".opNegateSlow:", |
| " callOpcodeSlowPath(_slow_path_negate)", |
| " dispatch(constexpr (op_negate_length))", |
| "macro binaryOpCustomStore(integerOperationAndStore, doubleOperation, slowPath)", |
| " loadi 12[PC], t2", |
| " loadi 8[PC], t0", |
| " loadConstantOrVariable(t2, t3, t1)", |
| " loadConstantOrVariable2Reg(t0, t2, t0)", |
| " bineq t2, Int32Tag, .op1NotInt", |
| " bineq t3, Int32Tag, .op2NotInt", |
| " loadisFromInstruction(4, t5)", |
| " ori ArithProfileIntInt, t5", |
| " storeisToInstruction(t5, 4)", |
| " loadi 4[PC], t2", |
| " integerOperationAndStore(t3, t1, t0, .slow, t2)", |
| " dispatch(5)", |
| ".op1NotInt:", |
| " bia t2, LowestTag, .slow", |
| " bib t3, LowestTag, .op1NotIntOp2Double", |
| " bineq t3, Int32Tag, .slow", |
| " loadisFromInstruction(4, t5)", |
| " ori ArithProfileNumberInt, t5", |
| " storeisToInstruction(t5, 4)", |
| " ci2d t1, ft1", |
| " jmp .op1NotIntReady", |
| ".op1NotIntOp2Double:", |
| " fii2d t1, t3, ft1", |
| " loadisFromInstruction(4, t5)", |
| " ori ArithProfileNumberNumber, t5", |
| " storeisToInstruction(t5, 4)", |
| ".op1NotIntReady:", |
| " loadi 4[PC], t1", |
| " fii2d t0, t2, ft0", |
| " doubleOperation(ft1, ft0)", |
| " stored ft0, 0[cfr, t1, 8]", |
| " dispatch(5)", |
| ".op2NotInt:", |
| " loadi 4[PC], t2", |
| " bia t3, LowestTag, .slow", |
| " loadisFromInstruction(4, t5)", |
| " ori ArithProfileIntNumber, t5", |
| " storeisToInstruction(t5, 4)", |
| " ci2d t0, ft0", |
| " fii2d t1, t3, ft1", |
| " doubleOperation(ft1, ft0)", |
| " stored ft0, 0[cfr, t2, 8]", |
| " dispatch(5)", |
| ".slow:", |
| " callOpcodeSlowPath(slowPath)", |
| " dispatch(5)", |
| "end", |
| "macro binaryOp(integerOperation, doubleOperation, slowPath)", |
| " binaryOpCustomStore(macro (int32Tag, left, right, slow, index)", |
| " integerOperation(left, right, slow)", |
| " storei int32Tag, TagOffset[cfr, index, 8]", |
| " storei right, PayloadOffset[cfr, index, 8]", |
| "end, doubleOperation, slowPath)", |
| "end", |
| "_llint_op_add:", |
| " traceExecution()", |
| " binaryOp(macro (left, right, slow)", |
| " baddio left, right, slow", |
| "end, macro (left, right)", |
| " addd left, right", |
| "end, _slow_path_add)", |
| "_llint_op_mul:", |
| " traceExecution()", |
| " binaryOpCustomStore(macro (int32Tag, left, right, slow, index)", |
| "const scratch = int32Tag", |
| " move right, scratch", |
| " bmulio left, scratch, slow", |
| " btinz scratch, .done", |
| " bilt left, 0, slow", |
| " bilt right, 0, slow", |
| ".done:", |
| " storei Int32Tag, TagOffset[cfr, index, 8]", |
| " storei scratch, PayloadOffset[cfr, index, 8]", |
| "end, macro (left, right)", |
| " muld left, right", |
| "end, _slow_path_mul)", |
| "_llint_op_sub:", |
| " traceExecution()", |
| " binaryOp(macro (left, right, slow)", |
| " bsubio left, right, slow", |
| "end, macro (left, right)", |
| " subd left, right", |
| "end, _slow_path_sub)", |
| "_llint_op_div:", |
| " traceExecution()", |
| " binaryOpCustomStore(macro (int32Tag, left, right, slow, index)", |
| " ci2d left, ft0", |
| " ci2d right, ft1", |
| " divd ft0, ft1", |
| " bcd2i ft1, right, .notInt", |
| " storei int32Tag, TagOffset[cfr, index, 8]", |
| " storei right, PayloadOffset[cfr, index, 8]", |
| " jmp .done", |
| ".notInt:", |
| " stored ft1, 0[cfr, index, 8]", |
| ".done:", |
| "end, macro (left, right)", |
| " divd left, right", |
| "end, _slow_path_div)", |
| "macro bitOp(operation, slowPath, advance)", |
| " loadi 12[PC], t2", |
| " loadi 8[PC], t0", |
| " loadConstantOrVariable(t2, t3, t1)", |
| " loadConstantOrVariable2Reg(t0, t2, t0)", |
| " bineq t3, Int32Tag, .slow", |
| " bineq t2, Int32Tag, .slow", |
| " loadi 4[PC], t2", |
| " operation(t1, t0)", |
| " storei t3, TagOffset[cfr, t2, 8]", |
| " storei t0, PayloadOffset[cfr, t2, 8]", |
| " dispatch(advance)", |
| ".slow:", |
| " callOpcodeSlowPath(slowPath)", |
| " dispatch(advance)", |
| "end", |
| "_llint_op_lshift:", |
| " traceExecution()", |
| " bitOp(macro (left, right)", |
| " lshifti left, right", |
| "end, _slow_path_lshift, constexpr (op_lshift_length))", |
| "_llint_op_rshift:", |
| " traceExecution()", |
| " bitOp(macro (left, right)", |
| " rshifti left, right", |
| "end, _slow_path_rshift, constexpr (op_rshift_length))", |
| "_llint_op_urshift:", |
| " traceExecution()", |
| " bitOp(macro (left, right)", |
| " urshifti left, right", |
| "end, _slow_path_urshift, constexpr (op_urshift_length))", |
| "_llint_op_unsigned:", |
| " traceExecution()", |
| " loadi 4[PC], t0", |
| " loadi 8[PC], t1", |
| " loadConstantOrVariablePayload(t1, Int32Tag, t2, .opUnsignedSlow)", |
| " bilt t2, 0, .opUnsignedSlow", |
| " storei t2, PayloadOffset[cfr, t0, 8]", |
| " storei Int32Tag, TagOffset[cfr, t0, 8]", |
| " dispatch(constexpr (op_unsigned_length))", |
| ".opUnsignedSlow:", |
| " callOpcodeSlowPath(_slow_path_unsigned)", |
| " dispatch(constexpr (op_unsigned_length))", |
| "_llint_op_bitand:", |
| " traceExecution()", |
| " bitOp(macro (left, right)", |
| " andi left, right", |
| "end, _slow_path_bitand, constexpr (op_bitand_length))", |
| "_llint_op_bitxor:", |
| " traceExecution()", |
| " bitOp(macro (left, right)", |
| " xori left, right", |
| "end, _slow_path_bitxor, constexpr (op_bitxor_length))", |
| "_llint_op_bitor:", |
| " traceExecution()", |
| " bitOp(macro (left, right)", |
| " ori left, right", |
| "end, _slow_path_bitor, constexpr (op_bitor_length))", |
| "_llint_op_overrides_has_instance:", |
| " traceExecution()", |
| " loadisFromInstruction(1, t3)", |
| " storei BooleanTag, TagOffset[cfr, t3, 8]", |
| " loadisFromInstruction(3, t0)", |
| " loadConstantOrVariablePayload(t0, CellTag, t2, .opOverrideshasInstanceValueNotCell)", |
| " loadConstantOrVariable(t0, t1, t2)", |
| " bineq t1, CellTag, .opOverrideshasInstanceValueNotCell", |
| " loadp CodeBlock[cfr], t1", |
| " loadp CodeBlock::m_globalObject[t1], t1", |
| " loadp JSGlobalObject::m_functionProtoHasInstanceSymbolFunction[t1], t1", |
| " bineq t1, t2, .opOverrideshasInstanceValueNotDefault", |
| " loadisFromInstruction(2, t0)", |
| " loadConstantOrVariablePayloadUnchecked(t0, t1)", |
| " tbz JSCell::m_flags[t1], ImplementsDefaultHasInstance, t0", |
| " storei t0, PayloadOffset[cfr, t3, 8]", |
| " dispatch(constexpr (op_overrides_has_instance_length))", |
| ".opOverrideshasInstanceValueNotCell:", |
| ".opOverrideshasInstanceValueNotDefault:", |
| " storei 1, PayloadOffset[cfr, t3, 8]", |
| " dispatch(constexpr (op_overrides_has_instance_length))", |
| "_llint_op_instanceof_custom:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_llint_slow_path_instanceof_custom)", |
| " dispatch(constexpr (op_instanceof_custom_length))", |
| "_llint_op_is_empty:", |
| " traceExecution()", |
| " loadi 8[PC], t1", |
| " loadi 4[PC], t0", |
| " loadConstantOrVariable(t1, t2, t3)", |
| " cieq t2, EmptyValueTag, t3", |
| " storei BooleanTag, TagOffset[cfr, t0, 8]", |
| " storei t3, PayloadOffset[cfr, t0, 8]", |
| " dispatch(constexpr (op_is_empty_length))", |
| "_llint_op_is_undefined:", |
| " traceExecution()", |
| " loadi 8[PC], t1", |
| " loadi 4[PC], t0", |
| " loadConstantOrVariable(t1, t2, t3)", |
| " storei BooleanTag, TagOffset[cfr, t0, 8]", |
| " bieq t2, CellTag, .opIsUndefinedCell", |
| " cieq t2, UndefinedTag, t3", |
| " storei t3, PayloadOffset[cfr, t0, 8]", |
| " dispatch(constexpr (op_is_undefined_length))", |
| ".opIsUndefinedCell:", |
| " btbnz JSCell::m_flags[t3], MasqueradesAsUndefined, .opIsUndefinedMasqueradesAsUndefined", |
| " move 0, t1", |
| " storei t1, PayloadOffset[cfr, t0, 8]", |
| " dispatch(constexpr (op_is_undefined_length))", |
| ".opIsUndefinedMasqueradesAsUndefined:", |
| " loadp JSCell::m_structureID[t3], t1", |
| " loadp CodeBlock[cfr], t3", |
| " loadp CodeBlock::m_globalObject[t3], t3", |
| " cpeq Structure::m_globalObject[t1], t3, t1", |
| " storei t1, PayloadOffset[cfr, t0, 8]", |
| " dispatch(constexpr (op_is_undefined_length))", |
| "_llint_op_is_boolean:", |
| " traceExecution()", |
| " loadi 8[PC], t1", |
| " loadi 4[PC], t2", |
| " loadConstantOrVariableTag(t1, t0)", |
| " cieq t0, BooleanTag, t0", |
| " storei BooleanTag, TagOffset[cfr, t2, 8]", |
| " storei t0, PayloadOffset[cfr, t2, 8]", |
| " dispatch(constexpr (op_is_boolean_length))", |
| "_llint_op_is_number:", |
| " traceExecution()", |
| " loadi 8[PC], t1", |
| " loadi 4[PC], t2", |
| " loadConstantOrVariableTag(t1, t0)", |
| " storei BooleanTag, TagOffset[cfr, t2, 8]", |
| " addi 1, t0", |
| " cib t0, (LowestTag + 1), t1", |
| " storei t1, PayloadOffset[cfr, t2, 8]", |
| " dispatch(constexpr (op_is_number_length))", |
| "_llint_op_is_cell_with_type:", |
| " traceExecution()", |
| " loadi 8[PC], t1", |
| " loadi 4[PC], t2", |
| " loadConstantOrVariable(t1, t0, t3)", |
| " storei BooleanTag, TagOffset[cfr, t2, 8]", |
| " bineq t0, CellTag, .notCellCase", |
| " loadi 12[PC], t0", |
| " cbeq JSCell::m_type[t3], t0, t1", |
| " storei t1, PayloadOffset[cfr, t2, 8]", |
| " dispatch(constexpr (op_is_cell_with_type_length))", |
| ".notCellCase:", |
| " storep 0, PayloadOffset[cfr, t2, 8]", |
| " dispatch(constexpr (op_is_cell_with_type_length))", |
| "_llint_op_is_object:", |
| " traceExecution()", |
| " loadi 8[PC], t1", |
| " loadi 4[PC], t2", |
| " loadConstantOrVariable(t1, t0, t3)", |
| " storei BooleanTag, TagOffset[cfr, t2, 8]", |
| " bineq t0, CellTag, .opIsObjectNotCell", |
| " cbaeq JSCell::m_type[t3], ObjectType, t1", |
| " storei t1, PayloadOffset[cfr, t2, 8]", |
| " dispatch(constexpr (op_is_object_length))", |
| ".opIsObjectNotCell:", |
| " storep 0, PayloadOffset[cfr, t2, 8]", |
| " dispatch(constexpr (op_is_object_length))", |
| "macro loadPropertyAtVariableOffsetKnownNotInline(propertyOffset, objectAndStorage, tag, payload)", |
| " assert(macro (ok)", |
| " bigteq propertyOffset, firstOutOfLineOffset, ok", |
| "end)", |
| " negi propertyOffset", |
| " loadp JSObject::m_butterfly[objectAndStorage], objectAndStorage", |
| " loadi (TagOffset + ((firstOutOfLineOffset - 2) * 8))[objectAndStorage, propertyOffset, 8], tag", |
| " loadi (PayloadOffset + ((firstOutOfLineOffset - 2) * 8))[objectAndStorage, propertyOffset, 8], payload", |
| "end", |
| "macro loadPropertyAtVariableOffset(propertyOffset, objectAndStorage, tag, payload)", |
| " bilt propertyOffset, firstOutOfLineOffset, .isInline", |
| " loadp JSObject::m_butterfly[objectAndStorage], objectAndStorage", |
| " negi propertyOffset", |
| " jmp .ready", |
| ".isInline:", |
| " addp (sizeof JSObject - ((firstOutOfLineOffset - 2) * 8)), objectAndStorage", |
| ".ready:", |
| " loadi (TagOffset + ((firstOutOfLineOffset - 2) * 8))[objectAndStorage, propertyOffset, 8], tag", |
| " loadi (PayloadOffset + ((firstOutOfLineOffset - 2) * 8))[objectAndStorage, propertyOffset, 8], payload", |
| "end", |
| "macro storePropertyAtVariableOffset(propertyOffsetAsInt, objectAndStorage, tag, payload)", |
| " bilt propertyOffsetAsInt, firstOutOfLineOffset, .isInline", |
| " loadp JSObject::m_butterfly[objectAndStorage], objectAndStorage", |
| " negi propertyOffsetAsInt", |
| " jmp .ready", |
| ".isInline:", |
| " addp (sizeof JSObject - ((firstOutOfLineOffset - 2) * 8)), objectAndStorage", |
| ".ready:", |
| " storei tag, (TagOffset + ((firstOutOfLineOffset - 2) * 8))[objectAndStorage, propertyOffsetAsInt, 8]", |
| " storei payload, (PayloadOffset + ((firstOutOfLineOffset - 2) * 8))[objectAndStorage, propertyOffsetAsInt, 8]", |
| "end", |
| "_llint_op_get_by_id:", |
| " traceExecution()", |
| " loadi 8[PC], t0", |
| " loadi 16[PC], t1", |
| " loadConstantOrVariablePayload(t0, CellTag, t3, .opGetByIdSlow)", |
| " loadi 20[PC], t2", |
| " bineq JSCell::m_structureID[t3], t1, .opGetByIdSlow", |
| " loadPropertyAtVariableOffset(t2, t3, t0, t1)", |
| " loadi 4[PC], t2", |
| " storei t0, TagOffset[cfr, t2, 8]", |
| " storei t1, PayloadOffset[cfr, t2, 8]", |
| " valueProfile(t0, t1, 32, t2)", |
| " dispatch(constexpr (op_get_by_id_length))", |
| ".opGetByIdSlow:", |
| " callOpcodeSlowPath(_llint_slow_path_get_by_id)", |
| " dispatch(constexpr (op_get_by_id_length))", |
| "_llint_op_get_by_id_proto_load:", |
| " traceExecution()", |
| " loadi 8[PC], t0", |
| " loadi 16[PC], t1", |
| " loadConstantOrVariablePayload(t0, CellTag, t3, .opGetByIdProtoSlow)", |
| " loadi 20[PC], t2", |
| " bineq JSCell::m_structureID[t3], t1, .opGetByIdProtoSlow", |
| " loadpFromInstruction(6, t3)", |
| " loadPropertyAtVariableOffset(t2, t3, t0, t1)", |
| " loadi 4[PC], t2", |
| " storei t0, TagOffset[cfr, t2, 8]", |
| " storei t1, PayloadOffset[cfr, t2, 8]", |
| " valueProfile(t0, t1, 32, t2)", |
| " dispatch(constexpr (op_get_by_id_proto_load_length))", |
| ".opGetByIdProtoSlow:", |
| " callOpcodeSlowPath(_llint_slow_path_get_by_id)", |
| " dispatch(constexpr (op_get_by_id_proto_load_length))", |
| "_llint_op_get_by_id_unset:", |
| " traceExecution()", |
| " loadi 8[PC], t0", |
| " loadi 16[PC], t1", |
| " loadConstantOrVariablePayload(t0, CellTag, t3, .opGetByIdUnsetSlow)", |
| " bineq JSCell::m_structureID[t3], t1, .opGetByIdUnsetSlow", |
| " loadi 4[PC], t2", |
| " storei UndefinedTag, TagOffset[cfr, t2, 8]", |
| " storei 0, PayloadOffset[cfr, t2, 8]", |
| " valueProfile(UndefinedTag, 0, 32, t2)", |
| " dispatch(constexpr (op_get_by_id_unset_length))", |
| ".opGetByIdUnsetSlow:", |
| " callOpcodeSlowPath(_llint_slow_path_get_by_id)", |
| " dispatch(constexpr (op_get_by_id_unset_length))", |
| "_llint_op_get_array_length:", |
| " traceExecution()", |
| " loadi 8[PC], t0", |
| " loadp 16[PC], t1", |
| " loadConstantOrVariablePayload(t0, CellTag, t3, .opGetArrayLengthSlow)", |
| " move t3, t2", |
| " arrayProfile(t2, t1, t0)", |
| " btiz t2, IsArray, .opGetArrayLengthSlow", |
| " btiz t2, IndexingShapeMask, .opGetArrayLengthSlow", |
| " loadi 4[PC], t1", |
| " loadp JSObject::m_butterfly[t3], t0", |
| " loadi ((-sizeof IndexingHeader) + IndexingHeader::u.lengths.publicLength)[t0], t0", |
| " bilt t0, 0, .opGetArrayLengthSlow", |
| " valueProfile(Int32Tag, t0, 32, t2)", |
| " storep t0, PayloadOffset[cfr, t1, 8]", |
| " storep Int32Tag, TagOffset[cfr, t1, 8]", |
| " dispatch(constexpr (op_get_array_length_length))", |
| ".opGetArrayLengthSlow:", |
| " callOpcodeSlowPath(_llint_slow_path_get_by_id)", |
| " dispatch(constexpr (op_get_array_length_length))", |
| "_llint_op_put_by_id:", |
| " traceExecution()", |
| " writeBarrierOnOperands(1, 3)", |
| " loadi 4[PC], t3", |
| " loadConstantOrVariablePayload(t3, CellTag, t0, .opPutByIdSlow)", |
| " loadi JSCell::m_structureID[t0], t2", |
| " bineq t2, 16[PC], .opPutByIdSlow", |
| " loadi 12[PC], t1", |
| " loadConstantOrVariable(t1, t2, t3)", |
| " loadi 32[PC], t1", |
| " btinz t1, PutByIdPrimaryTypeMask, .opPutByIdTypeCheckObjectWithStructureOrOther", |
| " andi PutByIdSecondaryTypeMask, t1", |
| " bilt t1, PutByIdSecondaryTypeString, .opPutByIdTypeCheckLessThanString", |
| " bilt t1, PutByIdSecondaryTypeObjectOrOther, .opPutByIdTypeCheckLessThanObjectOrOther", |
| " bieq t1, PutByIdSecondaryTypeTop, .opPutByIdDoneCheckingTypes", |
| " bieq t2, CellTag, .opPutByIdTypeCheckObject", |
| ".opPutByIdTypeCheckOther:", |
| " bieq t2, NullTag, .opPutByIdDoneCheckingTypes", |
| " bieq t2, UndefinedTag, .opPutByIdDoneCheckingTypes", |
| " jmp .opPutByIdSlow", |
| ".opPutByIdTypeCheckLessThanObjectOrOther:", |
| " bineq t2, CellTag, .opPutByIdSlow", |
| " bieq t1, PutByIdSecondaryTypeObject, .opPutByIdTypeCheckObject", |
| " bieq t1, PutByIdSecondaryTypeSymbol, .opPutByIdTypeCheckSymbol", |
| " bbeq JSCell::m_type[t3], StringType, .opPutByIdDoneCheckingTypes", |
| " jmp .opPutByIdSlow", |
| ".opPutByIdTypeCheckObject:", |
| " bbaeq JSCell::m_type[t3], ObjectType, .opPutByIdDoneCheckingTypes", |
| " jmp .opPutByIdSlow", |
| ".opPutByIdTypeCheckSymbol:", |
| " bbeq JSCell::m_type[t3], SymbolType, .opPutByIdDoneCheckingTypes", |
| " jmp .opPutByIdSlow", |
| ".opPutByIdTypeCheckLessThanString:", |
| " bilt t1, PutByIdSecondaryTypeInt32, .opPutByIdTypeCheckLessThanInt32", |
| " bieq t1, PutByIdSecondaryTypeNumber, .opPutByIdTypeCheckNumber", |
| " bieq t2, Int32Tag, .opPutByIdDoneCheckingTypes", |
| " jmp .opPutByIdSlow", |
| ".opPutByIdTypeCheckNumber:", |
| " bib t2, (LowestTag + 1), .opPutByIdDoneCheckingTypes", |
| " jmp .opPutByIdSlow", |
| ".opPutByIdTypeCheckLessThanInt32:", |
| " bineq t1, PutByIdSecondaryTypeBoolean, .opPutByIdTypeCheckBottomOrOther", |
| " bieq t2, BooleanTag, .opPutByIdDoneCheckingTypes", |
| " jmp .opPutByIdSlow", |
| ".opPutByIdTypeCheckBottomOrOther:", |
| " bieq t1, PutByIdSecondaryTypeOther, .opPutByIdTypeCheckOther", |
| " jmp .opPutByIdSlow", |
| ".opPutByIdTypeCheckObjectWithStructureOrOther:", |
| " bieq t2, CellTag, .opPutByIdTypeCheckObjectWithStructure", |
| " btinz t1, PutByIdPrimaryTypeObjectWithStructureOrOther, .opPutByIdTypeCheckOther", |
| " jmp .opPutByIdSlow", |
| ".opPutByIdTypeCheckObjectWithStructure:", |
| " andi PutByIdSecondaryTypeMask, t1", |
| " bineq t1, JSCell::m_structureID[t3], .opPutByIdSlow", |
| ".opPutByIdDoneCheckingTypes:", |
| " loadi 24[PC], t1", |
| " btiz t1, .opPutByIdNotTransition", |
| " loadp 28[PC], t3", |
| " btpz t3, .opPutByIdTransitionDirect", |
| " loadi 16[PC], t2", |
| " loadp StructureChain::m_vector[t3], t3", |
| " assert(macro (ok)", |
| " btpnz t3, ok", |
| "end)", |
| " loadp Structure::m_prototype[t2], t2", |
| " btpz t2, .opPutByIdTransitionChainDone", |
| ".opPutByIdTransitionChainLoop:", |
| " loadp 0[t3], t1", |
| " bpneq t1, JSCell::m_structureID[t2], .opPutByIdSlow", |
| " addp 4, t3", |
| " loadp Structure::m_prototype[t1], t2", |
| " btpnz t2, .opPutByIdTransitionChainLoop", |
| ".opPutByIdTransitionChainDone:", |
| " loadi 24[PC], t1", |
| ".opPutByIdTransitionDirect:", |
| " storei t1, JSCell::m_structureID[t0]", |
| " loadi 12[PC], t1", |
| " loadConstantOrVariable(t1, t2, t3)", |
| " loadi 20[PC], t1", |
| " storePropertyAtVariableOffset(t1, t0, t2, t3)", |
| " writeBarrierOnOperand(1)", |
| " dispatch(constexpr (op_put_by_id_length))", |
| ".opPutByIdNotTransition:", |
| " loadi 12[PC], t1", |
| " loadConstantOrVariable(t1, t2, t3)", |
| " loadi 20[PC], t1", |
| " storePropertyAtVariableOffset(t1, t0, t2, t3)", |
| " dispatch(constexpr (op_put_by_id_length))", |
| ".opPutByIdSlow:", |
| " callOpcodeSlowPath(_llint_slow_path_put_by_id)", |
| " dispatch(constexpr (op_put_by_id_length))", |
| "_llint_op_get_by_val:", |
| " traceExecution()", |
| " loadi 8[PC], t2", |
| " loadConstantOrVariablePayload(t2, CellTag, t0, .opGetByValSlow)", |
| " move t0, t2", |
| " loadp 16[PC], t3", |
| " arrayProfile(t2, t3, t1)", |
| " loadi 12[PC], t3", |
| " loadConstantOrVariablePayload(t3, Int32Tag, t1, .opGetByValSlow)", |
| " loadp JSObject::m_butterfly[t0], t3", |
| " andi IndexingShapeMask, t2", |
| " bieq t2, Int32Shape, .opGetByValIsContiguous", |
| " bineq t2, ContiguousShape, .opGetByValNotContiguous", |
| ".opGetByValIsContiguous:", |
| " biaeq t1, ((-sizeof IndexingHeader) + IndexingHeader::u.lengths.publicLength)[t3], .opGetByValOutOfBounds", |
| " loadi TagOffset[t3, t1, 8], t2", |
| " loadi PayloadOffset[t3, t1, 8], t1", |
| " jmp .opGetByValDone", |
| ".opGetByValNotContiguous:", |
| " bineq t2, DoubleShape, .opGetByValNotDouble", |
| " biaeq t1, ((-sizeof IndexingHeader) + IndexingHeader::u.lengths.publicLength)[t3], .opGetByValOutOfBounds", |
| " loadd 0[t3, t1, 8], ft0", |
| " bdnequn ft0, ft0, .opGetByValSlow", |
| " fd2ii ft0, t1, t2", |
| " loadi 4[PC], t0", |
| " jmp .opGetByValNotEmpty", |
| ".opGetByValNotDouble:", |
| " subi ArrayStorageShape, t2", |
| " bia t2, (SlowPutArrayStorageShape - ArrayStorageShape), .opGetByValSlow", |
| " biaeq t1, ((-sizeof IndexingHeader) + IndexingHeader::u.lengths.vectorLength)[t3], .opGetByValOutOfBounds", |
| " loadi (ArrayStorage::m_vector + TagOffset)[t3, t1, 8], t2", |
| " loadi (ArrayStorage::m_vector + PayloadOffset)[t3, t1, 8], t1", |
| ".opGetByValDone:", |
| " loadi 4[PC], t0", |
| " bieq t2, EmptyValueTag, .opGetByValOutOfBounds", |
| ".opGetByValNotEmpty:", |
| " storei t2, TagOffset[cfr, t0, 8]", |
| " storei t1, PayloadOffset[cfr, t0, 8]", |
| " valueProfile(t2, t1, 20, t0)", |
| " dispatch(constexpr (op_get_by_val_length))", |
| ".opGetByValOutOfBounds:", |
| " loadpFromInstruction(4, t0)", |
| " storeb 1, ArrayProfile::m_outOfBounds[t0]", |
| ".opGetByValSlow:", |
| " callOpcodeSlowPath(_llint_slow_path_get_by_val)", |
| " dispatch(constexpr (op_get_by_val_length))", |
| "macro contiguousPutByVal(storeCallback)", |
| " biaeq t3, ((-sizeof IndexingHeader) + IndexingHeader::u.lengths.publicLength)[t0], .outOfBounds", |
| ".storeResult:", |
| " loadi 12[PC], t2", |
| " storeCallback(t2, t1, t0, t3)", |
| " dispatch(5)", |
| ".outOfBounds:", |
| " biaeq t3, ((-sizeof IndexingHeader) + IndexingHeader::u.lengths.vectorLength)[t0], .opPutByValOutOfBounds", |
| " loadp 16[PC], t2", |
| " storeb 1, ArrayProfile::m_mayStoreToHole[t2]", |
| " addi 1, t3, t2", |
| " storei t2, ((-sizeof IndexingHeader) + IndexingHeader::u.lengths.publicLength)[t0]", |
| " jmp .storeResult", |
| "end", |
| "macro putByVal(slowPath)", |
| " traceExecution()", |
| " writeBarrierOnOperands(1, 3)", |
| " loadi 4[PC], t0", |
| " loadConstantOrVariablePayload(t0, CellTag, t1, .opPutByValSlow)", |
| " move t1, t2", |
| " loadp 16[PC], t3", |
| " arrayProfile(t2, t3, t0)", |
| " loadi 8[PC], t0", |
| " loadConstantOrVariablePayload(t0, Int32Tag, t3, .opPutByValSlow)", |
| " loadp JSObject::m_butterfly[t1], t0", |
| " andi IndexingShapeMask, t2", |
| " bineq t2, Int32Shape, .opPutByValNotInt32", |
| " contiguousPutByVal(macro (operand, scratch, base, index)", |
| " loadConstantOrVariablePayload(operand, Int32Tag, scratch, .opPutByValSlow)", |
| " storei Int32Tag, TagOffset[base, index, 8]", |
| " storei scratch, PayloadOffset[base, index, 8]", |
| "end)", |
| ".opPutByValNotInt32:", |
| " bineq t2, DoubleShape, .opPutByValNotDouble", |
| " contiguousPutByVal(macro (operand, scratch, base, index)", |
| "const tag = scratch", |
| "const payload = operand", |
| " loadConstantOrVariable2Reg(operand, tag, payload)", |
| " bineq tag, Int32Tag, .notInt", |
| " ci2d payload, ft0", |
| " jmp .ready", |
| ".notInt:", |
| " fii2d payload, tag, ft0", |
| " bdnequn ft0, ft0, .opPutByValSlow", |
| ".ready:", |
| " stored ft0, 0[base, index, 8]", |
| "end)", |
| ".opPutByValNotDouble:", |
| " bineq t2, ContiguousShape, .opPutByValNotContiguous", |
| " contiguousPutByVal(macro (operand, scratch, base, index)", |
| "const tag = scratch", |
| "const payload = operand", |
| " loadConstantOrVariable2Reg(operand, tag, payload)", |
| " storei tag, TagOffset[base, index, 8]", |
| " storei payload, PayloadOffset[base, index, 8]", |
| "end)", |
| ".opPutByValNotContiguous:", |
| " bineq t2, ArrayStorageShape, .opPutByValSlow", |
| " biaeq t3, ((-sizeof IndexingHeader) + IndexingHeader::u.lengths.vectorLength)[t0], .opPutByValOutOfBounds", |
| " bieq (ArrayStorage::m_vector + TagOffset)[t0, t3, 8], EmptyValueTag, .opPutByValArrayStorageEmpty", |
| ".opPutByValArrayStorageStoreResult:", |
| " loadi 12[PC], t2", |
| " loadConstantOrVariable2Reg(t2, t1, t2)", |
| " storei t1, (ArrayStorage::m_vector + TagOffset)[t0, t3, 8]", |
| " storei t2, (ArrayStorage::m_vector + PayloadOffset)[t0, t3, 8]", |
| " dispatch(5)", |
| ".opPutByValArrayStorageEmpty:", |
| " loadp 16[PC], t1", |
| " storeb 1, ArrayProfile::m_mayStoreToHole[t1]", |
| " addi 1, ArrayStorage::m_numValuesInVector[t0]", |
| " bib t3, ((-sizeof IndexingHeader) + IndexingHeader::u.lengths.publicLength)[t0], .opPutByValArrayStorageStoreResult", |
| " addi 1, t3, t1", |
| " storei t1, ((-sizeof IndexingHeader) + IndexingHeader::u.lengths.publicLength)[t0]", |
| " jmp .opPutByValArrayStorageStoreResult", |
| ".opPutByValOutOfBounds:", |
| " loadpFromInstruction(4, t0)", |
| " storeb 1, ArrayProfile::m_outOfBounds[t0]", |
| ".opPutByValSlow:", |
| " callOpcodeSlowPath(slowPath)", |
| " dispatch(5)", |
| "end", |
| "_llint_op_put_by_val:", |
| " putByVal(_llint_slow_path_put_by_val)", |
| "_llint_op_put_by_val_direct:", |
| " putByVal(_llint_slow_path_put_by_val_direct)", |
| "_llint_op_jmp:", |
| " traceExecution()", |
| " dispatchBranch(4[PC])", |
| "macro jumpTrueOrFalse(conditionOp, slow)", |
| " loadi 4[PC], t1", |
| " loadConstantOrVariablePayload(t1, BooleanTag, t0, .slow)", |
| " conditionOp(t0, .target)", |
| " dispatch(3)", |
| ".target:", |
| " dispatchBranch(8[PC])", |
| ".slow:", |
| " callOpcodeSlowPath(slow)", |
| " dispatch(0)", |
| "end", |
| "macro equalNull(cellHandler, immediateHandler)", |
| " loadi 4[PC], t0", |
| " assertNotConstant(t0)", |
| " loadi TagOffset[cfr, t0, 8], t1", |
| " loadi PayloadOffset[cfr, t0, 8], t0", |
| " bineq t1, CellTag, .immediate", |
| " loadp JSCell::m_structureID[t0], t2", |
| " cellHandler(t2, JSCell::m_flags[t0], .target)", |
| " dispatch(3)", |
| ".target:", |
| " dispatchBranch(8[PC])", |
| ".immediate:", |
| " ori 1, t1", |
| " immediateHandler(t1, .target)", |
| " dispatch(3)", |
| "end", |
| "_llint_op_jeq_null:", |
| " traceExecution()", |
| " equalNull(macro (structure, value, target)", |
| " btbz value, MasqueradesAsUndefined, .opJeqNullNotMasqueradesAsUndefined", |
| " loadp CodeBlock[cfr], t0", |
| " loadp CodeBlock::m_globalObject[t0], t0", |
| " bpeq Structure::m_globalObject[structure], t0, target", |
| ".opJeqNullNotMasqueradesAsUndefined:", |
| "end, macro (value, target)", |
| " bieq value, NullTag, target", |
| "end)", |
| "_llint_op_jneq_null:", |
| " traceExecution()", |
| " equalNull(macro (structure, value, target)", |
| " btbz value, MasqueradesAsUndefined, target", |
| " loadp CodeBlock[cfr], t0", |
| " loadp CodeBlock::m_globalObject[t0], t0", |
| " bpneq Structure::m_globalObject[structure], t0, target", |
| "end, macro (value, target)", |
| " bineq value, NullTag, target", |
| "end)", |
| "_llint_op_jneq_ptr:", |
| " traceExecution()", |
| " loadi 4[PC], t0", |
| " loadi 8[PC], t1", |
| " loadp CodeBlock[cfr], t2", |
| " loadp CodeBlock::m_globalObject[t2], t2", |
| " bineq TagOffset[cfr, t0, 8], CellTag, .opJneqPtrBranch", |
| " loadp JSGlobalObject::m_specialPointers[t2, t1, 4], t1", |
| " bpeq PayloadOffset[cfr, t0, 8], t1, .opJneqPtrFallThrough", |
| ".opJneqPtrBranch:", |
| " storei 1, 16[PC]", |
| " dispatchBranch(12[PC])", |
| ".opJneqPtrFallThrough:", |
| " dispatch(constexpr (op_jneq_ptr_length))", |
| "macro compare(integerCompare, doubleCompare, slowPath)", |
| " loadi 4[PC], t2", |
| " loadi 8[PC], t3", |
| " loadConstantOrVariable(t2, t0, t1)", |
| " loadConstantOrVariable2Reg(t3, t2, t3)", |
| " bineq t0, Int32Tag, .op1NotInt", |
| " bineq t2, Int32Tag, .op2NotInt", |
| " integerCompare(t1, t3, .jumpTarget)", |
| " dispatch(4)", |
| ".op1NotInt:", |
| " bia t0, LowestTag, .slow", |
| " bib t2, LowestTag, .op1NotIntOp2Double", |
| " bineq t2, Int32Tag, .slow", |
| " ci2d t3, ft1", |
| " jmp .op1NotIntReady", |
| ".op1NotIntOp2Double:", |
| " fii2d t3, t2, ft1", |
| ".op1NotIntReady:", |
| " fii2d t1, t0, ft0", |
| " doubleCompare(ft0, ft1, .jumpTarget)", |
| " dispatch(4)", |
| ".op2NotInt:", |
| " ci2d t1, ft0", |
| " bia t2, LowestTag, .slow", |
| " fii2d t3, t2, ft1", |
| " doubleCompare(ft0, ft1, .jumpTarget)", |
| " dispatch(4)", |
| ".jumpTarget:", |
| " dispatchBranch(12[PC])", |
| ".slow:", |
| " callOpcodeSlowPath(slowPath)", |
| " dispatch(0)", |
| "end", |
| "_llint_op_switch_imm:", |
| " traceExecution()", |
| " loadi 12[PC], t2", |
| " loadi 4[PC], t3", |
| " loadConstantOrVariable(t2, t1, t0)", |
| " loadp CodeBlock[cfr], t2", |
| " loadp CodeBlock::m_rareData[t2], t2", |
| " muli sizeof SimpleJumpTable, t3", |
| " loadp (CodeBlock::RareData::m_switchJumpTables + VectorBufferOffset)[t2], t2", |
| " addp t3, t2", |
| " bineq t1, Int32Tag, .opSwitchImmNotInt", |
| " subi SimpleJumpTable::min[t2], t0", |
| " biaeq t0, (SimpleJumpTable::branchOffsets + VectorSizeOffset)[t2], .opSwitchImmFallThrough", |
| " loadp (SimpleJumpTable::branchOffsets + VectorBufferOffset)[t2], t3", |
| " loadi 0[t3, t0, 4], t1", |
| " btiz t1, .opSwitchImmFallThrough", |
| " dispatchBranchWithOffset(t1)", |
| ".opSwitchImmNotInt:", |
| " bib t1, LowestTag, .opSwitchImmSlow", |
| ".opSwitchImmFallThrough:", |
| " dispatchBranch(8[PC])", |
| ".opSwitchImmSlow:", |
| " callOpcodeSlowPath(_llint_slow_path_switch_imm)", |
| " dispatch(0)", |
| "_llint_op_switch_char:", |
| " traceExecution()", |
| " loadi 12[PC], t2", |
| " loadi 4[PC], t3", |
| " loadConstantOrVariable(t2, t1, t0)", |
| " loadp CodeBlock[cfr], t2", |
| " loadp CodeBlock::m_rareData[t2], t2", |
| " muli sizeof SimpleJumpTable, t3", |
| " loadp (CodeBlock::RareData::m_switchJumpTables + VectorBufferOffset)[t2], t2", |
| " addp t3, t2", |
| " bineq t1, CellTag, .opSwitchCharFallThrough", |
| " bbneq JSCell::m_type[t0], StringType, .opSwitchCharFallThrough", |
| " bineq JSString::m_length[t0], 1, .opSwitchCharFallThrough", |
| " loadp JSString::m_value[t0], t0", |
| " btpz t0, .opSwitchOnRope", |
| " loadp StringImpl::m_data8[t0], t1", |
| " btinz StringImpl::m_hashAndFlags[t0], HashFlags8BitBuffer, .opSwitchChar8Bit", |
| " loadh 0[t1], t0", |
| " jmp .opSwitchCharReady", |
| ".opSwitchChar8Bit:", |
| " loadb 0[t1], t0", |
| ".opSwitchCharReady:", |
| " subi SimpleJumpTable::min[t2], t0", |
| " biaeq t0, (SimpleJumpTable::branchOffsets + VectorSizeOffset)[t2], .opSwitchCharFallThrough", |
| " loadp (SimpleJumpTable::branchOffsets + VectorBufferOffset)[t2], t2", |
| " loadi 0[t2, t0, 4], t1", |
| " btiz t1, .opSwitchCharFallThrough", |
| " dispatchBranchWithOffset(t1)", |
| ".opSwitchCharFallThrough:", |
| " dispatchBranch(8[PC])", |
| ".opSwitchOnRope:", |
| " callOpcodeSlowPath(_llint_slow_path_switch_char)", |
| " dispatch(0)", |
| "macro arrayProfileForCall()", |
| " loadi 16[PC], t3", |
| " negi t3", |
| " bineq (ThisArgumentOffset + TagOffset)[cfr, t3, 8], CellTag, .done", |
| " loadi (ThisArgumentOffset + PayloadOffset)[cfr, t3, 8], t0", |
| " loadp JSCell::m_structureID[t0], t0", |
| " loadpFromInstruction((CallOpCodeSize - 2), t1)", |
| " storep t0, ArrayProfile::m_lastSeenStructureID[t1]", |
| ".done:", |
| "end", |
| "macro doCall(slowPath, prepareCall)", |
| " loadi 8[PC], t0", |
| " loadi 20[PC], t1", |
| " loadp LLIntCallLinkInfo::callee[t1], t2", |
| " loadConstantOrVariablePayload(t0, CellTag, t3, .opCallSlow)", |
| " bineq t3, t2, .opCallSlow", |
| " loadi 16[PC], t3", |
| " lshifti 3, t3", |
| " negi t3", |
| " addp cfr, t3", |
| " storei t2, (Callee + PayloadOffset)[t3]", |
| " loadi 12[PC], t2", |
| " storei PC, (ArgumentCount + TagOffset)[cfr]", |
| " storei t2, (ArgumentCount + PayloadOffset)[t3]", |
| " storei CellTag, (Callee + TagOffset)[t3]", |
| " move t3, sp", |
| " prepareCall(LLIntCallLinkInfo::machineCodeTarget[t1], t2, t3, t4)", |
| " callTargetFunction(LLIntCallLinkInfo::machineCodeTarget[t1])", |
| ".opCallSlow:", |
| " slowPathForCall(slowPath, prepareCall)", |
| "end", |
| "_llint_op_ret:", |
| " traceExecution()", |
| " checkSwitchToJITForEpilogue()", |
| " loadi 4[PC], t2", |
| " loadConstantOrVariable(t2, t1, t0)", |
| " doReturn()", |
| "_llint_op_to_primitive:", |
| " traceExecution()", |
| " loadi 8[PC], t2", |
| " loadi 4[PC], t3", |
| " loadConstantOrVariable(t2, t1, t0)", |
| " bineq t1, CellTag, .opToPrimitiveIsImm", |
| " bbaeq JSCell::m_type[t0], ObjectType, .opToPrimitiveSlowCase", |
| ".opToPrimitiveIsImm:", |
| " storei t1, TagOffset[cfr, t3, 8]", |
| " storei t0, PayloadOffset[cfr, t3, 8]", |
| " dispatch(constexpr (op_to_primitive_length))", |
| ".opToPrimitiveSlowCase:", |
| " callOpcodeSlowPath(_slow_path_to_primitive)", |
| " dispatch(constexpr (op_to_primitive_length))", |
| "_llint_op_catch:", |
| " loadp (Callee + PayloadOffset)[cfr], t3", |
| " andp MarkedBlockMask, t3", |
| " loadp MarkedBlock::m_vm[t3], t3", |
| " restoreCalleeSavesFromVMEntryFrameCalleeSavesBuffer(t3, t0)", |
| " loadp VM::callFrameForCatch[t3], cfr", |
| " storep 0, VM::callFrameForCatch[t3]", |
| " restoreStackPointerAfterCall()", |
| " loadi VM::targetInterpreterPCForThrow[t3], PC", |
| " callOpcodeSlowPath(_llint_slow_path_check_if_exception_is_uncatchable_and_notify_profiler)", |
| " bpeq r1, 0, .isCatchableException", |
| " jmp _llint_throw_from_slow_path_trampoline", |
| ".isCatchableException:", |
| " loadp (Callee + PayloadOffset)[cfr], t3", |
| " andp MarkedBlockMask, t3", |
| " loadp MarkedBlock::m_vm[t3], t3", |
| " loadi VM::m_exception[t3], t0", |
| " storei 0, VM::m_exception[t3]", |
| " loadi 4[PC], t2", |
| " storei t0, PayloadOffset[cfr, t2, 8]", |
| " storei CellTag, TagOffset[cfr, t2, 8]", |
| " loadi (Exception::m_value + TagOffset)[t0], t1", |
| " loadi (Exception::m_value + PayloadOffset)[t0], t0", |
| " loadi 8[PC], t2", |
| " storei t0, PayloadOffset[cfr, t2, 8]", |
| " storei t1, TagOffset[cfr, t2, 8]", |
| " traceExecution()", |
| " dispatch(3)", |
| "_llint_op_end:", |
| " traceExecution()", |
| " checkSwitchToJITForEpilogue()", |
| " loadi 4[PC], t0", |
| " assertNotConstant(t0)", |
| " loadi TagOffset[cfr, t0, 8], t1", |
| " loadi PayloadOffset[cfr, t0, 8], t0", |
| " doReturn()", |
| "_llint_throw_from_slow_path_trampoline:", |
| " callSlowPath(_llint_slow_path_handle_exception)", |
| " loadp Callee[cfr], t1", |
| " andp MarkedBlockMask, t1", |
| " loadp MarkedBlock::m_vm[t1], t1", |
| " copyCalleeSavesToVMEntryFrameCalleeSavesBuffer(t1, t2)", |
| " jmp VM::targetMachinePCForThrow[t1]", |
| "_llint_throw_during_call_trampoline:", |
| " preserveReturnAddressAfterCall(t2)", |
| " jmp _llint_throw_from_slow_path_trampoline", |
| "macro nativeCallTrampoline(executableOffsetToFunction)", |
| " functionPrologue()", |
| " storep 0, CodeBlock[cfr]", |
| " loadi (Callee + PayloadOffset)[cfr], t1", |
| "if (X86 or X86_WIN)", |
| " subp 8, sp", |
| " andp MarkedBlockMask, t1", |
| " loadp MarkedBlock::m_vm[t1], t3", |
| " storep cfr, VM::topCallFrame[t3]", |
| " move cfr, a0", |
| " storep a0, 0[sp]", |
| " loadi (Callee + PayloadOffset)[cfr], t1", |
| " loadp JSFunction::m_executable[t1], t1", |
| " checkStackPointerAlignment(t3, 3735879681)", |
| " call executableOffsetToFunction[t1]", |
| " loadp (Callee + PayloadOffset)[cfr], t3", |
| " andp MarkedBlockMask, t3", |
| " loadp MarkedBlock::m_vm[t3], t3", |
| " addp 8, sp", |
| "else", |
| "if ((((ARM or ARMv7) or ARMv7_TRADITIONAL) or C_LOOP) or MIPS)", |
| " subp 8, sp", |
| " andp MarkedBlockMask, t1", |
| " loadp MarkedBlock::m_vm[t1], t1", |
| " storep cfr, VM::topCallFrame[t1]", |
| " move cfr, a0", |
| " loadi (Callee + PayloadOffset)[cfr], t1", |
| " loadp JSFunction::m_executable[t1], t1", |
| " checkStackPointerAlignment(t3, 3735879681)", |
| "if C_LOOP", |
| " cloopCallNative executableOffsetToFunction[t1]", |
| "else", |
| " call executableOffsetToFunction[t1]", |
| "end", |
| " loadp (Callee + PayloadOffset)[cfr], t3", |
| " andp MarkedBlockMask, t3", |
| " loadp MarkedBlock::m_vm[t3], t3", |
| " addp 8, sp", |
| "else", |
| " error", |
| "end", |
| "end", |
| " btinz VM::m_exception[t3], .handleException", |
| " functionEpilogue()", |
| " ret ", |
| ".handleException:", |
| " storep cfr, VM::topCallFrame[t3]", |
| " jmp _llint_throw_from_slow_path_trampoline", |
| "end", |
| "macro getConstantScope(dst)", |
| " loadpFromInstruction(6, t0)", |
| " loadisFromInstruction(dst, t1)", |
| " storei CellTag, TagOffset[cfr, t1, 8]", |
| " storei t0, PayloadOffset[cfr, t1, 8]", |
| "end", |
| "macro varInjectionCheck(slowPath)", |
| " loadp CodeBlock[cfr], t0", |
| " loadp CodeBlock::m_globalObject[t0], t0", |
| " loadp JSGlobalObject::m_varInjectionWatchpoint[t0], t0", |
| " bbeq WatchpointSet::m_state[t0], IsInvalidated, slowPath", |
| "end", |
| "macro resolveScope()", |
| " loadp CodeBlock[cfr], t0", |
| " loadisFromInstruction(5, t2)", |
| " loadisFromInstruction(2, t0)", |
| " loadp PayloadOffset[cfr, t0, 8], t0", |
| " btiz t2, .resolveScopeLoopEnd", |
| ".resolveScopeLoop:", |
| " loadp JSScope::m_next[t0], t0", |
| " subi 1, t2", |
| " btinz t2, .resolveScopeLoop", |
| ".resolveScopeLoopEnd:", |
| " loadisFromInstruction(1, t1)", |
| " storei CellTag, TagOffset[cfr, t1, 8]", |
| " storei t0, PayloadOffset[cfr, t1, 8]", |
| "end", |
| "_llint_op_resolve_scope:", |
| " traceExecution()", |
| " loadisFromInstruction(4, t0)", |
| " bineq t0, GlobalProperty, .rGlobalVar", |
| " getConstantScope(1)", |
| " dispatch(7)", |
| ".rGlobalVar:", |
| " bineq t0, GlobalVar, .rGlobalLexicalVar", |
| " getConstantScope(1)", |
| " dispatch(7)", |
| ".rGlobalLexicalVar:", |
| " bineq t0, GlobalLexicalVar, .rClosureVar", |
| " getConstantScope(1)", |
| " dispatch(7)", |
| ".rClosureVar:", |
| " bineq t0, ClosureVar, .rModuleVar", |
| " resolveScope()", |
| " dispatch(7)", |
| ".rModuleVar:", |
| " bineq t0, ModuleVar, .rGlobalPropertyWithVarInjectionChecks", |
| " getConstantScope(1)", |
| " dispatch(7)", |
| ".rGlobalPropertyWithVarInjectionChecks:", |
| " bineq t0, GlobalPropertyWithVarInjectionChecks, .rGlobalVarWithVarInjectionChecks", |
| " varInjectionCheck(.rDynamic)", |
| " getConstantScope(1)", |
| " dispatch(7)", |
| ".rGlobalVarWithVarInjectionChecks:", |
| " bineq t0, GlobalVarWithVarInjectionChecks, .rGlobalLexicalVarWithVarInjectionChecks", |
| " varInjectionCheck(.rDynamic)", |
| " getConstantScope(1)", |
| " dispatch(7)", |
| ".rGlobalLexicalVarWithVarInjectionChecks:", |
| " bineq t0, GlobalLexicalVarWithVarInjectionChecks, .rClosureVarWithVarInjectionChecks", |
| " varInjectionCheck(.rDynamic)", |
| " getConstantScope(1)", |
| " dispatch(7)", |
| ".rClosureVarWithVarInjectionChecks:", |
| " bineq t0, ClosureVarWithVarInjectionChecks, .rDynamic", |
| " varInjectionCheck(.rDynamic)", |
| " resolveScope()", |
| " dispatch(7)", |
| ".rDynamic:", |
| " callOpcodeSlowPath(_slow_path_resolve_scope)", |
| " dispatch(7)", |
| "macro loadWithStructureCheck(operand, slowPath)", |
| " loadisFromInstruction(operand, t0)", |
| " loadp PayloadOffset[cfr, t0, 8], t0", |
| " loadpFromInstruction(5, t1)", |
| " bpneq JSCell::m_structureID[t0], t1, slowPath", |
| "end", |
| "macro getProperty()", |
| " loadisFromInstruction(6, t3)", |
| " loadPropertyAtVariableOffset(t3, t0, t1, t2)", |
| " valueProfile(t1, t2, 28, t0)", |
| " loadisFromInstruction(1, t0)", |
| " storei t1, TagOffset[cfr, t0, 8]", |
| " storei t2, PayloadOffset[cfr, t0, 8]", |
| "end", |
| "macro getGlobalVar(tdzCheckIfNecessary)", |
| " loadpFromInstruction(6, t0)", |
| " loadp TagOffset[t0], t1", |
| " loadp PayloadOffset[t0], t2", |
| " tdzCheckIfNecessary(t1)", |
| " valueProfile(t1, t2, 28, t0)", |
| " loadisFromInstruction(1, t0)", |
| " storei t1, TagOffset[cfr, t0, 8]", |
| " storei t2, PayloadOffset[cfr, t0, 8]", |
| "end", |
| "macro getClosureVar()", |
| " loadisFromInstruction(6, t3)", |
| " loadp (JSEnvironmentRecord_variables + TagOffset)[t0, t3, 8], t1", |
| " loadp (JSEnvironmentRecord_variables + PayloadOffset)[t0, t3, 8], t2", |
| " valueProfile(t1, t2, 28, t0)", |
| " loadisFromInstruction(1, t0)", |
| " storei t1, TagOffset[cfr, t0, 8]", |
| " storei t2, PayloadOffset[cfr, t0, 8]", |
| "end", |
| "_llint_op_get_from_scope:", |
| " traceExecution()", |
| " loadisFromInstruction(4, t0)", |
| " andi ResolveTypeMask, t0", |
| " bineq t0, GlobalProperty, .gGlobalVar", |
| " loadWithStructureCheck(2, .gDynamic)", |
| " getProperty()", |
| " dispatch(8)", |
| ".gGlobalVar:", |
| " bineq t0, GlobalVar, .gGlobalLexicalVar", |
| " getGlobalVar(macro (t)", |
| "", |
| "end)", |
| " dispatch(8)", |
| ".gGlobalLexicalVar:", |
| " bineq t0, GlobalLexicalVar, .gClosureVar", |
| " getGlobalVar(macro (tag)", |
| " bieq tag, EmptyValueTag, .gDynamic", |
| "end)", |
| " dispatch(8)", |
| ".gClosureVar:", |
| " bineq t0, ClosureVar, .gGlobalPropertyWithVarInjectionChecks", |
| " loadVariable(2, t2, t1, t0)", |
| " getClosureVar()", |
| " dispatch(8)", |
| ".gGlobalPropertyWithVarInjectionChecks:", |
| " bineq t0, GlobalPropertyWithVarInjectionChecks, .gGlobalVarWithVarInjectionChecks", |
| " loadWithStructureCheck(2, .gDynamic)", |
| " getProperty()", |
| " dispatch(8)", |
| ".gGlobalVarWithVarInjectionChecks:", |
| " bineq t0, GlobalVarWithVarInjectionChecks, .gGlobalLexicalVarWithVarInjectionChecks", |
| " varInjectionCheck(.gDynamic)", |
| " getGlobalVar(macro (t)", |
| "", |
| "end)", |
| " dispatch(8)", |
| ".gGlobalLexicalVarWithVarInjectionChecks:", |
| " bineq t0, GlobalLexicalVarWithVarInjectionChecks, .gClosureVarWithVarInjectionChecks", |
| " varInjectionCheck(.gDynamic)", |
| " getGlobalVar(macro (tag)", |
| " bieq tag, EmptyValueTag, .gDynamic", |
| "end)", |
| " dispatch(8)", |
| ".gClosureVarWithVarInjectionChecks:", |
| " bineq t0, ClosureVarWithVarInjectionChecks, .gDynamic", |
| " varInjectionCheck(.gDynamic)", |
| " loadVariable(2, t2, t1, t0)", |
| " getClosureVar()", |
| " dispatch(8)", |
| ".gDynamic:", |
| " callOpcodeSlowPath(_llint_slow_path_get_from_scope)", |
| " dispatch(8)", |
| "macro putProperty()", |
| " loadisFromInstruction(3, t1)", |
| " loadConstantOrVariable(t1, t2, t3)", |
| " loadisFromInstruction(6, t1)", |
| " storePropertyAtVariableOffset(t1, t0, t2, t3)", |
| "end", |
| "macro putGlobalVariable()", |
| " loadisFromInstruction(3, t0)", |
| " loadConstantOrVariable(t0, t1, t2)", |
| " loadpFromInstruction(5, t3)", |
| " notifyWrite(t3, .pDynamic)", |
| " loadpFromInstruction(6, t0)", |
| " storei t1, TagOffset[t0]", |
| " storei t2, PayloadOffset[t0]", |
| "end", |
| "macro putClosureVar()", |
| " loadisFromInstruction(3, t1)", |
| " loadConstantOrVariable(t1, t2, t3)", |
| " loadisFromInstruction(6, t1)", |
| " storei t2, (JSEnvironmentRecord_variables + TagOffset)[t0, t1, 8]", |
| " storei t3, (JSEnvironmentRecord_variables + PayloadOffset)[t0, t1, 8]", |
| "end", |
| "macro putLocalClosureVar()", |
| " loadisFromInstruction(3, t1)", |
| " loadConstantOrVariable(t1, t2, t3)", |
| " loadpFromInstruction(5, t5)", |
| " btpz t5, .noVariableWatchpointSet", |
| " notifyWrite(t5, .pDynamic)", |
| ".noVariableWatchpointSet:", |
| " loadisFromInstruction(6, t1)", |
| " storei t2, (JSEnvironmentRecord_variables + TagOffset)[t0, t1, 8]", |
| " storei t3, (JSEnvironmentRecord_variables + PayloadOffset)[t0, t1, 8]", |
| "end", |
| "_llint_op_put_to_scope:", |
| " traceExecution()", |
| " loadisFromInstruction(4, t0)", |
| " andi ResolveTypeMask, t0", |
| " bineq t0, LocalClosureVar, .pGlobalProperty", |
| " writeBarrierOnOperands(1, 3)", |
| " loadVariable(1, t2, t1, t0)", |
| " putLocalClosureVar()", |
| " dispatch(7)", |
| ".pGlobalProperty:", |
| " bineq t0, GlobalProperty, .pGlobalVar", |
| " writeBarrierOnOperands(1, 3)", |
| " loadWithStructureCheck(1, .pDynamic)", |
| " putProperty()", |
| " dispatch(7)", |
| ".pGlobalVar:", |
| " bineq t0, GlobalVar, .pGlobalLexicalVar", |
| " writeBarrierOnGlobalObject(3)", |
| " putGlobalVariable()", |
| " dispatch(7)", |
| ".pGlobalLexicalVar:", |
| " bineq t0, GlobalLexicalVar, .pClosureVar", |
| " writeBarrierOnGlobalLexicalEnvironment(3)", |
| " putGlobalVariable()", |
| " dispatch(7)", |
| ".pClosureVar:", |
| " bineq t0, ClosureVar, .pGlobalPropertyWithVarInjectionChecks", |
| " writeBarrierOnOperands(1, 3)", |
| " loadVariable(1, t2, t1, t0)", |
| " putClosureVar()", |
| " dispatch(7)", |
| ".pGlobalPropertyWithVarInjectionChecks:", |
| " bineq t0, GlobalPropertyWithVarInjectionChecks, .pGlobalVarWithVarInjectionChecks", |
| " writeBarrierOnOperands(1, 3)", |
| " loadWithStructureCheck(1, .pDynamic)", |
| " putProperty()", |
| " dispatch(7)", |
| ".pGlobalVarWithVarInjectionChecks:", |
| " bineq t0, GlobalVarWithVarInjectionChecks, .pGlobalLexicalVarWithVarInjectionChecks", |
| " writeBarrierOnGlobalObject(3)", |
| " varInjectionCheck(.pDynamic)", |
| " putGlobalVariable()", |
| " dispatch(7)", |
| ".pGlobalLexicalVarWithVarInjectionChecks:", |
| " bineq t0, GlobalLexicalVarWithVarInjectionChecks, .pClosureVarWithVarInjectionChecks", |
| " writeBarrierOnGlobalLexicalEnvironment(3)", |
| " varInjectionCheck(.pDynamic)", |
| " putGlobalVariable()", |
| " dispatch(7)", |
| ".pClosureVarWithVarInjectionChecks:", |
| " bineq t0, ClosureVarWithVarInjectionChecks, .pModuleVar", |
| " writeBarrierOnOperands(1, 3)", |
| " varInjectionCheck(.pDynamic)", |
| " loadVariable(1, t2, t1, t0)", |
| " putClosureVar()", |
| " dispatch(7)", |
| ".pModuleVar:", |
| " bineq t0, ModuleVar, .pDynamic", |
| " callOpcodeSlowPath(_slow_path_throw_strict_mode_readonly_property_write_error)", |
| " dispatch(7)", |
| ".pDynamic:", |
| " callOpcodeSlowPath(_llint_slow_path_put_to_scope)", |
| " dispatch(7)", |
| "_llint_op_get_from_arguments:", |
| " traceExecution()", |
| " loadisFromInstruction(2, t0)", |
| " loadi PayloadOffset[cfr, t0, 8], t0", |
| " loadi 12[PC], t1", |
| " loadi (DirectArguments_storage + TagOffset)[t0, t1, 8], t2", |
| " loadi (DirectArguments_storage + PayloadOffset)[t0, t1, 8], t3", |
| " loadisFromInstruction(1, t1)", |
| " valueProfile(t2, t3, 16, t0)", |
| " storei t2, TagOffset[cfr, t1, 8]", |
| " storei t3, PayloadOffset[cfr, t1, 8]", |
| " dispatch(5)", |
| "_llint_op_put_to_arguments:", |
| " traceExecution()", |
| " writeBarrierOnOperands(1, 3)", |
| " loadisFromInstruction(1, t0)", |
| " loadi PayloadOffset[cfr, t0, 8], t0", |
| " loadisFromInstruction(3, t1)", |
| " loadConstantOrVariable(t1, t2, t3)", |
| " loadi 8[PC], t1", |
| " storei t2, (DirectArguments_storage + TagOffset)[t0, t1, 8]", |
| " storei t3, (DirectArguments_storage + PayloadOffset)[t0, t1, 8]", |
| " dispatch(4)", |
| "_llint_op_get_parent_scope:", |
| " traceExecution()", |
| " loadisFromInstruction(2, t0)", |
| " loadp PayloadOffset[cfr, t0, 8], t0", |
| " loadp JSScope::m_next[t0], t0", |
| " loadisFromInstruction(1, t1)", |
| " storei CellTag, TagOffset[cfr, t1, 8]", |
| " storei t0, PayloadOffset[cfr, t1, 8]", |
| " dispatch(3)", |
| "_llint_op_profile_type:", |
| " traceExecution()", |
| " loadp CodeBlock[cfr], t1", |
| " loadp CodeBlock::m_vm[t1], t1", |
| " loadp VM::m_typeProfilerLog[t1], t1", |
| " loadisFromInstruction(1, t2)", |
| " loadConstantOrVariable(t2, t5, t0)", |
| " bieq t5, EmptyValueTag, .opProfileTypeDone", |
| " loadp TypeProfilerLog::m_currentLogEntryPtr[t1], t2", |
| " storei t5, (TypeProfilerLog::LogEntry::value + TagOffset)[t2]", |
| " storei t0, (TypeProfilerLog::LogEntry::value + PayloadOffset)[t2]", |
| " loadpFromInstruction(2, t3)", |
| " storep t3, TypeProfilerLog::LogEntry::location[t2]", |
| " bieq t5, CellTag, .opProfileTypeIsCell", |
| " storei 0, TypeProfilerLog::LogEntry::structureID[t2]", |
| " jmp .opProfileTypeSkipIsCell", |
| ".opProfileTypeIsCell:", |
| " loadi JSCell::m_structureID[t0], t3", |
| " storei t3, TypeProfilerLog::LogEntry::structureID[t2]", |
| ".opProfileTypeSkipIsCell:", |
| " addp sizeof TypeProfilerLog::LogEntry, t2", |
| " storep t2, TypeProfilerLog::m_currentLogEntryPtr[t1]", |
| " loadp TypeProfilerLog::m_logEndPtr[t1], t1", |
| " bpneq t2, t1, .opProfileTypeDone", |
| " callOpcodeSlowPath(_slow_path_profile_type_clear_log)", |
| ".opProfileTypeDone:", |
| " dispatch(6)", |
| "_llint_op_profile_control_flow:", |
| " traceExecution()", |
| " loadpFromInstruction(1, t0)", |
| " loadi BasicBlockLocation::m_executionCount[t0], t1", |
| " addi 1, t1", |
| " bieq t1, 0, .done", |
| " storei t1, BasicBlockLocation::m_executionCount[t0]", |
| ".done:", |
| " dispatch(2)", |
| "_llint_op_get_rest_length:", |
| " traceExecution()", |
| " loadi (PayloadOffset + ArgumentCount)[cfr], t0", |
| " subi 1, t0", |
| " loadisFromInstruction(2, t1)", |
| " bilteq t0, t1, .storeZero", |
| " subi t1, t0", |
| " jmp .finish", |
| ".storeZero:", |
| " move 0, t0", |
| ".finish:", |
| " loadisFromInstruction(1, t1)", |
| " storei t0, PayloadOffset[cfr, t1, 8]", |
| " storei Int32Tag, TagOffset[cfr, t1, 8]", |
| " dispatch(3)", |
| "_llint_op_log_shadow_chicken_prologue:", |
| " traceExecution()", |
| " acquireShadowChickenPacket(.opLogShadowChickenPrologueSlow)", |
| " storep cfr, ShadowChicken::Packet::frame[t0]", |
| " loadp CallerFrame[cfr], t1", |
| " storep t1, ShadowChicken::Packet::callerFrame[t0]", |
| " loadp (Callee + PayloadOffset)[cfr], t1", |
| " storep t1, ShadowChicken::Packet::callee[t0]", |
| " loadisFromInstruction(1, t1)", |
| " loadi PayloadOffset[cfr, t1, 8], t1", |
| " storep t1, ShadowChicken::Packet::scope[t0]", |
| " dispatch(2)", |
| ".opLogShadowChickenPrologueSlow:", |
| " callOpcodeSlowPath(_llint_slow_path_log_shadow_chicken_prologue)", |
| " dispatch(2)", |
| "_llint_op_log_shadow_chicken_tail:", |
| " traceExecution()", |
| " acquireShadowChickenPacket(.opLogShadowChickenTailSlow)", |
| " storep cfr, ShadowChicken::Packet::frame[t0]", |
| " storep ShadowChickenTailMarker, ShadowChicken::Packet::callee[t0]", |
| " loadVariable(1, t3, t2, t1)", |
| " storei t2, (TagOffset + ShadowChicken::Packet::thisValue)[t0]", |
| " storei t1, (PayloadOffset + ShadowChicken::Packet::thisValue)[t0]", |
| " loadisFromInstruction(2, t1)", |
| " loadi PayloadOffset[cfr, t1, 8], t1", |
| " storep t1, ShadowChicken::Packet::scope[t0]", |
| " loadp CodeBlock[cfr], t1", |
| " storep t1, ShadowChicken::Packet::codeBlock[t0]", |
| " storei PC, ShadowChicken::Packet::callSiteIndex[t0]", |
| " dispatch(3)", |
| ".opLogShadowChickenTailSlow:", |
| " callOpcodeSlowPath(_llint_slow_path_log_shadow_chicken_tail)", |
| " dispatch(3)", |
| "end", |
| "_llint_op_create_direct_arguments:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_slow_path_create_direct_arguments)", |
| " dispatch(constexpr (op_create_direct_arguments_length))", |
| "_llint_op_create_scoped_arguments:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_slow_path_create_scoped_arguments)", |
| " dispatch(constexpr (op_create_scoped_arguments_length))", |
| "_llint_op_create_cloned_arguments:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_slow_path_create_cloned_arguments)", |
| " dispatch(constexpr (op_create_cloned_arguments_length))", |
| "_llint_op_create_this:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_slow_path_create_this)", |
| " dispatch(constexpr (op_create_this_length))", |
| "_llint_op_new_object:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_llint_slow_path_new_object)", |
| " dispatch(constexpr (op_new_object_length))", |
| "_llint_op_new_func:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_llint_slow_path_new_func)", |
| " dispatch(constexpr (op_new_func_length))", |
| "_llint_op_new_generator_func:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_llint_slow_path_new_generator_func)", |
| " dispatch(constexpr (op_new_generator_func_length))", |
| "_llint_op_new_async_func:", |
| " traceExecution()", |
| " callSlowPath(_llint_slow_path_new_async_func)", |
| " dispatch(constexpr (op_new_async_func_length))", |
| "_llint_op_new_array:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_llint_slow_path_new_array)", |
| " dispatch(constexpr (op_new_array_length))", |
| "_llint_op_new_array_with_spread:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_slow_path_new_array_with_spread)", |
| " dispatch(constexpr (op_new_array_with_spread_length))", |
| "_llint_op_spread:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_slow_path_spread)", |
| " dispatch(constexpr (op_spread_length))", |
| "_llint_op_new_array_with_size:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_llint_slow_path_new_array_with_size)", |
| " dispatch(constexpr (op_new_array_with_size_length))", |
| "_llint_op_new_array_buffer:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_llint_slow_path_new_array_buffer)", |
| " dispatch(constexpr (op_new_array_buffer_length))", |
| "_llint_op_new_regexp:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_llint_slow_path_new_regexp)", |
| " dispatch(constexpr (op_new_regexp_length))", |
| "_llint_op_less:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_slow_path_less)", |
| " dispatch(constexpr (op_less_length))", |
| "_llint_op_lesseq:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_slow_path_lesseq)", |
| " dispatch(constexpr (op_lesseq_length))", |
| "_llint_op_greater:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_slow_path_greater)", |
| " dispatch(constexpr (op_greater_length))", |
| "_llint_op_greatereq:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_slow_path_greatereq)", |
| " dispatch(constexpr (op_greatereq_length))", |
| "_llint_op_mod:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_slow_path_mod)", |
| " dispatch(constexpr (op_mod_length))", |
| "_llint_op_pow:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_slow_path_pow)", |
| " dispatch(constexpr (op_pow_length))", |
| "_llint_op_typeof:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_slow_path_typeof)", |
| " dispatch(constexpr (op_typeof_length))", |
| "_llint_op_is_object_or_null:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_slow_path_is_object_or_null)", |
| " dispatch(constexpr (op_is_object_or_null_length))", |
| "_llint_op_is_function:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_slow_path_is_function)", |
| " dispatch(constexpr (op_is_function_length))", |
| "_llint_op_in:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_slow_path_in)", |
| " dispatch(constexpr (op_in_length))", |
| "_llint_op_try_get_by_id:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_llint_slow_path_try_get_by_id)", |
| " dispatch(constexpr (op_try_get_by_id_length))", |
| "_llint_op_del_by_id:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_llint_slow_path_del_by_id)", |
| " dispatch(constexpr (op_del_by_id_length))", |
| "_llint_op_del_by_val:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_llint_slow_path_del_by_val)", |
| " dispatch(constexpr (op_del_by_val_length))", |
| "_llint_op_put_by_index:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_llint_slow_path_put_by_index)", |
| " dispatch(constexpr (op_put_by_index_length))", |
| "_llint_op_put_getter_by_id:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_llint_slow_path_put_getter_by_id)", |
| " dispatch(constexpr (op_put_getter_by_id_length))", |
| "_llint_op_put_setter_by_id:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_llint_slow_path_put_setter_by_id)", |
| " dispatch(constexpr (op_put_setter_by_id_length))", |
| "_llint_op_put_getter_setter_by_id:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_llint_slow_path_put_getter_setter_by_id)", |
| " dispatch(constexpr (op_put_getter_setter_by_id_length))", |
| "_llint_op_put_getter_by_val:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_llint_slow_path_put_getter_by_val)", |
| " dispatch(constexpr (op_put_getter_by_val_length))", |
| "_llint_op_put_setter_by_val:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_llint_slow_path_put_setter_by_val)", |
| " dispatch(constexpr (op_put_setter_by_val_length))", |
| "_llint_op_define_data_property:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_slow_path_define_data_property)", |
| " dispatch(constexpr (op_define_data_property_length))", |
| "_llint_op_define_accessor_property:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_slow_path_define_accessor_property)", |
| " dispatch(constexpr (op_define_accessor_property_length))", |
| "_llint_op_jtrue:", |
| " traceExecution()", |
| " jumpTrueOrFalse(macro (value, target)", |
| " btinz value, target", |
| "end, _llint_slow_path_jtrue)", |
| "_llint_op_jfalse:", |
| " traceExecution()", |
| " jumpTrueOrFalse(macro (value, target)", |
| " btiz value, target", |
| "end, _llint_slow_path_jfalse)", |
| "_llint_op_jless:", |
| " traceExecution()", |
| " compare(macro (left, right, target)", |
| " bilt left, right, target", |
| "end, macro (left, right, target)", |
| " bdlt left, right, target", |
| "end, _llint_slow_path_jless)", |
| "_llint_op_jnless:", |
| " traceExecution()", |
| " compare(macro (left, right, target)", |
| " bigteq left, right, target", |
| "end, macro (left, right, target)", |
| " bdgtequn left, right, target", |
| "end, _llint_slow_path_jnless)", |
| "_llint_op_jgreater:", |
| " traceExecution()", |
| " compare(macro (left, right, target)", |
| " bigt left, right, target", |
| "end, macro (left, right, target)", |
| " bdgt left, right, target", |
| "end, _llint_slow_path_jgreater)", |
| "_llint_op_jngreater:", |
| " traceExecution()", |
| " compare(macro (left, right, target)", |
| " bilteq left, right, target", |
| "end, macro (left, right, target)", |
| " bdltequn left, right, target", |
| "end, _llint_slow_path_jngreater)", |
| "_llint_op_jlesseq:", |
| " traceExecution()", |
| " compare(macro (left, right, target)", |
| " bilteq left, right, target", |
| "end, macro (left, right, target)", |
| " bdlteq left, right, target", |
| "end, _llint_slow_path_jlesseq)", |
| "_llint_op_jnlesseq:", |
| " traceExecution()", |
| " compare(macro (left, right, target)", |
| " bigt left, right, target", |
| "end, macro (left, right, target)", |
| " bdgtun left, right, target", |
| "end, _llint_slow_path_jnlesseq)", |
| "_llint_op_jgreatereq:", |
| " traceExecution()", |
| " compare(macro (left, right, target)", |
| " bigteq left, right, target", |
| "end, macro (left, right, target)", |
| " bdgteq left, right, target", |
| "end, _llint_slow_path_jgreatereq)", |
| "_llint_op_jngreatereq:", |
| " traceExecution()", |
| " compare(macro (left, right, target)", |
| " bilt left, right, target", |
| "end, macro (left, right, target)", |
| " bdltun left, right, target", |
| "end, _llint_slow_path_jngreatereq)", |
| "_llint_op_loop_hint:", |
| " traceExecution()", |
| " checkSwitchToJITForLoop()", |
| " dispatch(constexpr (op_loop_hint_length))", |
| "_llint_op_check_traps:", |
| " traceExecution()", |
| " loadp CodeBlock[cfr], t1", |
| " loadp CodeBlock::m_vm[t1], t1", |
| " loadb (VM::m_traps + VMTraps::m_needTrapHandling)[t1], t0", |
| " btpnz t0, .handleTraps", |
| ".afterHandlingTraps:", |
| " dispatch(constexpr (op_check_traps_length))", |
| ".handleTraps:", |
| " callTrapHandler(.throwHandler)", |
| " jmp .afterHandlingTraps", |
| ".throwHandler:", |
| " jmp _llint_throw_from_slow_path_trampoline", |
| "macro acquireShadowChickenPacket(slow)", |
| " loadp CodeBlock[cfr], t1", |
| " loadp CodeBlock::m_vm[t1], t1", |
| " loadp VM::m_shadowChicken[t1], t2", |
| " loadp ShadowChicken::m_logCursor[t2], t0", |
| " bpaeq t0, ShadowChicken::m_logEnd[t2], slow", |
| " addp sizeof ShadowChicken::Packet, t0, t1", |
| " storep t1, ShadowChicken::m_logCursor[t2]", |
| "end", |
| "_llint_op_nop:", |
| " dispatch(constexpr (op_nop_length))", |
| "_llint_op_switch_string:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_llint_slow_path_switch_string)", |
| " dispatch(0)", |
| "_llint_op_new_func_exp:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_llint_slow_path_new_func_exp)", |
| " dispatch(constexpr (op_new_func_exp_length))", |
| "_llint_op_new_generator_func_exp:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_llint_slow_path_new_generator_func_exp)", |
| " dispatch(constexpr (op_new_generator_func_exp_length))", |
| "_llint_op_new_async_func_exp:", |
| " traceExecution()", |
| " callSlowPath(_llint_slow_path_new_async_func_exp)", |
| " dispatch(constexpr (op_new_async_func_exp_length))", |
| "_llint_op_set_function_name:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_llint_slow_path_set_function_name)", |
| " dispatch(constexpr (op_set_function_name_length))", |
| "_llint_op_call:", |
| " traceExecution()", |
| " arrayProfileForCall()", |
| " doCall(_llint_slow_path_call, prepareForRegularCall)", |
| "_llint_op_tail_call:", |
| " traceExecution()", |
| " arrayProfileForCall()", |
| " checkSwitchToJITForEpilogue()", |
| " doCall(_llint_slow_path_call, prepareForTailCall)", |
| "_llint_op_construct:", |
| " traceExecution()", |
| " doCall(_llint_slow_path_construct, prepareForRegularCall)", |
| "macro doCallVarargs(frameSlowPath, slowPath, prepareCall)", |
| " callOpcodeSlowPath(frameSlowPath)", |
| " branchIfException(_llint_throw_from_slow_path_trampoline)", |
| "if JSVALUE64", |
| " move r1, sp", |
| "else", |
| "if ARMv7", |
| " subp r1, CallerFrameAndPCSize, t2", |
| " move t2, sp", |
| "else", |
| " subp r1, CallerFrameAndPCSize, sp", |
| "end", |
| "end", |
| " slowPathForCall(slowPath, prepareCall)", |
| "end", |
| "_llint_op_call_varargs:", |
| " traceExecution()", |
| " doCallVarargs(_llint_slow_path_size_frame_for_varargs, _llint_slow_path_call_varargs, prepareForRegularCall)", |
| "_llint_op_tail_call_varargs:", |
| " traceExecution()", |
| " checkSwitchToJITForEpilogue()", |
| " doCallVarargs(_llint_slow_path_size_frame_for_varargs, _llint_slow_path_call_varargs, prepareForTailCall)", |
| "_llint_op_tail_call_forward_arguments:", |
| " traceExecution()", |
| " checkSwitchToJITForEpilogue()", |
| " doCallVarargs(_llint_slow_path_size_frame_for_forward_arguments, _llint_slow_path_tail_call_forward_arguments, prepareForTailCall)", |
| "_llint_op_construct_varargs:", |
| " traceExecution()", |
| " doCallVarargs(_llint_slow_path_size_frame_for_varargs, _llint_slow_path_construct_varargs, prepareForRegularCall)", |
| "_llint_op_call_eval:", |
| " traceExecution()", |
| " slowPathForCall(_llint_slow_path_call_eval, prepareForRegularCall)", |
| "_llint_generic_return_point:", |
| " dispatchAfterCall()", |
| "_llint_op_strcat:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_slow_path_strcat)", |
| " dispatch(constexpr (op_strcat_length))", |
| "_llint_op_push_with_scope:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_slow_path_push_with_scope)", |
| " dispatch(constexpr (op_push_with_scope_length))", |
| "_llint_op_assert:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_slow_path_assert)", |
| " dispatch(constexpr (op_assert_length))", |
| "_llint_op_unreachable:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_slow_path_unreachable)", |
| " dispatch(constexpr (op_unreachable_length))", |
| "_llint_op_yield:", |
| " notSupported()", |
| "_llint_op_create_lexical_environment:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_slow_path_create_lexical_environment)", |
| " dispatch(constexpr (op_create_lexical_environment_length))", |
| "_llint_op_throw:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_llint_slow_path_throw)", |
| " dispatch(constexpr (op_throw_length))", |
| "_llint_op_throw_static_error:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_slow_path_throw_static_error)", |
| " dispatch(constexpr (op_throw_static_error_length))", |
| "_llint_op_debug:", |
| " traceExecution()", |
| " loadp CodeBlock[cfr], t0", |
| " loadi CodeBlock::m_debuggerRequests[t0], t0", |
| " btiz t0, .opDebugDone", |
| " callOpcodeSlowPath(_llint_slow_path_debug)", |
| ".opDebugDone:", |
| " dispatch(constexpr (op_debug_length))", |
| "_llint_native_call_trampoline:", |
| " nativeCallTrampoline(NativeExecutable::m_function)", |
| "_llint_native_construct_trampoline:", |
| " nativeCallTrampoline(NativeExecutable::m_constructor)", |
| "_llint_op_get_enumerable_length:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_slow_path_get_enumerable_length)", |
| " dispatch(constexpr (op_get_enumerable_length_length))", |
| "_llint_op_has_indexed_property:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_slow_path_has_indexed_property)", |
| " dispatch(constexpr (op_has_indexed_property_length))", |
| "_llint_op_has_structure_property:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_slow_path_has_structure_property)", |
| " dispatch(constexpr (op_has_structure_property_length))", |
| "_llint_op_has_generic_property:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_slow_path_has_generic_property)", |
| " dispatch(constexpr (op_has_generic_property_length))", |
| "_llint_op_get_direct_pname:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_slow_path_get_direct_pname)", |
| " dispatch(constexpr (op_get_direct_pname_length))", |
| "_llint_op_get_property_enumerator:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_slow_path_get_property_enumerator)", |
| " dispatch(constexpr (op_get_property_enumerator_length))", |
| "_llint_op_enumerator_structure_pname:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_slow_path_next_structure_enumerator_pname)", |
| " dispatch(constexpr (op_enumerator_structure_pname_length))", |
| "_llint_op_enumerator_generic_pname:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_slow_path_next_generic_enumerator_pname)", |
| " dispatch(constexpr (op_enumerator_generic_pname_length))", |
| "_llint_op_to_index_string:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_slow_path_to_index_string)", |
| " dispatch(constexpr (op_to_index_string_length))", |
| "_llint_op_create_rest:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_slow_path_create_rest)", |
| " dispatch(constexpr (op_create_rest_length))", |
| "_llint_op_instanceof:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_llint_slow_path_instanceof)", |
| " dispatch(constexpr (op_instanceof_length))", |
| "_llint_op_get_by_id_with_this:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_slow_path_get_by_id_with_this)", |
| " dispatch(constexpr (op_get_by_id_with_this_length))", |
| "_llint_op_get_by_val_with_this:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_slow_path_get_by_val_with_this)", |
| " dispatch(constexpr (op_get_by_val_with_this_length))", |
| "_llint_op_put_by_id_with_this:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_slow_path_put_by_id_with_this)", |
| " dispatch(constexpr (op_put_by_id_with_this_length))", |
| "_llint_op_put_by_val_with_this:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_slow_path_put_by_val_with_this)", |
| " dispatch(constexpr (op_put_by_val_with_this_length))", |
| "_llint_op_resolve_scope_for_hoisting_func_decl_in_eval:", |
| " traceExecution()", |
| " callOpcodeSlowPath(_slow_path_resolve_scope_for_hoisting_func_decl_in_eval)", |
| " dispatch(constexpr (op_resolve_scope_for_hoisting_func_decl_in_eval_length))", |
| "macro notSupported()", |
| "if ASSERT_ENABLED", |
| " crash()", |
| "else", |
| " break ", |
| "end", |
| "end" |
| ]; |